remotes/origin/PR-39
ArturBaybulatov 10 years ago
parent b25676d215
commit fcdf640221
  1. 152
      assets/index.js
  2. 20
      projects/migrations/0036_auto_20160917_2135.py
  3. 3
      projects/models.py
  4. 22
      projects/templates/customer_project_create.html
  5. 32
      projects/templates/customer_project_edit.html

@ -9,6 +9,7 @@ var STUB_IMAGE_URL = '/static/img/profile.jpg'
// Plugins init -------------------------------------------- // Plugins init --------------------------------------------
$('.datepicker').datepicker() $('.datepicker').datepicker()
$('[data-tooltip]').tooltip({ $('[data-tooltip]').tooltip({
@ -25,14 +26,15 @@ $('[data-tooltip]').tooltip({
// Specialization select ----------------------------------- // Specialization select -----------------------------------
var specSelectOptions = { ;(function() {
var specSelectOptions = {
language: 'ru', language: 'ru',
//minimumInputLength: 1, // Commented out to immediately load remote data //minimumInputLength: 1, // Commented out to immediately load remote data
placeholder: 'Выберите специализацию', // Required by `allowClear` placeholder: 'Выберите специализацию', // Required by `allowClear`
allowClear: true, allowClear: true,
ajax: { ajax: {
url: '/api/specializations/', url: null,
dataType: 'json', dataType: 'json',
quietMillis: 250, quietMillis: 250,
cache: true, cache: true,
@ -58,21 +60,12 @@ var specSelectOptions = {
} }
}, },
}, },
initSelection: function(element, callback) {
var id = $(element).val()
if (id !== '') {
$.ajax({url: '/api/specializations/' + id + '/', method: 'GET', dataType: 'json'})
.then(function(data) {callback(data)})
}
} }
}
$('.-spec-select-container').each(function(i, container) { $('.-spec-select-container').each(function(i, container) {
var $container = $(container) var $container = $(container)
var $specSelects = $(container).find('.-spec-select') var $specSelects = $container.find('.-spec-select')
var $chosenSpecId = $container.find('.-chosen-spec-id').first() var $chosenSpecId = $container.find('.-chosen-spec-id').first()
var $specSelect1 = $container.find('.-spec-select-level-1').first() var $specSelect1 = $container.find('.-spec-select-level-1').first()
@ -82,8 +75,7 @@ $('.-spec-select-container').each(function(i, container) {
var specSelects = [$specSelect1, $specSelect2, $specSelect3, $specSelect4] var specSelects = [$specSelect1, $specSelect2, $specSelect3, $specSelect4]
reinitSpecializationsByWorkType($specSelects, null)
$specSelects.select2(specSelectOptions)
var chosenSpecId = $chosenSpecId.val() var chosenSpecId = $chosenSpecId.val()
@ -94,18 +86,23 @@ $('.-spec-select-container').each(function(i, container) {
var specId = $evt.added ? $evt.added.id : null var specId = $evt.added ? $evt.added.id : null
updateSpecializationWidgets(specId, $container, $chosenSpecId, specSelects) updateSpecializationWidgets(specId, $container, $chosenSpecId, specSelects)
}) })
}) })
function reinitSpecializationsByWorkType($specSelects, workTypeId) {
$.get('/api/specializations/?parent__name=_root')
.then(function(res) {
var rootSpecs = res.results
var rootSpec = workTypeId == null ? rootSpecs[0] : ({1: rootSpecs[0], 2: rootSpecs[1], 3: rootSpecs[2]})[workTypeId]
$specSelects.select2(_.merge(specSelectOptions, {
ajax: {url: format('/api/specializations/?lft__gte=%s&rght__lte=%s', rootSpec.lft, rootSpec.rght)},
}))
})
}
function updateSpecializationWidgets(specId, $container, $chosenSpecId, specSelects) { function updateSpecializationWidgets(specId, $container, $chosenSpecId, specSelects) {
return getSpecializationTree(specId).then(function(specs) { return getSpecializationTree(specId).then(function(specs) {
var specLevel1 = specs.specLevel1 var specLevel1 = specs.specLevel1
var specLevel2 = specs.specLevel2 var specLevel2 = specs.specLevel2
@ -119,9 +116,12 @@ function updateSpecializationWidgets(specId, $container, $chosenSpecId, specSele
$chosenSpecId.val(specId) $chosenSpecId.val(specId)
}) })
} }
window.reinitSpecializationsByWorkType = reinitSpecializationsByWorkType
}())
@ -134,24 +134,34 @@ function updateSpecializationWidgets(specId, $container, $chosenSpecId, specSele
// Specialization select (simple) ------------------------------- // Specialization select (simple) -------------------------------
var simpleSpecSelectsOptions = { ;(function() {
var simpleSpecSelectsOptions = {
language: 'ru', language: 'ru',
placeholder: 'Выберите специализацию', // Required by `allowClear` placeholder: 'Выберите специализацию', // Required by `allowClear`
allowClear: true, allowClear: true,
}
var $simpleSpecContainer = $('#simpleSpecContainer') //initSelection: function(element, callback) {
var $emptySimpleSpecWidget = $simpleSpecContainer.find('.-simple-spec-widget').first() // var id = $(element).val()
//
// if (id !== '') {
// $.ajax({url: '/api/specializations/' + id + '/', method: 'GET', dataType: 'json'})
// .then(function(data) {callback(data)})
// }
//}
}
var $simpleSpecContainer = $('#simpleSpecContainer')
var $emptySimpleSpecWidget = $simpleSpecContainer.find('.-simple-spec-widget').first()
$simpleSpecContainer.find('.-chosen-simple-spec-id').each(function(i, el) { $simpleSpecContainer.find('.-chosen-simple-spec-id').each(function(i, el) {
var $el = $(el) var $el = $(el)
var specId = Number($el.val()) var specId = Number($el.val())
if (specId) if (specId)
initSimpleSpecSelect2($el.closest('.-simple-spec-widget').find('.-simple-spec-select').first(), specId) initSimpleSpecSelect2($el.closest('.-simple-spec-widget').find('.-simple-spec-select').first(), specId)
}) })
$('#addSpec').on('click', function($evt) { $('#addSpec').on('click', function($evt) {
var $newSimpleSpecWidget = $emptySimpleSpecWidget.clone() var $newSimpleSpecWidget = $emptySimpleSpecWidget.clone()
$simpleSpecContainer.append($newSimpleSpecWidget) $simpleSpecContainer.append($newSimpleSpecWidget)
var $newSimpleSpecSelect = $newSimpleSpecWidget.find('.-simple-spec-select').first() var $newSimpleSpecSelect = $newSimpleSpecWidget.find('.-simple-spec-select').first()
@ -159,16 +169,16 @@ $('#addSpec').on('click', function($evt) {
initSimpleSpecSelect2($newSimpleSpecSelect).then(function() { initSimpleSpecSelect2($newSimpleSpecSelect).then(function() {
$newSimpleSpecWidget.css('display', 'block') $newSimpleSpecWidget.css('display', 'block')
}) })
}) })
$simpleSpecContainer.on('change', '.-simple-spec-select', function($evt) { $simpleSpecContainer.on('change', '.-simple-spec-select', function($evt) {
if ($evt.added) if ($evt.added)
$(this).parent().children('.-chosen-simple-spec-id').first().val($evt.added.id) $(this).parent().children('.-chosen-simple-spec-id').first().val($evt.added.id)
}) })
function initSimpleSpecSelect2($select, specId) { function initSimpleSpecSelect2($select, specId) {
return $.ajax({url: '/api/specializations/', method: 'GET', dataType: 'json'}) return $.ajax({url: '/api/specializations/', method: 'GET', dataType: 'json'})
.then(function(res) { .then(function(res) {
var specs = res.results var specs = res.results
@ -193,8 +203,8 @@ function initSimpleSpecSelect2($select, specId) {
}) })
} }
}) })
} }
}())
@ -208,7 +218,8 @@ function initSimpleSpecSelect2($select, specId) {
// Team invitation contractor select ------------------------------- // Team invitation contractor select -------------------------------
var contractorSelectOptions = { ;(function() {
var contractorSelectOptions = {
language: 'ru', language: 'ru',
placeholder: 'Выберите пользователя', // Required by `allowClear` placeholder: 'Выберите пользователя', // Required by `allowClear`
allowClear: true, allowClear: true,
@ -241,13 +252,15 @@ var contractorSelectOptions = {
} }
}, },
}, },
} }
function initContractorSelect($select, excludeIds) { function initContractorSelect($select, excludeIds) {
contractorSelectOptions.ajax.url = format('%s?id__in!=%s', contractorSelectOptions.ajax.url, excludeIds.join(',')) contractorSelectOptions.ajax.url = format('%s?id__in!=%s', contractorSelectOptions.ajax.url, excludeIds.join(','))
return $select.select2(contractorSelectOptions) return $select.select2(contractorSelectOptions)
} }
window.initContractorSelect = initContractorSelect
}())
@ -303,23 +316,24 @@ function initContractorSelect($select, excludeIds) {
// Location select ---------------------------------------------- // Location select ----------------------------------------------
var $locationSelects = $('.-location-select') ;(function() {
var $locationSelects = $('.-location-select')
var locationSelectOptions = { var locationSelectOptions = {
language: 'ru', language: 'ru',
placeholder: 'Выберите местоположение', // Required by `allowClear` placeholder: 'Выберите местоположение', // Required by `allowClear`
allowClear: true, allowClear: true,
} }
var $countrySelect = $('.-location-select-country') var $countrySelect = $('.-location-select-country')
var $regionSelect = $('.-location-select-region') var $regionSelect = $('.-location-select-region')
var $citySelect = $('.-location-select-city') var $citySelect = $('.-location-select-city')
// Initialize: // Initialize:
getLocationTree(null).then(function(locs) { getLocationTree(null).then(function(locs) {
$countrySelect.select2(_.merge(locationSelectOptions, {data: locs.countries})) $countrySelect.select2(_.merge(locationSelectOptions, {data: locs.countries}))
$regionSelect.select2(_.merge(locationSelectOptions, {data: locs.regions})) $regionSelect.select2(_.merge(locationSelectOptions, {data: locs.regions}))
$citySelect.select2(_.merge(locationSelectOptions, {data: locs.cities})) $citySelect.select2(_.merge(locationSelectOptions, {data: locs.cities}))
@ -328,15 +342,15 @@ getLocationTree(null).then(function(locs) {
if (chosenLocId) if (chosenLocId)
updateLocationWidgets(chosenLocId) updateLocationWidgets(chosenLocId)
}) })
$locationSelects.on('change', function($evt) { $locationSelects.on('change', function($evt) {
updateLocationWidgets($evt.added ? $evt.added.id : null) updateLocationWidgets($evt.added ? $evt.added.id : null)
}) })
function updateLocationWidgets(locId) { function updateLocationWidgets(locId) {
return getLocationTree(locId).then(function(locs) { return getLocationTree(locId).then(function(locs) {
$countrySelect.select2({data: locs.countries}) $countrySelect.select2({data: locs.countries})
$regionSelect.select2({data: locs.regions}) $regionSelect.select2({data: locs.regions})
@ -358,11 +372,11 @@ function updateLocationWidgets(locId) {
if (loc) if (loc)
$('#chosenLocationId').val(loc.id) $('#chosenLocationId').val(loc.id)
}) })
} }
$('#realtyId').on('change', function($evt) { $('#realtyId').on('change', function($evt) {
var realtyId = Number($(this).val()) var realtyId = Number($(this).val())
if (realtyId) { if (realtyId) {
@ -378,17 +392,17 @@ $('#realtyId').on('change', function($evt) {
$('#realtyConstructionTypeId').val('').change() $('#realtyConstructionTypeId').val('').change()
updateLocationWidgets(null) updateLocationWidgets(null)
} }
}) })
function loadRealtyDetails(realtyId) { function loadRealtyDetails(realtyId) {
return $.ajax({ return $.ajax({
url: '/api/realties/' + realtyId + '/', url: '/api/realties/' + realtyId + '/',
method: 'GET', method: 'GET',
dataType: 'json', dataType: 'json',
}) })
.then(function(res) {return res}) .then(function(res) {return res})
} }
}())
@ -404,14 +418,14 @@ function loadRealtyDetails(realtyId) {
// TODO: Add file number and overall size limit support // TODO: Add file number and overall size limit support
;(function() {
var $fileUploadContainer = $('#fileUploadContainer')
var $fileUploadContainer = $('#fileUploadContainer') $('#fileUploadAddBtn').on('click', function($evt) {
$('#fileUploadAddBtn').on('click', function($evt) {
$fileUploadContainer.find('.file-upload-widget').last().find('.file-upload-input').click() $fileUploadContainer.find('.file-upload-widget').last().find('.file-upload-input').click()
}) })
$fileUploadContainer.on('change', '.file-upload-input', function($evt) { $fileUploadContainer.on('change', '.file-upload-input', function($evt) {
var $fileInput = $(this) var $fileInput = $(this)
var $fileUploadWidget = $fileInput.closest('.file-upload-widget') var $fileUploadWidget = $fileInput.closest('.file-upload-widget')
var filePath = $fileInput.val().replace(/\\/g, '/') var filePath = $fileInput.val().replace(/\\/g, '/')
@ -429,18 +443,18 @@ $fileUploadContainer.on('change', '.file-upload-input', function($evt) {
$fileUploadWidget.css('display', 'block') $fileUploadWidget.css('display', 'block')
} }
}) })
$fileUploadContainer.on('click', '.file-upload-remove-btn', function($evt) { $fileUploadContainer.on('click', '.file-upload-remove-btn', function($evt) {
var $btn = $(this) var $btn = $(this)
$btn.closest('.file-upload-widget').remove() $btn.closest('.file-upload-widget').remove()
}) })
$fileUploadContainer.on('click', '.existing-file-remove-btn', function($evt) { $fileUploadContainer.on('click', '.existing-file-remove-btn', function($evt) {
var $btn = $(this) var $btn = $(this)
$btn.closest('.existing-file-widget').remove() $btn.closest('.existing-file-widget').remove()
}) })
}())

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-09-17 18:35
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('projects', '0035_auto_20160916_2003'),
]
operations = [
migrations.AlterField(
model_name='project',
name='work_type',
field=models.IntegerField(choices=[(1, 'Проектирование'), (2, 'Проверка документации (экспертиза)'), (3, 'Устранение замечаний в проекте (корректировка проектных решений)')], default=1),
),
]

@ -73,7 +73,8 @@ class Realty(models.Model):
class Project(models.Model, HitCountMixin): class Project(models.Model, HitCountMixin):
WORK_TYPES = ( WORK_TYPES = (
(1, 'Проектирование'), (1, 'Проектирование'),
(2, 'Техническое сопровождение') (2, 'Проверка документации'),
(3, 'Устранение замечаний в проекте'),
) )
DEAL_TYPES = ( DEAL_TYPES = (

@ -59,7 +59,7 @@
</div> </div>
<p class="type-work">Тип работы <span data-tooltip data-placement="{% tooltip_placement pk=6 %}" title="{% tooltip pk=6 %}" class="-green-glyphicon glyphicon glyphicon-question-sign"></span> <span id="{% random_ident %}" class="-validation-error" style="color: red">{{ form.work_type.errors.as_text }}</span></p> <p class="type-work">Тип работы <span data-tooltip data-placement="{% tooltip_placement pk=6 %}" title="{% tooltip pk=6 %}" class="-green-glyphicon glyphicon glyphicon-question-sign"></span> <span id="{% random_ident %}" class="-validation-error" style="color: red">{{ form.work_type.errors.as_text }}</span></p>
<div class="mail-block type-work-inset"> <div class="mail-block type-work-inset -project-work-type-selection-container">
{% for id, text in form.work_type.field.choices %} {% for id, text in form.work_type.field.choices %}
<div class="inset-mb"> <div class="inset-mb">
<label> <label>
@ -334,7 +334,7 @@
// Scroll to first form validation error ------------------------------ // Scroll to first form validation error ---------------------------
;(function() { ;(function() {
@ -343,5 +343,23 @@
if (hash) if (hash)
window.location.hash = hash window.location.hash = hash
}()) }())
// Load specialization choices by work type ---------------------------
;(function() {
var $radiosContainer = $('.-project-work-type-selection-container').first()
var $radios = $radiosContainer.find('input[type=radio][name={{ form.work_type.html_name }}]')
var $specSelectContainer = $('.-spec-select-container').first()
var $specSelects = $specSelectContainer.find('.-spec-select')
$radios.on('change', function($evt) {
var $that = $(this)
var workTypeId = $that.val()
reinitSpecializationsByWorkType($specSelects, workTypeId)
})
}())
</script> </script>
{% endblock %} {% endblock %}

@ -69,7 +69,7 @@
</div> </div>
<p class="type-work">Тип работы <span id="{% random_ident %}" class="-validation-error" style="color: red">{{ form.work_type.errors.as_text }}</span></p> <p class="type-work">Тип работы <span id="{% random_ident %}" class="-validation-error" style="color: red">{{ form.work_type.errors.as_text }}</span></p>
<div class="mail-block type-work-inset"> <div class="mail-block type-work-inset -project-work-type-selection-container">
{% for id, text in form.work_type.field.choices %} {% for id, text in form.work_type.field.choices %}
<div class="inset-mb"> <div class="inset-mb">
<label> <label>
@ -175,7 +175,7 @@
</p> </p>
<p class="des-afer"> <p class="des-afer">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Porro vel suscipit eaque quidem voluptate aperiam enim aut libero, excepturi architecto maxime, placeat maiores, odio itaque, ex consectetur dignissimos dicta officia {% tooltip pk=10 as tooltip10 %}{{ tooltip10|linebreaksbr }}
</p> </p>
</div> </div>
@ -195,7 +195,7 @@
</p> </p>
<p class="des-afer"> <p class="des-afer">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Porro vel suscipit eaque quidem voluptate aperiam enim aut libero, excepturi architecto maxime, placeat maiores, odio itaque, ex consectetur dignissimos dicta officia {% tooltip pk=11 as tooltip11 %}{{ tooltip11|linebreaksbr }}
</p> </p>
</div> </div>
</div> </div>
@ -318,18 +318,18 @@
;(function() { ;(function() {
var $workTypeSuggestionModal = $('#projectWorkTypeSuggestionModal') var $modal = $('#projectWorkTypeSuggestionModal')
var $form = $workTypeSuggestionModal.find('.-project-work-type-suggestion-form').first() var $form = $modal.find('.-project-work-type-suggestion-form').first()
var workTypeSuggestionUrl = '/projects/suggest-work-type/' var workTypeSuggestionUrl = '/projects/suggest-work-type/'
$workTypeSuggestionModal.find('.-action-button').first().on('click', function($evt) { $modal.find('.-action-button').first().on('click', function($evt) {
$.post(workTypeSuggestionUrl, $form.serialize()) $.post(workTypeSuggestionUrl, $form.serialize())
.then(function(res) { .then(function(res) {
if (res.status === 'success') { if (res.status === 'success') {
console.log('Success') console.log('Success')
$form.trigger('reset') $form.trigger('reset')
$('.-error').text('') $('.-error').text('')
$workTypeSuggestionModal.modal('hide') $modal.modal('hide')
$.jGrowl('Предложение успешно отправлено') $.jGrowl('Предложение успешно отправлено')
} else if (res.status === 'error') { } else if (res.status === 'error') {
console.log('Error') console.log('Error')
@ -360,5 +360,23 @@
if (hash) if (hash)
window.location.hash = hash window.location.hash = hash
}()) }())
// Load specialization choices by work type ---------------------------
;(function() {
var $radiosContainer = $('.-project-work-type-selection-container').first()
var $radios = $radiosContainer.find('input[type=radio][name={{ form.work_type.html_name }}]')
var $specSelectContainer = $('.-spec-select-container').first()
var $specSelects = $specSelectContainer.find('.-spec-select')
$radios.on('change', function($evt) {
var $that = $(this)
var workTypeId = $that.val()
reinitSpecializationsByWorkType($specSelects, workTypeId)
})
}())
</script> </script>
{% endblock %} {% endblock %}

Loading…
Cancel
Save