From 1b501907f1f9d30882d5829f614200bf107a4c1d Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 8 May 2025 00:18:26 -0500 Subject: [PATCH] Add a dialog to SSDP to show raw data (#25362) * Add a dialog to SSDP to show raw data * tweaks * Add a dialog to SSDP to show raw data * reduce * tweaks * Update src/panels/config/integrations/integration-panels/ssdp/dialog-ssdp-raw-data.ts Co-authored-by: Petar Petrov * Update src/panels/config/integrations/integration-panels/ssdp/dialog-ssdp-discovery-info.ts Co-authored-by: Petar Petrov * Update src/panels/config/integrations/integration-panels/ssdp/dialog-ssdp-discovery-info.ts Co-authored-by: Petar Petrov * add dump * preen --------- Co-authored-by: Petar Petrov --- .../ssdp/dialog-ssdp-discovery-info.ts | 26 ++++++- .../ssdp/dialog-ssdp-raw-data.ts | 68 +++++++++++++++++++ .../ssdp/show-dialog-ssdp-raw-data.ts | 19 ++++++ src/translations/en.json | 4 +- 4 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 src/panels/config/integrations/integration-panels/ssdp/dialog-ssdp-raw-data.ts create mode 100644 src/panels/config/integrations/integration-panels/ssdp/show-dialog-ssdp-raw-data.ts diff --git a/src/panels/config/integrations/integration-panels/ssdp/dialog-ssdp-discovery-info.ts b/src/panels/config/integrations/integration-panels/ssdp/dialog-ssdp-discovery-info.ts index f349b358a6..bfe1031932 100644 --- a/src/panels/config/integrations/integration-panels/ssdp/dialog-ssdp-discovery-info.ts +++ b/src/panels/config/integrations/integration-panels/ssdp/dialog-ssdp-discovery-info.ts @@ -9,6 +9,7 @@ import type { SSDPDiscoveryInfoDialogParams } from "./show-dialog-ssdp-discovery import "../../../../../components/ha-button"; import { showToast } from "../../../../../util/toast"; import { copyToClipboard } from "../../../../../common/util/copy-clipboard"; +import { showSSDPRawDataDialog } from "./show-dialog-ssdp-raw-data"; @customElement("dialog-ssdp-device-info") class DialogSSDPDiscoveryInfo extends LitElement implements HassDialog { @@ -39,6 +40,16 @@ class DialogSSDPDiscoveryInfo extends LitElement implements HassDialog { }); } + private _showRawData(key: string, data: Record) { + return (e: Event) => { + e.preventDefault(); + showSSDPRawDataDialog(this, { + key, + data, + }); + }; + } + protected render(): TemplateResult | typeof nothing { if (!this._params) { return nothing; @@ -83,7 +94,20 @@ class DialogSSDPDiscoveryInfo extends LitElement implements HassDialog { ([key, value]) => html` ${key} - ${value} + + ${typeof value === "object" && value !== null + ? html` + )} + >${this.hass.localize( + "ui.panel.config.ssdp.show_raw_data" + )}` + : value} + ` )} diff --git a/src/panels/config/integrations/integration-panels/ssdp/dialog-ssdp-raw-data.ts b/src/panels/config/integrations/integration-panels/ssdp/dialog-ssdp-raw-data.ts new file mode 100644 index 0000000000..6dade384c3 --- /dev/null +++ b/src/panels/config/integrations/integration-panels/ssdp/dialog-ssdp-raw-data.ts @@ -0,0 +1,68 @@ +import { LitElement, html, nothing, css } from "lit"; +import { customElement, property, state } from "lit/decorators"; +import type { TemplateResult } from "lit"; +import { dump } from "js-yaml"; +import { fireEvent } from "../../../../../common/dom/fire_event"; +import type { HassDialog } from "../../../../../dialogs/make-dialog-manager"; +import { createCloseHeading } from "../../../../../components/ha-dialog"; +import type { HomeAssistant } from "../../../../../types"; +import "../../../../../components/ha-code-editor"; + +export interface SSDPRawDataDialogParams { + key: string; + data: Record; +} + +@customElement("dialog-ssdp-raw-data") +class DialogSSDPRawData extends LitElement implements HassDialog { + @property({ attribute: false }) public hass!: HomeAssistant; + + @state() private _params?: SSDPRawDataDialogParams; + + public async showDialog(params: SSDPRawDataDialogParams): Promise { + this._params = params; + } + + public closeDialog(): boolean { + this._params = undefined; + fireEvent(this, "dialog-closed", { dialog: this.localName }); + return true; + } + + protected render(): TemplateResult | typeof nothing { + if (!this._params) { + return nothing; + } + + return html` + + + + `; + } + + static styles = css` + ha-code-editor { + --code-mirror-max-height: 60vh; + --code-mirror-height: auto; + } + `; +} + +declare global { + interface HTMLElementTagNameMap { + "dialog-ssdp-raw-data": DialogSSDPRawData; + } +} diff --git a/src/panels/config/integrations/integration-panels/ssdp/show-dialog-ssdp-raw-data.ts b/src/panels/config/integrations/integration-panels/ssdp/show-dialog-ssdp-raw-data.ts new file mode 100644 index 0000000000..32336a68fc --- /dev/null +++ b/src/panels/config/integrations/integration-panels/ssdp/show-dialog-ssdp-raw-data.ts @@ -0,0 +1,19 @@ +import { fireEvent } from "../../../../../common/dom/fire_event"; + +export interface SSDPRawDataDialogParams { + key: string; + data: Record; +} + +export const loadSSDPRawDataDialog = () => import("./dialog-ssdp-raw-data"); + +export const showSSDPRawDataDialog = ( + element: HTMLElement, + ssdpRawDataDialogParams: SSDPRawDataDialogParams +): void => { + fireEvent(element, "show-dialog", { + dialogTag: "dialog-ssdp-raw-data", + dialogImport: loadSSDPRawDataDialog, + dialogParams: ssdpRawDataDialogParams, + }); +}; diff --git a/src/translations/en.json b/src/translations/en.json index c1dab37384..04cf11e6cc 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -5587,7 +5587,9 @@ "upnp": "Universal Plug and Play (UPnP)", "discovery_information": "Discovery information", "copy_to_clipboard": "Copy to clipboard", - "no_devices_found": "No matching SSDP/UPnP discoveries found" + "no_devices_found": "No matching SSDP/UPnP discoveries found", + "show_raw_data": "Show raw data", + "raw_data_title": "Raw data" }, "zeroconf": { "name": "Name",