Skip to content

Commit

Permalink
Add typings
Browse files Browse the repository at this point in the history
  • Loading branch information
piitaya committed Sep 13, 2023
1 parent cc0a674 commit b929354
Show file tree
Hide file tree
Showing 6 changed files with 92 additions and 55 deletions.
9 changes: 3 additions & 6 deletions src/data/lovelace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ export interface LovelacePanelConfig {
mode: "yaml" | "storage";
}

export interface LovelaceStrategyConfig {
export interface LovelaceStrategyConfig<S = Record<string, unknown>> {
type: string;
options?: Record<string, unknown>;
options?: S;
}

export interface LovelaceConfig {
Expand Down Expand Up @@ -83,10 +83,7 @@ export interface LovelaceViewConfig {
index?: number;
title?: string;
type?: string;
strategy?: {
type: string;
options?: Record<string, unknown>;
};
strategy?: LovelaceStrategyConfig;
badges?: Array<string | LovelaceBadgeConfig>;
cards?: LovelaceCardConfig[];
path?: string;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { customElement } from "lit/decorators";
import { LovelaceConfig } from "../../../../data/lovelace";
import {
getLovelaceStrategy,
import { getLovelaceStrategy } from "../../strategies/get-strategy";
import type {
LovelaceDashboardStrategy,
type LovelaceDashboardStrategyEditor,
} from "../../strategies/get-strategy";
LovelaceDashboardStrategyEditor,
} from "../../strategies/types";
import { HuiElementEditor } from "../hui-element-editor";

@customElement("hui-dashboard-strategy-element-editor")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@ import type {
HaFormSchema,
SchemaUnion,
} from "../../../../components/ha-form/types";
import { LovelaceStrategyConfig } from "../../../../data/lovelace";
import type { LovelaceStrategyConfig } from "../../../../data/lovelace";
import type { HomeAssistant } from "../../../../types";
import { LovelaceDashboardStrategyEditor } from "../../strategies/get-strategy";
import type { LovelaceDashboardStrategyEditor } from "../../strategies/get-strategy";
import type { OriginalStatesDashboardStrategyOptions } from "../../strategies/original-states-strategy";

const SCHEMA = [
{
Expand All @@ -26,9 +27,12 @@ export class HuiSensorCardEditor
{
@property({ attribute: false }) public hass?: HomeAssistant;

@state() private _config?: LovelaceStrategyConfig;
@state()
private _config?: LovelaceStrategyConfig<OriginalStatesDashboardStrategyOptions>;

public setConfig(config: LovelaceStrategyConfig): void {
public setConfig(
config: LovelaceStrategyConfig<OriginalStatesDashboardStrategyOptions>
): void {
this._config = config;
}

Expand Down
45 changes: 13 additions & 32 deletions src/panels/lovelace/strategies/get-strategy.ts
Original file line number Diff line number Diff line change
@@ -1,37 +1,18 @@
import {
import type {
LovelaceConfig,
LovelaceStrategyConfig,
LovelaceViewConfig,
} from "../../../data/lovelace";
import { AsyncReturnType, HomeAssistant } from "../../../types";
import { LovelaceGenericElementEditor } from "../types";
import type { AsyncReturnType } from "../../../types";
import type {
LovelaceDashboardStrategy,
LovelaceDashboardStrategyInfo,
LovelaceViewStrategy,
LovelaceViewStrategyInfo,
} from "./types";

const MAX_WAIT_STRATEGY_LOAD = 5000;
const CUSTOM_PREFIX = "custom:";

export interface LovelaceDashboardStrategy {
generateDashboard(info: {
config?: LovelaceConfig;
hass: HomeAssistant;
narrow: boolean | undefined;
}): Promise<LovelaceConfig>;
getConfigElement?: () => LovelaceDashboardStrategyEditor;
}

export interface LovelaceViewStrategy {
generateView(info: {
view: LovelaceViewConfig;
config: LovelaceConfig;
hass: HomeAssistant;
narrow: boolean | undefined;
}): Promise<LovelaceViewConfig>;
}

export interface LovelaceDashboardStrategyEditor
extends LovelaceGenericElementEditor {
setConfig(config: LovelaceStrategyConfig): void;
}

const strategies: Record<
string,
() => Promise<LovelaceDashboardStrategy | LovelaceViewStrategy>
Expand Down Expand Up @@ -104,9 +85,9 @@ const generateStrategy = async <T extends keyof GenerateMethods>(
};

export const generateLovelaceDashboardStrategy = async (
info: Parameters<LovelaceDashboardStrategy["generateDashboard"]>[0],
info: LovelaceDashboardStrategyInfo,
strategyType?: string
): ReturnType<LovelaceDashboardStrategy["generateDashboard"]> =>
): Promise<LovelaceConfig> =>
generateStrategy(
"generateDashboard",
(err) => ({
Expand All @@ -127,9 +108,9 @@ export const generateLovelaceDashboardStrategy = async (
);

export const generateLovelaceViewStrategy = async (
info: Parameters<LovelaceViewStrategy["generateView"]>[0],
info: LovelaceViewStrategyInfo,
strategyType?: string
): ReturnType<LovelaceViewStrategy["generateView"]> =>
): Promise<LovelaceViewConfig> =>
generateStrategy(
"generateView",
(err) => ({
Expand All @@ -148,7 +129,7 @@ export const generateLovelaceViewStrategy = async (
* Find all references to strategies and replaces them with the generated output
*/
export const expandLovelaceConfigStrategies = async (
info: Parameters<LovelaceDashboardStrategy["generateDashboard"]>[0] & {
info: LovelaceDashboardStrategyInfo & {
config: LovelaceConfig;
}
): Promise<LovelaceConfig> => {
Expand Down
37 changes: 28 additions & 9 deletions src/panels/lovelace/strategies/original-states-strategy.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,35 @@
import { STATE_NOT_RUNNING } from "home-assistant-js-websocket";
import { isComponentLoaded } from "../../../common/config/is_component_loaded";
import { getEnergyPreferences } from "../../../data/energy";
import type {
LovelaceConfig,
LovelaceStrategyConfig,
LovelaceViewConfig,
} from "../../../data/lovelace";
import { generateDefaultViewConfig } from "../common/generate-lovelace-config";
import {
LovelaceDashboardStrategy,
LovelaceDashboardStrategyEditor,
LovelaceViewStrategy,
} from "./get-strategy";
LovelaceDashboardStrategyInfo,
LovelaceViewStrategyInfo,
} from "./types";

export type OriginalStatesDashboardStrategyOptions = {
no_area_group?: boolean;
};

export type OriginalStatesViewStrategyOptions = {
no_area_group?: boolean;
};

export class OriginalStatesStrategy {
static async generateView(
info: Parameters<LovelaceViewStrategy["generateView"]>[0]
): ReturnType<LovelaceViewStrategy["generateView"]> {
info: LovelaceViewStrategyInfo
): Promise<LovelaceViewConfig> {
const hass = info.hass;

const strategy = info.view
.strategy as LovelaceStrategyConfig<OriginalStatesViewStrategyOptions>;

if (hass.config.state === STATE_NOT_RUNNING) {
return {
cards: [{ type: "starting" }],
Expand All @@ -37,7 +53,7 @@ export class OriginalStatesStrategy {
// User can override default view. If they didn't, we will add one
// that contains all entities.
const view = generateDefaultViewConfig(
info.view.strategy?.options?.no_area_group ? {} : hass.areas,
strategy.options?.no_area_group ? {} : hass.areas,
hass.devices,
hass.entities,
hass.states,
Expand Down Expand Up @@ -66,15 +82,18 @@ export class OriginalStatesStrategy {
}

static async generateDashboard(
info: Parameters<LovelaceDashboardStrategy["generateDashboard"]>[0]
): ReturnType<LovelaceDashboardStrategy["generateDashboard"]> {
info: LovelaceDashboardStrategyInfo
): Promise<LovelaceConfig> {
const strategy = info.config?.strategy as
| LovelaceStrategyConfig<OriginalStatesDashboardStrategyOptions>
| undefined;
return {
title: info.hass.config.location_name,
views: [
{
strategy: {
type: "original-states",
options: info.config?.strategy?.options,
options: strategy?.options,
},
},
],
Expand Down
36 changes: 36 additions & 0 deletions src/panels/lovelace/strategies/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import type {
LovelaceConfig,
LovelaceStrategyConfig,
LovelaceViewConfig,
} from "../../../data/lovelace";
import type { HomeAssistant } from "../../../types";
import type { LovelaceGenericElementEditor } from "../types";

export type LovelaceDashboardStrategyInfo = {
config?: LovelaceConfig;
hass: HomeAssistant;
narrow: boolean | undefined;
};

export interface LovelaceDashboardStrategy {
generateDashboard(
info: LovelaceDashboardStrategyInfo
): Promise<LovelaceConfig>;
getConfigElement?: () => LovelaceDashboardStrategyEditor;
}

export type LovelaceViewStrategyInfo = {
view: LovelaceViewConfig;
config: LovelaceConfig;
hass: HomeAssistant;
narrow: boolean | undefined;
};

export interface LovelaceViewStrategy {
generateView(info: LovelaceViewStrategyInfo): Promise<LovelaceViewConfig>;
}

export interface LovelaceDashboardStrategyEditor
extends LovelaceGenericElementEditor {
setConfig(config: LovelaceStrategyConfig): void;
}

0 comments on commit b929354

Please sign in to comment.