diff --git a/assets/js/build/create_project.js b/assets/js/build/create_project.js index 62fb363..ed3f899 100644 --- a/assets/js/build/create_project.js +++ b/assets/js/build/create_project.js @@ -56,7 +56,11 @@ var _only_one_checkbox = __webpack_require__(6); - var _test_seeds = __webpack_require__(7); + var _popups = __webpack_require__(7); + + var _scroll_on_required = __webpack_require__(19); + + var _test_seeds = __webpack_require__(8); function showHideRealry() { var check = $('#checkbox-sb-realty'); @@ -77,6 +81,9 @@ showHideRealry(); (0, _read_more.readMoreInit)(); (0, _only_one_checkbox.onlyOneCheckboxInit)('#safe', '#by_agreement'); + (0, _scroll_on_required.scrollOnRequiredInit)(); + (0, _popups.showPopupsInit)(); + window.addMessage = _popups.addMessage; }); /***/ }, @@ -289,6 +296,59 @@ /***/ }, /* 7 */ +/***/ function(module, exports) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + function showMessage(container, template, message, type) { + var $popup = $(template); + $popup.hide(); + $popup.find('.message').html(message); + $popup.addClass(type); + container.append($popup); + $popup.fadeIn(1000, function () { + setTimeout(function (el) { + $(el).fadeOut(1000); + }, 2000, this); + }); + } + + function addMessage(message, type) { + var $popups_storage = $('#popups-storage'); + var li = '
  • ' + message + '
  • '; + $popups_storage.append(li); + } + + function showPopupsInit() { + var $popups_storage = $('#popups-storage'); + var $popups_container = $('#popups-container'); + var $popup = $popups_container.find(".popup"); + var popup_html = $popup[0].outerHTML; + $popup.remove(); + if (!$popups_storage.length) return; + $.each($popups_storage.find("li"), function (key, value) { + var message = $(value).html(); + var type = $(value).attr('class'); + showMessage($popups_container, popup_html, message, type); + $(value).remove(); + }); + $popups_storage.bind("DOMNodeInserted", function () { + var $li = $(this).find('li'); + var message = $li.html(); + var type = $li.attr('class'); + $li.remove(); + showMessage($popups_container, popup_html, message, type); + }); + } + + exports.showPopupsInit = showPopupsInit; + exports.addMessage = addMessage; + +/***/ }, +/* 8 */ /***/ function(module, exports) { "use strict"; @@ -302,5 +362,35 @@ exports.print = print; +/***/ }, +/* 9 */, +/* 10 */, +/* 11 */, +/* 12 */, +/* 13 */, +/* 14 */, +/* 15 */, +/* 16 */, +/* 17 */, +/* 18 */, +/* 19 */ +/***/ function(module, exports) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + function scrollOnRequiredInit() { + var $required = $('.required.error'); + // console.log($required); + if (!$required.length) return; + $('html, body').animate({ + scrollTop: $required.offset().top - 25 + }, 1000); + } + + exports.scrollOnRequiredInit = scrollOnRequiredInit; + /***/ } /******/ ]); \ No newline at end of file diff --git a/assets/js/build/create_worksell.js b/assets/js/build/create_worksell.js index 032caeb..4a50705 100644 --- a/assets/js/build/create_worksell.js +++ b/assets/js/build/create_worksell.js @@ -40,23 +40,33 @@ /******/ return __webpack_require__(0); /******/ }) /************************************************************************/ -/******/ ([ -/* 0 */ +/******/ ({ + +/***/ 0: /***/ function(module, exports, __webpack_require__) { 'use strict'; var _file_upload = __webpack_require__(1); - var _image_upload = __webpack_require__(8); + var _image_upload = __webpack_require__(20); + + var _scroll_on_required = __webpack_require__(19); + + var _popups = __webpack_require__(7); $(function () { // fileUploadInit(); + // previewImg(); (0, _image_upload.imageUploadInit)(); + (0, _scroll_on_required.scrollOnRequiredInit)(); + (0, _popups.showPopupsInit)(); + window.addMessage = _popups.addMessage; }); /***/ }, -/* 1 */ + +/***/ 1: /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -104,7 +114,8 @@ exports.fileUploadInit = fileUploadInit; /***/ }, -/* 2 */ + +/***/ 2: /***/ function(module, exports) { 'use strict'; @@ -148,12 +159,83 @@ exports.getCookie = getCookie; /***/ }, -/* 3 */, -/* 4 */, -/* 5 */, -/* 6 */, -/* 7 */, -/* 8 */ + +/***/ 7: +/***/ function(module, exports) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + function showMessage(container, template, message, type) { + var $popup = $(template); + $popup.hide(); + $popup.find('.message').html(message); + $popup.addClass(type); + container.append($popup); + $popup.fadeIn(1000, function () { + setTimeout(function (el) { + $(el).fadeOut(1000); + }, 2000, this); + }); + } + + function addMessage(message, type) { + var $popups_storage = $('#popups-storage'); + var li = '
  • ' + message + '
  • '; + $popups_storage.append(li); + } + + function showPopupsInit() { + var $popups_storage = $('#popups-storage'); + var $popups_container = $('#popups-container'); + var $popup = $popups_container.find(".popup"); + var popup_html = $popup[0].outerHTML; + $popup.remove(); + if (!$popups_storage.length) return; + $.each($popups_storage.find("li"), function (key, value) { + var message = $(value).html(); + var type = $(value).attr('class'); + showMessage($popups_container, popup_html, message, type); + $(value).remove(); + }); + $popups_storage.bind("DOMNodeInserted", function () { + var $li = $(this).find('li'); + var message = $li.html(); + var type = $li.attr('class'); + $li.remove(); + showMessage($popups_container, popup_html, message, type); + }); + } + + exports.showPopupsInit = showPopupsInit; + exports.addMessage = addMessage; + +/***/ }, + +/***/ 19: +/***/ function(module, exports) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + function scrollOnRequiredInit() { + var $required = $('.required.error'); + // console.log($required); + if (!$required.length) return; + $('html, body').animate({ + scrollTop: $required.offset().top - 25 + }, 1000); + } + + exports.scrollOnRequiredInit = scrollOnRequiredInit; + +/***/ }, + +/***/ 20: /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -165,6 +247,26 @@ var _utils = __webpack_require__(2); + // function previewImg() { + // let $fileUploadWidgets = $('.file-upload-widget'); + // $.each($fileUploadWidgets, function (ind, el) { + // let $fileImg = $(el).find('img'); + // let $fileInput = $(el).find('.file-upload-input'); + // // console.log("$fileInput[0].files.length = ", $fileInput[0].files.length); + // // console.log("$fileInput.val() = ", $fileInput.val()); + // console.log("$fileInput = ", $fileInput); + // if ($fileInput[0].files.length) { + // console.log("Попытка загрузить файл"); + // let reader = new FileReader(); + // reader.onload = function (e) { + // $fileImg.attr('src', e.target.result); + // }; + // + // reader.readAsDataURL($fileInput[0].files[0]); + // } + // }) + // } + function imageUploadInit() { var $fileUploadContainer = $('#fileUploadContainer'); @@ -179,7 +281,8 @@ var filePath = $fileInput.val().replace(/\\/g, '/'); var fileName = path.basename(filePath); var fileSize = $fileInput.get(0).files && (0, _utils.humanFileSize)($fileInput.get(0).files[0].size); - + console.log("file path", filePath); + console.log("file path2 ", $fileInput[0].files[0]); if (fileName) { $fileUploadWidget.find('.file-upload-label').text(fileName + ' ' + fileSize); @@ -190,7 +293,7 @@ $fileUploadWidget.css('display', 'block'); - if ($fileImg) { + if ($fileImg.length) { var reader = new FileReader(); reader.onload = function (e) { $fileImg.attr('src', e.target.result); @@ -207,6 +310,8 @@ }); } //TODO: оформить Upload'еры в виде классов exports.imageUploadInit = imageUploadInit; + // export {imageUploadInit, previewImg} /***/ } -/******/ ]); \ No newline at end of file + +/******/ }); \ No newline at end of file diff --git a/assets/js/build/init_create_worksell.js b/assets/js/build/init_create_worksell.js index 5a4c81a..babe985 100644 --- a/assets/js/build/init_create_worksell.js +++ b/assets/js/build/init_create_worksell.js @@ -76,7 +76,7 @@ function createSpecs(url) { // SPECIALIZATIONS var sb_main = new _TreeSelect2.default($('#select-box-1'), { url: url, visible: true, required: true }); - sb_main.setHeader("Тип готовой работы"); + // sb_main.setHeader("Тип готовой работы"); var select_container = new _SelectedContainer2.default($('#selected-spec'), { obj: sb_main }); @@ -1049,7 +1049,7 @@ var selectBox = this.hasEditableContainer ? tmpl_selectBoxEditCont() : tmpl_selectBox(); classes = classes ? classes.join(" ") : ""; return htmlTemplate({ - header: "TestHeader", selectBox: selectBox, required: this.required, id: this.containerId, classes: classes, + header: "", selectBox: selectBox, required: this.required, id: this.containerId, classes: classes, tmpl_selectBoxOptions: tmpl_selectBoxOptions, tmpl_selectBoxResults: tmpl_selectBoxResults }); } @@ -1102,7 +1102,8 @@ value: function setHeader(header) { if (this.$header) { - this.$header.html(header); + this.$header.find('.header').html(header); + this.$header.show(); } else { this.header = header; } @@ -1155,8 +1156,9 @@ this.$container.replaceWith(template); this.$selectBox = $("#" + this.containerId); - this.$header = this.$selectBox.find('.select-box-header .header'); - this.$header.html(this.header); + this.$header = this.$selectBox.find('.select-box-header'); + this.$header.find('.header').html(this.header); + if (!this.header) this.$header.hide(); this.$resultsBox = this.$selectBox.find('.select-box-results'); this.$optionsBox = this.$selectBox.find('.select-box-options'); this.$searchInput = this.$selectBox.find('input.select-box-search'); diff --git a/assets/js/build/init_customer_project_create.js b/assets/js/build/init_customer_project_create.js index 6b6233e..42a148c 100644 --- a/assets/js/build/init_customer_project_create.js +++ b/assets/js/build/init_customer_project_create.js @@ -76,7 +76,7 @@ function createSpecs(url) { // SPECIALIZATIONS var sb_main = new _TreeSelect2.default($('#select-box-1'), { url: url, visible: true, required: true }); - sb_main.setHeader("Специальность"); + // sb_main.setHeader("Специальность"); var select_container = new _SelectedContainer2.default($('#selected-spec'), { obj: sb_main, onlyOne: true @@ -1084,7 +1084,7 @@ var selectBox = this.hasEditableContainer ? tmpl_selectBoxEditCont() : tmpl_selectBox(); classes = classes ? classes.join(" ") : ""; return htmlTemplate({ - header: "TestHeader", selectBox: selectBox, required: this.required, id: this.containerId, classes: classes, + header: "", selectBox: selectBox, required: this.required, id: this.containerId, classes: classes, tmpl_selectBoxOptions: tmpl_selectBoxOptions, tmpl_selectBoxResults: tmpl_selectBoxResults }); } @@ -1137,7 +1137,8 @@ value: function setHeader(header) { if (this.$header) { - this.$header.html(header); + this.$header.find('.header').html(header); + this.$header.show(); } else { this.header = header; } @@ -1190,8 +1191,9 @@ this.$container.replaceWith(template); this.$selectBox = $("#" + this.containerId); - this.$header = this.$selectBox.find('.select-box-header .header'); - this.$header.html(this.header); + this.$header = this.$selectBox.find('.select-box-header'); + this.$header.find('.header').html(this.header); + if (!this.header) this.$header.hide(); this.$resultsBox = this.$selectBox.find('.select-box-results'); this.$optionsBox = this.$selectBox.find('.select-box-options'); this.$searchInput = this.$selectBox.find('input.select-box-search'); diff --git a/assets/js/src/create_worksell.js b/assets/js/src/create_worksell.js index 1ce0c56..e96f8e9 100644 --- a/assets/js/src/create_worksell.js +++ b/assets/js/src/create_worksell.js @@ -1,7 +1,13 @@ import {fileUploadInit} from './seeds/file_upload' import {imageUploadInit} from './seeds/image_upload' +import {scrollOnRequiredInit} from './seeds/scroll_on_required' +import {showPopupsInit, addMessage} from './seeds/popups' $(function () { // fileUploadInit(); + // previewImg(); imageUploadInit(); + scrollOnRequiredInit(); + showPopupsInit(); + window.addMessage = addMessage; }); \ No newline at end of file diff --git a/assets/js/src/customer_project_create.js b/assets/js/src/customer_project_create.js index be598d4..89fc83f 100644 --- a/assets/js/src/customer_project_create.js +++ b/assets/js/src/customer_project_create.js @@ -3,6 +3,8 @@ import {extendedFieldInit} from './seeds/extended_field' import {customCheckInit} from './seeds/custom_check' import {readMoreInit} from './seeds/read_more' import {onlyOneCheckboxInit} from './seeds/only_one_checkbox' +import {showPopupsInit, addMessage} from './seeds/popups' +import {scrollOnRequiredInit} from './seeds/scroll_on_required' import {print} from './seeds/test_seeds' function showHideRealry() { @@ -24,4 +26,7 @@ $(function () { showHideRealry(); readMoreInit(); onlyOneCheckboxInit('#safe', '#by_agreement'); + scrollOnRequiredInit(); + showPopupsInit(); + window.addMessage = addMessage; }); \ No newline at end of file diff --git a/assets/js/src/init_create_worksell.js b/assets/js/src/init_create_worksell.js index 259d14a..554ec55 100644 --- a/assets/js/src/init_create_worksell.js +++ b/assets/js/src/init_create_worksell.js @@ -9,7 +9,7 @@ $(function () { function createSpecs(url) { // SPECIALIZATIONS let sb_main = new TreeSelect($('#select-box-1'), {url, visible: true, required: true}); - sb_main.setHeader("Тип готовой работы"); + // sb_main.setHeader("Тип готовой работы"); let select_container = new SelectedContainer($('#selected-spec'), { obj: sb_main, diff --git a/assets/js/src/init_customer_project_create.js b/assets/js/src/init_customer_project_create.js index c95dd61..3b94199 100644 --- a/assets/js/src/init_customer_project_create.js +++ b/assets/js/src/init_customer_project_create.js @@ -9,7 +9,7 @@ $(function () { function createSpecs(url) { // SPECIALIZATIONS let sb_main = new TreeSelect($('#select-box-1'), {url, visible: true, required: true}); - sb_main.setHeader("Специальность"); + // sb_main.setHeader("Специальность"); let select_container = new SelectedContainer($('#selected-spec'), { obj: sb_main, diff --git a/assets/js/src/seeds/image_upload.js b/assets/js/src/seeds/image_upload.js index de39cd8..af7a602 100644 --- a/assets/js/src/seeds/image_upload.js +++ b/assets/js/src/seeds/image_upload.js @@ -1,6 +1,26 @@ //TODO: оформить Upload'еры в виде классов import {humanFileSize} from '../utils' +// function previewImg() { +// let $fileUploadWidgets = $('.file-upload-widget'); +// $.each($fileUploadWidgets, function (ind, el) { +// let $fileImg = $(el).find('img'); +// let $fileInput = $(el).find('.file-upload-input'); +// // console.log("$fileInput[0].files.length = ", $fileInput[0].files.length); +// // console.log("$fileInput.val() = ", $fileInput.val()); +// console.log("$fileInput = ", $fileInput); +// if ($fileInput[0].files.length) { +// console.log("Попытка загрузить файл"); +// let reader = new FileReader(); +// reader.onload = function (e) { +// $fileImg.attr('src', e.target.result); +// }; +// +// reader.readAsDataURL($fileInput[0].files[0]); +// } +// }) +// } + function imageUploadInit() { var $fileUploadContainer = $('#fileUploadContainer'); @@ -15,7 +35,8 @@ function imageUploadInit() { var filePath = $fileInput.val().replace(/\\/g, '/'); var fileName = path.basename(filePath); var fileSize = $fileInput.get(0).files && humanFileSize($fileInput.get(0).files[0].size); - + console.log("file path", filePath); + console.log("file path2 ", $fileInput[0].files[0]); if (fileName) { $fileUploadWidget.find('.file-upload-label').text(fileName + ' ' + fileSize); @@ -26,7 +47,7 @@ function imageUploadInit() { $fileUploadWidget.css('display', 'block'); - if ($fileImg) { + if ($fileImg.length) { let reader = new FileReader(); reader.onload = function (e) { $fileImg.attr('src', e.target.result); @@ -44,4 +65,5 @@ function imageUploadInit() { } -export {imageUploadInit} \ No newline at end of file +export {imageUploadInit} +// export {imageUploadInit, previewImg} \ No newline at end of file diff --git a/assets/js/src/seeds/popups.js b/assets/js/src/seeds/popups.js new file mode 100644 index 0000000..03d3e65 --- /dev/null +++ b/assets/js/src/seeds/popups.js @@ -0,0 +1,43 @@ +function showMessage(container, template, message, type) { + let $popup = $(template); + $popup.hide(); + $popup.find('.message').html(message); + $popup.addClass(type); + container.append($popup); + $popup.fadeIn(1000, function () { + setTimeout(function (el) { + $(el).fadeOut(1000); + }, 2000, this) + + }); +} + +function addMessage(message, type) { + const $popups_storage = $('#popups-storage'); + let li = `
  • ${message}
  • `; + $popups_storage.append(li); +} + +function showPopupsInit() { + const $popups_storage = $('#popups-storage'); + const $popups_container = $('#popups-container'); + let $popup = $popups_container.find(".popup"); + let popup_html = $popup[0].outerHTML; + $popup.remove(); + if (!$popups_storage.length) return; + $.each($popups_storage.find("li"), function (key, value) { + let message = $(value).html(); + let type = $(value).attr('class'); + showMessage($popups_container, popup_html, message, type); + $(value).remove(); + }); + $popups_storage.bind("DOMNodeInserted", function () { + let $li = $(this).find('li'); + let message = $li.html(); + let type = $li.attr('class'); + $li.remove(); + showMessage($popups_container, popup_html, message, type); + }); +} + +export {showPopupsInit, addMessage} \ No newline at end of file diff --git a/assets/js/src/seeds/scroll_on_required.js b/assets/js/src/seeds/scroll_on_required.js new file mode 100644 index 0000000..5238f86 --- /dev/null +++ b/assets/js/src/seeds/scroll_on_required.js @@ -0,0 +1,10 @@ +function scrollOnRequiredInit() { + let $required = $('.required.error'); + // console.log($required); + if (!$required.length) return; + $('html, body').animate({ + scrollTop: $required.offset().top - 25 + }, 1000); +} + +export {scrollOnRequiredInit} \ No newline at end of file diff --git a/assets/lib/proekton-components/js/src/base/AbsBaseSelect.js b/assets/lib/proekton-components/js/src/base/AbsBaseSelect.js index eee258b..5d9937d 100644 --- a/assets/lib/proekton-components/js/src/base/AbsBaseSelect.js +++ b/assets/lib/proekton-components/js/src/base/AbsBaseSelect.js @@ -143,7 +143,7 @@ export default class AbsBaseSelect { let selectBox = this.hasEditableContainer ? tmpl_selectBoxEditCont() : tmpl_selectBox(); classes = classes ? classes.join(" ") : ""; return htmlTemplate({ - header: "TestHeader", selectBox, required: this.required, id: this.containerId, classes, + header: "", selectBox, required: this.required, id: this.containerId, classes, tmpl_selectBoxOptions, tmpl_selectBoxResults }) } @@ -224,7 +224,8 @@ export default class AbsBaseSelect { setHeader(header) { if (this.$header) { - this.$header.html(header) + this.$header.find('.header').html(header); + this.$header.show(); } else { this.header = header } @@ -273,8 +274,9 @@ export default class AbsBaseSelect { this.$container.replaceWith(template); this.$selectBox = $(`#${this.containerId}`); - this.$header = this.$selectBox.find('.select-box-header .header'); - this.$header.html(this.header); + this.$header = this.$selectBox.find('.select-box-header'); + this.$header.find('.header').html(this.header); + if (!this.header) this.$header.hide(); this.$resultsBox = this.$selectBox.find('.select-box-results'); this.$optionsBox = this.$selectBox.find('.select-box-options'); this.$searchInput = this.$selectBox.find('input.select-box-search'); diff --git a/assets/sass/common/_parts.sass b/assets/sass/common/_parts.sass index 0ef0c3d..a92d324 100644 --- a/assets/sass/common/_parts.sass +++ b/assets/sass/common/_parts.sass @@ -19,4 +19,6 @@ .required font: size: 10pt - color: #9f9f9f \ No newline at end of file + color: #9f9f9f + &.error + color: red \ No newline at end of file diff --git a/projects/forms.py b/projects/forms.py index 7172428..fdbdd07 100644 --- a/projects/forms.py +++ b/projects/forms.py @@ -191,7 +191,7 @@ class CustomerProjectEditFormNew(forms.ModelForm): # self.fields['realty'].queryset = self.request.user.realties.all() - # self.fields['budget'].required = False + self.fields['text'].required = True # self.fields['specialization'].queryset = Specialization.objects.root_nodes()[0].get_descendants() # self.fields['specialization'].queryset = Specialization.objects # Migrate with this enabled diff --git a/projects/templates/customer_project_create.html b/projects/templates/customer_project_create.html index 1d5921e..16ec958 100644 --- a/projects/templates/customer_project_create.html +++ b/projects/templates/customer_project_create.html @@ -33,8 +33,8 @@
    Название заказа
    - Обязательно - Обязательно +
    +
    Специальность
    + + Обязательно
    @@ -89,15 +92,15 @@
    - Обязательно - + Разработать проект по електроснабжению и освещению гаража">{{ form.text.value }}
    @@ -362,6 +365,14 @@
    {% include 'partials/footer.html' %} + + {% include 'partials/inc-message-popup.html' %} {% endblock %} diff --git a/templates/partials/base.html b/templates/partials/base.html index 15877bc..0f7d67e 100644 --- a/templates/partials/base.html +++ b/templates/partials/base.html @@ -51,25 +51,27 @@ -{% if messages %} - {% for message in messages %} -
    {{ message|safe }}
    - {% endfor %} -{% endif %} - {% if TEMPLATE_DEBUG %} -
    - {{ request.user }}
    - - {% if request.user.is_authenticated %} - PK: {{ request.user.pk }}
    - Groups: {{ request.user.groups.all }} - {% endif %} -
    + {% if messages %} + {% for message in messages %} +
    {{ message|safe }}
    + {% endfor %} + {% endif %} {% endif %} +{#{% if TEMPLATE_DEBUG %}#} +{#
    #} +{# {{ request.user }}
    #} +{##} +{# {% if request.user.is_authenticated %}#} +{# PK: {{ request.user.pk }}
    #} +{# Groups: {{ request.user.groups.all }}#} +{# {% endif %}#} +{#
    #} +{#{% endif %}#} + {% block content %}{% endblock %} {% block common_js %} diff --git a/templates/partials/inc-message-popup.html b/templates/partials/inc-message-popup.html new file mode 100644 index 0000000..3fae70a --- /dev/null +++ b/templates/partials/inc-message-popup.html @@ -0,0 +1,8 @@ +{% load sass_tags %} + +
    + +
    \ No newline at end of file diff --git a/templates/partials/sass/popups.sass b/templates/partials/sass/popups.sass new file mode 100644 index 0000000..aef056e --- /dev/null +++ b/templates/partials/sass/popups.sass @@ -0,0 +1,28 @@ +.popups-container + width: 100% + position: fixed + top: 0 + left: 0 + opacity: 0.8 + .popup + width: 100% + min-height: 50px + background-color: #7a8529 + border-radius: 20px + border: 1px solid #ffffff + display: flex + -ms-flex-align: center + -webkit-align-items: center + -webkit-box-align: center + align-items: center + //text-align: center + .message + color: white + width: 100% + text-align: center + &.warning + background-color: #ffc649 + &.error + background-color: #ff4146 + &.info + background-color: #4e58ff \ No newline at end of file diff --git a/work_sell/templates/worksell_create.html b/work_sell/templates/worksell_create.html index 1865196..763a1d9 100644 --- a/work_sell/templates/worksell_create.html +++ b/work_sell/templates/worksell_create.html @@ -45,7 +45,7 @@
    Название проекта
    - Обязательно + Обязательно
    +
    Тип готовой работы
    + + Обязательно
    @@ -97,7 +100,7 @@
    -
    @@ -109,9 +112,9 @@
    - Обязательно + Обязательно + rows="8">{{ form.description.value }}
    @@ -130,7 +133,8 @@
    your image - +
    @@ -195,13 +199,23 @@
     
    +
    {% include 'partials/footer.html' %} + + {% include 'partials/inc-message-popup.html' %} {% endblock %} {% block old_js %}