diff --git a/archilance/settings/base.py b/archilance/settings/base.py index 4b7de8e..bdaa9cf 100644 --- a/archilance/settings/base.py +++ b/archilance/settings/base.py @@ -57,6 +57,7 @@ LOCAL_APPS = [ 'chat', 'wallets', 'ratings', + # 'corsheaders', ] WAGTAIL = [ @@ -84,6 +85,7 @@ MIDDLEWARE_CLASSES = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'archilance.middlewares.LocaleMiddleware', + # 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', @@ -97,6 +99,9 @@ MIDDLEWARE_CLASSES = [ ] ROOT_URLCONF = 'archilance.urls' +# +# CORS_ORIGIN_ALLOW_ALL = True +# CORS_ALLOW_CREDENTIALS = True TEMPLATES = [ { diff --git a/assets/lib/proekton-components/bash/watchify.sh b/assets/lib/proekton-components/bash/watchify.sh index 299b0cc..1803fd0 100644 --- a/assets/lib/proekton-components/bash/watchify.sh +++ b/assets/lib/proekton-components/bash/watchify.sh @@ -2,4 +2,4 @@ echo "run watchify" cd .. source ~/venv/proekton/bin/activate -watchify ./src/init.js -t babelify -o ./build/init.js \ No newline at end of file +watchify ./js/src/init.js -t babelify -o ./js/build/init.js \ No newline at end of file diff --git a/assets/lib/proekton-components/css/editable-container.css b/assets/lib/proekton-components/css/editable-container.css index 8104369..f5187b6 100644 --- a/assets/lib/proekton-components/css/editable-container.css +++ b/assets/lib/proekton-components/css/editable-container.css @@ -10,7 +10,3 @@ position: relative; left: -30px; } - -.vertical-child { - margin-top: 30px; -} \ No newline at end of file diff --git a/assets/lib/proekton-components/css/fix-bags.css b/assets/lib/proekton-components/css/fix-bags.css deleted file mode 100644 index cb2449e..0000000 --- a/assets/lib/proekton-components/css/fix-bags.css +++ /dev/null @@ -1,16 +0,0 @@ -body { - font-size: 11pt; - font-family: Arial-MT-Regular, Arial, sans-serif; -} - -/*input[type="checkbox"] + span, input[type="checkbox"]:checked + span {*/ - /*all: initial;*/ - /*font-size: 9pt;*/ - /*color: #494546;*/ - /*cursor: pointer;*/ - /*font-family: Arial-MT-Regular, Arial, sans-serif;*/ -/*}*/ - -/*label {*/ - /*all: initial;*/ -/*}*/ diff --git a/assets/lib/proekton-components/css/other.css b/assets/lib/proekton-components/css/other.css deleted file mode 100644 index 771bc63..0000000 --- a/assets/lib/proekton-components/css/other.css +++ /dev/null @@ -1,73 +0,0 @@ -/*DEMO*/ -.wrapper { - background-color: #f2f2f2; - padding: 40px; - margin: 50px 30px; -} - -.form-container { - padding: 50px 45px; -} - -.separator { - margin-top: 35px; - margin-bottom: 5px; -} - -.custom-check{ - cursor: pointer; - display: inline-block -} - -.custom-check .checked{ - background: url("../img/rect01.png") no-repeat center; - background-size: 210px 51px; - width: 210px; - height: 51px; -} - -.custom-check .not-checked { - background: url("../img/rect02.png") no-repeat center; - background-size: 210px 51px; - width: 210px; - height: 51px; -} - -.titleResF1, div p.titleResF1 { - font-size: 12pt; -} - -.border:after { - background-color: #CFCFCF; - content: ""; - display: inline-block; - height: 1px; - position: relative; - vertical-align: middle; - width: 100%; -} - -.border:after { - left: 0.5em; - margin-right: -100%; -} - -#page-preloader { - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; - background: #090909; - z-index: 100500; -} - -#page-preloader .spinner { - width: 32px; - height: 32px; - position: absolute; - left: 50%; - top: 50%; - background: url('../img/ajax-loader.gif') no-repeat 50% 50%; - margin: -16px 0 0 -16px; -} \ No newline at end of file diff --git a/assets/lib/proekton-components/css/select-box.css b/assets/lib/proekton-components/css/select-box.css index c87fec6..f7804d6 100644 --- a/assets/lib/proekton-components/css/select-box.css +++ b/assets/lib/proekton-components/css/select-box.css @@ -4,28 +4,16 @@ -moz-user-select: none; /* Firefox */ -ms-user-select: none; /* Internet Explorer/Edge */ user-select: none; - /* Non-prefixed version, currently - not supported by any browser */ } -/*input[type="checkbox"]:checked + span {*/ -/*all: initial;*/ -/*font-size: 9pt;*/ -/*color: #494546;*/ -/*}*/ - .select-box-container { display: block; - /*margin-top: 40px;*/ - /*min-width: 200px;*/ } .select-box-header { font-size: 12pt; white-space: nowrap; word-wrap: break-word; - /*position: relative;*/ - /*top:10px;*/ } .select-box-header .header { @@ -35,13 +23,12 @@ overflow: hidden; word-wrap: break-word; max-width: 220px; - } .select-box-header .fa { color: #5e5e5e; position: relative; - top: -5px; + top: -3px; } .select-box-header .fa:hover { @@ -53,8 +40,6 @@ } .select-box-results, .select-box-options { - /*display: block;*/ - /*box-shadow: 0px 0px 10px #777, 0px 15px 10px #000;*/ position: absolute; z-index: 99999; opacity: 0.95; @@ -64,9 +49,11 @@ display: block; max-height: 200px; overflow-y: auto; - border-top: 1px solid #cccccc; + border: 1px solid #cccccc; + /*border-right: 1px solid #cccccc;*/ + /*border-left: 1px solid #cccccc;*/ background-color: #F2F2F2; - box-shadow: 5px 12px 10px -6px rgba(0, 0, 0, .2); + box-shadow: 12px 12px 10px -6px rgba(0, 0, 0, .2); } .select-box-results input[type=checkbox] { @@ -83,12 +70,17 @@ margin: 0; padding: 0; } +.select-box-options ul { + border-right: 1px solid #cccccc; +} + +.select-box-results ul:last-child{ + border-bottom: none; +} .select-box-results li, .select-box-options li { padding: 2px 10px; - border: 1px solid #cccccc; - /*border-right: 1px solid #cccccc;*/ - + border-bottom: 1px solid #cccccc; list-style: none; font-size: 9pt; color: #494546; @@ -107,13 +99,9 @@ border-left: 2px solid red; color: #0e0e0e; } - -/*.select-box-results span:hover{*/ -/*color: green;*/ -/*}*/ -/*.select-box-search{*/ -/*position: relative;*/ -/*}*/ +.select-box-search{ + position: relative; +} input.select-box-search { height: 51px; @@ -121,12 +109,16 @@ input.select-box-search { border: 1px solid #cccccc; outline: none; padding: 5px 40px 5px 20px; - background: url("../img/magnifying-glass-308581.svg") no-repeat right; + background: url("../img/zoom.svg") no-repeat right; background-size: 40px 40px; background-color: white; margin-bottom: -1px; } +input.select-box-search.active{ + border: 1px solid #FF0029; +} + input.select-box-search:-webkit-autofill, input.select-box-search:-webkit-autofill:hover, input.select-box-search:-webkit-autofill:focus, @@ -135,11 +127,11 @@ input.select-box-search:-webkit-autofill { /*-webkit-text-fill-color: black;*/ /*-webkit-box-shadow: 0 0 0 1000px transparent inset;*/ transition: background-color 5000s ease-in-out 0s; - /*background: white;*/ } .select-box-results .main-part { display: block; + border-right: 1px solid #cccccc; } .select-box-results .other-part { @@ -155,7 +147,6 @@ input.select-box-search:-webkit-autofill { /*???*/ .select-box-options .box-wrapper, .select-box-results { - /*padding: 0 10px;*/ min-width: 300px; max-width: 400px; } @@ -179,13 +170,32 @@ button.button-add { border-radius: 15px; /* IE 9, Safari 5, Chrome */ background-color: #FF0029; padding: 4px 15px 2px 15px; - /*border: none;*/ text-decoration: none; color: white; } .highlight { - color: red; + color: #FF0029; } +#component-preloader { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + background: #9fa4a4; + opacity: 0.2; + z-index: 100500; +} + +#component-preloader .spinner { + width: 32px; + height: 32px; + position: absolute; + left: 50%; + top: 50%; + background: url('../img/ajax-loader.gif') no-repeat 50% 50%; + margin: -16px 0 0 -16px; +} diff --git a/assets/lib/proekton-components/css/selected-container.css b/assets/lib/proekton-components/css/selected-container.css index 6c50261..776dde8 100644 --- a/assets/lib/proekton-components/css/selected-container.css +++ b/assets/lib/proekton-components/css/selected-container.css @@ -1,12 +1,9 @@ .selected-container { - /*display: inline-block;*/ - /*width: 100%;*/ min-height: 40px; padding-bottom: 20px; } .selected-container .selected-element { - /*display: inline-block;*/ padding: 5px 35px 5px 10px; margin-top: 8px; min-height: 45px; @@ -17,40 +14,32 @@ -webkit-border-radius: 10px; /* Safari 4 */ border-radius: 10px; /* IE 9, Safari 5, Chrome */ } -.horizontal .selected-element{ + +.horizontal .selected-element { display: inline-block; } -.selected-element .header,.name{ +.selected-element .header, .name { white-space: nowrap; text-overflow: ellipsis; overflow: hidden; width: 100%; } - -.selected-element .header{ +.selected-element .header,.name { + max-width: 300px; +} +.selected-element .header { font-size: 7pt; color: #676363; - /*white-space: nowrap;*/ - /*text-overflow: ellipsis;*/ - /*overflow: hidden;*/ - /*word-wrap: break-word;*/ - /*width: 100%;*/ } .selected-element .name { font-size: 11pt; - /*white-space: nowrap;*/ - /*text-overflow: ellipsis;*/ - /*overflow: hidden;*/ - /*width: 100%;*/ } - -.selected-element .icon-remove{ +.selected-element .icon-remove { background-image: url('../img/cross01.png'); background-size: 20px 20px; - /*display: inline-block;*/ position: absolute; right: 5px; top: 15px; diff --git a/assets/lib/proekton-components/img/zoom.png b/assets/lib/proekton-components/img/zoom.png deleted file mode 100644 index cfd0e74..0000000 Binary files a/assets/lib/proekton-components/img/zoom.png and /dev/null differ diff --git a/assets/lib/proekton-components/img/magnifying-glass-308581.svg b/assets/lib/proekton-components/img/zoom.svg similarity index 100% rename from assets/lib/proekton-components/img/magnifying-glass-308581.svg rename to assets/lib/proekton-components/img/zoom.svg diff --git a/assets/lib/proekton-components/img/zoom1.png b/assets/lib/proekton-components/img/zoom1.png deleted file mode 100644 index 873693f..0000000 Binary files a/assets/lib/proekton-components/img/zoom1.png and /dev/null differ diff --git a/assets/lib/proekton-components/build/init.js b/assets/lib/proekton-components/js/build/init.js similarity index 71% rename from assets/lib/proekton-components/build/init.js rename to assets/lib/proekton-components/js/build/init.js index 131b7a0..0e7f01b 100644 --- a/assets/lib/proekton-components/build/init.js +++ b/assets/lib/proekton-components/js/build/init.js @@ -7,6 +7,8 @@ Object.defineProperty(exports, "__esModule", { 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); @@ -26,19 +28,28 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" var NoTreeSelect = function (_AbsBaseSelect) { _inherits(NoTreeSelect, _AbsBaseSelect); - function NoTreeSelect(_ref) { - var $container = _ref.$container, - data = _ref.data; + function NoTreeSelect($container, _ref) { + var url = _ref.url, + obj = _ref.obj, + _ref$visible = _ref.visible, + visible = _ref$visible === undefined ? true : _ref$visible; _classCallCheck(this, NoTreeSelect); - var _this = _possibleConstructorReturn(this, (NoTreeSelect.__proto__ || Object.getPrototypeOf(NoTreeSelect)).call(this, { $container: $container, data: new _NoTreeData2.default(data) })); - - _this.$buttonAddOptions.hide(); - return _this; + //TODO: сделать автоматическую передачу всех параметров родителю + return _possibleConstructorReturn(this, (NoTreeSelect.__proto__ || Object.getPrototypeOf(NoTreeSelect)).call(this, $container, { url: url, obj: obj, visible: visible })); } _createClass(NoTreeSelect, [{ + key: '_buildComponents', + value: function _buildComponents(data) { + _get(NoTreeSelect.prototype.__proto__ || Object.getPrototypeOf(NoTreeSelect.prototype), '_buildComponents', this).call(this, data); + this.dataTree = this.dataTree || new _NoTreeData2.default(data.results); + this.$buttonAddOptions.hide(); + this._fillOptionsData(); + this._bindEvents(); + } + }, { key: '_onclickOptionsElement', value: function _onclickOptionsElement(e) { this.selectedEl.id = $(e.target).data("id"); @@ -92,17 +103,25 @@ var tmpl_selectedElement = function tmpl_selectedElement(header, name, id) { }; var SelectedContainer = function () { - function SelectedContainer($container, data) { - var noTree = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + function SelectedContainer($container, _ref) { + var _this = this; + + var obj = _ref.obj, + _ref$noTree = _ref.noTree, + noTree = _ref$noTree === undefined ? false : _ref$noTree; _classCallCheck(this, SelectedContainer); // TODO: rename variables to camelCase this.$self = $container; this.elements_id = []; // [spec_id, spec_id, ...] - this.dataTree = noTree ? new _NoTreeData2.default(data) : new _DataTree2.default(data); - this.$input = this.$self.find('input[type="hidden"]'); - this.restoreElements(); + 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, [{ @@ -113,7 +132,6 @@ var SelectedContainer = function () { var data = this.$input.val().split(',').filter(function (el) { return el; }); - console.log("restore data = ", data); this.elements_id = []; data.forEach(function (el) { return self.add(el); @@ -129,6 +147,11 @@ var SelectedContainer = function () { } this.$self.find('span[data-id=\'' + spec_id + '\']').parents('.selected-element').remove(); } + }, { + key: '_onLoadDataError', + value: function _onLoadDataError(error) { + console.log("Error loading data -->", error); + } }, { key: 'remove', value: function remove(e) { @@ -147,10 +170,8 @@ var SelectedContainer = function () { return self.dataTree.isChild(el, id); }); - // console.log(has_already); if (has_already.length || this.elements_id.indexOf(Number(id)) != -1) { //TODO: do popup messages - console.log("Not actually"); return; } @@ -163,9 +184,6 @@ var SelectedContainer = function () { }); var header = SelectedContainer.getHeader(this.dataTree.getSpecChain(id), "", max_len); - console.log("id = ", id); - console.log("chain = ", this.dataTree.getSpecChain(id)); - console.log("header = ", header); var name = this.dataTree.getElementById(id).name; this.elements_id.push(id); if (this.$input) this.$input.val(this.elements_id.join(',')); @@ -231,15 +249,18 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" var TreeSelect = function (_AbsBaseSelect) { _inherits(TreeSelect, _AbsBaseSelect); - function TreeSelect(_ref) { - var $container = _ref.$container, - data = _ref.data, + function TreeSelect($container, _ref) { + var url = _ref.url, + obj = _ref.obj, _ref$hasEditableConta = _ref.hasEditableContainer, - hasEditableContainer = _ref$hasEditableConta === undefined ? false : _ref$hasEditableConta; + hasEditableContainer = _ref$hasEditableConta === undefined ? false : _ref$hasEditableConta, + _ref$visible = _ref.visible, + visible = _ref$visible === undefined ? hasEditableContainer : _ref$visible; _classCallCheck(this, TreeSelect); - return _possibleConstructorReturn(this, (TreeSelect.__proto__ || Object.getPrototypeOf(TreeSelect)).call(this, { $container: $container, data: new _DataTree2.default(data), hasEditableContainer: hasEditableContainer })); + //TODO: сделать автоматическую передачу всех параметров родителю + return _possibleConstructorReturn(this, (TreeSelect.__proto__ || Object.getPrototypeOf(TreeSelect)).call(this, $container, { url: url, obj: obj, hasEditableContainer: hasEditableContainer, visible: visible })); } _createClass(TreeSelect, [{ @@ -251,7 +272,6 @@ var TreeSelect = function (_AbsBaseSelect) { }, { key: 'clearAllNext', value: function clearAllNext() { - // console.log("clearAllNext"); this.clear(); if (this.nextSelectBox) { this.nextSelectBox.hide(); @@ -265,16 +285,26 @@ var TreeSelect = function (_AbsBaseSelect) { if (this.prevSelectBox) { this.clear(); this.hide(); - // this.prevSelectBox.clear(); 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.prevSelectBox && this.dataTree.hasChildren(this.selectedEl.id)) this.$searchInput.removeClass('active'); if (this.nextSelectBox && this.dataTree.hasChildren(this.selectedEl.id)) { this.nextSelectBox.setParent(this.selectedEl.id); this.nextSelectBox.setHeader(this.selectedEl.value); @@ -328,61 +358,117 @@ var _createClass = function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -//TEMPLATES +//TEMPLATES ` var tmpl_selectBoxEditCont = function tmpl_selectBoxEditCont() { - return "\n
\n
\n \n \n
\n
\n \n
\n
\n"; + 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() { - return "\n \n \n \n"; + 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 "
  • "; + return "
  • "; }; + var tmpl_elementOption = function tmpl_elementOption(el) { return "
  • " + el.name + "
  • "; }; -//${vertical_child} -var htmlTemplate = function htmlTemplate(_ref) { - var header = _ref.header, - selectBox = _ref.selectBox, - id = _ref.id, - classes = _ref.classes; - return "\n
    \n
    \n
    " + header + "
    \n \n
    \n
    \n " + selectBox + "\n
    \n
    \n
    \n
      \n \n
    \n
    \n
    \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 \n
    \n"; + +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"; +}; + +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 () { - // constructor($container, data, hasEditableContainer, verticalChild) { - function AbsBaseSelect(_ref2) { - var $container = _ref2.$container, - data = _ref2.data, - _ref2$hasEditableCont = _ref2.hasEditableContainer, - hasEditableContainer = _ref2$hasEditableCont === undefined ? false : _ref2$hasEditableCont; + 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.dataTree = data; - // console.log("data = ", data); - // Вариант не выбран + this.$container = $container; this.hasEditableContainer = hasEditableContainer; - var classes = $container.attr('class'); - if (classes) classes = classes.split(/\s+/); - var template = this.getTemplate(classes); - $container.replaceWith(template); - this._buildComponents(); - this._bindEvents(); - // if (!has_editable_container) this.hide(); + 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; - this.hide(); } // getTemplate(header, id, editable_container, vertical_child) { @@ -393,12 +479,33 @@ var AbsBaseSelect = function () { 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 }); + 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() { - // console.log("clear"); this.$searchInput.val(""); this.$optionsBox.hide(); this.$resultsBox.hide(); @@ -423,15 +530,21 @@ var AbsBaseSelect = function () { }, { key: "setHeader", value: function setHeader(header) { - this.$header.html(header); + + if (this.$header) { + this.$header.html(header); + } else { + this.header = header; + } // default hide - this.show(); + // this.show(); } }, { key: "setParent", value: function setParent(parentId) { this.parentId = parentId; this._fillOptionsData(); + this.$searchInput.addClass('active'); } }, { key: "connectSelectedContainer", @@ -453,7 +566,6 @@ var AbsBaseSelect = function () { if (this.$editableContainer.length) { var separator = ' / '; var chainHeader = AbsBaseSelect.getHeader(this.dataTree.getSpecChain(elId, true), { separator: separator }); - // console.log('chainHeader = ', chainHeader); chainHeader = AbsBaseSelect.highlight(chainHeader, separator, true); var elTemplate = "" + chainHeader + ""; this.$editableContainer.html(elTemplate); @@ -465,21 +577,31 @@ var AbsBaseSelect = function () { } }, { key: "_buildComponents", - value: function _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'); - if (this.hasEditableContainer) this.$editableContainer.hide(); - this._fillOptionsData(); this.$resultsBox.hide(); this.$optionsBox.hide(); this.$buttonAddOptions.hide(); // TODO: сделать проверку на наличие всех нужных элементов и их корректый jq select + + // REDEFINE IN CHILD + // this.dataTree = data; + // this._bindEvents(); } }, { key: "_fillOptionsData", @@ -520,43 +642,38 @@ var AbsBaseSelect = function () { value: function _fillResultsData(searchText) { var self = this; - function search(_ref3) { - var searchText = _ref3.searchText, - _ref3$parentCategoryI = _ref3.parentCategoryId, - parentCategoryId = _ref3$parentCategoryI === undefined ? null : _ref3$parentCategoryI, - _ref3$excludeCategory = _ref3.excludeCategoryId, - excludeCategoryId = _ref3$excludeCategory === undefined ? null : _ref3$excludeCategory; + 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); - // console.log("search -->", spec_list.length); - // console.log("parent_id ", parentCategoryId); return specList.filter(function (el) { return el.name.toLowerCase().indexOf(searchText.toLowerCase()) !== -1; }); } - function fillContainer($container, template, _ref4) { - var _ref4$searchText = _ref4.searchText, - searchText = _ref4$searchText === undefined ? "" : _ref4$searchText, - _ref4$parentCategoryI = _ref4.parentCategoryId, - parentCategoryId = _ref4$parentCategoryI === undefined ? null : _ref4$parentCategoryI, - _ref4$excludeCategory = _ref4.excludeCategoryId, - excludeCategoryId = _ref4$excludeCategory === undefined ? null : _ref4$excludeCategory; + 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) - // console.log("searchRes = ", searchRes); if (!searchRes.length) { if ($container.closest('div').hasClass('main-part')) { $container.append('
  • Ничего не найдено
  • '); self.$resultsBox.find('.button-add.results').hide(); - // console.log('not found main-part'); } else { $('.other-part').hide(); - // console.log('not found other-part'); } return; } @@ -595,12 +712,10 @@ var AbsBaseSelect = function () { // OTHER PART // Если нет parentId, не нужно искать в других категориях - // console.log("parentID = ", this.parentId); if (!this.parentId) { $('.other-part').hide(); } else { $container = this.$resultsBox.find('.other-part ul'); - // console.log("Fill other-part"); fillContainer($container, tmpl_elementResult, { searchText: searchText, excludeCategoryId: self.parentId }); } this.$resultsBox.find('div.header').hide(); @@ -611,12 +726,9 @@ var AbsBaseSelect = function () { this.$resultsBox.find('li').on("mouseout", function (event) { var e = event.toElement || event.relatedTarget; - // console.log(e.parentNode, ' ==', this); - // console.log(e, ' ==', this); if (e.parentNode == this || e == this) { return; } - // console.log("OUT"); $(this).find('.header').hide(); }); } @@ -635,6 +747,7 @@ var AbsBaseSelect = function () { value: function _onButtonAddOptions(e) { this._addToSelectedContainer(this.selectedEl.id); this.clear(); + this.$searchInput.removeClass('active'); e.preventDefault(); return false; } @@ -644,13 +757,17 @@ var AbsBaseSelect = function () { var self = this; this.getIdsSelectedElements().each(function () { - // console.log("add el -->", this); 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) { @@ -696,15 +813,14 @@ var AbsBaseSelect = function () { } else { this.$searchInput.val(this.selectedEl.value); } - // console.log("loose ", this.selectedEl.id); } }], [{ key: "getHeader", - value: function getHeader(catChain, _ref5) { - var _ref5$separator = _ref5.separator, - separator = _ref5$separator === undefined ? " / " : _ref5$separator, - _ref5$maxLen = _ref5.maxLen, - maxLen = _ref5$maxLen === undefined ? 60 : _ref5$maxLen; + 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 ? "..." : ""); @@ -724,21 +840,20 @@ var AbsBaseSelect = function () { 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()); - // console.log("index = ", index); if (index === -1) return string; var before = void 0, select = void 0, after = void 0; if (lastIndex) { - var _ref6 = [string.slice(0, index), string.slice(index, string.length), ""]; - before = _ref6[0]; - select = _ref6[1]; - after = _ref6[2]; + var _ref9 = [string.slice(0, index), string.slice(index, string.length), ""]; + before = _ref9[0]; + select = _ref9[1]; + after = _ref9[2]; } else { - var _ref7 = [string.slice(0, index), string.slice(index, index + sub_string.length), string.slice(index + sub_string.length)]; - before = _ref7[0]; - select = _ref7[1]; - after = _ref7[2]; + 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; @@ -778,8 +893,6 @@ var Node = function Node(data, tree) { data.node = this; this.children = data.children.map(function (el_obj) { var el = tree._getElementById(el_obj.id); - if (!el) console.log("el not found with id", el_obj.id); - // console.log("el = ", el, "el.id = ", el_obj.id); if (el.node) return el.node; el.node = new Node(el, tree); return el.node; @@ -805,7 +918,6 @@ var DataTree = function () { key: "_getElementById", value: function _getElementById(id) { for (var i = 0; i < this.baseData.length; i++) { - // console.log(this.baseData[i].id, " / ", id); if (this.baseData[i].id == id) return this.baseData[i]; } } @@ -847,7 +959,6 @@ var DataTree = function () { }, { key: "hasChildren", value: function hasChildren(elId) { - console.log('id = ', elId); return this.getElementById(elId).children.length ? true : false; } @@ -889,7 +1000,6 @@ var DataTree = function () { var chain = []; var el = this.getElementById(id); - console.log("el = ", el); function getParent(el) { if (el.parent && el.parent != "root") { chain.push(el.parent); @@ -977,20 +1087,20 @@ var _TreeSelect2 = _interopRequireDefault(_TreeSelect); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -// ` - $(function () { - function createFilterSpecs(_data) { + function createFilterSpecs(url) { // SPECIALIZATIONS FILTER - var data = _data.results; - var sb_main = new _TreeSelect2.default({ $container: $('#select-box-1'), data: data, hasEditableContainer: true }); + var sb_main = new _TreeSelect2.default($('#select-box-1'), { url: url, hasEditableContainer: true }); sb_main.setHeader("Специализации"); - var select_container = new _SelectedContainer2.default($('#selected-spec'), data); + var select_container = new _SelectedContainer2.default($('#selected-spec'), { obj: sb_main }); sb_main.connectSelectedContainer(select_container); - var sb_1 = new _TreeSelect2.default({ $container: $('#select-box-2'), data: data }); - var sb_2 = new _TreeSelect2.default({ $container: $('#select-box-3'), data: data }); - var sb_3 = new _TreeSelect2.default({ $container: $('#select-box-4'), data: data }); - var sb_4 = new _TreeSelect2.default({ $container: $('#select-box-5'), data: data }); + 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 }); + // let sb_2 = new TreeSelect({$container: $('#select-box-3'), data: data}); + // let sb_3 = new TreeSelect({$container: $('#select-box-4'), data: data}); + // let sb_4 = new TreeSelect({$container: $('#select-box-5'), data: data}); sb_main.setNearbySelectBox(sb_1); sb_1.setNearbySelectBox(sb_2, sb_main); @@ -999,122 +1109,64 @@ $(function () { sb_4.setNearbySelectBox("", sb_3); } - function createFilterBuildingClass(_data) { + function createFilterBuildingClass(url) { // BUILDING-CLASSIFICATION FILTER - var data = _data.results; - var sb_build_main = new _TreeSelect2.default({ $container: $('#sb-building-classification'), data: data }); + 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({ $container: $('#sb-building-sub-classification'), data: data }); + 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'), data); + 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(_data) { - var data = _data.results; - var sb_constr_main = new _NoTreeSelect2.default({ $container: $('#sb-construction-type'), data: data }); + 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'), data, true); + 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(data) { - var sb_loc_main = new _TreeSelect2.default({ $container: $('#sb-location-1'), data: data }); + 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'), data); + var select_loc = new _SelectedContainer2.default($('#selected-location'), { obj: sb_loc_main }); sb_loc_main.connectSelectedContainer(select_loc); - var sb_loc_1 = new _TreeSelect2.default({ $container: $('#sb-location-2'), data: data }); - var sb_loc_2 = new _TreeSelect2.default({ $container: $('#sb-location-3'), data: data }); + 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); - //TODO: Временно прелоадер на самом тяжелом объекте - // hidePreloader() - } - - $.ajax({ - url: '/api/specializations_flat', - dataType: 'json', - data: {}, - success: createFilterSpecs - }); - - $.ajax({ - url: '/api/building_classifications', - dataType: 'json', - data: {}, - success: createFilterBuildingClass - }); - - $.ajax({ - url: '/api/construction_type', - dataType: 'json', - data: {}, - success: createFilterConstructionType - }); - - var data = []; - - function fullData(_data) { - data = data.concat(_data.results.length ? _data.results : []); - var url = _data.next; - if (url) { - $.ajax({ - url: url, - dataType: 'json', - data: {}, - success: fullData - }); - } else { - createFilerLocations(data); - } - return data; } - fullData({ next: '/api/locations_flat', results: [] }); - - function tuneCheckBoxes($boxes) { - var currentState = $boxes.find("input").prop("checked") ? 'checked' : 'not-checked'; - console.log("currentState = ", currentState); - - $boxes.find("div").hide(); - $boxes.find("div." + currentState).show(); - } - - var $boxes = $('.custom-check'); - tuneCheckBoxes($boxes); - $boxes.on("click", function (e) { - var inside_checkBox = $(e.target).parent().find("input"); - inside_checkBox.prop("checked", !inside_checkBox.prop("checked")); - tuneCheckBoxes($boxes); - e.preventDefault(); - return false; - }); - - // $(window).on('load', - // function hidePreloader() { - // var $preloader = $('#page-preloader'), - // $spinner = $preloader.find('.spinner'); - // $spinner.fadeOut(); - // $preloader.delay(350).fadeOut('slow'); + createFilterSpecs('/api/specializations_flat'); + createFilterBuildingClass('/api/building_classifications'); + createFilterConstructionType('/api/construction_type'); + createFilerLocations('/api/locations_flat'); + + // let data = []; + + // function fullData(_data) { + // data = data.concat(_data.results.length ? _data.results : []); + // let url = _data.next; + // if (url) { + // $.ajax({ + // url: url, + // dataType: 'json', + // data: {}, + // success: fullData + // }); + // } else { + // createFilerLocations(data); + // } + // return data; // } - - - // $("#myBtn").click(function () { - // $('
    ' + - // '' + - // 'modal info...' + - // '
    ').appendTo("#alerts"); - // }); - -}); + // + // fullData({next: '/api/locations_flat', results: []}); +}); // ` },{"./NoTreeSelect":1,"./SelectedContainer":2,"./TreeSelect":3}]},{},[7]); diff --git a/assets/lib/proekton-components/src/NoTreeSelect.js b/assets/lib/proekton-components/js/src/NoTreeSelect.js similarity index 59% rename from assets/lib/proekton-components/src/NoTreeSelect.js rename to assets/lib/proekton-components/js/src/NoTreeSelect.js index 6f71488..e8887a3 100644 --- a/assets/lib/proekton-components/src/NoTreeSelect.js +++ b/assets/lib/proekton-components/js/src/NoTreeSelect.js @@ -2,9 +2,17 @@ import AbsBaseSelect from './base/AbsBaseSelect' import NoTreeData from './data/NoTreeData' export default class NoTreeSelect extends AbsBaseSelect{ - constructor({$container, data}){ - super({$container, data: new NoTreeData(data)}); + constructor($container, {url, obj, visible=true}){ + //TODO: сделать автоматическую передачу всех параметров родителю + super($container, {url, obj, visible}); + } + + _buildComponents(data) { + super._buildComponents(data); + this.dataTree = this.dataTree || new NoTreeData(data.results); this.$buttonAddOptions.hide(); + this._fillOptionsData(); + this._bindEvents(); } _onclickOptionsElement(e) { diff --git a/assets/lib/proekton-components/src/SelectedContainer.js b/assets/lib/proekton-components/js/src/SelectedContainer.js similarity index 83% rename from assets/lib/proekton-components/src/SelectedContainer.js rename to assets/lib/proekton-components/js/src/SelectedContainer.js index 109aad7..6cec176 100644 --- a/assets/lib/proekton-components/src/SelectedContainer.js +++ b/assets/lib/proekton-components/js/src/SelectedContainer.js @@ -16,20 +16,30 @@ let tmpl_selectedElement = (header, name, id) => `; export default class SelectedContainer { - constructor($container, data, noTree = false) { + constructor($container, {obj, noTree = false}) { // TODO: rename variables to camelCase this.$self = $container; this.elements_id = []; // [spec_id, spec_id, ...] - this.dataTree = noTree ? new NoTreeData(data) : new DataTree(data); - this.$input = this.$self.find('input[type="hidden"]'); - this.restoreElements(); + const self = this; + + obj.dataPromise + .then( + (data) => { + this.dataTree = noTree ? new NoTreeData(data.results) : new DataTree(data.results); + this.$input = this.$self.find('input[type="hidden"]'); + this.restoreElements(); + } + ) + .catch( + self._onLoadDataError.bind(self) + ); + } restoreElements() { const self = this; if (this.$input && this.$input.val()) { let data = this.$input.val().split(',').filter((el) => el); - console.log("restore data = ", data); this.elements_id = []; data.forEach((el) => self.add(el)); } @@ -62,6 +72,11 @@ export default class SelectedContainer { this.$self.find(`span[data-id='${spec_id}']`).parents('.selected-element').remove(); } + _onLoadDataError(error) { + console.log("Error loading data -->", error); + } + + remove(e) { let spec_id = $(e.target).data("id"); this._removeById(spec_id); @@ -77,10 +92,8 @@ export default class SelectedContainer { return self.dataTree.isChild(el, id) }); - // console.log(has_already); if (has_already.length || (this.elements_id).indexOf(Number(id)) != -1) { //TODO: do popup messages - console.log("Not actually"); return; } @@ -93,7 +106,6 @@ export default class SelectedContainer { }); const header = SelectedContainer.getHeader(this.dataTree.getSpecChain(id), "", max_len); - // console.log("header = ", header); const name = this.dataTree.getElementById(id).name; this.elements_id.push(id); if (this.$input) this.$input.val(this.elements_id.join(',')); diff --git a/assets/lib/proekton-components/src/TreeSelect.js b/assets/lib/proekton-components/js/src/TreeSelect.js similarity index 67% rename from assets/lib/proekton-components/src/TreeSelect.js rename to assets/lib/proekton-components/js/src/TreeSelect.js index bfae415..0dd6774 100644 --- a/assets/lib/proekton-components/src/TreeSelect.js +++ b/assets/lib/proekton-components/js/src/TreeSelect.js @@ -2,8 +2,9 @@ import AbsBaseSelect from './base/AbsBaseSelect' import DataTree from './data/DataTree' export default class TreeSelect extends AbsBaseSelect{ - constructor({$container, data, hasEditableContainer = false}){ - super({$container, data: new DataTree(data), hasEditableContainer}); + constructor($container, {url, obj, hasEditableContainer = false, visible = hasEditableContainer}){ + //TODO: сделать автоматическую передачу всех параметров родителю + super($container, {url, obj, hasEditableContainer, visible}); } setNearbySelectBox(next, prev) { @@ -12,7 +13,6 @@ export default class TreeSelect extends AbsBaseSelect{ } clearAllNext() { - // console.log("clearAllNext"); this.clear(); if (this.nextSelectBox) { this.nextSelectBox.hide(); @@ -25,15 +25,24 @@ export default class TreeSelect extends AbsBaseSelect{ if (this.prevSelectBox) { this.clear(); this.hide(); - // this.prevSelectBox.clear(); this.prevSelectBox.clearAllPrev() } } + _buildComponents(data) { + super._buildComponents(data); + //TODO: Изменять свойство visible при show/hide + if (!this.visible) this.hide(); + if (this.hasEditableContainer) this.$editableContainer.hide(); + this.dataTree = this.dataTree || new DataTree(data.results); + this._fillOptionsData(); + this._bindEvents(); + } + _onclickOptionsElement(e) { this.clearAllNext(); super._onclickOptionsElement(e); - + if (this.prevSelectBox && this.dataTree.hasChildren(this.selectedEl.id)) this.$searchInput.removeClass('active'); if (this.nextSelectBox && this.dataTree.hasChildren(this.selectedEl.id)) { this.nextSelectBox.setParent(this.selectedEl.id); this.nextSelectBox.setHeader(this.selectedEl.value); diff --git a/assets/lib/proekton-components/js/src/TreeSelectPreload.js b/assets/lib/proekton-components/js/src/TreeSelectPreload.js new file mode 100644 index 0000000..13dd294 --- /dev/null +++ b/assets/lib/proekton-components/js/src/TreeSelectPreload.js @@ -0,0 +1,82 @@ +// ` +import DataTree from './data/DataTree' +const tmpl_selectBoxEditCont = () =>` +
    +
    +
    + +
    +
    +
    +
    +`; +const tmpl_plug = ({header, selectBox}) => + ` +
    +
    +
    ${header}
    + +
    + +
    +`; + +export default class TreeSelectPreload { + constructor($container, {url}) { + let template = this.getTemplate(); + $container.html(template); + this.$preloader = $container.find('#component-preloader'); + this.$spinner = this.$preloader.find('.spinner'); + this.getData(url) + } + + hidePreloader() { + // console.log("hide preloader ", this.$preloader); + this.$spinner.fadeOut(); + this.$preloader.delay(350).fadeOut('slow'); + } + + getData(url, data = {}) { + const self = this; + $.ajax({ + url: url, + dataType: 'json', + data: data, + success: self._buildComponents.bind(self), + error: self._onLoadDataError.bind(self), + }); + } + + getTemplate() { + let selectBox = tmpl_selectBoxEditCont(); + return tmpl_plug({header: "TestHeader", selectBox}) + } + + _buildComponents(data) { + console.log("loading data =", data); + // console.log("this =", this); + this.hidePreloader(); + // this.$selectBox = $(`#${this.containerId}`); + // this.$header = this.$selectBox.find('.select-box-header .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.$editableContainer = this.$selectBox.find('.editable-container'); + // this._fillOptionsData(); + // this.$resultsBox.hide(); + // this.$optionsBox.hide(); + // this.$buttonAddOptions.hide(); + } + + _fillOptionsData() { + + } + + _onLoadDataError(error) { + console.log("Error loading data -->", error); + } + + +} \ No newline at end of file diff --git a/assets/lib/proekton-components/src/base/AbsBaseSelect.js b/assets/lib/proekton-components/js/src/base/AbsBaseSelect.js similarity index 73% rename from assets/lib/proekton-components/src/base/AbsBaseSelect.js rename to assets/lib/proekton-components/js/src/base/AbsBaseSelect.js index c49a497..dda4f8e 100644 --- a/assets/lib/proekton-components/src/base/AbsBaseSelect.js +++ b/assets/lib/proekton-components/js/src/base/AbsBaseSelect.js @@ -1,38 +1,41 @@ -//TEMPLATES -const tmpl_selectBoxEditCont = () =>` +//TEMPLATES ` +const tmpl_selectBoxEditCont = ({preloaderTemplate = ""}={}) => + `
    - - -
    + +
    + ${preloaderTemplate} + + +
    +
    - +
    `; -const tmpl_selectBox = () =>` + +const tmpl_selectBox = ({preloaderTemplate = ""}={}) => + ` + ${preloaderTemplate} - - + `; + const tmpl_elementResult = (el, id, header) => `
  • `; + const tmpl_elementOption = (el) => `
  • ${el.name}
  • `; -//${vertical_child} -const htmlTemplate = ({header, selectBox, id, classes}) => + +const tmpl_plug = ({header, selectBox}) => htmlTemplate({header, selectBox}); + +const tmpl_selectBoxOptions = () => ` -
    -
    -
    ${header}
    - -
    -
      @@ -40,6 +43,10 @@ const htmlTemplate = ({header, selectBox, id, classes}) =>
    +`; + +const tmpl_selectBoxResults = () => + `
    @@ -54,42 +61,104 @@ const htmlTemplate = ({header, selectBox, id, classes}) =>
    +`; + +const htmlTemplate = ({header, selectBox, id = "", classes = "", tmpl_selectBoxOptions = () => "", tmpl_selectBoxResults = () => ""}) => + ` +
    +
    +
    ${header}
    + +
    + + + ${tmpl_selectBoxOptions()} + ${tmpl_selectBoxResults()}
    `; let tmpl_light = (el) => `${el}`; +let tmpl_preloader = () => `
    `; + export default class AbsBaseSelect { - // constructor($container, data, hasEditableContainer, verticalChild) { - constructor({$container, data, hasEditableContainer = false}) { + constructor($container, {url, obj, hasEditableContainer = false, visible = false}) { 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"); + } + + const self = this; //TODO: проверка наличия id контейнера this.containerId = $container.attr("id"); - this.dataTree = data; - // console.log("data = ", data); - // Вариант не выбран + this.$container = $container; this.hasEditableContainer = hasEditableContainer; - let classes = $container.attr('class'); - if (classes) classes = classes.split(/\s+/); - let template = this.getTemplate(classes); - $container.replaceWith(template); - this._buildComponents(); - this._bindEvents(); + this.visible = visible; + // Быстрая заглушка, до отображения данных + if (visible) { + let preloaderTemplate = tmpl_preloader(); + let selectBox = this.hasEditableContainer + ? tmpl_selectBoxEditCont({preloaderTemplate}) + : tmpl_selectBox({preloaderTemplate}); + let plugTemplate = tmpl_plug({header: "Loading...", selectBox}); + $container.html(plugTemplate); + + this.$preloader = $container.find('#component-preloader'); + this.$spinner = this.$preloader.find('.spinner'); + } + if (url) this.dataPromise = this.getData(url); + let _dataPromise; + 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; - this.hide(); } // getTemplate(header, id, editable_container, vertical_child) { getTemplate(classes) { let selectBox = this.hasEditableContainer ? tmpl_selectBoxEditCont() : tmpl_selectBox(); - classes = classes ? classes.join(" "): ""; - return htmlTemplate({header: "TestHeader", selectBox, id: this.containerId, classes}) + classes = classes ? classes.join(" ") : ""; + return htmlTemplate({ + header: "TestHeader", selectBox, id: this.containerId, classes, + tmpl_selectBoxOptions, tmpl_selectBoxResults + }) } + getData(url, data = {}) { + const self = this; + return Promise.resolve($.ajax({ + url: url, + dataType: 'json', + data: data, + // success: self._buildComponents.bind(self), + // error: self._onLoadDataError.bind(self), + })) + } + + hidePreloader() { + // console.log("hide preloader ", this.$preloader); + this.$spinner.fadeOut(); + return Promise.resolve(this.$preloader.delay(500).fadeOut(2000)); + } + + static getHeader(catChain, {separator = " / ", maxLen = 60}) { function toShortString(string, maxLen) { return string.slice(0, maxLen) + (string.length > maxLen ? "..." : ""); @@ -145,14 +214,16 @@ export default class AbsBaseSelect { } setHeader(header) { - this.$header.html(header); + + if (this.$header){this.$header.html(header)} else {this.header = header} // default hide - this.show(); + // this.show(); } setParent(parentId) { this.parentId = parentId; this._fillOptionsData(); + this.$searchInput.addClass('active'); } connectSelectedContainer(selectedContainer) { @@ -182,21 +253,31 @@ export default class AbsBaseSelect { } - _buildComponents() { + _buildComponents(data) { + // AFTER PRELOAD + // this.hidePreloader().then(() => console.log("END -)")); + let classes = this.$container.attr('class'); + if (classes) classes = classes.split(/\s+/); + let 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'); - if (this.hasEditableContainer) this.$editableContainer.hide(); - this._fillOptionsData(); this.$resultsBox.hide(); this.$optionsBox.hide(); this.$buttonAddOptions.hide(); // TODO: сделать проверку на наличие всех нужных элементов и их корректый jq select + + // REDEFINE IN CHILD + // this.dataTree = data; + // this._bindEvents(); } _fillOptionsData() { @@ -227,14 +308,13 @@ export default class AbsBaseSelect { $container.html(""); $('.other-part').show(); let searchRes = search({searchText, parentCategoryId, excludeCategoryId}); + // || (!excludeCategoryId && parentCategoryId === null) if (!searchRes.length) { if ($container.closest('div').hasClass('main-part')) { $container.append('
  • Ничего не найдено
  • '); self.$resultsBox.find('.button-add.results').hide(); - // console.log('not found main-part'); } else { $('.other-part').hide(); - // console.log('not found other-part'); } return; } @@ -256,7 +336,6 @@ export default class AbsBaseSelect { $('.other-part').hide(); } else { $container = this.$resultsBox.find('.other-part ul'); - // console.log("Fill other-part"); fillContainer($container, tmpl_elementResult, {searchText: searchText, excludeCategoryId: self.parentId}); } this.$resultsBox.find('div.header').hide(); @@ -289,6 +368,7 @@ export default class AbsBaseSelect { _onButtonAddOptions(e) { this._addToSelectedContainer(this.selectedEl.id); this.clear(); + this.$searchInput.removeClass('active'); e.preventDefault(); return false; } @@ -304,6 +384,10 @@ export default class AbsBaseSelect { return false; } + _onLoadDataError(error) { + console.log("Error loading data -->", error); + } + _addToSelectedContainer(id) { this.selectedContainer.add(id) } diff --git a/assets/lib/proekton-components/src/data/DataTree.js b/assets/lib/proekton-components/js/src/data/DataTree.js similarity index 94% rename from assets/lib/proekton-components/src/data/DataTree.js rename to assets/lib/proekton-components/js/src/data/DataTree.js index c95bd6b..85ab10f 100644 --- a/assets/lib/proekton-components/src/data/DataTree.js +++ b/assets/lib/proekton-components/js/src/data/DataTree.js @@ -14,8 +14,6 @@ class Node { data.node = this; this.children = data.children.map(function (el_obj) { let el = tree._getElementById(el_obj.id); - if(!el) console.log("el not found with id", el_obj.id); - // console.log("el = ", el, "el.id = ", el_obj.id); if (el.node) return el.node; el.node = new Node(el, tree); return el.node @@ -36,7 +34,6 @@ export default class DataTree { */ _getElementById(id) { for (let i = 0; i < this.baseData.length; i++) { - // console.log(this.baseData[i].id, " / ", id); if (this.baseData[i].id == id) return this.baseData[i] } } @@ -71,7 +68,6 @@ export default class DataTree { } hasChildren(elId){ - console.log('id = ', elId); return (this.getElementById(elId).children.length) ? true : false } diff --git a/assets/lib/proekton-components/src/data/NoTreeData.js b/assets/lib/proekton-components/js/src/data/NoTreeData.js similarity index 100% rename from assets/lib/proekton-components/src/data/NoTreeData.js rename to assets/lib/proekton-components/js/src/data/NoTreeData.js diff --git a/assets/lib/proekton-components/js/src/init.js b/assets/lib/proekton-components/js/src/init.js new file mode 100644 index 0000000..5781caa --- /dev/null +++ b/assets/lib/proekton-components/js/src/init.js @@ -0,0 +1,89 @@ +// ` +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}); + // let sb_2 = new TreeSelect({$container: $('#select-box-3'), data: data}); + // let sb_3 = new TreeSelect({$container: $('#select-box-4'), data: data}); + // let sb_4 = new TreeSelect({$container: $('#select-box-5'), data: data}); + + 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}); + 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'); + + // let data = []; + + // function fullData(_data) { + // data = data.concat(_data.results.length ? _data.results : []); + // let url = _data.next; + // if (url) { + // $.ajax({ + // url: url, + // dataType: 'json', + // data: {}, + // success: fullData + // }); + // } else { + // createFilerLocations(data); + // } + // return data; + // } + // + // fullData({next: '/api/locations_flat', results: []}); + +}); \ No newline at end of file diff --git a/assets/lib/proekton-components/js/src/init_example.js b/assets/lib/proekton-components/js/src/init_example.js new file mode 100644 index 0000000..bd3a6fb --- /dev/null +++ b/assets/lib/proekton-components/js/src/init_example.js @@ -0,0 +1,59 @@ +import SelectedContainer from './SelectedContainer'; +import NoTreeSelect from './NoTreeSelect'; +import TreeSelect from './TreeSelect'; +import TreeSelectPreload from './TreeSelectPreload'; + +$(function () { + const url_root = "http://127.0.0.1:8000"; + + let sb_main = new TreeSelect($('#select-box-1'), + {url: url_root + '/api/specializations_flat/', 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}); + // let sb_2 = new TreeSelect({$container: $('#select-box-3'), data: data}); + // let sb_3 = new TreeSelect({$container: $('#select-box-4'), data: data}); + // let sb_4 = new TreeSelect({$container: $('#select-box-5'), data: data}); + + 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); + + let building_classification = new NoTreeSelect($('#construction-type'), + {url: url_root + '/api/construction_type/'}); + building_classification.setHeader('Классификация'); + let select_ct = new SelectedContainer($('#select-construction-type'), {obj: building_classification, noTree: true}); + building_classification.connectSelectedContainer(select_ct); + + function tuneCheckBoxes($boxes) { + let currentState = $boxes.find("input").prop("checked") ? 'checked' : 'not-checked'; + + $boxes.find("div").hide(); + $boxes.find("div." + currentState).show(); + } + + //PRELOAD-BOX + let pr_1 = new TreeSelect($('#preload-1'), {url: url_root + '/api/locations_flat', visible: true}); + let pr_2 = new TreeSelect($('#preload-2'), {url: url_root + '/api/locations_flat'}); + let pr_3 = new TreeSelect($('#preload-3'), {url: url_root + '/api/locations_flat'}); + + // CUSTOM CHECK-BOX + let $boxes = $('.custom-check'); + tuneCheckBoxes($boxes); + $boxes.on("click", function (e) { + let inside_checkBox = $(e.target).parent().find("input"); + inside_checkBox.prop("checked", !inside_checkBox.prop("checked")); + tuneCheckBoxes($boxes); + e.preventDefault(); + return false; + }); + +}); \ No newline at end of file diff --git a/assets/lib/proekton-components/src/init.js b/assets/lib/proekton-components/src/init.js deleted file mode 100644 index d1b5fbc..0000000 --- a/assets/lib/proekton-components/src/init.js +++ /dev/null @@ -1,144 +0,0 @@ -import SelectedContainer from './SelectedContainer'; -import NoTreeSelect from './NoTreeSelect'; -import TreeSelect from './TreeSelect'; - -// ` - -$(function () { - function createFilterSpecs(_data) { - // SPECIALIZATIONS FILTER - let data = _data.results; - let sb_main = new TreeSelect({$container: $('#select-box-1'), data: data, hasEditableContainer: true}); - sb_main.setHeader("Специализации"); - let select_container = new SelectedContainer($('#selected-spec'), data); - sb_main.connectSelectedContainer(select_container); - let sb_1 = new TreeSelect({$container: $('#select-box-2'), data: data}); - let sb_2 = new TreeSelect({$container: $('#select-box-3'), data: data}); - let sb_3 = new TreeSelect({$container: $('#select-box-4'), data: data}); - let sb_4 = new TreeSelect({$container: $('#select-box-5'), data: data}); - - 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(_data) { - // BUILDING-CLASSIFICATION FILTER - let data = _data.results; - let sb_build_main = new TreeSelect({$container: $('#sb-building-classification'), data: data}); - sb_build_main.setHeader("Классификация здания"); - - let sb_build_1 = new TreeSelect({$container: $('#sb-building-sub-classification'), data: data}); - - let select_build_container = new SelectedContainer($('#selected-building-classification'), data); - sb_build_main.connectSelectedContainer(select_build_container); - - sb_build_main.setNearbySelectBox(sb_build_1); - sb_build_1.setNearbySelectBox("", sb_build_main); - } - - function createFilterConstructionType(_data) { - let data = _data.results; - let sb_constr_main = new NoTreeSelect({$container: $('#sb-construction-type'), data: data}); - sb_constr_main.setHeader("Вид строительства"); - let select_constr_type = new SelectedContainer($('#selected-construction-type'), data, true); - sb_constr_main.connectSelectedContainer(select_constr_type); - } - - function createFilerLocations(data) { - let sb_loc_main = new TreeSelect({$container: $('#sb-location-1'), data: data}); - sb_loc_main.setHeader("Местоположение"); - let select_loc = new SelectedContainer($('#selected-location'), data); - sb_loc_main.connectSelectedContainer(select_loc); - let sb_loc_1 = new TreeSelect({$container: $('#sb-location-2'), data: data}); - let sb_loc_2 = new TreeSelect({$container: $('#sb-location-3'), data: data}); - - sb_loc_main.setNearbySelectBox(sb_loc_1); - sb_loc_1.setNearbySelectBox(sb_loc_2, sb_loc_main); - sb_loc_2.setNearbySelectBox("", sb_loc_1); - //TODO: Временно прелоадер на самом тяжелом объекте - // hidePreloader() - - } - - $.ajax({ - url: '/api/specializations_flat', - dataType: 'json', - data: {}, - success: createFilterSpecs - }); - - $.ajax({ - url: '/api/building_classifications', - dataType: 'json', - data: {}, - success: createFilterBuildingClass - }); - - $.ajax({ - url: '/api/construction_type', - dataType: 'json', - data: {}, - success: createFilterConstructionType - }); - - let data = []; - - function fullData(_data) { - data = data.concat(_data.results.length ? _data.results : []); - let url = _data.next; - if (url) { - $.ajax({ - url: url, - dataType: 'json', - data: {}, - success: fullData - }); - } else { - createFilerLocations(data); - } - return data; - } - - fullData({next: '/api/locations_flat', results: []}); - - function tuneCheckBoxes($boxes) { - let currentState = $boxes.find("input").prop("checked") ? 'checked' : 'not-checked'; - $boxes.find("div").hide(); - $boxes.find("div." + currentState).show(); - } - - let $boxes = $('.custom-check'); - tuneCheckBoxes($boxes); - $boxes.on("click", function (e) { - let inside_checkBox = $(e.target).parent().find("input"); - inside_checkBox.prop("checked", !inside_checkBox.prop("checked")); - tuneCheckBoxes($boxes); - e.preventDefault(); - return false; - }); - - // $(window).on('load', - // function hidePreloader() { - // var $preloader = $('#page-preloader'), - // $spinner = $preloader.find('.spinner'); - // $spinner.fadeOut(); - // $preloader.delay(350).fadeOut('slow'); - // } - - - // $("#myBtn").click(function () { - // $('
    ' + - // '' + - // 'modal info...' + - // '
    ').appendTo("#alerts"); - // }); - - -}); \ No newline at end of file diff --git a/assets/projects-filter.js b/assets/projects-filter.js index 294e7d7..fc12b86 100644 --- a/assets/projects-filter.js +++ b/assets/projects-filter.js @@ -1,3 +1,48 @@ +$(function () { + let $buttonF1 = $('.resButton'); + if ($('.slide').hasClass("active")) $buttonF1.css('transform', 'rotate(180deg)'); + + $buttonF1.on("click", function (e) { + e.preventDefault(); + let $slide = $('.slide'); + if ($slide.hasClass("active")) { + $buttonF1.css('transform', 'rotate(0deg)'); + $slide.slideUp(300); + } else { + $buttonF1.css('transform', 'rotate(180deg)'); + $slide.slideDown(300); + } + $slide.toggleClass("active"); + }); + + function tuneCheckBoxes($boxes) { + let currentState = $boxes.find("input").prop("checked") ? 'checked' : 'not-checked'; + $boxes.find("div").hide(); + $boxes.find("div." + currentState).show(); + } + + let $boxes = $('.custom-check'); + tuneCheckBoxes($boxes); + $boxes.on("click", function (e) { + let inside_checkBox = $(e.target).parent().find("input"); + inside_checkBox.prop("checked", !inside_checkBox.prop("checked")); + tuneCheckBoxes($boxes); + e.preventDefault(); + return false; + }); + + + // $("#myBtn").click(function () { + // $('
    ' + + // '' + + // 'modal info...' + + // '
    ').appendTo("#alerts"); + // }); +}); + function getFormData($form, pageNum) { var unindexed_array = $form.serializeArray(); var indexed_array = {}; diff --git a/projects/static/css/project_filter.css b/projects/static/css/project_filter.css new file mode 100644 index 0000000..e9b895e --- /dev/null +++ b/projects/static/css/project_filter.css @@ -0,0 +1,95 @@ +body { + font-size: 11pt; + font-family: Arial-MT-Regular, Arial, sans-serif; +} + +.wrapper { + background-color: #f2f2f2; + padding: 40px; + margin: 50px 30px; +} + +.form-container { + padding: 50px 45px; +} + +.separator { + margin-top: 35px; + margin-bottom: 5px; +} + +.vertical-child { + margin-top: 30px; +} + +.custom-check{ + cursor: pointer; + display: inline-block +} + +.custom-check .checked{ + background: url("../img/checkbox_Check.png.png") no-repeat center; + background-size: 210px 51px; + width: 210px; + height: 51px; +} + +.custom-check .not-checked { + background: url("../img/checkbox_notCheck.png") no-repeat center; + background-size: 210px 51px; + width: 210px; + height: 51px; +} + +.resButton { + width: 50px; + height: 50px; + background-color: white; + border: 1px solid #CFCFCF; + color: #FF0029; + text-align: center; + font-size: 16px; + float: left; + border-radius: 100%; + margin: -15px 20px 0 28px; + -webkit-transition: all 0.3s ease-out; + -moz-transition: all 0.3s ease-out; + transition: all 0.3s ease-out; +} + +button.resButton:focus {outline:0;} + +.flex { + display: flex; +} + +.flex .header{ + font-size: 12pt; + padding-right: 10px; +} +.header .fa { + padding-left: 3px; + color: #5e5e5e; + position: relative; + top: 0; +} + +.border { + flex: 1 1 auto; + float: left; + margin: 10px 0 0 0; + border-top: 1px solid #CFCFCF; +} + +.slide { + display: none; +} + +.slide.active { + display: block; +} + +.revert { + margin-left: -15px; + margin-right: -15px; +} \ No newline at end of file diff --git a/assets/lib/proekton-components/img/rect02.png b/projects/static/img/checkbox_Check.png.png similarity index 100% rename from assets/lib/proekton-components/img/rect02.png rename to projects/static/img/checkbox_Check.png.png diff --git a/assets/lib/proekton-components/img/rect01.png b/projects/static/img/checkbox_notCheck.png similarity index 100% rename from assets/lib/proekton-components/img/rect01.png rename to projects/static/img/checkbox_notCheck.png diff --git a/projects/templates/partials/inc-projects-filter.html b/projects/templates/partials/inc-projects-filter.html index 243cdce..79f5c3b 100644 --- a/projects/templates/partials/inc-projects-filter.html +++ b/projects/templates/partials/inc-projects-filter.html @@ -1,4 +1,4 @@ -
    +
    {#
    #} @@ -32,11 +32,14 @@
    -
    -

    Поиск по ключевым словам и фразам

    -
    -
    -
    +
    +
    + + Поиск по ключевым словам и фразам + + +
    +
    @@ -47,7 +50,7 @@ name="keywords" onkeydown="event.keyCode === 13 && $(this).closest('form').submit()" value="{{ form.keywords.value }}" - class="select-box-search searchInp box-sizing" + class="select-box-search" placeholder="Ключевые слова, фразы">
    @@ -66,18 +69,18 @@
    -
    -

    Расширенные поля

    - -
    -
    -
    +
    +
    + Расширенные поля + +
    +
    -
    +
    @@ -109,13 +112,10 @@
    -{#
    #} -{# #} -{#
    #}
    -
    +
    diff --git a/projects/templates/project_filter.html b/projects/templates/project_filter.html index 5e38f9d..4605575 100644 --- a/projects/templates/project_filter.html +++ b/projects/templates/project_filter.html @@ -2,11 +2,10 @@ {% load staticfiles %} {% block head_css %} - - + {# other #} {% endblock %} {% block content %} @@ -32,9 +31,7 @@ {% endblock %} {% block js_block %} {{ block.super }} - + - {% endblock %} \ No newline at end of file diff --git a/projects/views.py b/projects/views.py index 4ab7b5c..c721b8f 100644 --- a/projects/views.py +++ b/projects/views.py @@ -379,12 +379,16 @@ class ProjectFilterView(BaseMixin, View): projects = self.sort_by(projects) projects = self.pagination(projects, request.get("page")) + has_additional_fields = bool(context.get("building_classification") or context.get( + "construction_type") or context.get("location") or context.get("cro")) + context.update({ 'choices': self.PROJECT_ORDER_CHOICES, 'projects': projects, 'is_paginated': True, 'page_obj': projects, 'num_results': num_results, + 'has_additional_fields': has_additional_fields }) return context