diff --git a/src/panels/config/devices/ha-config-devices-dashboard.ts b/src/panels/config/devices/ha-config-devices-dashboard.ts index 274eecf5e0..99aebced37 100644 --- a/src/panels/config/devices/ha-config-devices-dashboard.ts +++ b/src/panels/config/devices/ha-config-devices-dashboard.ts @@ -82,11 +82,11 @@ export class HaConfigDeviceDashboard extends LitElement { filterTexts.push( `${this.hass.localize( "ui.panel.config.integrations.integration" - )} ${integrationName}${ + )} "${integrationName}${ integrationName !== configEntry.title ? `: ${configEntry.title}` : "" - }` + }"` ); break; } diff --git a/src/panels/config/entities/ha-config-entities.ts b/src/panels/config/entities/ha-config-entities.ts index cb14412545..357addf53e 100644 --- a/src/panels/config/entities/ha-config-entities.ts +++ b/src/panels/config/entities/ha-config-entities.ts @@ -97,6 +97,8 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { @internalProperty() private _filter = ""; + @internalProperty() private _numHiddenEntities = 0; + @internalProperty() private _searchParms = new URLSearchParams( window.location.search ); @@ -118,6 +120,10 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { filters.forEach((value, key) => { switch (key) { case "config_entry": { + // If we are requested to show the entities for a given config entry, + // also show the disabled ones by default. + this._showDisabled = true; + if (!entries) { this._loadConfigEntries(); break; @@ -132,11 +138,11 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { filterTexts.push( `${this.hass.localize( "ui.panel.config.integrations.integration" - )} ${integrationName}${ + )} "${integrationName}${ integrationName !== configEntry.title ? `: ${configEntry.title}` : "" - }` + }"` ); break; } @@ -262,11 +268,9 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { showUnavailable: boolean, showReadOnly: boolean ): EntityRow[] => { - if (!showDisabled) { - entities = entities.filter((entity) => !entity.disabled_by); - } - const result: EntityRow[] = []; + // If nothing gets filtered, this is our correct count of entities + let startLength = entities.length + stateEntities.length; entities = showReadOnly ? entities.concat(stateEntities) : entities; @@ -276,10 +280,23 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { entities = entities.filter( (entity) => entity.config_entry_id === value ); + // If we have an active filter and `showReadOnly` is true, the length of `entities` is correct. + // If however, the read-only entities were not added before, we need to check how many would + // have matched the active filter and add that number to the count. + startLength = entities.length; + if (!showReadOnly) { + startLength += stateEntities.filter( + (entity) => entity.config_entry_id === value + ).length; + } break; } }); + if (!showDisabled) { + entities = entities.filter((entity) => !entity.disabled_by); + } + for (const entry of entities) { const entity = this.hass.states[entry.entity_id]; const unavailable = entity?.state === UNAVAILABLE; @@ -315,6 +332,7 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { }); } + this._numHiddenEntities = startLength - result.length; return result; } ); @@ -358,6 +376,16 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { this.hass.localize, this._entries ); + + const entityData = this._filteredEntities( + this._entities, + this._stateEntities, + this._searchParms, + this._showDisabled, + this._showUnavailable, + this._showReadOnly + ); + const headerToolbar = this._selectedEntities.length ? html`

@@ -441,11 +469,32 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { "ui.panel.config.filtering.filtering_by" )} ${activeFilters.join(", ")} + ${this._numHiddenEntities + ? "(" + + this.hass.localize( + "ui.panel.config.entities.picker.filter.hidden_entities", + "number", + this._numHiddenEntities + ) + + ")" + : ""} ` : `${this.hass.localize( "ui.panel.config.filtering.filtering_by" - )} ${activeFilters.join(", ")}`} + )} ${activeFilters.join(", ")} + ${ + this._numHiddenEntities + ? "(" + + this.hass.localize( + "ui.panel.config.entities.picker.filter.hidden_entities", + "number", + this._numHiddenEntities + ) + + ")" + : "" + } + `} ${this.hass.localize( "ui.panel.config.filtering.clear" @@ -453,6 +502,31 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { > ` : ""} + ${this._numHiddenEntities && !activeFilters + ? html`

+ ${this.narrow + ? html`
+ + + ${this.hass.localize( + "ui.panel.config.entities.picker.filter.hidden_entities", + "number", + this._numHiddenEntities + )} + +
` + : `${this.hass.localize( + "ui.panel.config.entities.picker.filter.hidden_entities", + "number", + this._numHiddenEntities + )}`} + ${this.hass.localize( + "ui.panel.config.entities.picker.filter.show_all" + )} +
` + : ""}