diff --git a/src/data/config_entries.ts b/src/data/config_entries.ts index 78cbe6105a..f2e84ddac0 100644 --- a/src/data/config_entries.ts +++ b/src/data/config_entries.ts @@ -13,6 +13,7 @@ export interface ConfigEntry { | "not_loaded" | "failed_unload"; supports_options: boolean; + supports_remove_device: boolean; supports_unload: boolean; pref_disable_new_entities: boolean; pref_disable_polling: boolean; diff --git a/src/data/device_registry.ts b/src/data/device_registry.ts index 65c0bcec56..69cdb6b974 100644 --- a/src/data/device_registry.ts +++ b/src/data/device_registry.ts @@ -77,6 +77,17 @@ export const updateDeviceRegistryEntry = ( ...updates, }); +export const removeConfigEntryFromDevice = ( + hass: HomeAssistant, + deviceId: string, + configEntryId: string, +) => + hass.callWS({ + type: "config/device_registry/remove_config_entry", + device_id: deviceId, + config_entry_id: configEntryId, + }); + export const fetchDeviceRegistry = (conn) => conn.sendMessagePromise({ type: "config/device_registry/list", diff --git a/src/panels/config/devices/ha-config-device-page.ts b/src/panels/config/devices/ha-config-device-page.ts index 5e966278e8..999b7aebdd 100644 --- a/src/panels/config/devices/ha-config-device-page.ts +++ b/src/panels/config/devices/ha-config-device-page.ts @@ -27,6 +27,7 @@ import { computeDeviceName, DeviceRegistryEntry, updateDeviceRegistryEntry, + removeConfigEntryFromDevice, } from "../../../data/device_registry"; import { fetchDiagnosticHandler, @@ -95,6 +96,8 @@ export class HaConfigDevicePage extends LitElement { | number | (TemplateResult | string)[]; + @state() private _deleteButtons?: (TemplateResult | string)[]; + private _device = memoizeOne( ( deviceId: string, @@ -186,10 +189,11 @@ export class HaConfigDevicePage extends LitElement { changedProps.has("entries") ) { this._diagnosticDownloadLinks = undefined; + this._deleteButtons = undefined; } if ( - this._diagnosticDownloadLinks || + (this._diagnosticDownloadLinks && this._deleteButtons) || !this.devices || !this.deviceId || !this.entries @@ -198,7 +202,9 @@ export class HaConfigDevicePage extends LitElement { } this._diagnosticDownloadLinks = Math.random(); + this._deleteButtons = [".."]; this._renderDiagnosticButtons(this._diagnosticDownloadLinks); + this._renderDeleteButtons(); } private async _renderDiagnosticButtons(requestId: number): Promise { @@ -263,6 +269,65 @@ export class HaConfigDevicePage extends LitElement { } } + private _renderDeleteButtons() { + console.log("Hello!") + const device = this._device(this.deviceId, this.devices); + + if (!device) { + return; + } + + let buttons = this._integrations(device, this.entries).map((entry) => { + console.log("Hello!") + console.log(entry.supports_remove_device) + if (entry.state !== "loaded" || !entry.supports_remove_device) { + return false; + } + return { + entry_id: entry.entry_id, + domain: entry.domain, + }; + }); + + buttons = buttons.filter(Boolean); + + if (buttons.length > 0) { + this._deleteButtons = ( + buttons as { entry_id: string; domain: string }[] + ).map( + (button) => html` + + ${buttons.length > 1 + ? this.hass.localize( + `ui.panel.config.devices.delete_device_integration`, + { + integration: domainToName( + this.hass.localize, + button.domain + ), + } + ) + : this.hass.localize( + `ui.panel.config.devices.delete_device` + )} + + ` + ); + } + } + + private async _confirmDeleteEntry(): Promise { + const confirmed = await showConfirmationDialog(this, { + text: this.hass.localize("ui.panel.config.devices.confirm_delete"), + }); + + if (!confirmed) { + return; + } + + await removeConfigEntryFromDevice(this.hass!, this.deviceId, "blabla"); + } + protected firstUpdated(changedProps) { super.firstUpdated(changedProps); loadDeviceRegistryDetailDialog(); @@ -375,6 +440,9 @@ export class HaConfigDevicePage extends LitElement { if (Array.isArray(this._diagnosticDownloadLinks)) { deviceActions.push(...this._diagnosticDownloadLinks); } + if (Array.isArray(this._deleteButtons)) { + deviceActions.push(...this._deleteButtons); + } return html`