mirror of
https://github.com/home-assistant/frontend.git
synced 2025-07-25 18:26:35 +00:00
Make helper forms lazy load (#17068)
This commit is contained in:
parent
e6d77af438
commit
c0613545e7
@ -33,38 +33,59 @@ import { haStyleDialog } from "../../../resources/styles";
|
|||||||
import { HomeAssistant } from "../../../types";
|
import { HomeAssistant } from "../../../types";
|
||||||
import { brandsUrl } from "../../../util/brands-url";
|
import { brandsUrl } from "../../../util/brands-url";
|
||||||
import { Helper, HelperDomain } from "./const";
|
import { Helper, HelperDomain } from "./const";
|
||||||
import "./forms/ha-counter-form";
|
|
||||||
import "./forms/ha-input_boolean-form";
|
|
||||||
import "./forms/ha-input_button-form";
|
|
||||||
import "./forms/ha-input_datetime-form";
|
|
||||||
import "./forms/ha-input_number-form";
|
|
||||||
import "./forms/ha-input_select-form";
|
|
||||||
import "./forms/ha-input_text-form";
|
|
||||||
import "./forms/ha-schedule-form";
|
|
||||||
import "./forms/ha-timer-form";
|
|
||||||
import type { ShowDialogHelperDetailParams } from "./show-dialog-helper-detail";
|
import type { ShowDialogHelperDetailParams } from "./show-dialog-helper-detail";
|
||||||
|
|
||||||
type HelperCreators = {
|
type HelperCreators = {
|
||||||
[domain in HelperDomain]: (
|
[domain in HelperDomain]: {
|
||||||
hass: HomeAssistant,
|
create: (
|
||||||
// Not properly typed because there is currently a mismatch for this._item between:
|
hass: HomeAssistant,
|
||||||
// 1. Type passed to form should be Helper
|
// Not properly typed because there is currently a mismatch for this._item between:
|
||||||
// 2. Type received by creator should be MutableParams version
|
// 1. Type passed to form should be Helper
|
||||||
// The two are not compatible.
|
// 2. Type received by creator should be MutableParams version
|
||||||
params: any
|
// The two are not compatible.
|
||||||
) => Promise<Helper>;
|
params: any
|
||||||
|
) => Promise<Helper>;
|
||||||
|
import: () => Promise<unknown>;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
const HELPERS: HelperCreators = {
|
const HELPERS: HelperCreators = {
|
||||||
input_boolean: createInputBoolean,
|
input_boolean: {
|
||||||
input_button: createInputButton,
|
create: createInputBoolean,
|
||||||
input_text: createInputText,
|
import: () => import("./forms/ha-input_boolean-form"),
|
||||||
input_number: createInputNumber,
|
},
|
||||||
input_datetime: createInputDateTime,
|
input_button: {
|
||||||
input_select: createInputSelect,
|
create: createInputButton,
|
||||||
counter: createCounter,
|
import: () => import("./forms/ha-input_button-form"),
|
||||||
timer: createTimer,
|
},
|
||||||
schedule: createSchedule,
|
input_text: {
|
||||||
|
create: createInputText,
|
||||||
|
import: () => import("./forms/ha-input_text-form"),
|
||||||
|
},
|
||||||
|
input_number: {
|
||||||
|
create: createInputNumber,
|
||||||
|
import: () => import("./forms/ha-input_number-form"),
|
||||||
|
},
|
||||||
|
input_datetime: {
|
||||||
|
create: createInputDateTime,
|
||||||
|
import: () => import("./forms/ha-input_datetime-form"),
|
||||||
|
},
|
||||||
|
input_select: {
|
||||||
|
create: createInputSelect,
|
||||||
|
import: () => import("./forms/ha-input_select-form"),
|
||||||
|
},
|
||||||
|
counter: {
|
||||||
|
create: createCounter,
|
||||||
|
import: () => import("./forms/ha-counter-form"),
|
||||||
|
},
|
||||||
|
timer: {
|
||||||
|
create: createTimer,
|
||||||
|
import: () => import("./forms/ha-timer-form"),
|
||||||
|
},
|
||||||
|
schedule: {
|
||||||
|
create: createSchedule,
|
||||||
|
import: () => import("./forms/ha-schedule-form"),
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@customElement("dialog-helper-detail")
|
@customElement("dialog-helper-detail")
|
||||||
@ -85,6 +106,8 @@ export class DialogHelperDetail extends LitElement {
|
|||||||
|
|
||||||
@state() private _helperFlows?: string[];
|
@state() private _helperFlows?: string[];
|
||||||
|
|
||||||
|
@state() private _loading = false;
|
||||||
|
|
||||||
private _params?: ShowDialogHelperDetailParams;
|
private _params?: ShowDialogHelperDetailParams;
|
||||||
|
|
||||||
public async showDialog(params: ShowDialogHelperDetailParams): Promise<void> {
|
public async showDialog(params: ShowDialogHelperDetailParams): Promise<void> {
|
||||||
@ -140,7 +163,7 @@ export class DialogHelperDetail extends LitElement {
|
|||||||
${this.hass!.localize("ui.common.back")}
|
${this.hass!.localize("ui.common.back")}
|
||||||
</mwc-button>
|
</mwc-button>
|
||||||
`;
|
`;
|
||||||
} else if (this._helperFlows === undefined) {
|
} else if (this._loading || this._helperFlows === undefined) {
|
||||||
content = html`<ha-circular-progress active></ha-circular-progress>`;
|
content = html`<ha-circular-progress active></ha-circular-progress>`;
|
||||||
} else {
|
} else {
|
||||||
const items: [string, string][] = [];
|
const items: [string, string][] = [];
|
||||||
@ -250,7 +273,7 @@ export class DialogHelperDetail extends LitElement {
|
|||||||
this._submitting = true;
|
this._submitting = true;
|
||||||
this._error = "";
|
this._error = "";
|
||||||
try {
|
try {
|
||||||
await HELPERS[this._domain](this.hass, this._item);
|
await HELPERS[this._domain].create(this.hass, this._item);
|
||||||
this.closeDialog();
|
this.closeDialog();
|
||||||
} catch (err: any) {
|
} catch (err: any) {
|
||||||
this._error = err.message || "Unknown error";
|
this._error = err.message || "Unknown error";
|
||||||
@ -259,14 +282,22 @@ export class DialogHelperDetail extends LitElement {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private _domainPicked(ev: CustomEvent<RequestSelectedDetail>): void {
|
private async _domainPicked(
|
||||||
|
ev: CustomEvent<RequestSelectedDetail>
|
||||||
|
): Promise<void> {
|
||||||
if (!shouldHandleRequestSelectedEvent(ev)) {
|
if (!shouldHandleRequestSelectedEvent(ev)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const domain = (ev.currentTarget! as any).domain;
|
const domain = (ev.currentTarget! as any).domain;
|
||||||
|
|
||||||
if (domain in HELPERS) {
|
if (domain in HELPERS) {
|
||||||
this._domain = domain;
|
this._loading = true;
|
||||||
|
try {
|
||||||
|
await HELPERS[domain].import();
|
||||||
|
this._domain = domain;
|
||||||
|
} finally {
|
||||||
|
this._loading = false;
|
||||||
|
}
|
||||||
this._focusForm();
|
this._focusForm();
|
||||||
} else {
|
} else {
|
||||||
showConfigFlowDialog(this, {
|
showConfigFlowDialog(this, {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user