Mercurial > gemma
view client/src/components/fairway/AvailableFairwayDepth.vue @ 3135:4c6b66c12486
wip
author | Thomas Junk <thomas.junk@intevation.de> |
---|---|
date | Tue, 30 Apr 2019 15:32:57 +0200 |
parents | ab00165540fe |
children | 8159bd2aaf93 |
line wrap: on
line source
<template> <div> <h1>Available Fairway Depth</h1> <UISpinnerOverlay v-if="loading" /> <div class="d-flex flex-row ml-3"> <div class="mr-3 ml-auto"> <select class="mr-3"> <option>Monthly</option> <option>Quaterly</option> <option>Yearly</option> </select> </div> <div class="mr-3"> <label for="from" class="mr-3"><translate>from</translate></label ><input /> </div> <div class="mr-auto"> <label for="to" class="mr-3"><translate>to</translate></label ><input /> </div> </div> <div class="diagram-container"></div> </div> </template> <style></style> <script> /* This is Free Software under GNU Affero General Public License v >= 3.0 * without warranty, see README.md and license for details. * * SPDX-License-Identifier: AGPL-3.0-or-later * License-Filename: LICENSES/AGPL-3.0.txt * * Copyright (C) 2018 by via donau * – Österreichische Wasserstraßen-Gesellschaft mbH * Software engineering by Intevation GmbH * * Author(s): * Thomas Junk <thomas.junk@intevation.de> * Markus Kottländer <markus.kottlaender@intevation.de> */ import * as d3 from "d3"; import app from "@/main"; export default { data() { return { loading: false, colors: ["red", "green", "blue", "purple"], fwData: null, width: 1000, height: 600 }; }, mounted() { this.loadData(); this.drawDiagram(); }, computed: { availability() { return this.plainAvailability; } }, methods: { loadData() {}, drawDiagram() { const data = [ { month: "feb", values: [30, 20, 10, 0] }, { month: "mar", values: [25, 23, 0, 0] }, { month: "apr", values: [17, 18, 16, 13] } ]; d3.select(".diagram-container svg").remove(); const yScale = d3 .scaleLinear() .domain([-30, 30]) .range([this.height - 30, 0]); const diagram = d3 .select(".diagram-container") .append("svg") .attr("width", this.width) .attr("height", this.height); this.drawBars({ diagram, data, yScale }); this.drawLabel(diagram, this.height); this.drawScale(diagram, yScale); }, drawBars({ diagram, data, yScale }) { const paddingRight = 100; const paddingTop = 10; const allBars = diagram .selectAll("g") .data(data) .enter() .append("g") .attr("transform", (d, i) => { return `translate(${paddingRight + i * 95} ${paddingTop})`; }); // bars per month allBars .selectAll("rect") .data(d => d.values) .enter() .append("rect") .attr("x", 0) .attr("y", yScale(0)) .attr("height", d => { return Math.abs(yScale(0) - yScale(d)); }) .attr("transform", d => { if (d > 0) return "translate(0 -" + Math.abs(yScale(0) - yScale(d)) + ")"; return "translate(0 " + 0 + ")"; }) .attr("width", 60) .attr("fill", (d, i) => { return this.colors[i]; }); }, drawLabel(diagram, height) { const center = height / 2; diagram .append("text") .text(this.$options.LEGEND) .attr("text-anchor", "middle") .attr("x", 0) .attr("y", 0) .attr("dy", "1em") .attr("transform", `translate(0, ${center}), rotate(-90)`); }, drawScale(diagram, yScale) { const paddingLeft = 50; const paddingTop = 10; const yAxis = d3.axisLeft().scale(yScale); diagram .append("g") .attr("transform", `translate(${paddingLeft} ${paddingTop})`) .call(yAxis); } }, LEGEND: app.$gettext("sum of days / Summe der Tage") }; </script>