From 1d37eec411a582222fcded1c860ba4e4cf809faf Mon Sep 17 00:00:00 2001 From: Petar Petrov Date: Wed, 3 Dec 2025 16:29:48 +0200 Subject: [PATCH] Fix label filter losing selections when searching (#28312) --- src/components/ha-filter-labels.ts | 31 ++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/components/ha-filter-labels.ts b/src/components/ha-filter-labels.ts index db5ec941a3..71b5a27c55 100644 --- a/src/components/ha-filter-labels.ts +++ b/src/components/ha-filter-labels.ts @@ -167,30 +167,33 @@ export class HaFilterLabels extends SubscribeMixin(LitElement) { } private async _labelSelected(ev: CustomEvent>>) { - if (!ev.detail.index.size) { - fireEvent(this, "data-table-filter-changed", { - value: [], - items: undefined, - }); - this.value = []; - return; - } - - const value: string[] = []; const filteredLabels = this._filteredLabels( this._labels, this._filter, this.value ); + const filteredLabelIds = new Set(filteredLabels.map((l) => l.label_id)); + + // Keep previously selected labels that are not in the current filtered view + const preservedLabels = (this.value || []).filter( + (id) => !filteredLabelIds.has(id) + ); + + // Build the new selection from the filtered labels based on selected indices + const newlySelectedLabels: string[] = []; for (const index of ev.detail.index) { - const labelId = filteredLabels[index].label_id; - value.push(labelId); + const labelId = filteredLabels[index]?.label_id; + if (labelId) { + newlySelectedLabels.push(labelId); + } } - this.value = value; + + const value = [...preservedLabels, ...newlySelectedLabels]; + this.value = value.length ? value : []; fireEvent(this, "data-table-filter-changed", { - value, + value: value.length ? value : undefined, items: undefined, }); }