From 680bf06a4ba43b774b8b8641774d218b3f2a2eb2 Mon Sep 17 00:00:00 2001 From: "David F. Mulcahey" Date: Tue, 24 Dec 2019 10:29:22 -0500 Subject: [PATCH] Add group detail view to the ZHA config panel (#4380) * add group details * review comments --- src/data/zha.ts | 9 ++ src/panels/config/zha/zha-config-panel.ts | 8 + src/panels/config/zha/zha-group-page.ts | 145 ++++++++++++++++++ .../config/zha/zha-groups-data-table.ts | 18 +++ src/translations/en.json | 5 +- 5 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 src/panels/config/zha/zha-group-page.ts diff --git a/src/data/zha.ts b/src/data/zha.ts index eb270f8556..4d8306f332 100644 --- a/src/data/zha.ts +++ b/src/data/zha.ts @@ -173,3 +173,12 @@ export const removeGroups = ( type: "zha/group/remove", group_ids: groupIdsToRemove, }); + +export const fetchGroup = ( + hass: HomeAssistant, + groupId: number +): Promise => + hass.callWS({ + type: "zha/group", + group_id: groupId, + }); diff --git a/src/panels/config/zha/zha-config-panel.ts b/src/panels/config/zha/zha-config-panel.ts index 2ba4346fc5..c383ba2a2b 100644 --- a/src/panels/config/zha/zha-config-panel.ts +++ b/src/panels/config/zha/zha-config-panel.ts @@ -40,6 +40,11 @@ class ZHAConfigPanel extends HassRouterPage { /* webpackChunkName: "zha-groups-dashboard" */ "./zha-groups-dashboard" ), }, + group: { + tag: "zha-group-page", + load: () => + import(/* webpackChunkName: "zha-group-page" */ "./zha-group-page"), + }, }, }; @@ -48,6 +53,9 @@ class ZHAConfigPanel extends HassRouterPage { el.hass = this.hass; el.isWide = this.isWide; el.narrow = this.narrow; + if (this._currentPage === "group") { + el.groupId = this.routeTail.path.substr(1); + } } } diff --git a/src/panels/config/zha/zha-group-page.ts b/src/panels/config/zha/zha-group-page.ts new file mode 100644 index 0000000000..005b67acf8 --- /dev/null +++ b/src/panels/config/zha/zha-group-page.ts @@ -0,0 +1,145 @@ +import { + property, + LitElement, + html, + customElement, + css, + CSSResult, + PropertyValues, +} from "lit-element"; + +import memoizeOne from "memoize-one"; + +import "../../../layouts/hass-subpage"; +import "../../../layouts/hass-error-screen"; +import "../ha-config-section"; +import { HomeAssistant } from "../../../types"; +import { + ZHADevice, + ZHAGroup, + fetchGroup, + removeGroups, +} from "../../../data/zha"; +import { formatAsPaddedHex } from "./functions"; +import "./zha-device-card"; +import { navigate } from "../../../common/navigate"; +import "@polymer/paper-icon-button/paper-icon-button"; + +@customElement("zha-group-page") +export class ZHAGroupPage extends LitElement { + @property() public hass!: HomeAssistant; + @property() public group?: ZHAGroup; + @property() public groupId!: number; + @property() public narrow!: boolean; + @property() public isWide!: boolean; + private _firstUpdatedCalled: boolean = false; + + private _members = memoizeOne( + (group: ZHAGroup): ZHADevice[] => group.members + ); + + public connectedCallback(): void { + super.connectedCallback(); + if (this.hass && this._firstUpdatedCalled) { + this._fetchData(); + } + } + + protected firstUpdated(changedProperties: PropertyValues): void { + super.firstUpdated(changedProperties); + if (this.hass) { + this._fetchData(); + } + this._firstUpdatedCalled = true; + } + + protected render() { + if (!this.group) { + return html` + + `; + } + + const members = this._members(this.group); + + return html` + + + +
+ ${this.hass.localize("ui.panel.config.zha.groups.group_info")} +
+ +

+ ${this.hass.localize("ui.panel.config.zha.groups.group_details")} +

+ +

Name: ${this.group.name}

+

Group Id: ${formatAsPaddedHex(this.group.group_id)}

+ +
+ ${this.hass.localize("ui.panel.config.zha.groups.members")} +
+ + ${members.length + ? members.map( + (member) => html` + + ` + ) + : html` +

+ This group has no members +

+ `} +
+
+ `; + } + + private async _fetchData() { + if (this.groupId !== null && this.groupId !== undefined) { + this.group = await fetchGroup(this.hass!, this.groupId); + } + } + + private async _deleteGroup(): Promise { + await removeGroups(this.hass, [this.groupId]); + navigate(this, `/config/zha/groups`, true); + } + + static get styles(): CSSResult[] { + return [ + css` + .header { + font-family: var(--paper-font-display1_-_font-family); + -webkit-font-smoothing: var( + --paper-font-display1_-_-webkit-font-smoothing + ); + font-size: var(--paper-font-display1_-_font-size); + font-weight: var(--paper-font-display1_-_font-weight); + letter-spacing: var(--paper-font-display1_-_letter-spacing); + line-height: var(--paper-font-display1_-_line-height); + opacity: var(--dark-primary-opacity); + } + + ha-config-section *:last-child { + padding-bottom: 24px; + } + `, + ]; + } +} diff --git a/src/panels/config/zha/zha-groups-data-table.ts b/src/panels/config/zha/zha-groups-data-table.ts index bdb6c4024b..4465a6cea5 100644 --- a/src/panels/config/zha/zha-groups-data-table.ts +++ b/src/panels/config/zha/zha-groups-data-table.ts @@ -16,6 +16,7 @@ import { DataTableColumnContainer } from "../../../components/data-table/ha-data // tslint:disable-next-line import { ZHAGroup, ZHADevice } from "../../../data/zha"; import { formatAsPaddedHex } from "./functions"; +import { navigate } from "../../../common/navigate"; export interface GroupRowData extends ZHAGroup { group?: GroupRowData; @@ -38,6 +39,11 @@ export class ZHAGroupsDataTable extends LitElement { sortable: true, filterable: true, direction: "asc", + template: (name) => html` +
+ ${name} +
+ `, }, } : { @@ -46,6 +52,11 @@ export class ZHAGroupsDataTable extends LitElement { sortable: true, filterable: true, direction: "asc", + template: (name) => html` +
+ ${name} +
+ `, }, group_id: { title: this.hass.localize("ui.panel.config.zha.groups.group_id"), @@ -78,6 +89,13 @@ export class ZHAGroupsDataTable extends LitElement { > `; } + + private _handleRowClicked(ev: CustomEvent) { + const groupId = (ev.target as HTMLElement) + .closest("tr")! + .getAttribute("data-row-id")!; + navigate(this, `/config/zha/group/${groupId}`); + } } declare global { diff --git a/src/translations/en.json b/src/translations/en.json index f6d0619d2d..2b8e30df76 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1447,7 +1447,10 @@ "header": "Zigbee Group Management", "introduction": "Create and modify zigbee groups", "remove_groups": "Remove Groups", - "removing_groups": "Removing Groups" + "removing_groups": "Removing Groups", + "group_info": "Group Information", + "group_details": "Here are all the details for the selected Zigbee group.", + "group_not_found": "Group not found!" } }, "zwave": {