diff --git a/api/globalconfig/types.go b/api/globalconfig/types.go index ab7fda8a8..4c91edcc5 100644 --- a/api/globalconfig/types.go +++ b/api/globalconfig/types.go @@ -2,6 +2,7 @@ package globalconfig import ( "encoding/json" + "iter" "net" "os" "strconv" @@ -173,6 +174,34 @@ type Tariffs struct { Solar []config.Typed } +func (c Tariffs) IsConfigured() bool { + return c.Currency != "" || c.Grid.Type != "" || c.FeedIn.Type != "" || c.Co2.Type != "" || c.Planner.Type != "" || len(c.Solar) > 0 +} + +type TariffRefs struct { + Grid string `json:"grid"` + FeedIn string `json:"feedIn"` + Co2 string `json:"co2"` + Planner string `json:"planner"` + Solar []string `json:"solar"` +} + +func (refs TariffRefs) IsConfigured() bool { + return refs.Grid != "" || refs.FeedIn != "" || refs.Co2 != "" || refs.Planner != "" || len(refs.Solar) > 0 +} + +func (refs TariffRefs) Used() iter.Seq[string] { + return func(yield func(string) bool) { + for _, ref := range append([]string{refs.Grid, refs.FeedIn, refs.Co2, refs.Planner}, refs.Solar...) { + if ref != "" { + if !yield(ref) { + return + } + } + } + } +} + type Network struct { Schema_ string `json:"schema,omitempty" mapstructure:"schema"` // TODO deprecated ExternalUrl string `json:"externalUrl"` diff --git a/assets/css/app.css b/assets/css/app.css index d450fc91a..6ca11349b 100644 --- a/assets/css/app.css +++ b/assets/css/app.css @@ -72,6 +72,9 @@ --bs-warning: var(--evcc-orange); --bs-warning-rgb: var(--evcc-orange-rgb); + --bs-warning-bg-subtle: color-mix(in srgb, var(--evcc-orange) 10%, transparent); + --bs-warning-border-subtle: color-mix(in srgb, var(--evcc-orange) 30%, transparent); + --bs-warning-text-emphasis: var(--evcc-orange); --bs-danger-50: #dc354580; --bs-danger: var(--evcc-red); diff --git a/assets/js/components/ChargingPlans/PlanRepeatingSettings.vue b/assets/js/components/ChargingPlans/PlanRepeatingSettings.vue index a2122d815..3e5d388ed 100644 --- a/assets/js/components/ChargingPlans/PlanRepeatingSettings.vue +++ b/assets/js/components/ChargingPlans/PlanRepeatingSettings.vue @@ -184,7 +184,7 @@ export default defineComponent({ return this.dataChanged && this.selectedActive; }, weekdaysLabel(): string { - return this.getShortenedWeekdaysLabel(this.selectedWeekdays); + return this.fmtWeekdaysRange(this.selectedWeekdays); }, socOptions(): SelectOption[] { // a list of entries from 5 to 100 with a step of 5 diff --git a/assets/js/components/Config/CurrencyModal.vue b/assets/js/components/Config/CurrencyModal.vue new file mode 100644 index 000000000..847efbaa1 --- /dev/null +++ b/assets/js/components/Config/CurrencyModal.vue @@ -0,0 +1,121 @@ + + + + diff --git a/assets/js/components/Config/DeviceModal/Actions.vue b/assets/js/components/Config/DeviceModal/Actions.vue index 57e877a89..838beef1e 100644 --- a/assets/js/components/Config/DeviceModal/Actions.vue +++ b/assets/js/components/Config/DeviceModal/Actions.vue @@ -4,6 +4,7 @@ v-if="testState" v-bind="testState" :sponsor-token-required="sponsorTokenRequired" + :currency="currency" @test="$emit('test')" /> @@ -51,6 +52,7 @@ import { defineComponent } from "vue"; import type { PropType } from "vue"; import TestResult from "../TestResult.vue"; import { type TestState } from "../utils/test"; +import type { CURRENCY } from "@/types/evcc"; export default defineComponent({ name: "DeviceModalActions", @@ -67,6 +69,7 @@ export default defineComponent({ isSucceeded: Boolean as PropType, isNew: Boolean as PropType, sponsorTokenRequired: Boolean as PropType, + currency: String as PropType, }, emits: ["save", "remove", "test"], computed: { diff --git a/assets/js/components/Config/DeviceModal/DeviceModalBase.vue b/assets/js/components/Config/DeviceModal/DeviceModalBase.vue index 4651ae2dc..40bdd13b7 100644 --- a/assets/js/components/Config/DeviceModal/DeviceModalBase.vue +++ b/assets/js/components/Config/DeviceModal/DeviceModalBase.vue @@ -58,6 +58,7 @@ v-bind="param" v-model="values[param.Name]" :service-values="serviceValues[param.Name]" + :currency="currency" />
@@ -129,6 +130,7 @@ v-bind="param" v-model="values[param.Name]" :service-values="serviceValues[param.Name]" + :currency="currency" /> @@ -140,6 +142,7 @@ v-bind="param" v-model="values[param.Name]" :service-values="serviceValues[param.Name]" + :currency="currency" /> + + diff --git a/assets/js/components/Config/PropertyZoneSummary.vue b/assets/js/components/Config/PropertyZoneSummary.vue new file mode 100644 index 000000000..380ef01cd --- /dev/null +++ b/assets/js/components/Config/PropertyZoneSummary.vue @@ -0,0 +1,69 @@ + + + diff --git a/assets/js/components/Config/PropertyZonesField.vue b/assets/js/components/Config/PropertyZonesField.vue new file mode 100644 index 000000000..0dd4dbd64 --- /dev/null +++ b/assets/js/components/Config/PropertyZonesField.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/assets/js/components/Config/TariffCard.vue b/assets/js/components/Config/TariffCard.vue new file mode 100644 index 000000000..5ecf3046b --- /dev/null +++ b/assets/js/components/Config/TariffCard.vue @@ -0,0 +1,76 @@ + + + diff --git a/assets/js/components/Config/TariffModal.vue b/assets/js/components/Config/TariffModal.vue new file mode 100644 index 000000000..e80326a6f --- /dev/null +++ b/assets/js/components/Config/TariffModal.vue @@ -0,0 +1,255 @@ + + + + diff --git a/assets/js/components/Config/TariffsModal.vue b/assets/js/components/Config/TariffsLegacyModal.vue similarity index 52% rename from assets/js/components/Config/TariffsModal.vue rename to assets/js/components/Config/TariffsLegacyModal.vue index 362cce197..1f91e6817 100644 --- a/assets/js/components/Config/TariffsModal.vue +++ b/assets/js/components/Config/TariffsLegacyModal.vue @@ -1,14 +1,21 @@