import { mdiFolder, mdiHomeAssistant, mdiPuzzle } from "@mdi/js"; import { PaperInputElement } from "@polymer/paper-input/paper-input"; import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; import { customElement, property, query } from "lit/decorators"; import { atLeastVersion } from "../../../src/common/config/version"; import { formatDate } from "../../../src/common/datetime/format_date"; import { formatDateTime } from "../../../src/common/datetime/format_date_time"; import { LocalizeFunc } from "../../../src/common/translations/localize"; import "../../../src/components/ha-checkbox"; import "../../../src/components/ha-formfield"; import "../../../src/components/ha-radio"; import type { HaRadio } from "../../../src/components/ha-radio"; import { HassioFullBackupCreateParams, HassioPartialBackupCreateParams, HassioBackupDetail, } from "../../../src/data/hassio/backup"; import { Supervisor } from "../../../src/data/supervisor/supervisor"; import { PolymerChangedEvent } from "../../../src/polymer-types"; import { HomeAssistant, TranslationDict } from "../../../src/types"; import "./supervisor-formfield-label"; type BackupOrRestoreKey = keyof TranslationDict["supervisor"]["backup"] & keyof TranslationDict["ui"]["panel"]["page-onboarding"]["restore"]; interface CheckboxItem { slug: string; checked: boolean; name: string; } interface AddonCheckboxItem extends CheckboxItem { version: string; } const _computeFolders = (folders): CheckboxItem[] => { const list: CheckboxItem[] = []; if (folders.includes("ssl")) { list.push({ slug: "ssl", name: "SSL", checked: false }); } if (folders.includes("share")) { list.push({ slug: "share", name: "Share", checked: false }); } if (folders.includes("media")) { list.push({ slug: "media", name: "Media", checked: false }); } if (folders.includes("addons/local")) { list.push({ slug: "addons/local", name: "Local add-ons", checked: false }); } return list.sort((a, b) => (a.name > b.name ? 1 : -1)); }; const _computeAddons = (addons): AddonCheckboxItem[] => addons .map((addon) => ({ slug: addon.slug, name: addon.name, version: addon.version, checked: false, })) .sort((a, b) => (a.name > b.name ? 1 : -1)); @customElement("supervisor-backup-content") export class SupervisorBackupContent extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; @property() public localize?: LocalizeFunc; @property({ attribute: false }) public supervisor?: Supervisor; @property({ attribute: false }) public backup?: HassioBackupDetail; @property() public backupType: HassioBackupDetail["type"] = "full"; @property({ attribute: false }) public folders?: CheckboxItem[]; @property({ attribute: false }) public addons?: AddonCheckboxItem[]; @property({ type: Boolean }) public homeAssistant = false; @property({ type: Boolean }) public backupHasPassword = false; @property({ type: Boolean }) public onboarding = false; @property() public backupName = ""; @property() public backupPassword = ""; @property() public confirmBackupPassword = ""; @query("paper-input, ha-radio, ha-checkbox", true) private _focusTarget; public willUpdate(changedProps) { super.willUpdate(changedProps); if (!this.hasUpdated) { this.folders = _computeFolders( this.backup ? this.backup.folders : ["ssl", "share", "media", "addons/local"] ); this.addons = _computeAddons( this.backup ? this.backup.addons : this.supervisor?.addon.addons ); this.backupType = this.backup?.type || "full"; this.backupName = this.backup?.name || ""; this.backupHasPassword = this.backup?.protected || false; } } public override focus() { this._focusTarget?.focus(); } private _localize = (key: BackupOrRestoreKey) => this.supervisor?.localize(`backup.${key}`) || this.localize!(`ui.panel.page-onboarding.restore.${key}`); protected render(): TemplateResult { if (!this.onboarding && !this.supervisor) { return html``; } const foldersSection = this.backupType === "partial" ? this._getSection("folders") : undefined; const addonsSection = this.backupType === "partial" ? this._getSection("addons") : undefined; return html` ${this.backup ? html`