diff --git a/src/components/ha-form/types.ts b/src/components/ha-form/types.ts index 5c5ab10643a6..f8c54b767c72 100644 --- a/src/components/ha-form/types.ts +++ b/src/components/ha-form/types.ts @@ -25,6 +25,8 @@ export interface HaFormBaseSchema { suffix?: string; // This value will be set initially when form is loaded suggested_value?: HaFormData; + // read_only flag is passed here from backend for config flow + read_only?: boolean; }; context?: Record; } diff --git a/src/dialogs/config-flow/step-flow-form.ts b/src/dialogs/config-flow/step-flow-form.ts index 9994ec3faa04..73313157a837 100644 --- a/src/dialogs/config-flow/step-flow-form.ts +++ b/src/dialogs/config-flow/step-flow-form.ts @@ -3,6 +3,7 @@ import "@material/mwc-button"; import type { CSSResultGroup, PropertyValues, TemplateResult } from "lit"; import { css, html, LitElement, nothing } from "lit"; import { customElement, property, state } from "lit/decorators"; +import memoizeOne from "memoize-one"; import { dynamicElement } from "../../common/dom/dynamic-element-directive"; import { fireEvent } from "../../common/dom/fire_event"; import { isNavigationClick } from "../../common/dom/is-navigation-click"; @@ -39,6 +40,13 @@ class StepFlowForm extends LitElement { this.removeEventListener("keydown", this._handleKeyDown); } + private handleReadOnlyFields = memoizeOne((schema) => + schema?.map((field) => ({ + ...field, + ...(field?.description?.read_only ? { disabled: true } : {}), + })) + ); + protected render(): TemplateResult { const step = this.step; const stepData = this._stepDataProcessed; @@ -55,7 +63,9 @@ class StepFlowForm extends LitElement { .data=${stepData} .disabled=${this._loading} @value-changed=${this._stepDataChanged} - .schema=${autocompleteLoginFields(step.data_schema)} + .schema=${autocompleteLoginFields( + this.handleReadOnlyFields(step.data_schema) + )} .error=${step.errors} .computeLabel=${this._labelCallback} .computeHelper=${this._helperCallback} @@ -173,8 +183,9 @@ class StepFlowForm extends LitElement { Object.keys(stepData).forEach((key) => { const value = stepData[key]; const isEmpty = [undefined, ""].includes(value); + const field = this.step.data_schema?.find((f) => f.name === key); - if (!isEmpty) { + if (!isEmpty && !field?.description?.read_only) { toSendData[key] = value; } });