fix data-table row handlers (#11638)

This commit is contained in:
Bram Kragten 2022-02-10 15:24:00 +01:00 committed by GitHub
parent 467a5169c0
commit fd80408de2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 36 additions and 24 deletions

View File

@ -526,7 +526,7 @@ export class HaDataTable extends LitElement {
} }
} }
private _handleRowCheckboxClick(ev: Event) { private _handleRowCheckboxClick = (ev: Event) => {
const checkbox = ev.currentTarget as HaCheckbox; const checkbox = ev.currentTarget as HaCheckbox;
const rowId = (checkbox as any).rowId; const rowId = (checkbox as any).rowId;
@ -539,16 +539,16 @@ export class HaDataTable extends LitElement {
this._checkedRows = this._checkedRows.filter((row) => row !== rowId); this._checkedRows = this._checkedRows.filter((row) => row !== rowId);
} }
this._checkedRowsChanged(); this._checkedRowsChanged();
} };
private _handleRowClick(ev: Event) { private _handleRowClick = (ev: Event) => {
const target = ev.target as HTMLElement; const target = ev.target as HTMLElement;
if (["HA-CHECKBOX", "MWC-BUTTON"].includes(target.tagName)) { if (["HA-CHECKBOX", "MWC-BUTTON"].includes(target.tagName)) {
return; return;
} }
const rowId = (ev.currentTarget as any).rowId; const rowId = (ev.currentTarget as any).rowId;
fireEvent(this, "row-click", { id: rowId }, { bubbles: false }); fireEvent(this, "row-click", { id: rowId }, { bubbles: false });
} };
private _checkedRowsChanged() { private _checkedRowsChanged() {
// force scroller to update, change it's items // force scroller to update, change it's items

View File

@ -1,7 +1,5 @@
import "@lit-labs/virtualizer"; import "@lit-labs/virtualizer";
import "@material/mwc-list/mwc-list"; import "@material/mwc-list/mwc-list";
import type { List } from "@material/mwc-list/mwc-list";
import { SingleSelectedEvent } from "@material/mwc-list/mwc-list-foundation";
import "@material/mwc-list/mwc-list-item"; import "@material/mwc-list/mwc-list-item";
import type { ListItem } from "@material/mwc-list/mwc-list-item"; import type { ListItem } from "@material/mwc-list/mwc-list-item";
import { import {
@ -123,18 +121,28 @@ export class QuickBar extends LitElement {
fireEvent(this, "dialog-closed", { dialog: this.localName }); fireEvent(this, "dialog-closed", { dialog: this.localName });
} }
private _getItems = memoizeOne(
(commandMode: boolean, commandItems, entityItems, filter: string) => {
const items = commandMode ? commandItems : entityItems;
if (items && filter && filter !== " ") {
return this._filterItems(items, filter);
}
return items;
}
);
protected render() { protected render() {
if (!this._opened) { if (!this._opened) {
return html``; return html``;
} }
let items: QuickBarItem[] | undefined = this._commandMode const items: QuickBarItem[] | undefined = this._getItems(
? this._commandItems this._commandMode,
: this._entityItems; this._commandItems,
this._entityItems,
if (items && this._filter && this._filter !== " ") { this._filter
items = this._filterItems(items, this._filter); );
}
return html` return html`
<ha-dialog <ha-dialog
@ -209,11 +217,12 @@ export class QuickBar extends LitElement {
</div> </div>
` `
: html` : html`
<mwc-list @selected=${this._handleSelected}> <mwc-list>
<lit-virtualizer <lit-virtualizer
scroller scroller
@keydown=${this._handleListItemKeyDown} @keydown=${this._handleListItemKeyDown}
@rangechange=${this._handleRangeChanged} @rangechange=${this._handleRangeChanged}
@click=${this._handleItemClick}
class="ha-scrollbar" class="ha-scrollbar"
style=${styleMap({ style=${styleMap({
height: this._narrow height: this._narrow
@ -335,16 +344,6 @@ export class QuickBar extends LitElement {
this.closeDialog(); this.closeDialog();
} }
private _handleSelected(ev: SingleSelectedEvent) {
const index = ev.detail.index;
if (index < 0) {
return;
}
const item = ((ev.target as List).items[index] as any).item;
this.processItemAndCloseDialog(item, index);
}
private _handleInputKeyDown(ev: KeyboardEvent) { private _handleInputKeyDown(ev: KeyboardEvent) {
if (ev.code === "Enter") { if (ev.code === "Enter") {
const firstItem = this._getItemAtIndex(0); const firstItem = this._getItemAtIndex(0);
@ -442,12 +441,25 @@ export class QuickBar extends LitElement {
this._getItemAtIndex(Number(index) - 1)?.focus(); this._getItemAtIndex(Number(index) - 1)?.focus();
} }
} }
if (ev.key === "Enter" || ev.key === " ") {
this.processItemAndCloseDialog(
(ev.target as any).item,
Number((ev.target as HTMLElement).getAttribute("index"))
);
}
if (ev.key === "Backspace" || isSingleCharacter) { if (ev.key === "Backspace" || isSingleCharacter) {
(ev.currentTarget as HTMLElement).scrollTop = 0; (ev.currentTarget as HTMLElement).scrollTop = 0;
this._filterInputField?.focus(); this._filterInputField?.focus();
} }
} }
private _handleItemClick(ev) {
this.processItemAndCloseDialog(
(ev.target as any).item,
Number((ev.target as HTMLElement).getAttribute("index"))
);
}
private _generateEntityItems(): EntityItem[] { private _generateEntityItems(): EntityItem[] {
return Object.keys(this.hass.states) return Object.keys(this.hass.states)
.map((entityId) => { .map((entityId) => {