/** * @license * Copyright 2026 Open Home Foundation * SPDX-License-Identifier: Apache-2.0 */ import "@material/web/button/text-button"; import "@material/web/dialog/dialog"; import "@material/web/textfield/outlined-text-field"; import type { MdDialog } from "@material/web/dialog/dialog.js"; import type { MatterClient, MatterNode } from "@matter-server/ws-client"; import { html, LitElement } from "lit"; import { customElement, property, state } from "lit/decorators.js"; import { MAX_NODE_LABEL_LENGTH, writeNodeLabel } from "../../../util/node-label.js"; import { preventDefault } from "../../../util/prevent_default.js"; import { showAlertDialog } from "../../dialog-box/show-dialog-box.js"; @customElement("node-label-dialog") export class NodeLabelDialog extends LitElement { @property({ attribute: false }) public client!: MatterClient; @property({ attribute: false }) public node!: MatterNode; @state() private _nodeLabel: string = ""; @state() private _saving: boolean = false; protected override firstUpdated() { this._nodeLabel = this.node.nodeLabel; } protected override render() { return html`
Edit Node Label
Cancel Save
`; } private _handleInput(e: Event) { const input = e.target as HTMLInputElement; this._nodeLabel = input.value; } private _close() { this.shadowRoot!.querySelector("md-dialog")!.close(); } private _handleClosed() { this.parentNode!.removeChild(this); } private async _save() { this._saving = true; try { await writeNodeLabel(this.client, this.node, this._nodeLabel); this._close(); } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); showAlertDialog({ title: "Failed to set node label", text: errorMessage, }); } finally { this._saving = false; } } } declare global { interface HTMLElementTagNameMap { "node-label-dialog": NodeLabelDialog; } }