PR-39 доработка фильтра поиска

Компоненты загружают данные асинхронно
Добавлен прелоадер компонентам
Исправлены ошибки и доработан дизайн компонентов
remotes/origin/PR-39
booblegum 9 years ago
parent 8de0f08d0c
commit 9047b08bdf
  1. 5
      archilance/settings/base.py
  2. 2
      assets/lib/proekton-components/bash/watchify.sh
  3. 4
      assets/lib/proekton-components/css/editable-container.css
  4. 16
      assets/lib/proekton-components/css/fix-bags.css
  5. 73
      assets/lib/proekton-components/css/other.css
  6. 76
      assets/lib/proekton-components/css/select-box.css
  7. 27
      assets/lib/proekton-components/css/selected-container.css
  8. BIN
      assets/lib/proekton-components/img/zoom.png
  9. 0
      assets/lib/proekton-components/img/zoom.svg
  10. BIN
      assets/lib/proekton-components/img/zoom1.png
  11. 466
      assets/lib/proekton-components/js/build/init.js
  12. 12
      assets/lib/proekton-components/js/src/NoTreeSelect.js
  13. 24
      assets/lib/proekton-components/js/src/SelectedContainer.js
  14. 19
      assets/lib/proekton-components/js/src/TreeSelect.js
  15. 82
      assets/lib/proekton-components/js/src/TreeSelectPreload.js
  16. 164
      assets/lib/proekton-components/js/src/base/AbsBaseSelect.js
  17. 4
      assets/lib/proekton-components/js/src/data/DataTree.js
  18. 0
      assets/lib/proekton-components/js/src/data/NoTreeData.js
  19. 89
      assets/lib/proekton-components/js/src/init.js
  20. 59
      assets/lib/proekton-components/js/src/init_example.js
  21. 144
      assets/lib/proekton-components/src/init.js
  22. 45
      assets/projects-filter.js
  23. 95
      projects/static/css/project_filter.css
  24. 0
      projects/static/img/checkbox_Check.png.png
  25. 0
      projects/static/img/checkbox_notCheck.png
  26. 32
      projects/templates/partials/inc-projects-filter.html
  27. 7
      projects/templates/project_filter.html
  28. 4
      projects/views.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 = [
{

@ -2,4 +2,4 @@
echo "run watchify"
cd ..
source ~/venv/proekton/bin/activate
watchify ./src/init.js -t babelify -o ./build/init.js
watchify ./js/src/init.js -t babelify -o ./js/build/init.js

@ -10,7 +10,3 @@
position: relative;
left: -30px;
}
.vertical-child {
margin-top: 30px;
}

@ -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;*/
/*}*/

@ -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;
}

@ -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;
}

@ -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;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 183 KiB

@ -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 <div class=\"row\">\n <div class=\"col-lg-3\">\n <input class=\"select-box-search\" type=\"text\" placeholder=\"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435/\u041F\u043E\u0438\u0441\u043A\">\n <button class=\"button-add options\">\u0414\u041E\u0411\u0410\u0412\u0418\u0422\u042C</button>\n </div>\n <div class=\"col-lg-9\">\n <span class=\"editable-container\"></span>\n </div>\n </div>\n";
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref$preloaderTemplat = _ref.preloaderTemplate,
preloaderTemplate = _ref$preloaderTemplat === undefined ? "" : _ref$preloaderTemplat;
return "\n <div class=\"row\">\n <div class=\"col-lg-3\">\n \n <div style=\"width: 100%; position: relative\">\n " + preloaderTemplate + "\n <input class=\"select-box-search\" type=\"text\" placeholder=\"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435/\u041F\u043E\u0438\u0441\u043A\">\n <button style=\"display: none\" class=\"button-add options\">\u0414\u041E\u0411\u0410\u0412\u0418\u0422\u042C</button>\n </div>\n </div>\n <div class=\"col-lg-9\">\n <span style=\"display: none\" class=\"editable-container\"></span>\n </div>\n </div>\n";
};
var tmpl_selectBox = function tmpl_selectBox() {
return "\n <input class=\"select-box-search\" type=\"text\" placeholder=\"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435/\u041F\u043E\u0438\u0441\u043A\">\n <!--<span style=\"clear:both; display:block\"></span>-->\n <button class=\"button-add options\">\u0414\u041E\u0411\u0410\u0412\u0418\u0422\u042C</button>\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 <input class=\"select-box-search\" type=\"text\" placeholder=\"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435/\u041F\u043E\u0438\u0441\u043A\">\n <button style=\"display: none\" class=\"button-add options\">\u0414\u041E\u0411\u0410\u0412\u0418\u0422\u042C</button>\n";
};
var tmpl_elementResult = function tmpl_elementResult(el, id, header) {
return "<li><label>\n <div class=\"header\">" + header + "</div>\n <input type=\"checkbox\" data-id=\"" + id + "\">" + el + "\n </label></li>";
return "<li><label>\n <input type=\"checkbox\" data-id=\"" + id + "\">" + el + "\n <div class=\"header\">" + header + "</div>\n </label></li>";
};
var tmpl_elementOption = function tmpl_elementOption(el) {
return "<li data-id=\"" + el.id + "\">" + el.name + "</li>";
};
//${vertical_child}
var htmlTemplate = function htmlTemplate(_ref) {
var header = _ref.header,
selectBox = _ref.selectBox,
id = _ref.id,
classes = _ref.classes;
return "\n<div class=\"select-box-container " + classes + "\" id=\"" + id + "\">\n <div class=\"select-box-header\">\n <div class=\"header\">" + header + "</div>\n <i class=\"fa fa-question-circle-o\" aria-hidden=\"true\" title=\"bla-bla-bla...\"></i>\n </div>\n <div class=\"select-box-search\">\n " + selectBox + "\n </div>\n <div class=\"select-box-options\">\n <div class=\"box-wrapper\">\n <ul>\n \n </ul>\n </div>\n </div>\n <div class=\"select-box-results\">\n <div class=\"box-wrapper\">\n <div class=\"main-part\">\n <ul>\n </ul>\n </div>\n <div class=\"other-part\">\n <span class=\"other-header\">\u0418\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u0439</span>\n <ul>\n </ul>\n </div>\n </div>\n <button class=\"button-add results\">\u0414\u041E\u0411\u0410\u0412\u0418\u0422\u042C</button>\n </div>\n <span style=\"clear: both\"></span>\n</div>\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 <div class=\"select-box-options\">\n <div class=\"box-wrapper\">\n <ul>\n \n </ul>\n </div>\n </div>\n";
};
var tmpl_selectBoxResults = function tmpl_selectBoxResults() {
return "\n <div class=\"select-box-results\">\n <div class=\"box-wrapper\">\n <div class=\"main-part\">\n <ul>\n </ul>\n </div>\n <div class=\"other-part\">\n <span class=\"other-header\">\u0418\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u0439</span>\n <ul>\n </ul>\n </div>\n </div>\n <button class=\"button-add results\">\u0414\u041E\u0411\u0410\u0412\u0418\u0422\u042C</button>\n </div>\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<div class=\"select-box-container " + classes + "\" id=\"" + id + "\">\n <div class=\"select-box-header\">\n <div class=\"header\">" + header + "</div>\n <i class=\"fa fa-question-circle-o\" aria-hidden=\"true\" title=\"bla-bla-bla...\"></i>\n </div>\n <div class=\"select-box-search\">\n " + selectBox + "\n </div>\n \n " + tmpl_selectBoxOptions() + "\n " + tmpl_selectBoxResults() + "\n <span style=\"clear: both\"></span>\n</div>\n";
};
var tmpl_light = function tmpl_light(el) {
return "<span class=\"highlight\">" + el + "</span>";
};
var tmpl_preloader = function tmpl_preloader() {
return "<div id=\"component-preloader\"><span class=\"spinner\"></span></div>";
};
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) {
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 = "<span class=\"\">" + chainHeader + "</span>";
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('<li>Ничего не найдено</li>');
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 = [];
// $("#myBtn").click(function () {
// $('<div class="alert alert-success alert-dismissable">' +
// '<button type="button" class="close" ' +
// 'data-dismiss="alert" aria-hidden="true">' +
// '&times;' +
// '</button>' +
// 'modal info...' +
// '</div>').appendTo("#alerts");
// 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: []});
}); // `
},{"./NoTreeSelect":1,"./SelectedContainer":2,"./TreeSelect":3}]},{},[7]);

@ -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) {

@ -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);
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(','));

@ -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);

@ -0,0 +1,82 @@
// `
import DataTree from './data/DataTree'
const tmpl_selectBoxEditCont = () =>`
<div class="row">
<div class="col-lg-3">
<div id="component-preloader"><span class="spinner"></span></div>
<input disabled class="select-box-search" type="text" placeholder="Выберите/Поиск">
</div>
<div class="col-lg-9">
</div>
</div>
`;
const tmpl_plug = ({header, selectBox}) =>
`
<div class="select-box-container">
<div class="select-box-header">
<div class="header">${header}</div>
<i class="fa fa-question-circle-o" aria-hidden="true" title="bla-bla-bla..."></i>
</div>
<div class="select-box-search">
${selectBox}
</div>
</div>
`;
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);
}
}

@ -1,38 +1,41 @@
//TEMPLATES
const tmpl_selectBoxEditCont = () =>`
//TEMPLATES `
const tmpl_selectBoxEditCont = ({preloaderTemplate = ""}={}) =>
`
<div class="row">
<div class="col-lg-3">
<div style="width: 100%; position: relative">
${preloaderTemplate}
<input class="select-box-search" type="text" placeholder="Выберите/Поиск">
<button class="button-add options">ДОБАВИТЬ</button>
<button style="display: none" class="button-add options">ДОБАВИТЬ</button>
</div>
</div>
<div class="col-lg-9">
<span class="editable-container"></span>
<span style="display: none" class="editable-container"></span>
</div>
</div>
`;
const tmpl_selectBox = () =>`
const tmpl_selectBox = ({preloaderTemplate = ""}={}) =>
`
${preloaderTemplate}
<input class="select-box-search" type="text" placeholder="Выберите/Поиск">
<!--<span style="clear:both; display:block"></span>-->
<button class="button-add options">ДОБАВИТЬ</button>
<button style="display: none" class="button-add options">ДОБАВИТЬ</button>
`;
const tmpl_elementResult = (el, id, header) =>
`<li><label>
<div class="header">${header}</div>
<input type="checkbox" data-id="${id}">${el}
<div class="header">${header}</div>
</label></li>`;
const tmpl_elementOption = (el) =>
`<li data-id="${el.id}">${el.name}</li>`;
//${vertical_child}
const htmlTemplate = ({header, selectBox, id, classes}) =>
const tmpl_plug = ({header, selectBox}) => htmlTemplate({header, selectBox});
const tmpl_selectBoxOptions = () =>
`
<div class="select-box-container ${classes}" id="${id}">
<div class="select-box-header">
<div class="header">${header}</div>
<i class="fa fa-question-circle-o" aria-hidden="true" title="bla-bla-bla..."></i>
</div>
<div class="select-box-search">
${selectBox}
</div>
<div class="select-box-options">
<div class="box-wrapper">
<ul>
@ -40,6 +43,10 @@ const htmlTemplate = ({header, selectBox, id, classes}) =>
</ul>
</div>
</div>
`;
const tmpl_selectBoxResults = () =>
`
<div class="select-box-results">
<div class="box-wrapper">
<div class="main-part">
@ -54,42 +61,104 @@ const htmlTemplate = ({header, selectBox, id, classes}) =>
</div>
<button class="button-add results">ДОБАВИТЬ</button>
</div>
`;
const htmlTemplate = ({header, selectBox, id = "", classes = "", tmpl_selectBoxOptions = () => "", tmpl_selectBoxResults = () => ""}) =>
`
<div class="select-box-container ${classes}" id="${id}">
<div class="select-box-header">
<div class="header">${header}</div>
<i class="fa fa-question-circle-o" aria-hidden="true" title="bla-bla-bla..."></i>
</div>
<div class="select-box-search">
${selectBox}
</div>
${tmpl_selectBoxOptions()}
${tmpl_selectBoxResults()}
<span style="clear: both"></span>
</div>
`;
let tmpl_light = (el) => `<span class="highlight">${el}</span>`;
let tmpl_preloader = () => `<div id="component-preloader"><span class="spinner"></span></div>`;
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('<li>Ничего не найдено</li>');
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)
}

@ -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
}

@ -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: []});
});

@ -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;
});
});

@ -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 () {
// $('<div class="alert alert-success alert-dismissable">' +
// '<button type="button" class="close" ' +
// 'data-dismiss="alert" aria-hidden="true">' +
// '&times;' +
// '</button>' +
// 'modal info...' +
// '</div>').appendTo("#alerts");
// });
});

@ -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 () {
// $('<div class="alert alert-success alert-dismissable">' +
// '<button type="button" class="close" ' +
// 'data-dismiss="alert" aria-hidden="true">' +
// '&times;' +
// '</button>' +
// 'modal info...' +
// '</div>').appendTo("#alerts");
// });
});
function getFormData($form, pageNum) {
var unindexed_array = $form.serializeArray();
var indexed_array = {};

@ -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;
}

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

@ -1,4 +1,4 @@
<form id="filter-form" action="/projects" method="GET" novalidate>
<form id="filter-form" action="/projects" method="GET" novalidate xmlns="http://www.w3.org/1999/html">
<div class="filter form-container">
{# <div id="page-preloader"><span class="spinner"></span></div>#}
@ -32,11 +32,14 @@
</div>
<div class="row separator">
<div class="col-lg-5">
<p class="titleResF1">Поиск по ключевым словам и фразам</p>
<div class="col-lg-12">
<div class="flex">
<span class="header">
<span>Поиск по ключевым словам и фразам </span>
<i class="fa fa-question-circle-o" aria-hidden="true" title="bla-bla-bla..."></i>
</span>
<div class="border"></div>
</div>
<div class="col-lg-7">
<div class="borderS1"></div>
</div>
</div>
@ -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="Ключевые слова, фразы">
</div>
<div class="col-lg-3">
@ -66,18 +69,18 @@
<div class="row separator">
<div class="col-lg-4">
<p class="titleResF1">Расширенные поля</p>
<button class="resButtonF1">
<div class="col-lg-12">
<div class="flex">
<span class="header">Расширенные поля</span>
<button class="resButton">
<span class="glyphicon glyphicon-arrow-up" aria-hidden="true"></span>
</button>
<div class="border"></div>
</div>
<div class="col-lg-8">
<div class="borderS1"></div>
</div>
</div>
<div class="slideRes disTab activeSlide">
<div class="slide {% if has_additional_fields %} active{% endif %}">
<div class="row">
<div class="col-lg-3">
<div class="vertical-child" id="sb-building-classification"></div>
@ -109,13 +112,10 @@
<i class="fa fa-question-circle-o" aria-hidden="true"
title="bla-bla-bla..."></i>
</div>
{# <div class="custom-check" data-state="disabled">#}
{# <input name="cro" type="checkbox" hidden {% if cro %} checked{% endif %}>#}
{# </div>#}
<div class="custom-check">
<div class="checked"></div>
<div class="not-checked"></div>
<div style="display: none" class="not-checked"></div>
<input name="cro" type="checkbox" hidden {% if cro %} checked{% endif %}>
</div>
</div>

@ -2,11 +2,10 @@
{% load staticfiles %}
{% block head_css %}
<link rel='stylesheet' href='{% static "lib/proekton-components/css/fonts.css" %}'>
<link rel='stylesheet' href='{% static "lib/proekton-components/css/fix-bags.css" %}'>
<link rel='stylesheet' href='{% static "lib/proekton-components/css/selected-container.css" %}'>
<link rel='stylesheet' href='{% static "lib/proekton-components/css/editable-container.css" %}'>
<link rel='stylesheet' href='{% static "lib/proekton-components/css/select-box.css" %}'>
<link rel='stylesheet' href='{% static "lib/proekton-components/css/other.css" %}'>
<link rel='stylesheet' href='{% static "css/project_filter.css" %}'>{# other #}
<link rel='stylesheet' href='{% static "css/font-awesome.min.css" %}'>
{% endblock %}
{% block content %}
@ -32,9 +31,7 @@
{% endblock %}
{% block js_block %}
{{ block.super }}
<script src='{% static "lib/proekton-components/build/init.js" %}'></script>
<script src='{% static "lib/proekton-components/js/build/init.js" %}'></script>
<script src='{% static "projects-filter.js" %}'></script>
<script>
</script>
{% endblock %}

@ -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

Loading…
Cancel
Save