From 9f73f0ca8dc5577312d7831f9d0f1bab4d31ff0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Tue, 2 Mar 2021 16:39:54 +0100 Subject: [PATCH] Merge update dialogs (#8516) --- .../src/addon-view/info/hassio-addon-info.ts | 25 ++- hassio/src/dashboard/hassio-update.ts | 22 ++- .../dialogs/addon/show-dialog-addon-update.ts | 17 -- .../core/dialog-supervisor-core-update.ts | 175 ------------------ .../dialogs/core/show-dialog-core-update.ts | 17 -- .../dialog-supervisor-update.ts} | 94 ++++++---- .../src/dialogs/update/show-dialog-update.ts | 21 +++ hassio/src/system/hassio-core-info.ts | 24 ++- src/data/hassio/addon.ts | 11 +- src/data/supervisor/core.ts | 5 +- src/translations/en.json | 6 + 11 files changed, 157 insertions(+), 260 deletions(-) delete mode 100644 hassio/src/dialogs/addon/show-dialog-addon-update.ts delete mode 100644 hassio/src/dialogs/core/dialog-supervisor-core-update.ts delete mode 100644 hassio/src/dialogs/core/show-dialog-core-update.ts rename hassio/src/dialogs/{addon/dialog-supervisor-addon-update.ts => update/dialog-supervisor-update.ts} (61%) create mode 100644 hassio/src/dialogs/update/show-dialog-update.ts diff --git a/hassio/src/addon-view/info/hassio-addon-info.ts b/hassio/src/addon-view/info/hassio-addon-info.ts index 88d4e92a19..acefc812d6 100644 --- a/hassio/src/addon-view/info/hassio-addon-info.ts +++ b/hassio/src/addon-view/info/hassio-addon-info.ts @@ -50,6 +50,7 @@ import { startHassioAddon, stopHassioAddon, uninstallHassioAddon, + updateHassioAddon, validateHassioAddonOption, } from "../../../../src/data/hassio/addon"; import { @@ -68,8 +69,8 @@ import { HomeAssistant } from "../../../../src/types"; import { bytesToString } from "../../../../src/util/bytes-to-string"; import "../../components/hassio-card-content"; import "../../components/supervisor-metric"; -import { showDialogSupervisorAddonUpdate } from "../../dialogs/addon/show-dialog-addon-update"; import { showHassioMarkdownDialog } from "../../dialogs/markdown/show-dialog-hassio-markdown"; +import { showDialogSupervisorUpdate } from "../../dialogs/update/show-dialog-update"; import { hassioStyle } from "../../resources/hassio-style"; import { addonArchIsSupported } from "../../util/addon"; @@ -983,7 +984,27 @@ class HassioAddonInfo extends LitElement { } private async _updateClicked(): Promise { - showDialogSupervisorAddonUpdate(this, { addon: this.addon }); + showDialogSupervisorUpdate(this, { + supervisor: this.supervisor, + name: this.addon.name, + version: this.addon.version_latest, + snapshotParams: { + name: `addon_${this.addon.slug}_${this.addon.version}`, + addons: [this.addon.slug], + homeassistant: false, + }, + updateHandler: async () => await this._updateAddon(), + }); + } + + private async _updateAddon(): Promise { + await updateHassioAddon(this.hass, this.addon.slug); + fireEvent(this, "supervisor-colllection-refresh", { + colllection: "addon", + }); + fireEvent(this, "supervisor-colllection-refresh", { + colllection: "supervisor", + }); } private async _startClicked(ev: CustomEvent): Promise { diff --git a/hassio/src/dashboard/hassio-update.ts b/hassio/src/dashboard/hassio-update.ts index e0c3a2f155..2446155b0a 100644 --- a/hassio/src/dashboard/hassio-update.ts +++ b/hassio/src/dashboard/hassio-update.ts @@ -26,6 +26,7 @@ import { HassioHomeAssistantInfo, HassioSupervisorInfo, } from "../../../src/data/hassio/supervisor"; +import { updateCore } from "../../../src/data/supervisor/core"; import { Supervisor, supervisorApiWsRequest, @@ -36,7 +37,7 @@ import { } from "../../../src/dialogs/generic/show-dialog-box"; import { haStyle } from "../../../src/resources/styles"; import { HomeAssistant } from "../../../src/types"; -import { showDialogSupervisorCoreUpdate } from "../dialogs/core/show-dialog-core-update"; +import { showDialogSupervisorUpdate } from "../dialogs/update/show-dialog-update"; import { hassioStyle } from "../resources/hassio-style"; const computeVersion = (key: string, version: string): string => { @@ -164,7 +165,17 @@ export class HassioUpdate extends LitElement { private async _confirmUpdate(ev): Promise { const item = ev.currentTarget; if (item.key === "core") { - showDialogSupervisorCoreUpdate(this, { core: this.supervisor.core }); + showDialogSupervisorUpdate(this, { + supervisor: this.supervisor, + name: "Home Assistant Core", + version: this.supervisor.core.version, + snapshotParams: { + name: `core_${this.supervisor.core.version}`, + folders: ["homeassistant"], + homeassistant: true, + }, + updateHandler: async () => this._updateCore(), + }); return; } item.progress = true; @@ -219,6 +230,13 @@ export class HassioUpdate extends LitElement { item.progress = false; } + private async _updateCore(): Promise { + await updateCore(this.hass); + fireEvent(this, "supervisor-colllection-refresh", { + colllection: "core", + }); + } + static get styles(): CSSResult[] { return [ haStyle, diff --git a/hassio/src/dialogs/addon/show-dialog-addon-update.ts b/hassio/src/dialogs/addon/show-dialog-addon-update.ts deleted file mode 100644 index bb6bebe683..0000000000 --- a/hassio/src/dialogs/addon/show-dialog-addon-update.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { fireEvent } from "../../../../src/common/dom/fire_event"; -import { HassioAddonDetails } from "../../../../src/data/hassio/addon"; - -export interface SupervisorDialogSupervisorAddonUpdateParams { - addon: HassioAddonDetails; -} - -export const showDialogSupervisorAddonUpdate = ( - element: HTMLElement, - dialogParams: SupervisorDialogSupervisorAddonUpdateParams -): void => { - fireEvent(element, "show-dialog", { - dialogTag: "dialog-supervisor-addon-update", - dialogImport: () => import("./dialog-supervisor-addon-update"), - dialogParams, - }); -}; diff --git a/hassio/src/dialogs/core/dialog-supervisor-core-update.ts b/hassio/src/dialogs/core/dialog-supervisor-core-update.ts deleted file mode 100644 index 99c0bddcdd..0000000000 --- a/hassio/src/dialogs/core/dialog-supervisor-core-update.ts +++ /dev/null @@ -1,175 +0,0 @@ -import "@material/mwc-button/mwc-button"; -import { - css, - CSSResult, - customElement, - html, - internalProperty, - LitElement, - TemplateResult, -} from "lit-element"; -import { fireEvent } from "../../../../src/common/dom/fire_event"; -import "../../../../src/components/ha-circular-progress"; -import "../../../../src/components/ha-dialog"; -import "../../../../src/components/ha-settings-row"; -import "../../../../src/components/ha-svg-icon"; -import "../../../../src/components/ha-switch"; -import { extractApiErrorMessage } from "../../../../src/data/hassio/common"; -import { createHassioPartialSnapshot } from "../../../../src/data/hassio/snapshot"; -import { HassioHomeAssistantInfo } from "../../../../src/data/hassio/supervisor"; -import { updateCore } from "../../../../src/data/supervisor/core"; -import { haStyle, haStyleDialog } from "../../../../src/resources/styles"; -import type { HomeAssistant } from "../../../../src/types"; -import { SupervisorDialogSupervisorCoreUpdateParams } from "./show-dialog-core-update"; - -@customElement("dialog-supervisor-core-update") -class DialogSupervisorCoreUpdate extends LitElement { - public hass!: HomeAssistant; - - public core!: HassioHomeAssistantInfo; - - @internalProperty() private _opened = false; - - @internalProperty() private _createSnapshot = true; - - @internalProperty() private _action: "snapshot" | "update" | null = null; - - @internalProperty() private _error?: string; - - public async showDialog( - params: SupervisorDialogSupervisorCoreUpdateParams - ): Promise { - this._opened = true; - this.core = params.core; - await this.updateComplete; - } - - public closeDialog(): void { - this._action = null; - this._createSnapshot = true; - this._opened = false; - fireEvent(this, "dialog-closed", { dialog: this.localName }); - } - - public focus(): void { - this.updateComplete.then(() => - (this.shadowRoot?.querySelector( - "[dialogInitialFocus]" - ) as HTMLElement)?.focus() - ); - } - - protected render(): TemplateResult { - return html` - - ${this._action === null - ? html` -

- Update Home Assistant Core -

-
-
- Are you sure you want to update Home Assistant Core to version - ${this.core.version_latest}? -
- - - - Snapshot - - - Create a snapshot of Home Assistant Core before updating - - - - - - Cancel - - - Update - ` - : html` - -

- ${this._action === "update" - ? `Updating Home Assistant Core to version ${this.core.version_latest}` - : "Creating snapshot of Home Assistant Core"} -

`} - ${this._error ? html`

${this._error}

` : ""} -
- `; - } - - private _toggleSnapshot() { - this._createSnapshot = !this._createSnapshot; - } - - private async _update() { - if (this._createSnapshot) { - this._action = "snapshot"; - try { - await createHassioPartialSnapshot(this.hass, { - name: `core_${this.core.version}`, - folders: ["homeassistant"], - homeassistant: true, - }); - } catch (err) { - this._error = extractApiErrorMessage(err); - this._action = null; - return; - } - } - - this._action = "update"; - try { - await updateCore(this.hass); - } catch (err) { - if (this.hass.connection.connected) { - this._error = extractApiErrorMessage(err); - this._action = null; - return; - } - } - fireEvent(this, "supervisor-colllection-refresh", { colllection: "core" }); - this.closeDialog(); - } - - static get styles(): CSSResult[] { - return [ - haStyle, - haStyleDialog, - css` - .form { - color: var(--primary-text-color); - } - - ha-settings-row { - margin-top: 32px; - padding: 0; - } - - ha-circular-progress { - display: block; - margin: 32px; - text-align: center; - } - - .progress-text { - text-align: center; - } - `, - ]; - } -} - -declare global { - interface HTMLElementTagNameMap { - "dialog-supervisor-core-update": DialogSupervisorCoreUpdate; - } -} diff --git a/hassio/src/dialogs/core/show-dialog-core-update.ts b/hassio/src/dialogs/core/show-dialog-core-update.ts deleted file mode 100644 index 0c2e173d7c..0000000000 --- a/hassio/src/dialogs/core/show-dialog-core-update.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { fireEvent } from "../../../../src/common/dom/fire_event"; -import { HassioHomeAssistantInfo } from "../../../../src/data/hassio/supervisor"; - -export interface SupervisorDialogSupervisorCoreUpdateParams { - core: HassioHomeAssistantInfo; -} - -export const showDialogSupervisorCoreUpdate = ( - element: HTMLElement, - dialogParams: SupervisorDialogSupervisorCoreUpdateParams -): void => { - fireEvent(element, "show-dialog", { - dialogTag: "dialog-supervisor-core-update", - dialogImport: () => import("./dialog-supervisor-core-update"), - dialogParams, - }); -}; diff --git a/hassio/src/dialogs/addon/dialog-supervisor-addon-update.ts b/hassio/src/dialogs/update/dialog-supervisor-update.ts similarity index 61% rename from hassio/src/dialogs/addon/dialog-supervisor-addon-update.ts rename to hassio/src/dialogs/update/dialog-supervisor-update.ts index bc7f8ad625..ee2edff4b4 100644 --- a/hassio/src/dialogs/addon/dialog-supervisor-addon-update.ts +++ b/hassio/src/dialogs/update/dialog-supervisor-update.ts @@ -14,22 +14,16 @@ import "../../../../src/components/ha-dialog"; import "../../../../src/components/ha-settings-row"; import "../../../../src/components/ha-svg-icon"; import "../../../../src/components/ha-switch"; -import { - HassioAddonDetails, - updateHassioAddon, -} from "../../../../src/data/hassio/addon"; import { extractApiErrorMessage } from "../../../../src/data/hassio/common"; import { createHassioPartialSnapshot } from "../../../../src/data/hassio/snapshot"; import { haStyle, haStyleDialog } from "../../../../src/resources/styles"; import type { HomeAssistant } from "../../../../src/types"; -import { SupervisorDialogSupervisorAddonUpdateParams } from "./show-dialog-addon-update"; +import { SupervisorDialogSupervisorUpdateParams } from "./show-dialog-update"; -@customElement("dialog-supervisor-addon-update") -class DialogSupervisorAddonUpdate extends LitElement { +@customElement("dialog-supervisor-update") +class DialogSupervisorUpdate extends LitElement { public hass!: HomeAssistant; - public addon!: HassioAddonDetails; - @internalProperty() private _opened = false; @internalProperty() private _createSnapshot = true; @@ -38,18 +32,22 @@ class DialogSupervisorAddonUpdate extends LitElement { @internalProperty() private _error?: string; + @internalProperty() + private _dialogParams?: SupervisorDialogSupervisorUpdateParams; + public async showDialog( - params: SupervisorDialogSupervisorAddonUpdateParams + params: SupervisorDialogSupervisorUpdateParams ): Promise { this._opened = true; - this.addon = params.addon; + this._dialogParams = params; await this.updateComplete; } public closeDialog(): void { this._action = null; this._createSnapshot = true; - this._opened = false; + this._error = undefined; + this._dialogParams = undefined; fireEvent(this, "dialog-closed", { dialog: this.localName }); } @@ -62,47 +60,77 @@ class DialogSupervisorAddonUpdate extends LitElement { } protected render(): TemplateResult { + if (!this._dialogParams) { + return html``; + } return html` ${this._action === null ? html`

- Update ${this.addon.name} + ${this._dialogParams.supervisor.localize( + "confirm.update.title", + "name", + this._dialogParams.name + )}

- Are you sure you want to update the ${this.addon.name} add-on to - version ${this.addon.version_latest}? + ${this._dialogParams.supervisor.localize( + "confirm.update.text", + "name", + this._dialogParams.name, + "version", + this._dialogParams.version + )}
- Snapshot + ${this._dialogParams.supervisor.localize( + "dialog.update.snapshot" + )} - Create a snapshot of the ${this.addon.name} add-on before - updating + ${this._dialogParams.supervisor.localize( + "dialog.update.create_snapshot", + "name", + this._dialogParams.name + )} - Cancel + ${this._dialogParams.supervisor.localize("common.cancel")} - - Update + + ${this._dialogParams.supervisor.localize("common.update")} ` : html`

${this._action === "update" - ? `Updating ${this.addon.name} to version ${this.addon.version_latest}` - : "Creating snapshot of Home Assistant Core"} + ? this._dialogParams.supervisor.localize( + "dialog.update.updating", + "name", + this._dialogParams.name, + "version", + this._dialogParams.version + ) + : this._dialogParams.supervisor.localize( + "dialog.update.snapshotting", + "name", + this._dialogParams.name + )}

`} ${this._error ? html`

${this._error}

` : ""}
@@ -117,11 +145,10 @@ class DialogSupervisorAddonUpdate extends LitElement { if (this._createSnapshot) { this._action = "snapshot"; try { - await createHassioPartialSnapshot(this.hass, { - name: `addon_${this.addon.slug}_${this.addon.version}`, - addons: [this.addon.slug], - homeassistant: false, - }); + await createHassioPartialSnapshot( + this.hass, + this._dialogParams!.snapshotParams + ); } catch (err) { this._error = extractApiErrorMessage(err); this._action = null; @@ -131,16 +158,13 @@ class DialogSupervisorAddonUpdate extends LitElement { this._action = "update"; try { - await updateHassioAddon(this.hass, this.addon.slug); + await this._dialogParams!.updateHandler!(); } catch (err) { this._error = extractApiErrorMessage(err); this._action = null; return; } - fireEvent(this, "supervisor-colllection-refresh", { colllection: "addon" }); - fireEvent(this, "supervisor-colllection-refresh", { - colllection: "supervisor", - }); + this.closeDialog(); } @@ -174,6 +198,6 @@ class DialogSupervisorAddonUpdate extends LitElement { declare global { interface HTMLElementTagNameMap { - "dialog-supervisor-addon-update": DialogSupervisorAddonUpdate; + "dialog-supervisor-update": DialogSupervisorUpdate; } } diff --git a/hassio/src/dialogs/update/show-dialog-update.ts b/hassio/src/dialogs/update/show-dialog-update.ts new file mode 100644 index 0000000000..209243968c --- /dev/null +++ b/hassio/src/dialogs/update/show-dialog-update.ts @@ -0,0 +1,21 @@ +import { fireEvent } from "../../../../src/common/dom/fire_event"; +import { Supervisor } from "../../../../src/data/supervisor/supervisor"; + +export interface SupervisorDialogSupervisorUpdateParams { + supervisor: Supervisor; + name: string; + version: string; + snapshotParams: any; + updateHandler: () => Promise; +} + +export const showDialogSupervisorUpdate = ( + element: HTMLElement, + dialogParams: SupervisorDialogSupervisorUpdateParams +): void => { + fireEvent(element, "show-dialog", { + dialogTag: "dialog-supervisor-update", + dialogImport: () => import("./dialog-supervisor-update"), + dialogParams, + }); +}; diff --git a/hassio/src/system/hassio-core-info.ts b/hassio/src/system/hassio-core-info.ts index a50c7dc4fa..658f168d26 100644 --- a/hassio/src/system/hassio-core-info.ts +++ b/hassio/src/system/hassio-core-info.ts @@ -10,6 +10,7 @@ import { property, TemplateResult, } from "lit-element"; +import { fireEvent } from "../../../src/common/dom/fire_event"; import "../../../src/components/buttons/ha-progress-button"; import "../../../src/components/ha-button-menu"; import "../../../src/components/ha-card"; @@ -19,7 +20,7 @@ import { fetchHassioStats, HassioStats, } from "../../../src/data/hassio/common"; -import { restartCore } from "../../../src/data/supervisor/core"; +import { restartCore, updateCore } from "../../../src/data/supervisor/core"; import { Supervisor } from "../../../src/data/supervisor/supervisor"; import { showAlertDialog, @@ -29,7 +30,7 @@ import { haStyle } from "../../../src/resources/styles"; import { HomeAssistant } from "../../../src/types"; import { bytesToString } from "../../../src/util/bytes-to-string"; import "../components/supervisor-metric"; -import { showDialogSupervisorCoreUpdate } from "../dialogs/core/show-dialog-core-update"; +import { showDialogSupervisorUpdate } from "../dialogs/update/show-dialog-update"; import { hassioStyle } from "../resources/hassio-style"; @customElement("hassio-core-info") @@ -168,7 +169,24 @@ class HassioCoreInfo extends LitElement { } private async _coreUpdate(): Promise { - showDialogSupervisorCoreUpdate(this, { core: this.supervisor.core }); + showDialogSupervisorUpdate(this, { + supervisor: this.supervisor, + name: "Home Assistant Core", + version: this.supervisor.core.version, + snapshotParams: { + name: `core_${this.supervisor.core.version}`, + folders: ["homeassistant"], + homeassistant: true, + }, + updateHandler: async () => await this._updateCore(), + }); + } + + private async _updateCore(): Promise { + await updateCore(this.hass); + fireEvent(this, "supervisor-colllection-refresh", { + colllection: "core", + }); } static get styles(): CSSResult[] { diff --git a/src/data/hassio/addon.ts b/src/data/hassio/addon.ts index 99f035527c..7bff7d7e38 100644 --- a/src/data/hassio/addon.ts +++ b/src/data/hassio/addon.ts @@ -309,13 +309,12 @@ export const updateHassioAddon = async ( method: "post", timeout: null, }); - return; + } else { + await hass.callApi>( + "POST", + `hassio/addons/${slug}/update` + ); } - - await hass.callApi>( - "POST", - `hassio/addons/${slug}/update` - ); }; export const restartHassioAddon = async ( diff --git a/src/data/supervisor/core.ts b/src/data/supervisor/core.ts index 0191dbe278..2d0cec2df7 100644 --- a/src/data/supervisor/core.ts +++ b/src/data/supervisor/core.ts @@ -14,8 +14,7 @@ export const updateCore = async (hass: HomeAssistant) => { method: "post", timeout: null, }); - return; + } else { + await hass.callApi>("POST", `hassio/core/update`); } - - await hass.callApi>("POST", `hassio/core/update`); }; diff --git a/src/translations/en.json b/src/translations/en.json index 4c4ee6591a..40c01df95d 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -3801,6 +3801,12 @@ "restart_addon": { "confirm_text": "Restart add-on", "text": "Do you want to restart the add-on with your changes?" + }, + "update": { + "snapshot": "Snapshot", + "create_snapshot": "Create a snapshot of {name} before updating", + "updating": "Updating {name} to version {version}", + "snapshotting": "Creating snapshot of {name}" } } }