diff --git a/src/panels/config/backup/components/ha-backup-config-data.ts b/src/panels/config/backup/components/ha-backup-config-data.ts index 699421d4b6..8af0ab046c 100644 --- a/src/panels/config/backup/components/ha-backup-config-data.ts +++ b/src/panels/config/backup/components/ha-backup-config-data.ts @@ -30,6 +30,7 @@ export type FormData = { database: boolean; media: boolean; share: boolean; + local_addons: boolean; addons_mode: "all" | "custom" | "none"; addons: string[]; }; @@ -39,6 +40,7 @@ const INITIAL_FORM_DATA: FormData = { database: false, media: false, share: false, + local_addons: false, addons_mode: "all", addons: [], }; @@ -51,9 +53,6 @@ export type BackupConfigData = { include_addons?: string[]; }; -const SELF_CREATED_ADDONS_FOLDER = "addons/local"; -const SELF_CREATED_ADDONS_NAME = "___LOCAL_ADDONS___"; - @customElement("ha-backup-config-data") class HaBackupConfigData extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; @@ -86,14 +85,11 @@ class HaBackupConfigData extends LitElement { private async _fetchAddons() { const { addons } = await fetchHassioAddonsInfo(this.hass); - this._addons = [ - ...addons, - { - name: "Self created add-ons", - slug: SELF_CREATED_ADDONS_NAME, - iconPath: mdiFolder, - }, - ]; + this._addons = addons; + } + + private _hasLocalAddons(addons: BackupAddonItem[]): boolean { + return addons.some((addon) => addon.slug === "local"); } private _getData = memoizeOne( @@ -104,21 +100,14 @@ class HaBackupConfigData extends LitElement { const config = value; - const hasLocalAddonFolder = config.include_folders?.includes( - SELF_CREATED_ADDONS_FOLDER - ); - const addons = config.include_addons?.slice() ?? []; - if (hasLocalAddonFolder && !value.include_all_addons) { - addons.push(SELF_CREATED_ADDONS_NAME); - } - return { homeassistant: config.include_homeassistant || this.forceHomeAssistant, database: config.include_database, media: config.include_folders?.includes("media") || false, share: config.include_folders?.includes("share") || false, + local_addons: config.include_folders?.includes("addons/local") || false, addons_mode: config.include_all_addons ? "all" : addons.length > 0 || showAddon @@ -130,21 +119,13 @@ class HaBackupConfigData extends LitElement { ); private _setData(data: FormData) { - const hasSelfCreatedAddons = data.addons.includes(SELF_CREATED_ADDONS_NAME); - const include_folders = [ ...(data.media ? ["media"] : []), ...(data.share ? ["share"] : []), + ...(data.local_addons ? ["addons/local"] : []), ]; - let include_addons = data.addons_mode === "custom" ? data.addons : []; - - if (hasSelfCreatedAddons || data.addons_mode === "all") { - include_folders.push(SELF_CREATED_ADDONS_FOLDER); - include_addons = include_addons.filter( - (addon) => addon !== SELF_CREATED_ADDONS_NAME - ); - } + const include_addons = data.addons_mode === "custom" ? data.addons : []; this.value = { include_homeassistant: data.homeassistant || this.forceHomeAssistant, @@ -234,6 +215,26 @@ class HaBackupConfigData extends LitElement { > + ${this._hasLocalAddons(this._addons) + ? html` + + + Local addons folder + + Folder that contains the data of your local add-ons. + + + + ` + : nothing} ${this._addons.length ? html` diff --git a/src/panels/config/backup/components/ha-backup-data-picker.ts b/src/panels/config/backup/components/ha-backup-data-picker.ts index f2d27c7a81..9f98ca6267 100644 --- a/src/panels/config/backup/components/ha-backup-data-picker.ts +++ b/src/panels/config/backup/components/ha-backup-data-picker.ts @@ -31,9 +31,6 @@ type CheckBoxItem = { version?: string; }; -const SELF_CREATED_ADDONS_FOLDER = "addons/local"; -const SELF_CREATED_ADDONS_NAME = "___LOCAL_ADDONS___"; - const ITEM_ICONS = { config: mdiCog, database: mdiChartBox, @@ -91,13 +88,9 @@ export class HaBackupDataPicker extends LitElement { id: "database", }); } - // Filter out the local add-ons folder - const folders = data.folders.filter( - (folder) => folder !== SELF_CREATED_ADDONS_FOLDER - ); items.push( - ...folders.map((folder) => ({ - label: capitalizeFirstLetter(folder), + ...data.folders.map((folder) => ({ + label: this._localizeFolder(folder), id: folder, })) ); @@ -105,30 +98,25 @@ export class HaBackupDataPicker extends LitElement { } ); + private _localizeFolder(folder: string): string { + if (folder === "addons/local") { + return "Local addons"; + } + return capitalizeFirstLetter(folder); + } + private _addonsItems = memoizeOne( ( data: BackupData, _localize: LocalizeFunc, addonIcons: Record - ) => { - const items = data.addons.map((addon) => ({ + ) => + data.addons.map((addon) => ({ name: addon.name, slug: addon.slug, version: addon.version, icon: addonIcons[addon.slug], - })); - - // Add local add-ons folder in addons items - if (data.folders.includes(SELF_CREATED_ADDONS_FOLDER)) { - items.push({ - name: "Self created add-ons", - slug: SELF_CREATED_ADDONS_NAME, - iconPath: mdiFolder, - }); - } - - return items; - } + })) ); private _parseValue = memoizeOne((value?: BackupData): SelectedItems => { @@ -148,13 +136,9 @@ export class HaBackupDataPicker extends LitElement { homeassistant.push("database"); } - let folders = [...value.folders]; - const addonsList = value.addons.map((addon) => addon.slug); - if (folders.includes(SELF_CREATED_ADDONS_FOLDER)) { - folders = folders.filter((f) => f !== SELF_CREATED_ADDONS_FOLDER); - addonsList.push(SELF_CREATED_ADDONS_NAME); - } + const folders = value.folders; homeassistant.push(...folders); + const addonsList = value.addons.map((addon) => addon.slug); addons.push(...addonsList); return { @@ -171,11 +155,8 @@ export class HaBackupDataPicker extends LitElement { addons: data.addons.filter((addon) => selectedItems.addons.includes(addon.slug) ), - folders: data.folders.filter( - (folder) => - selectedItems.homeassistant.includes(folder) || - (selectedItems.addons.includes(folder) && - folder === SELF_CREATED_ADDONS_FOLDER) + folders: data.folders.filter((folder) => + selectedItems.homeassistant.includes(folder) ), }) );