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", () => {