// ` class SelectBox { constructor($container, data, has_editable_container, vertical_child) { this.container_id = $container.attr("id"); this.tree_data = new SpecTree(data); // Вариант не выбран this.selected_id = undefined; let template = SelectBox.getTemplate("Header", this.container_id, has_editable_container, vertical_child); $container.replaceWith(template); this._buildComponents(); this._bindEvents(); if (!has_editable_container) this.hide(); } static getTemplate(header, id, editable_container, vertical_child) { let main = `
`; let child = ` `; let insert_template = editable_container ? main : child; vertical_child = vertical_child ? 'vertical-child' : ''; let htmlTemplate = `
${header}
${insert_template}
Из других категорий
`; return htmlTemplate; } _buildComponents() { this.$select_box = $(`#${this.container_id}`); this.$header = this.$select_box.find('.select-box-header .header'); this.$results_box = this.$select_box.find('.select-box-results'); this.$options_box = this.$select_box.find('.select-box-options'); this.$search_input = this.$select_box.find('input.select-box-search'); this.$button_add = this.$results_box.find('.button-add'); this.$button_add_options = this.$select_box.find('.button-add.options'); this.$editable_container = this.$select_box.find('.editable-container'); this._fillOptionsData(); this.$results_box.hide(); this.$options_box.hide(); this.$button_add_options.hide(); // TODO: сделать проверку на наличие всех нужных элементов и их корректый jq select } static highlight(string, sub_string) { let index = string.toLowerCase().indexOf(sub_string.toLowerCase()); if (index === -1) return string; let light_template = (el) => `${el}`; let [to, select, after] = [string.slice(0, index), string.slice(index, index + sub_string.length), string.slice(index + sub_string.length)]; return `${to}${light_template(select)}${after}` } hide() { this.$select_box.hide(); } show() { this.$select_box.show(); } clear() { this.$search_input.val(""); this.$options_box.hide(); this.$results_box.hide(); this.$button_add_options.hide(); this.element_id = undefined; this.parent_id = undefined; this.$editable_container.html(""); if (this.prev_select_box) this.hide(); this.selected_id = undefined; this.selected_val = ""; } clearAll(only_next) { // console.log("only_next = ", only_next); if (this.next_select_box) { this.next_select_box.clear() } if (!only_next) { this.clear(); if (this.prev_select_box) this.prev_select_box.clearAll(only_next) } else { if (this.next_select_box) this.next_select_box.clearAll(only_next) } } setHeader(header) { this.$header.html(header); this.show(); } setParent(parent_id) { // console.log("setParent id -->", parent_id); this.parent_id = parent_id; this._fillOptionsData(); } setNearbySelectBox(next, prev) { this.next_select_box = next; this.prev_select_box = prev; } getSelectedElements() { let all_checked = this.$results_box.find(":checked"); return all_checked.map(function () { return $(this).data("id"); }) } connectSelectedContainer(selected_container) { this.selected_container = selected_container; this.selected_container = selected_container; } updateEditableContainer(el_id) { // Если нет контейнера для отображения ... if (this.$editable_container.length) { let chain_header = SelectedContainer.getHeader( this.tree_data.getSpecChain(el_id, true), " / "); let el_template = `${chain_header}`; this.$editable_container.html(el_template); return; } //..., передаем отображение предыдущему selectBox if (this.prev_select_box) this.prev_select_box.updateEditableContainer(el_id); } _onclickOptionsElement(e) { this.clearAll(true); let el_id = $(e.target).data("id"); this.selected_id = el_id; this.selected_val = $(e.target).html(); this.updateEditableContainer(el_id); this.$search_input.val($(e.target).html()); // this.element_id = el_id; if (this.next_select_box) { this.next_select_box.setParent(el_id); this.next_select_box.setHeader($(e.target).html()); } if (this.prev_select_box) this.prev_select_box.$button_add_options.hide(); this.$button_add_options.show(); this.$options_box.hide(); } _onButtonAdd(e) { let self = this; this.getSelectedElements().each(function () { console.log("add el -->", this); self.selected_container.add(this, 40); }); this.clearAll(); e.preventDefault(); return false; } _onButtonAddOptions(e) { this.selected_container.add(this.element_id, 40); this.clearAll(); e.preventDefault(); return false; } _fillOptionsData() { let self = this; let spec_list = this.tree_data.dataToList(this.parent_id); let $container = this.$options_box.find('ul'); $container.html(""); spec_list.forEach(function (el) { let el_html = `
  • ${el.name}
  • `; $container.append($(el_html)) }); this.$select_box.find('li').on("click", this._onclickOptionsElement.bind(self)); } _fillResultsData(search_text) { let self = this; function search(search_text, parent_id, exclude_id) { // :FORMAT spec_list [{name, id}, ...] let spec_list = self.tree_data.dataToList(parent_id, true, exclude_id); // console.log("search -->", spec_list.length); console.log("parent_id ", parent_id); return spec_list.filter(function (el) { return el.name.toLowerCase().indexOf(search_text.toLowerCase()) !== -1; }); } function fillContainer($container, template, search_text, parent_id, exclude_id) { $container.html(""); let search_res = search(search_text, parent_id, exclude_id); if (!search_res.length || (!exclude_id && parent_id === null)) { $container.append('No Found'); return; } search_res.forEach(function (el) { $container.append(template(SelectBox.highlight(el.name, search_text), el.id)); }); } // FILL RESULTS let result_template = (el, id) => `
  • `; // MAIN PART let $container = this.$results_box.find('.main-part ul'); fillContainer($container, result_template, search_text, self.parent_id); // OTHER PART $container = this.$results_box.find('.other-part ul'); fillContainer($container, result_template, search_text, null, self.parent_id); } _looseFocus() { this.$results_box.hide(); this.$options_box.hide(); if (!this.selected_id) { this.$search_input.val(""); } else { this.$search_input.val(this.selected_val); } } _bindEvents() { let self = this; $(document).click(function (event) { if ($(event.target).closest(`#${self.container_id}`).length) { return; } self._looseFocus(); }); // console.log("out ", this.$options_box); this.$search_input.on("input", function (e) { self._fillResultsData(self.$search_input.val()); self.$results_box.show(); self.$options_box.hide(); }); this.$search_input.on("click", function (e) { // console.log("in ", self.$options_box); self.$options_box.show(); self.$results_box.hide(); self.$button_add_options.hide(); self.$search_input.val(""); }); this.$button_add.on("click", function (e) { self._onButtonAdd(e); }); this.$button_add_options.on("click", this._onButtonAddOptions.bind(self)) } }