Skip to content

Commit 0fe2f2a

Browse files
authored
Config UI: order meters (#25558)
1 parent 8a9944a commit 0fe2f2a

File tree

3 files changed

+73
-9
lines changed

3 files changed

+73
-9
lines changed

assets/js/components/Energyflow/Energyflow.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@
182182
:power="c.power"
183183
:powerUnit="powerUnit"
184184
icon="vehicle"
185+
data-testid="energyflow-entry-consumer"
185186
:iconProps="{ names: [c.icon || 'generic'] }"
186187
/>
187188
</template>

assets/js/views/Config.vue

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -748,11 +748,13 @@ export default defineComponent({
748748
const response = await api.get("/config/loadpoints");
749749
this.loadpoints = response.data || [];
750750
},
751-
getMetersByNames(names: string[] | null) {
751+
getMetersByNames(names: string[] | null): ConfigMeter[] {
752752
if (!names || !this.meters) {
753753
return [];
754754
}
755-
return this.meters.filter((m) => names.includes(m.name));
755+
return names
756+
.map((name) => this.meters.find((m) => m.name === name))
757+
.filter((m): m is ConfigMeter => m !== undefined);
756758
},
757759
getMeterById(id?: number) {
758760
if (!id || !this.meters) {

tests/config-ext-meter.spec.ts

Lines changed: 68 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { test, expect } from "@playwright/test";
1+
import { test, expect, type Page } from "@playwright/test";
22
import { start, stop, restart, baseUrl } from "./evcc";
33
import {
44
editorClear,
@@ -9,17 +9,32 @@ import {
99
} from "./utils";
1010

1111
const CONFIG_GRID_ONLY = "config-grid-only.evcc.yaml";
12+
const CONFIG_BASICS = "basics.evcc.yaml";
1213

1314
test.use({ baseURL: baseUrl() });
1415

15-
test.beforeEach(async () => {
16-
await start(CONFIG_GRID_ONLY);
17-
});
18-
test.afterEach(async () => {
19-
await stop();
20-
});
16+
async function createExtMeter(page: Page, title: string, power: string) {
17+
const modal = page.getByTestId("meter-modal");
18+
19+
await page.getByRole("button", { name: "Add additional meter" }).click();
20+
await expectModalVisible(modal);
21+
await modal.getByRole("button", { name: "Add regular consumer" }).click();
22+
await modal.getByLabel("Title").fill(title);
23+
await modal.getByLabel("Usage").selectOption("battery");
24+
await modal.getByLabel("Manufacturer").selectOption("Demo battery");
25+
await modal.getByLabel("Power").fill(power);
26+
await modal.getByRole("button", { name: "Save" }).click();
27+
await expectModalHidden(modal);
28+
}
2129

2230
test.describe("ext meter", async () => {
31+
test.beforeEach(async () => {
32+
await start(CONFIG_GRID_ONLY);
33+
});
34+
test.afterEach(async () => {
35+
await stop();
36+
});
37+
2338
test("template-based ext meter", async ({ page }) => {
2439
await page.goto("/#/config");
2540
await enableExperimental(page, false);
@@ -161,3 +176,49 @@ test.describe("ext meter", async () => {
161176
await expect(page.getByTestId("ext")).toHaveCount(0);
162177
});
163178
});
179+
180+
test.describe("ext meter order", async () => {
181+
test.beforeEach(async () => {
182+
await start(CONFIG_BASICS);
183+
});
184+
test.afterEach(async () => {
185+
await stop();
186+
});
187+
188+
test("ensure order is preserved", async ({ page }) => {
189+
await page.goto("/#/config");
190+
await enableExperimental(page, false);
191+
await expect(page.getByTestId("ext")).toHaveCount(0);
192+
193+
// Create meters
194+
await createExtMeter(page, "Meter 1", "10");
195+
await createExtMeter(page, "Meter 2", "20");
196+
await createExtMeter(page, "Meter 3", "30");
197+
198+
// Verify order in config UI
199+
const extMeters = page.getByTestId("ext");
200+
await expect(extMeters).toHaveCount(3);
201+
await expect(extMeters.nth(0)).toContainText("Meter 1");
202+
await expect(extMeters.nth(1)).toContainText("Meter 2");
203+
await expect(extMeters.nth(2)).toContainText("Meter 3");
204+
205+
// Restart and check order is preserved in both UIs
206+
await restart(CONFIG_BASICS);
207+
208+
// Check config UI
209+
await page.goto("/#/config");
210+
await expect(extMeters).toHaveCount(3);
211+
await expect(extMeters.nth(0)).toContainText("Meter 1");
212+
await expect(extMeters.nth(1)).toContainText("Meter 2");
213+
await expect(extMeters.nth(2)).toContainText("Meter 3");
214+
215+
// Verify order in main UI consumer dropdown
216+
await page.goto("/#/");
217+
await page.getByTestId("energyflow").click();
218+
await page.getByRole("button", { name: "Consumption" }).click();
219+
const consumers = await page.getByTestId("energyflow-entry-consumer");
220+
await expect(consumers.nth(0)).toContainText("Meter 1");
221+
await expect(consumers.nth(1)).toContainText("Meter 2");
222+
await expect(consumers.nth(2)).toContainText("Meter 3");
223+
});
224+
});

0 commit comments

Comments
 (0)