diff --git a/src/panels/lovelace/components/hui-buttons-base.ts b/src/panels/lovelace/components/hui-buttons-base.ts
new file mode 100644
index 0000000000..b7c51f1c35
--- /dev/null
+++ b/src/panels/lovelace/components/hui-buttons-base.ts
@@ -0,0 +1,102 @@
+import {
+ html,
+ LitElement,
+ TemplateResult,
+ customElement,
+ css,
+ CSSResult,
+ queryAll,
+ property,
+} from "lit-element";
+import "@material/mwc-ripple";
+
+import "../../../components/entity/state-badge";
+import "../../../components/ha-icon";
+
+import { HomeAssistant } from "../../../types";
+import { computeTooltip } from "../common/compute-tooltip";
+// tslint:disable-next-line: no-duplicate-imports
+import { StateBadge } from "../../../components/entity/state-badge";
+import { actionHandler } from "../common/directives/action-handler-directive";
+import { hasAction } from "../common/has-action";
+import { ActionHandlerEvent } from "../../../data/lovelace";
+import { handleAction } from "../common/handle-action";
+import { EntitiesCardEntityConfig } from "../cards/types";
+
+@customElement("hui-buttons-base")
+export class HuiButtonsBase extends LitElement {
+ @property() public configEntities?: EntitiesCardEntityConfig[];
+ @queryAll("state-badge") protected _badges!: StateBadge[];
+ private _hass?: HomeAssistant;
+
+ set hass(hass: HomeAssistant) {
+ this._hass = hass;
+ this._badges.forEach((badge, index: number) => {
+ badge.hass = hass;
+ badge.stateObj = hass.states[this.configEntities![index].entity];
+ });
+ }
+
+ protected render(): TemplateResult | void {
+ return html`
+ ${(this.configEntities || []).map((entityConf) => {
+ const stateObj = this._hass!.states[entityConf.entity];
+ if (!stateObj) {
+ return html`
`;
+ }
+
+ return html`
+
+
+
+
+ `;
+ })}
+ `;
+ }
+
+ private _handleAction(ev: ActionHandlerEvent) {
+ const config = (ev.currentTarget as any).config as EntitiesCardEntityConfig;
+ handleAction(
+ this,
+ this.hass!,
+ { tap_action: { action: "toggle" }, ...config },
+ ev.detail.action!
+ );
+ }
+
+ static get styles(): CSSResult {
+ return css`
+ :host {
+ display: flex;
+ justify-content: space-evenly;
+ }
+ .missing {
+ color: #fce588;
+ }
+ state-badge {
+ cursor: pointer;
+ }
+ `;
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ "hui-buttons-base": HuiButtonsBase;
+ }
+}
diff --git a/src/panels/lovelace/create-element/create-row-element.ts b/src/panels/lovelace/create-element/create-row-element.ts
index b33b419667..d23464f7fb 100644
--- a/src/panels/lovelace/create-element/create-row-element.ts
+++ b/src/panels/lovelace/create-element/create-row-element.ts
@@ -35,6 +35,7 @@ const LAZY_LOAD_TYPES = {
section: () => import("../special-rows/hui-section-row"),
weblink: () => import("../special-rows/hui-weblink-row"),
cast: () => import("../special-rows/hui-cast-row"),
+ buttons: () => import("../special-rows/hui-buttons-row"),
};
const DOMAIN_TO_ELEMENT_TYPE = {
_domain_not_found: "text",
diff --git a/src/panels/lovelace/entity-rows/types.ts b/src/panels/lovelace/entity-rows/types.ts
index 28c740e719..6034c5b3b2 100644
--- a/src/panels/lovelace/entity-rows/types.ts
+++ b/src/panels/lovelace/entity-rows/types.ts
@@ -42,13 +42,19 @@ export interface CastConfig {
// Hide the row if either unsupported browser or no API available.
hide_if_unavailable: boolean;
}
+export interface ButtonsRowConfig {
+ type: "buttons";
+ entities: Array;
+}
export type LovelaceRowConfig =
| EntityConfig
| DividerConfig
| SectionConfig
| WeblinkConfig
| CallServiceConfig
- | CastConfig;
+ | CastConfig
+ | ButtonsRowConfig
+ | ConditionalRowConfig;
export interface LovelaceRow extends HTMLElement {
hass?: HomeAssistant;
diff --git a/src/panels/lovelace/header-footer/hui-buttons-header-footer.ts b/src/panels/lovelace/header-footer/hui-buttons-header-footer.ts
index 35e3b6eefd..0f53f9a1b4 100644
--- a/src/panels/lovelace/header-footer/hui-buttons-header-footer.ts
+++ b/src/panels/lovelace/header-footer/hui-buttons-header-footer.ts
@@ -1,28 +1,18 @@
import {
- html,
- LitElement,
- TemplateResult,
customElement,
- css,
- CSSResult,
- queryAll,
+ LitElement,
+ html,
+ property,
+ TemplateResult,
} from "lit-element";
-import "@material/mwc-ripple";
-import "../../../components/entity/state-badge";
-import "../../../components/ha-card";
-import "../../../components/ha-icon";
-import "../components/hui-warning-element";
+import "../components/hui-buttons-base";
-import { HomeAssistant } from "../../../types";
import { LovelaceHeaderFooter } from "../types";
import { ButtonsHeaderFooterConfig } from "./types";
-import { EntityConfig } from "../entity-rows/types";
import { processConfigEntities } from "../common/process-config-entities";
-import { toggleEntity } from "../common/entity/toggle-entity";
-import { computeTooltip } from "../common/compute-tooltip";
-// tslint:disable-next-line: no-duplicate-imports
-import { StateBadge } from "../../../components/entity/state-badge";
+import { EntityConfig } from "../entity-rows/types";
+import { HomeAssistant } from "../../../types";
@customElement("hui-buttons-header-footer")
export class HuiButtonsHeaderFooter extends LitElement
@@ -31,66 +21,20 @@ export class HuiButtonsHeaderFooter extends LitElement
return { entities: [] };
}
+ @property() public hass?: HomeAssistant;
private _configEntities?: EntityConfig[];
- private _hass?: HomeAssistant;
- @queryAll("state-badge") private _badges!: StateBadge[];
public setConfig(config: ButtonsHeaderFooterConfig): void {
this._configEntities = processConfigEntities(config.entities);
this.requestUpdate();
}
- set hass(hass: HomeAssistant) {
- this._hass = hass;
- this._badges.forEach((badge, index: number) => {
- badge.hass = hass;
- badge.stateObj = hass.states[this._configEntities![index].entity];
- });
- }
-
protected render(): TemplateResult | void {
return html`
- ${(this._configEntities || []).map((entityConf) => {
- const stateObj = this._hass!.states[entityConf.entity];
- if (!stateObj) {
- return html`
`;
- }
-
- return html`
-
-
-
-
- `;
- })}
- `;
- }
-
- private async _toggle(ev) {
- await toggleEntity(this._hass!, ev.target.stateObj.entity_id);
- }
-
- static get styles(): CSSResult {
- return css`
- :host {
- display: flex;
- justify-content: space-evenly;
- }
- .missing {
- color: #fce588;
- }
- state-badge {
- cursor: pointer;
- }
+
`;
}
}
diff --git a/src/panels/lovelace/header-footer/types.ts b/src/panels/lovelace/header-footer/types.ts
index 65c4ba6c7f..78d5d55547 100644
--- a/src/panels/lovelace/header-footer/types.ts
+++ b/src/panels/lovelace/header-footer/types.ts
@@ -1,13 +1,14 @@
import { ActionConfig } from "../../../data/lovelace";
import { struct } from "../common/structs/struct";
import { actionConfigStruct, entitiesConfigStruct } from "../editor/types";
+import { EntityConfig } from "../entity-rows/types";
export interface LovelaceHeaderFooterConfig {
type: string;
}
export interface ButtonsHeaderFooterConfig extends LovelaceHeaderFooterConfig {
- entities: string[];
+ entities: Array;
}
export interface PictureHeaderFooterConfig extends LovelaceHeaderFooterConfig {
diff --git a/src/panels/lovelace/special-rows/hui-buttons-row.ts b/src/panels/lovelace/special-rows/hui-buttons-row.ts
new file mode 100644
index 0000000000..e685bb0bda
--- /dev/null
+++ b/src/panels/lovelace/special-rows/hui-buttons-row.ts
@@ -0,0 +1,47 @@
+import {
+ customElement,
+ LitElement,
+ html,
+ property,
+ TemplateResult,
+} from "lit-element";
+
+import "../components/hui-buttons-base";
+
+import {
+ ButtonsRowConfig,
+ EntityConfig,
+ LovelaceRow,
+} from "../entity-rows/types";
+import { processConfigEntities } from "../common/process-config-entities";
+import { HomeAssistant } from "../../../types";
+
+@customElement("hui-buttons-row")
+export class HuiButtonsRow extends LitElement implements LovelaceRow {
+ public static getStubConfig(): object {
+ return { entities: [] };
+ }
+
+ @property() public hass?: HomeAssistant;
+ private _configEntities?: EntityConfig[];
+
+ public setConfig(config: ButtonsRowConfig): void {
+ this._configEntities = processConfigEntities(config.entities);
+ this.requestUpdate();
+ }
+
+ protected render(): TemplateResult | void {
+ return html`
+
+ `;
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ "hui-buttons-row": HuiButtonsRow;
+ }
+}