diff --git a/src/data/lovelace/config/card.ts b/src/data/lovelace/config/card.ts index f41fc1e084..414e0826ba 100644 --- a/src/data/lovelace/config/card.ts +++ b/src/data/lovelace/config/card.ts @@ -1,7 +1,10 @@ +import { LovelaceLayoutOptions } from "../../../panels/lovelace/types"; + export interface LovelaceCardConfig { index?: number; view_index?: number; view_layout?: any; + layout_options?: LovelaceLayoutOptions; type: string; [key: string]: any; } diff --git a/src/panels/lovelace/cards/hui-button-card.ts b/src/panels/lovelace/cards/hui-button-card.ts index 3a37329b27..ddadb6d86f 100644 --- a/src/panels/lovelace/cards/hui-button-card.ts +++ b/src/panels/lovelace/cards/hui-button-card.ts @@ -52,7 +52,11 @@ import { actionHandler } from "../common/directives/action-handler-directive"; import { findEntities } from "../common/find-entities"; import { hasAction } from "../common/has-action"; import { createEntityNotFoundWarning } from "../components/hui-warning"; -import { LovelaceCard, LovelaceCardEditor } from "../types"; +import { + LovelaceCard, + LovelaceCardEditor, + LovelaceLayoutOptions, +} from "../types"; import { ButtonCardConfig } from "./types"; export const getEntityDefaultButtonAction = (entityId?: string) => @@ -143,14 +147,14 @@ export class HuiButtonCard extends LitElement implements LovelaceCard { ); } - public getGridSize(): [number, number] { + public getLayoutOptions(): LovelaceLayoutOptions { if ( this._config?.show_icon && (this._config?.show_name || this._config?.show_state) ) { - return [2, 2]; + return { grid_rows: 2, grid_columns: 2 }; } - return [1, 1]; + return { grid_rows: 1, grid_columns: 1 }; } public setConfig(config: ButtonCardConfig): void { diff --git a/src/panels/lovelace/cards/hui-sensor-card.ts b/src/panels/lovelace/cards/hui-sensor-card.ts index 709a6591d9..76ba0fa636 100644 --- a/src/panels/lovelace/cards/hui-sensor-card.ts +++ b/src/panels/lovelace/cards/hui-sensor-card.ts @@ -1,11 +1,11 @@ -import { css, CSSResultGroup } from "lit"; import { HassEntity } from "home-assistant-js-websocket/dist/types"; +import { css, CSSResultGroup } from "lit"; import { customElement } from "lit/decorators"; import { computeDomain } from "../../../common/entity/compute_domain"; import { HomeAssistant } from "../../../types"; import { findEntities } from "../common/find-entities"; import { GraphHeaderFooterConfig } from "../header-footer/types"; -import { LovelaceCardEditor } from "../types"; +import { LovelaceCardEditor, LovelaceLayoutOptions } from "../types"; import { HuiEntityCard } from "./hui-entity-card"; import { EntityCardConfig, SensorCardConfig } from "./types"; @@ -72,8 +72,11 @@ class HuiSensorCard extends HuiEntityCard { super.setConfig(entityCardConfig); } - public getGridSize(): [number, number] { - return [2, 2]; + public getLayoutOptions(): LovelaceLayoutOptions { + return { + grid_columns: 2, + grid_rows: 2, + }; } static get styles(): CSSResultGroup { diff --git a/src/panels/lovelace/cards/hui-tile-card.ts b/src/panels/lovelace/cards/hui-tile-card.ts index 1d56cc66bd..abb180dd35 100644 --- a/src/panels/lovelace/cards/hui-tile-card.ts +++ b/src/panels/lovelace/cards/hui-tile-card.ts @@ -48,7 +48,11 @@ import { findEntities } from "../common/find-entities"; import { handleAction } from "../common/handle-action"; import { hasAction } from "../common/has-action"; import "../components/hui-timestamp-display"; -import type { LovelaceCard, LovelaceCardEditor } from "../types"; +import type { + LovelaceCard, + LovelaceCardEditor, + LovelaceLayoutOptions, +} from "../types"; import { renderTileBadge } from "./tile/badges/tile-badge"; import type { ThermostatCardConfig, TileCardConfig } from "./types"; @@ -124,16 +128,18 @@ export class HuiTileCard extends LitElement implements LovelaceCard { ); } - public getGridSize(): [number, number] { - const width = 2; - let height = 1; + public getLayoutOptions(): LovelaceLayoutOptions { + const options = { + grid_columns: 2, + grid_rows: 1, + }; if (this._config?.features?.length) { - height += Math.ceil((this._config.features.length * 2) / 3); + options.grid_rows += Math.ceil((this._config.features.length * 2) / 3); } if (this._config?.vertical) { - height++; + options.grid_rows++; } - return [width, height]; + return options; } private _handleAction(ev: ActionHandlerEvent) { diff --git a/src/panels/lovelace/editor/structs/base-card-struct.ts b/src/panels/lovelace/editor/structs/base-card-struct.ts index 49e18c3b05..85d7685e10 100644 --- a/src/panels/lovelace/editor/structs/base-card-struct.ts +++ b/src/panels/lovelace/editor/structs/base-card-struct.ts @@ -3,4 +3,5 @@ import { object, string, any } from "superstruct"; export const baseLovelaceCardConfig = object({ type: string(), view_layout: any(), + layout_options: any(), }); diff --git a/src/panels/lovelace/sections/hui-grid-section.ts b/src/panels/lovelace/sections/hui-grid-section.ts index 83467239ac..d929eabcf1 100644 --- a/src/panels/lovelace/sections/hui-grid-section.ts +++ b/src/panels/lovelace/sections/hui-grid-section.ts @@ -14,7 +14,7 @@ import type { HomeAssistant } from "../../../types"; import { HuiErrorCard } from "../cards/hui-error-card"; import "../components/hui-card-edit-mode"; import { moveCard } from "../editor/config-util"; -import type { Lovelace, LovelaceCard } from "../types"; +import type { Lovelace, LovelaceCard, LovelaceLayoutOptions } from "../types"; const CARD_SORTABLE_OPTIONS: HaSortableOptions = { delay: 100, @@ -97,14 +97,26 @@ export class GridSection extends LitElement implements LovelaceSectionElement { const card = this.cards![idx]; (card as any).editMode = editMode; (card as any).lovelace = this.lovelace; - const size = card && (card as any).getGridSize?.(); + + const configOptions = _cardConfig.layout_options; + const cardOptions = (card as any)?.getLayoutOptions?.() as + | LovelaceLayoutOptions + | undefined; + + const options = { + ...cardOptions, + ...configOptions, + } as LovelaceLayoutOptions; + return html`