Updated Links in Navbar (#2045)

This commit is contained in:
Michael Geers 2021-12-17 22:27:51 +01:00 • committed by GitHub
parent c03228fe72
commit 09a9ef997f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
32 changed files with 3188 additions and 3794 deletions

View file

@ -6,8 +6,12 @@ module.exports = {
},
extends: [
"eslint:recommended",
"plugin:vue/essential",
"plugin:vue/recommended",
"plugin:prettier/recommended",
"prettier",
],
rules: {
"vue/require-default-prop": "off",
"vue/attribute-hyphenation": "off",
},
};

View file

@ -22,9 +22,6 @@ window.app = new Vue({
router,
i18n,
data: { store, notifications: [] },
render: function (h) {
return h(App, { props: { notifications: this.notifications } });
},
methods: {
raise: function (msg) {
console[msg.type](msg);
@ -56,6 +53,9 @@ window.app = new Vue({
this.raise(msg);
},
},
render: function (h) {
return h(App, { props: { notifications: this.notifications } });
},
});
window.setInterval(function () {

View file

@ -5,18 +5,7 @@
@click="toggleDetails"
>
<Visualization
class="
col-12
offset-md-1
col-md-6
offset-lg-1
col-lg-8
offset-xl-1
col-xl-6
offset-xxl-1
col-xl-8
order-md-2
"
class="col-12 offset-md-1 col-md-6 offset-lg-1 col-lg-8 offset-xl-1 col-xl-6 offset-xxl-1 col-xl-8 order-md-2"
:showDetails="showDetails"
:gridImport="gridImport"
:selfConsumption="selfConsumption"
@ -82,18 +71,8 @@
</div>
</div>
<div
class="
col-12 col-sm-6
offset-md-6
col-md-6
offset-lg-4
col-lg-8
d-block d-md-flex
order-md-3
justify-content-between
mt-2
"
v-if="showDetails"
class="col-12 col-sm-6 offset-md-6 col-md-6 offset-lg-4 col-lg-8 d-block d-md-flex order-md-3 justify-content-between mt-2"
>
<div class="text-nowrap d-flex d-md-block" data-test-grid-import>
<span class="color-grid details-icon"><fa-icon icon="square"></fa-icon></span>
@ -136,6 +115,7 @@ import BatteryIcon from "./BatteryIcon.vue";
export default {
name: "Energyflow",
components: { Visualization, BatteryIcon },
mixins: [formatter],
props: {
gridConfigured: Boolean,
gridPower: { type: Number, default: 0 },
@ -151,7 +131,6 @@ export default {
data: function () {
return { showDetails: false };
},
mixins: [formatter],
computed: {
gridImport: function () {
return Math.max(0, this.gridPower);

View file

@ -13,15 +13,15 @@
</LabelBar>
</div>
</div>
<div class="site-progress" ref="site_progress">
<div ref="site_progress" class="site-progress">
<div
class="site-progress-bar self-consumption"
:style="{ width: widthTotal(selfConsumptionAdjusted) }"
>
<span class="power" v-if="powerLabelEnoughSpace(selfConsumption)">
<span v-if="powerLabelEnoughSpace(selfConsumption)" class="power">
{{ kw(selfConsumption) }}
</span>
<span class="power" v-else-if="powerLabelSomeSpace(selfConsumption)">
<span v-else-if="powerLabelSomeSpace(selfConsumption)" class="power">
{{ kwNoUnit(selfConsumption) }}
</span>
</div>
@ -29,10 +29,10 @@
class="site-progress-bar grid-import"
:style="{ width: widthTotal(gridImportAdjusted) }"
>
<span class="power" v-if="powerLabelEnoughSpace(gridImport)">
<span v-if="powerLabelEnoughSpace(gridImport)" class="power">
{{ kw(gridImport) }}
</span>
<span class="power" v-else-if="powerLabelSomeSpace(gridImport)">
<span v-else-if="powerLabelSomeSpace(gridImport)" class="power">
{{ kwNoUnit(gridImport) }}
</span>
</div>
@ -40,14 +40,14 @@
class="site-progress-bar pv-export"
:style="{ width: widthTotal(pvExportAdjusted) }"
>
<span class="power" v-if="powerLabelEnoughSpace(pvExport)">
<span v-if="powerLabelEnoughSpace(pvExport)" class="power">
{{ kw(pvExport) }}
</span>
<span class="power" v-else-if="powerLabelSomeSpace(pvExport)">
<span v-else-if="powerLabelSomeSpace(pvExport)" class="power">
{{ kwNoUnit(pvExport) }}
</span>
</div>
<div class="site-progress-bar bg-light border no-wrap w-100" v-if="totalAdjusted <= 0">
<div v-if="totalAdjusted <= 0" class="site-progress-bar bg-light border no-wrap w-100">
<span>{{ $t("main.energyflow.noEnergy") }}</span>
</div>
</div>
@ -80,6 +80,7 @@ import LabelBar from "./LabelBar.vue";
export default {
name: "Visualization",
components: { BatteryIcon, LabelBar, GridIcon },
mixins: [formatter],
props: {
showDetails: Boolean,
gridImport: { type: Number, default: 0 },
@ -96,16 +97,6 @@ export default {
data: function () {
return { width: 0, visualizationReady: false };
},
mounted: function () {
this.$nextTick(function () {
window.addEventListener("resize", this.updateElementWidth);
this.updateElementWidth();
});
},
beforeDestroy() {
window.removeEventListener("resize", this.updateElementWidth);
},
mixins: [formatter],
computed: {
gridExport: function () {
return this.pvExport;
@ -137,6 +128,15 @@ export default {
}, 500);
},
},
mounted: function () {
this.$nextTick(function () {
window.addEventListener("resize", this.updateElementWidth);
this.updateElementWidth();
});
},
beforeDestroy() {
window.removeEventListener("resize", this.updateElementWidth);
},
methods: {
widthTotal: function (power) {
if (this.totalAdjusted === 0) return "0%";

View file

@ -3,15 +3,15 @@
<p class="h3 mb-4 d-sm-block" :class="{ 'd-none': single }">
{{ title || $t("main.loadpoint.fallbackName") }}
</p>
<div class="alert alert-warning mt-4 mb-2" role="alert" v-if="remoteDisabled == 'soft'">
<div v-if="remoteDisabled == 'soft'" class="alert alert-warning mt-4 mb-2" role="alert">
{{ $t("main.loadpoint.remoteDisabledSoft", { source: remoteDisabledSource }) }}
</div>
<div class="alert alert-danger mt-4 mb-2" role="alert" v-if="remoteDisabled == 'hard'">
<div v-if="remoteDisabled == 'hard'" class="alert alert-danger mt-4 mb-2" role="alert">
{{ $t("main.loadpoint.remoteDisabledHard", { source: remoteDisabledSource }) }}
</div>
<div class="row">
<Mode class="col-12 col-md-6 col-lg-4 mb-4" :mode="mode" v-on:updated="setTargetMode" />
<Mode class="col-12 col-md-6 col-lg-4 mb-4" :mode="mode" @updated="setTargetMode" />
<Vehicle
class="col-12 col-md-6 col-lg-8 mb-4"
v-bind="vehicle"
@ -33,6 +33,8 @@ import collector from "../mixins/collector";
export default {
name: "Loadpoint",
components: { LoadpointDetails, Mode, Vehicle },
mixins: [formatter, collector],
props: {
id: Number,
single: Boolean,
@ -82,8 +84,6 @@ export default {
pvRemaining: Number,
pvAction: String,
},
components: { LoadpointDetails, Mode, Vehicle },
mixins: [formatter, collector],
data: function () {
return {
tickerHandle: null,
@ -113,6 +113,9 @@ export default {
}
},
},
destroyed: function () {
window.clearInterval(this.tickerHandle);
},
methods: {
api: function (func) {
return "loadpoints/" + this.id + "/" + func;
@ -146,8 +149,5 @@ export default {
.catch(window.app.error);
},
},
destroyed: function () {
window.clearInterval(this.tickerHandle);
},
};
</script>

View file

@ -6,9 +6,9 @@
{{ $t("main.loadpointDetails.power") }}
<div
v-if="chargePower && activePhases"
v-tooltip="{ content: phaseTooltip }"
class="badge rounded-pill bg-secondary text-light cursor-pointer"
tabindex="0"
v-tooltip="{ content: phaseTooltip }"
>
{{ activePhases }}P
<WaitingDots
@ -19,32 +19,32 @@
/>
</div>
<fa-icon
v-if="climater == 'heating'"
class="text-primary ms-1"
icon="temperature-low"
v-if="climater == 'heating'"
></fa-icon>
<fa-icon
v-if="climater == 'cooling'"
class="text-primary ms-1"
icon="temperature-high"
v-if="climater == 'cooling'"
></fa-icon>
<fa-icon
v-if="climater == 'on'"
class="text-primary ms-1"
icon="thermometer-half"
v-if="climater == 'on'"
></fa-icon>
</div>
<h3 class="value">
{{ fmt(chargePower) }}
<small class="text-muted">
{{ fmtUnit(chargePower) }}W<small
class="cursor-pointer d-inline-block px-2"
v-if="pvTimerVisible"
v-tooltip="{
content: $t(`main.loadpointDetails.tooltip.pv.${pvAction}`, {
remaining: fmtRemaining(pvRemaining),
}),
}"
class="cursor-pointer d-inline-block px-2"
tabindex="0"
>
<WaitingDots
@ -64,7 +64,7 @@
</h3>
</div>
<div class="col-6 col-sm-3 col-lg-2 mt-3" v-if="vehicleRange && vehicleRange >= 0">
<div v-if="vehicleRange && vehicleRange >= 0" class="col-6 col-sm-3 col-lg-2 mt-3">
<div class="mb-2 value">{{ $t("main.loadpointDetails.vehicleRange") }}</div>
<h3 class="value">
{{ Math.round(vehicleRange) }}
@ -72,7 +72,7 @@
</h3>
</div>
<div class="col-6 col-sm-3 col-lg-2 mt-3" v-else>
<div v-else class="col-6 col-sm-3 col-lg-2 mt-3">
<div class="mb-2 value">{{ $t("main.loadpointDetails.duration") }}</div>
<h3 class="value">
{{ fmtShortDuration(chargeDuration) }}
@ -80,7 +80,7 @@
</h3>
</div>
<div class="col-6 col-sm-3 col-lg-2 mt-3" v-if="vehiclePresent">
<div v-if="vehiclePresent" class="col-6 col-sm-3 col-lg-2 mt-3">
<div class="mb-2 value">{{ $t("main.loadpointDetails.remaining") }}</div>
<h3 class="value">
{{ fmtShortDuration(chargeRemainingDuration) }}
@ -101,6 +101,7 @@ import formatter from "../mixins/formatter";
export default {
name: "LoadpointDetails",
components: { WaitingDots },
mixins: [formatter],
props: {
chargedEnergy: Number,
chargeDuration: Number,
@ -115,12 +116,6 @@ export default {
pvRemaining: Number,
pvAction: String,
},
mixins: [formatter],
methods: {
fmtRemaining(remaining) {
return remaining > 0 ? this.fmtTimeAgo(new Date(Date.now() + remaining * 1000)) : null;
},
},
computed: {
phaseTooltip() {
if (["scale1p", "scale3p"].includes(this.phaseAction)) {
@ -155,5 +150,10 @@ export default {
return false;
},
},
methods: {
fmtRemaining(remaining) {
return remaining > 0 ? this.fmtTimeAgo(new Date(Date.now() + remaining * 1000)) : null;
},
},
};
</script>

View file

@ -51,7 +51,7 @@
<span class="flex-grow-1 px-2 py-1 text-break">
{{ msg.message }}
</span>
<span class="badge rounded-pill bg-secondary" v-if="msg.count > 1">
<span v-if="msg.count > 1" class="badge rounded-pill bg-secondary">
{{ msg.count }}
</span>
</p>
@ -62,8 +62,8 @@
type="button"
data-bs-dismiss="modal"
aria-label="Close"
@click="clear"
class="btn btn-outline-secondary"
@click="clear"
>
{{ $t("notifications.dismissAll") }}
</button>
@ -80,6 +80,7 @@ import formatter from "../mixins/formatter";
export default {
name: "Notifications",
mixins: [formatter],
props: {
notifications: Array,
},
@ -93,11 +94,6 @@ export default {
: "text-warning";
},
},
methods: {
clear: function () {
window.app && window.app.clear();
},
},
created: function () {
this.interval = setInterval(() => {
this.$forceUpdate();
@ -106,6 +102,10 @@ export default {
destroyed: function () {
clearTimeout(this.interval);
},
mixins: [formatter],
methods: {
clear: function () {
window.app && window.app.clear();
},
},
};
</script>

View file

@ -7,12 +7,12 @@
<hr class="w-100 my-4" />
<div class="flex-grow-1 d-flex justify-content-around flex-column">
<template v-for="(loadpoint, id) in loadpoints">
<hr class="w-100 my-4" v-if="id > 0" :key="id + '_hr'" />
<hr v-if="id > 0" :key="id + '_hr'" class="w-100 my-4" />
<Loadpoint
:key="id"
v-bind="loadpoint"
:single="loadpoints.length === 1"
:id="id"
:key="id"
:single="loadpoints.length === 1"
/>
</template>
</div>
@ -27,6 +27,8 @@ import collector from "../mixins/collector";
export default {
name: "Site",
components: { Loadpoint, Energyflow },
mixins: [formatter, collector],
props: {
loadpoints: Array,
@ -43,8 +45,6 @@ export default {
prioritySoC: Number,
siteTitle: String,
},
components: { Loadpoint, Energyflow },
mixins: [formatter, collector],
computed: {
energyflow: function () {
return this.collectProps(Energyflow);

View file

@ -1,7 +1,7 @@
<template>
<div
ref="sponsor"
v-if="sponsor"
ref="sponsor"
class="btn btn-link pe-0 text-decoration-none link-dark text-nowrap sponsor-button"
@click.stop.prevent="surprise"
>
@ -28,7 +28,7 @@
import confetti from "canvas-confetti";
export default {
name: "sponsor",
name: "Sponsor",
props: {
sponsor: String,
},

View file

@ -29,40 +29,42 @@
<form @submit.prevent="saveTargetTime">
<div class="modal-body">
<div class="form-group">
<!-- eslint-disable vue/no-v-html -->
<label
for="targetTimeLabel"
class="mb-3"
v-html="$t('main.targetCharge.description', { targetSoC })"
>
</label>
<!-- eslint-enable vue/no-v-html -->
<div
class="d-flex justify-content-between"
:style="{ 'max-width': '350px' }"
>
<select
class="form-select me-2"
v-model="selectedDay"
class="form-select me-2"
:style="{ 'flex-basis': '60%' }"
>
<option
v-for="opt in dayOptions()"
:value="opt.value"
:key="opt.value"
:value="opt.value"
>
{{ opt.name }}
</option>
</select>
<input
v-model="selectedTime"
type="time"
class="form-control ms-2"
:style="{ 'flex-basis': '40%' }"
v-model="selectedTime"
:step="60 * 5"
required
/>
</div>
</div>
<p class="text-danger mb-0" v-if="!selectedTargetTimeValid">
<p v-if="!selectedTargetTimeValid" class="text-danger mb-0">
{{ $t("main.targetCharge.targetIsInThePast") }}
</p>
<p class="small mt-3 text-muted">
@ -108,6 +110,7 @@ import formatter from "../mixins/formatter";
export default {
name: "TargetCharge",
mixins: [formatter],
props: {
id: Number,
timerActive: Boolean,
@ -115,6 +118,9 @@ export default {
targetTime: String,
targetSoC: Number,
},
data: function () {
return { selectedDay: null, selectedTime: null };
},
computed: {
targetChargeEnabled: function () {
return this.targetTime && this.timerSet;
@ -130,17 +136,14 @@ export default {
return `targetChargeModal_${this.id}`;
},
},
data: function () {
return { selectedDay: null, selectedTime: null };
},
mounted: function () {
this.initInputFields();
},
watch: {
targetTime() {
this.initInputFields();
},
},
mounted: function () {
this.initInputFields();
},
methods: {
// not computed because it needs to update over time
targetTimeLabel: function () {
@ -201,6 +204,5 @@ export default {
this.$emit("target-time-updated", this.selectedTargetTime);
},
},
mixins: [formatter],
};
</script>

View file

@ -6,8 +6,8 @@
<VehicleSoc v-bind="vehicleSocProps" @target-soc-updated="targetSocUpdated" />
<VehicleSubline
v-bind="vehicleSubline"
@target-time-updated="targetTimeUpdated"
class="my-1"
@target-time-updated="targetTimeUpdated"
/>
</div>
</template>
@ -21,6 +21,7 @@ import VehicleSubline from "./VehicleSubline";
export default {
name: "Vehicle",
components: { VehicleSoc, VehicleSubline },
mixins: [collector],
props: {
id: Number,
connected: Boolean,
@ -51,6 +52,5 @@ export default {
this.$emit("target-time-updated", targetTime);
},
},
mixins: [collector],
};
</script>

View file

@ -70,16 +70,6 @@ export default {
interactionStartScreenY: null,
};
},
mounted: function () {
setTimeout(() => {
this.allowSliderHiding = true;
}, 1000);
},
watch: {
targetSoC: function () {
this.selectedTargetSoC = this.targetSoC;
},
},
computed: {
vehicleSoCDisplayWidth: function () {
if (this.vehiclePresent && this.vehicleSoC >= 0) {
@ -136,6 +126,16 @@ export default {
return Number(this.selectedTargetSoC || this.targetSoC);
},
},
watch: {
targetSoC: function () {
this.selectedTargetSoC = this.targetSoC;
},
},
mounted: function () {
setTimeout(() => {
this.allowSliderHiding = true;
}, 1000);
},
methods: {
changeTargetSoCStart: function (e) {
const screenY = e.screenY || e.changedTouches[0].screenY;

View file

@ -17,6 +17,7 @@ import TargetCharge from "./TargetCharge.vue";
export default {
name: "VehicleSubline",
components: { TargetCharge },
mixins: [collector],
props: {
id: Number,
vehicleSoC: Number,
@ -34,7 +35,6 @@ export default {
return this.collectProps(TargetCharge);
},
},
mixins: [collector],
methods: {
targetTimeUpdated: function (targetTime) {
this.$emit("target-time-updated", targetTime);

View file

@ -1,10 +1,10 @@
<template>
<div>
<button
v-if="newVersionAvailable"
href="#"
data-bs-toggle="modal"
data-bs-target="#updateModal"
v-if="newVersionAvailable"
class="btn btn-link ps-0 text-decoration-none link-dark text-nowrap"
>
<fa-icon icon="gift" class="icon me-1"></fa-icon>
@ -13,10 +13,10 @@
{{ available }}
</button>
<a
v-else
:href="releaseNotesUrl(installed)"
target="_blank"
class="btn btn-link ps-0 text-decoration-none link-dark text-nowrap"
v-else
>
{{ $t("footer.version.version") }} {{ installed }}
</a>
@ -52,7 +52,9 @@
{{ installed }}
</small>
</p>
<!-- eslint-disable vue/no-v-html -->
<div v-if="releaseNotes" v-html="releaseNotes"></div>
<!-- eslint-enable vue/no-v-html -->
<p v-else>
{{ $t("footer.version.modalNoReleaseNotes") }}
<a :href="releaseNotesUrl(available)">GitHub</a>.
@ -70,9 +72,9 @@
</button>
<div>
<button
v-if="hasUpdater"
type="button"
class="btn btn-primary"
v-if="hasUpdater"
:disabled="updateStarted"
@click="update"
>
@ -87,7 +89,7 @@
</span>
<span v-else>{{ $t("footer.version.modalUpdateNow") }}</span>
</button>
<a :href="releaseNotesUrl(available)" class="btn btn-primary" v-else>
<a v-else :href="releaseNotesUrl(available)" class="btn btn-primary">
{{ $t("footer.version.modalDownload") }}
</a>
</div>
@ -118,6 +120,16 @@ export default {
updateStatus: "",
};
},
computed: {
newVersionAvailable: function () {
return (
this.available && // available version already computed?
this.installed != "[[.Version]]" && // go template parsed?
this.installed != "0.0.1-alpha" && // make used?
this.available != this.installed
);
},
},
methods: {
update: async function () {
try {
@ -132,16 +144,6 @@ export default {
return `https://github.com/evcc-io/evcc/releases/tag/${version}`;
},
},
computed: {
newVersionAvailable: function () {
return (
this.available && // available version already computed?
this.installed != "[[.Version]]" && // go template parsed?
this.installed != "0.0.1-alpha" && // make used?
this.available != this.installed
);
},
},
};
</script>

View file

@ -1,5 +1,5 @@
export default {
header: { support: "Dokumentation" },
header: { docs: "Dokumentation", blog: "Blog", github: "GitHub" },
footer: {
version: {
version: "Version",

View file

@ -1,5 +1,5 @@
export default {
header: { support: "Documentation" },
header: { docs: "Documentation", blog: "Blog", github: "GitHub" },
footer: {
version: {
version: "version",

View file

@ -1,5 +1,5 @@
export default {
header: { support: "Documentazione" },
header: { docs: "Documentazione", blog: "Blog", github: "GitHub" },
footer: {
version: {
version: "versione",

View file

@ -58,4 +58,5 @@ library.add(
faEllipsisV
);
// eslint-disable-next-line vue/component-definition-name-casing
Vue.component("fa-icon", FontAwesomeIcon);

View file

@ -3,40 +3,53 @@
<div class="flex-grow-1 d-flex flex-column justify-content-between">
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container">
<a class="navbar-brand" href="https://github.com/evcc-io/evcc#readme">
<a class="navbar-brand" href="https://evcc.io/" target="_blank">
<Logo class="logo"></Logo>
</a>
<div class="d-flex">
<div class="d-flex">
<Notifications :notifications="notifications" />
<button
class="navbar-toggler"
type="button"
data-bs-toggle="collapse"
data-bs-target="#navbarNavAltMarkup"
aria-controls="navbarNavAltMarkup"
aria-expanded="false"
aria-label="Toggle navigation"
>
<span class="navbar-toggler-icon"></span>
</button>
</div>
<div
class="collapse navbar-collapse flex-lg-grow-0"
id="navbarNavAltMarkup"
<div class="d-flex flex-grow-1 justify-content-end">
<Notifications :notifications="notifications" />
<button
class="navbar-toggler"
type="button"
data-bs-toggle="collapse"
data-bs-target="#navbarNavAltMarkup"
aria-controls="navbarNavAltMarkup"
aria-expanded="false"
aria-label="Toggle navigation"
>
<ul class="navbar-nav">
<li class="nav-item">
<a
class="nav-link"
href="https://docs.evcc.io/docs/Home/"
target="_blank"
>
{{ $t("header.support") }}
</a>
</li>
</ul>
</div>
<span class="navbar-toggler-icon"></span>
</button>
</div>
<div id="navbarNavAltMarkup" class="collapse navbar-collapse flex-grow-0">
<ul class="navbar-nav">
<li class="nav-item">
<a
class="nav-link"
href="https://docs.evcc.io/blog/"
target="_blank"
>
{{ $t("header.blog") }}
</a>
</li>
<li class="nav-item">
<a
class="nav-link"
href="https://docs.evcc.io/docs/Home/"
target="_blank"
>
{{ $t("header.docs") }}
</a>
</li>
<li class="nav-item">
<a
class="nav-link"
href="https://github.com/evcc-io/evcc"
target="_blank"
>
{{ $t("header.github") }}
</a>
</li>
</ul>
</div>
</div>
</nav>
@ -59,6 +72,9 @@ import store from "../store";
export default {
name: "App",
components: { Logo, Footer, Notifications },
props: {
notifications: Array,
},
data: function () {
return {
compact: false,
@ -66,6 +82,29 @@ export default {
installedVersion: window.evcc.version,
};
},
computed: {
version: function () {
return {
installed: this.installedVersion,
available: this.store.state.availableVersion,
releaseNotes: this.store.state.releaseNotes,
hasUpdater: this.store.state.hasUpdater,
uploadMessage: this.store.state.uploadMessage,
uploadProgress: this.store.state.uploadProgress,
};
},
title: function () {
return this.store.state.siteTitle;
},
sponsor: function () {
return this.store.state.sponsor;
},
},
created: function () {
const urlParams = new URLSearchParams(window.location.search);
this.compact = urlParams.get("compact");
this.connect(); // websocket listener
},
methods: {
connect: function () {
const loc = window.location;
@ -103,32 +142,6 @@ export default {
title: this.title ? `evcc | ${this.title}` : "evcc",
};
},
computed: {
version: function () {
return {
installed: this.installedVersion,
available: this.store.state.availableVersion,
releaseNotes: this.store.state.releaseNotes,
hasUpdater: this.store.state.hasUpdater,
uploadMessage: this.store.state.uploadMessage,
uploadProgress: this.store.state.uploadProgress,
};
},
title: function () {
return this.store.state.siteTitle;
},
sponsor: function () {
return this.store.state.sponsor;
},
},
props: {
notifications: Array,
},
created: function () {
const urlParams = new URLSearchParams(window.location.search);
this.compact = urlParams.get("compact");
this.connect(); // websocket listener
},
};
</script>
<style scoped>

View file

@ -13,26 +13,26 @@
<div class="col-md-4"></div>
<div class="col-6 col-md-2 py-3">
Netzzähler:
<span class="text-primary" v-if="gridConfigured">✓</span>
<span class="text-primary" v-else>&mdash;</span>
<span v-if="gridConfigured" class="text-primary">✓</span>
<span v-else class="text-primary">&mdash;</span>
</div>
<div class="col-6 col-md-2 py-3">
PV Zähler:
<span class="text-primary" v-if="pvConfigured">✓</span>
<span class="text-primary" v-else>&mdash;</span>
<span v-if="pvConfigured" class="text-primary">✓</span>
<span v-else class="text-primary">&mdash;</span>
</div>
<div class="col-6 col-md-2 py-3">
Batteriezähler:
<span class="text-primary" v-if="batteryConfigured">✓</span>
<span class="text-primary" v-else>&mdash;</span>
<span v-if="batteryConfigured" class="text-primary">✓</span>
<span v-else class="text-primary">&mdash;</span>
</div>
</div>
<div
v-for="(loadpoint, id) in loadpoints"
:loadpoint="loadpoint"
:key="id"
:id="'loadpoint-' + id"
:key="id"
:loadpoint="loadpoint"
>
<div class="row mt-4 border-bottom">
<div class="col-12">
@ -44,8 +44,8 @@
<div class="col-md-4"></div>
<div class="col-6 col-md-2 py-3">
Ladezähler:
<span class="text-primary" v-if="loadpoint.chargeConfigured">✓</span>
<span class="text-primary" v-else>&mdash;</span>
<span v-if="loadpoint.chargeConfigured" class="text-primary">✓</span>
<span v-else class="text-primary">&mdash;</span>
</div>
<div class="col-6 col-md-2 py-3">
Phasen:

View file

@ -1,6 +1,6 @@
<template>
<div class="container">
<Site v-bind="state" v-if="configured"></Site>
<Site v-if="configured" v-bind="state"></Site>
<div v-else>
<div class="row py-5">
<div class="col12">

File diff suppressed because one or more lines are too long

4
dist/index.html vendored
View file

@ -1,4 +1,4 @@
<!DOCTYPE html><html lang="de"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="description" content="EV Charge Controller"><meta name="author" content="andig"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><link rel="apple-touch-icon" sizes="180x180" href="ico/apple-touch-icon.png?[[.Version]]"><link rel="icon" type="image/png" sizes="32x32" href="ico/favicon-32x32.png?[[.Version]]"><link rel="icon" type="image/png" sizes="16x16" href="ico/favicon-16x16.png?[[.Version]]"><link rel="manifest" href="ico/site.webmanifest"><link rel="mask-icon" href="ico/safari-pinned-tab.svg?[[.Version]]" color="#18191a"><link rel="shortcut icon" href="ico/favicon.ico?[[.Version]]"><meta name="apple-mobile-web-app-title" content="evcc"><meta name="application-name" content="evcc"><meta name="msapplication-TileColor" content="#18191a"><meta name="msapplication-config" content="ico/browserconfig.xml"><meta name="theme-color" content="#18191a"><title>evcc</title><link href="css/chunk-vendors.a7b690cd.css" rel="preload" as="style"><link href="css/index.31975401.css" rel="preload" as="style"><link href="js/chunk-vendors.6e78ad3a.js" rel="preload" as="script"><link href="js/index.c646bc03.js" rel="preload" as="script"><link href="css/chunk-vendors.a7b690cd.css" rel="stylesheet"><link href="css/index.31975401.css" rel="stylesheet"></head><body><script>window.evcc = {
<!DOCTYPE html><html lang="de"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="description" content="EV Charge Controller"><meta name="author" content="andig"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><link rel="apple-touch-icon" sizes="180x180" href="ico/apple-touch-icon.png?[[.Version]]"><link rel="icon" type="image/png" sizes="32x32" href="ico/favicon-32x32.png?[[.Version]]"><link rel="icon" type="image/png" sizes="16x16" href="ico/favicon-16x16.png?[[.Version]]"><link rel="manifest" href="ico/site.webmanifest"><link rel="mask-icon" href="ico/safari-pinned-tab.svg?[[.Version]]" color="#18191a"><link rel="shortcut icon" href="ico/favicon.ico?[[.Version]]"><meta name="apple-mobile-web-app-title" content="evcc"><meta name="application-name" content="evcc"><meta name="msapplication-TileColor" content="#18191a"><meta name="msapplication-config" content="ico/browserconfig.xml"><meta name="theme-color" content="#18191a"><title>evcc</title><link href="css/chunk-vendors.a7b690cd.css" rel="preload" as="style"><link href="css/index.801eac99.css" rel="preload" as="style"><link href="js/chunk-vendors.e8d8381a.js" rel="preload" as="script"><link href="js/index.0a569798.js" rel="preload" as="script"><link href="css/chunk-vendors.a7b690cd.css" rel="stylesheet"><link href="css/index.801eac99.css" rel="stylesheet"></head><body><script>window.evcc = {
version: "[[.Version]]",
configured: "[[.Configured]]",
};</script><div id="app"></div><script src="js/chunk-vendors.6e78ad3a.js"></script><script src="js/index.c646bc03.js"></script></body></html>
};</script><div id="app"></div><script src="js/chunk-vendors.e8d8381a.js"></script><script src="js/index.0a569798.js"></script></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
dist/js/chunk-vendors.e8d8381a.js.map vendored Normal file

File diff suppressed because one or more lines are too long

2
dist/js/index.0a569798.js vendored Normal file

File diff suppressed because one or more lines are too long

1
dist/js/index.0a569798.js.map vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

6537
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -16,36 +16,36 @@
"@fortawesome/free-regular-svg-icons": "^5.15.4",
"@fortawesome/free-solid-svg-icons": "^5.15.4",
"@fortawesome/vue-fontawesome": "^2.0.6",
"axios": "^0.23.0",
"axios": "^0.24.0",
"bootstrap": "^5.1.3",
"canvas-confetti": "^1.4.0",
"v-tooltip": "^3.0.0-beta.1",
"vue": "^2.6.14",
"vue-hot-reload-api": "^2.3.4",
"vue-i18n": "^8.26.5",
"vue-i18n": "^8.26.7",
"vue-meta": "^2.4.0",
"vue-router": "^3.5.2"
"vue-router": "^3.5.3"
},
"devDependencies": {
"@storybook/addon-actions": "^6.3.12",
"@storybook/addon-essentials": "^6.3.12",
"@storybook/addon-links": "^6.3.12",
"@storybook/addon-actions": "^6.4.9",
"@storybook/addon-essentials": "^6.4.9",
"@storybook/addon-links": "^6.4.9",
"@storybook/addon-postcss": "^2.0.0",
"@storybook/vue": "^6.3.12",
"@vue/cli-plugin-unit-jest": "^4.5.14",
"@vue/cli-service": "^4.5.14",
"@vue/component-compiler-utils": "^3.2.2",
"@storybook/vue": "^6.4.9",
"@vue/cli-plugin-unit-jest": "^4.5.15",
"@vue/cli-service": "^4.5.15",
"@vue/component-compiler-utils": "^3.3.0",
"@vue/eslint-config-standard": "^6.1.0",
"@vue/test-utils": "^1.2.2",
"@vue/test-utils": "^1.3.0",
"eslint": "^7.32.0",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-import": "^2.25.2",
"eslint-plugin-import": "^2.25.3",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-prettier": "^3.4.1",
"eslint-plugin-promise": "^5.1.1",
"eslint-plugin-promise": "^5.2.0",
"eslint-plugin-standard": "^5.0.0",
"eslint-plugin-vue": "^7.20.0",
"prettier": "^2.4.1",
"prettier": "^2.5.1",
"vue-template-compiler": "^2.6.14"
},
"alias": {