From 4163748e5015f1b8d5d00126cf09b049c96c0b38 Mon Sep 17 00:00:00 2001 From: Michael Geers Date: Fri, 15 Aug 2025 12:02:14 +0200 Subject: [PATCH] Config UI: improve sponsor token flow (#22989) Co-authored-by: andig Co-authored-by: andig --- assets/js/components/Config/GeneralConfig.vue | 33 ++++- assets/js/components/Config/JsonModal.vue | 2 + assets/js/components/Config/SponsorModal.vue | 132 +++++++++++------- assets/js/components/Savings/Sponsor.vue | 1 + .../Savings/SponsorTokenExpires.vue | 1 + .../js/components/Top/Navigation.stories.ts | 1 + assets/js/types/evcc.ts | 2 + assets/js/views/Config.vue | 7 +- charger/config/config.go | 4 +- cmd/setup.go | 1 + i18n/de.json | 8 +- i18n/en.json | 8 +- server/http_config_site_other_handler.go | 1 + tariff/config.go | 4 +- tests/sponsor.evcc.yaml | 17 +++ tests/sponsor.spec.ts | 80 +++++++++++ tests/sponsor.sql | 26 ++++ util/sponsor/auth.go | 26 +++- vehicle/config.go | 4 +- 19 files changed, 289 insertions(+), 69 deletions(-) create mode 100644 tests/sponsor.evcc.yaml create mode 100644 tests/sponsor.spec.ts create mode 100644 tests/sponsor.sql diff --git a/assets/js/components/Config/GeneralConfig.vue b/assets/js/components/Config/GeneralConfig.vue index 78657518d..00120e20e 100644 --- a/assets/js/components/Config/GeneralConfig.vue +++ b/assets/js/components/Config/GeneralConfig.vue @@ -33,15 +33,16 @@ v-if="$hiddenFeatures()" test-id="generalconfig-sponsoring" :label="$t('config.sponsor.title')" - :text="sponsorStatus.name || '---'" - :text-class="sponsorStatus.cssClass" + :text="sponsorStatus.title" + :text-class="sponsorStatus.textClass" modal-id="sponsorModal" experimental > @@ -79,6 +80,9 @@ export default { name: "GeneralConfig", components: { TitleModal, GeneralConfigEntry }, mixins: [formatter], + props: { + sponsorError: Boolean, + }, emits: ["site-changed"], data() { return { @@ -103,12 +107,27 @@ export default { sponsorStatus() { const sponsor = store.state?.sponsor || {}; const { name, expiresSoon } = sponsor; - let cssClass = ""; + let textClass = ""; + let badgeClass = ""; + let title = name; if (name) { - cssClass = expiresSoon ? "text-warning" : "text-primary"; + if (expiresSoon) { + textClass = "text-warning"; + badgeClass = "bg-warning"; + } else { + badgeClass = "bg-primary"; + } + } else { + title = "---"; } - return { name, expiresSoon, cssClass }; + if (this.sponsorError) { + textClass = "text-danger"; + badgeClass = "bg-danger"; + title = this.$t("config.sponsor.invalid"); + } + + return { title, expiresSoon, textClass, badgeClass }; }, }, async mounted() { diff --git a/assets/js/components/Config/JsonModal.vue b/assets/js/components/Config/JsonModal.vue index 7224ae2ba..33f140080 100644 --- a/assets/js/components/Config/JsonModal.vue +++ b/assets/js/components/Config/JsonModal.vue @@ -21,6 +21,7 @@ class="d-flex justify-content-between order-2 order-sm-1 gap-2 flex-grow-1 flex-sm-grow-0" >