// Specialization select ----------------------------------- var specSelectOptions = { language: 'ru', //minimumInputLength: 1, // Commented out to immediately load remote data placeholder: 'Выберите специализацию', // Required by `allowClear` allowClear: true, ajax: { url: '/api/specializations/', dataType: 'json', quietMillis: 250, cache: true, data: function(term, page) { return { 'name__icontains': term, page: page, } }, results: function(data, page) { return { results: _.map(function(item) { return { id: item.id, text: item.name, origItem: item, } }, data.results), more: (page * 10) < data.count, } }, }, initSelection: function(element, callback) { var id = $(element).val() if (id !== '') { $.ajax({url: '/api/specializations/' + id + '/', method: 'GET', dataType: 'json'}) .then(function(data) {callback(data)}) } } } var $specSelects = $('.-spec-select') $specSelects.select2(specSelectOptions) var chosenSpecId = $('#chosenSpecId').val() if (chosenSpecId) updateSpecializationWidgets(chosenSpecId) $specSelects.on('change', function($evt) { updateSpecializationWidgets($evt.added ? $evt.added.id : null) }) var $specSelect1 = $('.-spec-select-level-1') var $specSelect2 = $('.-spec-select-level-2') var $specSelect3 = $('.-spec-select-level-3') var $specSelect4 = $('.-spec-select-level-4') function updateSpecializationWidgets(specId) { return getSpecializationTree(specId).then(function(specs) { var specLevel1 = specs.specLevel1 var specLevel2 = specs.specLevel2 var specLevel3 = specs.specLevel3 var specLevel4 = specs.specLevel4 $specSelect1.select2('data', specLevel1 ? {id: specLevel1.id, text: specLevel1.name, origItem: specLevel1} : null) $specSelect2.select2('data', specLevel2 ? {id: specLevel2.id, text: specLevel2.name, origItem: specLevel2} : null) $specSelect3.select2('data', specLevel3 ? {id: specLevel3.id, text: specLevel3.name, origItem: specLevel3} : null) $specSelect4.select2('data', specLevel4 ? {id: specLevel4.id, text: specLevel4.name, origItem: specLevel4} : null) $('#chosenSpecId').val(specId) }) } // Specialization select (simple) ------------------------------- var simpleSpecSelectsOptions = { language: 'ru', placeholder: 'Выберите специализацию', // Required by `allowClear` allowClear: true, } var $simpleSpecContainer = $('#simpleSpecContainer') var $emptySimpleSpecWidget = $simpleSpecContainer.find('.-simple-spec-widget').first() $simpleSpecContainer.find('.-chosen-simple-spec-id').each(function(i, el) { var $el = $(el) var specId = Number($el.val()) if (specId) initSimpleSpecSelect2($el.closest('.-simple-spec-widget').find('.-simple-spec-select').first(), specId) }) $('#addSpec').on('click', function($evt) { var $newSimpleSpecWidget = $emptySimpleSpecWidget.clone() $simpleSpecContainer.append($newSimpleSpecWidget) var $newSimpleSpecSelect = $newSimpleSpecWidget.find('.-simple-spec-select').first() initSimpleSpecSelect2($newSimpleSpecSelect).then(function() { $newSimpleSpecWidget.css('display', 'block') }) }) $simpleSpecContainer.on('change', '.-simple-spec-select', function($evt) { if ($evt.added) $(this).parent().children('.-chosen-simple-spec-id').first().val($evt.added.id) }) function initSimpleSpecSelect2($select, specId) { return $.ajax({url: '/api/specializations/', method: 'GET', dataType: 'json'}) .then(function(res) { var specs = res.results $select.select2(_.merge(simpleSpecSelectsOptions, { data: _.map(function(spec) { return { id: spec.id, text: _.repeat(spec.level-1, '---') + spec.name, origItem: spec, } }, specs), })) if (specId) { var spec = _.find({id: specId}, specs) $select.select2('data', { id: spec.id, text: _.repeat(spec.level-1, '---') + spec.name, origItem: spec, }) } }) } // Location select ---------------------------------------------- var $locationSelects = $('.-location-select') var locationSelectOptions = { language: 'ru', placeholder: 'Выберите местоположение', // Required by `allowClear` allowClear: true, } var $countrySelect = $('.-location-select-country') var $regionSelect = $('.-location-select-region') var $citySelect = $('.-location-select-city') // Initialize: getLocationTree(null).then(function(locs) { $countrySelect.select2(_.merge(locationSelectOptions, {data: locs.countries})) $regionSelect.select2(_.merge(locationSelectOptions, {data: locs.regions})) $citySelect.select2(_.merge(locationSelectOptions, {data: locs.cities})) var chosenLocId = $('#chosenLocationId').val() if (chosenLocId) updateLocationWidgets(chosenLocId) }) $locationSelects.on('change', function($evt) { updateLocationWidgets($evt.added ? $evt.added.id : null) }) function updateLocationWidgets(locId) { return getLocationTree(locId).then(function(locs) { $countrySelect.select2({data: locs.countries}) $regionSelect.select2({data: locs.regions}) $citySelect.select2({data: locs.cities}) var loc = locs.location if (loc && loc.level === 1) { $countrySelect.select2('val', locs.country.id) } else if (loc && loc.level === 2) { $regionSelect.select2('val', locs.region.id) $countrySelect.select2('val', locs.country.id) } else if (loc && loc.level === 3) { $citySelect.select2('val', locs.city.id) $regionSelect.select2('val', locs.region.id) $countrySelect.select2('val', locs.country.id) } if (loc) $('#chosenLocationId').val(loc.id) }) } $('#realtyId').on('change', function($evt) { var realtyId = Number($(this).val()) if (realtyId) { loadRealtyDetails(realtyId).then(function(res) { $('#realtyName').val(res.name) $('#realtyBuildingClassificationId').val(res.building_classification.id).change() $('#realtyConstructionTypeId').val(res.construction_type.id).change() updateLocationWidgets(res.location.id) }) } else { $('#realtyName').val('') $('#realtyBuildingClassificationId').val('').change() $('#realtyConstructionTypeId').val('').change() updateLocationWidgets(null) } }) function loadRealtyDetails(realtyId) { return $.ajax({ url: '/api/realties/' + realtyId + '/', method: 'GET', dataType: 'json', }) .then(function(res) {return res}) } // File uploading --------------------------------------- // TODO: Add file number and overall size limit support var $fileUploadContainer = $('#fileUploadContainer') $('#fileUploadAddBtn').on('click', function($evt) { $fileUploadContainer.find('.file-upload-widget').last().find('.file-upload-input').click() }) $fileUploadContainer.on('change', '.file-upload-input', function($evt) { var $fileInput = $(this) var $fileUploadWidget = $fileInput.closest('.file-upload-widget') var filePath = $fileInput.val().replace(/\\/g, '/') var fileName = path.basename(filePath) //var fileExt = path.extname(filePath) var fileSize = $fileInput.get(0).files && humanFileSize($fileInput.get(0).files[0].size) if (fileName) { $fileUploadWidget.find('.file-upload-label').text(fileName + ' ' + fileSize) var $newFileUploadWidget = $fileUploadWidget.clone() $newFileUploadWidget.find('.file-upload-label').text('') $fileUploadContainer.find('ul').first().append($newFileUploadWidget) $fileUploadWidget.css('display', 'block') } }) $fileUploadContainer.on('click', '.file-upload-remove-btn', function($evt) { var $btn = $(this) $btn.closest('.file-upload-widget').remove() }) $fileUploadContainer.on('click', '.existing-file-remove-btn', function($evt) { var $btn = $(this) $btn.closest('.existing-file-widget').remove() }) // Project answer portfolio selection ---------------------- $('input[type="checkbox"].answer-portfolio-select').on('change', function($evt) { var $that = $(this) if ($('input[type="checkbox"].answer-portfolio-select:checked').length > 4) { $that.prop('checked', false) return } var portfId = $that.val() var $container = $('#answer-portfolio-photo-widget-container') if ($that.prop('checked')) { $.ajax({url: '/api/portfolios/' + portfId + '/', method: 'GET', dataType: 'json'}) .then(function(portf) { var photoUrl = portf.photos[0].img var $newWidget = $container.find('.answer-portfolio-photo-widget').first().clone() $newWidget.data('portf-id', portfId) var $newWidgetPhotoCont = $newWidget.find('.answer-portfolio-photo-widget-photo-cont').first() $newWidgetPhotoCont.css('background', 'url("' + photoUrl + '") no-repeat center') $container.append($newWidget) $newWidget.css('display', 'block') }) } else { var $widgets = $container.find('.answer-portfolio-photo-widget') var $widget = _.find(function(el) {return $(el).data('portf-id') === portfId}, $widgets) $widget.remove() } }) var initialPortfIds = $('input[type="checkbox"]:checked.answer-portfolio-select').map(function(i, el) {return $(el).val()}) loadAllPhotos(initialPortfIds) function loadAllPhotos(portfIds) { var $container = $('#answer-portfolio-photo-widget-container') _.each(function(portfId) { $.ajax({url: '/api/portfolios/' + portfId + '/', method: 'GET', dataType: 'json'}) .then(function(portf) { var photoUrl = portf.photos[0].img var $newWidget = $container.find('.answer-portfolio-photo-widget').first().clone() $newWidget.data('portf-id', portfId) var $newWidgetPhotoCont = $newWidget.find('.answer-portfolio-photo-widget-photo-cont').first() $newWidgetPhotoCont.css('background', 'url("' + photoUrl + '") no-repeat center') $container.append($newWidget) $newWidget.css('display', 'block') }) }, portfIds) } // Helpers --------------------------------------------- function getSpecializationTree(specId) { var specs = { specLevel1: null, specLevel2: null, specLevel3: null, specLevel4: null, } if (specId === null) { return $.when(specs) } else { return $.ajax({url: '/api/specializations/' + specId + '/', method: 'GET', dataType: 'json'}) .then(function(spec) { if (spec.level === 1) { return _.merge(specs, {specLevel1: spec}) } else if (spec.level === 2) { var specLevel2 = spec return $.ajax({url: '/api/specializations/' + specLevel2.parent.id + '/', method: 'GET', dataType: 'json'}) .then(function(spec) { var specLevel1 = spec return _.merge(specs, { specLevel1: specLevel1, specLevel2: specLevel2, }) }) } else if (spec.level === 3) { var specLevel3 = spec return $.ajax({url: '/api/specializations/' + specLevel3.parent.id + '/', method: 'GET', dataType: 'json'}) .then(function(spec) { var specLevel2 = spec return $.ajax({url: '/api/specializations/' + specLevel2.parent.id + '/', method: 'GET', dataType: 'json'}) .then(function(spec) { var specLevel1 = spec return _.merge(specs, { specLevel1: specLevel1, specLevel2: specLevel2, specLevel3: specLevel3, }) }) }) } else if (spec.level === 4) { var specLevel4 = spec return $.ajax({url: '/api/specializations/' + specLevel4.parent.id + '/', method: 'GET', dataType: 'json'}) .then(function(spec) { var specLevel3 = spec return $.ajax({url: '/api/specializations/' + specLevel3.parent.id + '/', method: 'GET', dataType: 'json'}) .then(function(spec) { var specLevel2 = spec return $.ajax({url: '/api/specializations/' + specLevel2.parent.id + '/', method: 'GET', dataType: 'json'}) .then(function(spec) { var specLevel1 = spec return _.merge(specs, { specLevel1: specLevel1, specLevel2: specLevel2, specLevel3: specLevel3, specLevel4: specLevel4, }) }) }) }) } }) } } function getLocationTree(locId) { var locations = { location: null, country: null, region: null, city: null, countries: [], regions: [], cities: [], } if (locId === null) { return $.ajax({url: '/api/locations/?level=1', method: 'GET', dataType: 'json'}) .then(function(res) { return _.merge(locations, { countries: _.map(function(item) {return {text: item.name, id: item.id, origItem: item}}, res.results), }) }) } else { return $.ajax({url: '/api/locations/' + locId + '/', method: 'GET', dataType: 'json'}).then(function(loc) { locations = _.merge(locations, {location: loc}) if (loc.level === 1) { var country = loc return $.when( $.ajax({url: '/api/locations/?level=1', method: 'GET', dataType: 'json'}) .then(function(res) {return res.results}), // Countries $.ajax({url: '/api/locations/?level=2&parent=' + country.id, method: 'GET', dataType: 'json'}) .then(function(res) {return res.results}) // Regions ) .then(function(countries, regions) { return _.merge(locations, { country: country, countries: _.map(function(item) {return {text: item.name, id: item.id, origItem: item}}, countries), regions: _.map(function(item) {return {text: item.name, id: item.id, origItem: item}}, regions), }) }) } else if (loc.level === 2) { var region = loc return $.when( $.ajax({url: '/api/locations/?level=1', method: 'GET', dataType: 'json'}) .then(function(res) {return res.results}), // Countries $.ajax({url: '/api/locations/?level=2&parent=' + region.parent.id, method: 'GET', dataType: 'json'}) .then(function(res) {return res.results}), // Regions $.ajax({url: '/api/locations/' + region.parent.id + '/', method: 'GET', dataType: 'json'}) .then(function(res) {return res}), // Country $.ajax({url: '/api/locations/?level=3&parent=' + region.id, method: 'GET', dataType: 'json'}) .then(function(res) {return res.results}) // Cities ) .then(function(countries, regions, country, cities) { return _.merge(locations, { country: country, region: region, countries: _.map(function(item) {return {text: item.name, id: item.id, origItem: item}}, countries), regions: _.map(function(item) {return {text: item.name, id: item.id, origItem: item}}, regions), cities: _.map(function(item) {return {text: item.name, id: item.id, origItem: item}}, cities), }) }) } else if (loc.level === 3) { var city = loc return $.when( $.ajax({url: '/api/locations/?level=1', method: 'GET', dataType: 'json'}) .then(function(res) {return res.results}), // Countries $.ajax({url: '/api/locations/' + city.parent.id + '/', method: 'GET', dataType: 'json'}) .then(function(res) {return res}), // Region $.ajax({url: '/api/locations/?level=3&parent=' + city.parent.id, method: 'GET', dataType: 'json'}) .then(function(res) {return res.results}) // Cities ) .then(function(countries, region, cities) { locations = _.merge(locations, { region: region, city: city, countries: _.map(function(item) {return {text: item.name, id: item.id, origItem: item}}, countries), cities: _.map(function(item) {return {text: item.name, id: item.id, origItem: item}}, cities), }) return $.when( $.ajax({url: '/api/locations/?level=2&parent=' + region.parent.id, method: 'GET', dataType: 'json'}) .then(function(res) {return res.results}), // Regions $.ajax({url: '/api/locations/' + region.parent.id + '/', method: 'GET', dataType: 'json'}) .then(function(res) {return res}) // Country ) .then(function(regions, country) { return _.merge(locations, { country: country, regions: _.map(function(item) {return {text: item.name, id: item.id, origItem: item}}, regions), }) }) }) } }) } } // Utils ----------------------------------------------- function humanFileSize(bytes, si) { var thresh = si ? 1000 : 1024 if (Math.abs(bytes) < thresh) return bytes + ' B' var units = si ? ['kB','MB','GB','TB','PB','EB','ZB','YB'] : ['KiB','MiB','GiB','TiB','PiB','EiB','ZiB','YiB'] var u = -1 do { bytes /= thresh ++u } while (Math.abs(bytes) >= thresh && u < units.length-1) return bytes.toFixed(1) + ' ' + units[u] } function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie != '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = jQuery.trim(cookies[i]); if (cookie.substring(0, name.length + 1) == (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; }