Disable repository removal if used for installed add-ons (#10922)

This commit is contained in:
Joakim Sørensen 2021-12-18 07:21:46 +01:00 committed by GitHub
parent 07cd68f5d0
commit 7d5b566312
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 44 additions and 11 deletions

View File

@ -1,5 +1,6 @@
import "@polymer/paper-tooltip/paper-tooltip";
import "@material/mwc-button/mwc-button"; import "@material/mwc-button/mwc-button";
import { mdiDelete } from "@mdi/js"; import { mdiDelete, mdiDeleteOff } from "@mdi/js";
import "@polymer/paper-input/paper-input"; import "@polymer/paper-input/paper-input";
import type { PaperInputElement } from "@polymer/paper-input/paper-input"; import type { PaperInputElement } from "@polymer/paper-input/paper-input";
import "@polymer/paper-item/paper-item"; import "@polymer/paper-item/paper-item";
@ -15,6 +16,7 @@ import { createCloseHeading } from "../../../../src/components/ha-dialog";
import "../../../../src/components/ha-icon-button"; import "../../../../src/components/ha-icon-button";
import { import {
fetchHassioAddonsInfo, fetchHassioAddonsInfo,
HassioAddonInfo,
HassioAddonRepository, HassioAddonRepository,
} from "../../../../src/data/hassio/addon"; } from "../../../../src/data/hassio/addon";
import { extractApiErrorMessage } from "../../../../src/data/hassio/common"; import { extractApiErrorMessage } from "../../../../src/data/hassio/common";
@ -60,11 +62,24 @@ class HassioRepositoriesDialog extends LitElement {
.sort((a, b) => caseInsensitiveStringCompare(a.name, b.name)) .sort((a, b) => caseInsensitiveStringCompare(a.name, b.name))
); );
private _filteredUsedRepositories = memoizeOne(
(repos: HassioAddonRepository[], addons: HassioAddonInfo[]) =>
repos
.filter((repo) =>
addons.some((addon) => addon.repository === repo.slug)
)
.map((repo) => repo.slug)
);
protected render(): TemplateResult { protected render(): TemplateResult {
if (!this._dialogParams?.supervisor || this._repositories === undefined) { if (!this._dialogParams?.supervisor || this._repositories === undefined) {
return html``; return html``;
} }
const repositories = this._filteredRepositories(this._repositories); const repositories = this._filteredRepositories(this._repositories);
const usedRepositories = this._filteredUsedRepositories(
repositories,
this._dialogParams.supervisor.supervisor.addons
);
return html` return html`
<ha-dialog <ha-dialog
.open=${this._opened} .open=${this._opened}
@ -89,18 +104,32 @@ class HassioRepositoriesDialog extends LitElement {
<div secondary>${repo.maintainer}</div> <div secondary>${repo.maintainer}</div>
<div secondary>${repo.url}</div> <div secondary>${repo.url}</div>
</paper-item-body> </paper-item-body>
<ha-icon-button <div class="delete">
.slug=${repo.slug} <ha-icon-button
.label=${this._dialogParams!.supervisor.localize( .disabled=${usedRepositories.includes(repo.slug)}
"dialog.repositories.remove" .slug=${repo.slug}
)} .path=${usedRepositories.includes(repo.slug)
.path=${mdiDelete} ? mdiDeleteOff
@click=${this._removeRepository} : mdiDelete}
></ha-icon-button> @click=${this._removeRepository}
>
</ha-icon-button>
<paper-tooltip
animation-delay="0"
position="bottom"
offset="1"
>
${this._dialogParams!.supervisor.localize(
usedRepositories.includes(repo.slug)
? "dialog.repositories.used"
: "dialog.repositories.remove"
)}
</paper-tooltip>
</div>
</paper-item> </paper-item>
` `
) )
: html` <paper-item> No repositories </paper-item> `} : html`<paper-item> No repositories </paper-item>`}
<div class="layout horizontal bottom"> <div class="layout horizontal bottom">
<paper-input <paper-input
class="flex-auto" class="flex-auto"
@ -157,6 +186,9 @@ class HassioRepositoriesDialog extends LitElement {
margin: 32px; margin: 32px;
text-align: center; text-align: center;
} }
div.delete ha-icon-button {
color: var(--error-color);
}
`, `,
]; ];
} }

View File

@ -4466,7 +4466,8 @@
"repositories": { "repositories": {
"title": "Manage add-on repositories", "title": "Manage add-on repositories",
"add": "Add", "add": "Add",
"remove": "Remove" "remove": "Remove",
"used": "Repository is in use for installed add-ons and can't be removed."
}, },
"restart_addon": { "restart_addon": {
"confirm_text": "Restart add-on", "confirm_text": "Restart add-on",