Mercurial > gemma
changeset 3461:b43cf476d791
client: spuc05: implemented new data structure (CSV) and added support for multiple charts
author | Markus Kottlaender <markus@intevation.de> |
---|---|
date | Sun, 26 May 2019 16:33:02 +0200 |
parents | 50d40ed6e3da |
children | 9be91acbe49a |
files | client/src/components/fairway/AvailableFairwayDepthLNWL.vue client/src/store/fairwayavailability.js |
diffstat | 2 files changed, 86 insertions(+), 58 deletions(-) [+] |
line wrap: on
line diff
--- a/client/src/components/fairway/AvailableFairwayDepthLNWL.vue Fri May 24 22:01:32 2019 +0200 +++ b/client/src/components/fairway/AvailableFairwayDepthLNWL.vue Sun May 26 16:33:02 2019 +0200 @@ -84,16 +84,11 @@ return { containerId: "availablefairwaydepthlnwl", loading: false, - width: 1000, - height: 600, - paddingRight: 100, - spaceBetween: 80, labelPaddingTop: 15, scalePaddingLeft: 50, paddingTop: 10, diagram: null, yScale: null, - barsWidth: 60, dimensions: null, pdf: { doc: null, @@ -203,6 +198,22 @@ }, featureName() { return this.selectedFairwayAvailabilityFeature.properties.name; + }, + widthPerItem() { + return Math.min( + (this.dimensions.width - this.scalePaddingLeft) / + this.fwLNWLData.length, + 180 + ); + }, + ldcWidth() { + return this.widthPerItem * 0.3; + }, + afdWidth() { + return this.widthPerItem * 0.5; + }, + spaceBetween() { + return this.widthPerItem * 0.2; } }, methods: { @@ -431,7 +442,7 @@ drawTooltip() { this.diagram .append("text") - .text("banane") + .text("") .attr("font-size", "0.8em") .attr("opacity", 0) .attr("id", "tooltip"); @@ -447,19 +458,39 @@ .attr("transform", `translate(0 ${this.paddingTop})`); }, drawBars() { - if (this.fwLNWLData) this.drawLNWL(); - if (this.fwLNWLData) this.drawAFD(); + if (this.fwLNWLData) { + this.fwLNWLData.forEach((data, i) => { + this.drawLNWL(data, i); + this.drawAFD(data, i); + this.drawLabel(data.date, i); + }); + } }, - drawAFD() { + drawLabel(date, i) { + this.diagram + .append("text") + .text(date) + .attr("text-anchor", "middle") + .attr( + "transform", + `translate(${this.scalePaddingLeft + + this.widthPerItem * i + + this.widthPerItem / 2} ${this.dimensions.mainHeight - 15})` + ); + }, + drawAFD(data, i) { let afd = this.diagram .append("g") .attr( "transform", - `translate(${this.paddingRight + this.barsWidth / 2})` + `translate(${this.scalePaddingLeft + + this.spaceBetween / 2 + + this.widthPerItem * i + + this.ldcWidth})` ); afd .selectAll("rect") - .data(this.fwLNWLData.afd) + .data([data.above, data.between, data.below]) .enter() .append("rect") .on("mouseover", function() { @@ -475,34 +506,44 @@ const dy = document .querySelector(".diagram-container") .getBoundingClientRect().left; - const value = d.percent; d3.select("#tooltip") - .text(value) + .text(d.toFixed(2)) .attr("y", y - 10) .attr("x", d3.event.pageX - dy); //d3.event.pageX gives coordinates relative to SVG //dy gives offset of svg on page }) .attr("height", d => { - return this.yScale(0) - this.yScale(d.percent); + return this.yScale(0) - this.yScale(d); }) - .attr("y", d => { - return this.yScale(d.translateY); + .attr("y", (d, i) => { + if (i === 0) { + return this.yScale(d); + } + if (i === 1) { + return this.yScale(data.above + d); + } + if (i === 2) { + return this.yScale(data.above + data.between + d); + } }) - .attr("width", this.barsWidth) + .attr("width", this.afdWidth) .attr("fill", (d, i) => { return this.$options.AFDCOLORS[i]; }); }, - drawLNWL() { + drawLNWL(data, i) { let lnwl = this.diagram .append("g") - .attr("transform", `translate(${this.paddingRight})`); + .attr( + "transform", + `translate(${this.scalePaddingLeft + + this.spaceBetween / 2 + + this.widthPerItem * i})` + ); lnwl - .selectAll("rect") - .data(this.fwLNWLData.lnwl) - .enter() .append("rect") + .datum([data.ldc]) .on("mouseover", function() { d3.select(this).attr("opacity", "0.8"); d3.select("#tooltip").attr("opacity", 1); @@ -516,23 +557,22 @@ const dy = document .querySelector(".diagram-container") .getBoundingClientRect().left; - const value = d.percent; d3.select("#tooltip") - .text(value) + .text(d[0].toFixed(2)) .attr("y", y - 10) .attr("x", d3.event.pageX - dy); //d3.event.pageX gives coordinates relative to SVG //dy gives offset of svg on page }) .attr("height", d => { - return this.yScale(0) - this.yScale(d.percent); + return this.yScale(0) - this.yScale(d); }) .attr("y", d => { - return this.yScale(d.translateY); + return this.yScale(d); }) - .attr("width", this.barsWidth / 2) + .attr("width", this.ldcWidth) .attr("fill", d => { - return this.$options.LWNLCOLORS[d.level]; + return this.$options.LWNLCOLORS.LDC; }); }, drawScaleLabel() { @@ -568,9 +608,9 @@ } }, LEGEND: app.$gettext("Percent"), - AFDCOLORS: ["#3675ff", "#ff6c6c", "#782121"], + AFDCOLORS: ["#3636ff", "#f49b7f", "#e15472"], LWNLCOLORS: { - LDC: "#aaaaaa", + LDC: "#97ddf3", HDC: "#43FFE1" } };
--- a/client/src/store/fairwayavailability.js Fri May 24 22:01:32 2019 +0200 +++ b/client/src/store/fairwayavailability.js Sun May 26 16:33:02 2019 +0200 @@ -26,18 +26,6 @@ endOfQuarter } from "date-fns"; -const LNWLDIAGRAMMOCKDATA = { - lnwl: [ - { level: "LDC", value: 162, percent: 70 }, - { level: "HDC", value: 564, percent: 30 } - ], - afd: [ - { value: 200, percent: 20 }, - { value: 230, percent: 30 }, - { value: 250, percent: 50 } - ] -}; - const LIMITINGFACTORS = { WIDTH: "width", DEPTH: "depth" @@ -345,20 +333,20 @@ loadAvailableFairwayDepthLNWLDiagram: ({ commit, dispatch }, options) => { dispatch("loadAvailableFairwayDepthLNWL", options).then(response => { commit("setCSV", response); - //const data = response; - let data = LNWLDIAGRAMMOCKDATA; - data["lnwl"] = data["lnwl"].filter(v => v.level !== "HDC"); - data["afd"] = data.afd.reverse(); - Object.keys(data).forEach(diagramComponent => { - let sum = 0; - data[diagramComponent].map(elem => { - elem["translateY"] = Number(elem["percent"]) + sum; - sum += Number(elem["percent"]); - return elem; - }); + let data = response.split("\n").filter(d => d); + data.shift(); // remove header line + data = data.map(d => { + let columns = d.split(","); + return { + date: columns[0], + ldc: Number(columns[2]), + below: Number(columns[3]), + between: Number(columns[4]), + above: Number(columns[5]) + }; }); - // transformAFDLNWL commit("setFwLNWLData", data); + return data; }); }, loadAvailableFairwayDepthLNWLForMap: ({ dispatch }, options) => { @@ -369,10 +357,10 @@ data = data.map(d => { let columns = d.split(","); return { - ldc: columns[2], - below: columns[3], - between: columns[4], - above: columns[5] + ldc: Number(columns[2]), + below: Number(columns[3]), + between: Number(columns[4]), + above: Number(columns[5]) }; }); return data[0];