From 0bfeb222091e69a7a3de6595e63aa864c5e9d8cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Tue, 15 Jun 2021 16:40:24 +0000 Subject: [PATCH] Move snapshot toggle to persistent checkbox --- .../src/addon-view/info/hassio-addon-info.ts | 1 + hassio/src/dashboard/hassio-update.ts | 1 + .../update/dialog-supervisor-update.ts | 63 ++++++++++++++----- .../src/dialogs/update/show-dialog-update.ts | 1 + hassio/src/system/hassio-core-info.ts | 1 + src/data/supervisor/supervisor.ts | 23 +++++++ 6 files changed, 76 insertions(+), 14 deletions(-) diff --git a/hassio/src/addon-view/info/hassio-addon-info.ts b/hassio/src/addon-view/info/hassio-addon-info.ts index 0fe37230bb..084bfd7582 100644 --- a/hassio/src/addon-view/info/hassio-addon-info.ts +++ b/hassio/src/addon-view/info/hassio-addon-info.ts @@ -977,6 +977,7 @@ class HassioAddonInfo extends LitElement { showDialogSupervisorUpdate(this, { supervisor: this.supervisor, name: this.addon.name, + slug: this.addon.slug, version: this.addon.version_latest, snapshotParams: { name: `addon_${this.addon.slug}_${this.addon.version}`, diff --git a/hassio/src/dashboard/hassio-update.ts b/hassio/src/dashboard/hassio-update.ts index 21836b1c1a..2caa17f0a0 100644 --- a/hassio/src/dashboard/hassio-update.ts +++ b/hassio/src/dashboard/hassio-update.ts @@ -161,6 +161,7 @@ export class HassioUpdate extends LitElement { showDialogSupervisorUpdate(this, { supervisor: this.supervisor, name: "Home Assistant Core", + slug: "core", version: this.supervisor.core.version_latest, snapshotParams: { name: `core_${this.supervisor.core.version}`, diff --git a/hassio/src/dialogs/update/dialog-supervisor-update.ts b/hassio/src/dialogs/update/dialog-supervisor-update.ts index e017c9d2f9..462e6893cd 100644 --- a/hassio/src/dialogs/update/dialog-supervisor-update.ts +++ b/hassio/src/dialogs/update/dialog-supervisor-update.ts @@ -2,19 +2,32 @@ import "@material/mwc-button/mwc-button"; import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; import { customElement, state } from "lit/decorators"; import { fireEvent } from "../../../../src/common/dom/fire_event"; +import "../../../../src/components/ha-checkbox"; 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, ignoreSupervisorError, } from "../../../../src/data/hassio/common"; +import { + SupervisorFrontendPrefrences, + fetchSupervisorFrontendPreferences, + saveSupervisorFrontendPreferences, +} from "../../../../src/data/supervisor/supervisor"; import { createHassioPartialSnapshot } from "../../../../src/data/hassio/snapshot"; import { haStyle, haStyleDialog } from "../../../../src/resources/styles"; import type { HomeAssistant } from "../../../../src/types"; import { SupervisorDialogSupervisorUpdateParams } from "./show-dialog-update"; +import memoizeOne from "memoize-one"; + +const snapshot_before_update = memoizeOne( + (slug: string, frontendPrefrences: SupervisorFrontendPrefrences) => + slug in frontendPrefrences.snapshot_before_update + ? frontendPrefrences.snapshot_before_update[slug] + : true +); @customElement("dialog-supervisor-update") class DialogSupervisorUpdate extends LitElement { @@ -22,12 +35,12 @@ class DialogSupervisorUpdate extends LitElement { @state() private _opened = false; - @state() private _createSnapshot = true; - @state() private _action: "snapshot" | "update" | null = null; @state() private _error?: string; + @state() private _frontendPrefrences?: SupervisorFrontendPrefrences; + @state() private _dialogParams?: SupervisorDialogSupervisorUpdateParams; @@ -36,14 +49,17 @@ class DialogSupervisorUpdate extends LitElement { ): Promise { this._opened = true; this._dialogParams = params; + this._frontendPrefrences = await fetchSupervisorFrontendPreferences( + this.hass + ); await this.updateComplete; } public closeDialog(): void { this._action = null; - this._createSnapshot = true; this._error = undefined; this._dialogParams = undefined; + this._frontendPrefrences = undefined; fireEvent(this, "dialog-closed", { dialog: this.localName }); } @@ -56,7 +72,7 @@ class DialogSupervisorUpdate extends LitElement { } protected render(): TemplateResult { - if (!this._dialogParams) { + if (!this._dialogParams || !this._frontendPrefrences) { return html``; } return html` @@ -82,6 +98,16 @@ class DialogSupervisorUpdate extends LitElement { + + ${this._dialogParams.supervisor.localize( "dialog.update.snapshot" @@ -94,12 +120,6 @@ class DialogSupervisorUpdate extends LitElement { this._dialogParams.name )} - - ${this._dialogParams.supervisor.localize("common.cancel")} @@ -133,12 +153,27 @@ class DialogSupervisorUpdate extends LitElement { `; } - private _toggleSnapshot() { - this._createSnapshot = !this._createSnapshot; + private async _toggleSnapshot(): Promise { + this._frontendPrefrences!.snapshot_before_update[ + this._dialogParams!.slug + ] = !snapshot_before_update( + this._dialogParams!.slug, + this._frontendPrefrences! + ); + + await saveSupervisorFrontendPreferences( + this.hass, + this._frontendPrefrences! + ); } private async _update() { - if (this._createSnapshot) { + if ( + snapshot_before_update( + this._dialogParams!.slug, + this._frontendPrefrences! + ) + ) { this._action = "snapshot"; try { await createHassioPartialSnapshot( diff --git a/hassio/src/dialogs/update/show-dialog-update.ts b/hassio/src/dialogs/update/show-dialog-update.ts index 209243968c..03b920a9ae 100644 --- a/hassio/src/dialogs/update/show-dialog-update.ts +++ b/hassio/src/dialogs/update/show-dialog-update.ts @@ -5,6 +5,7 @@ export interface SupervisorDialogSupervisorUpdateParams { supervisor: Supervisor; name: string; version: string; + slug: string; snapshotParams: any; updateHandler: () => Promise; } diff --git a/hassio/src/system/hassio-core-info.ts b/hassio/src/system/hassio-core-info.ts index e335a1df78..aa8e23e508 100644 --- a/hassio/src/system/hassio-core-info.ts +++ b/hassio/src/system/hassio-core-info.ts @@ -164,6 +164,7 @@ class HassioCoreInfo extends LitElement { showDialogSupervisorUpdate(this, { supervisor: this.supervisor, name: "Home Assistant Core", + slug: "core", version: this.supervisor.core.version_latest, snapshotParams: { name: `core_${this.supervisor.core.version}`, diff --git a/src/data/supervisor/supervisor.ts b/src/data/supervisor/supervisor.ts index 1a38c4cbe2..c529dc0c2e 100644 --- a/src/data/supervisor/supervisor.ts +++ b/src/data/supervisor/supervisor.ts @@ -2,6 +2,7 @@ import { Connection, getCollection } from "home-assistant-js-websocket"; import { Store } from "home-assistant-js-websocket/dist/store"; import { LocalizeFunc } from "../../common/translations/localize"; import { HomeAssistant } from "../../types"; +import { fetchFrontendUserData, saveFrontendUserData } from "../frontend"; import { HassioAddonsInfo } from "../hassio/addon"; import { HassioHassOSInfo, HassioHostInfo } from "../hassio/host"; import { NetworkInfo } from "../hassio/network"; @@ -13,6 +14,28 @@ import { } from "../hassio/supervisor"; import { SupervisorStore } from "./store"; +export interface SupervisorFrontendPrefrences { + snapshot_before_update: Record; +} + +declare global { + interface FrontendUserData { + supervisor: SupervisorFrontendPrefrences; + } +} + +export const fetchSupervisorFrontendPreferences = async ( + hass: HomeAssistant +): Promise => { + const stored = await fetchFrontendUserData(hass.connection, "supervisor"); + return stored || { snapshot_before_update: {} }; +}; + +export const saveSupervisorFrontendPreferences = ( + hass: HomeAssistant, + data: SupervisorFrontendPrefrences +) => saveFrontendUserData(hass.connection, "supervisor", data); + export const supervisorWSbaseCommand = { type: "supervisor/api", method: "GET",