From 99695d6cb3f72c45d36742722faf3773c08d0037 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Fri, 29 Mar 2024 16:15:21 +0100 Subject: [PATCH] Use md-menu for group by and sort by for data table (#20266) --- src/layouts/hass-tabs-subpage-data-table.ts | 149 +++++++++++++------- 1 file changed, 96 insertions(+), 53 deletions(-) diff --git a/src/layouts/hass-tabs-subpage-data-table.ts b/src/layouts/hass-tabs-subpage-data-table.ts index 61bff9c04f..b4d4ddc58f 100644 --- a/src/layouts/hass-tabs-subpage-data-table.ts +++ b/src/layouts/hass-tabs-subpage-data-table.ts @@ -1,6 +1,9 @@ import { ResizeController } from "@lit-labs/observers/resize-controller"; import "@lrnwebcomponents/simple-tooltip/simple-tooltip"; import "@material/mwc-button/mwc-button"; +import "@material/web/menu/menu"; +import type { MdMenu } from "@material/web/menu/menu"; +import "@material/web/menu/menu-item"; import { mdiArrowDown, mdiArrowUp, @@ -19,6 +22,7 @@ import { nothing, } from "lit"; import { customElement, property, query, state } from "lit/decorators"; +import { classMap } from "lit/directives/class-map"; import { fireEvent } from "../common/dom/fire_event"; import { LocalizeFunc } from "../common/translations/localize"; import "../components/chips/ha-assist-chip"; @@ -173,6 +177,10 @@ export class HaTabsSubpageDataTable extends LitElement { @query("ha-data-table", true) private _dataTable!: HaDataTable; + @query("#group-by-menu") private _groupByMenu!: MdMenu; + + @query("#sort-by-menu") private _sortByMenu!: MdMenu; + private _showPaneController = new ResizeController(this, { callback: (entries) => entries[0]?.contentRect.width > 750, }); @@ -187,6 +195,14 @@ export class HaTabsSubpageDataTable extends LitElement { } } + private _toggleGroupBy() { + this._groupByMenu.open = !this._groupByMenu.open; + } + + private _toggleSortBy() { + this._sortByMenu.open = !this._sortByMenu.open; + } + protected render(): TemplateResult { const localize = this.localizeFunc || this.hass.localize; const showPane = this._showPaneController.value ?? !this.narrow; @@ -226,73 +242,35 @@ export class HaTabsSubpageDataTable extends LitElement { `; const sortByMenu = Object.values(this.columns).find((col) => col.sortable) - ? html` + ? html` - ${Object.entries(this.columns).map(([id, column]) => - column.sortable - ? html` - ${this._sortColumn === id - ? html`` - : nothing} - ${column.title || column.label} - ` - : nothing - )} - ` + ` : nothing; const groupByMenu = Object.values(this.columns).find((col) => col.groupable) - ? html` + ? html` - ${Object.entries(this.columns).map(([id, column]) => - column.groupable - ? html` - ${column.title || column.label} - ` - : nothing - )} -
  • - ${localize( - "ui.components.subpage-data-table.dont_group_by" - )} -
    ` + ` : nothing; return html` @@ -431,6 +409,58 @@ export class HaTabsSubpageDataTable extends LitElement { `}
    + + ${Object.entries(this.columns).map(([id, column]) => + column.groupable + ? html` + + ${column.title || column.label} + + ` + : nothing + )} +
  • + ${localize( + "ui.components.subpage-data-table.dont_group_by" + )} +
    + + ${Object.entries(this.columns).map(([id, column]) => + column.sortable + ? html` + + ${this._sortColumn === id + ? html` + + ` + : nothing} + ${column.title || column.label} + + ` + : nothing + )} + `; } @@ -449,6 +479,7 @@ export class HaTabsSubpageDataTable extends LitElement { private _handleSortBy(ev) { ev.stopPropagation(); + ev.preventDefault(); const columnId = ev.currentTarget.value; if (!this._sortDirection || this._sortColumn !== columnId) { this._sortDirection = "asc"; @@ -656,13 +687,6 @@ export class HaTabsSubpageDataTable extends LitElement { ha-assist-chip { --ha-assist-chip-container-shape: 10px; } - ha-button-menu { - --mdc-list-item-meta-size: 16px; - --mdc-list-item-meta-display: flex; - } - ha-button-menu ha-assist-chip { - --md-assist-chip-trailing-space: 8px; - } .select-mode-chip { --md-assist-chip-icon-label-space: 0; @@ -688,6 +712,25 @@ export class HaTabsSubpageDataTable extends LitElement { display: flex; flex-direction: column; } + /* TODO: Migrate to ha-menu and ha-menu-item */ + md-menu { + --md-menu-container-color: var(--card-background-color); + } + md-menu-item { + --md-menu-item-label-text-color: var(--primary-text-color); + --mdc-icon-size: 16px; + --md-menu-item-selected-container-color: rgba( + var(--rgb-primary-color), + 0.15 + ); + } + md-menu-item.selected { + --md-menu-item-label-text-color: var(--primary-color); + } + #sort-by-anchor, + #group-by-anchor { + --md-assist-chip-trailing-space: 8px; + } `; } }