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") }}
+
+
+
-
+
+
+
+
@@ -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);