From 9205837b678a50159cc17b2cac8e04491acb4acc Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 5 Sep 2019 20:17:19 +0200 Subject: [PATCH] Create hui-views-list component (#3631) And use for move card view --- .../lovelace/components/hui-views-list.ts | 99 +++++++++++++++++++ .../card-editor/hui-dialog-move-card-view.ts | 22 ++--- 2 files changed, 108 insertions(+), 13 deletions(-) create mode 100644 src/panels/lovelace/components/hui-views-list.ts diff --git a/src/panels/lovelace/components/hui-views-list.ts b/src/panels/lovelace/components/hui-views-list.ts new file mode 100644 index 0000000000..b885ac32c7 --- /dev/null +++ b/src/panels/lovelace/components/hui-views-list.ts @@ -0,0 +1,99 @@ +import { + customElement, + LitElement, + property, + TemplateResult, + html, + CSSResult, + css, +} from "lit-element"; +import "@polymer/paper-listbox/paper-listbox"; +import "@polymer/paper-item/paper-icon-item"; +import "../../../../src/components/ha-icon"; +import { toggleAttribute } from "../../../../src/common/dom/toggle_attribute"; +import { fireEvent } from "../../../common/dom/fire_event"; +import { LovelaceConfig } from "../../../data/lovelace"; + +declare global { + interface HASSDomEvents { + "view-selected": { + view: number; + }; + } +} + +@customElement("hui-views-list") +class HuiViewsList extends LitElement { + @property() private lovelaceConfig?: LovelaceConfig | undefined; + @property() private selected?: number | undefined; + + protected render(): TemplateResult | void { + if (!this.lovelaceConfig) { + return html``; + } + + return html` + + ${this.lovelaceConfig.views.map( + (view, index) => html` + + ${view.icon + ? html` + + ` + : ""} + ${view.title || view.path} + + ` + )} + + `; + } + + protected updated(changedProps) { + super.updated(changedProps); + toggleAttribute( + this, + "hide-icons", + this.lovelaceConfig + ? !this.lovelaceConfig.views.some((view) => view.icon) + : true + ); + } + + private async _handlePickView(ev: Event) { + const view = Number((ev.currentTarget as any).getAttribute("data-index")); + fireEvent(this, "view-selected", { view }); + } + + static get styles(): CSSResult { + return css` + paper-listbox { + padding-top: 0; + } + + paper-listbox ha-icon { + padding: 12px; + color: var(--secondary-text-color); + } + + paper-icon-item { + cursor: pointer; + } + + paper-icon-item[disabled] { + cursor: initial; + } + + :host([hide-icons]) paper-icon-item { + --paper-item-icon-width: 0px; + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "hui-views-list": HuiViewsList; + } +} diff --git a/src/panels/lovelace/editor/card-editor/hui-dialog-move-card-view.ts b/src/panels/lovelace/editor/card-editor/hui-dialog-move-card-view.ts index 9e860a75e0..dc8b282d1a 100644 --- a/src/panels/lovelace/editor/card-editor/hui-dialog-move-card-view.ts +++ b/src/panels/lovelace/editor/card-editor/hui-dialog-move-card-view.ts @@ -12,6 +12,8 @@ import "../../../../components/dialog/ha-paper-dialog"; // tslint:disable-next-line:no-duplicate-imports import { HaPaperDialog } from "../../../../components/dialog/ha-paper-dialog"; +import "../../components/hui-views-list"; + import { moveCard } from "../config-util"; import { MoveCardViewDialogParams } from "./show-move-card-view-dialog"; import { PolymerChangedEvent } from "../../../../polymer-types"; @@ -36,16 +38,11 @@ export class HuiDialogMoveCardView extends LitElement { @opened-changed="${this._openedChanged}" >

Choose view to move card

- ${this._params!.lovelace!.config.views.map((view, index) => { - return html` - ${view.title} - `; - })} + + `; } @@ -80,15 +77,14 @@ export class HuiDialogMoveCardView extends LitElement { return this.shadowRoot!.querySelector("ha-paper-dialog")!; } - private _moveCard(e: Event): void { - const newView = (e.currentTarget! as any).index; + private _moveCard(e: CustomEvent): void { + const newView = e.detail.view; const path = this._params!.path!; if (newView === path[0]) { return; } const lovelace = this._params!.lovelace!; - lovelace.saveConfig(moveCard(lovelace.config, path, [newView!])); this._dialog.close(); }