From 68517018cc8d99872546495f018103a600831255 Mon Sep 17 00:00:00 2001 From: Zack Barett Date: Wed, 27 Jul 2022 03:47:03 -0500 Subject: [PATCH] Add IP Information Dialog (#13283) Co-authored-by: Bram Kragten --- src/panels/config/network/dialog-ip-detail.ts | 91 +++++++++++++++++++ .../config/network/show-ip-detail-dialog.ts | 19 ++++ .../config/network/supervisor-network.ts | 23 ++++- 3 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 src/panels/config/network/dialog-ip-detail.ts create mode 100644 src/panels/config/network/show-ip-detail-dialog.ts diff --git a/src/panels/config/network/dialog-ip-detail.ts b/src/panels/config/network/dialog-ip-detail.ts new file mode 100644 index 0000000000..7a8e293f0d --- /dev/null +++ b/src/panels/config/network/dialog-ip-detail.ts @@ -0,0 +1,91 @@ +import "@material/mwc-button/mwc-button"; +import { CSSResultGroup, html, LitElement, TemplateResult } from "lit"; +import { customElement, property, state } from "lit/decorators"; +import { fireEvent } from "../../../common/dom/fire_event"; +import { createCloseHeading } from "../../../components/ha-dialog"; +import type { NetworkInterface } from "../../../data/hassio/network"; +import { haStyleDialog } from "../../../resources/styles"; +import type { HomeAssistant } from "../../../types"; +import type { IPDetailDialogParams } from "./show-ip-detail-dialog"; + +@customElement("dialog-ip-detail") +class DialogIPDetail extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @state() private _params?: IPDetailDialogParams; + + @state() private _interface?: NetworkInterface; + + public showDialog(params: IPDetailDialogParams): void { + this._params = params; + this._interface = this._params.interface; + } + + public closeDialog() { + this._params = undefined; + this._interface = undefined; + fireEvent(this, "dialog-closed", { dialog: this.localName }); + } + + protected render(): TemplateResult { + if (!this._interface) { + return html``; + } + + const ipv4 = this._interface.ipv4; + const ipv6 = this._interface.ipv6; + + return html` + + ${ipv4 + ? html` +
+

IPv4

+ ${ipv4.address + ? html`
IP Address: ${ipv4.address?.join(", ")}
` + : ""} + ${ipv4.gateway ? html`
Gateway: ${ipv4.gateway}
` : ""} + ${ipv4.method ? html`
Method: ${ipv4.method}
` : ""} + ${ipv4.nameservers?.length + ? html` +
Name Servers: ${ipv4.nameservers?.join(", ")}
+ ` + : ""} +
+ ` + : ""} + ${ipv6 + ? html` +
+

IPv6

+ ${ipv6.address + ? html`
IP Address: ${ipv6.address?.join(", ")}
` + : ""} + ${ipv6.gateway ? html`
Gateway: ${ipv6.gateway}
` : ""} + ${ipv6.method ? html`
Method: ${ipv6.method}
` : ""} + ${ipv6.nameservers?.length + ? html` +
Name Servers: ${ipv6.nameservers?.join(", ")}
+ ` + : ""} +
+ ` + : ""} +
+ `; + } + + static styles: CSSResultGroup = haStyleDialog; +} + +declare global { + interface HTMLElementTagNameMap { + "dialog-ip-detail": DialogIPDetail; + } +} diff --git a/src/panels/config/network/show-ip-detail-dialog.ts b/src/panels/config/network/show-ip-detail-dialog.ts new file mode 100644 index 0000000000..cc4a4fedfe --- /dev/null +++ b/src/panels/config/network/show-ip-detail-dialog.ts @@ -0,0 +1,19 @@ +import { fireEvent } from "../../../common/dom/fire_event"; +import type { NetworkInterface } from "../../../data/hassio/network"; + +export interface IPDetailDialogParams { + interface?: NetworkInterface; +} + +export const loadIPDetailDialog = () => import("./dialog-ip-detail"); + +export const showIPDetailDialog = ( + element: HTMLElement, + dialogParams: IPDetailDialogParams +): void => { + fireEvent(element, "show-dialog", { + dialogTag: "dialog-ip-detail", + dialogImport: loadIPDetailDialog, + dialogParams, + }); +}; diff --git a/src/panels/config/network/supervisor-network.ts b/src/panels/config/network/supervisor-network.ts index 5621a666e6..664092e1d5 100644 --- a/src/panels/config/network/supervisor-network.ts +++ b/src/panels/config/network/supervisor-network.ts @@ -1,13 +1,16 @@ import "@material/mwc-button/mwc-button"; -import "@material/mwc-list/mwc-list"; +import { ActionDetail } from "@material/mwc-list/mwc-list"; import "@material/mwc-list/mwc-list-item"; import "@material/mwc-tab"; import "@material/mwc-tab-bar"; +import { mdiDotsVertical } from "@mdi/js"; import { PaperInputElement } from "@polymer/paper-input/paper-input"; import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; import { customElement, property, state } from "lit/decorators"; import { cache } from "lit/directives/cache"; import "../../../components/ha-alert"; +import "../../../components/ha-button-menu"; +import "../../../components/ha-card"; import "../../../components/ha-circular-progress"; import "../../../components/ha-expansion-panel"; import "../../../components/ha-formfield"; @@ -29,7 +32,7 @@ import { showConfirmationDialog, } from "../../../dialogs/generic/show-dialog-box"; import type { HomeAssistant } from "../../../types"; -import "../../../components/ha-card"; +import { showIPDetailDialog } from "./show-ip-detail-dialog"; const IP_VERSIONS = ["ipv4", "ipv6"]; @@ -236,9 +239,25 @@ export class HassioNetwork extends LitElement { ` : this.hass.localize("ui.common.save")} + + + IP Information + `; } + private _handleAction(ev: CustomEvent) { + switch (ev.detail.index) { + case 0: + showIPDetailDialog(this, { interface: this._interface }); + break; + } + } + private _selectAP(event) { this._wifiConfiguration = event.currentTarget.ap; this._dirty = true;