Only show local addons folder settings if at least one addon is local (#23333)

Only show local addons folder settings if an addon is local
This commit is contained in:
Paul Bottein 2024-12-19 14:29:35 +01:00 committed by GitHub
parent c022871ead
commit 3da13b823a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 46 additions and 64 deletions

View File

@ -30,6 +30,7 @@ export type FormData = {
database: boolean; database: boolean;
media: boolean; media: boolean;
share: boolean; share: boolean;
local_addons: boolean;
addons_mode: "all" | "custom" | "none"; addons_mode: "all" | "custom" | "none";
addons: string[]; addons: string[];
}; };
@ -39,6 +40,7 @@ const INITIAL_FORM_DATA: FormData = {
database: false, database: false,
media: false, media: false,
share: false, share: false,
local_addons: false,
addons_mode: "all", addons_mode: "all",
addons: [], addons: [],
}; };
@ -51,9 +53,6 @@ export type BackupConfigData = {
include_addons?: string[]; include_addons?: string[];
}; };
const SELF_CREATED_ADDONS_FOLDER = "addons/local";
const SELF_CREATED_ADDONS_NAME = "___LOCAL_ADDONS___";
@customElement("ha-backup-config-data") @customElement("ha-backup-config-data")
class HaBackupConfigData extends LitElement { class HaBackupConfigData extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant; @property({ attribute: false }) public hass!: HomeAssistant;
@ -86,14 +85,11 @@ class HaBackupConfigData extends LitElement {
private async _fetchAddons() { private async _fetchAddons() {
const { addons } = await fetchHassioAddonsInfo(this.hass); const { addons } = await fetchHassioAddonsInfo(this.hass);
this._addons = [ this._addons = addons;
...addons, }
{
name: "Self created add-ons", private _hasLocalAddons(addons: BackupAddonItem[]): boolean {
slug: SELF_CREATED_ADDONS_NAME, return addons.some((addon) => addon.slug === "local");
iconPath: mdiFolder,
},
];
} }
private _getData = memoizeOne( private _getData = memoizeOne(
@ -104,21 +100,14 @@ class HaBackupConfigData extends LitElement {
const config = value; const config = value;
const hasLocalAddonFolder = config.include_folders?.includes(
SELF_CREATED_ADDONS_FOLDER
);
const addons = config.include_addons?.slice() ?? []; const addons = config.include_addons?.slice() ?? [];
if (hasLocalAddonFolder && !value.include_all_addons) {
addons.push(SELF_CREATED_ADDONS_NAME);
}
return { return {
homeassistant: config.include_homeassistant || this.forceHomeAssistant, homeassistant: config.include_homeassistant || this.forceHomeAssistant,
database: config.include_database, database: config.include_database,
media: config.include_folders?.includes("media") || false, media: config.include_folders?.includes("media") || false,
share: config.include_folders?.includes("share") || false, share: config.include_folders?.includes("share") || false,
local_addons: config.include_folders?.includes("addons/local") || false,
addons_mode: config.include_all_addons addons_mode: config.include_all_addons
? "all" ? "all"
: addons.length > 0 || showAddon : addons.length > 0 || showAddon
@ -130,21 +119,13 @@ class HaBackupConfigData extends LitElement {
); );
private _setData(data: FormData) { private _setData(data: FormData) {
const hasSelfCreatedAddons = data.addons.includes(SELF_CREATED_ADDONS_NAME);
const include_folders = [ const include_folders = [
...(data.media ? ["media"] : []), ...(data.media ? ["media"] : []),
...(data.share ? ["share"] : []), ...(data.share ? ["share"] : []),
...(data.local_addons ? ["addons/local"] : []),
]; ];
let include_addons = data.addons_mode === "custom" ? data.addons : []; const 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
);
}
this.value = { this.value = {
include_homeassistant: data.homeassistant || this.forceHomeAssistant, include_homeassistant: data.homeassistant || this.forceHomeAssistant,
@ -234,6 +215,26 @@ class HaBackupConfigData extends LitElement {
></ha-switch> ></ha-switch>
</ha-md-list-item> </ha-md-list-item>
${this._hasLocalAddons(this._addons)
? html`
<ha-md-list-item>
<ha-svg-icon
slot="start"
.path=${mdiFolder}
></ha-svg-icon>
<span slot="headline">Local addons folder</span>
<span slot="supporting-text">
Folder that contains the data of your local add-ons.
</span>
<ha-switch
id="local_addons"
slot="end"
@change=${this._switchChanged}
.checked=${data.local_addons}
></ha-switch>
</ha-md-list-item>
`
: nothing}
${this._addons.length ${this._addons.length
? html` ? html`
<ha-md-list-item> <ha-md-list-item>

View File

@ -31,9 +31,6 @@ type CheckBoxItem = {
version?: string; version?: string;
}; };
const SELF_CREATED_ADDONS_FOLDER = "addons/local";
const SELF_CREATED_ADDONS_NAME = "___LOCAL_ADDONS___";
const ITEM_ICONS = { const ITEM_ICONS = {
config: mdiCog, config: mdiCog,
database: mdiChartBox, database: mdiChartBox,
@ -91,13 +88,9 @@ export class HaBackupDataPicker extends LitElement {
id: "database", id: "database",
}); });
} }
// Filter out the local add-ons folder
const folders = data.folders.filter(
(folder) => folder !== SELF_CREATED_ADDONS_FOLDER
);
items.push( items.push(
...folders.map<CheckBoxItem>((folder) => ({ ...data.folders.map<CheckBoxItem>((folder) => ({
label: capitalizeFirstLetter(folder), label: this._localizeFolder(folder),
id: 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( private _addonsItems = memoizeOne(
( (
data: BackupData, data: BackupData,
_localize: LocalizeFunc, _localize: LocalizeFunc,
addonIcons: Record<string, boolean> addonIcons: Record<string, boolean>
) => { ) =>
const items = data.addons.map<BackupAddonItem>((addon) => ({ data.addons.map<BackupAddonItem>((addon) => ({
name: addon.name, name: addon.name,
slug: addon.slug, slug: addon.slug,
version: addon.version, version: addon.version,
icon: addonIcons[addon.slug], 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 => { private _parseValue = memoizeOne((value?: BackupData): SelectedItems => {
@ -148,13 +136,9 @@ export class HaBackupDataPicker extends LitElement {
homeassistant.push("database"); homeassistant.push("database");
} }
let folders = [...value.folders]; const 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);
}
homeassistant.push(...folders); homeassistant.push(...folders);
const addonsList = value.addons.map((addon) => addon.slug);
addons.push(...addonsList); addons.push(...addonsList);
return { return {
@ -171,11 +155,8 @@ export class HaBackupDataPicker extends LitElement {
addons: data.addons.filter((addon) => addons: data.addons.filter((addon) =>
selectedItems.addons.includes(addon.slug) selectedItems.addons.includes(addon.slug)
), ),
folders: data.folders.filter( folders: data.folders.filter((folder) =>
(folder) => selectedItems.homeassistant.includes(folder)
selectedItems.homeassistant.includes(folder) ||
(selectedItems.addons.includes(folder) &&
folder === SELF_CREATED_ADDONS_FOLDER)
), ),
}) })
); );