From bbe549fa863dce494d9f629f1cece889f0d34aed Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 24 Mar 2025 16:31:06 +0100 Subject: [PATCH] Process expandable initial data also for none required expandables (#24733) * Process expandable initial data also for none required expandables * Update compute-initial-ha-form-data.ts * check required fields of sections too when submitting --- .../ha-form/compute-initial-ha-form-data.ts | 8 ++++++-- src/dialogs/config-flow/step-flow-form.ts | 19 +++++++++++++------ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/components/ha-form/compute-initial-ha-form-data.ts b/src/components/ha-form/compute-initial-ha-form-data.ts index 53e3488328..f753855b1b 100644 --- a/src/components/ha-form/compute-initial-ha-form-data.ts +++ b/src/components/ha-form/compute-initial-ha-form-data.ts @@ -13,6 +13,12 @@ export const computeInitialHaFormData = ( data[field.name] = field.description.suggested_value; } else if ("default" in field) { data[field.name] = field.default; + } else if (field.type === "expandable") { + const expandableData = computeInitialHaFormData(field.schema); + if (field.required || Object.keys(expandableData).length) { + // Only add expandable data if it's required or any of its children have initial values. + data[field.name] = expandableData; + } } else if (!field.required) { // Do nothing. } else if (field.type === "boolean") { @@ -36,8 +42,6 @@ export const computeInitialHaFormData = ( minutes: 0, seconds: 0, }; - } else if (field.type === "expandable") { - data[field.name] = computeInitialHaFormData(field.schema); } else if ("selector" in field) { const selector: Selector = field.selector; diff --git a/src/dialogs/config-flow/step-flow-form.ts b/src/dialogs/config-flow/step-flow-form.ts index 97ced491af..645ba4de9c 100644 --- a/src/dialogs/config-flow/step-flow-form.ts +++ b/src/dialogs/config-flow/step-flow-form.ts @@ -144,17 +144,24 @@ class StepFlowForm extends LitElement { private async _submitStep(): Promise { const stepData = this._stepData || {}; + const checkAllRequiredFields = ( + schema: readonly HaFormSchema[], + data: Record + ) => + schema.every( + (field) => + (!field.required || !["", undefined].includes(data[field.name])) && + (field.type !== "expandable" || + (!field.required && data[field.name] === undefined) || + checkAllRequiredFields(field.schema, data[field.name])) + ); + const allRequiredInfoFilledIn = stepData === undefined ? // If no data filled in, just check that any field is required this.step.data_schema.find((field) => field.required) === undefined : // If data is filled in, make sure all required fields are - stepData && - this.step.data_schema.every( - (field) => - !field.required || - !["", undefined].includes(stepData![field.name]) - ); + checkAllRequiredFields(this.step.data_schema, stepData); if (!allRequiredInfoFilledIn) { this._errorMsg = this.hass.localize(