mirror of
https://github.com/home-assistant/frontend.git
synced 2025-04-26 14:27:20 +00:00
Add support for menu data entry flow option (#12055)
This commit is contained in:
parent
1e929ae78a
commit
9908162ac2
@ -28,7 +28,7 @@ export interface DataEntryFlowStepForm {
|
|||||||
step_id: string;
|
step_id: string;
|
||||||
data_schema: HaFormSchema[];
|
data_schema: HaFormSchema[];
|
||||||
errors: Record<string, string>;
|
errors: Record<string, string>;
|
||||||
description_placeholders: Record<string, string>;
|
description_placeholders?: Record<string, string>;
|
||||||
last_step: boolean | null;
|
last_step: boolean | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ export interface DataEntryFlowStepCreateEntry {
|
|||||||
title: string;
|
title: string;
|
||||||
result?: ConfigEntry;
|
result?: ConfigEntry;
|
||||||
description: string;
|
description: string;
|
||||||
description_placeholders: Record<string, string>;
|
description_placeholders?: Record<string, string>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface DataEntryFlowStepAbort {
|
export interface DataEntryFlowStepAbort {
|
||||||
@ -57,7 +57,7 @@ export interface DataEntryFlowStepAbort {
|
|||||||
flow_id: string;
|
flow_id: string;
|
||||||
handler: string;
|
handler: string;
|
||||||
reason: string;
|
reason: string;
|
||||||
description_placeholders: Record<string, string>;
|
description_placeholders?: Record<string, string>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface DataEntryFlowStepProgress {
|
export interface DataEntryFlowStepProgress {
|
||||||
@ -66,7 +66,17 @@ export interface DataEntryFlowStepProgress {
|
|||||||
handler: string;
|
handler: string;
|
||||||
step_id: string;
|
step_id: string;
|
||||||
progress_action: string;
|
progress_action: string;
|
||||||
description_placeholders: Record<string, string>;
|
description_placeholders?: Record<string, string>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface DataEntryFlowStepMenu {
|
||||||
|
type: "menu";
|
||||||
|
flow_id: string;
|
||||||
|
handler: string;
|
||||||
|
step_id: string;
|
||||||
|
/** If array, use value to lookup translations in strings.json */
|
||||||
|
menu_options: string[] | Record<string, string>;
|
||||||
|
description_placeholders?: Record<string, string>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type DataEntryFlowStep =
|
export type DataEntryFlowStep =
|
||||||
@ -74,7 +84,8 @@ export type DataEntryFlowStep =
|
|||||||
| DataEntryFlowStepExternal
|
| DataEntryFlowStepExternal
|
||||||
| DataEntryFlowStepCreateEntry
|
| DataEntryFlowStepCreateEntry
|
||||||
| DataEntryFlowStepAbort
|
| DataEntryFlowStepAbort
|
||||||
| DataEntryFlowStepProgress;
|
| DataEntryFlowStepProgress
|
||||||
|
| DataEntryFlowStepMenu;
|
||||||
|
|
||||||
export const subscribeDataEntryFlowProgressed = (
|
export const subscribeDataEntryFlowProgressed = (
|
||||||
conn: Connection,
|
conn: Connection,
|
||||||
|
@ -46,6 +46,7 @@ import "./step-flow-loading";
|
|||||||
import "./step-flow-pick-flow";
|
import "./step-flow-pick-flow";
|
||||||
import "./step-flow-pick-handler";
|
import "./step-flow-pick-handler";
|
||||||
import "./step-flow-progress";
|
import "./step-flow-progress";
|
||||||
|
import "./step-flow-menu";
|
||||||
|
|
||||||
let instance = 0;
|
let instance = 0;
|
||||||
|
|
||||||
@ -292,6 +293,14 @@ class DataEntryFlowDialog extends LitElement {
|
|||||||
.hass=${this.hass}
|
.hass=${this.hass}
|
||||||
></step-flow-progress>
|
></step-flow-progress>
|
||||||
`
|
`
|
||||||
|
: this._step.type === "menu"
|
||||||
|
? html`
|
||||||
|
<step-flow-menu
|
||||||
|
.flowConfig=${this._params.flowConfig}
|
||||||
|
.step=${this._step}
|
||||||
|
.hass=${this.hass}
|
||||||
|
></step-flow-menu>
|
||||||
|
`
|
||||||
: this._devices === undefined || this._areas === undefined
|
: this._devices === undefined || this._areas === undefined
|
||||||
? // When it's a create entry result, we will fetch device & area registry
|
? // When it's a create entry result, we will fetch device & area registry
|
||||||
html`
|
html`
|
||||||
@ -421,7 +430,7 @@ class DataEntryFlowDialog extends LitElement {
|
|||||||
title: this.hass.localize(
|
title: this.hass.localize(
|
||||||
"ui.panel.config.integrations.config_flow.error"
|
"ui.panel.config.integrations.config_flow.error"
|
||||||
),
|
),
|
||||||
text: err.message || err.body,
|
text: err?.body?.message,
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -181,6 +181,21 @@ export const showConfigFlowDialog = (
|
|||||||
: "";
|
: "";
|
||||||
},
|
},
|
||||||
|
|
||||||
|
renderMenuHeader(hass, step) {
|
||||||
|
return (
|
||||||
|
hass.localize(
|
||||||
|
`component.${step.handler}.config.step.${step.step_id}.title`
|
||||||
|
) || hass.localize(`component.${step.handler}.title`)
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
renderMenuOption(hass, step, option) {
|
||||||
|
return hass.localize(
|
||||||
|
`component.${step.handler}.config.step.${step.step_id}.menu_options.${option}`,
|
||||||
|
step.description_placeholders
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
renderLoadingDescription(hass, reason, handler, step) {
|
renderLoadingDescription(hass, reason, handler, step) {
|
||||||
if (!["loading_flow", "loading_step"].includes(reason)) {
|
if (!["loading_flow", "loading_step"].includes(reason)) {
|
||||||
return "";
|
return "";
|
||||||
|
@ -7,6 +7,7 @@ import {
|
|||||||
DataEntryFlowStepCreateEntry,
|
DataEntryFlowStepCreateEntry,
|
||||||
DataEntryFlowStepExternal,
|
DataEntryFlowStepExternal,
|
||||||
DataEntryFlowStepForm,
|
DataEntryFlowStepForm,
|
||||||
|
DataEntryFlowStepMenu,
|
||||||
DataEntryFlowStepProgress,
|
DataEntryFlowStepProgress,
|
||||||
} from "../../data/data_entry_flow";
|
} from "../../data/data_entry_flow";
|
||||||
import { HomeAssistant } from "../../types";
|
import { HomeAssistant } from "../../types";
|
||||||
@ -80,6 +81,14 @@ export interface FlowConfig {
|
|||||||
step: DataEntryFlowStepProgress
|
step: DataEntryFlowStepProgress
|
||||||
): TemplateResult | "";
|
): TemplateResult | "";
|
||||||
|
|
||||||
|
renderMenuHeader(hass: HomeAssistant, step: DataEntryFlowStepMenu): string;
|
||||||
|
|
||||||
|
renderMenuOption(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
step: DataEntryFlowStepMenu,
|
||||||
|
option: string
|
||||||
|
): string;
|
||||||
|
|
||||||
renderLoadingDescription(
|
renderLoadingDescription(
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
loadingReason: LoadingReason,
|
loadingReason: LoadingReason,
|
||||||
|
@ -134,6 +134,21 @@ export const showOptionsFlowDialog = (
|
|||||||
: "";
|
: "";
|
||||||
},
|
},
|
||||||
|
|
||||||
|
renderMenuHeader(hass, step) {
|
||||||
|
return (
|
||||||
|
hass.localize(
|
||||||
|
`component.${step.handler}.option.step.${step.step_id}.title`
|
||||||
|
) || hass.localize(`component.${step.handler}.title`)
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
renderMenuOption(hass, step, option) {
|
||||||
|
return hass.localize(
|
||||||
|
`component.${step.handler}.options.step.${step.step_id}.menu_options.${option}`,
|
||||||
|
step.description_placeholders
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
renderLoadingDescription(hass, reason) {
|
renderLoadingDescription(hass, reason) {
|
||||||
return (
|
return (
|
||||||
hass.localize(`component.${configEntry.domain}.options.loading`) ||
|
hass.localize(`component.${configEntry.domain}.options.loading`) ||
|
||||||
|
80
src/dialogs/config-flow/step-flow-menu.ts
Normal file
80
src/dialogs/config-flow/step-flow-menu.ts
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
import "@material/mwc-list/mwc-list-item";
|
||||||
|
import { css, html, LitElement, TemplateResult } from "lit";
|
||||||
|
import { customElement, property } from "lit/decorators";
|
||||||
|
import type { DataEntryFlowStepMenu } from "../../data/data_entry_flow";
|
||||||
|
import type { HomeAssistant } from "../../types";
|
||||||
|
import type { FlowConfig } from "./show-dialog-data-entry-flow";
|
||||||
|
import "../../components/ha-icon-next";
|
||||||
|
import { configFlowContentStyles } from "./styles";
|
||||||
|
import { fireEvent } from "../../common/dom/fire_event";
|
||||||
|
|
||||||
|
@customElement("step-flow-menu")
|
||||||
|
class StepFlowMenu extends LitElement {
|
||||||
|
@property({ attribute: false }) public flowConfig!: FlowConfig;
|
||||||
|
|
||||||
|
@property({ attribute: false }) public hass!: HomeAssistant;
|
||||||
|
|
||||||
|
@property({ attribute: false }) public step!: DataEntryFlowStepMenu;
|
||||||
|
|
||||||
|
protected render(): TemplateResult {
|
||||||
|
let options: string[];
|
||||||
|
let translations: Record<string, string>;
|
||||||
|
|
||||||
|
if (Array.isArray(this.step.menu_options)) {
|
||||||
|
options = this.step.menu_options;
|
||||||
|
translations = {};
|
||||||
|
for (const option of options) {
|
||||||
|
translations[option] = this.flowConfig.renderMenuOption(
|
||||||
|
this.hass,
|
||||||
|
this.step,
|
||||||
|
option
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
options = Object.keys(this.step.menu_options);
|
||||||
|
translations = this.step.menu_options;
|
||||||
|
}
|
||||||
|
|
||||||
|
return html`
|
||||||
|
<h2>${this.flowConfig.renderMenuHeader(this.hass, this.step)}</h2>
|
||||||
|
<div class="options">
|
||||||
|
${options.map(
|
||||||
|
(option) => html`
|
||||||
|
<mwc-list-item hasMeta .step=${option} @click=${this._handleStep}>
|
||||||
|
<span>${translations[option]}</span>
|
||||||
|
<ha-icon-next slot="meta"></ha-icon-next>
|
||||||
|
</mwc-list-item>
|
||||||
|
`
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
private _handleStep(ev) {
|
||||||
|
fireEvent(this, "flow-update", {
|
||||||
|
stepPromise: this.flowConfig.handleFlowStep(
|
||||||
|
this.hass,
|
||||||
|
this.step.flow_id,
|
||||||
|
{
|
||||||
|
next_step_id: ev.currentTarget.step,
|
||||||
|
}
|
||||||
|
),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
static styles = [
|
||||||
|
configFlowContentStyles,
|
||||||
|
css`
|
||||||
|
.options {
|
||||||
|
margin-top: 20px;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
declare global {
|
||||||
|
interface HTMLElementTagNameMap {
|
||||||
|
"step-flow-menu": StepFlowMenu;
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user