diff --git a/src/components/ha-icon-picker.ts b/src/components/ha-icon-picker.ts index 1d4f9f8180..9ecf577634 100644 --- a/src/components/ha-icon-picker.ts +++ b/src/components/ha-icon-picker.ts @@ -96,6 +96,9 @@ export class HaIconPicker extends LitElement { @property({ type: Boolean }) public invalid = false; + @property({ type: Boolean, attribute: "force-fallback-icon" }) + public forceFallbackIcon = false; + protected render(): TemplateResult { return html` - ${this._value || this.placeholder + ${(this._value || this.placeholder) && !this.forceFallbackIcon ? html` diff --git a/src/panels/config/entities/dialogs/dialog-entity-state-icon.ts b/src/panels/config/entities/dialogs/dialog-entity-state-icon.ts index 5a1ebd271e..55f302eeb9 100644 --- a/src/panels/config/entities/dialogs/dialog-entity-state-icon.ts +++ b/src/panels/config/entities/dialogs/dialog-entity-state-icon.ts @@ -29,15 +29,20 @@ class DialogEntityStateIcon extends LitElement { const icon = this._params.icon; - this._config = icon ?? { - default: icon || (await entryIcon(this.hass, this._params.entry)) || "", - }; + this._config = + typeof icon === "object" + ? icon + : { + default: + icon || (await entryIcon(this.hass, this._params.entry)) || "", + }; await this.updateComplete; } public closeDialog(): void { this._params = undefined; + this._config = undefined; fireEvent(this, "dialog-closed", { dialog: this.localName }); } @@ -83,7 +88,9 @@ class DialogEntityStateIcon extends LitElement { this._submitting = true; try { const icon = - Object.keys(this._config!).length === 0 ? null : this._config!; + !this._config || Object.keys(this._config).length === 0 + ? null + : this._config; this._params!.updateIcon(icon); this.closeDialog(); } catch (err: any) { diff --git a/src/panels/config/entities/entity-registry-settings-editor.ts b/src/panels/config/entities/entity-registry-settings-editor.ts index c66eb4edeb..24bdc91640 100644 --- a/src/panels/config/entities/entity-registry-settings-editor.ts +++ b/src/panels/config/entities/entity-registry-settings-editor.ts @@ -352,7 +352,10 @@ export class EntityRegistrySettingsEditor extends LitElement { } private _renderIconPicker(stateObj: HassEntity) { - const value = typeof this._icon === "object" ? "" : this._icon; + const useStateIcon = typeof this._icon === "object"; + + const value = useStateIcon ? "Custom state icons" : this._icon; + const placeholder = this.entry.original_icon || (stateObj && until(entityIcon(this.hass, stateObj))) || @@ -367,16 +370,26 @@ export class EntityRegistrySettingsEditor extends LitElement { .label=${this.hass.localize("ui.dialogs.entity_registry.editor.icon")} .placeholder=${placeholder} .disabled=${this.disabled} + .forceFallbackIcon=${useStateIcon} > - ${!this._icon && !stateObj?.attributes.icon && stateObj + ${useStateIcon ? html` - + .icon=${(this._icon as EntityRegistryIcon).state?.[ + stateObj.state + ] || (this._icon as EntityRegistryIcon).default} + > ` - : nothing} + : !this._icon && !stateObj?.attributes.icon && stateObj + ? html` + + ` + : nothing}