@@ -169,36 +172,40 @@ export class HuiTileCard extends LitElement implements LovelaceCard {
`;
}
- const domain = computeDomain(entity.entity_id);
+ const domain = computeDomain(stateObj.entity_id);
- const icon = this._config.icon || entity.attributes.icon;
- const iconPath = stateIconPath(entity);
+ const icon = this._config.icon || stateObj.attributes.icon;
+ const iconPath = stateIconPath(stateObj);
- const name = this._config.name || entity.attributes.friendly_name;
+ const name = this._config.name || stateObj.attributes.friendly_name;
const stateDisplay =
- (entity.attributes.device_class === SENSOR_DEVICE_CLASS_TIMESTAMP ||
+ (stateObj.attributes.device_class === SENSOR_DEVICE_CLASS_TIMESTAMP ||
TIMESTAMP_STATE_DOMAINS.includes(domain)) &&
- !UNAVAILABLE_STATES.includes(entity.state)
+ !UNAVAILABLE_STATES.includes(stateObj.state)
? html`
`
- : computeStateDisplay(this.hass!.localize, entity, this.hass.locale);
+ : computeStateDisplay(this.hass!.localize, stateObj, this.hass.locale);
- const color = this._computeStateColor(entity, this._config.color);
+ const color = this._computeStateColor(stateObj, this._config.color);
const style = {
"--tile-color": color,
};
const imageUrl = this._config.show_entity_picture
- ? this._getImageUrl(entity)
+ ? this._getImageUrl(stateObj)
: undefined;
- const badge = computeTileBadge(entity, this.hass);
+ const badge = computeTileBadge(stateObj, this.hass);
+
+ const supportedExtras = this._config.extras?.filter((extra) =>
+ supportsTileExtra(stateObj, extra.type)
+ );
return html`
@@ -246,15 +253,54 @@ export class HuiTileCard extends LitElement implements LovelaceCard {
.actionHandler=${actionHandler()}
>
+ ${supportedExtras?.length
+ ? html`
+
+ `
+ : null}
`;
}
+ private _extrasElements = new WeakMap<
+ LovelaceTileExtraConfig,
+ LovelaceTileExtra | HuiErrorCard
+ >();
+
+ private _getExtraElement(extra: LovelaceTileExtraConfig) {
+ if (!this._extrasElements.has(extra)) {
+ const element = createTileExtraElement(extra);
+ this._extrasElements.set(extra, element);
+ return element;
+ }
+
+ return this._extrasElements.get(extra)!;
+ }
+
+ private renderExtra(
+ extraConf: LovelaceTileExtraConfig,
+ stateObj: HassEntity
+ ): TemplateResult {
+ const element = this._getExtraElement(extraConf);
+
+ if (this.hass) {
+ element.hass = this.hass;
+ (element as LovelaceTileExtra).stateObj = stateObj;
+ }
+
+ return html``;
+ }
+
static get styles(): CSSResultGroup {
return css`
:host {
--tile-color: var(--rgb-disabled-color);
--tile-tap-padding: 6px;
+ -webkit-tap-highlight-color: transparent;
}
ha-card {
height: 100%;
diff --git a/src/panels/lovelace/cards/types.ts b/src/panels/lovelace/cards/types.ts
index 75f1d2bdee..b7dc898902 100644
--- a/src/panels/lovelace/cards/types.ts
+++ b/src/panels/lovelace/cards/types.ts
@@ -11,6 +11,7 @@ import {
} from "../entity-rows/types";
import { LovelaceHeaderFooterConfig } from "../header-footer/types";
import { HaDurationData } from "../../../components/ha-duration-input";
+import { LovelaceTileExtraConfig } from "../tile-extra/types";
export interface AlarmPanelCardConfig extends LovelaceCardConfig {
entity: string;
@@ -501,4 +502,5 @@ export interface TileCardConfig extends LovelaceCardConfig {
show_entity_picture?: string;
tap_action?: ActionConfig;
icon_tap_action?: ActionConfig;
+ extras?: LovelaceTileExtraConfig[];
}
diff --git a/src/panels/lovelace/create-element/create-element-base.ts b/src/panels/lovelace/create-element/create-element-base.ts
index d236d0faf5..df2db56ba5 100644
--- a/src/panels/lovelace/create-element/create-element-base.ts
+++ b/src/panels/lovelace/create-element/create-element-base.ts
@@ -11,6 +11,7 @@ import type { ErrorCardConfig } from "../cards/types";
import { LovelaceElement, LovelaceElementConfig } from "../elements/types";
import { LovelaceRow, LovelaceRowConfig } from "../entity-rows/types";
import { LovelaceHeaderFooterConfig } from "../header-footer/types";
+import { LovelaceTileExtraConfig } from "../tile-extra/types";
import {
LovelaceBadge,
LovelaceCard,
@@ -18,6 +19,8 @@ import {
LovelaceHeaderFooter,
LovelaceHeaderFooterConstructor,
LovelaceRowConstructor,
+ LovelaceTileExtra,
+ LovelaceTileExtraConstructor,
} from "../types";
const TIMEOUT = 2000;
@@ -53,6 +56,11 @@ interface CreateElementConfigTypes {
element: LovelaceViewElement;
constructor: unknown;
};
+ "tile-extra": {
+ config: LovelaceTileExtraConfig;
+ element: LovelaceTileExtra;
+ constructor: LovelaceTileExtraConstructor;
+ };
}
export const createErrorCardElement = (config: ErrorCardConfig) => {
diff --git a/src/panels/lovelace/create-element/create-tile-extra-element.ts b/src/panels/lovelace/create-element/create-tile-extra-element.ts
new file mode 100644
index 0000000000..02fac9ba2c
--- /dev/null
+++ b/src/panels/lovelace/create-element/create-tile-extra-element.ts
@@ -0,0 +1,18 @@
+import { LovelaceTileExtraConfig } from "../tile-extra/types";
+import {
+ createLovelaceElement,
+ getLovelaceElementClass,
+} from "./create-element-base";
+import "../tile-extra/hui-cover-open-close-tile-extra";
+import "../tile-extra/hui-cover-tilt-tile-extra";
+
+const TYPES: Set