From 33a3d856b54b853f4b13e08f69fa02ac33903a16 Mon Sep 17 00:00:00 2001 From: Jorge Manrubia Date: Thu, 18 Sep 2025 19:02:26 +0200 Subject: [PATCH] Add prefix for multi select labels --- .../multi_selection_combobox_controller.js | 20 +++++++++++++++++-- .../filters/settings/_assignees.html.erb | 7 ++++--- app/views/filters/settings/_closers.html.erb | 5 +++-- app/views/filters/settings/_creators.html.erb | 5 +++-- 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/app/javascript/controllers/multi_selection_combobox_controller.js b/app/javascript/controllers/multi_selection_combobox_controller.js index 1dce17356..75f5329f5 100644 --- a/app/javascript/controllers/multi_selection_combobox_controller.js +++ b/app/javascript/controllers/multi_selection_combobox_controller.js @@ -8,7 +8,8 @@ export default class extends Controller { static values = { selectPropertyName: { type: String, default: "aria-checked" }, defaultValue: String, - noSelectionLabel: { type: String, default: "No selection" } + noSelectionLabel: { type: String, default: "No selection" }, + labelPrefix: String } connect() { @@ -22,6 +23,13 @@ export default class extends Controller { } } + + clear(event) { + this.#deselectAll() + this.#updateHiddenFields() + this.labelTarget.textContent = this.#selectedLabel + } + get #selectedLabel() { const selectedValues = this.#selectedValues() if (selectedValues.length === 0) { @@ -29,10 +37,12 @@ export default class extends Controller { } const labels = this.#selectedItems().map(item => item.dataset.multiSelectionComboboxLabel) - return toSentence(labels, { + const sentence = toSentence(labels, { two_words_connector: " or ", last_word_connector: ", or " }) + + return this.hasLabelPrefixValue ? `${this.labelPrefixValue} ${sentence}` : sentence } #toggleSelection(item) { @@ -53,6 +63,12 @@ export default class extends Controller { this.#addHiddenFields() } + #deselectAll() { + this.itemTargets.forEach(item => { + item.setAttribute(this.selectPropertyNameValue, "false") + }) + } + #selectedItems() { return this.itemTargets.filter(item => item.getAttribute(this.selectPropertyNameValue) === "true" diff --git a/app/views/filters/settings/_assignees.html.erb b/app/views/filters/settings/_assignees.html.erb index bd87dc13f..0973a268e 100644 --- a/app/views/filters/settings/_assignees.html.erb +++ b/app/views/filters/settings/_assignees.html.erb @@ -4,7 +4,8 @@ controller: "dialog multi-selection-combobox", action: "keydown.esc->dialog#close click@document->dialog#closeOnClickOutside", filter_show: user_filtering.show_assignees?, - multi_selection_combobox_no_selection_label_value: "Assigned to…" } do %> + multi_selection_combobox_no_selection_label_value: "Assigned to…", + multi_selection_combobox_label_prefix_value: "Assigned to" } do %> @@ -34,7 +35,7 @@ <% user_filtering.users.each do |user| %> <%= tag.li class: "popup__item", data: { - navigable_list_target: "item", multi_selection_combobox_target: "item", multi_selection_combobox_value: user.id, multi_selection_combobox_label: user.name }, + navigable_list_target: "item", multi_selection_combobox_target: "item", multi_selection_combobox_value: user.id, multi_selection_combobox_label: user.familiar_name }, role: "checkbox", aria: { checked: filter.assignees.include?(user) } do %>