From 03140c3ca31b2c4b77a1b9313d9d2683767e04f1 Mon Sep 17 00:00:00 2001 From: Shankar Date: Thu, 21 Dec 2023 19:47:13 +0530 Subject: [PATCH 1/4] fix: fixes in multiselect_list control --- .../frappe/form/controls/multiselect_list.js | 66 ++++++++++++------- 1 file changed, 41 insertions(+), 25 deletions(-) diff --git a/frappe/public/js/frappe/form/controls/multiselect_list.js b/frappe/public/js/frappe/form/controls/multiselect_list.js index 20514123ef..e6803e4c62 100644 --- a/frappe/public/js/frappe/form/controls/multiselect_list.js +++ b/frappe/public/js/frappe/form/controls/multiselect_list.js @@ -24,6 +24,10 @@ frappe.ui.form.ControlMultiSelectList = class ControlMultiSelectList extends ( this.has_input = true; this.$list_wrapper.prependTo(this.input_area); this.$filter_input = this.$list_wrapper.find("input"); + this.values = []; + this._options = []; + this._selected_values = []; + this.highlighted = -1; this.$list_wrapper.on("click", ".dropdown-menu", (e) => { e.stopPropagation(); }); @@ -80,15 +84,17 @@ frappe.ui.form.ControlMultiSelectList = class ControlMultiSelectList extends ( this.$list_wrapper.on("show.bs.dropdown", () => { this.set_options().then(() => { + if (!this._selected_values || !this._selected_values.length ){ + this._selected_values = this.process_options(this.values) + } + this._options = this._selected_values + .concat(this._options) + .uniqBy((opt) => opt.value); this.set_selectable_items(this._options); }); }); this.set_input_attributes(); - this.values = []; - this._options = []; - this._selected_values = []; - this.highlighted = -1; } set_input_attributes() { @@ -126,21 +132,31 @@ frappe.ui.form.ControlMultiSelectList = class ControlMultiSelectList extends ( set_value(value) { if (!value) return Promise.resolve(); + this._selected_values = []; if (typeof value === "string") { value = [value]; } + //Unselect old values + this.values.forEach((value) => { + this.$list_wrapper.find(`.selectable-item[data-value=${value}]`).toggleClass("selected"); + }); this.values = value; this.values.forEach((value) => { this.update_selected_values(value); + //Select new values + this.$list_wrapper.find(`.selectable-item[data-value=${value}]`).toggleClass("selected"); }); this.parse_validate_and_set_in_model(""); this.update_status(); return Promise.resolve(); } - + update_selected_values(value) { this._selected_values = this._selected_values || []; - let option = this._options.find((opt) => opt.value === value); + let option = this._options + .concat(this._selected_values) + .uniqBy((opt) => opt.value) + .find((opt) => opt.value === value); if (option) { if (this.values.includes(value)) { this._selected_values.push(option); @@ -172,24 +188,24 @@ frappe.ui.form.ControlMultiSelectList = class ControlMultiSelectList extends ( this.$list_wrapper.find(".status-text").html(text); } + process_options(options) { + return options.map((option) => { + if (typeof option === "string") { + return { + label: option, + value: option, + description:"" + }; + } + if (!option.label) { + option.label = option.value; + } + return option; + }); + } + set_options() { let promise = Promise.resolve(); - - function process_options(options) { - return options.map((option) => { - if (typeof option === "string") { - return { - label: option, - value: option, - }; - } - if (!option.label) { - option.label = option.value; - } - return option; - }); - } - if (this.df.get_data) { let txt = this.$filter_input.val(); let value = this.df.get_data(txt); @@ -197,13 +213,13 @@ frappe.ui.form.ControlMultiSelectList = class ControlMultiSelectList extends ( this._options = []; } else if (value.then) { promise = value.then((options) => { - this._options = process_options(options); + this._options = this.process_options(options); }); } else { - this._options = process_options(value); + this._options = this.process_options(value); } } else { - this._options = process_options(this.df.options); + this._options = this.process_options(this.df.options); } return promise; } From 204ab3c5ab25e05021904dd4e822c91c5b967b6c Mon Sep 17 00:00:00 2001 From: Shankar Date: Fri, 22 Dec 2023 10:42:18 +0530 Subject: [PATCH 2/4] fix linter --- .../js/frappe/form/controls/multiselect_list.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/frappe/public/js/frappe/form/controls/multiselect_list.js b/frappe/public/js/frappe/form/controls/multiselect_list.js index e6803e4c62..d8e8939ab8 100644 --- a/frappe/public/js/frappe/form/controls/multiselect_list.js +++ b/frappe/public/js/frappe/form/controls/multiselect_list.js @@ -84,8 +84,8 @@ frappe.ui.form.ControlMultiSelectList = class ControlMultiSelectList extends ( this.$list_wrapper.on("show.bs.dropdown", () => { this.set_options().then(() => { - if (!this._selected_values || !this._selected_values.length ){ - this._selected_values = this.process_options(this.values) + if (!this._selected_values || !this._selected_values.length){ + this._selected_values = this.process_options(this.values); } this._options = this._selected_values .concat(this._options) @@ -138,13 +138,17 @@ frappe.ui.form.ControlMultiSelectList = class ControlMultiSelectList extends ( } //Unselect old values this.values.forEach((value) => { - this.$list_wrapper.find(`.selectable-item[data-value=${value}]`).toggleClass("selected"); + this.$list_wrapper + .find(`.selectable-item[data-value=${value}]`) + .toggleClass("selected"); }); this.values = value; this.values.forEach((value) => { this.update_selected_values(value); //Select new values - this.$list_wrapper.find(`.selectable-item[data-value=${value}]`).toggleClass("selected"); + this.$list_wrapper + .find(`.selectable-item[data-value=${value}]`) + .toggleClass("selected"); }); this.parse_validate_and_set_in_model(""); this.update_status(); @@ -194,7 +198,7 @@ frappe.ui.form.ControlMultiSelectList = class ControlMultiSelectList extends ( return { label: option, value: option, - description:"" + description: "", }; } if (!option.label) { From f4d7d6053a7750334193b4e70bd4ffc691701d2d Mon Sep 17 00:00:00 2001 From: Shankar Date: Fri, 22 Dec 2023 10:46:00 +0530 Subject: [PATCH 3/4] fix linter --- .../public/js/frappe/form/controls/multiselect_list.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frappe/public/js/frappe/form/controls/multiselect_list.js b/frappe/public/js/frappe/form/controls/multiselect_list.js index d8e8939ab8..72fe0dd614 100644 --- a/frappe/public/js/frappe/form/controls/multiselect_list.js +++ b/frappe/public/js/frappe/form/controls/multiselect_list.js @@ -84,7 +84,7 @@ frappe.ui.form.ControlMultiSelectList = class ControlMultiSelectList extends ( this.$list_wrapper.on("show.bs.dropdown", () => { this.set_options().then(() => { - if (!this._selected_values || !this._selected_values.length){ + if (!this._selected_values || !this._selected_values.length) { this._selected_values = this.process_options(this.values); } this._options = this._selected_values @@ -139,16 +139,16 @@ frappe.ui.form.ControlMultiSelectList = class ControlMultiSelectList extends ( //Unselect old values this.values.forEach((value) => { this.$list_wrapper - .find(`.selectable-item[data-value=${value}]`) - .toggleClass("selected"); + .find(`.selectable-item[data-value=${value}]`) + .toggleClass("selected"); }); this.values = value; this.values.forEach((value) => { this.update_selected_values(value); //Select new values this.$list_wrapper - .find(`.selectable-item[data-value=${value}]`) - .toggleClass("selected"); + .find(`.selectable-item[data-value=${value}]`) + .toggleClass("selected"); }); this.parse_validate_and_set_in_model(""); this.update_status(); From e3afdec3bc2d8994dd4225713840244f78a192c2 Mon Sep 17 00:00:00 2001 From: Shankar Date: Fri, 22 Dec 2023 10:48:44 +0530 Subject: [PATCH 4/4] fix linter --- frappe/public/js/frappe/form/controls/multiselect_list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/form/controls/multiselect_list.js b/frappe/public/js/frappe/form/controls/multiselect_list.js index 72fe0dd614..7ccde751ca 100644 --- a/frappe/public/js/frappe/form/controls/multiselect_list.js +++ b/frappe/public/js/frappe/form/controls/multiselect_list.js @@ -154,7 +154,7 @@ frappe.ui.form.ControlMultiSelectList = class ControlMultiSelectList extends ( this.update_status(); return Promise.resolve(); } - + update_selected_values(value) { this._selected_values = this._selected_values || []; let option = this._options