diff --git a/assets/js/components/Footer/OfflineIndicator.vue b/assets/js/components/Footer/OfflineIndicator.vue index 0095e5d49..5106ef16c 100644 --- a/assets/js/components/Footer/OfflineIndicator.vue +++ b/assets/js/components/Footer/OfflineIndicator.vue @@ -38,26 +38,41 @@
- -
-
- - {{ $t("offline.configurationError") }} - -
-
-
- {{ fatalText }} +
+ +
+
+ + {{ $t("offline.configurationError") }} + +
+
+
+ {{ fatalText }} +
- +
+ + +
@@ -69,6 +84,7 @@ import "@h2d2/shopicons/es/regular/car1"; import CloudOffline from "../MaterialIcon/CloudOffline.vue"; import RestartButton from "./RestartButton.vue"; import restart, { performRestart, restartComplete } from "@/restart"; +import deepEqual from "@/utils/deepEqual"; import type { FatalError } from "@/types/evcc"; export default defineComponent({ @@ -129,11 +145,19 @@ export default defineComponent({ this.dismissed = false; } }, + fatal(next, prev) { + if (!deepEqual(next, prev)) { + this.dismissed = false; + } + }, }, methods: { restart() { performRestart(); }, + dismiss() { + this.dismissed = true; + }, }, }); diff --git a/i18n/de.json b/i18n/de.json index 7c5023e6b..f6fde6468 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -240,6 +240,7 @@ "customHelp": "Erstelle ein benutzerdefiniertes Gerät mit evcc's Plugin-System.", "customOption": "Benutzerdefiniertes Gerät", "delete": "Löschen", + "dismiss": "Ausblenden", "docsLink": "Siehe Dokumentation.", "dragHandle": "Verschieben", "dragItem": "Verschiebbar: {title}", diff --git a/i18n/en.json b/i18n/en.json index f0500fab6..43ec24ac2 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -240,6 +240,7 @@ "customHelp": "Create a user-defined device using evcc's plugin system.", "customOption": "User-defined device", "delete": "Delete", + "dismiss": "Dismiss", "docsLink": "See documentation.", "dragHandle": "Drag handle", "dragItem": "Draggable: {title}", diff --git a/tests/config-fatals.spec.ts b/tests/config-fatals.spec.ts index 432b0adea..f3803040c 100644 --- a/tests/config-fatals.spec.ts +++ b/tests/config-fatals.spec.ts @@ -35,6 +35,13 @@ test.describe("fatal config handling", async () => { // remove meter await expect(page.getByTestId("fatal-error")).toBeVisible(); + + // dismiss hides the banner; reload restores it while the error persists + await page.getByRole("button", { name: "Dismiss" }).click(); + await expect(page.getByTestId("fatal-error")).not.toBeVisible(); + await page.reload(); + await expect(page.getByTestId("fatal-error")).toBeVisible(); + await expect(page.getByTestId("pv")).toBeVisible(); await page.getByTestId("pv").getByRole("button", { name: "edit" }).click(); await expectModalVisible(meterModal);