From 6937616692ec163380ff0f3ba0a46c6b389cfac8 Mon Sep 17 00:00:00 2001 From: booblegum Date: Fri, 18 Nov 2016 14:09:48 +0300 Subject: [PATCH] =?UTF-8?q?PR-15=20=D0=9F=D1=80=D0=BE=D1=84=D0=B8=D0=BB?= =?UTF-8?q?=D1=8C=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BA=20?= =?UTF-8?q?=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=BC=D0=BE=D0=B4=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Сделан дизайн и компонеты Не реализовано сохранение/отображени данных пользователя --- assets/css/reset.css | 12 +- assets/img/avatar_default.png | Bin 0 -> 48534 bytes .../proekton-components/bash/browserify.sh | 7 + .../lib/proekton-components/bash/watchify.sh | 5 - .../proekton-components/css/select-box.css | 16 +- .../lib/proekton-components/js/build/init.js | 42 +- .../js/build/init_user_profile.js | 1173 +++++++++++++++++ .../js/src/SelectedContainer.js | 43 +- .../js/src/init_user_profile.js | 66 + projects/static/css/project_filter.css | 6 +- templates/partials/base.html | 2 +- users/forms.py | 2 +- users/static/css/custom-checkboxes.css | 41 + users/static/css/user_profile_edit.css | 96 ++ users/templates/user_profile_edit_new.html | 267 ++++ users/urls.py | 2 + users/views.py | 60 + 17 files changed, 1799 insertions(+), 41 deletions(-) create mode 100644 assets/img/avatar_default.png create mode 100644 assets/lib/proekton-components/bash/browserify.sh delete mode 100644 assets/lib/proekton-components/bash/watchify.sh create mode 100644 assets/lib/proekton-components/js/build/init_user_profile.js create mode 100644 assets/lib/proekton-components/js/src/init_user_profile.js create mode 100644 users/static/css/custom-checkboxes.css create mode 100644 users/static/css/user_profile_edit.css create mode 100644 users/templates/user_profile_edit_new.html diff --git a/assets/css/reset.css b/assets/css/reset.css index 3c5f193..35eeb3d 100644 --- a/assets/css/reset.css +++ b/assets/css/reset.css @@ -17,17 +17,17 @@ body, code, dl, dd, form, pre { margin: 0; } -a:link { - color: #009; -} +/*a:link {*/ + /*color: #009;*/ +/*}*/ a:link, a:visited, ins { text-decoration: none; } -a:visited { - color: #505; -} +/*a:visited {*/ + /*color: #505;*/ +/*}*/ a:link img, a:visited img, object, fieldset, abbr, acronym { border: none; diff --git a/assets/img/avatar_default.png b/assets/img/avatar_default.png new file mode 100644 index 0000000000000000000000000000000000000000..30c099e6c7e3680be90b326747ac56e33f01629e GIT binary patch literal 48534 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 m*Q&*a>;I`&H@jOMRek|^MbRw0vc*0C0000 1) throw new RangeError("Replace error: more than one element"); + this.elements_id = [id]; + // Remove old + this._removeById(this.elements_id[0]); + //Add new + this._addElementToHtml(id, max_len); + } + }, { + key: '_addElementToHtml', + value: function _addElementToHtml(id, max_len) { + var self = this; + var header = SelectedContainer.getHeader(this.dataTree.getSpecChain(id), "", max_len); + var name = this.dataTree.getElementById(id).name; + this.elements_id.push(id); + if (this.$input) this.$input.val(this.elements_id.join(',')); + this.$self.append(SelectedContainer.getTemplate(header || " ", name, id)); + this.btn_remove = this.$self.find('.icon-remove'); + this.btn_remove.on("click", this.remove.bind(self)); + } }, { key: 'add', value: function add(_id, max_len) { var id = Number(_id); var self = this; + if (this.onlyOne) { + this.replace(_id, max_len); + return; + } var has_already = this.elements_id.filter(function (el) { return self.dataTree.isChild(el, id); @@ -182,14 +213,7 @@ var SelectedContainer = function () { not_valid.forEach(function (el) { self._removeById(el); }); - - var header = SelectedContainer.getHeader(this.dataTree.getSpecChain(id), "", max_len); - var name = this.dataTree.getElementById(id).name; - this.elements_id.push(id); - if (this.$input) this.$input.val(this.elements_id.join(',')); - this.$self.append(SelectedContainer.getTemplate(header || " ", name, id)); - this.btn_remove = this.$self.find('.icon-remove'); - this.btn_remove.on("click", this.remove.bind(self)); + this._addElementToHtml(id, max_len); } }], [{ key: 'getTemplate', diff --git a/assets/lib/proekton-components/js/build/init_user_profile.js b/assets/lib/proekton-components/js/build/init_user_profile.js new file mode 100644 index 0000000..7785ac0 --- /dev/null +++ b/assets/lib/proekton-components/js/build/init_user_profile.js @@ -0,0 +1,1173 @@ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o\n
\n ' + header + '\n
\n
\n ' + name + '\n
\n \n \n'; +}; + +var SelectedContainer = function () { + function SelectedContainer($container, _ref) { + var _this = this; + + var obj = _ref.obj, + _ref$noTree = _ref.noTree, + noTree = _ref$noTree === undefined ? false : _ref$noTree, + _ref$onlyOne = _ref.onlyOne, + onlyOne = _ref$onlyOne === undefined ? false : _ref$onlyOne; + + _classCallCheck(this, SelectedContainer); + + // TODO: rename variables to camelCase + this.$self = $container; + this.elements_id = []; // [spec_id, spec_id, ...] + this.onlyOne = onlyOne; + var self = this; + + obj.dataPromise.then(function (data) { + _this.dataTree = noTree ? new _NoTreeData2.default(data.results) : new _DataTree2.default(data.results); + _this.$input = _this.$self.find('input[type="hidden"]'); + _this.restoreElements(); + }).catch(self._onLoadDataError.bind(self)); + } + + _createClass(SelectedContainer, [{ + key: 'restoreElements', + value: function restoreElements() { + var self = this; + if (this.$input && this.$input.val()) { + var data = this.$input.val().split(',').filter(function (el) { + return el; + }); + this.elements_id = []; + data.forEach(function (el) { + return self.add(el); + }); + } + } + }, { + key: '_removeById', + value: function _removeById(id) { + var index = this.elements_id.indexOf(id); + if (index >= 0) { + this.elements_id.splice(index, 1); + } + this.$self.find('span[data-id=\'' + id + '\']').parents('.selected-element').remove(); + } + }, { + key: '_onLoadDataError', + value: function _onLoadDataError(error) { + console.log("Error loading data -->", error); + } + }, { + key: 'remove', + value: function remove(e) { + var spec_id = $(e.target).data("id"); + this._removeById(spec_id); + if (this.$input) this.$input.val(this.elements_id.join(',')); + e.preventDefault(); + } + }, { + key: 'replace', + value: function replace(_id, max_len) { + var id = Number(_id); + if (this.elements_id.length > 1) throw new RangeError("Replace error: more than one element"); + // Remove old + this._removeById(this.elements_id[0]); + //Add new + this._addElementToHtml(id, max_len); + this.elements_id = [id]; + } + }, { + key: '_addElementToHtml', + value: function _addElementToHtml(id, max_len) { + var self = this; + var header = SelectedContainer.getHeader(this.dataTree.getSpecChain(id), "", max_len); + var name = this.dataTree.getElementById(id).name; + this.elements_id.push(id); + if (this.$input) this.$input.val(this.elements_id.join(',')); + this.$self.append(SelectedContainer.getTemplate(header || " ", name, id)); + this.btn_remove = this.$self.find('.icon-remove'); + this.btn_remove.on("click", this.remove.bind(self)); + } + }, { + key: 'add', + value: function add(_id, max_len) { + var id = Number(_id); + var self = this; + if (this.onlyOne) { + this.replace(_id, max_len); + return; + } + + var has_already = this.elements_id.filter(function (el) { + return self.dataTree.isChild(el, id); + }); + + if (has_already.length || this.elements_id.indexOf(Number(id)) != -1) { + //TODO: do popup messages + return; + } + + var not_valid = this.elements_id.filter(function (el) { + return self.dataTree.isChild(id, el); + }); + + not_valid.forEach(function (el) { + self._removeById(el); + }); + this._addElementToHtml(id, max_len); + } + }], [{ + key: 'getTemplate', + value: function getTemplate(header, name, id) { + return tmpl_selectedElement(header, name, id); + } + }, { + key: 'getHeader', + value: function getHeader(spec_chain, separator, max_len) { + function toShortString(string, max_len) { + return string.slice(0, max_len) + (string.length > max_len ? "..." : ""); + } + + separator = separator || ' / '; + var str_chain = ""; + + spec_chain.forEach(function (el) { + str_chain = (max_len ? toShortString(el.name, max_len) : el.name) + (str_chain ? separator : "") + str_chain; + }); + + return str_chain; + } + }]); + + return SelectedContainer; +}(); + +exports.default = SelectedContainer; + +},{"./data/DataTree":5,"./data/NoTreeData":6}],3:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _AbsBaseSelect2 = require('./base/AbsBaseSelect'); + +var _AbsBaseSelect3 = _interopRequireDefault(_AbsBaseSelect2); + +var _DataTree = require('./data/DataTree'); + +var _DataTree2 = _interopRequireDefault(_DataTree); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var TreeSelect = function (_AbsBaseSelect) { + _inherits(TreeSelect, _AbsBaseSelect); + + function TreeSelect($container, _ref) { + var url = _ref.url, + obj = _ref.obj, + _ref$hasEditableConta = _ref.hasEditableContainer, + hasEditableContainer = _ref$hasEditableConta === undefined ? false : _ref$hasEditableConta, + _ref$visible = _ref.visible, + visible = _ref$visible === undefined ? hasEditableContainer : _ref$visible; + + _classCallCheck(this, TreeSelect); + + //TODO: сделать автоматическую передачу всех параметров родителю + return _possibleConstructorReturn(this, (TreeSelect.__proto__ || Object.getPrototypeOf(TreeSelect)).call(this, $container, { url: url, obj: obj, hasEditableContainer: hasEditableContainer, visible: visible })); + } + + _createClass(TreeSelect, [{ + key: 'setNearbySelectBox', + value: function setNearbySelectBox(next, prev) { + this.nextSelectBox = next; + this.prevSelectBox = prev; + } + }, { + key: 'clearAllNext', + value: function clearAllNext() { + this.clear(); + if (this.nextSelectBox) { + this.nextSelectBox.hide(); + this.nextSelectBox.clearAllNext(); + } + } + }, { + key: 'clearAllPrev', + value: function clearAllPrev() { + this.clear(); + if (this.prevSelectBox) { + this.clear(); + this.hide(); + this.prevSelectBox.clearAllPrev(); + } + } + }, { + key: '_buildComponents', + value: function _buildComponents(data) { + _get(TreeSelect.prototype.__proto__ || Object.getPrototypeOf(TreeSelect.prototype), '_buildComponents', this).call(this, data); + //TODO: Изменять свойство visible при show/hide + if (!this.visible) this.hide(); + if (this.hasEditableContainer) this.$editableContainer.hide(); + this.dataTree = this.dataTree || new _DataTree2.default(data.results); + this._fillOptionsData(); + this._bindEvents(); + } + }, { + key: '_onclickOptionsElement', + value: function _onclickOptionsElement(e) { + this.clearAllNext(); + _get(TreeSelect.prototype.__proto__ || Object.getPrototypeOf(TreeSelect.prototype), '_onclickOptionsElement', this).call(this, e); + if (this.nextSelectBox && this.dataTree.hasChildren(this.selectedEl.id)) { + this.nextSelectBox.setParent(this.selectedEl.id); + this.nextSelectBox.setHeader(this.selectedEl.value); + this.nextSelectBox.show(); + } + if (this.prevSelectBox) { + this.prevSelectBox.$buttonAddOptions.hide(); + this.prevSelectBox.$searchInput.removeClass("active"); + } + this.$searchInput.addClass('active'); + } + }, { + key: '_onButtonAddOptions', + value: function _onButtonAddOptions(e) { + // this._addToSelectedContainer(this.selectedEl.id); + // this.clear(); + // e.preventDefault(); + // return false; + _get(TreeSelect.prototype.__proto__ || Object.getPrototypeOf(TreeSelect.prototype), '_onButtonAddOptions', this).call(this, e); + this.clearAllNext(); + this.clearAllPrev(); + } + }, { + key: '_onButtonAdd', + value: function _onButtonAdd(e) { + _get(TreeSelect.prototype.__proto__ || Object.getPrototypeOf(TreeSelect.prototype), '_onButtonAdd', this).call(this, e); + this.clearAllNext(); + this.clearAllPrev(); + } + }, { + key: '_addToSelectedContainer', + value: function _addToSelectedContainer(id) { + if (this.selectedContainer) { + this.selectedContainer.add(id); + return; + } + + this.prevSelectBox._addToSelectedContainer(id); + } + }]); + + return TreeSelect; +}(_AbsBaseSelect3.default); + +exports.default = TreeSelect; + +},{"./base/AbsBaseSelect":4,"./data/DataTree":5}],4:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +//TEMPLATES ` +var tmpl_selectBoxEditCont = function tmpl_selectBoxEditCont() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + _ref$preloaderTemplat = _ref.preloaderTemplate, + preloaderTemplate = _ref$preloaderTemplat === undefined ? "" : _ref$preloaderTemplat; + + return "\n
\n
\n \n
\n " + preloaderTemplate + "\n \n \n
\n
\n
\n \n
\n
\n"; +}; + +var tmpl_selectBox = function tmpl_selectBox() { + var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + _ref2$preloaderTempla = _ref2.preloaderTemplate, + preloaderTemplate = _ref2$preloaderTempla === undefined ? "" : _ref2$preloaderTempla; + + return " \n " + preloaderTemplate + "\n \n \n"; +}; + +var tmpl_elementResult = function tmpl_elementResult(el, id, header) { + return "
  • "; +}; + +var tmpl_elementOption = function tmpl_elementOption(el) { + return "
  • " + el.name + "
  • "; +}; + +var tmpl_plug = function tmpl_plug(_ref3) { + var header = _ref3.header, + selectBox = _ref3.selectBox; + return htmlTemplate({ header: header, selectBox: selectBox }); +}; + +var tmpl_selectBoxOptions = function tmpl_selectBoxOptions() { + return "\n
    \n
    \n
      \n \n
    \n
    \n
    \n"; +}; + +var tmpl_selectBoxResults = function tmpl_selectBoxResults() { + return "\n
    \n
    \n
    \n
      \n
    \n
    \n
    \n \u0418\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u0439\n
      \n
    \n
    \n
    \n \n
    \n"; +}; + +var htmlTemplate = function htmlTemplate(_ref4) { + var header = _ref4.header, + selectBox = _ref4.selectBox, + _ref4$id = _ref4.id, + id = _ref4$id === undefined ? "" : _ref4$id, + _ref4$classes = _ref4.classes, + classes = _ref4$classes === undefined ? "" : _ref4$classes, + _ref4$tmpl_selectBoxO = _ref4.tmpl_selectBoxOptions, + tmpl_selectBoxOptions = _ref4$tmpl_selectBoxO === undefined ? function () { + return ""; + } : _ref4$tmpl_selectBoxO, + _ref4$tmpl_selectBoxR = _ref4.tmpl_selectBoxResults, + tmpl_selectBoxResults = _ref4$tmpl_selectBoxR === undefined ? function () { + return ""; + } : _ref4$tmpl_selectBoxR; + return "\n
    \n
    \n
    " + header + "
    \n \n
    \n
    \n " + selectBox + "\n
    \n \n " + tmpl_selectBoxOptions() + "\n " + tmpl_selectBoxResults() + "\n \n
    \n"; +}; +var tmpl_light = function tmpl_light(el) { + return "" + el + ""; +}; + +var tmpl_preloader = function tmpl_preloader() { + return "
    "; +}; + +var AbsBaseSelect = function () { + function AbsBaseSelect($container, _ref5) { + var url = _ref5.url, + obj = _ref5.obj, + _ref5$hasEditableCont = _ref5.hasEditableContainer, + hasEditableContainer = _ref5$hasEditableCont === undefined ? false : _ref5$hasEditableCont, + _ref5$visible = _ref5.visible, + visible = _ref5$visible === undefined ? false : _ref5$visible; + + _classCallCheck(this, AbsBaseSelect); + + if (new.target === AbsBaseSelect) { + throw new TypeError("Cannot construct Abstract instances directly"); + } + if (obj && url) { + throw new URIError("Must be either the date or url"); + } + + var self = this; + //TODO: проверка наличия id контейнера + this.containerId = $container.attr("id"); + this.$container = $container; + this.hasEditableContainer = hasEditableContainer; + this.visible = visible; + // Быстрая заглушка, до отображения данных + if (visible) { + var preloaderTemplate = tmpl_preloader(); + var selectBox = this.hasEditableContainer ? tmpl_selectBoxEditCont({ preloaderTemplate: preloaderTemplate }) : tmpl_selectBox({ preloaderTemplate: preloaderTemplate }); + var plugTemplate = tmpl_plug({ header: "Loading...", selectBox: selectBox }); + $container.html(plugTemplate); + + this.$preloader = $container.find('#component-preloader'); + this.$spinner = this.$preloader.find('.spinner'); + } + if (url) this.dataPromise = this.getData(url); + var _dataPromise = void 0; + if (url) { + _dataPromise = this.dataPromise; + } else { + _dataPromise = obj.dataPromise; + } + // if (dataTree) this.dataTree = dataTree; + _dataPromise.then(self._buildComponents.bind(self)).catch(self._onLoadDataError.bind(self)); + + // INIT EMPTY PROP + this.selectedEl = { id: undefined, value: undefined }; + this.parentId = undefined; + } + + // getTemplate(header, id, editable_container, vertical_child) { + + + _createClass(AbsBaseSelect, [{ + key: "getTemplate", + value: function getTemplate(classes) { + var selectBox = this.hasEditableContainer ? tmpl_selectBoxEditCont() : tmpl_selectBox(); + classes = classes ? classes.join(" ") : ""; + return htmlTemplate({ + header: "TestHeader", selectBox: selectBox, id: this.containerId, classes: classes, + tmpl_selectBoxOptions: tmpl_selectBoxOptions, tmpl_selectBoxResults: tmpl_selectBoxResults + }); + } + }, { + key: "getData", + value: function getData(url) { + var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + var self = this; + return Promise.resolve($.ajax({ + url: url, + dataType: 'json', + data: data + })); + } + }, { + key: "hidePreloader", + value: function hidePreloader() { + // console.log("hide preloader ", this.$preloader); + this.$spinner.fadeOut(); + return Promise.resolve(this.$preloader.delay(500).fadeOut(2000)); + } + }, { + key: "clear", + value: function clear() { + this.$searchInput.val(""); + this.$optionsBox.hide(); + this.$resultsBox.hide(); + this.$buttonAdd.hide(); + this.$buttonAddOptions.hide(); + this.selectedEl = { id: undefined, value: undefined }; + if (this.hasEditableContainer) { + this.$editableContainer.html(""); + this.$editableContainer.hide(); + } + this.$searchInput.removeClass("active"); + } + }, { + key: "hide", + value: function hide() { + this.$selectBox.hide(); + } + }, { + key: "show", + value: function show() { + this.$selectBox.show(); + } + }, { + key: "setHeader", + value: function setHeader(header) { + + if (this.$header) { + this.$header.html(header); + } else { + this.header = header; + } + // default hide + // this.show(); + } + }, { + key: "setParent", + value: function setParent(parentId) { + this.parentId = parentId; + this._fillOptionsData(); + } + }, { + key: "connectSelectedContainer", + value: function connectSelectedContainer(selectedContainer) { + this.selectedContainer = selectedContainer; + } + }, { + key: "getIdsSelectedElements", + value: function getIdsSelectedElements() { + var allChecked = this.$resultsBox.find(":checked"); + return allChecked.map(function () { + return $(this).data("id"); + }); + } + }, { + key: "updateEditableContainer", + value: function updateEditableContainer(elId) { + // Если нет контейнера для отображения ... + if (this.$editableContainer.length) { + var separator = ' / '; + var chainHeader = AbsBaseSelect.getHeader(this.dataTree.getSpecChain(elId, true), { separator: separator }); + chainHeader = AbsBaseSelect.highlight(chainHeader, separator, true); + var elTemplate = "" + chainHeader + ""; + this.$editableContainer.html(elTemplate); + this.$editableContainer.show(); + return; + } + //..., передаем отображение предыдущему selectBox + if (this.prevSelectBox) this.prevSelectBox.updateEditableContainer(elId); + } + }, { + key: "_buildComponents", + value: function _buildComponents(data) { + // AFTER PRELOAD + // this.hidePreloader().then(() => console.log("END -)")); + var classes = this.$container.attr('class'); + if (classes) classes = classes.split(/\s+/); + var template = this.getTemplate(classes); + this.$container.replaceWith(template); + + this.$selectBox = $("#" + this.containerId); + this.$header = this.$selectBox.find('.select-box-header .header'); + this.$header.html(this.header); + 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'); + this.$buttonAdd = this.$selectBox.find('.button-add.results'); + this.$buttonAddOptions = this.$selectBox.find('.button-add.options'); + this.$editableContainer = this.$selectBox.find('.editable-container'); + this.$resultsBox.hide(); + this.$optionsBox.hide(); + this.$buttonAddOptions.hide(); + // TODO: сделать проверку на наличие всех нужных элементов и их корректый jq select + + // REDEFINE IN CHILD + // this.dataTree = data; + // this._bindEvents(); + } + }, { + key: "_fillOptionsData", + value: function _fillOptionsData() { + var self = this; + var dataList = this.dataTree.dataToList(this.parentId); + var $container = this.$optionsBox.find('ul'); + $container.html(""); + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = dataList[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var el = _step.value; + + $container.append($(tmpl_elementOption(el))); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + this.$selectBox.find('li').on("click", this._onclickOptionsElement.bind(self)); + } + }, { + key: "_fillResultsData", + value: function _fillResultsData(searchText) { + var self = this; + + function search(_ref6) { + var searchText = _ref6.searchText, + _ref6$parentCategoryI = _ref6.parentCategoryId, + parentCategoryId = _ref6$parentCategoryI === undefined ? null : _ref6$parentCategoryI, + _ref6$excludeCategory = _ref6.excludeCategoryId, + excludeCategoryId = _ref6$excludeCategory === undefined ? null : _ref6$excludeCategory; + + // :FORMAT spec_list [{name, id}, ...] + var specList = self.dataTree.dataToList(parentCategoryId, true, excludeCategoryId); + return specList.filter(function (el) { + return el.name.toLowerCase().indexOf(searchText.toLowerCase()) !== -1; + }); + } + + function fillContainer($container, template, _ref7) { + var _ref7$searchText = _ref7.searchText, + searchText = _ref7$searchText === undefined ? "" : _ref7$searchText, + _ref7$parentCategoryI = _ref7.parentCategoryId, + parentCategoryId = _ref7$parentCategoryI === undefined ? null : _ref7$parentCategoryI, + _ref7$excludeCategory = _ref7.excludeCategoryId, + excludeCategoryId = _ref7$excludeCategory === undefined ? null : _ref7$excludeCategory; + + $container.html(""); + $('.other-part').show(); + var searchRes = search({ searchText: searchText, parentCategoryId: parentCategoryId, excludeCategoryId: excludeCategoryId }); + // || (!excludeCategoryId && parentCategoryId === null) + if (!searchRes.length) { + if ($container.closest('div').hasClass('main-part')) { + $container.append('
  • Ничего не найдено
  • '); + self.$resultsBox.find('.button-add.results').hide(); + } else { + $('.other-part').hide(); + } + return; + } + self.$resultsBox.find('.button-add.results').show(); + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = searchRes[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var el = _step2.value; + + var header = AbsBaseSelect.getHeader(self.dataTree.getSpecChain(el.id), {}); + $container.append(template(AbsBaseSelect.highlight(el.name, searchText), el.id, header)); + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2.return) { + _iterator2.return(); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + } + + // FILL RESULTS + // MAIN PART + var $container = this.$resultsBox.find('.main-part ul'); + fillContainer($container, tmpl_elementResult, { searchText: searchText, parentCategoryId: self.parentId }); + + // OTHER PART + // Если нет parentId, не нужно искать в других категориях + if (!this.parentId) { + $('.other-part').hide(); + } else { + $container = this.$resultsBox.find('.other-part ul'); + fillContainer($container, tmpl_elementResult, { searchText: searchText, excludeCategoryId: self.parentId }); + } + this.$resultsBox.find('div.header').hide(); + this.$resultsBox.find('li').on("mouseover", function (e) { + $(e.target).children('.header').show(300); + e.preventDefault(); + }); + + this.$resultsBox.find('li').on("mouseout", function (event) { + var e = event.toElement || event.relatedTarget; + if (e.parentNode == this || e == this) { + return; + } + $(this).find('.header').hide(); + }); + } + }, { + key: "_onclickOptionsElement", + value: function _onclickOptionsElement(e) { + this.selectedEl.id = $(e.target).data("id"); + this.selectedEl.value = $(e.target).html(); + this.$searchInput.val($(e.target).html()); + this.updateEditableContainer($(e.target).data("id")); + this.$buttonAddOptions.show(); + this.$optionsBox.hide(); + } + }, { + key: "_onButtonAddOptions", + value: function _onButtonAddOptions(e) { + this._addToSelectedContainer(this.selectedEl.id); + this.clear(); + e.preventDefault(); + return false; + } + }, { + key: "_onButtonAdd", + value: function _onButtonAdd(e) { + var self = this; + + this.getIdsSelectedElements().each(function () { + self._addToSelectedContainer(this); + }); + this.clear(); + e.preventDefault(); + return false; + } + }, { + key: "_onLoadDataError", + value: function _onLoadDataError(error) { + console.log("Error loading data -->", error); + } + }, { + key: "_addToSelectedContainer", + value: function _addToSelectedContainer(id) { + this.selectedContainer.add(id); + } + }, { + key: "_bindEvents", + value: function _bindEvents() { + var self = this; + $(document).click(function (event) { + if ($(event.target).closest("#" + self.containerId).length) { + return; + } + self._looseFocus(); + }); + // RESULTS BOX + this.$searchInput.on("input", function (e) { + self._fillResultsData(self.$searchInput.val()); + self.$resultsBox.show(); + self.$optionsBox.hide(); + }); + // OPTIONS BOX + this.$searchInput.on("click", function (e) { + self.$optionsBox.show(); + self.$resultsBox.hide(); + self.$searchInput.val(""); + }); + + this.$buttonAdd.on("click", function (e) { + self._onButtonAdd(e); + }); + + this.$buttonAddOptions.on("click", this._onButtonAddOptions.bind(self)); + } + }, { + key: "_looseFocus", + value: function _looseFocus() { + this.$resultsBox.hide(); + this.$optionsBox.hide(); + if (!this.selectedEl.id) { + this.$searchInput.val(""); + } else { + this.$searchInput.val(this.selectedEl.value); + } + } + }], [{ + key: "getHeader", + value: function getHeader(catChain, _ref8) { + var _ref8$separator = _ref8.separator, + separator = _ref8$separator === undefined ? " / " : _ref8$separator, + _ref8$maxLen = _ref8.maxLen, + maxLen = _ref8$maxLen === undefined ? 60 : _ref8$maxLen; + + function toShortString(string, maxLen) { + return string.slice(0, maxLen) + (string.length > maxLen ? "..." : ""); + } + + var strChain = ""; + + catChain.forEach(function (el) { + strChain = (maxLen ? toShortString(el.name, maxLen) : el.name) + (strChain ? separator : "") + strChain; + }); + + return strChain; + } + }, { + key: "highlight", + value: function highlight(string, sub_string) { + var lastIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + var index = lastIndex ? string.toLowerCase().lastIndexOf(sub_string.toLowerCase()) : string.toLowerCase().indexOf(sub_string.toLowerCase()); + if (index === -1) return string; + var before = void 0, + select = void 0, + after = void 0; + if (lastIndex) { + var _ref9 = [string.slice(0, index), string.slice(index, string.length), ""]; + before = _ref9[0]; + select = _ref9[1]; + after = _ref9[2]; + } else { + var _ref10 = [string.slice(0, index), string.slice(index, index + sub_string.length), string.slice(index + sub_string.length)]; + before = _ref10[0]; + select = _ref10[1]; + after = _ref10[2]; + } + + return "" + before + tmpl_light(select) + after; + } + }]); + + return AbsBaseSelect; +}(); + +exports.default = AbsBaseSelect; + +},{}],5:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Node = function Node(data, tree) { + _classCallCheck(this, Node); + + this.name = data.name; + this.id = data.id; + if (data.parent === null) { + this.parent = "root"; + data.parent = { id: "root" }; + this.name = ""; + } + if (data.parent.id && data.parent.id !== 'root') { + var el = tree._getElementById(data.parent.id); + this.parent = el.node || new Node(el, tree); + } + data.node = this; + this.children = data.children.map(function (el_obj) { + var el = tree._getElementById(el_obj.id); + if (el.node) return el.node; + el.node = new Node(el, tree); + return el.node; + }); + + this.children = this.children || []; +}; + +var DataTree = function () { + function DataTree(data) { + _classCallCheck(this, DataTree); + + this.baseData = data; + this._root = new Node(data[0], this); + } + + /** + * получить element в базовой структуре + */ + + + _createClass(DataTree, [{ + key: "_getElementById", + value: function _getElementById(id) { + for (var i = 0; i < this.baseData.length; i++) { + if (this.baseData[i].id == id) return this.baseData[i]; + } + } + + /** + * получить element в дереве + */ + + }, { + key: "getElementById", + value: function getElementById(id) { + function searchInChildren(children) { + for (var i = 0; i < children.length; i++) { + if (children[i].id == id) return children[i]; + var res = searchInChildren(children[i].children); + if (res) return res; + } + } + + return searchInChildren(this._root.children); + } + + /** + * Является ли узел c el_id дочерним для parent_id + * @param el_id + * @param parent_id + */ + + }, { + key: "isChild", + value: function isChild(elId, parent_id) { + function checkParent(el, parent) { + if (el.parent == parent) return true; + if (el.parent && el.parent != 'root') return checkParent(el.parent, parent); + return false; + } + return checkParent(this.getElementById(elId), this.getElementById(parent_id)); + } + }, { + key: "hasChildren", + value: function hasChildren(elId) { + return this.getElementById(elId).children.length ? true : false; + } + + /** + * @param start_parent_id(number) - начиная с + * @param attached(bool) - включая вложенные/дочерние + * @param exclude_id - исключая узел c exclude_id и всеми его вложенными узлами + * @returns [{name, id}, ...] + */ + + }, { + key: "dataToList", + value: function dataToList(start_parent_id, attached, exclude_id) { + var data_list = []; + + function goInChildren(children) { + for (var i = 0; i < children.length; i++) { + if (children[i].id == exclude_id) continue; + data_list.push({ name: children[i].name, id: children[i].id }); + if (attached) goInChildren(children[i].children); + } + } + var start = start_parent_id ? this.getElementById(start_parent_id) : this._root; + goInChildren(start.children); + return data_list; + } + + /** + * + * @param id + * @param incl(bool) - исключая сам элемент + * @returns {Array} всех узлов/элементов от элемента с id до корня + */ + + }, { + key: "getSpecChain", + value: function getSpecChain(id) { + var incl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + var chain = []; + var el = this.getElementById(id); + function getParent(el) { + if (el.parent && el.parent != "root") { + chain.push(el.parent); + getParent(el.parent); + } + } + getParent(el); + if (incl) chain.unshift(el); + return chain; + } + }]); + + return DataTree; +}(); + +exports.default = DataTree; + +},{}],6:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var NoTreeData = function () { + function NoTreeData(data) { + _classCallCheck(this, NoTreeData); + + this.data = data; + this.specChain = []; + } + + _createClass(NoTreeData, [{ + key: "getElementById", + value: function getElementById(id) { + for (var i = 0; i < this.data.length; i++) { + if (this.data[i].id == id) return this.data[i]; + } + } + }, { + key: "getSpecChain", + value: function getSpecChain(id, incl) { + return this.specChain; + } + }, { + key: "isChild", + value: function isChild(el_id, parent_id) { + return false; + } + }, { + key: "hasChildren", + value: function hasChildren() { + return false; + } + }, { + key: "dataToList", + value: function dataToList() { + return this.data; + } + }]); + + return NoTreeData; +}(); + +exports.default = NoTreeData; + +},{}],7:[function(require,module,exports){ +'use strict'; + +var _SelectedContainer = require('./SelectedContainer'); + +var _SelectedContainer2 = _interopRequireDefault(_SelectedContainer); + +var _NoTreeSelect = require('./NoTreeSelect'); + +var _NoTreeSelect2 = _interopRequireDefault(_NoTreeSelect); + +var _TreeSelect = require('./TreeSelect'); + +var _TreeSelect2 = _interopRequireDefault(_TreeSelect); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +$(function () { + function createFilterSpecs(url) { + // SPECIALIZATIONS FILTER + var sb_main = new _TreeSelect2.default($('#select-box-1'), { url: url, hasEditableContainer: true }); + sb_main.setHeader("Специализации"); + var select_container = new _SelectedContainer2.default($('#selected-spec'), { obj: sb_main }); + sb_main.connectSelectedContainer(select_container); + var sb_1 = new _TreeSelect2.default($('#select-box-2'), { obj: sb_main }); + var sb_2 = new _TreeSelect2.default($('#select-box-3'), { obj: sb_main }); + var sb_3 = new _TreeSelect2.default($('#select-box-4'), { obj: sb_main }); + var sb_4 = new _TreeSelect2.default($('#select-box-5'), { obj: sb_main }); + + sb_main.setNearbySelectBox(sb_1); + sb_1.setNearbySelectBox(sb_2, sb_main); + sb_2.setNearbySelectBox(sb_3, sb_1); + sb_3.setNearbySelectBox(sb_4, sb_2); + sb_4.setNearbySelectBox("", sb_3); + } + + function createFilterBuildingClass(url) { + // BUILDING-CLASSIFICATION FILTER + var sb_build_main = new _TreeSelect2.default($('#sb-building-classification'), { url: url, visible: true }); + sb_build_main.setHeader("Классификация здания"); + + var sb_build_1 = new _TreeSelect2.default($('#sb-building-sub-classification'), { obj: sb_build_main }); + + var select_build_container = new _SelectedContainer2.default($('#selected-building-classification'), { obj: sb_build_main }); + sb_build_main.connectSelectedContainer(select_build_container); + + sb_build_main.setNearbySelectBox(sb_build_1); + sb_build_1.setNearbySelectBox("", sb_build_main); + } + + function createFilterConstructionType(url) { + var sb_constr_main = new _NoTreeSelect2.default($('#sb-construction-type'), { url: url, visible: true }); + sb_constr_main.setHeader("Вид строительства"); + var select_constr_type = new _SelectedContainer2.default($('#selected-construction-type'), { obj: sb_constr_main, noTree: true }); + sb_constr_main.connectSelectedContainer(select_constr_type); + } + + function createFilerLocations(url) { + var sb_loc_main = new _TreeSelect2.default($('#sb-location-1'), { url: url, visible: true }); + sb_loc_main.setHeader("Местоположение"); + var select_loc = new _SelectedContainer2.default($('#selected-location'), { obj: sb_loc_main, onlyOne: true }); + sb_loc_main.connectSelectedContainer(select_loc); + var sb_loc_1 = new _TreeSelect2.default($('#sb-location-2'), { obj: sb_loc_main }); + var sb_loc_2 = new _TreeSelect2.default($('#sb-location-3'), { obj: sb_loc_main }); + + sb_loc_main.setNearbySelectBox(sb_loc_1); + sb_loc_1.setNearbySelectBox(sb_loc_2, sb_loc_main); + sb_loc_2.setNearbySelectBox("", sb_loc_1); + } + + createFilterSpecs('/api/specializations_flat'); + createFilterBuildingClass('/api/building_classifications'); + createFilterConstructionType('/api/construction_type'); + createFilerLocations('/api/locations_flat'); +}); + +},{"./NoTreeSelect":1,"./SelectedContainer":2,"./TreeSelect":3}]},{},[7]); diff --git a/assets/lib/proekton-components/js/src/SelectedContainer.js b/assets/lib/proekton-components/js/src/SelectedContainer.js index 6cec176..9d9006e 100644 --- a/assets/lib/proekton-components/js/src/SelectedContainer.js +++ b/assets/lib/proekton-components/js/src/SelectedContainer.js @@ -16,10 +16,11 @@ let tmpl_selectedElement = (header, name, id) => `; export default class SelectedContainer { - constructor($container, {obj, noTree = false}) { + constructor($container, {obj, noTree = false, onlyOne = false}) { // TODO: rename variables to camelCase this.$self = $container; this.elements_id = []; // [spec_id, spec_id, ...] + this.onlyOne = onlyOne; const self = this; obj.dataPromise @@ -64,12 +65,12 @@ export default class SelectedContainer { return str_chain; } - _removeById(spec_id) { - let index = this.elements_id.indexOf(spec_id); + _removeById(id) { + let index = this.elements_id.indexOf(id); if (index >= 0) { this.elements_id.splice(index, 1); } - this.$self.find(`span[data-id='${spec_id}']`).parents('.selected-element').remove(); + this.$self.find(`span[data-id='${id}']`).parents('.selected-element').remove(); } _onLoadDataError(error) { @@ -84,9 +85,34 @@ export default class SelectedContainer { e.preventDefault(); } + replace(_id, max_len) { + const id = Number(_id); + if (this.elements_id.length > 1) throw new RangeError("Replace error: more than one element"); + // Remove old + this._removeById(this.elements_id[0]); + //Add new + this._addElementToHtml(id, max_len); + this.elements_id = [id]; + } + + _addElementToHtml(id, max_len) { + let self = this; + const header = SelectedContainer.getHeader(this.dataTree.getSpecChain(id), "", max_len); + const name = this.dataTree.getElementById(id).name; + this.elements_id.push(id); + if (this.$input) this.$input.val(this.elements_id.join(',')); + this.$self.append(SelectedContainer.getTemplate(header || " ", name, id)); + this.btn_remove = this.$self.find('.icon-remove'); + this.btn_remove.on("click", this.remove.bind(self)); + } + add(_id, max_len) { const id = Number(_id); let self = this; + if (this.onlyOne) { + this.replace(_id, max_len); + return + } let has_already = this.elements_id.filter(function (el) { return self.dataTree.isChild(el, id) @@ -104,13 +130,6 @@ export default class SelectedContainer { not_valid.forEach(function (el) { self._removeById(el); }); - - const header = SelectedContainer.getHeader(this.dataTree.getSpecChain(id), "", max_len); - const name = this.dataTree.getElementById(id).name; - this.elements_id.push(id); - if (this.$input) this.$input.val(this.elements_id.join(',')); - this.$self.append(SelectedContainer.getTemplate(header || " ", name, id)); - this.btn_remove = this.$self.find('.icon-remove'); - this.btn_remove.on("click", this.remove.bind(self)); + this._addElementToHtml(id, max_len); } } diff --git a/assets/lib/proekton-components/js/src/init_user_profile.js b/assets/lib/proekton-components/js/src/init_user_profile.js new file mode 100644 index 0000000..fc9279a --- /dev/null +++ b/assets/lib/proekton-components/js/src/init_user_profile.js @@ -0,0 +1,66 @@ +import SelectedContainer from './SelectedContainer'; +import NoTreeSelect from './NoTreeSelect'; +import TreeSelect from './TreeSelect'; + +$(function () { + function createFilterSpecs(url) { + // SPECIALIZATIONS FILTER + let sb_main = new TreeSelect($('#select-box-1'), {url, hasEditableContainer: true}); + sb_main.setHeader("Специализации"); + let select_container = new SelectedContainer($('#selected-spec'), {obj: sb_main}); + sb_main.connectSelectedContainer(select_container); + let sb_1 = new TreeSelect($('#select-box-2'), {obj: sb_main}); + let sb_2 = new TreeSelect($('#select-box-3'), {obj: sb_main}); + let sb_3 = new TreeSelect($('#select-box-4'), {obj: sb_main}); + let sb_4 = new TreeSelect($('#select-box-5'), {obj: sb_main}); + + sb_main.setNearbySelectBox(sb_1); + sb_1.setNearbySelectBox(sb_2, sb_main); + sb_2.setNearbySelectBox(sb_3, sb_1); + sb_3.setNearbySelectBox(sb_4, sb_2); + sb_4.setNearbySelectBox("", sb_3); + + } + + function createFilterBuildingClass(url) { + // BUILDING-CLASSIFICATION FILTER + let sb_build_main = new TreeSelect($('#sb-building-classification'), {url, visible:true}); + sb_build_main.setHeader("Классификация здания"); + + let sb_build_1 = new TreeSelect($('#sb-building-sub-classification'), {obj: sb_build_main}); + + let select_build_container = new SelectedContainer($('#selected-building-classification'), {obj: sb_build_main}); + sb_build_main.connectSelectedContainer(select_build_container); + + sb_build_main.setNearbySelectBox(sb_build_1); + sb_build_1.setNearbySelectBox("", sb_build_main); + } + + function createFilterConstructionType(url) { + let sb_constr_main = new NoTreeSelect($('#sb-construction-type'), {url, visible:true}); + sb_constr_main.setHeader("Вид строительства"); + let select_constr_type = new SelectedContainer($('#selected-construction-type'), {obj:sb_constr_main, noTree: true}); + sb_constr_main.connectSelectedContainer(select_constr_type); + } + + function createFilerLocations(url) { + let sb_loc_main = new TreeSelect($('#sb-location-1'), {url, visible:true}); + sb_loc_main.setHeader("Местоположение"); + let select_loc = new SelectedContainer($('#selected-location'), {obj: sb_loc_main, onlyOne: true}); + sb_loc_main.connectSelectedContainer(select_loc); + let sb_loc_1 = new TreeSelect($('#sb-location-2'), {obj: sb_loc_main}); + let sb_loc_2 = new TreeSelect($('#sb-location-3'), {obj: sb_loc_main}); + + sb_loc_main.setNearbySelectBox(sb_loc_1); + sb_loc_1.setNearbySelectBox(sb_loc_2, sb_loc_main); + sb_loc_2.setNearbySelectBox("", sb_loc_1); + + } + + createFilterSpecs('/api/specializations_flat'); + createFilterBuildingClass('/api/building_classifications'); + createFilterConstructionType('/api/construction_type'); + createFilerLocations('/api/locations_flat'); + + +}); \ No newline at end of file diff --git a/projects/static/css/project_filter.css b/projects/static/css/project_filter.css index e9b895e..0065f49 100644 --- a/projects/static/css/project_filter.css +++ b/projects/static/css/project_filter.css @@ -27,6 +27,11 @@ body { display: inline-block } +.header{ + font-size: 12pt; + color: black; +} + .custom-check .checked{ background: url("../img/checkbox_Check.png.png") no-repeat center; background-size: 210px 51px; @@ -64,7 +69,6 @@ button.resButton:focus {outline:0;} } .flex .header{ - font-size: 12pt; padding-right: 10px; } .header .fa { diff --git a/templates/partials/base.html b/templates/partials/base.html index 9f0382a..ecf18c9 100644 --- a/templates/partials/base.html +++ b/templates/partials/base.html @@ -12,10 +12,10 @@ PROEKTON {# {% compress css %}#} + - diff --git a/users/forms.py b/users/forms.py index b1a3c19..4c6457a 100644 --- a/users/forms.py +++ b/users/forms.py @@ -75,7 +75,7 @@ class UserProfileEditForm(forms.ModelForm): widgets = { # TODO: Use common format with jQueryUI Datepicker: - 'date_of_birth': forms.TextInput(attrs={'class': 'datepicker box-sizing surr surr2'}), + 'date_of_birth': forms.TextInput(attrs={'class': 'datepicker box-sizing simple-input'}), } def __init__(self, *args, **kwargs): diff --git a/users/static/css/custom-checkboxes.css b/users/static/css/custom-checkboxes.css new file mode 100644 index 0000000..e0c0043 --- /dev/null +++ b/users/static/css/custom-checkboxes.css @@ -0,0 +1,41 @@ +.rad { + cursor: pointer; + user-select: none; + -webkit-user-select: none; + -webkit-touch-callout: none; +} + +.rad > input { /* HIDE ORG RADIO & CHECKBOX */ + visibility: hidden; + position: absolute; +} + +/* RADIO & CHECKBOX STYLES */ +.rad > i { /* DEFAULT STYLE */ + display: inline-block; + vertical-align: middle; + width: 24px; + height: 24px; + border-radius: 50%; + transition: 0.2s; + box-shadow: inset 0 0 0 16px #fff; + border: 1px solid #cccccc; + background: #cccccc; + margin-right: 5px; +} + +/* CHECKBOX OVERWRITE STYLES */ +.rad:hover > i { /* HOVER STYLE */ + box-shadow: inset 0 0 0 3px #fff; + background: #cccccc; +} + +.rad > input:checked + i { /* (RADIO CHECKED) STYLE */ + box-shadow: inset 0 0 0 3px #fff; + background: #cccccc; +} + +label.rad { + font-style: italic; + color: #606060; +} \ No newline at end of file diff --git a/users/static/css/user_profile_edit.css b/users/static/css/user_profile_edit.css new file mode 100644 index 0000000..bf56acd --- /dev/null +++ b/users/static/css/user_profile_edit.css @@ -0,0 +1,96 @@ +.mainContent { + padding: 43px 25px 40px 25px; +} + +.simple-input { + height: 51px; + width: 100%; + border: 1px solid #cccccc; + outline: none; + padding: 5px 40px 5px 20px; + background-color: white; + margin-bottom: -1px; +} + +.toggle .btn { + padding: 14px 20px; + border-radius: 40px; +} + +.bottom-line { + padding-bottom: 10px; + border-bottom: 1px solid #cccccc; +} + +.top-line { + /*padding-bottom: 10px;*/ + border-top: 1px solid #cccccc; +} + +/* СУПЕР-костыльная кнопка. Не прикасаться!*/ +.upload-new { + width: 75%; + height: 30px; + overflow: hidden; + cursor: pointer; + /*float: left;*/ + /*margin: 0 0 10px 0;*/ + border-radius: 40px; + border: 1px solid #FF0029; +} + +.upload-new:hover { + box-shadow: 0 0 15px rgba(0, 0, 0, 0.2); + -webkit-transform: scale(1.04); + -moz-transform: scale(1.04); + transform: scale(1.04); +} + +.upload-new { + transition: all 0.3s; + cursor: pointer; +} + +.upload-new input { + display: block !important; + width: 100% !important; + height: 30px !important; + opacity: 0 !important; + cursor: pointer; +} + +.upload-new p { + line-height: 30px; + text-transform: uppercase; + margin: -30px 0 0 0; + /*padding: 0 5px 0 5px;*/ + font-size: 12px; + text-align: center; + font-family: Arial-MT-Regular; +} + +/** Конец супер-костыля**/ + +.row-eq-height { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; +} + +.info { + background-color: #F2F2F2; + padding: 60px 40px; + margin-top: 20px; +} + +.btn-simple { + border-radius: 40px; + padding: 10px 15px; + border: 1px solid #FF0029; + color: black; +} + +.no-margin .selected-element { + margin: 0; +} \ No newline at end of file diff --git a/users/templates/user_profile_edit_new.html b/users/templates/user_profile_edit_new.html new file mode 100644 index 0000000..48dd3a5 --- /dev/null +++ b/users/templates/user_profile_edit_new.html @@ -0,0 +1,267 @@ +{% extends 'partials/base.html' %} +{% load staticfiles %} +{% block head_css %} + + + + + {# other #} + + + +{% endblock %} +{% load thumbnail %} +{% load thumbnail %} + +{% block content %} + {% include 'partials/header.html' %} + {#
    #} + {# {% csrf_token %}#} + {##} + {# {% if request.user.is_customer %}#} + {# #} + {# {% elif request.user.is_contractor %}#} + {# #} + {# {% endif %}#} + +
    +
    +
    +
    +
    +
    +
    + + {# {% thumbnail request.user.avatar "235x224" crop="center" as avatar %}#} + {# {% if request.user.avatar %}#} + {# profile-image#} + {# {% else %}#} + profile-image + {# {% endif %}#} + {# {% endthumbnail %}#} +
    +
    +
    +
    + + +

    Загрузить фотографию

    +
    +
    +
    +
    +
    +
    +
    + + Параметры заполнения прифиля влияют на фильтр поиска специалистов, ранжирования в списке + + +
    +
    +
    +
    +
    + + Личная информация + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
     
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + + Мой опыт работы в проектировании / дизайне / сопровождении проектной документации + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + Требуется допуск (СРО) + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    Дата рождения
    +
    + {{ form.date_of_birth }} +
    +
    +
    +
    Пол
    +
    + + +
    + +
    +
    +
    Статус
    + {{ form.contractor_status }} +
    +
    +
    Skype
    + +
    +
    +
    +
    Сайт
    + +
    +
    +
    Телефон
    + +
    +
    +
    Второй телефон
    + +
    + + +
    + +
    +
    +
    +
    +
    + {% include 'partials/footer.html' %} +
    + +
    + +{% endblock %} +{% block js_block %} + {{ block.super }} + + +{% endblock %} diff --git a/users/urls.py b/users/urls.py index 1bf8480..1fd26de 100755 --- a/users/urls.py +++ b/users/urls.py @@ -18,12 +18,14 @@ from .views import ( TeamProfileView, UserFinancialInfoEditView, UserProfileEditView, + UserProfileEditViewPlus, ) app_name = 'users' urlpatterns = [ urls.url(r'^(?P\d+)/edit/$', UserProfileEditView.as_view(), name='user-profile-edit'), + urls.url(r'^(?P\d+)/edit_plus/$', UserProfileEditViewPlus.as_view(), name='user-profile-edit'), urls.url(r'^(?P\d+)/financial-info/edit/$', UserFinancialInfoEditView.as_view(), name='user-financial-info-edit'), diff --git a/users/views.py b/users/views.py index a3add17..9c9d736 100644 --- a/users/views.py +++ b/users/views.py @@ -100,6 +100,66 @@ class UserProfileEditView(BaseMixin, View): return render(request, self.template_name, context) +class UserProfileEditViewPlus(BaseMixin, View): + form_class = UserProfileEditForm + template_name = 'user_profile_edit_new.html' + + # def dispatch(self, request, *args, **kwargs): + # if request.resolver_match.url_name == 'user-experience-edit': + # if not request.user.is_contractor(): + # raise PermissionDenied + # self.form_class = UserProfileExperienceEditForm + # request.experience_edit = True + # if request.user.is_authenticated() and request.user.pk == int(kwargs.get('pk')): + # return super().dispatch(request, *args, **kwargs) + # else: + # raise PermissionDenied + + def get(self, request, *args, **kwargs): + context = self.get_context_data(**_.merge({}, request.GET, kwargs)) + + form = self.form_class(request=request, instance=request.user) + context.update({'form': form}) + + return render(request, self.template_name, context) + + def post(self, request, *args, **kwargs): + context = self.get_context_data(**kwargs) + + specs = request.POST.getlist('contractor_specializations') + request.POST.setlist('contractor_specializations', _.compact(specs)) # Ignore empty input values + + form = self.form_class(request.POST, request=request, instance=request.user) + + if form.is_valid(): + user = form.save() + + live_image = form.cleaned_data.get('live_image') + + if live_image: + new_image = ContentFile(live_image.file.read()) + new_image.name = live_image.file.name + + user.avatar = new_image + user.save() + + live_image.file.delete() + live_image.delete() + + messages.info(request, 'Пользователь успешно отредактирован') + redirect_to = request.POST.get('next') + return redirect(redirect_to) + else: + if form.errors: + messages.info(request, ( + '

    Произошла ошибка (form)

    ' + '
    {form}
    ' + ).format(form=pformat(form.errors))) + + context.update({'form': form}) + return render(request, self.template_name, context) + + class UserFinancialInfoEditView(BaseMixin, View): form_class = UserProfileBasicInfoEditForm fin_info_form_class = UserFinancialInfoEditForm