From 78e2ec9514b4921afb93b1e68444abfa4da8073a Mon Sep 17 00:00:00 2001 From: andig Date: Thu, 9 Jul 2026 13:43:35 +0200 Subject: [PATCH] Config: fix loadpoint modal reusing previous charger on repeated add (#31614) --- .../js/components/Config/LoadpointModal.vue | 3 ++ tests/config-loadpoint.spec.ts | 51 +++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/assets/js/components/Config/LoadpointModal.vue b/assets/js/components/Config/LoadpointModal.vue index 96bd3af05..a0abd1cff 100644 --- a/assets/js/components/Config/LoadpointModal.vue +++ b/assets/js/components/Config/LoadpointModal.vue @@ -927,6 +927,9 @@ export default { await api.post("config/loadpoints", this.values); this.created = true; this.emitChanged("added"); + // the created response has no id to compare against on next open, so + // reset explicitly instead of relying on the isModalVisible watcher + this.reset(); } catch (e) { handleError(e, "create failed"); } diff --git a/tests/config-loadpoint.spec.ts b/tests/config-loadpoint.spec.ts index 3bf55a0af..f9d770cec 100644 --- a/tests/config-loadpoint.spec.ts +++ b/tests/config-loadpoint.spec.ts @@ -186,6 +186,57 @@ test.describe("charging loadpoint", async () => { await expect(lpModal.getByLabel("Priority")).toHaveValue("0"); }); + test("second loadpoint gets its own charger, not the first one's", async ({ page }) => { + await start(); + await page.goto("/#/config"); + + const lpModal = page.getByTestId("loadpoint-modal"); + const chargerModal = page.getByTestId("charger-modal"); + + // first loadpoint with its own charger + await newLoadpoint(page, "Carport"); + await lpModal.getByRole("button", { name: "Add charger" }).click(); + await expectModalVisible(chargerModal); + await expect(chargerModal.getByRole("heading", { name: "Add Charger" })).toBeVisible(); + await chargerModal.getByLabel("Manufacturer").selectOption("Demo charger"); + await chargerModal.getByLabel("Power").fill("11000"); + await chargerModal.getByRole("button", { name: "Save" }).click(); + await expectModalHidden(chargerModal); + await expectModalVisible(lpModal); + await lpModal.getByRole("button", { name: "Save" }).click(); + await expectModalHidden(lpModal); + await expect(page.getByTestId("loadpoint")).toHaveCount(1); + await expect(page.getByTestId("loadpoint")).toContainText("11.0 kW"); + + // second loadpoint, added right after without a page reload in between + await newLoadpoint(page, "Garage"); + await lpModal.getByRole("button", { name: "Add charger" }).click(); + await expectModalVisible(chargerModal); + + // must open a fresh charger, not reopen the first one for editing + await expect(chargerModal.getByRole("heading", { name: "Add Charger" })).toBeVisible(); + + await chargerModal.getByLabel("Manufacturer").selectOption("Demo charger"); + await chargerModal.getByLabel("Power").fill("22000"); + await chargerModal.getByRole("button", { name: "Save" }).click(); + await expectModalHidden(chargerModal); + await expectModalVisible(lpModal); + await lpModal.getByRole("button", { name: "Save" }).click(); + await expectModalHidden(lpModal); + + // two loadpoints, each with its own distinct charger + await expect(page.getByTestId("loadpoint")).toHaveCount(2); + await expect(page.getByTestId("loadpoint").nth(0)).toContainText("11.0 kW"); + await expect(page.getByTestId("loadpoint").nth(1)).toContainText("22.0 kW"); + + // restart to confirm the persisted config really has two distinct charger devices + await restart(); + await page.reload(); + await expect(page.getByTestId("loadpoint")).toHaveCount(2); + await expect(page.getByTestId("loadpoint").nth(0)).toContainText("11.0 kW"); + await expect(page.getByTestId("loadpoint").nth(1)).toContainText("22.0 kW"); + }); + test("vehicle", async ({ page }) => { await start(); await page.goto("/#/config");