mirror of
https://github.com/home-assistant/frontend.git
synced 2025-07-28 11:46:42 +00:00
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:
parent
696ba69a9e
commit
68e22d23f1
@ -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);
|
||||||
},
|
},
|
||||||
|
@ -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,12 +35,13 @@ 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") &&
|
||||||
|
!deepEqual(this.value, properties.get("value"))
|
||||||
|
) {
|
||||||
this._findRelated();
|
this._findRelated();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
protected render() {
|
protected render() {
|
||||||
return html`
|
return html`
|
||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,12 +42,13 @@ 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") &&
|
||||||
|
!deepEqual(this.value, properties.get("value"))
|
||||||
|
) {
|
||||||
this._findRelated();
|
this._findRelated();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
protected render() {
|
protected render() {
|
||||||
const areas = this._areas(this.hass.areas, this.hass.floors);
|
const areas = this._areas(this.hass.areas, this.hass.floors);
|
||||||
@ -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,
|
||||||
|
@ -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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user