From 7dc1aa34c167180fa0a11f0215b07b23609e6fae Mon Sep 17 00:00:00 2001 From: Michael Geers Date: Tue, 7 Jul 2026 10:46:27 +0200 Subject: [PATCH] Config UI: fix product name mixup for multi-product templates (#31548) --- assets/js/components/Config/ChargerModal.vue | 9 ++-- .../Config/DeviceModal/DeviceModalBase.vue | 10 ++-- .../Config/DeviceModal/TemplateSelector.vue | 37 ++++++++------- assets/js/components/Config/HemsModal.vue | 3 +- .../Config/Messaging/MessengerModal.vue | 3 +- assets/js/components/Config/MeterModal.vue | 3 +- assets/js/components/Config/TariffModal.vue | 3 +- assets/js/components/Config/VehicleModal.vue | 3 +- tests/config-fatals.spec.ts | 6 +-- tests/config-multi-product-v1.tpl.yaml | 21 +++++++++ tests/config-multi-product-v2.tpl.yaml | 21 +++++++++ tests/config-multi-product.spec.ts | 46 +++++++++++++++++++ 12 files changed, 125 insertions(+), 40 deletions(-) create mode 100644 tests/config-multi-product-v1.tpl.yaml create mode 100644 tests/config-multi-product-v2.tpl.yaml create mode 100644 tests/config-multi-product.spec.ts diff --git a/assets/js/components/Config/ChargerModal.vue b/assets/js/components/Config/ChargerModal.vue index 10f006be8..f1a0f1c60 100644 --- a/assets/js/components/Config/ChargerModal.vue +++ b/assets/js/components/Config/ChargerModal.vue @@ -266,11 +266,10 @@ export default defineComponent({ isTypeDeprecated(type: ConfigType): boolean { return type === ConfigType.SgReadyBoost; }, - handleTemplateChange(e: Event, values: DeviceValues) { - const value = (e.target as HTMLSelectElement).value as ConfigType; - if (this.isYamlInput(value)) { - values.type = value; - values.yaml = this.defaultYaml(value); + handleTemplateChange(value: string, values: DeviceValues) { + if (this.isYamlInput(value as ConfigType)) { + values.type = value as ConfigType; + values.yaml = this.defaultYaml(value as ConfigType); } }, applyCustomDefaults(template: Template | null, values: DeviceValues) { diff --git a/assets/js/components/Config/DeviceModal/DeviceModalBase.vue b/assets/js/components/Config/DeviceModal/DeviceModalBase.vue index cac396875..246c34042 100644 --- a/assets/js/components/Config/DeviceModal/DeviceModalBase.vue +++ b/assets/js/components/Config/DeviceModal/DeviceModalBase.vue @@ -293,8 +293,8 @@ export default defineComponent({ isTypeDeprecated: Function as PropType<(type: ConfigType) => boolean>, // Optional: provide template options from parent (to avoid circular dependency) provideTemplateOptions: Function as PropType<(products: Product[]) => TemplateGroup[]>, - // Optional: handle template change (receives event and values, allows setting values.yaml) - onTemplateChange: Function as PropType<(e: Event, values: DeviceValues) => void>, + // Optional: handle template change (receives selected value and values, allows setting values.yaml) + onTemplateChange: Function as PropType<(value: string, values: DeviceValues) => void>, // Optional: default template to select when opening modal for new devices defaultTemplate: String, // Optional: callback after configuration is loaded (receives values) @@ -829,11 +829,11 @@ export default defineComponent({ this.$emit("close"); this.isModalVisible = false; }, - handleTemplateChange(e: Event) { + handleTemplateChange(value: string | null) { // ensure this triggers after tempateName watcher this.$nextTick(() => { - if (this.onTemplateChange) { - this.onTemplateChange(e, this.values); + if (this.onTemplateChange && value !== null) { + this.onTemplateChange(value, this.values); } }); }, diff --git a/assets/js/components/Config/DeviceModal/TemplateSelector.vue b/assets/js/components/Config/DeviceModal/TemplateSelector.vue index f75dc376e..fabf3a241 100644 --- a/assets/js/components/Config/DeviceModal/TemplateSelector.vue +++ b/assets/js/components/Config/DeviceModal/TemplateSelector.vue @@ -3,22 +3,16 @@