diff --git a/src/panels/lovelace/editor/card-editor/hui-dialog-delete-card.ts b/src/panels/lovelace/editor/card-editor/hui-dialog-delete-card.ts new file mode 100644 index 0000000000..f1474cd03e --- /dev/null +++ b/src/panels/lovelace/editor/card-editor/hui-dialog-delete-card.ts @@ -0,0 +1,111 @@ +import { + css, + html, + LitElement, + TemplateResult, + CSSResultArray, + customElement, + property, + query, +} from "lit-element"; + +import "./hui-card-preview"; +import "../../../../components/dialog/ha-paper-dialog"; + +import deepFreeze from "deep-freeze"; + +// tslint:disable-next-line: no-duplicate-imports +import { HaPaperDialog } from "../../../../components/dialog/ha-paper-dialog"; +import { HomeAssistant } from "../../../../types"; +import { LovelaceCardConfig } from "../../../../data/lovelace"; +import { haStyleDialog } from "../../../../resources/styles"; +import { DeleteCardDialogParams } from "./show-delete-card-dialog"; +import { fireEvent } from "../../../../common/dom/fire_event"; + +@customElement("hui-dialog-delete-card") +export class HuiDialogDeleteCard extends LitElement { + @property() protected hass!: HomeAssistant; + @property() private _params?: DeleteCardDialogParams; + @property() private _cardConfig?: LovelaceCardConfig; + @query("ha-paper-dialog") private _dialog!: HaPaperDialog; + + public async showDialog(params: DeleteCardDialogParams): Promise { + this._params = params; + this._cardConfig = params.cardConfig; + if (!Object.isFrozen(this._cardConfig)) { + this._cardConfig = deepFreeze(this._cardConfig); + } + await this.updateComplete; + fireEvent(this._dialog as HTMLElement, "iron-resize"); + } + + protected render(): TemplateResult { + if (!this._params) { + return html``; + } + + return html` + +

+ ${this.hass.localize("ui.panel.lovelace.cards.confirm_delete")} +

+ + ${this._cardConfig + ? html` +
+ +
+ ` + : ""} +
+
+ + ${this.hass!.localize("ui.common.cancel")} + + + ${this.hass!.localize("ui.common.delete")} + +
+
+ `; + } + + static get styles(): CSSResultArray { + return [ + haStyleDialog, + css` + .element-preview { + position: relative; + } + hui-card-preview { + margin: 4px auto; + max-width: 500px; + display: block; + width: 100%; + } + `, + ]; + } + + private _close(): void { + this._params = undefined; + this._cardConfig = undefined; + } + + private _delete(): void { + if (!this._params?.deleteCard) { + return; + } + this._params.deleteCard(); + this._close(); + } +} + +declare global { + interface HTMLElementTagNameMap { + "hui-dialog-delete-card": HuiDialogDeleteCard; + } +} diff --git a/src/panels/lovelace/editor/card-editor/show-delete-card-dialog.ts b/src/panels/lovelace/editor/card-editor/show-delete-card-dialog.ts new file mode 100644 index 0000000000..6cfcf32e46 --- /dev/null +++ b/src/panels/lovelace/editor/card-editor/show-delete-card-dialog.ts @@ -0,0 +1,23 @@ +import { fireEvent } from "../../../../common/dom/fire_event"; +import { LovelaceCardConfig } from "../../../../data/lovelace"; + +export interface DeleteCardDialogParams { + deleteCard: () => void; + cardConfig?: LovelaceCardConfig; +} + +const importDeleteCardDialog = () => + import( + /* webpackChunkName: "hui-dialog-delete-card" */ "./hui-dialog-delete-card" + ); + +export const showDeleteCardDialog = ( + element: HTMLElement, + deleteCardDialogParams: DeleteCardDialogParams +): void => { + fireEvent(element, "show-dialog", { + dialogTag: "hui-dialog-delete-card", + dialogImport: importDeleteCardDialog, + dialogParams: deleteCardDialogParams, + }); +}; diff --git a/src/panels/lovelace/editor/delete-card.ts b/src/panels/lovelace/editor/delete-card.ts index 0d7baad0f5..04bada1b43 100644 --- a/src/panels/lovelace/editor/delete-card.ts +++ b/src/panels/lovelace/editor/delete-card.ts @@ -1,10 +1,9 @@ import { Lovelace } from "../types"; import { deleteCard } from "./config-util"; -import { - showAlertDialog, - showConfirmationDialog, -} from "../../../dialogs/generic/show-dialog-box"; +import { showAlertDialog } from "../../../dialogs/generic/show-dialog-box"; import { HomeAssistant } from "../../../types"; +import { showDeleteCardDialog } from "./card-editor/show-delete-card-dialog"; +import { showDeleteSuccessToast } from "../../../util/toast-deleted-success"; export async function confDeleteCard( element: HTMLElement, @@ -12,11 +11,13 @@ export async function confDeleteCard( lovelace: Lovelace, path: [number, number] ): Promise { - showConfirmationDialog(element, { - text: hass.localize("ui.panel.lovelace.cards.confirm_delete"), - confirm: async () => { + const cardConfig = lovelace.config.views[path[0]].cards![path[1]]; + showDeleteCardDialog(element, { + cardConfig, + deleteCard: async () => { try { await lovelace.saveConfig(deleteCard(lovelace.config, path)); + showDeleteSuccessToast(element, hass!); } catch (err) { showAlertDialog(element, { text: `Deleting failed: ${err.message}`, diff --git a/src/translations/en.json b/src/translations/en.json index b1b057d4dd..9307f0643d 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -519,11 +519,13 @@ "common": { "loading": "Loading", "cancel": "Cancel", + "delete": "Delete", "close": "Close", "save": "Save", "yes": "Yes", "no": "No", - "successfully_saved": "Successfully saved" + "successfully_saved": "Successfully saved", + "successfully_deleted": "Successfully deleted" }, "components": { "entity": { diff --git a/src/util/toast-deleted-success.ts b/src/util/toast-deleted-success.ts new file mode 100644 index 0000000000..6dcf0da4a8 --- /dev/null +++ b/src/util/toast-deleted-success.ts @@ -0,0 +1,7 @@ +import { showToast } from "./toast"; +import { HomeAssistant } from "../types"; + +export const showDeleteSuccessToast = (el: HTMLElement, hass: HomeAssistant) => + showToast(el, { + message: hass!.localize("ui.common.successfully_deleted"), + });