mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-03-01 02:03:22 +00:00
Handle filtering on js controller for SelectorWithFilter
This commit is contained in:
@@ -4,23 +4,8 @@ class SelectorWithFilterComponent < SelectorComponent
|
||||
def initialize(title:, selected:, items:, data: {},
|
||||
selected_items_i18n_key: 'components.selector_with_filter.selected_items')
|
||||
super(title: title, selected: selected, items: items, data: data)
|
||||
@query = ""
|
||||
@selected_items = items.select { |item| @selected.include?(item[:value]) }
|
||||
@selected_items_i18n_key = selected_items_i18n_key
|
||||
|
||||
filter_items
|
||||
end
|
||||
|
||||
def search
|
||||
@query = element.value
|
||||
filter_items
|
||||
end
|
||||
|
||||
def filter_items
|
||||
@filtered_items = if @query.empty?
|
||||
@items
|
||||
else
|
||||
@items.select { |item| item[:label].downcase.include?(@query.downcase) }
|
||||
end
|
||||
@items = items
|
||||
end
|
||||
end
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
.selector-arrow
|
||||
.selector-wrapper
|
||||
.super-selector-search
|
||||
%input{type: "text", placeholder: t("components.selector_with_filter.search_placeholder"), data: reflex_data_attributes("debounced:input->search"), value: @query}
|
||||
%input{type: "text", placeholder: t("components.selector_with_filter.search_placeholder"), data: { action: "debounced:input->selector-with-filter#filter" } }
|
||||
.selector-items
|
||||
- @filtered_items.each do |item|
|
||||
.selector-item{ class: ("selected" if item[:selected]), data: @data, "data-value": item[:value] }
|
||||
- @items.each do |item|
|
||||
.selector-item{ class: ("selected" if item[:selected]), data: @data.merge({ "selector-with-filter-target": "items" }), "data-value": item[:value] }
|
||||
= item[:label]
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
import SelectorController from "./selector_controller";
|
||||
|
||||
export default class extends SelectorController {}
|
||||
export default class extends SelectorController {
|
||||
static targets = ["items"];
|
||||
|
||||
filter = (event) => {
|
||||
const query = event.target.value;
|
||||
|
||||
this.itemsTargets.forEach((el, i) => {
|
||||
el.style.display = el.textContent.toLowerCase().includes(query)
|
||||
? ""
|
||||
: "none";
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user