Fix filtering on device in entities config panel (#25948)

* Fix filtering on device in entities config panel

* fix

* set filters from url twice to catch race...
This commit is contained in:
Bram Kragten 2025-06-26 16:42:11 +02:00 committed by GitHub
parent 696ba69a9e
commit 68e22d23f1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 43 additions and 44 deletions

View File

@ -202,7 +202,6 @@ export function storage(options: {
// Don't set the initial value if we have a value in localStorage // Don't set the initial value if we have a value in localStorage
if (this.__initialized || getValue() === undefined) { if (this.__initialized || getValue() === undefined) {
setValue(this, value); setValue(this, value);
this.requestUpdate(propertyKey, undefined);
} }
}, },
configurable: true, configurable: true,
@ -212,11 +211,13 @@ export function storage(options: {
const oldSetter = descriptor.set; const oldSetter = descriptor.set;
newDescriptor = { newDescriptor = {
...descriptor, ...descriptor,
get(this: ReactiveStorageElement) {
return getValue();
},
set(this: ReactiveStorageElement, value) { set(this: ReactiveStorageElement, value) {
// Don't set the initial value if we have a value in localStorage // Don't set the initial value if we have a value in localStorage
if (this.__initialized || getValue() === undefined) { if (this.__initialized || getValue() === undefined) {
setValue(this, value); setValue(this, value);
this.requestUpdate(propertyKey, undefined);
} }
oldSetter?.call(this, value); oldSetter?.call(this, value);
}, },

View File

@ -14,6 +14,7 @@ import "./ha-check-list-item";
import "./ha-expansion-panel"; import "./ha-expansion-panel";
import "./ha-icon-button"; import "./ha-icon-button";
import "./ha-list"; import "./ha-list";
import { deepEqual } from "../common/util/deep-equal";
@customElement("ha-filter-blueprints") @customElement("ha-filter-blueprints")
export class HaFilterBlueprints extends LitElement { export class HaFilterBlueprints extends LitElement {
@ -34,10 +35,11 @@ export class HaFilterBlueprints extends LitElement {
public willUpdate(properties: PropertyValues) { public willUpdate(properties: PropertyValues) {
super.willUpdate(properties); super.willUpdate(properties);
if (!this.hasUpdated) { if (
if (this.value?.length) { properties.has("value") &&
this._findRelated(); !deepEqual(this.value, properties.get("value"))
} ) {
this._findRelated();
} }
} }
@ -130,17 +132,15 @@ export class HaFilterBlueprints extends LitElement {
} }
this.value = value; this.value = value;
this._findRelated();
} }
private async _findRelated() { private async _findRelated() {
if (!this.value?.length) { if (!this.value?.length) {
this.value = [];
fireEvent(this, "data-table-filter-changed", { fireEvent(this, "data-table-filter-changed", {
value: [], value: [],
items: undefined, items: undefined,
}); });
this.value = [];
return; return;
} }

View File

@ -6,6 +6,7 @@ import memoizeOne from "memoize-one";
import { fireEvent } from "../common/dom/fire_event"; import { fireEvent } from "../common/dom/fire_event";
import { computeDeviceNameDisplay } from "../common/entity/compute_device_name"; import { computeDeviceNameDisplay } from "../common/entity/compute_device_name";
import { stringCompare } from "../common/string/compare"; import { stringCompare } from "../common/string/compare";
import { deepEqual } from "../common/util/deep-equal";
import type { RelatedResult } from "../data/search"; import type { RelatedResult } from "../data/search";
import { findRelated } from "../data/search"; import { findRelated } from "../data/search";
import { haStyleScrollbar } from "../resources/styles"; import { haStyleScrollbar } from "../resources/styles";
@ -37,9 +38,13 @@ export class HaFilterDevices extends LitElement {
if (!this.hasUpdated) { if (!this.hasUpdated) {
loadVirtualizer(); loadVirtualizer();
if (this.value?.length) { }
this._findRelated();
} if (
properties.has("value") &&
!deepEqual(this.value, properties.get("value"))
) {
this._findRelated();
} }
} }
@ -110,7 +115,6 @@ export class HaFilterDevices extends LitElement {
this.value = [...(this.value || []), value]; this.value = [...(this.value || []), value];
} }
listItem.selected = this.value?.includes(value); listItem.selected = this.value?.includes(value);
this._findRelated();
} }
protected updated(changed) { protected updated(changed) {
@ -160,11 +164,11 @@ export class HaFilterDevices extends LitElement {
const relatedPromises: Promise<RelatedResult>[] = []; const relatedPromises: Promise<RelatedResult>[] = [];
if (!this.value?.length) { if (!this.value?.length) {
this.value = [];
fireEvent(this, "data-table-filter-changed", { fireEvent(this, "data-table-filter-changed", {
value: [], value: [],
items: undefined, items: undefined,
}); });
this.value = [];
return; return;
} }
@ -176,7 +180,6 @@ export class HaFilterDevices extends LitElement {
relatedPromises.push(findRelated(this.hass, "device", deviceId)); relatedPromises.push(findRelated(this.hass, "device", deviceId));
} }
} }
this.value = value;
const results = await Promise.all(relatedPromises); const results = await Promise.all(relatedPromises);
const items = new Set<string>(); const items = new Set<string>();
for (const result of results) { for (const result of results) {

View File

@ -17,6 +17,7 @@ import "./ha-expansion-panel";
import "./ha-list"; import "./ha-list";
import "./ha-state-icon"; import "./ha-state-icon";
import "./search-input-outlined"; import "./search-input-outlined";
import { deepEqual } from "../common/util/deep-equal";
@customElement("ha-filter-entities") @customElement("ha-filter-entities")
export class HaFilterEntities extends LitElement { export class HaFilterEntities extends LitElement {
@ -39,9 +40,13 @@ export class HaFilterEntities extends LitElement {
if (!this.hasUpdated) { if (!this.hasUpdated) {
loadVirtualizer(); loadVirtualizer();
if (this.value?.length) { }
this._findRelated();
} if (
properties.has("value") &&
!deepEqual(this.value, properties.get("value"))
) {
this._findRelated();
} }
} }
@ -131,7 +136,6 @@ export class HaFilterEntities extends LitElement {
this.value = [...(this.value || []), value]; this.value = [...(this.value || []), value];
} }
listItem.selected = this.value?.includes(value); listItem.selected = this.value?.includes(value);
this._findRelated();
} }
private _expandedWillChange(ev) { private _expandedWillChange(ev) {
@ -178,11 +182,11 @@ export class HaFilterEntities extends LitElement {
const relatedPromises: Promise<RelatedResult>[] = []; const relatedPromises: Promise<RelatedResult>[] = [];
if (!this.value?.length) { if (!this.value?.length) {
this.value = [];
fireEvent(this, "data-table-filter-changed", { fireEvent(this, "data-table-filter-changed", {
value: [], value: [],
items: undefined, items: undefined,
}); });
this.value = [];
return; return;
} }

View File

@ -20,6 +20,7 @@ import "./ha-icon-button";
import "./ha-list"; import "./ha-list";
import "./ha-svg-icon"; import "./ha-svg-icon";
import "./ha-tree-indicator"; import "./ha-tree-indicator";
import { deepEqual } from "../common/util/deep-equal";
@customElement("ha-filter-floor-areas") @customElement("ha-filter-floor-areas")
export class HaFilterFloorAreas extends LitElement { export class HaFilterFloorAreas extends LitElement {
@ -41,10 +42,11 @@ export class HaFilterFloorAreas extends LitElement {
public willUpdate(properties: PropertyValues) { public willUpdate(properties: PropertyValues) {
super.willUpdate(properties); super.willUpdate(properties);
if (!this.hasUpdated) { if (
if (this.value?.floors?.length || this.value?.areas?.length) { properties.has("value") &&
this._findRelated(); !deepEqual(this.value, properties.get("value"))
} ) {
this._findRelated();
} }
} }
@ -174,8 +176,6 @@ export class HaFilterFloorAreas extends LitElement {
} }
listItem.selected = this.value[type]?.includes(value); listItem.selected = this.value[type]?.includes(value);
this._findRelated();
} }
protected updated(changed) { protected updated(changed) {
@ -188,10 +188,6 @@ export class HaFilterFloorAreas extends LitElement {
} }
} }
protected firstUpdated() {
this._findRelated();
}
private _expandedWillChange(ev) { private _expandedWillChange(ev) {
this._shouldRender = ev.detail.expanded; this._shouldRender = ev.detail.expanded;
} }
@ -226,6 +222,7 @@ export class HaFilterFloorAreas extends LitElement {
!this.value || !this.value ||
(!this.value.areas?.length && !this.value.floors?.length) (!this.value.areas?.length && !this.value.floors?.length)
) { ) {
this.value = {};
fireEvent(this, "data-table-filter-changed", { fireEvent(this, "data-table-filter-changed", {
value: {}, value: {},
items: undefined, items: undefined,

View File

@ -1099,10 +1099,10 @@ ${
} }
protected firstUpdated() { protected firstUpdated() {
this._setFiltersFromUrl();
fetchEntitySourcesWithCache(this.hass).then((sources) => { fetchEntitySourcesWithCache(this.hass).then((sources) => {
this._entitySources = sources; this._entitySources = sources;
}); });
this._setFiltersFromUrl();
if (Object.keys(this._filters).length) { if (Object.keys(this._filters).length) {
return; return;
} }
@ -1116,7 +1116,7 @@ ${
const configEntry = this._searchParms.get("config_entry"); const configEntry = this._searchParms.get("config_entry");
const subEntry = this._searchParms.get("sub_entry"); const subEntry = this._searchParms.get("sub_entry");
const device = this._searchParms.get("device"); const device = this._searchParms.get("device");
const label = this._searchParms.has("label"); const label = this._searchParms.get("label");
if (!domain && !configEntry && !label && !device) { if (!domain && !configEntry && !label && !device) {
return; return;
@ -1128,21 +1128,10 @@ ${
"ha-filter-states": [], "ha-filter-states": [],
"ha-filter-integrations": domain ? [domain] : [], "ha-filter-integrations": domain ? [domain] : [],
"ha-filter-devices": device ? [device] : [], "ha-filter-devices": device ? [device] : [],
"ha-filter-labels": label ? [label] : [],
config_entry: configEntry ? [configEntry] : [], config_entry: configEntry ? [configEntry] : [],
sub_entry: subEntry ? [subEntry] : [], sub_entry: subEntry ? [subEntry] : [],
}; };
this._filterLabel();
}
private _filterLabel() {
const label = this._searchParms.get("label");
if (!label) {
return;
}
this._filters = {
...this._filters,
"ha-filter-labels": [label],
};
} }
private _clearFilter() { private _clearFilter() {
@ -1152,6 +1141,11 @@ ${
public willUpdate(changedProps: PropertyValues): void { public willUpdate(changedProps: PropertyValues): void {
super.willUpdate(changedProps); super.willUpdate(changedProps);
if (!this.hasUpdated) {
this._setFiltersFromUrl();
}
const oldHass = changedProps.get("hass"); const oldHass = changedProps.get("hass");
let changed = false; let changed = false;
if (!this.hass || !this._entities) { if (!this.hass || !this._entities) {