From fbd5185ce29326dec471bf6558601d43272a23ea Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 8 Jan 2020 18:19:10 +0100 Subject: [PATCH] Add ability to remove Lovelace config (#4430) * Add ability to remove Lovelace config * Update hc-lovelace.ts --- cast/src/receiver/layout/hc-lovelace.ts | 1 + src/data/lovelace.ts | 5 +++ src/panels/lovelace/ha-panel-lovelace.ts | 23 ++++++++++++ src/panels/lovelace/hui-editor.ts | 45 +++++++++++++++++++++--- src/panels/lovelace/types.ts | 1 + src/translations/en.json | 5 ++- 6 files changed, 75 insertions(+), 5 deletions(-) diff --git a/cast/src/receiver/layout/hc-lovelace.ts b/cast/src/receiver/layout/hc-lovelace.ts index 641eee4305..6a13751a35 100644 --- a/cast/src/receiver/layout/hc-lovelace.ts +++ b/cast/src/receiver/layout/hc-lovelace.ts @@ -39,6 +39,7 @@ class HcLovelace extends LitElement { mode: "storage", language: "en", saveConfig: async () => undefined, + deleteConfig: async () => undefined, setEditMode: () => undefined, }; return this.lovelaceConfig.views[index].panel diff --git a/src/data/lovelace.ts b/src/data/lovelace.ts index 368f814e15..9dc35d9cef 100644 --- a/src/data/lovelace.ts +++ b/src/data/lovelace.ts @@ -113,6 +113,11 @@ export const saveConfig = ( config, }); +export const deleteConfig = (hass: HomeAssistant): Promise => + hass.callWS({ + type: "lovelace/config/delete", + }); + export const subscribeLovelaceUpdates = ( conn: Connection, onChange: () => void diff --git a/src/panels/lovelace/ha-panel-lovelace.ts b/src/panels/lovelace/ha-panel-lovelace.ts index fb517979a5..f4d0eb80e3 100644 --- a/src/panels/lovelace/ha-panel-lovelace.ts +++ b/src/panels/lovelace/ha-panel-lovelace.ts @@ -6,6 +6,7 @@ import { saveConfig, subscribeLovelaceUpdates, WindowWithLovelaceProm, + deleteConfig, } from "../../data/lovelace"; import "../../layouts/hass-loading-screen"; import "../../layouts/hass-error-screen"; @@ -316,6 +317,28 @@ class LovelacePanel extends LitElement { throw err; } }, + deleteConfig: async (): Promise => { + const { config: previousConfig, mode: previousMode } = this.lovelace!; + try { + // Optimistic update + this._updateLovelace({ + config: await generateLovelaceConfigFromHass(this.hass!), + mode: "generated", + editMode: false, + }); + this._ignoreNextUpdateEvent = true; + await deleteConfig(this.hass!); + } catch (err) { + // tslint:disable-next-line + console.error(err); + // Rollback the optimistic update + this._updateLovelace({ + config: previousConfig, + mode: previousMode, + }); + throw err; + } + }, }; } diff --git a/src/panels/lovelace/hui-editor.ts b/src/panels/lovelace/hui-editor.ts index 8ae1919d25..a82154550b 100644 --- a/src/panels/lovelace/hui-editor.ts +++ b/src/panels/lovelace/hui-editor.ts @@ -28,6 +28,8 @@ import "../../components/ha-code-editor"; import { HaCodeEditor } from "../../components/ha-code-editor"; import { HomeAssistant } from "../../types"; import { computeRTL } from "../../common/util/compute_rtl"; +import { LovelaceConfig } from "../../data/lovelace"; +import { showConfirmationDialog } from "../../dialogs/confirmation/show-dialog-confirmation"; const lovelaceStruct = struct.interface({ title: "string?", @@ -180,9 +182,44 @@ class LovelaceFullConfigEditor extends LitElement { } } + private async _removeConfig() { + try { + await this.lovelace!.deleteConfig(); + } catch (err) { + alert( + this.hass.localize( + "ui.panel.lovelace.editor.raw_editor.error_remove", + "error", + err + ) + ); + } + window.onbeforeunload = null; + if (this.closeEditor) { + this.closeEditor(); + } + } + private async _handleSave() { this._saving = true; + const value = this.yamlEditor.value; + + if (!value) { + showConfirmationDialog(this, { + title: this.hass.localize( + "ui.panel.lovelace.editor.raw_editor.confirm_remove_config_title" + ), + text: this.hass.localize( + "ui.panel.lovelace.editor.raw_editor.confirm_remove_config_text" + ), + confirmBtnText: this.hass.localize("ui.common.yes"), + cancelBtnText: this.hass.localize("ui.common.no"), + confirm: () => this._removeConfig(), + }); + return; + } + if (this.yamlEditor.hasComments) { if ( !confirm( @@ -195,9 +232,9 @@ class LovelaceFullConfigEditor extends LitElement { } } - let value; + let config: LovelaceConfig; try { - value = safeLoad(this.yamlEditor.value); + config = safeLoad(value); } catch (err) { alert( this.hass.localize( @@ -210,7 +247,7 @@ class LovelaceFullConfigEditor extends LitElement { return; } try { - value = lovelaceStruct(value); + config = lovelaceStruct(config); } catch (err) { alert( this.hass.localize( @@ -222,7 +259,7 @@ class LovelaceFullConfigEditor extends LitElement { return; } try { - await this.lovelace!.saveConfig(value); + await this.lovelace!.saveConfig(config); } catch (err) { alert( this.hass.localize( diff --git a/src/panels/lovelace/types.ts b/src/panels/lovelace/types.ts index 4557561412..e9d8657e88 100644 --- a/src/panels/lovelace/types.ts +++ b/src/panels/lovelace/types.ts @@ -21,6 +21,7 @@ export interface Lovelace { enableFullEditMode: () => void; setEditMode: (editMode: boolean) => void; saveConfig: (newConfig: LovelaceConfig) => Promise; + deleteConfig: () => Promise; } export interface LovelaceBadge extends HTMLElement { diff --git a/src/translations/en.json b/src/translations/en.json index a535bcc2a0..ab09ff0518 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1615,11 +1615,14 @@ "save": "Save", "unsaved_changes": "Unsaved changes", "saved": "Saved", + "confirm_remove_config_title": "Are you sure you want to remove your Lovelace configuration? We will automatically generate your Lovelace views with your areas and devices.", + "confirm_remove_config_text": "We will automatically generate your Lovelace views with your areas and devices if you remove your Lovelace configuration.", "confirm_unsaved_changes": "You have unsaved changes, are you sure you want to exit?", "confirm_unsaved_comments": "Your config contains comment(s), these will not be saved. Do you want to continue?", "error_parse_yaml": "Unable to parse YAML: {error}", "error_invalid_config": "Your config is not valid: {error}", - "error_save_yaml": "Unable to save YAML: {error}" + "error_save_yaml": "Unable to save YAML: {error}", + "error_remove": "Unable to remove config: {error}" }, "edit_lovelace": { "header": "Title of your Lovelace UI",