diff --git a/src/panels/lovelace/strategies/areas/area-view-strategy.ts b/src/panels/lovelace/strategies/areas/area-view-strategy.ts index 4450451198..89668343c5 100644 --- a/src/panels/lovelace/strategies/areas/area-view-strategy.ts +++ b/src/panels/lovelace/strategies/areas/area-view-strategy.ts @@ -10,7 +10,7 @@ import { AREA_STRATEGY_GROUP_LABELS, computeAreaTileCardConfig, getAreaGroupedEntities, -} from "./helpers/area-strategy-helper"; +} from "./helpers/areas-strategy-helper"; export interface EntitiesDisplay { hidden?: string[]; @@ -144,6 +144,11 @@ export class AreaViewStrategy extends ReactiveElement { }); } + // Take the full width if there is only one section to avoid misalignment between cards and header + if (sections.length === 1) { + sections[0].column_span = 2; + } + return { type: "sections", header: { diff --git a/src/panels/lovelace/strategies/areas/areas-dashboard-strategy.ts b/src/panels/lovelace/strategies/areas/areas-dashboard-strategy.ts index 6c6f96ae13..fb0898769c 100644 --- a/src/panels/lovelace/strategies/areas/areas-dashboard-strategy.ts +++ b/src/panels/lovelace/strategies/areas/areas-dashboard-strategy.ts @@ -8,8 +8,8 @@ import type { EntitiesDisplay, } from "./area-view-strategy"; import type { LovelaceStrategyEditor } from "../types"; -import type { AreasViewStrategyConfig } from "./areas-view-strategy"; -import { computeAreaPath, getAreas } from "./helpers/areas-strategy-helpers"; +import type { AreasViewStrategyConfig } from "./areas-overview-view-strategy"; +import { computeAreaPath, getAreas } from "./helpers/areas-strategy-helper"; interface AreaOptions { groups_options?: Record; @@ -58,7 +58,7 @@ export class AreasDashboardStrategy extends ReactiveElement { icon: "mdi:home", path: "home", strategy: { - type: "areas", + type: "areas-overview", areas_display: config.areas_display, areas_options: config.areas_options, } satisfies AreasViewStrategyConfig, diff --git a/src/panels/lovelace/strategies/areas/areas-view-strategy.ts b/src/panels/lovelace/strategies/areas/areas-overview-view-strategy.ts similarity index 89% rename from src/panels/lovelace/strategies/areas/areas-view-strategy.ts rename to src/panels/lovelace/strategies/areas/areas-overview-view-strategy.ts index e1cfc6f183..d3e706bab1 100644 --- a/src/panels/lovelace/strategies/areas/areas-view-strategy.ts +++ b/src/panels/lovelace/strategies/areas/areas-overview-view-strategy.ts @@ -5,17 +5,18 @@ import type { LovelaceViewConfig } from "../../../../data/lovelace/config/view"; import type { HomeAssistant } from "../../../../types"; import type { EntitiesDisplay } from "./area-view-strategy"; import { + computeAreaPath, computeAreaTileCardConfig, getAreaGroupedEntities, -} from "./helpers/area-strategy-helper"; -import { computeAreaPath, getAreas } from "./helpers/areas-strategy-helpers"; + getAreas, +} from "./helpers/areas-strategy-helper"; interface AreaOptions { groups_options?: Record; } export interface AreasViewStrategyConfig { - type: "areas"; + type: "areas-overview"; areas_display?: { hidden?: string[]; order?: string[]; @@ -23,8 +24,8 @@ export interface AreasViewStrategyConfig { areas_options?: Record; } -@customElement("areas-view-strategy") -export class AreasViewStrategy extends ReactiveElement { +@customElement("areas-overview-view-strategy") +export class AreasOverviewViewStrategy extends ReactiveElement { static async generate( config: AreasViewStrategyConfig, hass: HomeAssistant @@ -94,7 +95,7 @@ export class AreasViewStrategy extends ReactiveElement { return { type: "sections", - max_columns: 3, + max_columns: 2, sections: areaSections, }; } @@ -102,6 +103,6 @@ export class AreasViewStrategy extends ReactiveElement { declare global { interface HTMLElementTagNameMap { - "areas-view-strategy": AreasViewStrategy; + "areas-overview-view-strategy": AreasOverviewViewStrategy; } } diff --git a/src/panels/lovelace/strategies/areas/editor/hui-areas-dashboard-strategy-editor.ts b/src/panels/lovelace/strategies/areas/editor/hui-areas-dashboard-strategy-editor.ts index 758d26902b..a3add6bfe8 100644 --- a/src/panels/lovelace/strategies/areas/editor/hui-areas-dashboard-strategy-editor.ts +++ b/src/panels/lovelace/strategies/areas/editor/hui-areas-dashboard-strategy-editor.ts @@ -8,13 +8,13 @@ import "../../../../../components/ha-icon-button"; import "../../../../../components/ha-icon-button-prev"; import "../../../../../components/ha-icon"; import type { HomeAssistant } from "../../../../../types"; -import type { AreaStrategyGroup } from "../helpers/area-strategy-helper"; +import type { AreaStrategyGroup } from "../helpers/areas-strategy-helper"; import { AREA_STRATEGY_GROUP_ICONS, AREA_STRATEGY_GROUPS, AREA_STRATEGY_GROUP_LABELS, getAreaGroupedEntities, -} from "../helpers/area-strategy-helper"; +} from "../helpers/areas-strategy-helper"; import type { LovelaceStrategyEditor } from "../../types"; import type { AreasDashboardStrategyConfig } from "../areas-dashboard-strategy"; diff --git a/src/panels/lovelace/strategies/areas/helpers/area-strategy-helper.ts b/src/panels/lovelace/strategies/areas/helpers/areas-strategy-helper.ts similarity index 89% rename from src/panels/lovelace/strategies/areas/helpers/area-strategy-helper.ts rename to src/panels/lovelace/strategies/areas/helpers/areas-strategy-helper.ts index 55fdcd7c2c..3b0843f626 100644 --- a/src/panels/lovelace/strategies/areas/helpers/area-strategy-helper.ts +++ b/src/panels/lovelace/strategies/areas/helpers/areas-strategy-helper.ts @@ -4,6 +4,8 @@ import type { EntityFilterFunc } from "../../../../../common/entity/entity_filte import { generateEntityFilter } from "../../../../../common/entity/entity_filter"; import { stripPrefixFromEntityName } from "../../../../../common/entity/strip_prefix_from_entity_name"; import { orderCompare } from "../../../../../common/string/compare"; +import type { AreaRegistryEntry } from "../../../../../data/area_registry"; +import { areaCompare } from "../../../../../data/area_registry"; import type { LovelaceCardConfig } from "../../../../../data/lovelace/config/card"; import type { HomeAssistant } from "../../../../../types"; import { supportsAlarmModesCardFeature } from "../../../card-features/hui-alarm-modes-card-feature"; @@ -23,7 +25,7 @@ export const AREA_STRATEGY_GROUPS = [ ] as const; export const AREA_STRATEGY_GROUP_ICONS = { - lights: "mdi:lightbulb", + lights: "mdi:lamps", climate: "mdi:home-thermometer", media_players: "mdi:multimedia", security: "mdi:security", @@ -68,16 +70,6 @@ export const getAreaGroupedEntities = ( }), ], climate: [ - generateEntityFilter(hass, { - domain: "climate", - area: area, - entity_category: "none", - }), - generateEntityFilter(hass, { - domain: "humidifier", - area: area, - entity_category: "none", - }), generateEntityFilter(hass, { domain: "cover", area: area, @@ -93,6 +85,21 @@ export const getAreaGroupedEntities = ( ], entity_category: "none", }), + generateEntityFilter(hass, { + domain: "climate", + area: area, + entity_category: "none", + }), + generateEntityFilter(hass, { + domain: "humidifier", + area: area, + entity_category: "none", + }), + generateEntityFilter(hass, { + domain: "water_heater", + area: area, + entity_category: "none", + }), generateEntityFilter(hass, { domain: "fan", area: area, @@ -246,3 +253,25 @@ export const computeAreaTileCardConfig = ...additionalCardConfig, }; }; + +export const getAreas = ( + entries: HomeAssistant["areas"], + hiddenAreas?: string[], + areasOrder?: string[] +): AreaRegistryEntry[] => { + const areas = Object.values(entries); + + const filteredAreas = hiddenAreas + ? areas.filter((area) => !hiddenAreas!.includes(area.area_id)) + : areas.concat(); + + const compare = areaCompare(entries, areasOrder); + + const sortedAreas = filteredAreas.sort((areaA, areaB) => + compare(areaA.area_id, areaB.area_id) + ); + + return sortedAreas; +}; + +export const computeAreaPath = (areaId: string): string => `areas-${areaId}`; diff --git a/src/panels/lovelace/strategies/areas/helpers/areas-strategy-helpers.ts b/src/panels/lovelace/strategies/areas/helpers/areas-strategy-helpers.ts deleted file mode 100644 index 3dde5af439..0000000000 --- a/src/panels/lovelace/strategies/areas/helpers/areas-strategy-helpers.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { AreaRegistryEntry } from "../../../../../data/area_registry"; -import { areaCompare } from "../../../../../data/area_registry"; -import type { HomeAssistant } from "../../../../../types"; - -export const getAreas = ( - entries: HomeAssistant["areas"], - hiddenAreas?: string[], - areasOrder?: string[] -): AreaRegistryEntry[] => { - const areas = Object.values(entries); - - const filteredAreas = hiddenAreas - ? areas.filter((area) => !hiddenAreas!.includes(area.area_id)) - : areas.concat(); - - const compare = areaCompare(entries, areasOrder); - - const sortedAreas = filteredAreas.sort((areaA, areaB) => - compare(areaA.area_id, areaB.area_id) - ); - - return sortedAreas; -}; - -export const computeAreaPath = (areaId: string): string => `areas-${areaId}`; diff --git a/src/panels/lovelace/strategies/get-strategy.ts b/src/panels/lovelace/strategies/get-strategy.ts index f29259f0de..107bc6e918 100644 --- a/src/panels/lovelace/strategies/get-strategy.ts +++ b/src/panels/lovelace/strategies/get-strategy.ts @@ -33,7 +33,7 @@ const STRATEGIES: Record> = { map: () => import("./map/map-view-strategy"), iframe: () => import("./iframe/iframe-view-strategy"), area: () => import("./areas/area-view-strategy"), - areas: () => import("./areas/areas-view-strategy"), + "areas-overview": () => import("./areas/areas-overview-view-strategy"), }, section: {}, };