Mercurial > gemma
changeset 2701:e622689d73bd
client: waterlevel diagram: use endpoint
author | Markus Kottlaender <markus@intevation.de> |
---|---|
date | Mon, 18 Mar 2019 15:43:03 +0100 |
parents | 58e2d95757ac |
children | d7ef169fd0d3 |
files | client/src/assets/application.scss client/src/components/gauge/Gauges.vue client/src/components/gauge/Waterlevel.vue client/src/store/gauges.js |
diffstat | 4 files changed, 87 insertions(+), 40 deletions(-) [+] |
line wrap: on
line diff
--- a/client/src/assets/application.scss Mon Mar 18 15:34:37 2019 +0100 +++ b/client/src/assets/application.scss Mon Mar 18 15:43:03 2019 +0100 @@ -181,11 +181,16 @@ } } -.form-control-sm.small { +select.form-control-sm.small { padding: 0.25rem 0.1rem; font-size: 80%; } +input.form-control-sm.small { + padding: 0.25rem 0.2rem; + font-size: 80%; +} + .empty { margin-right: 1.25rem; }
--- a/client/src/components/gauge/Gauges.vue Mon Mar 18 15:34:37 2019 +0100 +++ b/client/src/components/gauge/Gauges.vue Mon Mar 18 15:43:03 2019 +0100 @@ -36,18 +36,26 @@ </select> <div v-if="selectedGaugeISRS" class="mt-2"> <hr class="mb-1" /> - <small class="text-muted"> - <translate>Time period</translate>: - </small> - <select - v-model="waterlevelsTimePeriod" - class="form-control form-control-sm mb-2" - > - <option value="day">last day</option> - <option value="week">last week</option> - <option value="month">last month</option> - <option value="year">last year</option> - </select> + <div class="row no-gutters mb-2"> + <div class="col-6 pr-1"> + <small class="text-muted"><translate>From</translate>:</small> + <input + type="date" + class="form-control form-control-sm small" + :value="dateFrom && dateFrom.toISOString().split('T')[0]" + @input="dateFrom = $event.target.valueAsDate" + /> + </div> + <div class="col-6 pl-1"> + <small class="text-muted"><translate>To</translate>:</small> + <input + type="date" + class="form-control form-control-sm small" + :value="dateTo && dateTo.toISOString().split('T')[0]" + @input="dateTo = $event.target.valueAsDate" + /> + </div> + </div> <button @click="showWaterlevelDiagram()" class="btn btn-sm btn-info d-block w-100" @@ -91,12 +99,14 @@ * Markus Kottländer <markus.kottlaender@intevation.de> */ import { mapState, mapGetters } from "vuex"; +import { displayError } from "@/lib/errors.js"; export default { data() { return { loading: false, - waterlevelsTimePeriod: "day" + dateFrom: new Date(), + dateTo: new Date() }; }, computed: { @@ -164,8 +174,18 @@ this.loading = true; this.$store.commit("application/showSplitscreen", true); this.$store - .dispatch("gauges/loadWaterlevels", this.waterlevelsTimePeriod) - .then(() => { + .dispatch("gauges/loadWaterlevels", { + from: this.dateFrom, + to: this.toDate + }) + .catch(error => { + const { status, data } = error.response; + displayError({ + title: "Backend Error", + message: `${status}: ${data.message || data}` + }); + }) + .finally(() => { this.$store.commit("application/splitscreenLoading", false); this.loading = false; }); @@ -179,6 +199,7 @@ } }, mounted() { + this.dateFrom.setDate(this.dateFrom.getDate() - 30); this.$store.dispatch("gauges/loadGauges"); } };
--- a/client/src/components/gauge/Waterlevel.vue Mon Mar 18 15:34:37 2019 +0100 +++ b/client/src/components/gauge/Waterlevel.vue Mon Mar 18 15:43:03 2019 +0100 @@ -1,5 +1,11 @@ <template> - <div class="flex-fill diagram-container"></div> + <div + class="d-flex flex-fill justify-content-center align-items-center diagram-container" + > + <div v-if="!waterlevels.length"> + <translate>No data available.</translate> + </div> + </div> </template> <style lang="sass" scoped> @@ -105,11 +111,11 @@ }, methods: { drawDiagram() { - if (!this.selectedGauge || !this.waterlevels.length) return; - // remove old diagram d3.select(".diagram-container svg").remove(); + if (!this.selectedGauge || !this.waterlevels.length) return; + // get HDC/LDC/MW of the gauge let refWaterLevels = JSON.parse( this.selectedGauge.properties.reference_water_levels
--- a/client/src/store/gauges.js Mon Mar 18 15:34:37 2019 +0100 +++ b/client/src/store/gauges.js Mon Mar 18 15:43:03 2019 +0100 @@ -18,8 +18,7 @@ return { gauges: [], selectedGaugeISRS: null, - waterlevels: [], - loading: false + waterlevels: [] }; }; @@ -43,9 +42,6 @@ }, waterlevels: (state, data) => { state.waterlevels = data; - }, - loading: (state, loading) => { - state.loading = loading; } }, actions: { @@ -82,25 +78,44 @@ }); }); }, - loadWaterlevels({ getters, commit }, timePeriod) { - let waterlevels = require("@/components/gauge/waterlevels-demo.json"); + loadWaterlevels({ getters, commit }, { from, to }) { + from = from || new Date(); + to = to || new Date(); + + // include the last day + to.setDate(to.getDate() + 1); - return new Promise(resolve => { - if (getters.selectedGauge && timePeriod) { - let data = waterlevels - .filter(wl => wl.gauge === getters.selectedGauge.id.split(".")[1]) - .map(wl => { - wl.date = new Date(wl.date); - return wl; - }); - - setTimeout(() => { + return new Promise((resolve, reject) => { + HTTP.get( + `/data/waterlevels/${ + getters.selectedGauge.properties.isrs_code + }?from=${from + .toISOString() + .substr(0, 23)}&to=${to.toISOString().substr(0, 23)}`, + { + headers: { "X-Gemma-Auth": localStorage.getItem("token") } + } + ) + .then(response => { + let data = response.data + .split("\n") + .filter(wl => wl) + .map(wl => { + wl = wl.split(","); + return { + date: new Date(wl[0]), + waterlevel: Number(wl[1]), + predicted: wl[2] === "f" ? false : true + }; + }); + data = data.sort((a, b) => a.date - b.date); commit("waterlevels", data); resolve(data); - }, 2000); - } else { - commit("waterlevels", []); - } + }) + .catch(error => { + commit("waterlevels", []); + reject(error); + }); }); } }