import type { Corner } from '@material/mwc-menu'; import { CSSResultGroup, html, LitElement, TemplateResult, unsafeCSS } from 'lit'; import { HomeAssistant } from 'custom-card-helpers'; import { customElement, property } from 'lit/decorators.js'; import { frigateCardHasAction, refreshDynamicStateParameters, stopEventFromActivatingCardWideActions, } from '../common.js'; import { ifDefined } from 'lit/directives/if-defined.js'; import { styleMap } from 'lit/directives/style-map.js'; import { ExtendedHomeAssistant, MenuSubmenu, MenuSubmenuItem } from '../types.js'; import { actionHandler } from '../action-handler-directive.js'; import submenuStyle from '../scss/submenu.scss'; @customElement('frigate-card-submenu') export class FrigateCardSubmenu extends LitElement { @property({ attribute: false }) public hass?: HomeAssistant & ExtendedHomeAssistant; @property({ attribute: false }) public submenu?: MenuSubmenu; @property({ attribute: false }) public corner?: Corner; protected _renderItem(item: MenuSubmenuItem): TemplateResult | void { if (!this.hass) { return; } const stateParameters = refreshDynamicStateParameters(this.hass, { ...item }); return html` { // Attach the action config so ascendants have access to it. ev.detail.config = item; }} .actionHandler=${actionHandler({ hasHold: frigateCardHasAction(item.hold_action), hasDoubleClick: frigateCardHasAction(item.double_tap_action), })} > ${stateParameters.title || ''} ${stateParameters.icon ? html` ` : ``} `; } protected render(): TemplateResult { if (!this.submenu) { return html``; } return html` ev.stopPropagation() } @click=${(ev) => stopEventFromActivatingCardWideActions(ev)} > trigger slot to open/close the menu. Further // propagation is forbidden by the @click handler on // . allowPropagation: true, hasHold: frigateCardHasAction(this.submenu.hold_action), hasDoubleClick: frigateCardHasAction(this.submenu.double_tap_action), })} > ${this.submenu.items.map(this._renderItem.bind(this))} `; } static get styles(): CSSResultGroup { return unsafeCSS(submenuStyle); } }