diff --git a/src/common/translations/localize.ts b/src/common/translations/localize.ts index 13c3b8c920..66f9f814f7 100644 --- a/src/common/translations/localize.ts +++ b/src/common/translations/localize.ts @@ -16,7 +16,6 @@ type LocalizeKeyExceptions = | `state_attributes.${string}` | `state_badge.${string}` | `groups.${string}` - | `config_entry.${string}` | `ui.${string}` | `${keyof TranslationDict["supervisor"]}.${string}` | `component.${string}`; diff --git a/src/data/entity_registry.ts b/src/data/entity_registry.ts index 65f451ab26..99ced8904e 100644 --- a/src/data/entity_registry.ts +++ b/src/data/entity_registry.ts @@ -13,8 +13,8 @@ export interface EntityRegistryEntry { config_entry_id: string | null; device_id: string | null; area_id: string | null; - disabled_by: string | null; - hidden_by: string | null; + disabled_by: "user" | "device" | "integration" | "config_entry" | null; + hidden_by: Exclude; entity_category: "config" | "diagnostic" | null; has_entity_name: boolean; original_name?: string; diff --git a/src/panels/config/devices/device-registry-detail/dialog-device-registry-detail.ts b/src/panels/config/devices/device-registry-detail/dialog-device-registry-detail.ts index b61ac0bdd8..f67de2be45 100644 --- a/src/panels/config/devices/device-registry-detail/dialog-device-registry-detail.ts +++ b/src/panels/config/devices/device-registry-detail/dialog-device-registry-detail.ts @@ -6,10 +6,14 @@ import "../../../../components/ha-area-picker"; import "../../../../components/ha-dialog"; import type { HaSwitch } from "../../../../components/ha-switch"; import "../../../../components/ha-textfield"; -import { computeDeviceName } from "../../../../data/device_registry"; +import { + computeDeviceName, + DeviceRegistryEntry, +} from "../../../../data/device_registry"; import { haStyle, haStyleDialog } from "../../../../resources/styles"; import { HomeAssistant } from "../../../../types"; import { DeviceRegistryDetailDialogParams } from "./show-dialog-device-registry-detail"; +import "../../../../components/ha-alert"; @customElement("dialog-device-registry-detail") class DialogDeviceRegistryDetail extends LitElement { @@ -21,11 +25,11 @@ class DialogDeviceRegistryDetail extends LitElement { @state() private _params?: DeviceRegistryDetailDialogParams; - @property() public _areaId?: string | null; + @state() private _areaId!: string; - @state() private _disabledBy!: string | null; + @state() private _disabledBy!: DeviceRegistryEntry["disabled_by"]; - @state() private _submitting?: boolean; + @state() private _submitting = false; public async showDialog( params: DeviceRegistryDetailDialogParams @@ -33,7 +37,7 @@ class DialogDeviceRegistryDetail extends LitElement { this._params = params; this._error = undefined; this._nameByUser = this._params.device.name_by_user || ""; - this._areaId = this._params.device.area_id; + this._areaId = this._params.device.area_id || ""; this._disabledBy = this._params.device.disabled_by; await this.updateComplete; } diff --git a/src/panels/config/entities/entity-registry-basic-editor.ts b/src/panels/config/entities/entity-registry-basic-editor.ts index de7d374318..3d915e2db4 100644 --- a/src/panels/config/entities/entity-registry-basic-editor.ts +++ b/src/panels/config/entities/entity-registry-basic-editor.ts @@ -13,6 +13,7 @@ import { subscribeDeviceRegistry, } from "../../../data/device_registry"; import { + EntityRegistryEntry, EntityRegistryEntryUpdateParams, ExtEntityRegistryEntry, updateEntityRegistryEntry, @@ -25,7 +26,7 @@ import type { HomeAssistant } from "../../../types"; export class HaEntityRegistryBasicEditor extends SubscribeMixin(LitElement) { @property({ attribute: false }) public hass!: HomeAssistant; - @property() public entry!: ExtEntityRegistryEntry; + @property({ attribute: false }) public entry!: ExtEntityRegistryEntry; @state() private _origEntityId!: string; @@ -33,7 +34,7 @@ export class HaEntityRegistryBasicEditor extends SubscribeMixin(LitElement) { @state() private _areaId?: string | null; - @state() private _disabledBy!: string | null; + @state() private _disabledBy!: EntityRegistryEntry["disabled_by"]; @state() private _hiddenBy!: string | null; @@ -41,7 +42,7 @@ export class HaEntityRegistryBasicEditor extends SubscribeMixin(LitElement) { @state() private _device?: DeviceRegistryEntry; - @state() private _submitting?: boolean; + @state() private _submitting = false; public async updateEntry(): Promise { this._submitting = true; @@ -145,8 +146,8 @@ export class HaEntityRegistryBasicEditor extends SubscribeMixin(LitElement) { > @@ -182,8 +183,8 @@ export class HaEntityRegistryBasicEditor extends SubscribeMixin(LitElement) { name="hiddendisabled" value="enabled" .checked=${!this._hiddenBy && !this._disabledBy} - .disabled=${this._device?.disabled_by || - (this._disabledBy && + .disabled=${!!this._device?.disabled_by || + (this._disabledBy !== null && !( this._disabledBy === "user" || this._disabledBy === "integration" @@ -200,8 +201,8 @@ export class HaEntityRegistryBasicEditor extends SubscribeMixin(LitElement) { name="hiddendisabled" value="hidden" .checked=${this._hiddenBy !== null} - .disabled=${this._device?.disabled_by || - (this._disabledBy && + .disabled=${!!this._device?.disabled_by || + (this._disabledBy !== null && !( this._disabledBy === "user" || this._disabledBy === "integration" @@ -218,8 +219,8 @@ export class HaEntityRegistryBasicEditor extends SubscribeMixin(LitElement) { name="hiddendisabled" value="disabled" .checked=${this._disabledBy !== null} - .disabled=${this._device?.disabled_by || - (this._disabledBy && + .disabled=${!!this._device?.disabled_by || + (this._disabledBy !== null && !( this._disabledBy === "user" || this._disabledBy === "integration" @@ -302,3 +303,9 @@ export class HaEntityRegistryBasicEditor extends SubscribeMixin(LitElement) { `; } } + +declare global { + interface HTMLElementTagNameMap { + "ha-registry-basic-editor": HaEntityRegistryBasicEditor; + } +} diff --git a/src/panels/config/entities/entity-registry-settings.ts b/src/panels/config/entities/entity-registry-settings.ts index a680418fb5..c3ae97d0e3 100644 --- a/src/panels/config/entities/entity-registry-settings.ts +++ b/src/panels/config/entities/entity-registry-settings.ts @@ -53,6 +53,7 @@ import { updateDeviceRegistryEntry, } from "../../../data/device_registry"; import { + EntityRegistryEntry, EntityRegistryEntryUpdateParams, ExtEntityRegistryEntry, fetchEntityRegistry, @@ -128,7 +129,7 @@ const SWITCH_AS_DOMAINS = ["cover", "fan", "light", "lock", "siren"]; export class EntityRegistrySettings extends SubscribeMixin(LitElement) { @property({ attribute: false }) public hass!: HomeAssistant; - @property() public entry!: ExtEntityRegistryEntry; + @property({ type: Object }) public entry!: ExtEntityRegistryEntry; @state() private _name!: string; @@ -142,9 +143,9 @@ export class EntityRegistrySettings extends SubscribeMixin(LitElement) { @state() private _areaId?: string | null; - @state() private _disabledBy!: string | null; + @state() private _disabledBy!: EntityRegistryEntry["disabled_by"]; - @state() private _hiddenBy!: string | null; + @state() private _hiddenBy!: EntityRegistryEntry["hidden_by"]; @state() private _device?: DeviceRegistryEntry; @@ -630,9 +631,10 @@ export class EntityRegistrySettings extends SubscribeMixin(LitElement) { name="hiddendisabled" value="enabled" .checked=${!this._hiddenBy && !this._disabledBy} - .disabled=${(this._hiddenBy && this._hiddenBy !== "user") || - this._device?.disabled_by || - (this._disabledBy && + .disabled=${(this._hiddenBy !== null && + this._hiddenBy !== "user") || + !!this._device?.disabled_by || + (this._disabledBy !== null && this._disabledBy !== "user" && this._disabledBy !== "integration")} @change=${this._viewStatusChanged} diff --git a/src/panels/config/entities/ha-config-entities.ts b/src/panels/config/entities/ha-config-entities.ts index 6d31575a33..154f2cb424 100644 --- a/src/panels/config/entities/ha-config-entities.ts +++ b/src/panels/config/entities/ha-config-entities.ts @@ -15,6 +15,7 @@ import { HassEntity, UnsubscribeFunc } from "home-assistant-js-websocket"; import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; import { customElement, property, query, state } from "lit/decorators"; import { classMap } from "lit/directives/class-map"; +import { ifDefined } from "lit/directives/if-defined"; import { styleMap } from "lit/directives/style-map"; import memoize from "memoize-one"; import type { HASSDomEvent } from "../../../common/dom/fire_event"; @@ -85,11 +86,11 @@ export interface EntityRow extends StateEntity { export class HaConfigEntities extends SubscribeMixin(LitElement) { @property({ attribute: false }) public hass!: HomeAssistant; - @property() public isWide!: boolean; + @property({ type: Boolean }) public isWide!: boolean; - @property() public narrow!: boolean; + @property({ type: Boolean }) public narrow!: boolean; - @property() public route!: Route; + @property({ attribute: false }) public route!: Route; @state() private _entities?: EntityRegistryEntry[]; @@ -174,7 +175,7 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { type: "icon", template: (_, entry: EntityRow) => html` @@ -237,12 +238,10 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { hidden: narrow || !showDisabled, filterable: true, width: "15%", - template: (disabled_by) => - this.hass.localize( - `ui.panel.config.devices.disabled_by.${disabled_by}` - ) || - disabled_by || - "—", + template: (disabled_by: EntityRegistryEntry["disabled_by"]) => + disabled_by === null + ? "—" + : this.hass.localize(`config_entry.disabled_by.${disabled_by}`), }, status: { title: this.hass.localize( @@ -1012,3 +1011,9 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { ]; } } + +declare global { + interface HTMLElementTagNameMap { + "ha-config-entities": HaConfigEntities; + } +} diff --git a/src/panels/config/integrations/ha-integration-card.ts b/src/panels/config/integrations/ha-integration-card.ts index 1bd0992125..348cdc3e6f 100644 --- a/src/panels/config/integrations/ha-integration-card.ts +++ b/src/panels/config/integrations/ha-integration-card.ts @@ -7,7 +7,7 @@ import { mdiDotsVertical, mdiOpenInNew, } from "@mdi/js"; -import "@polymer/paper-item"; +import "@polymer/paper-item/paper-item"; import "@polymer/paper-listbox"; import "@polymer/paper-tooltip/paper-tooltip"; import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; @@ -64,13 +64,15 @@ export class HaIntegrationCard extends LitElement { @property() public domain!: string; - @property() public items!: ConfigEntryExtended[]; + @property({ attribute: false }) public items!: ConfigEntryExtended[]; - @property() public manifest?: IntegrationManifest; + @property({ attribute: false }) public manifest?: IntegrationManifest; - @property() public entityRegistryEntries!: EntityRegistryEntry[]; + @property({ attribute: false }) + public entityRegistryEntries!: EntityRegistryEntry[]; - @property() public deviceRegistryEntries!: DeviceRegistryEntry[]; + @property({ attribute: false }) + public deviceRegistryEntries!: DeviceRegistryEntry[]; @property() public selectedConfigEntryId?: string; @@ -179,7 +181,7 @@ export class HaIntegrationCard extends LitElement { const services = this._getServices(item, this.deviceRegistryEntries); const entities = this._getEntities(item, this.entityRegistryEntries); - let stateText: [string, ...unknown[]] | undefined; + let stateText: Parameters | undefined; let stateTextExtra: TemplateResult | string | undefined; if (item.disabled_by) { @@ -225,7 +227,7 @@ export class HaIntegrationCard extends LitElement { for (const [items, localizeKey] of [ [devices, "devices"], [services, "services"], - ] as [DeviceRegistryEntry[], string][]) { + ] as const) { if (items.length === 0) { continue; } diff --git a/src/panels/config/integrations/ha-integration-header.ts b/src/panels/config/integrations/ha-integration-header.ts index 84988ab146..f954b5adf0 100644 --- a/src/panels/config/integrations/ha-integration-header.ts +++ b/src/panels/config/integrations/ha-integration-header.ts @@ -12,13 +12,13 @@ import { brandsUrl } from "../../../util/brands-url"; export class HaIntegrationHeader extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; - @property() public banner!: string; + @property() public banner?: string; @property() public localizedDomainName?: string; @property() public domain!: string; - @property() public label!: string; + @property() public label?: string; @property({ attribute: false }) public manifest?: IntegrationManifest;