Mercurial > gemma
diff client/src/components/gauge/Waterlevel.vue @ 4155:552ea22ed266 improvepdf
merge default into improvepdf
author | Thomas Junk <thomas.junk@intevation.de> |
---|---|
date | Fri, 02 Aug 2019 13:30:29 +0200 |
parents | 4d7569cca5e6 d54d86d27e82 |
children | 92c2f93fef3c |
line wrap: on
line diff
--- a/client/src/components/gauge/Waterlevel.vue Thu Aug 01 12:48:33 2019 +0200 +++ b/client/src/components/gauge/Waterlevel.vue Fri Aug 02 13:30:29 2019 +0200 @@ -106,7 +106,7 @@ import { endOfDay } from "date-fns"; import debounce from "debounce"; import { saveAs } from "file-saver"; -import { diagram, pdfgen, templateLoader } from "@/lib/mixins"; +import { diagram, pdfgen, templateLoader, refwaterlevels } from "@/lib/mixins"; import { HTTP } from "@/lib/http"; import { displayError } from "@/lib/errors"; import { defaultDiagramTemplate } from "@/lib/DefaultDiagramTemplate"; @@ -116,7 +116,7 @@ const d3 = Object.assign(d3Base, { lineChunked }); export default { - mixins: [diagram, pdfgen, templateLoader], + mixins: [diagram, pdfgen, templateLoader, refwaterlevels], components: { DiagramLegend: () => import("@/components/DiagramLegend") }, @@ -465,6 +465,7 @@ .attr("clip-path", "url(#waterlevel-clip)"); svg.selectAll(".hdc-line").attr("stroke", "red"); svg.selectAll(".ldc-line").attr("stroke", "green"); + svg.selectAll(".mw-line").attr("stroke", "rgb(128,128,128)"); svg.selectAll(".rn-line").attr("stroke", "rgb(128,128,128)"); svg @@ -559,32 +560,29 @@ .style("font-size", "0.8em"); }, getExtent(refWaterLevels) { + let rest; + if (refWaterLevels) { + // set min/max values for the waterlevel axis + // including HDC (+ 1/8 HDC-LDC) and LDC (- 1/4 HDC-LDC) + const { LDC, HDC } = this.determineLDCHDC(refWaterLevels); + rest = [ + { + waterlevel: HDC + (HDC - LDC) / 8 + }, + { + waterlevel: Math.max(LDC - (HDC - LDC) / 4, 0) + } + ]; + } else { + rest = []; + } return { // set min/max values for the date axis date: [ this.waterlevels[0].date, endOfDay(this.waterlevels[this.waterlevels.length - 1].date) ], - // set min/max values for the waterlevel axis - // including HDC (+ 1/8 HDC-LDC) and LDC (- 1/4 HDC-LDC) - waterlevel: d3.extent( - [ - ...this.waterlevels, - { - waterlevel: - refWaterLevels.HDC + - (refWaterLevels.HDC - refWaterLevels.LDC) / 8 - }, - { - waterlevel: Math.max( - refWaterLevels.LDC - - (refWaterLevels.HDC - refWaterLevels.LDC) / 4, - 0 - ) - } - ], - d => d.waterlevel - ) + waterlevel: d3.extent([...this.waterlevels, ...rest], d => d.waterlevel) }; }, getScale({ dimensions, extent }) { @@ -593,10 +591,11 @@ const y = d3.scaleLinear().range([dimensions.mainHeight, 0]); const x2 = d3.scaleTime().range([0, dimensions.width]); const y2 = d3.scaleLinear().range([dimensions.navHeight, 0]); - + const [lo, hi] = extent.waterlevel; // setting the min and max values for the diagram axes + const dy = Math.ceil(0.15 * (hi - lo)); x.domain(d3.extent(extent.date)); - y.domain(extent.waterlevel); + y.domain([lo - dy, hi + dy]); x2.domain(x.domain()); y2.domain(y.domain()); @@ -701,6 +700,8 @@ .call(lineChunked); }, drawNowLines({ scale, extent, diagram, navigation }) { + const [lo, hi] = extent.waterlevel; + const dy = Math.ceil(0.15 * (hi - lo)); const nowLine = d3 .line() .x(d => scale.x(d.x)) @@ -709,9 +710,7 @@ const nowLabel = selection => { selection.attr( "transform", - `translate(${scale.x(new Date())}, ${scale.y( - extent.waterlevel[1] - 16 - )})` + `translate(${scale.x(new Date())}, ${scale.y(hi + dy * 0.4)})` ); }; @@ -719,8 +718,8 @@ diagram .append("path") .datum([ - { x: new Date(), y: extent.waterlevel[0] }, - { x: new Date(), y: extent.waterlevel[1] - 20 } + { x: new Date(), y: lo - dy }, + { x: new Date(), y: hi + dy * 0.4 } ]) .attr("class", "now-line") .attr("d", nowLine); @@ -734,10 +733,7 @@ // draw in nav navigation .append("path") - .datum([ - { x: new Date(), y: extent.waterlevel[0] }, - { x: new Date(), y: extent.waterlevel[1] - 20 } - ]) + .datum([{ x: new Date(), y: hi + dy }, { x: new Date(), y: lo - dy }]) .attr("class", "now-line") .attr( "d", @@ -778,23 +774,31 @@ }; }, drawRefLines({ refWaterLevels, diagram, scale, dimensions, extent }) { - // filling area between HDC and LDC - diagram - .append("rect") - .attr("class", "hdc-ldc-area") - .attr("x", 0) - .attr("y", scale.y(refWaterLevels.HDC)) - .attr("width", dimensions.width) - .attr( - "height", - scale.y(refWaterLevels.LDC) - scale.y(refWaterLevels.HDC) - ); + if (refWaterLevels) { + const { LDC, HDC } = this.determineLDCHDC(refWaterLevels); + // filling area between HDC and LDC if both of them are available + if (LDC && HDC) { + diagram + .append("rect") + .attr("class", "hdc-ldc-area") + .attr("x", 0) + .attr("y", scale.y(HDC)) + .attr("width", dimensions.width) + .attr("height", refWaterLevels ? scale.y(LDC) - scale.y(HDC) : 0); + } + } const refWaterlevelLine = d3 .line() .x(d => scale.x(d.x)) .y(d => scale.y(d.y)); + const levelStyle = name => { + if (/HDC/.test(name)) return "hdc-line"; + if (/LDC/.test(name)) return "ldc-line"; + return `${name.toLowerCase()}-line`; + }; + for (let ref in refWaterLevels) { if (refWaterLevels[ref]) { diagram @@ -803,7 +807,7 @@ { x: 0, y: refWaterLevels[ref] }, { x: extent.date[1], y: refWaterLevels[ref] } ]) - .attr("class", ref.toLowerCase() + "-line") + .attr("class", levelStyle(ref)) .attr("d", refWaterlevelLine); diagram // label .append("rect") @@ -955,6 +959,7 @@ .attr("class", "chart-dots") .append("circle") .attr("class", "chart-dot") + .attr("opacity", 0) .attr("r", 4); // create container for the tooltip