diff --git a/cast/src/receiver/layout/hc-lovelace.ts b/cast/src/receiver/layout/hc-lovelace.ts index 3499eb5bb1..010979e32d 100644 --- a/cast/src/receiver/layout/hc-lovelace.ts +++ b/cast/src/receiver/layout/hc-lovelace.ts @@ -45,6 +45,7 @@ class HcLovelace extends LitElement { saveConfig: async () => undefined, deleteConfig: async () => undefined, setEditMode: () => undefined, + showToast: () => undefined, }; return html` ` + ? html` + + ` : nothing} `; diff --git a/src/panels/energy/ha-panel-energy.ts b/src/panels/energy/ha-panel-energy.ts index 87b9a2f248..dfc7458466 100644 --- a/src/panels/energy/ha-panel-energy.ts +++ b/src/panels/energy/ha-panel-energy.ts @@ -131,6 +131,7 @@ class PanelEnergy extends LitElement { saveConfig: async () => undefined, deleteConfig: async () => undefined, setEditMode: () => undefined, + showToast: () => undefined, }; } diff --git a/src/panels/lovelace/components/hui-badge-edit-mode.ts b/src/panels/lovelace/components/hui-badge-edit-mode.ts index 2614344085..b71221a78c 100644 --- a/src/panels/lovelace/components/hui-badge-edit-mode.ts +++ b/src/panels/lovelace/components/hui-badge-edit-mode.ts @@ -206,7 +206,7 @@ export class HuiBadgeEditMode extends LitElement { private _cutBadge(): void { this._copyBadge(); - this._deleteBadge(); + fireEvent(this, "ll-delete-badge", { path: this.path!, silent: true }); } private _copyBadge(): void { @@ -232,7 +232,7 @@ export class HuiBadgeEditMode extends LitElement { } private _deleteBadge(): void { - fireEvent(this, "ll-delete-badge", { path: this.path! }); + fireEvent(this, "ll-delete-badge", { path: this.path!, silent: false }); } static get styles(): CSSResultGroup { diff --git a/src/panels/lovelace/components/hui-card-edit-mode.ts b/src/panels/lovelace/components/hui-card-edit-mode.ts index 605cae0a55..4ae11e335a 100644 --- a/src/panels/lovelace/components/hui-card-edit-mode.ts +++ b/src/panels/lovelace/components/hui-card-edit-mode.ts @@ -199,7 +199,7 @@ export class HuiCardEditMode extends LitElement { this._cutCard(); break; case 4: - this._deleteCard(true); + this._deleteCard(); break; } } @@ -222,7 +222,7 @@ export class HuiCardEditMode extends LitElement { private _cutCard(): void { this._copyCard(); - this._deleteCard(false); + fireEvent(this, "ll-delete-card", { path: this.path!, silent: true }); } private _copyCard(): void { @@ -231,8 +231,8 @@ export class HuiCardEditMode extends LitElement { this._clipboard = deepClone(cardConfig); } - private _deleteCard(confirm: boolean): void { - fireEvent(this, "ll-delete-card", { path: this.path!, confirm }); + private _deleteCard(): void { + fireEvent(this, "ll-delete-card", { path: this.path!, silent: false }); } static get styles(): CSSResultGroup { diff --git a/src/panels/lovelace/components/hui-card-options.ts b/src/panels/lovelace/components/hui-card-options.ts index 16e14f5d82..c5c5d8cc67 100644 --- a/src/panels/lovelace/components/hui-card-options.ts +++ b/src/panels/lovelace/components/hui-card-options.ts @@ -274,7 +274,7 @@ export class HuiCardOptions extends LitElement { this._cutCard(); break; case 4: - this._deleteCard(true); + this._deleteCard({ silent: false }); break; } } @@ -297,7 +297,7 @@ export class HuiCardOptions extends LitElement { private _cutCard(): void { this._copyCard(); - this._deleteCard(false); + this._deleteCard({ silent: true }); } private _copyCard(): void { @@ -395,8 +395,8 @@ export class HuiCardOptions extends LitElement { }); } - private _deleteCard(confirm: boolean): void { - fireEvent(this, "ll-delete-card", { path: this.path!, confirm }); + private _deleteCard({ silent }: { silent: boolean }): void { + fireEvent(this, "ll-delete-card", { path: this.path!, silent }); } } diff --git a/src/panels/lovelace/editor/delete-badge.ts b/src/panels/lovelace/editor/delete-badge.ts new file mode 100644 index 0000000000..639096a957 --- /dev/null +++ b/src/panels/lovelace/editor/delete-badge.ts @@ -0,0 +1,39 @@ +import type { HomeAssistant } from "../../../types"; +import { Lovelace } from "../types"; +import { deleteBadge } from "./config-util"; +import type { LovelaceCardPath } from "./lovelace-path"; + +export type DeleteBadgeParams = { path: LovelaceCardPath; silent: boolean }; + +export async function performDeleteBadge( + hass: HomeAssistant, + lovelace: Lovelace, + params: DeleteBadgeParams +): Promise { + try { + const { path, silent } = params; + const oldConfig = lovelace.config; + const newConfig = deleteBadge(oldConfig, path); + await lovelace.saveConfig(newConfig); + + if (silent) { + return; + } + + const action = async () => { + lovelace.saveConfig(oldConfig); + }; + + lovelace.showToast({ + message: hass.localize("ui.common.successfully_deleted"), + duration: 8000, + action: { action, text: hass.localize("ui.common.undo") }, + }); + } catch (err: any) { + // eslint-disable-next-line no-console + console.error(err); + lovelace.showToast({ + message: hass.localize("ui.common.deleting_failed"), + }); + } +} diff --git a/src/panels/lovelace/editor/delete-card.ts b/src/panels/lovelace/editor/delete-card.ts index f3264bc023..f83a3063d6 100644 --- a/src/panels/lovelace/editor/delete-card.ts +++ b/src/panels/lovelace/editor/delete-card.ts @@ -1,44 +1,39 @@ -import { showAlertDialog } from "../../../dialogs/generic/show-dialog-box"; import { HomeAssistant } from "../../../types"; -import { showDeleteSuccessToast } from "../../../util/toast-deleted-success"; import { Lovelace } from "../types"; -import { showDeleteCardDialog } from "./card-editor/show-delete-card-dialog"; -import { deleteCard, insertCard } from "./config-util"; -import { - LovelaceCardPath, - findLovelaceContainer, - getLovelaceContainerPath, - parseLovelaceCardPath, -} from "./lovelace-path"; +import { deleteCard } from "./config-util"; +import type { LovelaceCardPath } from "./lovelace-path"; -export async function confDeleteCard( - element: HTMLElement, +export type DeleteCardParams = { path: LovelaceCardPath; silent: boolean }; + +export async function performDeleteCard( hass: HomeAssistant, lovelace: Lovelace, - path: LovelaceCardPath + params: DeleteCardParams ): Promise { - const containerPath = getLovelaceContainerPath(path); - const { cardIndex } = parseLovelaceCardPath(path); - const containerConfig = findLovelaceContainer(lovelace.config, containerPath); - if ("strategy" in containerConfig) { - throw new Error("Deleting cards in a strategy is not supported."); + try { + const { path, silent } = params; + const oldConfig = lovelace.config; + const newConfig = deleteCard(oldConfig, path); + await lovelace.saveConfig(newConfig); + + if (silent) { + return; + } + + const action = async () => { + lovelace.saveConfig(oldConfig); + }; + + lovelace.showToast({ + message: hass.localize("ui.common.successfully_deleted"), + duration: 8000, + action: { action, text: hass.localize("ui.common.undo") }, + }); + } catch (err: any) { + // eslint-disable-next-line no-console + console.error(err); + lovelace.showToast({ + message: hass.localize("ui.common.deleting_failed"), + }); } - const cardConfig = containerConfig.cards![cardIndex]; - showDeleteCardDialog(element, { - cardConfig, - deleteCard: async () => { - try { - const newLovelace = deleteCard(lovelace.config, path); - await lovelace.saveConfig(newLovelace); - const action = async () => { - await lovelace.saveConfig(insertCard(newLovelace, path, cardConfig)); - }; - showDeleteSuccessToast(element, hass!, action); - } catch (err: any) { - showAlertDialog(element, { - text: `Deleting failed: ${err.message}`, - }); - } - }, - }); } diff --git a/src/panels/lovelace/ha-panel-lovelace.ts b/src/panels/lovelace/ha-panel-lovelace.ts index 7d8e53cf09..8e7ded7a8a 100644 --- a/src/panels/lovelace/ha-panel-lovelace.ts +++ b/src/panels/lovelace/ha-panel-lovelace.ts @@ -23,10 +23,11 @@ import { fetchResources } from "../../data/lovelace/resource"; import { WindowWithPreloads } from "../../data/preloads"; import "../../layouts/hass-error-screen"; import "../../layouts/hass-loading-screen"; +import type { ShowToastParams } from "../../managers/notification-manager"; import { HomeAssistant, PanelInfo, Route } from "../../types"; import { showToast } from "../../util/toast"; -import { loadLovelaceResources } from "./common/load-resources"; import { checkLovelaceConfig } from "./common/check-lovelace-config"; +import { loadLovelaceResources } from "./common/load-resources"; import { showSaveDialog } from "./editor/show-save-config-dialog"; import "./hui-root"; import { generateLovelaceDashboardStrategy } from "./strategies/get-strategy"; @@ -434,6 +435,7 @@ export class LovelacePanel extends LitElement { throw err; } }, + showToast: (params: ShowToastParams) => showToast(this, params), }; } diff --git a/src/panels/lovelace/sections/hui-section.ts b/src/panels/lovelace/sections/hui-section.ts index 07dc7a78f8..cf8850393e 100644 --- a/src/panels/lovelace/sections/hui-section.ts +++ b/src/panels/lovelace/sections/hui-section.ts @@ -20,8 +20,7 @@ import { import { createSectionElement } from "../create-element/create-section-element"; import { showCreateCardDialog } from "../editor/card-editor/show-create-card-dialog"; import { showEditCardDialog } from "../editor/card-editor/show-edit-card-dialog"; -import { deleteCard } from "../editor/config-util"; -import { confDeleteCard } from "../editor/delete-card"; +import { performDeleteCard } from "../editor/delete-card"; import { parseLovelaceCardPath } from "../editor/lovelace-path"; import { generateLovelaceSectionStrategy } from "../strategies/get-strategy"; import type { Lovelace } from "../types"; @@ -257,12 +256,7 @@ export class HuiSection extends ReactiveElement { this._layoutElement.addEventListener("ll-delete-card", (ev) => { ev.stopPropagation(); if (!this.lovelace) return; - if (ev.detail.confirm) { - confDeleteCard(this, this.hass!, this.lovelace!, ev.detail.path); - } else { - const newLovelace = deleteCard(this.lovelace!.config, ev.detail.path); - this.lovelace.saveConfig(newLovelace); - } + performDeleteCard(this.hass, this.lovelace, ev.detail); }); } diff --git a/src/panels/lovelace/types.ts b/src/panels/lovelace/types.ts index 7a30f3e1f8..4f8ec893e1 100644 --- a/src/panels/lovelace/types.ts +++ b/src/panels/lovelace/types.ts @@ -14,6 +14,7 @@ import { LovelaceHeaderFooterConfig } from "./header-footer/types"; import { LovelaceCardFeatureConfig } from "./card-features/types"; import { LovelaceElement, LovelaceElementConfig } from "./elements/types"; import { LovelaceHeadingBadgeConfig } from "./heading-badges/types"; +import type { ShowToastParams } from "../../managers/notification-manager"; declare global { // eslint-disable-next-line @@ -35,6 +36,7 @@ export interface Lovelace { setEditMode: (editMode: boolean) => void; saveConfig: (newConfig: LovelaceRawConfig) => Promise; deleteConfig: () => Promise; + showToast: (params: ShowToastParams) => void; } export interface LovelaceBadge extends HTMLElement { diff --git a/src/panels/lovelace/views/hui-view.ts b/src/panels/lovelace/views/hui-view.ts index cdbb6b31c5..397be95d51 100644 --- a/src/panels/lovelace/views/hui-view.ts +++ b/src/panels/lovelace/views/hui-view.ts @@ -25,8 +25,14 @@ import { showCreateBadgeDialog } from "../editor/badge-editor/show-create-badge- import { showEditBadgeDialog } from "../editor/badge-editor/show-edit-badge-dialog"; import { showCreateCardDialog } from "../editor/card-editor/show-create-card-dialog"; import { showEditCardDialog } from "../editor/card-editor/show-edit-card-dialog"; -import { deleteBadge, deleteCard } from "../editor/config-util"; -import { confDeleteCard } from "../editor/delete-card"; +import { + type DeleteBadgeParams, + performDeleteBadge, +} from "../editor/delete-badge"; +import { + type DeleteCardParams, + performDeleteCard, +} from "../editor/delete-card"; import { LovelaceCardPath, parseLovelaceCardPath, @@ -43,10 +49,10 @@ declare global { interface HASSDomEvents { "ll-create-card": { suggested?: string[] } | undefined; "ll-edit-card": { path: LovelaceCardPath }; - "ll-delete-card": { path: LovelaceCardPath; confirm: boolean }; + "ll-delete-card": DeleteCardParams; "ll-create-badge": undefined; "ll-edit-badge": { path: LovelaceCardPath }; - "ll-delete-badge": { path: LovelaceCardPath }; + "ll-delete-badge": DeleteBadgeParams; } interface HTMLElementEventMap { "ll-create-card": HASSDomEvent; @@ -322,12 +328,8 @@ export class HUIView extends ReactiveElement { }); }); this._layoutElement.addEventListener("ll-delete-card", (ev) => { - if (ev.detail.confirm) { - confDeleteCard(this, this.hass!, this.lovelace!, ev.detail.path); - } else { - const newLovelace = deleteCard(this.lovelace!.config, ev.detail.path); - this.lovelace.saveConfig(newLovelace); - } + if (!this.lovelace) return; + performDeleteCard(this.hass, this.lovelace, ev.detail); }); this._layoutElement.addEventListener("ll-create-badge", async () => { showCreateBadgeDialog(this, { @@ -345,9 +347,9 @@ export class HUIView extends ReactiveElement { badgeIndex: cardIndex, }); }); - this._layoutElement.addEventListener("ll-delete-badge", (ev) => { - const newLovelace = deleteBadge(this.lovelace!.config, ev.detail.path); - this.lovelace.saveConfig(newLovelace); + this._layoutElement.addEventListener("ll-delete-badge", async (ev) => { + if (!this.lovelace) return; + performDeleteBadge(this.hass, this.lovelace, ev.detail); }); } diff --git a/src/state/disconnect-toast-mixin.ts b/src/state/disconnect-toast-mixin.ts index 08fdbe676c..133bd0a7ca 100644 --- a/src/state/disconnect-toast-mixin.ts +++ b/src/state/disconnect-toast-mixin.ts @@ -143,6 +143,7 @@ export default >(superClass: T) => )[0][0]; showToast(this, { + id: "integration_starting", message: this.hass!.localize("ui.notification_toast.integration_starting", { integration: domainToName(this.hass!.localize, integration), diff --git a/src/translations/en.json b/src/translations/en.json index 2ce00791f7..1f19643304 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -362,6 +362,7 @@ "help": "Help", "successfully_saved": "Successfully saved", "successfully_deleted": "Successfully deleted", + "deleting_failed": "Deleting failed", "error_required": "Required", "copied": "Copied", "copied_clipboard": "Copied to clipboard", diff --git a/src/util/toast-deleted-success.ts b/src/util/toast-deleted-success.ts deleted file mode 100644 index 046e099fec..0000000000 --- a/src/util/toast-deleted-success.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { ShowToastParams } from "../managers/notification-manager"; -import { HomeAssistant } from "../types"; -import { showToast } from "./toast"; - -export const showDeleteSuccessToast = ( - el: HTMLElement, - hass: HomeAssistant, - action?: () => void -) => { - const toastParams: ShowToastParams = { - message: hass!.localize("ui.common.successfully_deleted"), - }; - - if (action) { - toastParams.action = { action, text: hass!.localize("ui.common.undo") }; - } - - showToast(el, toastParams); -};