diff --git a/cast/src/launcher/layout/hc-cast.ts b/cast/src/launcher/layout/hc-cast.ts index 4df33bc876..bdb15a3c9d 100644 --- a/cast/src/launcher/layout/hc-cast.ts +++ b/cast/src/launcher/layout/hc-cast.ts @@ -3,7 +3,7 @@ import { mdiCast, mdiCastConnected } from "@mdi/js"; import "@polymer/paper-item/paper-icon-item"; import "@polymer/paper-listbox/paper-listbox"; import { Auth, Connection } from "home-assistant-js-websocket"; -import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; +import { CSSResultGroup, LitElement, TemplateResult, css, html } from "lit"; import { customElement, property, state } from "lit/decorators"; import { CastManager } from "../../../../src/cast/cast_manager"; import { @@ -22,8 +22,9 @@ import "../../../../src/components/ha-svg-icon"; import { getLegacyLovelaceCollection, getLovelaceCollection, - LovelaceConfig, } from "../../../../src/data/lovelace"; +import { isStrategyDashboard } from "../../../../src/data/lovelace/config/types"; +import { LovelaceViewConfig } from "../../../../src/data/lovelace/config/view"; import "../../../../src/layouts/hass-loading-screen"; import { generateDefaultViewConfig } from "../../../../src/panels/lovelace/common/generate-lovelace-config"; import "./hc-layout"; @@ -38,10 +39,10 @@ class HcCast extends LitElement { @state() private askWrite = false; - @state() private lovelaceConfig?: LovelaceConfig | null; + @state() private lovelaceViews?: LovelaceViewConfig[] | null; protected render(): TemplateResult { - if (this.lovelaceConfig === undefined) { + if (this.lovelaceViews === undefined) { return html``; } @@ -86,9 +87,10 @@ class HcCast extends LitElement { attr-for-selected="data-path" .selected=${this.castManager.status.lovelacePath || ""} > - ${(this.lovelaceConfig - ? this.lovelaceConfig.views - : [generateDefaultViewConfig({}, {}, {}, {}, () => "")] + ${( + this.lovelaceViews ?? [ + generateDefaultViewConfig({}, {}, {}, {}, () => ""), + ] ).map( (view, idx) => html` { llColl.subscribe((config) => { - this.lovelaceConfig = config; + if (isStrategyDashboard(config)) { + this.lovelaceViews = null; + } else { + this.lovelaceViews = config.views; + } }); }, async () => { - this.lovelaceConfig = null; + this.lovelaceViews = null; } ); @@ -159,9 +165,7 @@ class HcCast extends LitElement { toggleAttribute( this, "hide-icons", - this.lovelaceConfig - ? !this.lovelaceConfig.views.some((view) => view.icon) - : true + this.lovelaceViews ? !this.lovelaceViews.some((view) => view.icon) : true ); } diff --git a/cast/src/receiver/demo/cast-demo-lovelace.ts b/cast/src/receiver/demo/cast-demo-lovelace.ts index 1b0d85f0e5..aa09f2b49b 100644 --- a/cast/src/receiver/demo/cast-demo-lovelace.ts +++ b/cast/src/receiver/demo/cast-demo-lovelace.ts @@ -1,7 +1,5 @@ -import { - LovelaceCardConfig, - LovelaceConfig, -} from "../../../../src/data/lovelace"; +import { LovelaceCardConfig } from "../../../../src/data/lovelace/config/card"; +import { LovelaceConfig } from "../../../../src/data/lovelace/config/types"; import { castContext } from "../cast_context"; export const castDemoLovelace: () => LovelaceConfig = () => { diff --git a/cast/src/receiver/layout/hc-demo.ts b/cast/src/receiver/layout/hc-demo.ts index 16daeead9b..8f53375bd0 100644 --- a/cast/src/receiver/layout/hc-demo.ts +++ b/cast/src/receiver/layout/hc-demo.ts @@ -1,7 +1,7 @@ import { html, nothing } from "lit"; import { customElement, property, state } from "lit/decorators"; import { mockHistory } from "../../../../demo/src/stubs/history"; -import { LovelaceConfig } from "../../../../src/data/lovelace"; +import { LovelaceConfig } from "../../../../src/data/lovelace/config/types"; import { MockHomeAssistant, provideHass, diff --git a/cast/src/receiver/layout/hc-lovelace.ts b/cast/src/receiver/layout/hc-lovelace.ts index 7ccebc9c7b..0de33aa69d 100644 --- a/cast/src/receiver/layout/hc-lovelace.ts +++ b/cast/src/receiver/layout/hc-lovelace.ts @@ -1,7 +1,7 @@ import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; import { customElement, property, query } from "lit/decorators"; import { fireEvent } from "../../../../src/common/dom/fire_event"; -import { LovelaceConfig } from "../../../../src/data/lovelace"; +import { LovelaceConfig } from "../../../../src/data/lovelace/config/types"; import { Lovelace } from "../../../../src/panels/lovelace/types"; import "../../../../src/panels/lovelace/views/hui-view"; import { HomeAssistant } from "../../../../src/types"; @@ -14,7 +14,8 @@ import "./hc-launch-screen"; class HcLovelace extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; - @property({ attribute: false }) public lovelaceConfig!: LovelaceConfig; + @property({ attribute: false }) + public lovelaceConfig!: LovelaceConfig; @property() public viewPath?: string | number; diff --git a/cast/src/receiver/layout/hc-main.ts b/cast/src/receiver/layout/hc-main.ts index 314e290df2..876b68cda3 100644 --- a/cast/src/receiver/layout/hc-main.ts +++ b/cast/src/receiver/layout/hc-main.ts @@ -21,18 +21,26 @@ import { import { atLeastVersion } from "../../../../src/common/config/version"; import { isNavigationClick } from "../../../../src/common/dom/is-navigation-click"; import { - fetchResources, getLegacyLovelaceCollection, getLovelaceCollection, +} from "../../../../src/data/lovelace"; +import { + isStrategyDashboard, LegacyLovelaceConfig, LovelaceConfig, -} from "../../../../src/data/lovelace"; + LovelaceDashboardStrategyConfig, +} from "../../../../src/data/lovelace/config/types"; +import { fetchResources } from "../../../../src/data/lovelace/resource"; import { loadLovelaceResources } from "../../../../src/panels/lovelace/common/load-resources"; import { HassElement } from "../../../../src/state/hass-element"; import { castContext } from "../cast_context"; import "./hc-launch-screen"; -const DEFAULT_STRATEGY = "original-states"; +const DEFAULT_CONFIG: LovelaceDashboardStrategyConfig = { + strategy: { + type: "original-states", + }, +}; let resourcesLoaded = false; @customElement("hc-main") @@ -93,7 +101,7 @@ export class HcMain extends HassElement { .lovelaceConfig=${this._lovelaceConfig} .viewPath=${this._lovelacePath} .urlPath=${this._urlPath} - @config-refresh=${this._generateLovelaceConfig} + @config-refresh=${this._generateDefaultLovelaceConfig} > `; } @@ -284,9 +292,20 @@ export class HcMain extends HassElement { // configuration. try { await llColl.refresh(); - this._unsubLovelace = llColl.subscribe((lovelaceConfig) => - this._handleNewLovelaceConfig(lovelaceConfig) - ); + this._unsubLovelace = llColl.subscribe(async (rawConfig) => { + if (isStrategyDashboard(rawConfig)) { + const { generateLovelaceDashboardStrategy } = await import( + "../../../../src/panels/lovelace/strategies/get-strategy" + ); + const config = await generateLovelaceDashboardStrategy( + rawConfig.strategy, + this.hass! + ); + this._handleNewLovelaceConfig(config); + } else { + this._handleNewLovelaceConfig(rawConfig); + } + }); } catch (err: any) { if ( atLeastVersion(this.hass.connection.haVersion, 0, 107) && @@ -300,7 +319,7 @@ export class HcMain extends HassElement { } // Generate a Lovelace config. this._unsubLovelace = () => undefined; - await this._generateLovelaceConfig(); + await this._generateDefaultLovelaceConfig(); } } if (!resourcesLoaded) { @@ -316,15 +335,13 @@ export class HcMain extends HassElement { this._sendStatus(); } - private async _generateLovelaceConfig() { + private async _generateDefaultLovelaceConfig() { const { generateLovelaceDashboardStrategy } = await import( "../../../../src/panels/lovelace/strategies/get-strategy" ); this._handleNewLovelaceConfig( await generateLovelaceDashboardStrategy( - { - type: DEFAULT_STRATEGY, - }, + DEFAULT_CONFIG.strategy, this.hass! ) ); diff --git a/demo/src/configs/types.ts b/demo/src/configs/types.ts index c8b096cd6e..abd6778527 100644 --- a/demo/src/configs/types.ts +++ b/demo/src/configs/types.ts @@ -1,5 +1,5 @@ import { LocalizeFunc } from "../../../src/common/translations/localize"; -import { LovelaceConfig } from "../../../src/data/lovelace"; +import { LovelaceConfig } from "../../../src/data/lovelace/config/types"; import { Entity } from "../../../src/fake_data/entity"; export interface DemoConfig { diff --git a/demo/src/custom-cards/ha-demo-card.ts b/demo/src/custom-cards/ha-demo-card.ts index 92f1731b71..74730013ae 100644 --- a/demo/src/custom-cards/ha-demo-card.ts +++ b/demo/src/custom-cards/ha-demo-card.ts @@ -4,7 +4,7 @@ import { customElement, property, state } from "lit/decorators"; import { until } from "lit/directives/until"; import "../../../src/components/ha-card"; import "../../../src/components/ha-circular-progress"; -import { LovelaceCardConfig } from "../../../src/data/lovelace"; +import { LovelaceCardConfig } from "../../../src/data/lovelace/config/card"; import { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; import { Lovelace, LovelaceCard } from "../../../src/panels/lovelace/types"; import { diff --git a/gallery/src/pages/misc/util-long-press.ts b/gallery/src/pages/misc/util-long-press.ts index a482921b56..7ce2106ba2 100644 --- a/gallery/src/pages/misc/util-long-press.ts +++ b/gallery/src/pages/misc/util-long-press.ts @@ -2,7 +2,7 @@ import "@material/mwc-button"; import { css, html, LitElement, TemplateResult } from "lit"; import { customElement } from "lit/decorators"; import "../../../../src/components/ha-card"; -import { ActionHandlerEvent } from "../../../../src/data/lovelace"; +import { ActionHandlerEvent } from "../../../../src/data/lovelace/action_handler"; import { actionHandler } from "../../../../src/panels/lovelace/common/directives/action-handler-directive"; @customElement("demo-misc-util-long-press") diff --git a/src/components/ha-navigation-picker.ts b/src/components/ha-navigation-picker.ts index 3568a4c613..7758ec9882 100644 --- a/src/components/ha-navigation-picker.ts +++ b/src/components/ha-navigation-picker.ts @@ -3,12 +3,9 @@ import { css, html, LitElement, PropertyValues, TemplateResult } from "lit"; import { customElement, property, query, state } from "lit/decorators"; import { fireEvent } from "../common/dom/fire_event"; import { titleCase } from "../common/string/title-case"; -import { - fetchConfig, - LovelaceConfig, - LovelaceViewConfig, -} from "../data/lovelace"; -import { ValueChangedEvent, HomeAssistant, PanelInfo } from "../types"; +import { fetchConfig } from "../data/lovelace/config/types"; +import { LovelaceViewRawConfig } from "../data/lovelace/config/view"; +import { HomeAssistant, PanelInfo, ValueChangedEvent } from "../types"; import "./ha-combo-box"; import type { HaComboBox } from "./ha-combo-box"; import "./ha-icon"; @@ -32,7 +29,7 @@ const rowRenderer: ComboBoxLitRenderer = (item) => html` const createViewNavigationItem = ( prefix: string, - view: LovelaceViewConfig, + view: LovelaceViewRawConfig, index: number ) => ({ path: `/${prefix}/${view.path ?? index}`, @@ -121,7 +118,7 @@ export class HaNavigationPicker extends LitElement { panel.url_path === "lovelace" ? null : panel.url_path, true ) - .then((config) => [panel.id, config] as [string, LovelaceConfig]) + .then((config) => [panel.id, config] as [string, typeof config]) .catch((_) => [panel.id, undefined] as [string, undefined]) ) ); @@ -135,7 +132,7 @@ export class HaNavigationPicker extends LitElement { const config = panelViewConfig.get(panel.id); - if (!config) continue; + if (!config || !("views" in config)) continue; config.views.forEach((view, index) => this.navigationItems.push( diff --git a/src/components/ha-selector/ha-selector-ui-action.ts b/src/components/ha-selector/ha-selector-ui-action.ts index 3b607160c1..7888ec1128 100644 --- a/src/components/ha-selector/ha-selector-ui-action.ts +++ b/src/components/ha-selector/ha-selector-ui-action.ts @@ -1,10 +1,10 @@ import { html, LitElement } from "lit"; import { customElement, property } from "lit/decorators"; import { fireEvent } from "../../common/dom/fire_event"; +import { ActionConfig } from "../../data/lovelace/config/action"; import { UiActionSelector } from "../../data/selector"; -import { HomeAssistant } from "../../types"; import "../../panels/lovelace/components/hui-action-editor"; -import { ActionConfig } from "../../data/lovelace"; +import { HomeAssistant } from "../../types"; @customElement("ha-selector-ui_action") export class HaSelectorUiAction extends LitElement { diff --git a/src/components/ha-selector/ha-selector-ui-color.ts b/src/components/ha-selector/ha-selector-ui-color.ts index 149ad61550..4d77d1e213 100644 --- a/src/components/ha-selector/ha-selector-ui-color.ts +++ b/src/components/ha-selector/ha-selector-ui-color.ts @@ -1,7 +1,6 @@ import { html, LitElement } from "lit"; import { customElement, property } from "lit/decorators"; import { fireEvent } from "../../common/dom/fire_event"; -import { ActionConfig } from "../../data/lovelace"; import { UiColorSelector } from "../../data/selector"; import "../../panels/lovelace/components/hui-color-picker"; import { HomeAssistant } from "../../types"; @@ -12,7 +11,7 @@ export class HaSelectorUiColor extends LitElement { @property() public selector!: UiColorSelector; - @property() public value?: ActionConfig; + @property() public value?: string; @property() public label?: string; diff --git a/src/components/ha-sidebar.ts b/src/components/ha-sidebar.ts index 98bd6a3458..454461b5ce 100644 --- a/src/components/ha-sidebar.ts +++ b/src/components/ha-sidebar.ts @@ -41,7 +41,7 @@ import { toggleAttribute } from "../common/dom/toggle_attribute"; import { stringCompare } from "../common/string/compare"; import { computeRTL } from "../common/util/compute_rtl"; import { throttle } from "../common/util/throttle"; -import { ActionHandlerDetail } from "../data/lovelace"; +import { ActionHandlerDetail } from "../data/lovelace/action_handler"; import { PersistentNotification, subscribeNotifications, diff --git a/src/data/lovelace.ts b/src/data/lovelace.ts index 87279bc2b0..1d6ba571ac 100644 --- a/src/data/lovelace.ts +++ b/src/data/lovelace.ts @@ -2,9 +2,7 @@ import { Connection, getCollection, HassEventBase, - HassServiceTarget, } from "home-assistant-js-websocket"; -import { HASSDomEvent } from "../common/dom/fire_event"; import { HuiErrorCard } from "../panels/lovelace/cards/hui-error-card"; import { Lovelace, @@ -12,90 +10,13 @@ import { LovelaceCard, } from "../panels/lovelace/types"; import { HomeAssistant } from "../types"; +import { fetchConfig, LegacyLovelaceConfig } from "./lovelace/config/types"; +import { LovelaceViewConfig } from "./lovelace/config/view"; export interface LovelacePanelConfig { mode: "yaml" | "storage"; } -export type LovelaceStrategyConfig = { - type: string; - [key: string]: any; -}; - -export interface LovelaceConfig { - title?: string; - strategy?: LovelaceStrategyConfig; - views: LovelaceViewConfig[]; - background?: string; -} - -export interface LegacyLovelaceConfig extends LovelaceConfig { - resources?: LovelaceResource[]; -} - -export interface LovelaceResource { - id: string; - type: "css" | "js" | "module" | "html"; - url: string; -} - -export interface LovelaceResourcesMutableParams { - res_type: LovelaceResource["type"]; - url: string; -} - -export type LovelaceDashboard = - | LovelaceYamlDashboard - | LovelaceStorageDashboard; - -interface LovelaceGenericDashboard { - id: string; - url_path: string; - require_admin: boolean; - show_in_sidebar: boolean; - icon?: string; - title: string; -} - -export interface LovelaceYamlDashboard extends LovelaceGenericDashboard { - mode: "yaml"; - filename: string; -} - -export interface LovelaceStorageDashboard extends LovelaceGenericDashboard { - mode: "storage"; -} - -export interface LovelaceDashboardMutableParams { - require_admin: boolean; - show_in_sidebar: boolean; - icon?: string; - title: string; -} - -export interface LovelaceDashboardCreateParams - extends LovelaceDashboardMutableParams { - url_path: string; - mode: "storage"; -} - -export interface LovelaceViewConfig { - index?: number; - title?: string; - type?: string; - strategy?: LovelaceStrategyConfig; - badges?: Array; - cards?: LovelaceCardConfig[]; - path?: string; - icon?: string; - theme?: string; - panel?: boolean; - background?: string; - visible?: boolean | ShowViewConfig[]; - subview?: boolean; - back_path?: string; -} - export interface LovelaceViewElement extends HTMLElement { hass?: HomeAssistant; lovelace?: Lovelace; @@ -107,89 +28,6 @@ export interface LovelaceViewElement extends HTMLElement { setConfig(config: LovelaceViewConfig): void; } -export interface ShowViewConfig { - user?: string; -} - -export interface LovelaceBadgeConfig { - type?: string; - [key: string]: any; -} - -export interface LovelaceCardConfig { - index?: number; - view_index?: number; - view_layout?: any; - type: string; - [key: string]: any; -} - -export interface ToggleActionConfig extends BaseActionConfig { - action: "toggle"; -} - -export interface CallServiceActionConfig extends BaseActionConfig { - action: "call-service"; - service: string; - target?: HassServiceTarget; - // "service_data" is kept for backwards compatibility. Replaced by "data". - service_data?: Record; - data?: Record; -} - -export interface NavigateActionConfig extends BaseActionConfig { - action: "navigate"; - navigation_path: string; - navigation_replace?: boolean; -} - -export interface UrlActionConfig extends BaseActionConfig { - action: "url"; - url_path: string; -} - -export interface MoreInfoActionConfig extends BaseActionConfig { - action: "more-info"; -} - -export interface AssistActionConfig extends BaseActionConfig { - action: "assist"; - pipeline_id?: string; - start_listening?: boolean; -} - -export interface NoActionConfig extends BaseActionConfig { - action: "none"; -} - -export interface CustomActionConfig extends BaseActionConfig { - action: "fire-dom-event"; -} - -export interface BaseActionConfig { - action: string; - confirmation?: ConfirmationRestrictionConfig; -} - -export interface ConfirmationRestrictionConfig { - text?: string; - exemptions?: RestrictionConfig[]; -} - -export interface RestrictionConfig { - user: string; -} - -export type ActionConfig = - | ToggleActionConfig - | CallServiceActionConfig - | NavigateActionConfig - | UrlActionConfig - | MoreInfoActionConfig - | AssistActionConfig - | NoActionConfig - | CustomActionConfig; - type LovelaceUpdatedEvent = HassEventBase & { event_type: "lovelace_updated"; data: { @@ -198,101 +36,6 @@ type LovelaceUpdatedEvent = HassEventBase & { }; }; -export const fetchResources = (conn: Connection): Promise => - conn.sendMessagePromise({ - type: "lovelace/resources", - }); - -export const createResource = ( - hass: HomeAssistant, - values: LovelaceResourcesMutableParams -) => - hass.callWS({ - type: "lovelace/resources/create", - ...values, - }); - -export const updateResource = ( - hass: HomeAssistant, - id: string, - updates: Partial -) => - hass.callWS({ - type: "lovelace/resources/update", - resource_id: id, - ...updates, - }); - -export const deleteResource = (hass: HomeAssistant, id: string) => - hass.callWS({ - type: "lovelace/resources/delete", - resource_id: id, - }); - -export const fetchDashboards = ( - hass: HomeAssistant -): Promise => - hass.callWS({ - type: "lovelace/dashboards/list", - }); - -export const createDashboard = ( - hass: HomeAssistant, - values: LovelaceDashboardCreateParams -) => - hass.callWS({ - type: "lovelace/dashboards/create", - ...values, - }); - -export const updateDashboard = ( - hass: HomeAssistant, - id: string, - updates: Partial -) => - hass.callWS({ - type: "lovelace/dashboards/update", - dashboard_id: id, - ...updates, - }); - -export const deleteDashboard = (hass: HomeAssistant, id: string) => - hass.callWS({ - type: "lovelace/dashboards/delete", - dashboard_id: id, - }); - -export const fetchConfig = ( - conn: Connection, - urlPath: string | null, - force: boolean -): Promise => - conn.sendMessagePromise({ - type: "lovelace/config", - url_path: urlPath, - force, - }); - -export const saveConfig = ( - hass: HomeAssistant, - urlPath: string | null, - config: LovelaceConfig -): Promise => - hass.callWS({ - type: "lovelace/config/save", - url_path: urlPath, - config, - }); - -export const deleteConfig = ( - hass: HomeAssistant, - urlPath: string | null -): Promise => - hass.callWS({ - type: "lovelace/config/delete", - url_path: urlPath, - }); - export const subscribeLovelaceUpdates = ( conn: Connection, urlPath: string | null, @@ -324,7 +67,7 @@ export const getLovelaceCollection = ( const fetchLegacyConfig = ( conn: Connection, force: boolean -): Promise => +): Promise => conn.sendMessagePromise({ type: "lovelace/config", force, @@ -347,15 +90,3 @@ export const getLegacyLovelaceCollection = (conn: Connection) => ) ) ); - -export interface ActionHandlerOptions { - hasHold?: boolean; - hasDoubleClick?: boolean; - disabled?: boolean; -} - -export interface ActionHandlerDetail { - action: "hold" | "tap" | "double_tap"; -} - -export type ActionHandlerEvent = HASSDomEvent; diff --git a/src/data/lovelace/action_handler.ts b/src/data/lovelace/action_handler.ts new file mode 100644 index 0000000000..5ad2ef2982 --- /dev/null +++ b/src/data/lovelace/action_handler.ts @@ -0,0 +1,13 @@ +import { HASSDomEvent } from "../../common/dom/fire_event"; + +export interface ActionHandlerOptions { + hasHold?: boolean; + hasDoubleClick?: boolean; + disabled?: boolean; +} + +export interface ActionHandlerDetail { + action: "hold" | "tap" | "double_tap"; +} + +export type ActionHandlerEvent = HASSDomEvent; diff --git a/src/data/lovelace/config/action.ts b/src/data/lovelace/config/action.ts new file mode 100644 index 0000000000..94f781a209 --- /dev/null +++ b/src/data/lovelace/config/action.ts @@ -0,0 +1,67 @@ +import type { HassServiceTarget } from "home-assistant-js-websocket"; + +export interface ToggleActionConfig extends BaseActionConfig { + action: "toggle"; +} + +export interface CallServiceActionConfig extends BaseActionConfig { + action: "call-service"; + service: string; + target?: HassServiceTarget; + // "service_data" is kept for backwards compatibility. Replaced by "data". + service_data?: Record; + data?: Record; +} + +export interface NavigateActionConfig extends BaseActionConfig { + action: "navigate"; + navigation_path: string; + navigation_replace?: boolean; +} + +export interface UrlActionConfig extends BaseActionConfig { + action: "url"; + url_path: string; +} + +export interface MoreInfoActionConfig extends BaseActionConfig { + action: "more-info"; +} + +export interface AssistActionConfig extends BaseActionConfig { + action: "assist"; + pipeline_id?: string; + start_listening?: boolean; +} + +export interface NoActionConfig extends BaseActionConfig { + action: "none"; +} + +export interface CustomActionConfig extends BaseActionConfig { + action: "fire-dom-event"; +} + +export interface BaseActionConfig { + action: string; + confirmation?: ConfirmationRestrictionConfig; +} + +export interface ConfirmationRestrictionConfig { + text?: string; + exemptions?: RestrictionConfig[]; +} + +export interface RestrictionConfig { + user: string; +} + +export type ActionConfig = + | ToggleActionConfig + | CallServiceActionConfig + | NavigateActionConfig + | UrlActionConfig + | MoreInfoActionConfig + | AssistActionConfig + | NoActionConfig + | CustomActionConfig; diff --git a/src/data/lovelace/config/badge.ts b/src/data/lovelace/config/badge.ts new file mode 100644 index 0000000000..661464a935 --- /dev/null +++ b/src/data/lovelace/config/badge.ts @@ -0,0 +1,4 @@ +export interface LovelaceBadgeConfig { + type?: string; + [key: string]: any; +} diff --git a/src/data/lovelace/config/card.ts b/src/data/lovelace/config/card.ts new file mode 100644 index 0000000000..f41fc1e084 --- /dev/null +++ b/src/data/lovelace/config/card.ts @@ -0,0 +1,7 @@ +export interface LovelaceCardConfig { + index?: number; + view_index?: number; + view_layout?: any; + type: string; + [key: string]: any; +} diff --git a/src/data/lovelace/config/strategy.ts b/src/data/lovelace/config/strategy.ts new file mode 100644 index 0000000000..5c35de4812 --- /dev/null +++ b/src/data/lovelace/config/strategy.ts @@ -0,0 +1,4 @@ +export interface LovelaceStrategyConfig { + type: string; + [key: string]: any; +} diff --git a/src/data/lovelace/config/types.ts b/src/data/lovelace/config/types.ts new file mode 100644 index 0000000000..8104493c64 --- /dev/null +++ b/src/data/lovelace/config/types.ts @@ -0,0 +1,63 @@ +import type { Connection } from "home-assistant-js-websocket"; +import type { HomeAssistant } from "../../../types"; +import type { LovelaceResource } from "../resource"; +import type { LovelaceStrategyConfig } from "./strategy"; +import type { LovelaceViewRawConfig } from "./view"; + +export interface LovelaceDashboardBaseConfig {} + +export interface LovelaceConfig extends LovelaceDashboardBaseConfig { + title?: string; + background?: string; + views: LovelaceViewRawConfig[]; +} + +export interface LovelaceDashboardStrategyConfig + extends LovelaceDashboardBaseConfig { + strategy: LovelaceStrategyConfig; +} + +export interface LegacyLovelaceConfig extends LovelaceConfig { + resources?: LovelaceResource[]; +} + +export type LovelaceRawConfig = + | LovelaceConfig + | LovelaceDashboardStrategyConfig; + +export function isStrategyDashboard( + config: LovelaceRawConfig +): config is LovelaceDashboardStrategyConfig { + return "strategy" in config; +} + +export const fetchConfig = ( + conn: Connection, + urlPath: string | null, + force: boolean +): Promise => + conn.sendMessagePromise({ + type: "lovelace/config", + url_path: urlPath, + force, + }); + +export const saveConfig = ( + hass: HomeAssistant, + urlPath: string | null, + config: LovelaceRawConfig +): Promise => + hass.callWS({ + type: "lovelace/config/save", + url_path: urlPath, + config, + }); + +export const deleteConfig = ( + hass: HomeAssistant, + urlPath: string | null +): Promise => + hass.callWS({ + type: "lovelace/config/delete", + url_path: urlPath, + }); diff --git a/src/data/lovelace/config/view.ts b/src/data/lovelace/config/view.ts new file mode 100644 index 0000000000..0c522b60a1 --- /dev/null +++ b/src/data/lovelace/config/view.ts @@ -0,0 +1,40 @@ +import type { LovelaceBadgeConfig } from "./badge"; +import type { LovelaceCardConfig } from "./card"; +import type { LovelaceStrategyConfig } from "./strategy"; + +export interface ShowViewConfig { + user?: string; +} + +export interface LovelaceBaseViewConfig { + index?: number; + title?: string; + path?: string; + icon?: string; + theme?: string; + panel?: boolean; + background?: string; + visible?: boolean | ShowViewConfig[]; + subview?: boolean; + back_path?: string; +} + +export interface LovelaceViewConfig extends LovelaceBaseViewConfig { + type?: string; + badges?: Array; + cards?: LovelaceCardConfig[]; +} + +export interface LovelaceStrategyViewConfig extends LovelaceBaseViewConfig { + strategy: LovelaceStrategyConfig; +} + +export type LovelaceViewRawConfig = + | LovelaceViewConfig + | LovelaceStrategyViewConfig; + +export function isStrategyView( + view: LovelaceViewRawConfig +): view is LovelaceStrategyViewConfig { + return "strategy" in view; +} diff --git a/src/data/lovelace/dashboard.ts b/src/data/lovelace/dashboard.ts new file mode 100644 index 0000000000..39010c64ff --- /dev/null +++ b/src/data/lovelace/dashboard.ts @@ -0,0 +1,69 @@ +import type { HomeAssistant } from "../../types"; + +export type LovelaceDashboard = + | LovelaceYamlDashboard + | LovelaceStorageDashboard; + +interface LovelaceGenericDashboard { + id: string; + url_path: string; + require_admin: boolean; + show_in_sidebar: boolean; + icon?: string; + title: string; +} + +export interface LovelaceYamlDashboard extends LovelaceGenericDashboard { + mode: "yaml"; + filename: string; +} + +export interface LovelaceStorageDashboard extends LovelaceGenericDashboard { + mode: "storage"; +} + +export interface LovelaceDashboardMutableParams { + require_admin: boolean; + show_in_sidebar: boolean; + icon?: string; + title: string; +} + +export interface LovelaceDashboardCreateParams + extends LovelaceDashboardMutableParams { + url_path: string; + mode: "storage"; +} + +export const fetchDashboards = ( + hass: HomeAssistant +): Promise => + hass.callWS({ + type: "lovelace/dashboards/list", + }); + +export const createDashboard = ( + hass: HomeAssistant, + values: LovelaceDashboardCreateParams +) => + hass.callWS({ + type: "lovelace/dashboards/create", + ...values, + }); + +export const updateDashboard = ( + hass: HomeAssistant, + id: string, + updates: Partial +) => + hass.callWS({ + type: "lovelace/dashboards/update", + dashboard_id: id, + ...updates, + }); + +export const deleteDashboard = (hass: HomeAssistant, id: string) => + hass.callWS({ + type: "lovelace/dashboards/delete", + dashboard_id: id, + }); diff --git a/src/data/lovelace/resource.ts b/src/data/lovelace/resource.ts new file mode 100644 index 0000000000..726a534bb4 --- /dev/null +++ b/src/data/lovelace/resource.ts @@ -0,0 +1,44 @@ +import type { Connection } from "home-assistant-js-websocket"; +import type { HomeAssistant } from "../../types"; + +export type LovelaceResource = { + id: string; + type: "css" | "js" | "module" | "html"; + url: string; +}; + +export type LovelaceResourcesMutableParams = { + res_type: LovelaceResource["type"]; + url: string; +}; + +export const fetchResources = (conn: Connection): Promise => + conn.sendMessagePromise({ + type: "lovelace/resources", + }); + +export const createResource = ( + hass: HomeAssistant, + values: LovelaceResourcesMutableParams +) => + hass.callWS({ + type: "lovelace/resources/create", + ...values, + }); + +export const updateResource = ( + hass: HomeAssistant, + id: string, + updates: Partial +) => + hass.callWS({ + type: "lovelace/resources/update", + resource_id: id, + ...updates, + }); + +export const deleteResource = (hass: HomeAssistant, id: string) => + hass.callWS({ + type: "lovelace/resources/delete", + resource_id: id, + }); diff --git a/src/data/preloads.ts b/src/data/preloads.ts index ab2c472813..ef2b99a3f3 100644 --- a/src/data/preloads.ts +++ b/src/data/preloads.ts @@ -1,8 +1,9 @@ -import { LovelaceConfig, LovelaceResource } from "./lovelace"; +import { LovelaceRawConfig } from "./lovelace/config/types"; +import { LovelaceResource } from "./lovelace/resource"; import { RecorderInfo } from "./recorder"; export interface WindowWithPreloads extends Window { - llConfProm?: Promise; + llConfProm?: Promise; llResProm?: Promise; recorderInfoProm?: Promise; } diff --git a/src/entrypoints/core.ts b/src/entrypoints/core.ts index a5083b2b2a..a7b660afe6 100644 --- a/src/entrypoints/core.ts +++ b/src/entrypoints/core.ts @@ -15,7 +15,8 @@ import { hassUrl } from "../data/auth"; import { isExternal } from "../data/external"; import { getRecorderInfo } from "../data/recorder"; import { subscribeFrontendUserData } from "../data/frontend"; -import { fetchConfig, fetchResources } from "../data/lovelace"; +import { fetchConfig } from "../data/lovelace/config/types"; +import { fetchResources } from "../data/lovelace/resource"; import { subscribePanels } from "../data/ws-panels"; import { subscribeThemes } from "../data/ws-themes"; import { subscribeRepairsIssueRegistry } from "../data/repairs"; diff --git a/src/panels/config/lovelace/dashboards/dialog-lovelace-dashboard-detail.ts b/src/panels/config/lovelace/dashboards/dialog-lovelace-dashboard-detail.ts index 1c5ccb8c7b..f79687e4c2 100644 --- a/src/panels/config/lovelace/dashboards/dialog-lovelace-dashboard-detail.ts +++ b/src/panels/config/lovelace/dashboards/dialog-lovelace-dashboard-detail.ts @@ -12,7 +12,7 @@ import { LovelaceDashboard, LovelaceDashboardCreateParams, LovelaceDashboardMutableParams, -} from "../../../../data/lovelace"; +} from "../../../../data/lovelace/dashboard"; import { DEFAULT_PANEL, setDefaultPanel } from "../../../../data/panel"; import { haStyleDialog } from "../../../../resources/styles"; import { HomeAssistant } from "../../../../types"; diff --git a/src/panels/config/lovelace/dashboards/ha-config-lovelace-dashboards.ts b/src/panels/config/lovelace/dashboards/ha-config-lovelace-dashboards.ts index 7ab29c4ae9..fc661d48e9 100644 --- a/src/panels/config/lovelace/dashboards/ha-config-lovelace-dashboards.ts +++ b/src/panels/config/lovelace/dashboards/ha-config-lovelace-dashboards.ts @@ -28,15 +28,15 @@ import { fetchDashboards, LovelaceDashboard, LovelaceDashboardCreateParams, - LovelacePanelConfig, updateDashboard, -} from "../../../../data/lovelace"; +} from "../../../../data/lovelace/dashboard"; import { showConfirmationDialog } from "../../../../dialogs/generic/show-dialog-box"; import "../../../../layouts/hass-loading-screen"; import "../../../../layouts/hass-tabs-subpage-data-table"; import { HomeAssistant, Route } from "../../../../types"; import { lovelaceTabs } from "../ha-config-lovelace"; import { showDashboardDetailDialog } from "./show-dialog-lovelace-dashboard-detail"; +import { LovelacePanelConfig } from "../../../../data/lovelace"; type DataTableItem = Pick< LovelaceDashboard, diff --git a/src/panels/config/lovelace/dashboards/show-dialog-lovelace-dashboard-detail.ts b/src/panels/config/lovelace/dashboards/show-dialog-lovelace-dashboard-detail.ts index 0952075dab..85fc0f04bd 100644 --- a/src/panels/config/lovelace/dashboards/show-dialog-lovelace-dashboard-detail.ts +++ b/src/panels/config/lovelace/dashboards/show-dialog-lovelace-dashboard-detail.ts @@ -3,7 +3,7 @@ import { LovelaceDashboard, LovelaceDashboardCreateParams, LovelaceDashboardMutableParams, -} from "../../../../data/lovelace"; +} from "../../../../data/lovelace/dashboard"; export interface LovelaceDashboardDetailsDialogParams { dashboard?: LovelaceDashboard; diff --git a/src/panels/config/lovelace/resources/dialog-lovelace-resource-detail.ts b/src/panels/config/lovelace/resources/dialog-lovelace-resource-detail.ts index ee6bfb577d..4899b465eb 100644 --- a/src/panels/config/lovelace/resources/dialog-lovelace-resource-detail.ts +++ b/src/panels/config/lovelace/resources/dialog-lovelace-resource-detail.ts @@ -6,7 +6,7 @@ import { fireEvent } from "../../../../common/dom/fire_event"; import { createCloseHeading } from "../../../../components/ha-dialog"; import "../../../../components/ha-form/ha-form"; import { SchemaUnion } from "../../../../components/ha-form/types"; -import { LovelaceResourcesMutableParams } from "../../../../data/lovelace"; +import { LovelaceResourcesMutableParams } from "../../../../data/lovelace/resource"; import { haStyleDialog } from "../../../../resources/styles"; import { HomeAssistant } from "../../../../types"; import { LovelaceResourceDetailsDialogParams } from "./show-dialog-lovelace-resource-detail"; diff --git a/src/panels/config/lovelace/resources/ha-config-lovelace-resources.ts b/src/panels/config/lovelace/resources/ha-config-lovelace-resources.ts index 5dc3abbcfe..ec4b8f77d5 100644 --- a/src/panels/config/lovelace/resources/ha-config-lovelace-resources.ts +++ b/src/panels/config/lovelace/resources/ha-config-lovelace-resources.ts @@ -23,7 +23,7 @@ import { fetchResources, LovelaceResource, updateResource, -} from "../../../../data/lovelace"; +} from "../../../../data/lovelace/resource"; import { showAlertDialog, showConfirmationDialog, diff --git a/src/panels/config/lovelace/resources/show-dialog-lovelace-resource-detail.ts b/src/panels/config/lovelace/resources/show-dialog-lovelace-resource-detail.ts index b05488aa34..66651da99b 100644 --- a/src/panels/config/lovelace/resources/show-dialog-lovelace-resource-detail.ts +++ b/src/panels/config/lovelace/resources/show-dialog-lovelace-resource-detail.ts @@ -2,7 +2,7 @@ import { fireEvent } from "../../../../common/dom/fire_event"; import { LovelaceResource, LovelaceResourcesMutableParams, -} from "../../../../data/lovelace"; +} from "../../../../data/lovelace/resource"; export interface LovelaceResourceDetailsDialogParams { resource?: LovelaceResource; diff --git a/src/panels/energy/cards/energy-setup-wizard-card.ts b/src/panels/energy/cards/energy-setup-wizard-card.ts index 7a4d674398..0944abce63 100644 --- a/src/panels/energy/cards/energy-setup-wizard-card.ts +++ b/src/panels/energy/cards/energy-setup-wizard-card.ts @@ -1,3 +1,4 @@ +import "@material/mwc-button/mwc-button"; import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; import { customElement, property, state } from "lit/decorators"; import { fireEvent } from "../../../common/dom/fire_event"; @@ -7,18 +8,17 @@ import { getEnergyInfo, saveEnergyPreferences, } from "../../../data/energy"; -import { LovelaceCardConfig } from "../../../data/lovelace"; +import { LovelaceCardConfig } from "../../../data/lovelace/config/card"; +import { showAlertDialog } from "../../../dialogs/generic/show-dialog-box"; +import { haStyle } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; -import { LovelaceCard, Lovelace } from "../../lovelace/types"; -import "@material/mwc-button/mwc-button"; +import "../../config/energy/components/ha-energy-battery-settings"; +import "../../config/energy/components/ha-energy-device-settings"; +import "../../config/energy/components/ha-energy-gas-settings"; import "../../config/energy/components/ha-energy-grid-settings"; import "../../config/energy/components/ha-energy-solar-settings"; -import "../../config/energy/components/ha-energy-battery-settings"; -import "../../config/energy/components/ha-energy-gas-settings"; import "../../config/energy/components/ha-energy-water-settings"; -import "../../config/energy/components/ha-energy-device-settings"; -import { haStyle } from "../../../resources/styles"; -import { showAlertDialog } from "../../../dialogs/generic/show-dialog-box"; +import { Lovelace, LovelaceCard } from "../../lovelace/types"; @customElement("energy-setup-wizard-card") export class EnergySetupWizard extends LitElement implements LovelaceCard { diff --git a/src/panels/energy/ha-panel-energy.ts b/src/panels/energy/ha-panel-energy.ts index c9cf85f45b..bc76cf3f6d 100644 --- a/src/panels/energy/ha-panel-energy.ts +++ b/src/panels/energy/ha-panel-energy.ts @@ -1,21 +1,21 @@ import { - css, CSSResultGroup, - html, LitElement, PropertyValues, TemplateResult, + css, + html, nothing, } from "lit"; import { customElement, property, state } from "lit/decorators"; import "../../components/ha-menu-button"; -import { LovelaceConfig } from "../../data/lovelace"; +import "../../components/ha-top-app-bar-fixed"; +import { LovelaceConfig } from "../../data/lovelace/config/types"; import { haStyle } from "../../resources/styles"; import { HomeAssistant } from "../../types"; import "../lovelace/components/hui-energy-period-selector"; import { Lovelace } from "../lovelace/types"; import "../lovelace/views/hui-view"; -import "../../components/ha-top-app-bar-fixed"; const ENERGY_LOVELACE_CONFIG: LovelaceConfig = { views: [ diff --git a/src/panels/energy/strategies/energy-view-strategy.ts b/src/panels/energy/strategies/energy-view-strategy.ts index 4c263ea438..0ca612065d 100644 --- a/src/panels/energy/strategies/energy-view-strategy.ts +++ b/src/panels/energy/strategies/energy-view-strategy.ts @@ -5,11 +5,9 @@ import { getEnergyPreferences, GridSourceTypeEnergyPreference, } from "../../../data/energy"; -import { - LovelaceStrategyConfig, - LovelaceViewConfig, -} from "../../../data/lovelace"; import { HomeAssistant } from "../../../types"; +import { LovelaceViewConfig } from "../../../data/lovelace/config/view"; +import { LovelaceStrategyConfig } from "../../../data/lovelace/config/strategy"; const setupWizard = async (): Promise => { await import("../cards/energy-setup-wizard-card"); diff --git a/src/panels/lovelace/badges/hui-state-label-badge.ts b/src/panels/lovelace/badges/hui-state-label-badge.ts index e246db6f62..cc9a769c80 100644 --- a/src/panels/lovelace/badges/hui-state-label-badge.ts +++ b/src/panels/lovelace/badges/hui-state-label-badge.ts @@ -2,13 +2,13 @@ import { css, CSSResultGroup, html, LitElement, nothing } from "lit"; import { customElement, property } from "lit/decorators"; import { ifDefined } from "lit/directives/if-defined"; import "../../../components/entity/ha-state-label-badge"; -import { ActionHandlerEvent } from "../../../data/lovelace"; import { HomeAssistant } from "../../../types"; import { actionHandler } from "../common/directives/action-handler-directive"; import { handleAction } from "../common/handle-action"; import { hasAction } from "../common/has-action"; import { LovelaceBadge } from "../types"; import { StateLabelBadgeConfig } from "./types"; +import { ActionHandlerEvent } from "../../../data/lovelace/action_handler"; @customElement("hui-state-label-badge") export class HuiStateLabelBadge extends LitElement implements LovelaceBadge { diff --git a/src/panels/lovelace/badges/types.ts b/src/panels/lovelace/badges/types.ts index 4868a4bda0..df5ba34dcd 100644 --- a/src/panels/lovelace/badges/types.ts +++ b/src/panels/lovelace/badges/types.ts @@ -1,4 +1,5 @@ -import { ActionConfig, LovelaceBadgeConfig } from "../../../data/lovelace"; +import { ActionConfig } from "../../../data/lovelace/config/action"; +import { LovelaceBadgeConfig } from "../../../data/lovelace/config/badge"; import { EntityFilterEntityConfig } from "../entity-rows/types"; export interface EntityFilterBadgeConfig extends LovelaceBadgeConfig { diff --git a/src/panels/lovelace/cards/hui-button-card.ts b/src/panels/lovelace/cards/hui-button-card.ts index af922760aa..9491dd07e3 100644 --- a/src/panels/lovelace/cards/hui-button-card.ts +++ b/src/panels/lovelace/cards/hui-button-card.ts @@ -44,7 +44,7 @@ import { themesContext, } from "../../../data/context"; import { EntityRegistryDisplayEntry } from "../../../data/entity_registry"; -import { ActionHandlerEvent } from "../../../data/lovelace"; +import { ActionHandlerEvent } from "../../../data/lovelace/action_handler"; import { FrontendLocaleData } from "../../../data/translation"; import { Themes } from "../../../data/ws-themes"; import { HomeAssistant } from "../../../types"; diff --git a/src/panels/lovelace/cards/hui-conditional-card.ts b/src/panels/lovelace/cards/hui-conditional-card.ts index 6b0ba014ee..96d3120ead 100644 --- a/src/panels/lovelace/cards/hui-conditional-card.ts +++ b/src/panels/lovelace/cards/hui-conditional-card.ts @@ -1,5 +1,5 @@ import { customElement } from "lit/decorators"; -import { LovelaceCardConfig } from "../../../data/lovelace"; +import { LovelaceCardConfig } from "../../../data/lovelace/config/card"; import { computeCardSize } from "../common/compute-card-size"; import { HuiConditionalBase } from "../components/hui-conditional-base"; import { createCardElement } from "../create-element/create-card-element"; diff --git a/src/panels/lovelace/cards/hui-entity-filter-card.ts b/src/panels/lovelace/cards/hui-entity-filter-card.ts index ed1db86230..ebd649bc53 100644 --- a/src/panels/lovelace/cards/hui-entity-filter-card.ts +++ b/src/panels/lovelace/cards/hui-entity-filter-card.ts @@ -1,6 +1,6 @@ import { PropertyValues, ReactiveElement } from "lit"; import { property, state } from "lit/decorators"; -import { LovelaceCardConfig } from "../../../data/lovelace"; +import { LovelaceCardConfig } from "../../../data/lovelace/config/card"; import { HomeAssistant } from "../../../types"; import { computeCardSize } from "../common/compute-card-size"; import { evaluateFilter } from "../common/evaluate-filter"; diff --git a/src/panels/lovelace/cards/hui-glance-card.ts b/src/panels/lovelace/cards/hui-glance-card.ts index 6ccad438e3..f34b5f06b9 100644 --- a/src/panels/lovelace/cards/hui-glance-card.ts +++ b/src/panels/lovelace/cards/hui-glance-card.ts @@ -18,24 +18,24 @@ import "../../../components/ha-card"; import "../../../components/ha-icon"; import "../../../components/ha-relative-time"; import { isUnavailableState } from "../../../data/entity"; +import { ActionHandlerEvent } from "../../../data/lovelace/action_handler"; import { - ActionHandlerEvent, CallServiceActionConfig, MoreInfoActionConfig, -} from "../../../data/lovelace"; +} from "../../../data/lovelace/config/action"; import { SENSOR_DEVICE_CLASS_TIMESTAMP } from "../../../data/sensor"; import { HomeAssistant } from "../../../types"; import { actionHandler } from "../common/directives/action-handler-directive"; import { findEntities } from "../common/find-entities"; import { handleAction } from "../common/handle-action"; import { hasAction } from "../common/has-action"; +import { hasConfigOrEntitiesChanged } from "../common/has-changed"; import { processConfigEntities } from "../common/process-config-entities"; import "../components/hui-timestamp-display"; import { createEntityNotFoundWarning } from "../components/hui-warning"; import "../components/hui-warning-element"; import { LovelaceCard, LovelaceCardEditor } from "../types"; import { GlanceCardConfig, GlanceConfigEntity } from "./types"; -import { hasConfigOrEntitiesChanged } from "../common/has-changed"; @customElement("hui-glance-card") export class HuiGlanceCard extends LitElement implements LovelaceCard { diff --git a/src/panels/lovelace/cards/hui-light-card.ts b/src/panels/lovelace/cards/hui-light-card.ts index 308423d55a..0c45c9f1fd 100644 --- a/src/panels/lovelace/cards/hui-light-card.ts +++ b/src/panels/lovelace/cards/hui-light-card.ts @@ -20,7 +20,7 @@ import "../../../components/ha-icon-button"; import "../../../components/ha-state-icon"; import { UNAVAILABLE, isUnavailableState } from "../../../data/entity"; import { LightEntity, lightSupportsBrightness } from "../../../data/light"; -import { ActionHandlerEvent } from "../../../data/lovelace"; +import { ActionHandlerEvent } from "../../../data/lovelace/action_handler"; import { HomeAssistant } from "../../../types"; import { actionHandler } from "../common/directives/action-handler-directive"; import { findEntities } from "../common/find-entities"; diff --git a/src/panels/lovelace/cards/hui-picture-card.ts b/src/panels/lovelace/cards/hui-picture-card.ts index 843d447a67..46b0484478 100644 --- a/src/panels/lovelace/cards/hui-picture-card.ts +++ b/src/panels/lovelace/cards/hui-picture-card.ts @@ -12,7 +12,7 @@ import { ifDefined } from "lit/directives/if-defined"; import { applyThemesOnElement } from "../../../common/dom/apply_themes_on_element"; import "../../../components/ha-card"; import { computeImageUrl, ImageEntity } from "../../../data/image"; -import { ActionHandlerEvent } from "../../../data/lovelace"; +import { ActionHandlerEvent } from "../../../data/lovelace/action_handler"; import { HomeAssistant } from "../../../types"; import { actionHandler } from "../common/directives/action-handler-directive"; import { handleAction } from "../common/handle-action"; diff --git a/src/panels/lovelace/cards/hui-picture-entity-card.ts b/src/panels/lovelace/cards/hui-picture-entity-card.ts index 1353836009..db2068cb82 100644 --- a/src/panels/lovelace/cards/hui-picture-entity-card.ts +++ b/src/panels/lovelace/cards/hui-picture-entity-card.ts @@ -14,7 +14,7 @@ import { computeDomain } from "../../../common/entity/compute_domain"; import { computeStateName } from "../../../common/entity/compute_state_name"; import "../../../components/ha-card"; import { ImageEntity, computeImageUrl } from "../../../data/image"; -import { ActionHandlerEvent } from "../../../data/lovelace"; +import { ActionHandlerEvent } from "../../../data/lovelace/action_handler"; import { HomeAssistant } from "../../../types"; import { actionHandler } from "../common/directives/action-handler-directive"; import { findEntities } from "../common/find-entities"; diff --git a/src/panels/lovelace/cards/hui-picture-glance-card.ts b/src/panels/lovelace/cards/hui-picture-glance-card.ts index 289df6bf33..e8f6fed98e 100644 --- a/src/panels/lovelace/cards/hui-picture-glance-card.ts +++ b/src/panels/lovelace/cards/hui-picture-glance-card.ts @@ -18,7 +18,7 @@ import "../../../components/ha-card"; import "../../../components/ha-icon-button"; import "../../../components/ha-state-icon"; import { computeImageUrl, ImageEntity } from "../../../data/image"; -import { ActionHandlerEvent } from "../../../data/lovelace"; +import { ActionHandlerEvent } from "../../../data/lovelace/action_handler"; import { HomeAssistant } from "../../../types"; import { actionHandler } from "../common/directives/action-handler-directive"; import { findEntities } from "../common/find-entities"; diff --git a/src/panels/lovelace/cards/hui-stack-card.ts b/src/panels/lovelace/cards/hui-stack-card.ts index 28bd1c5ae5..dafda696dc 100644 --- a/src/panels/lovelace/cards/hui-stack-card.ts +++ b/src/panels/lovelace/cards/hui-stack-card.ts @@ -7,7 +7,7 @@ import { nothing, } from "lit"; import { property, state } from "lit/decorators"; -import { LovelaceCardConfig } from "../../../data/lovelace"; +import { LovelaceCardConfig } from "../../../data/lovelace/config/card"; import { HomeAssistant } from "../../../types"; import { createCardElement } from "../create-element/create-card-element"; import { LovelaceCard, LovelaceCardEditor } from "../types"; diff --git a/src/panels/lovelace/cards/hui-starting-card.ts b/src/panels/lovelace/cards/hui-starting-card.ts index 2c7be82c53..c049cf6ba8 100644 --- a/src/panels/lovelace/cards/hui-starting-card.ts +++ b/src/panels/lovelace/cards/hui-starting-card.ts @@ -12,7 +12,7 @@ import { customElement, property } from "lit/decorators"; import { fireEvent } from "../../../common/dom/fire_event"; import "../../../components/ha-card"; import "../../../components/ha-circular-progress"; -import { LovelaceCardConfig } from "../../../data/lovelace"; +import { LovelaceCardConfig } from "../../../data/lovelace/config/card"; import { HomeAssistant } from "../../../types"; import { LovelaceCard } from "../types"; diff --git a/src/panels/lovelace/cards/hui-tile-card.ts b/src/panels/lovelace/cards/hui-tile-card.ts index 8680b42cf0..893f50c124 100644 --- a/src/panels/lovelace/cards/hui-tile-card.ts +++ b/src/panels/lovelace/cards/hui-tile-card.ts @@ -36,7 +36,7 @@ import "../../../components/tile/ha-tile-image"; import "../../../components/tile/ha-tile-info"; import { cameraUrlWithWidthHeight } from "../../../data/camera"; import { isUnavailableState } from "../../../data/entity"; -import type { ActionHandlerEvent } from "../../../data/lovelace"; +import type { ActionHandlerEvent } from "../../../data/lovelace/action_handler"; import { SENSOR_DEVICE_CLASS_TIMESTAMP } from "../../../data/sensor"; import { HomeAssistant } from "../../../types"; import { actionHandler } from "../common/directives/action-handler-directive"; diff --git a/src/panels/lovelace/cards/hui-weather-forecast-card.ts b/src/panels/lovelace/cards/hui-weather-forecast-card.ts index aac1ccce3c..550adaa13b 100644 --- a/src/panels/lovelace/cards/hui-weather-forecast-card.ts +++ b/src/panels/lovelace/cards/hui-weather-forecast-card.ts @@ -18,7 +18,7 @@ import { debounce } from "../../../common/util/debounce"; import "../../../components/ha-card"; import "../../../components/ha-svg-icon"; import { UNAVAILABLE } from "../../../data/entity"; -import { ActionHandlerEvent } from "../../../data/lovelace"; +import { ActionHandlerEvent } from "../../../data/lovelace/action_handler"; import { ForecastEvent, WeatherEntity, diff --git a/src/panels/lovelace/cards/types.ts b/src/panels/lovelace/cards/types.ts index f895961a4e..aa2c2b145d 100644 --- a/src/panels/lovelace/cards/types.ts +++ b/src/panels/lovelace/cards/types.ts @@ -1,5 +1,8 @@ +import { HaDurationData } from "../../../components/ha-duration-input"; +import { ActionConfig } from "../../../data/lovelace/config/action"; +import { LovelaceCardConfig } from "../../../data/lovelace/config/card"; import { Statistic, StatisticType } from "../../../data/recorder"; -import { ActionConfig, LovelaceCardConfig } from "../../../data/lovelace"; +import { ForecastType } from "../../../data/weather"; import { FullCalendarView, TranslationDict } from "../../../types"; import { Condition, LegacyCondition } from "../common/validate-condition"; import { HuiImage } from "../components/hui-image"; @@ -10,9 +13,7 @@ import { LovelaceRowConfig, } from "../entity-rows/types"; import { LovelaceHeaderFooterConfig } from "../header-footer/types"; -import { HaDurationData } from "../../../components/ha-duration-input"; import { LovelaceTileFeatureConfig } from "../tile-features/types"; -import { ForecastType } from "../../../data/weather"; export type AlarmPanelCardConfigState = | "arm_away" diff --git a/src/panels/lovelace/common/compute-tooltip.ts b/src/panels/lovelace/common/compute-tooltip.ts index d6dc844a07..211129299e 100644 --- a/src/panels/lovelace/common/compute-tooltip.ts +++ b/src/panels/lovelace/common/compute-tooltip.ts @@ -1,5 +1,5 @@ import { computeStateName } from "../../../common/entity/compute_state_name"; -import { ActionConfig } from "../../../data/lovelace"; +import { ActionConfig } from "../../../data/lovelace/config/action"; import { HomeAssistant } from "../../../types"; interface Config { diff --git a/src/panels/lovelace/common/compute-unused-entities.ts b/src/panels/lovelace/common/compute-unused-entities.ts index 2408aac2ea..d8abc95994 100755 --- a/src/panels/lovelace/common/compute-unused-entities.ts +++ b/src/panels/lovelace/common/compute-unused-entities.ts @@ -1,4 +1,5 @@ -import { ActionConfig, LovelaceConfig } from "../../../data/lovelace"; +import { ActionConfig } from "../../../data/lovelace/config/action"; +import { LovelaceConfig } from "../../../data/lovelace/config/types"; import { HomeAssistant } from "../../../types"; export const EXCLUDED_DOMAINS = ["zone", "persistent_notification"]; diff --git a/src/panels/lovelace/common/directives/action-handler-directive.ts b/src/panels/lovelace/common/directives/action-handler-directive.ts index 1d2b3c87a5..199cfafc9b 100644 --- a/src/panels/lovelace/common/directives/action-handler-directive.ts +++ b/src/panels/lovelace/common/directives/action-handler-directive.ts @@ -13,7 +13,7 @@ import { deepEqual } from "../../../../common/util/deep-equal"; import { ActionHandlerDetail, ActionHandlerOptions, -} from "../../../../data/lovelace"; +} from "../../../../data/lovelace/action_handler"; const isTouch = "ontouchstart" in window || diff --git a/src/panels/lovelace/common/generate-lovelace-config.ts b/src/panels/lovelace/common/generate-lovelace-config.ts index 16b77e4ce6..0a37fd56e6 100644 --- a/src/panels/lovelace/common/generate-lovelace-config.ts +++ b/src/panels/lovelace/common/generate-lovelace-config.ts @@ -12,7 +12,8 @@ import { GridSourceTypeEnergyPreference, } from "../../../data/energy"; import { domainToName } from "../../../data/integration"; -import { LovelaceCardConfig, LovelaceViewConfig } from "../../../data/lovelace"; +import { LovelaceCardConfig } from "../../../data/lovelace/config/card"; +import { LovelaceViewConfig } from "../../../data/lovelace/config/view"; import { computeUserInitials } from "../../../data/user"; import { HomeAssistant } from "../../../types"; import { HELPER_DOMAINS } from "../../config/helpers/const"; diff --git a/src/panels/lovelace/common/handle-action.ts b/src/panels/lovelace/common/handle-action.ts index 05f6b2b270..c1995c2f81 100644 --- a/src/panels/lovelace/common/handle-action.ts +++ b/src/panels/lovelace/common/handle-action.ts @@ -2,7 +2,7 @@ import { fireEvent } from "../../../common/dom/fire_event"; import { navigate } from "../../../common/navigate"; import { forwardHaptic } from "../../../data/haptics"; import { domainToName } from "../../../data/integration"; -import { ActionConfig } from "../../../data/lovelace"; +import { ActionConfig } from "../../../data/lovelace/config/action"; import { showConfirmationDialog } from "../../../dialogs/generic/show-dialog-box"; import { showVoiceCommandDialog } from "../../../dialogs/voice-command-dialog/show-ha-voice-command-dialog"; import { HomeAssistant } from "../../../types"; diff --git a/src/panels/lovelace/common/has-action.ts b/src/panels/lovelace/common/has-action.ts index caf973c77b..a6df67f4fe 100644 --- a/src/panels/lovelace/common/has-action.ts +++ b/src/panels/lovelace/common/has-action.ts @@ -1,4 +1,4 @@ -import { ActionConfig } from "../../../data/lovelace"; +import { ActionConfig } from "../../../data/lovelace/config/action"; export function hasAction(config?: ActionConfig): boolean { return config !== undefined && config.action !== "none"; diff --git a/src/panels/lovelace/common/load-resources.ts b/src/panels/lovelace/common/load-resources.ts index 3285d35d52..5ef499359a 100644 --- a/src/panels/lovelace/common/load-resources.ts +++ b/src/panels/lovelace/common/load-resources.ts @@ -1,5 +1,5 @@ import { loadCSS, loadJS, loadModule } from "../../../common/dom/load_resource"; -import { LovelaceResource } from "../../../data/lovelace"; +import { LovelaceResource } from "../../../data/lovelace/resource"; import type { HomeAssistant } from "../../../types"; // CSS and JS should only be imported once. Modules and HTML are safe. diff --git a/src/panels/lovelace/components/hui-action-editor.ts b/src/panels/lovelace/components/hui-action-editor.ts index 28e4a65902..a6999ee4cb 100644 --- a/src/panels/lovelace/components/hui-action-editor.ts +++ b/src/panels/lovelace/components/hui-action-editor.ts @@ -20,7 +20,7 @@ import { CallServiceActionConfig, NavigateActionConfig, UrlActionConfig, -} from "../../../data/lovelace"; +} from "../../../data/lovelace/config/action"; import { ServiceAction } from "../../../data/script"; import { HomeAssistant } from "../../../types"; import { EditorTarget } from "../editor/types"; diff --git a/src/panels/lovelace/components/hui-buttons-base.ts b/src/panels/lovelace/components/hui-buttons-base.ts index ff04a931a4..0edeb4c2f2 100644 --- a/src/panels/lovelace/components/hui-buttons-base.ts +++ b/src/panels/lovelace/components/hui-buttons-base.ts @@ -2,7 +2,7 @@ import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; import { customElement, state, property } from "lit/decorators"; import { computeStateName } from "../../../common/entity/compute_state_name"; import "../../../components/entity/state-badge"; -import type { ActionHandlerEvent } from "../../../data/lovelace"; +import type { ActionHandlerEvent } from "../../../data/lovelace/action_handler"; import type { HomeAssistant } from "../../../types"; import type { EntitiesCardEntityConfig } from "../cards/types"; import { computeTooltip } from "../common/compute-tooltip"; diff --git a/src/panels/lovelace/components/hui-card-options.ts b/src/panels/lovelace/components/hui-card-options.ts index 7e3a567839..8236d900e3 100644 --- a/src/panels/lovelace/components/hui-card-options.ts +++ b/src/panels/lovelace/components/hui-card-options.ts @@ -26,7 +26,9 @@ import { fireEvent } from "../../../common/dom/fire_event"; import "../../../components/ha-button-menu"; import "../../../components/ha-icon-button"; import "../../../components/ha-list-item"; -import { LovelaceCardConfig, saveConfig } from "../../../data/lovelace"; +import { LovelaceCardConfig } from "../../../data/lovelace/config/card"; +import { saveConfig } from "../../../data/lovelace/config/types"; +import { LovelaceViewConfig } from "../../../data/lovelace/config/view"; import { showAlertDialog, showPromptDialog, @@ -80,6 +82,10 @@ export class HuiCardOptions extends LitElement { ); } + private get _currentView() { + return this.lovelace!.config.views[this.path![0]] as LovelaceViewConfig; + } + protected render(): TemplateResult { return html`
@@ -118,8 +124,7 @@ export class HuiCardOptions extends LitElement { .path=${mdiPlus} class="move-arrow" @click=${this._increaseCardPosition} - .disabled=${this.lovelace!.config.views[this.path![0]] - .cards!.length === + .disabled=${this._currentView.cards!.length === this.path![1] + 1} > ` @@ -267,7 +272,7 @@ export class HuiCardOptions extends LitElement { private _duplicateCard(): void { const path = this.path!; - const cardConfig = this.lovelace!.config.views[path[0]].cards![path[1]]; + const cardConfig = this._currentView.cards![path[1]]; showEditCardDialog(this, { lovelaceConfig: this.lovelace!.config, cardConfig, @@ -286,8 +291,7 @@ export class HuiCardOptions extends LitElement { } private _copyCard(): void { - const cardConfig = - this.lovelace!.config.views[this.path![0]].cards![this.path![1]]; + const cardConfig = this._currentView.cards![this.path![1]]; this._clipboard = deepClone(cardConfig); } @@ -353,7 +357,7 @@ export class HuiCardOptions extends LitElement { addCard( selectedDashConfig, [viewIndex], - this.lovelace!.config.views[this.path![0]].cards![this.path![1]] + this._currentView.cards![this.path![1]] ) ); this.lovelace!.saveConfig( diff --git a/src/panels/lovelace/components/hui-generic-entity-row.ts b/src/panels/lovelace/components/hui-generic-entity-row.ts index 347457cb3a..ad6eeaaf04 100644 --- a/src/panels/lovelace/components/hui-generic-entity-row.ts +++ b/src/panels/lovelace/components/hui-generic-entity-row.ts @@ -1,9 +1,9 @@ import { - css, CSSResultGroup, - html, LitElement, PropertyValues, + css, + html, nothing, } from "lit"; import { property } from "lit/decorators"; @@ -16,7 +16,7 @@ import { computeStateName } from "../../../common/entity/compute_state_name"; import { computeRTL } from "../../../common/util/compute_rtl"; import "../../../components/entity/state-badge"; import "../../../components/ha-relative-time"; -import { ActionHandlerEvent } from "../../../data/lovelace"; +import { ActionHandlerEvent } from "../../../data/lovelace/action_handler"; import { HomeAssistant } from "../../../types"; import { EntitiesCardEntityConfig } from "../cards/types"; import { actionHandler } from "../common/directives/action-handler-directive"; diff --git a/src/panels/lovelace/components/types.ts b/src/panels/lovelace/components/types.ts index ecdedbd423..8377af2f9f 100644 --- a/src/panels/lovelace/components/types.ts +++ b/src/panels/lovelace/components/types.ts @@ -1,4 +1,4 @@ -import { LovelaceCardConfig } from "../../../data/lovelace"; +import { LovelaceCardConfig } from "../../../data/lovelace/config/card"; import { Condition } from "../common/validate-condition"; import { LovelaceElementConfig } from "../elements/types"; diff --git a/src/panels/lovelace/create-element/create-badge-element.ts b/src/panels/lovelace/create-element/create-badge-element.ts index 5df44df0ad..2335a48c99 100644 --- a/src/panels/lovelace/create-element/create-badge-element.ts +++ b/src/panels/lovelace/create-element/create-badge-element.ts @@ -1,4 +1,4 @@ -import { LovelaceBadgeConfig } from "../../../data/lovelace"; +import { LovelaceBadgeConfig } from "../../../data/lovelace/config/badge"; import "../badges/hui-state-label-badge"; import { createLovelaceElement } from "./create-element-base"; diff --git a/src/panels/lovelace/create-element/create-card-element.ts b/src/panels/lovelace/create-element/create-card-element.ts index 8c3fb31cd4..1884c79cc1 100644 --- a/src/panels/lovelace/create-element/create-card-element.ts +++ b/src/panels/lovelace/create-element/create-card-element.ts @@ -1,4 +1,4 @@ -import { LovelaceCardConfig } from "../../../data/lovelace"; +import { LovelaceCardConfig } from "../../../data/lovelace/config/card"; import "../cards/hui-button-card"; import "../cards/hui-calendar-card"; import "../cards/hui-entities-card"; @@ -9,8 +9,8 @@ import "../cards/hui-grid-card"; import "../cards/hui-light-card"; import "../cards/hui-sensor-card"; import "../cards/hui-thermostat-card"; -import "../cards/hui-weather-forecast-card"; import "../cards/hui-tile-card"; +import "../cards/hui-weather-forecast-card"; import { createLovelaceElement, getLovelaceElementClass, diff --git a/src/panels/lovelace/create-element/create-element-base.ts b/src/panels/lovelace/create-element/create-element-base.ts index a92d49ba8b..01654958af 100644 --- a/src/panels/lovelace/create-element/create-element-base.ts +++ b/src/panels/lovelace/create-element/create-element-base.ts @@ -1,10 +1,8 @@ import { fireEvent } from "../../../common/dom/fire_event"; -import { - LovelaceBadgeConfig, - LovelaceCardConfig, - LovelaceViewConfig, - LovelaceViewElement, -} from "../../../data/lovelace"; +import { LovelaceViewElement } from "../../../data/lovelace"; +import { LovelaceBadgeConfig } from "../../../data/lovelace/config/badge"; +import { LovelaceCardConfig } from "../../../data/lovelace/config/card"; +import { LovelaceViewConfig } from "../../../data/lovelace/config/view"; import { isCustomType, stripCustomPrefix, diff --git a/src/panels/lovelace/create-element/create-view-element.ts b/src/panels/lovelace/create-element/create-view-element.ts index 01dc1ab439..158cf2da31 100644 --- a/src/panels/lovelace/create-element/create-view-element.ts +++ b/src/panels/lovelace/create-element/create-view-element.ts @@ -1,7 +1,5 @@ -import { - LovelaceViewConfig, - LovelaceViewElement, -} from "../../../data/lovelace"; +import { LovelaceViewElement } from "../../../data/lovelace"; +import { LovelaceViewConfig } from "../../../data/lovelace/config/view"; import { HuiErrorCard } from "../cards/hui-error-card"; import "../views/hui-masonry-view"; import { createLovelaceElement } from "./create-element-base"; diff --git a/src/panels/lovelace/editor/add-entities-to-view.ts b/src/panels/lovelace/editor/add-entities-to-view.ts index cd1aed9d8b..f28270a143 100644 --- a/src/panels/lovelace/editor/add-entities-to-view.ts +++ b/src/panels/lovelace/editor/add-entities-to-view.ts @@ -1,10 +1,10 @@ +import { LovelacePanelConfig } from "../../../data/lovelace"; import { - fetchConfig, - fetchDashboards, LovelaceConfig, - LovelacePanelConfig, + fetchConfig, saveConfig, -} from "../../../data/lovelace"; +} from "../../../data/lovelace/config/types"; +import { fetchDashboards } from "../../../data/lovelace/dashboard"; import { showAlertDialog } from "../../../dialogs/generic/show-dialog-box"; import { HomeAssistant } from "../../../types"; import { showSuggestCardDialog } from "./card-editor/show-suggest-card-dialog"; diff --git a/src/panels/lovelace/editor/card-editor/hui-card-element-editor.ts b/src/panels/lovelace/editor/card-editor/hui-card-element-editor.ts index be036fb404..7c17bddea7 100644 --- a/src/panels/lovelace/editor/card-editor/hui-card-element-editor.ts +++ b/src/panels/lovelace/editor/card-editor/hui-card-element-editor.ts @@ -1,5 +1,5 @@ import { customElement } from "lit/decorators"; -import type { LovelaceCardConfig } from "../../../../data/lovelace"; +import { LovelaceCardConfig } from "../../../../data/lovelace/config/card"; import { getCardElementClass } from "../../create-element/create-card-element"; import type { LovelaceCardEditor, LovelaceConfigForm } from "../../types"; import { HuiElementEditor } from "../hui-element-editor"; diff --git a/src/panels/lovelace/editor/card-editor/hui-card-picker.ts b/src/panels/lovelace/editor/card-editor/hui-card-picker.ts index 74930d4854..d228aa60f6 100644 --- a/src/panels/lovelace/editor/card-editor/hui-card-picker.ts +++ b/src/panels/lovelace/editor/card-editor/hui-card-picker.ts @@ -1,11 +1,11 @@ import Fuse, { IFuseOptions } from "fuse.js"; import { - css, CSSResultGroup, - html, LitElement, PropertyValues, TemplateResult, + css, + html, nothing, } from "lit"; import { customElement, property, state } from "lit/decorators"; @@ -18,14 +18,12 @@ import { fireEvent } from "../../../../common/dom/fire_event"; import "../../../../components/ha-circular-progress"; import "../../../../components/search-input"; import { isUnavailableState } from "../../../../data/entity"; -import type { - LovelaceCardConfig, - LovelaceConfig, -} from "../../../../data/lovelace"; +import type { LovelaceCardConfig } from "../../../../data/lovelace/config/card"; +import type { LovelaceConfig } from "../../../../data/lovelace/config/types"; import { + CUSTOM_TYPE_PREFIX, CustomCardEntry, customCards, - CUSTOM_TYPE_PREFIX, getCustomCardEntry, } from "../../../../data/lovelace_custom_cards"; import type { HomeAssistant } from "../../../../types"; diff --git a/src/panels/lovelace/editor/card-editor/hui-card-preview.ts b/src/panels/lovelace/editor/card-editor/hui-card-preview.ts index ad7788312a..5512b1cfbc 100644 --- a/src/panels/lovelace/editor/card-editor/hui-card-preview.ts +++ b/src/panels/lovelace/editor/card-editor/hui-card-preview.ts @@ -1,7 +1,7 @@ import { PropertyValues, ReactiveElement } from "lit"; import { property } from "lit/decorators"; import { computeRTL } from "../../../../common/util/compute_rtl"; -import { LovelaceCardConfig } from "../../../../data/lovelace"; +import { LovelaceCardConfig } from "../../../../data/lovelace/config/card"; import { HomeAssistant } from "../../../../types"; import { createCardElement } from "../../create-element/create-card-element"; import { createErrorCardConfig } from "../../create-element/create-element-base"; diff --git a/src/panels/lovelace/editor/card-editor/hui-dialog-create-card.ts b/src/panels/lovelace/editor/card-editor/hui-dialog-create-card.ts index e7a2bbcb51..c25580e16f 100644 --- a/src/panels/lovelace/editor/card-editor/hui-dialog-create-card.ts +++ b/src/panels/lovelace/editor/card-editor/hui-dialog-create-card.ts @@ -12,7 +12,7 @@ import { computeStateName } from "../../../../common/entity/compute_state_name"; import { DataTableRowData } from "../../../../components/data-table/ha-data-table"; import "../../../../components/ha-dialog"; import "../../../../components/ha-dialog-header"; -import type { LovelaceViewConfig } from "../../../../data/lovelace"; +import type { LovelaceViewConfig } from "../../../../data/lovelace/config/view"; import type { HassDialog } from "../../../../dialogs/make-dialog-manager"; import { haStyleDialog } from "../../../../resources/styles"; import type { HomeAssistant } from "../../../../types"; diff --git a/src/panels/lovelace/editor/card-editor/hui-dialog-delete-card.ts b/src/panels/lovelace/editor/card-editor/hui-dialog-delete-card.ts index 7e97813c1a..ca730833d6 100644 --- a/src/panels/lovelace/editor/card-editor/hui-dialog-delete-card.ts +++ b/src/panels/lovelace/editor/card-editor/hui-dialog-delete-card.ts @@ -2,7 +2,7 @@ import deepFreeze from "deep-freeze"; import { css, CSSResultGroup, html, LitElement, nothing } from "lit"; import { customElement, property, state } from "lit/decorators"; import { fireEvent } from "../../../../common/dom/fire_event"; -import type { LovelaceCardConfig } from "../../../../data/lovelace"; +import type { LovelaceCardConfig } from "../../../../data/lovelace/config/card"; import { haStyleDialog } from "../../../../resources/styles"; import type { HomeAssistant } from "../../../../types"; import "./hui-card-preview"; diff --git a/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts b/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts index f881cb6f57..b492ec8db0 100644 --- a/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts +++ b/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts @@ -16,10 +16,6 @@ import "../../../../components/ha-circular-progress"; import "../../../../components/ha-dialog"; import "../../../../components/ha-dialog-header"; import "../../../../components/ha-icon-button"; -import type { - LovelaceCardConfig, - LovelaceViewConfig, -} from "../../../../data/lovelace"; import { showConfirmationDialog } from "../../../../dialogs/generic/show-dialog-box"; import type { HassDialog } from "../../../../dialogs/make-dialog-manager"; import { haStyleDialog } from "../../../../resources/styles"; @@ -33,6 +29,8 @@ import "./hui-card-element-editor"; import type { HuiCardElementEditor } from "./hui-card-element-editor"; import "./hui-card-preview"; import type { EditCardDialogParams } from "./show-edit-card-dialog"; +import { LovelaceCardConfig } from "../../../../data/lovelace/config/card"; +import { LovelaceViewConfig } from "../../../../data/lovelace/config/view"; declare global { // for fire event diff --git a/src/panels/lovelace/editor/card-editor/hui-dialog-suggest-card.ts b/src/panels/lovelace/editor/card-editor/hui-dialog-suggest-card.ts index 314957f1fc..ad6e0e7aca 100644 --- a/src/panels/lovelace/editor/card-editor/hui-dialog-suggest-card.ts +++ b/src/panels/lovelace/editor/card-editor/hui-dialog-suggest-card.ts @@ -4,7 +4,7 @@ import { customElement, property, query, state } from "lit/decorators"; import { fireEvent } from "../../../../common/dom/fire_event"; import "../../../../components/ha-yaml-editor"; import type { HaYamlEditor } from "../../../../components/ha-yaml-editor"; -import { LovelaceCardConfig } from "../../../../data/lovelace"; +import { LovelaceCardConfig } from "../../../../data/lovelace/config/card"; import { haStyleDialog } from "../../../../resources/styles"; import { HomeAssistant } from "../../../../types"; import { showSaveSuccessToast } from "../../../../util/toast-saved-success"; diff --git a/src/panels/lovelace/editor/card-editor/show-create-card-dialog.ts b/src/panels/lovelace/editor/card-editor/show-create-card-dialog.ts index 2aeec60aa0..dedd6d1b6a 100644 --- a/src/panels/lovelace/editor/card-editor/show-create-card-dialog.ts +++ b/src/panels/lovelace/editor/card-editor/show-create-card-dialog.ts @@ -1,5 +1,5 @@ import { fireEvent } from "../../../../common/dom/fire_event"; -import { LovelaceConfig } from "../../../../data/lovelace"; +import type { LovelaceConfig } from "../../../../data/lovelace/config/types"; export interface CreateCardDialogParams { lovelaceConfig: LovelaceConfig; diff --git a/src/panels/lovelace/editor/card-editor/show-delete-card-dialog.ts b/src/panels/lovelace/editor/card-editor/show-delete-card-dialog.ts index 47395bfd95..f9d6331e8f 100644 --- a/src/panels/lovelace/editor/card-editor/show-delete-card-dialog.ts +++ b/src/panels/lovelace/editor/card-editor/show-delete-card-dialog.ts @@ -1,5 +1,5 @@ import { fireEvent } from "../../../../common/dom/fire_event"; -import { LovelaceCardConfig } from "../../../../data/lovelace"; +import { LovelaceCardConfig } from "../../../../data/lovelace/config/card"; export interface DeleteCardDialogParams { deleteCard: () => void; diff --git a/src/panels/lovelace/editor/card-editor/show-edit-card-dialog.ts b/src/panels/lovelace/editor/card-editor/show-edit-card-dialog.ts index 0636650ba0..f6b55e3b0e 100644 --- a/src/panels/lovelace/editor/card-editor/show-edit-card-dialog.ts +++ b/src/panels/lovelace/editor/card-editor/show-edit-card-dialog.ts @@ -1,5 +1,6 @@ import { fireEvent } from "../../../../common/dom/fire_event"; -import { LovelaceCardConfig, LovelaceConfig } from "../../../../data/lovelace"; +import type { LovelaceCardConfig } from "../../../../data/lovelace/config/card"; +import type { LovelaceConfig } from "../../../../data/lovelace/config/types"; export interface EditCardDialogParams { lovelaceConfig: LovelaceConfig; diff --git a/src/panels/lovelace/editor/card-editor/show-suggest-card-dialog.ts b/src/panels/lovelace/editor/card-editor/show-suggest-card-dialog.ts index 1d892dfb2b..781753e65e 100644 --- a/src/panels/lovelace/editor/card-editor/show-suggest-card-dialog.ts +++ b/src/panels/lovelace/editor/card-editor/show-suggest-card-dialog.ts @@ -1,5 +1,6 @@ import { fireEvent } from "../../../../common/dom/fire_event"; -import { LovelaceCardConfig, LovelaceConfig } from "../../../../data/lovelace"; +import { LovelaceCardConfig } from "../../../../data/lovelace/config/card"; +import { LovelaceConfig } from "../../../../data/lovelace/config/types"; export interface SuggestCardDialogParams { cardTitle?: string; diff --git a/src/panels/lovelace/editor/config-elements/hui-conditional-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-conditional-card-editor.ts index a7a4b6b61c..f875c3ed7e 100644 --- a/src/panels/lovelace/editor/config-elements/hui-conditional-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-conditional-card-editor.ts @@ -11,10 +11,8 @@ import { HASSDomEvent, fireEvent } from "../../../../common/dom/fire_event"; import "../../../../components/ha-button"; import "../../../../components/ha-list-item"; import "../../../../components/ha-svg-icon"; -import type { - LovelaceCardConfig, - LovelaceConfig, -} from "../../../../data/lovelace"; +import { LovelaceCardConfig } from "../../../../data/lovelace/config/card"; +import { LovelaceConfig } from "../../../../data/lovelace/config/types"; import type { HomeAssistant } from "../../../../types"; import type { ConditionalCardConfig } from "../../cards/types"; import type { LovelaceCardEditor } from "../../types"; diff --git a/src/panels/lovelace/editor/config-elements/hui-form-editor.ts b/src/panels/lovelace/editor/config-elements/hui-form-editor.ts index 9db046adfe..0625744d9c 100644 --- a/src/panels/lovelace/editor/config-elements/hui-form-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-form-editor.ts @@ -5,7 +5,7 @@ import { capitalizeFirstLetter } from "../../../../common/string/capitalize-firs import { LocalizeFunc } from "../../../../common/translations/localize"; import "../../../../components/ha-form/ha-form"; import type { HaFormSchema } from "../../../../components/ha-form/types"; -import { LovelaceCardConfig } from "../../../../data/lovelace"; +import { LovelaceCardConfig } from "../../../../data/lovelace/config/card"; import type { HomeAssistant } from "../../../../types"; import type { LovelaceGenericElementEditor } from "../../types"; import { configElementStyle } from "./config-elements-style"; diff --git a/src/panels/lovelace/editor/config-elements/hui-picture-glance-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-picture-glance-card-editor.ts index c6c3d12146..5d4d15c431 100644 --- a/src/panels/lovelace/editor/config-elements/hui-picture-glance-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-picture-glance-card-editor.ts @@ -4,7 +4,7 @@ import { array, assert, assign, object, optional, string } from "superstruct"; import { fireEvent } from "../../../../common/dom/fire_event"; import "../../../../components/ha-form/ha-form"; import type { SchemaUnion } from "../../../../components/ha-form/types"; -import type { ActionConfig } from "../../../../data/lovelace"; +import type { ActionConfig } from "../../../../data/lovelace/config/action"; import type { HomeAssistant } from "../../../../types"; import type { PictureGlanceCardConfig } from "../../cards/types"; import "../../components/hui-entity-editor"; diff --git a/src/panels/lovelace/editor/config-elements/hui-stack-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-stack-card-editor.ts index 77f8fd4a73..b801108ff5 100644 --- a/src/panels/lovelace/editor/config-elements/hui-stack-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-stack-card-editor.ts @@ -25,7 +25,8 @@ import { import { storage } from "../../../../common/decorators/storage"; import { HASSDomEvent, fireEvent } from "../../../../common/dom/fire_event"; import "../../../../components/ha-icon-button"; -import { LovelaceCardConfig, LovelaceConfig } from "../../../../data/lovelace"; +import type { LovelaceCardConfig } from "../../../../data/lovelace/config/card"; +import type { LovelaceConfig } from "../../../../data/lovelace/config/types"; import { HomeAssistant } from "../../../../types"; import { StackCardConfig } from "../../cards/types"; import { LovelaceCardEditor } from "../../types"; diff --git a/src/panels/lovelace/editor/config-util.ts b/src/panels/lovelace/editor/config-util.ts index 928d1481fb..4200ac117a 100644 --- a/src/panels/lovelace/editor/config-util.ts +++ b/src/panels/lovelace/editor/config-util.ts @@ -1,8 +1,9 @@ +import { LovelaceCardConfig } from "../../../data/lovelace/config/card"; +import { LovelaceConfig } from "../../../data/lovelace/config/types"; import { - LovelaceCardConfig, - LovelaceConfig, LovelaceViewConfig, -} from "../../../data/lovelace"; + isStrategyView, +} from "../../../data/lovelace/config/view"; import type { HomeAssistant } from "../../../types"; export const addCard = ( @@ -19,6 +20,10 @@ export const addCard = ( return; } + if (isStrategyView(viewConf)) { + throw new Error("You cannot add a card in a strategy view."); + } + const cards = viewConf.cards ? [...viewConf.cards, cardConfig] : [cardConfig]; @@ -49,6 +54,10 @@ export const addCards = ( return; } + if (isStrategyView(viewConf)) { + throw new Error("You cannot add cards in a strategy view."); + } + const cards = viewConf.cards ? [...viewConf.cards, ...cardConfigs] : [...cardConfigs]; @@ -79,6 +88,10 @@ export const replaceCard = ( return; } + if (isStrategyView(viewConf)) { + throw new Error("You cannot replace a card in a strategy view."); + } + views.push({ ...viewConf, cards: (viewConf.cards || []).map((origConf, ind) => @@ -106,6 +119,10 @@ export const deleteCard = ( return; } + if (isStrategyView(viewConf)) { + throw new Error("You cannot delete a card in a strategy view."); + } + views.push({ ...viewConf, cards: (viewConf.cards || []).filter( @@ -134,6 +151,10 @@ export const insertCard = ( return; } + if (isStrategyView(viewConf)) { + throw new Error("You cannot insert a card in a strategy view."); + } + const cards = viewConf.cards ? [ ...viewConf.cards.slice(0, cardIndex), @@ -159,10 +180,16 @@ export const swapCard = ( path1: [number, number], path2: [number, number] ): LovelaceConfig => { - const card1 = config.views[path1[0]].cards![path1[1]]; - const card2 = config.views[path2[0]].cards![path2[1]]; - const origView1 = config.views[path1[0]]; + const origView2 = config.views[path2[0]]; + + if (isStrategyView(origView1) || isStrategyView(origView2)) { + throw new Error("You cannot move swap cards in a strategy view."); + } + + const card1 = origView1.cards![path1[1]]; + const card2 = origView2.cards![path2[1]]; + const newView1 = { ...origView1, cards: origView1.cards!.map((origCard, index) => @@ -170,10 +197,10 @@ export const swapCard = ( ), }; - const origView2 = path1[0] === path2[0] ? newView1 : config.views[path2[0]]; + const updatedOrigView2 = path1[0] === path2[0] ? newView1 : origView2; const newView2 = { - ...origView2, - cards: origView2.cards!.map((origCard, index) => + ...updatedOrigView2, + cards: updatedOrigView2.cards!.map((origCard, index) => index === path2[1] ? card1 : origCard ), }; @@ -190,9 +217,13 @@ export const moveCardToPosition = ( config: LovelaceConfig, path: [number, number], position: number -) => { +): LovelaceConfig => { const view = config.views[path[0]]; + if (isStrategyView(view)) { + throw new Error("You cannot move a card in a strategy view."); + } + const oldIndex = path[1]; const newIndex = Math.max(Math.min(position - 1, view.cards!.length - 1), 0); @@ -224,6 +255,16 @@ export const moveCard = ( throw new Error("You cannot move a card to the view it is in."); } const fromView = config.views[fromPath[0]]; + const toView = config.views[toPath[0]]; + + if (isStrategyView(fromView)) { + throw new Error("You cannot move a card from a strategy view."); + } + + if (isStrategyView(toView)) { + throw new Error("You cannot move a card to a strategy view."); + } + const card = fromView.cards![fromPath[1]]; const newView1 = { @@ -233,7 +274,6 @@ export const moveCard = ( ), }; - const toView = config.views[toPath[0]]; const cards = toView.cards ? [...toView.cards, card] : [card]; const newView2 = { diff --git a/src/panels/lovelace/editor/delete-card.ts b/src/panels/lovelace/editor/delete-card.ts index 9db1af53bd..f4b2c08b09 100644 --- a/src/panels/lovelace/editor/delete-card.ts +++ b/src/panels/lovelace/editor/delete-card.ts @@ -1,3 +1,4 @@ +import { isStrategyView } from "../../../data/lovelace/config/view"; import { showAlertDialog } from "../../../dialogs/generic/show-dialog-box"; import { HomeAssistant } from "../../../types"; import { showDeleteSuccessToast } from "../../../util/toast-deleted-success"; @@ -11,7 +12,11 @@ export async function confDeleteCard( lovelace: Lovelace, path: [number, number] ): Promise { - const cardConfig = lovelace.config.views[path[0]].cards![path[1]]; + const view = lovelace.config.views[path[0]]; + if (isStrategyView(view)) { + throw new Error("Deleting cards in a strategy view is not supported."); + } + const cardConfig = view.cards![path[1]]; showDeleteCardDialog(element, { cardConfig, deleteCard: async () => { diff --git a/src/panels/lovelace/editor/get-card-stub-config.ts b/src/panels/lovelace/editor/get-card-stub-config.ts index 5249e003be..a260e3c51d 100644 --- a/src/panels/lovelace/editor/get-card-stub-config.ts +++ b/src/panels/lovelace/editor/get-card-stub-config.ts @@ -1,4 +1,4 @@ -import { LovelaceCardConfig } from "../../../data/lovelace"; +import { LovelaceCardConfig } from "../../../data/lovelace/config/card"; import { HomeAssistant } from "../../../types"; import { getCardElementClass } from "../create-element/create-card-element"; diff --git a/src/panels/lovelace/editor/header-footer-editor/hui-header-footer-editor.ts b/src/panels/lovelace/editor/header-footer-editor/hui-header-footer-editor.ts index 781254156e..1036e0437e 100644 --- a/src/panels/lovelace/editor/header-footer-editor/hui-header-footer-editor.ts +++ b/src/panels/lovelace/editor/header-footer-editor/hui-header-footer-editor.ts @@ -1,9 +1,9 @@ import { mdiClose, mdiPencil, mdiPlus } from "@mdi/js"; -import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; +import { CSSResultGroup, LitElement, TemplateResult, css, html } from "lit"; import { customElement, property } from "lit/decorators"; import { fireEvent } from "../../../../common/dom/fire_event"; import "../../../../components/ha-icon-button"; -import type { LovelaceConfig } from "../../../../data/lovelace"; +import type { LovelaceConfig } from "../../../../data/lovelace/config/types"; import type { HomeAssistant } from "../../../../types"; import type { LovelaceHeaderFooterConfig } from "../../header-footer/types"; import { showCreateHeaderFooterDialog } from "./show-create-headerfooter-dialog"; diff --git a/src/panels/lovelace/editor/hui-badge-preview.ts b/src/panels/lovelace/editor/hui-badge-preview.ts index 055ba85cd4..c172d4abb8 100644 --- a/src/panels/lovelace/editor/hui-badge-preview.ts +++ b/src/panels/lovelace/editor/hui-badge-preview.ts @@ -1,6 +1,6 @@ import { computeRTL } from "../../../common/util/compute_rtl"; import "../../../components/entity/ha-state-label-badge"; -import { LovelaceBadgeConfig } from "../../../data/lovelace"; +import { LovelaceBadgeConfig } from "../../../data/lovelace/config/badge"; import { HomeAssistant } from "../../../types"; import { createErrorBadgeConfig } from "../badges/hui-error-badge"; import { createBadgeElement } from "../create-element/create-badge-element"; diff --git a/src/panels/lovelace/editor/hui-dialog-save-config.ts b/src/panels/lovelace/editor/hui-dialog-save-config.ts index cbad03f59a..e66876d4a4 100644 --- a/src/panels/lovelace/editor/hui-dialog-save-config.ts +++ b/src/panels/lovelace/editor/hui-dialog-save-config.ts @@ -10,7 +10,7 @@ import "../../../components/ha-formfield"; import "../../../components/ha-icon-button"; import "../../../components/ha-switch"; import "../../../components/ha-yaml-editor"; -import type { LovelaceConfig } from "../../../data/lovelace"; +import { LovelaceConfig } from "../../../data/lovelace/config/types"; import type { HassDialog } from "../../../dialogs/make-dialog-manager"; import { haStyleDialog } from "../../../resources/styles"; import type { HomeAssistant } from "../../../types"; diff --git a/src/panels/lovelace/editor/hui-element-editor.ts b/src/panels/lovelace/editor/hui-element-editor.ts index 2d2b58f4a1..56486d66ec 100644 --- a/src/panels/lovelace/editor/hui-element-editor.ts +++ b/src/panels/lovelace/editor/hui-element-editor.ts @@ -1,12 +1,12 @@ import "@material/mwc-button"; import { dump, load } from "js-yaml"; import { - css, CSSResultGroup, - html, LitElement, PropertyValues, TemplateResult, + css, + html, } from "lit"; import { property, query, state } from "lit/decorators"; import { fireEvent } from "../../../common/dom/fire_event"; @@ -16,10 +16,8 @@ import "../../../components/ha-alert"; import "../../../components/ha-circular-progress"; import "../../../components/ha-code-editor"; import type { HaCodeEditor } from "../../../components/ha-code-editor"; -import type { - LovelaceCardConfig, - LovelaceConfig, -} from "../../../data/lovelace"; +import type { LovelaceCardConfig } from "../../../data/lovelace/config/card"; +import type { LovelaceConfig } from "../../../data/lovelace/config/types"; import type { HomeAssistant } from "../../../types"; import type { LovelaceRowConfig } from "../entity-rows/types"; import { LovelaceHeaderFooterConfig } from "../header-footer/types"; diff --git a/src/panels/lovelace/editor/lovelace-editor/hui-dialog-edit-lovelace.ts b/src/panels/lovelace/editor/lovelace-editor/hui-dialog-edit-lovelace.ts index 277f9c2232..2ba47bdaf8 100644 --- a/src/panels/lovelace/editor/lovelace-editor/hui-dialog-edit-lovelace.ts +++ b/src/panels/lovelace/editor/lovelace-editor/hui-dialog-edit-lovelace.ts @@ -4,11 +4,11 @@ import { customElement, property, state } from "lit/decorators"; import { fireEvent } from "../../../../common/dom/fire_event"; import "../../../../components/ha-circular-progress"; import "../../../../components/ha-dialog"; -import type { LovelaceConfig } from "../../../../data/lovelace"; import { haStyleDialog } from "../../../../resources/styles"; import type { HomeAssistant } from "../../../../types"; import type { Lovelace } from "../../types"; import "./hui-lovelace-editor"; +import { LovelaceConfig } from "../../../../data/lovelace/config/types"; @customElement("hui-dialog-edit-lovelace") export class HuiDialogEditLovelace extends LitElement { diff --git a/src/panels/lovelace/editor/lovelace-editor/hui-lovelace-editor.ts b/src/panels/lovelace/editor/lovelace-editor/hui-lovelace-editor.ts index cfe3627398..e3805d93f5 100644 --- a/src/panels/lovelace/editor/lovelace-editor/hui-lovelace-editor.ts +++ b/src/panels/lovelace/editor/lovelace-editor/hui-lovelace-editor.ts @@ -1,8 +1,8 @@ -import "../../../../components/ha-textfield"; import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; import { customElement, property } from "lit/decorators"; import { fireEvent } from "../../../../common/dom/fire_event"; -import { LovelaceConfig } from "../../../../data/lovelace"; +import "../../../../components/ha-textfield"; +import type { LovelaceConfig } from "../../../../data/lovelace/config/types"; import { HomeAssistant } from "../../../../types"; import { EditorTarget } from "../types"; diff --git a/src/panels/lovelace/editor/select-view/hui-dialog-select-view.ts b/src/panels/lovelace/editor/select-view/hui-dialog-select-view.ts index 24c8412883..6a9c8eb04f 100644 --- a/src/panels/lovelace/editor/select-view/hui-dialog-select-view.ts +++ b/src/panels/lovelace/editor/select-view/hui-dialog-select-view.ts @@ -10,10 +10,12 @@ import "../../../../components/ha-icon"; import "../../../../components/ha-select"; import { fetchConfig, - fetchDashboards, LovelaceConfig, +} from "../../../../data/lovelace/config/types"; +import { + fetchDashboards, LovelaceDashboard, -} from "../../../../data/lovelace"; +} from "../../../../data/lovelace/dashboard"; import { haStyleDialog } from "../../../../resources/styles"; import { HomeAssistant } from "../../../../types"; import type { SelectViewDialogParams } from "./show-select-view-dialog"; @@ -155,7 +157,11 @@ export class HuiDialogSelectView extends LitElement { this._urlPath = urlPath; this._selectedViewIdx = 0; try { - this._config = await fetchConfig(this.hass.connection, urlPath, false); + this._config = (await fetchConfig( + this.hass.connection, + urlPath, + false + )) as LovelaceConfig; } catch (err: any) { this._config = undefined; } diff --git a/src/panels/lovelace/editor/select-view/show-select-view-dialog.ts b/src/panels/lovelace/editor/select-view/show-select-view-dialog.ts index 4287711de0..d53715c9b4 100644 --- a/src/panels/lovelace/editor/select-view/show-select-view-dialog.ts +++ b/src/panels/lovelace/editor/select-view/show-select-view-dialog.ts @@ -1,5 +1,6 @@ import { fireEvent } from "../../../../common/dom/fire_event"; -import { LovelaceConfig, LovelaceDashboard } from "../../../../data/lovelace"; +import { LovelaceConfig } from "../../../../data/lovelace/config/types"; +import { LovelaceDashboard } from "../../../../data/lovelace/dashboard"; export interface SelectViewDialogParams { lovelaceConfig: LovelaceConfig; diff --git a/src/panels/lovelace/editor/structs/action-struct.ts b/src/panels/lovelace/editor/structs/action-struct.ts index aa94eca774..591b9c0e8f 100644 --- a/src/panels/lovelace/editor/structs/action-struct.ts +++ b/src/panels/lovelace/editor/structs/action-struct.ts @@ -10,7 +10,7 @@ import { type, union, } from "superstruct"; -import { BaseActionConfig } from "../../../../data/lovelace"; +import { BaseActionConfig } from "../../../../data/lovelace/config/action"; const actionConfigStructUser = object({ user: string(), diff --git a/src/panels/lovelace/editor/types.ts b/src/panels/lovelace/editor/types.ts index b3f284cc52..c7d57ae38a 100644 --- a/src/panels/lovelace/editor/types.ts +++ b/src/panels/lovelace/editor/types.ts @@ -1,9 +1,9 @@ +import { ActionConfig } from "../../../data/lovelace/config/action"; +import { LovelaceCardConfig } from "../../../data/lovelace/config/card"; import { - ActionConfig, - LovelaceCardConfig, LovelaceViewConfig, ShowViewConfig, -} from "../../../data/lovelace"; +} from "../../../data/lovelace/config/view"; import { EntityConfig, LovelaceRowConfig } from "../entity-rows/types"; import { LovelaceHeaderFooterConfig } from "../header-footer/types"; import { LovelaceTileFeatureConfig } from "../tile-features/types"; diff --git a/src/panels/lovelace/editor/unused-entities/hui-unused-entities.ts b/src/panels/lovelace/editor/unused-entities/hui-unused-entities.ts index bc16ad3dfe..e633861493 100644 --- a/src/panels/lovelace/editor/unused-entities/hui-unused-entities.ts +++ b/src/panels/lovelace/editor/unused-entities/hui-unused-entities.ts @@ -15,13 +15,13 @@ import { computeRTL } from "../../../../common/util/compute_rtl"; import type { DataTableRowData } from "../../../../components/data-table/ha-data-table"; import "../../../../components/ha-fab"; import "../../../../components/ha-svg-icon"; -import type { LovelaceConfig } from "../../../../data/lovelace"; import type { HomeAssistant } from "../../../../types"; import { computeUnusedEntities } from "../../common/compute-unused-entities"; import type { Lovelace } from "../../types"; import "../card-editor/hui-entity-picker-table"; import { showSuggestCardDialog } from "../card-editor/show-suggest-card-dialog"; import { showSelectViewDialog } from "../select-view/show-select-view-dialog"; +import { LovelaceConfig } from "../../../../data/lovelace/config/types"; @customElement("hui-unused-entities") export class HuiUnusedEntities extends LitElement { diff --git a/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts b/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts index fc5b46aa26..46b01ad325 100644 --- a/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts +++ b/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts @@ -23,11 +23,6 @@ import "../../../../components/ha-dialog"; import "../../../../components/ha-dialog-header"; import "../../../../components/ha-yaml-editor"; import type { HaYamlEditor } from "../../../../components/ha-yaml-editor"; -import type { - LovelaceBadgeConfig, - LovelaceCardConfig, - LovelaceViewConfig, -} from "../../../../data/lovelace"; import { showAlertDialog, showConfirmationDialog, @@ -51,6 +46,12 @@ import { import "./hui-view-editor"; import "./hui-view-visibility-editor"; import { EditViewDialogParams } from "./show-edit-view-dialog"; +import { + LovelaceViewConfig, + isStrategyView, +} from "../../../../data/lovelace/config/view"; +import { LovelaceBadgeConfig } from "../../../../data/lovelace/config/badge"; +import { LovelaceCardConfig } from "../../../../data/lovelace/config/card"; @customElement("hui-dialog-edit-view") export class HuiDialogEditView extends LitElement { @@ -103,13 +104,21 @@ export class HuiDialogEditView extends LitElement { this._badges = []; this._cards = []; this._dirty = false; - } else { - const { cards, badges, ...viewConfig } = - this._params.lovelace!.config.views[this._params.viewIndex]; - this._config = viewConfig; - this._badges = badges ? processEditorEntities(badges) : []; - this._cards = cards; + return; } + const view = this._params.lovelace!.config.views[this._params.viewIndex]; + // Todo : add better support for strategy views + if (isStrategyView(view)) { + const { strategy, ...viewConfig } = view; + this._config = viewConfig; + this._badges = []; + this._cards = []; + return; + } + const { cards, badges, ...viewConfig } = view; + this._config = viewConfig; + this._badges = badges ? processEditorEntities(badges) : []; + this._cards = cards; } public closeDialog(): void { diff --git a/src/panels/lovelace/editor/view-editor/hui-view-editor.ts b/src/panels/lovelace/editor/view-editor/hui-view-editor.ts index 35850f8bc8..29aa461de2 100644 --- a/src/panels/lovelace/editor/view-editor/hui-view-editor.ts +++ b/src/panels/lovelace/editor/view-editor/hui-view-editor.ts @@ -6,13 +6,13 @@ import { slugify } from "../../../../common/string/slugify"; import type { LocalizeFunc } from "../../../../common/translations/localize"; import "../../../../components/ha-form/ha-form"; import type { SchemaUnion } from "../../../../components/ha-form/types"; -import type { LovelaceViewConfig } from "../../../../data/lovelace"; import type { HomeAssistant } from "../../../../types"; import { DEFAULT_VIEW_LAYOUT, PANEL_VIEW_LAYOUT, SIDEBAR_VIEW_LAYOUT, } from "../../views/const"; +import { LovelaceViewConfig } from "../../../../data/lovelace/config/view"; declare global { interface HASSDomEvents { diff --git a/src/panels/lovelace/editor/view-editor/hui-view-visibility-editor.ts b/src/panels/lovelace/editor/view-editor/hui-view-visibility-editor.ts index f9a662e5f3..351846834d 100644 --- a/src/panels/lovelace/editor/view-editor/hui-view-visibility-editor.ts +++ b/src/panels/lovelace/editor/view-editor/hui-view-visibility-editor.ts @@ -1,10 +1,10 @@ import "@material/mwc-list/mwc-list-item"; import { - css, CSSResultGroup, - html, LitElement, PropertyValues, + css, + html, nothing, } from "lit"; import { customElement, property, state } from "lit/decorators"; @@ -13,8 +13,11 @@ import { fireEvent } from "../../../../common/dom/fire_event"; import { stringCompare } from "../../../../common/string/compare"; import { HaSwitch } from "../../../../components/ha-switch"; import "../../../../components/user/ha-user-badge"; -import { LovelaceViewConfig, ShowViewConfig } from "../../../../data/lovelace"; -import { fetchUsers, User } from "../../../../data/user"; +import { + LovelaceViewConfig, + ShowViewConfig, +} from "../../../../data/lovelace/config/view"; +import { User, fetchUsers } from "../../../../data/user"; import { HomeAssistant } from "../../../../types"; declare global { diff --git a/src/panels/lovelace/editor/view-editor/show-edit-view-dialog.ts b/src/panels/lovelace/editor/view-editor/show-edit-view-dialog.ts index 9f13c1dd8c..4caae825ab 100644 --- a/src/panels/lovelace/editor/view-editor/show-edit-view-dialog.ts +++ b/src/panels/lovelace/editor/view-editor/show-edit-view-dialog.ts @@ -1,5 +1,5 @@ import { fireEvent, HASSDomEvent } from "../../../../common/dom/fire_event"; -import { LovelaceViewConfig } from "../../../../data/lovelace"; +import { LovelaceViewConfig } from "../../../../data/lovelace/config/view"; import { Lovelace } from "../../types"; declare global { diff --git a/src/panels/lovelace/elements/hui-icon-element.ts b/src/panels/lovelace/elements/hui-icon-element.ts index e8fc612f91..0dcd51fdd7 100644 --- a/src/panels/lovelace/elements/hui-icon-element.ts +++ b/src/panels/lovelace/elements/hui-icon-element.ts @@ -2,13 +2,13 @@ import { css, CSSResultGroup, html, LitElement, nothing } from "lit"; import { customElement, state } from "lit/decorators"; import { ifDefined } from "lit/directives/if-defined"; import "../../../components/ha-icon"; -import { ActionHandlerEvent } from "../../../data/lovelace"; import { HomeAssistant } from "../../../types"; import { computeTooltip } from "../common/compute-tooltip"; import { actionHandler } from "../common/directives/action-handler-directive"; import { handleAction } from "../common/handle-action"; import { hasAction } from "../common/has-action"; import { IconElementConfig, LovelaceElement } from "./types"; +import { ActionHandlerEvent } from "../../../data/lovelace/action_handler"; @customElement("hui-icon-element") export class HuiIconElement extends LitElement implements LovelaceElement { diff --git a/src/panels/lovelace/elements/hui-image-element.ts b/src/panels/lovelace/elements/hui-image-element.ts index e86058a183..4fc9159c72 100644 --- a/src/panels/lovelace/elements/hui-image-element.ts +++ b/src/panels/lovelace/elements/hui-image-element.ts @@ -1,8 +1,8 @@ import { css, CSSResultGroup, html, LitElement, nothing } from "lit"; import { customElement, property, state } from "lit/decorators"; import { ifDefined } from "lit/directives/if-defined"; -import { ImageEntity, computeImageUrl } from "../../../data/image"; -import { ActionHandlerEvent } from "../../../data/lovelace"; +import { computeImageUrl, ImageEntity } from "../../../data/image"; +import { ActionHandlerEvent } from "../../../data/lovelace/action_handler"; import { HomeAssistant } from "../../../types"; import { computeTooltip } from "../common/compute-tooltip"; import { actionHandler } from "../common/directives/action-handler-directive"; diff --git a/src/panels/lovelace/elements/hui-state-badge-element.ts b/src/panels/lovelace/elements/hui-state-badge-element.ts index c6d316eca3..6d6acda5f8 100644 --- a/src/panels/lovelace/elements/hui-state-badge-element.ts +++ b/src/panels/lovelace/elements/hui-state-badge-element.ts @@ -1,9 +1,9 @@ -import { html, LitElement, PropertyValues, nothing } from "lit"; +import { LitElement, PropertyValues, html, nothing } from "lit"; import { customElement, property, state } from "lit/decorators"; import { ifDefined } from "lit/directives/if-defined"; import { computeStateName } from "../../../common/entity/compute_state_name"; import "../../../components/entity/ha-state-label-badge"; -import { ActionHandlerEvent } from "../../../data/lovelace"; +import { ActionHandlerEvent } from "../../../data/lovelace/action_handler"; import { HomeAssistant } from "../../../types"; import { actionHandler } from "../common/directives/action-handler-directive"; import { handleAction } from "../common/handle-action"; diff --git a/src/panels/lovelace/elements/hui-state-icon-element.ts b/src/panels/lovelace/elements/hui-state-icon-element.ts index 0505ae060d..0e90e2d4fd 100644 --- a/src/panels/lovelace/elements/hui-state-icon-element.ts +++ b/src/panels/lovelace/elements/hui-state-icon-element.ts @@ -9,7 +9,6 @@ import { import { customElement, property, state } from "lit/decorators"; import { ifDefined } from "lit/directives/if-defined"; import "../../../components/entity/state-badge"; -import { ActionHandlerEvent } from "../../../data/lovelace"; import { HomeAssistant } from "../../../types"; import { computeTooltip } from "../common/compute-tooltip"; import { actionHandler } from "../common/directives/action-handler-directive"; @@ -19,6 +18,7 @@ import { hasConfigOrEntityChanged } from "../common/has-changed"; import { createEntityNotFoundWarning } from "../components/hui-warning"; import "../components/hui-warning-element"; import { LovelaceElement, StateIconElementConfig } from "./types"; +import { ActionHandlerEvent } from "../../../data/lovelace/action_handler"; @customElement("hui-state-icon-element") export class HuiStateIconElement extends LitElement implements LovelaceElement { diff --git a/src/panels/lovelace/elements/hui-state-label-element.ts b/src/panels/lovelace/elements/hui-state-label-element.ts index a0427bdbcd..7a210f1458 100644 --- a/src/panels/lovelace/elements/hui-state-label-element.ts +++ b/src/panels/lovelace/elements/hui-state-label-element.ts @@ -8,7 +8,7 @@ import { } from "lit"; import { customElement, property, state } from "lit/decorators"; import { ifDefined } from "lit/directives/if-defined"; -import { ActionHandlerEvent } from "../../../data/lovelace"; +import { ActionHandlerEvent } from "../../../data/lovelace/action_handler"; import { HomeAssistant } from "../../../types"; import { computeTooltip } from "../common/compute-tooltip"; import { actionHandler } from "../common/directives/action-handler-directive"; diff --git a/src/panels/lovelace/elements/types.ts b/src/panels/lovelace/elements/types.ts index a81f89e660..2cddae5721 100644 --- a/src/panels/lovelace/elements/types.ts +++ b/src/panels/lovelace/elements/types.ts @@ -1,4 +1,4 @@ -import { ActionConfig } from "../../../data/lovelace"; +import { ActionConfig } from "../../../data/lovelace/config/action"; import { HomeAssistant } from "../../../types"; import { Condition } from "../common/validate-condition"; import { HuiImage } from "../components/hui-image"; diff --git a/src/panels/lovelace/entity-rows/hui-event-entity-row.ts b/src/panels/lovelace/entity-rows/hui-event-entity-row.ts index 565d046cae..6789896604 100644 --- a/src/panels/lovelace/entity-rows/hui-event-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-event-entity-row.ts @@ -8,7 +8,7 @@ import { } from "lit"; import { customElement, property, state } from "lit/decorators"; import { isUnavailableState } from "../../../data/entity"; -import { ActionHandlerEvent } from "../../../data/lovelace"; +import { ActionHandlerEvent } from "../../../data/lovelace/action_handler"; import { HomeAssistant } from "../../../types"; import { EntitiesCardEntityConfig } from "../cards/types"; import { actionHandler } from "../common/directives/action-handler-directive"; diff --git a/src/panels/lovelace/entity-rows/hui-sensor-entity-row.ts b/src/panels/lovelace/entity-rows/hui-sensor-entity-row.ts index 5f6dec0d22..0a44388991 100644 --- a/src/panels/lovelace/entity-rows/hui-sensor-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-sensor-entity-row.ts @@ -8,7 +8,7 @@ import { } from "lit"; import { customElement, property, state } from "lit/decorators"; import { isUnavailableState } from "../../../data/entity"; -import { ActionHandlerEvent } from "../../../data/lovelace"; +import { ActionHandlerEvent } from "../../../data/lovelace/action_handler"; import { SENSOR_DEVICE_CLASS_TIMESTAMP } from "../../../data/sensor"; import { HomeAssistant } from "../../../types"; import { EntitiesCardEntityConfig } from "../cards/types"; diff --git a/src/panels/lovelace/entity-rows/hui-weather-entity-row.ts b/src/panels/lovelace/entity-rows/hui-weather-entity-row.ts index 1af521ff73..95fce2165c 100644 --- a/src/panels/lovelace/entity-rows/hui-weather-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-weather-entity-row.ts @@ -12,7 +12,7 @@ import { ifDefined } from "lit/directives/if-defined"; import { computeStateName } from "../../../common/entity/compute_state_name"; import "../../../components/entity/state-badge"; import { isUnavailableState } from "../../../data/entity"; -import { ActionHandlerEvent } from "../../../data/lovelace"; +import { ActionHandlerEvent } from "../../../data/lovelace/action_handler"; import { ForecastEvent, WeatherEntity, diff --git a/src/panels/lovelace/entity-rows/types.ts b/src/panels/lovelace/entity-rows/types.ts index f377c9631b..d7657ec87e 100644 --- a/src/panels/lovelace/entity-rows/types.ts +++ b/src/panels/lovelace/entity-rows/types.ts @@ -1,4 +1,4 @@ -import { ActionConfig } from "../../../data/lovelace"; +import { ActionConfig } from "../../../data/lovelace/config/action"; import { HomeAssistant } from "../../../types"; import { Condition } from "../common/validate-condition"; import { TimestampRenderingFormat } from "../components/types"; diff --git a/src/panels/lovelace/ha-panel-lovelace.ts b/src/panels/lovelace/ha-panel-lovelace.ts index 61bd60ae62..32032d1d58 100644 --- a/src/panels/lovelace/ha-panel-lovelace.ts +++ b/src/panels/lovelace/ha-panel-lovelace.ts @@ -8,14 +8,7 @@ import { removeSearchParam, } from "../../common/url/search-params"; import { domainToName } from "../../data/integration"; -import { - deleteConfig, - fetchConfig, - fetchResources, - LovelaceConfig, - saveConfig, - subscribeLovelaceUpdates, -} from "../../data/lovelace"; +import { subscribeLovelaceUpdates } from "../../data/lovelace"; import { WindowWithPreloads } from "../../data/preloads"; import "../../layouts/hass-error-screen"; import "../../layouts/hass-loading-screen"; @@ -26,10 +19,28 @@ import { showSaveDialog } from "./editor/show-save-config-dialog"; import "./hui-root"; import { generateLovelaceDashboardStrategy } from "./strategies/get-strategy"; import { Lovelace } from "./types"; +import { + deleteConfig, + fetchConfig, + isStrategyDashboard, + LovelaceConfig, + LovelaceRawConfig, + LovelaceDashboardStrategyConfig, + saveConfig, +} from "../../data/lovelace/config/types"; +import { fetchResources } from "../../data/lovelace/resource"; +import { + isStrategyView, + LovelaceViewConfig, +} from "../../data/lovelace/config/view"; (window as any).loadCardHelpers = () => import("./custom-card-helpers"); -const DEFAULT_STRATEGY = "original-states"; +const DEFAULT_CONFIG: LovelaceDashboardStrategyConfig = { + strategy: { + type: "original-states", + }, +}; interface LovelacePanelConfig { mode: "yaml" | "storage"; @@ -164,12 +175,10 @@ export class LovelacePanel extends LitElement { private async _regenerateConfig() { const conf = await generateLovelaceDashboardStrategy( - { - type: DEFAULT_STRATEGY, - }, + DEFAULT_CONFIG.strategy, this.hass! ); - this._setLovelaceConfig(conf, undefined, "generated"); + this._setLovelaceConfig(conf, DEFAULT_CONFIG, "generated"); this._panelState = "loaded"; } @@ -217,9 +226,9 @@ export class LovelacePanel extends LitElement { private async _fetchConfig(forceDiskRefresh: boolean) { let conf: LovelaceConfig; - let rawConf: LovelaceConfig | undefined; + let rawConf: LovelaceRawConfig | undefined; let confMode: Lovelace["mode"] = this.panel!.config.mode; - let confProm: Promise | undefined; + let confProm: Promise | undefined; const preloadWindow = window as WindowWithPreloads; // On first load, we speed up loading page by having LL promise ready @@ -253,7 +262,7 @@ export class LovelacePanel extends LitElement { rawConf = await confProm!; // If strategy defined, apply it here. - if (rawConf.strategy) { + if (isStrategyDashboard(rawConf)) { conf = await generateLovelaceDashboardStrategy( rawConf.strategy, this.hass! @@ -270,11 +279,10 @@ export class LovelacePanel extends LitElement { return; } conf = await generateLovelaceDashboardStrategy( - { - type: DEFAULT_STRATEGY, - }, + DEFAULT_CONFIG.strategy, this.hass! ); + rawConf = DEFAULT_CONFIG; confMode = "generated"; } finally { // Ignore updates for another 2 seconds. @@ -290,17 +298,24 @@ export class LovelacePanel extends LitElement { this._setLovelaceConfig(conf, rawConf, confMode); } - private _checkLovelaceConfig(config: LovelaceConfig) { + private _checkLovelaceConfig(config: LovelaceRawConfig) { // Somehow there can be badges with value null, we remove those + if (isStrategyDashboard(config)) { + return config; + } let checkedConfig = !Object.isFrozen(config) ? config : undefined; config.views.forEach((view, index) => { + if (isStrategyView(view)) { + return; + } if (view.badges && !view.badges.every(Boolean)) { checkedConfig = checkedConfig || { ...config, views: [...config.views], }; - checkedConfig.views[index] = { ...view }; - checkedConfig.views[index].badges = view.badges.filter(Boolean); + const updatedView = { ...view } as LovelaceViewConfig; + updatedView.badges = view.badges.filter(Boolean); + checkedConfig.views[index] = updatedView; } }); return checkedConfig ? deepFreeze(checkedConfig) : config; @@ -308,7 +323,7 @@ export class LovelacePanel extends LitElement { private _setLovelaceConfig( config: LovelaceConfig, - rawConfig: LovelaceConfig | undefined, + rawConfig: LovelaceRawConfig, mode: Lovelace["mode"] ) { config = this._checkLovelaceConfig(config); @@ -349,7 +364,7 @@ export class LovelacePanel extends LitElement { narrow: this.narrow!, }); }, - saveConfig: async (newConfig: LovelaceConfig): Promise => { + saveConfig: async (newConfig: LovelaceRawConfig): Promise => { const { config: previousConfig, rawConfig: previousRawConfig, @@ -358,7 +373,7 @@ export class LovelacePanel extends LitElement { newConfig = this._checkLovelaceConfig(newConfig); let conf: LovelaceConfig; // If strategy defined, apply it here. - if (newConfig.strategy) { + if (isStrategyDashboard(newConfig)) { conf = await generateLovelaceDashboardStrategy( newConfig.strategy, this.hass! @@ -396,14 +411,12 @@ export class LovelacePanel extends LitElement { try { // Optimistic update const generatedConf = await generateLovelaceDashboardStrategy( - { - type: DEFAULT_STRATEGY, - }, + DEFAULT_CONFIG.strategy, this.hass! ); this._updateLovelace({ config: generatedConf, - rawConfig: undefined, + rawConfig: DEFAULT_CONFIG, mode: "generated", editMode: false, }); diff --git a/src/panels/lovelace/header-footer/hui-picture-header-footer.ts b/src/panels/lovelace/header-footer/hui-picture-header-footer.ts index 1cbe028082..f2a9f9d0ae 100644 --- a/src/panels/lovelace/header-footer/hui-picture-header-footer.ts +++ b/src/panels/lovelace/header-footer/hui-picture-header-footer.ts @@ -1,16 +1,16 @@ import { - css, CSSResultGroup, - html, LitElement, PropertyValues, + css, + html, nothing, } from "lit"; import { customElement, property } from "lit/decorators"; import { classMap } from "lit/directives/class-map"; import { ifDefined } from "lit/directives/if-defined"; import "../../../components/ha-card"; -import { ActionHandlerEvent } from "../../../data/lovelace"; +import { ActionHandlerEvent } from "../../../data/lovelace/action_handler"; import { HomeAssistant } from "../../../types"; import { actionHandler } from "../common/directives/action-handler-directive"; import { handleAction } from "../common/handle-action"; diff --git a/src/panels/lovelace/header-footer/types.ts b/src/panels/lovelace/header-footer/types.ts index 4248552052..35dff4cef2 100644 --- a/src/panels/lovelace/header-footer/types.ts +++ b/src/panels/lovelace/header-footer/types.ts @@ -1,4 +1,4 @@ -import { ActionConfig } from "../../../data/lovelace"; +import { ActionConfig } from "../../../data/lovelace/config/action"; import { EntitiesCardEntityConfig } from "../cards/types"; export interface LovelaceHeaderFooterConfig { diff --git a/src/panels/lovelace/hui-editor.ts b/src/panels/lovelace/hui-editor.ts index 9bf7cb9cc5..f375d47847 100644 --- a/src/panels/lovelace/hui-editor.ts +++ b/src/panels/lovelace/hui-editor.ts @@ -18,7 +18,6 @@ import "../../components/ha-circular-progress"; import "../../components/ha-code-editor"; import type { HaCodeEditor } from "../../components/ha-code-editor"; import "../../components/ha-icon-button"; -import type { LovelaceConfig } from "../../data/lovelace"; import { showAlertDialog, showConfirmationDialog, @@ -28,12 +27,22 @@ import type { HomeAssistant } from "../../types"; import { showToast } from "../../util/toast"; import type { Lovelace } from "./types"; import "../../components/ha-top-app-bar-fixed"; +import { + LovelaceRawConfig, + isStrategyDashboard, +} from "../../data/lovelace/config/types"; const lovelaceStruct = type({ title: optional(string()), views: array(object()), }); +const strategyStruct = type({ + strategy: type({ + type: string(), + }), +}); + @customElement("hui-editor") class LovelaceFullConfigEditor extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; @@ -247,9 +256,9 @@ class LovelaceFullConfigEditor extends LitElement { } } - let config: LovelaceConfig; + let config: LovelaceRawConfig; try { - config = load(value) as LovelaceConfig; + config = load(value) as LovelaceRawConfig; } catch (err: any) { showAlertDialog(this, { text: this.hass.localize( @@ -262,7 +271,11 @@ class LovelaceFullConfigEditor extends LitElement { return; } try { - assert(config, lovelaceStruct); + if (isStrategyDashboard(config)) { + assert(config, strategyStruct); + } else { + assert(config, lovelaceStruct); + } } catch (err: any) { showAlertDialog(this, { text: this.hass.localize( diff --git a/src/panels/lovelace/hui-root.ts b/src/panels/lovelace/hui-root.ts index a54f7b0e76..f2dc50d400 100644 --- a/src/panels/lovelace/hui-root.ts +++ b/src/panels/lovelace/hui-root.ts @@ -51,11 +51,7 @@ import "../../components/ha-icon-button-arrow-prev"; import "../../components/ha-menu-button"; import "../../components/ha-svg-icon"; import "../../components/ha-tabs"; -import type { - LovelaceConfig, - LovelacePanelConfig, - LovelaceViewConfig, -} from "../../data/lovelace"; +import type { LovelacePanelConfig } from "../../data/lovelace"; import { showAlertDialog, showConfirmationDialog, @@ -71,6 +67,8 @@ import { showEditViewDialog } from "./editor/view-editor/show-edit-view-dialog"; import type { Lovelace } from "./types"; import "./views/hui-view"; import type { HUIView } from "./views/hui-view"; +import { LovelaceViewConfig } from "../../data/lovelace/config/view"; +import { LovelaceConfig } from "../../data/lovelace/config/types"; @customElement("hui-root") class HUIRoot extends LitElement { diff --git a/src/panels/lovelace/special-rows/hui-button-row.ts b/src/panels/lovelace/special-rows/hui-button-row.ts index c00fd6f887..f74d444604 100644 --- a/src/panels/lovelace/special-rows/hui-button-row.ts +++ b/src/panels/lovelace/special-rows/hui-button-row.ts @@ -5,12 +5,12 @@ import { DOMAINS_TOGGLE } from "../../../common/const"; import { computeDomain } from "../../../common/entity/compute_domain"; import { computeStateName } from "../../../common/entity/compute_state_name"; import "../../../components/ha-state-icon"; -import { ActionHandlerEvent } from "../../../data/lovelace"; import { HomeAssistant } from "../../../types"; import { actionHandler } from "../common/directives/action-handler-directive"; import { handleAction } from "../common/handle-action"; import { hasAction } from "../common/has-action"; import { ButtonRowConfig, LovelaceRow } from "../entity-rows/types"; +import { ActionHandlerEvent } from "../../../data/lovelace/action_handler"; @customElement("hui-button-row") export class HuiButtonRow extends LitElement implements LovelaceRow { diff --git a/src/panels/lovelace/strategies/get-strategy.ts b/src/panels/lovelace/strategies/get-strategy.ts index 685894d7ee..cf507c78ac 100644 --- a/src/panels/lovelace/strategies/get-strategy.ts +++ b/src/panels/lovelace/strategies/get-strategy.ts @@ -1,8 +1,13 @@ import { LovelaceConfig, - LovelaceStrategyConfig, + LovelaceRawConfig, + isStrategyDashboard, +} from "../../../data/lovelace/config/types"; +import { LovelaceStrategyConfig } from "../../../data/lovelace/config/strategy"; +import { LovelaceViewConfig, -} from "../../../data/lovelace"; + isStrategyView, +} from "../../../data/lovelace/config/view"; import { AsyncReturnType, HomeAssistant } from "../../../types"; import { isLegacyStrategy } from "./legacy-strategy"; import { @@ -167,16 +172,18 @@ export const generateLovelaceViewStrategy = async ( * Find all references to strategies and replaces them with the generated output */ export const expandLovelaceConfigStrategies = async ( - config: LovelaceConfig, + config: LovelaceRawConfig, hass: HomeAssistant ): Promise => { - const newConfig = config.strategy + const newConfig = isStrategyDashboard(config) ? await generateLovelaceDashboardStrategy(config.strategy, hass) : { ...config }; newConfig.views = await Promise.all( newConfig.views.map((view) => - view.strategy ? generateLovelaceViewStrategy(view.strategy, hass) : view + isStrategyView(view) + ? generateLovelaceViewStrategy(view.strategy, hass) + : view ) ); diff --git a/src/panels/lovelace/strategies/legacy-strategy.ts b/src/panels/lovelace/strategies/legacy-strategy.ts index 16162f7e8d..7ce729f0cd 100644 --- a/src/panels/lovelace/strategies/legacy-strategy.ts +++ b/src/panels/lovelace/strategies/legacy-strategy.ts @@ -1,4 +1,11 @@ -import { LovelaceConfig, LovelaceViewConfig } from "../../../data/lovelace"; +import { + LovelaceConfig, + LovelaceRawConfig, +} from "../../../data/lovelace/config/types"; +import { + LovelaceViewConfig, + LovelaceViewRawConfig, +} from "../../../data/lovelace/config/view"; import { HomeAssistant } from "../../../types"; export const isLegacyStrategy = ( @@ -8,14 +15,14 @@ export const isLegacyStrategy = ( export interface LovelaceDashboardStrategy { generateDashboard(info: { - config?: LovelaceConfig; + config?: LovelaceRawConfig; hass: HomeAssistant; }): Promise; } export interface LovelaceViewStrategy { generateView(info: { - view: LovelaceViewConfig; + view: LovelaceViewRawConfig; config: LovelaceConfig; hass: HomeAssistant; }): Promise; diff --git a/src/panels/lovelace/strategies/original-states-dashboard-strategy.ts b/src/panels/lovelace/strategies/original-states-dashboard-strategy.ts index b5144549f0..7dfaec41a8 100644 --- a/src/panels/lovelace/strategies/original-states-dashboard-strategy.ts +++ b/src/panels/lovelace/strategies/original-states-dashboard-strategy.ts @@ -1,7 +1,8 @@ import { ReactiveElement } from "lit"; import { customElement } from "lit/decorators"; -import { LovelaceConfig, LovelaceStrategyConfig } from "../../../data/lovelace"; import { HomeAssistant } from "../../../types"; +import { LovelaceStrategyConfig } from "../../../data/lovelace/config/strategy"; +import { LovelaceConfig } from "../../../data/lovelace/config/types"; @customElement("original-states-dashboard-strategy") export class OriginalStatesDashboardStrategy extends ReactiveElement { diff --git a/src/panels/lovelace/strategies/original-states-view-strategy.ts b/src/panels/lovelace/strategies/original-states-view-strategy.ts index c1708cc047..05cb1ecd2b 100644 --- a/src/panels/lovelace/strategies/original-states-view-strategy.ts +++ b/src/panels/lovelace/strategies/original-states-view-strategy.ts @@ -3,10 +3,8 @@ import { ReactiveElement } from "lit"; import { customElement } from "lit/decorators"; import { isComponentLoaded } from "../../../common/config/is_component_loaded"; import { getEnergyPreferences } from "../../../data/energy"; -import { - LovelaceStrategyConfig, - LovelaceViewConfig, -} from "../../../data/lovelace"; +import { LovelaceStrategyConfig } from "../../../data/lovelace/config/strategy"; +import { LovelaceViewConfig } from "../../../data/lovelace/config/view"; import { HomeAssistant } from "../../../types"; import { generateDefaultViewConfig } from "../common/generate-lovelace-config"; diff --git a/src/panels/lovelace/strategies/types.ts b/src/panels/lovelace/strategies/types.ts index 42220ffa15..ea4946a800 100644 --- a/src/panels/lovelace/strategies/types.ts +++ b/src/panels/lovelace/strategies/types.ts @@ -1,8 +1,6 @@ -import { - LovelaceConfig, - LovelaceStrategyConfig, - LovelaceViewConfig, -} from "../../../data/lovelace"; +import { LovelaceConfig } from "../../../data/lovelace/config/types"; +import { LovelaceStrategyConfig } from "../../../data/lovelace/config/strategy"; +import { LovelaceViewConfig } from "../../../data/lovelace/config/view"; import { HomeAssistant } from "../../../types"; export type LovelaceStrategy = { diff --git a/src/panels/lovelace/types.ts b/src/panels/lovelace/types.ts index de64b24d44..03f3c12d10 100644 --- a/src/panels/lovelace/types.ts +++ b/src/panels/lovelace/types.ts @@ -1,11 +1,12 @@ import { HassEntity } from "home-assistant-js-websocket"; import { LocalizeFunc } from "../../common/translations/localize"; import { HaFormSchema } from "../../components/ha-form/types"; +import { LovelaceBadgeConfig } from "../../data/lovelace/config/badge"; +import { LovelaceCardConfig } from "../../data/lovelace/config/card"; import { - LovelaceBadgeConfig, - LovelaceCardConfig, LovelaceConfig, -} from "../../data/lovelace"; + LovelaceRawConfig, +} from "../../data/lovelace/config/types"; import { FrontendLocaleData } from "../../data/translation"; import { Constructor, HomeAssistant } from "../../types"; import { LovelaceRow, LovelaceRowConfig } from "./entity-rows/types"; @@ -22,15 +23,14 @@ declare global { export interface Lovelace { config: LovelaceConfig; - // If not set, a strategy was used to generate everything - rawConfig: LovelaceConfig | undefined; + rawConfig: LovelaceRawConfig; editMode: boolean; urlPath: string | null; mode: "generated" | "yaml" | "storage"; locale: FrontendLocaleData; enableFullEditMode: () => void; setEditMode: (editMode: boolean) => void; - saveConfig: (newConfig: LovelaceConfig) => Promise; + saveConfig: (newConfig: LovelaceRawConfig) => Promise; deleteConfig: () => Promise; } diff --git a/src/panels/lovelace/views/hui-masonry-view.ts b/src/panels/lovelace/views/hui-masonry-view.ts index b4ab615472..a50c4815a3 100644 --- a/src/panels/lovelace/views/hui-masonry-view.ts +++ b/src/panels/lovelace/views/hui-masonry-view.ts @@ -14,10 +14,8 @@ import { computeRTL } from "../../../common/util/compute_rtl"; import { nextRender } from "../../../common/util/render-status"; import "../../../components/entity/ha-state-label-badge"; import "../../../components/ha-svg-icon"; -import type { - LovelaceViewConfig, - LovelaceViewElement, -} from "../../../data/lovelace"; +import type { LovelaceViewElement } from "../../../data/lovelace"; +import type { LovelaceViewConfig } from "../../../data/lovelace/config/view"; import type { HomeAssistant } from "../../../types"; import type { HuiErrorCard } from "../cards/hui-error-card"; import { computeCardSize } from "../common/compute-card-size"; diff --git a/src/panels/lovelace/views/hui-panel-view.ts b/src/panels/lovelace/views/hui-panel-view.ts index 6f382d83c5..2d36ba5178 100644 --- a/src/panels/lovelace/views/hui-panel-view.ts +++ b/src/panels/lovelace/views/hui-panel-view.ts @@ -11,10 +11,8 @@ import { property, state } from "lit/decorators"; import { classMap } from "lit/directives/class-map"; import { fireEvent } from "../../../common/dom/fire_event"; import { computeRTL } from "../../../common/util/compute_rtl"; -import type { - LovelaceViewConfig, - LovelaceViewElement, -} from "../../../data/lovelace"; +import type { LovelaceViewElement } from "../../../data/lovelace"; +import type { LovelaceViewConfig } from "../../../data/lovelace/config/view"; import type { HomeAssistant } from "../../../types"; import { HuiErrorCard } from "../cards/hui-error-card"; import { HuiCardOptions } from "../components/hui-card-options"; diff --git a/src/panels/lovelace/views/hui-sidebar-view.ts b/src/panels/lovelace/views/hui-sidebar-view.ts index 6d2668abe5..f6085637da 100644 --- a/src/panels/lovelace/views/hui-sidebar-view.ts +++ b/src/panels/lovelace/views/hui-sidebar-view.ts @@ -1,20 +1,18 @@ import { mdiArrowLeft, mdiArrowRight, mdiPlus } from "@mdi/js"; import { - css, CSSResultGroup, - html, LitElement, PropertyValues, TemplateResult, + css, + html, } from "lit"; import { property, state } from "lit/decorators"; import { classMap } from "lit/directives/class-map"; import { fireEvent } from "../../../common/dom/fire_event"; import { computeRTL } from "../../../common/util/compute_rtl"; -import type { - LovelaceViewConfig, - LovelaceViewElement, -} from "../../../data/lovelace"; +import type { LovelaceViewElement } from "../../../data/lovelace"; +import type { LovelaceViewConfig } from "../../../data/lovelace/config/view"; import type { HomeAssistant } from "../../../types"; import { HuiErrorCard } from "../cards/hui-error-card"; import { HuiCardOptions } from "../components/hui-card-options"; diff --git a/src/panels/lovelace/views/hui-view.ts b/src/panels/lovelace/views/hui-view.ts index 407688e107..96c5dab601 100644 --- a/src/panels/lovelace/views/hui-view.ts +++ b/src/panels/lovelace/views/hui-view.ts @@ -3,12 +3,7 @@ import { customElement, property, state } from "lit/decorators"; import { applyThemesOnElement } from "../../../common/dom/apply_themes_on_element"; import "../../../components/entity/ha-state-label-badge"; import "../../../components/ha-svg-icon"; -import type { - LovelaceBadgeConfig, - LovelaceCardConfig, - LovelaceViewConfig, - LovelaceViewElement, -} from "../../../data/lovelace"; +import type { LovelaceViewElement } from "../../../data/lovelace"; import type { HomeAssistant } from "../../../types"; import { createErrorBadgeConfig, @@ -30,6 +25,12 @@ import { deleteCard } from "../editor/config-util"; import { generateLovelaceViewStrategy } from "../strategies/get-strategy"; import type { Lovelace, LovelaceBadge, LovelaceCard } from "../types"; import { PANEL_VIEW_LAYOUT, DEFAULT_VIEW_LAYOUT } from "./const"; +import { LovelaceCardConfig } from "../../../data/lovelace/config/card"; +import { LovelaceBadgeConfig } from "../../../data/lovelace/config/badge"; +import { + LovelaceViewConfig, + isStrategyView, +} from "../../../data/lovelace/config/view"; declare global { // for fire event @@ -188,7 +189,7 @@ export class HUIView extends ReactiveElement { let viewConfig = this.lovelace.config.views[this.index]; let isStrategy = false; - if (viewConfig.strategy) { + if (isStrategyView(viewConfig)) { isStrategy = true; viewConfig = await generateLovelaceViewStrategy( viewConfig.strategy, diff --git a/src/panels/profile/ha-pick-dashboard-row.ts b/src/panels/profile/ha-pick-dashboard-row.ts index 7b88eb9dfa..eebac9fe47 100644 --- a/src/panels/profile/ha-pick-dashboard-row.ts +++ b/src/panels/profile/ha-pick-dashboard-row.ts @@ -3,7 +3,10 @@ import { html, LitElement, PropertyValues, TemplateResult } from "lit"; import { customElement, property, state } from "lit/decorators"; import "../../components/ha-select"; import "../../components/ha-settings-row"; -import { fetchDashboards, LovelaceDashboard } from "../../data/lovelace"; +import { + fetchDashboards, + LovelaceDashboard, +} from "../../data/lovelace/dashboard"; import { setDefaultPanel } from "../../data/panel"; import { HomeAssistant } from "../../types"; diff --git a/test/panels/lovelace/editor/config-util.spec.ts b/test/panels/lovelace/editor/config-util.spec.ts index f764813658..a437b28cfa 100644 --- a/test/panels/lovelace/editor/config-util.spec.ts +++ b/test/panels/lovelace/editor/config-util.spec.ts @@ -5,7 +5,7 @@ import { moveCard, swapView, } from "../../../../src/panels/lovelace/editor/config-util"; -import { LovelaceConfig } from "../../../../src/data/lovelace"; +import { LovelaceConfig } from "../../../../src/data/lovelace/config/types"; describe("swapCard", () => { it("swaps 2 cards in same view", () => {