view client/src/components/fairway/AvailableFairwayDepth.vue @ 3128:1610d3042bbb

fairway_availability: generative code fixed
author Thomas Junk <thomas.junk@intevation.de>
date Mon, 29 Apr 2019 17:06:46 +0200
parents 383720d8d98e
children 2e36267ab50e
line wrap: on
line source

<template>
  <div>
    <h1>Available Fairway Depth</h1>
    <UISpinnerOverlay v-if="loading" />
  </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";

export default {
  data() {
    return {
      loading: false
    };
  },
  computed: {
    availability() {
      return this.plainAvailability;
    }
  },
  methods: {
    drawDiagram() {
      const width = 1000;
      const height = 600;
      const data = [
        { month: "feb", values: [30, 20, 10, 0] },
        { month: "mar", values: [25, 23, 0, 0] },
        { month: "apr", values: [17, 18, 16, 13] }
      ];

      const yScale = d3
        .scaleLinear()
        .domain([-30, 30])
        .range([height - 30, 0]);

      const diagram = d3
        .select("svg")
        .attr("width", width)
        .attr("height", height);
      drawBars({ diagram, data, yScale });
      drawLabel(diagram, height);
      drawScale(diagram, yScale);
    },
    drawBars({ diagram, data, yScale }) {
      const paddingRight = 100;
      const paddingTop = 30;

      const allBars = diagram
        .selectAll("g")
        .data(data)
        .enter()
        .append("g")
        .attr("transform", (d, i) => {
          return "translate(" + (paddingRight + i * 95) + " 10 )";
        });
      const barPerMonth = 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 colors[i];
        });
    },
    drawLabel(diagram, height) {
      const dy = height / 2;
      diagram
        .append("text")
        .text("sum of days / Summe der Tage")
        .attr("text-anchor", "middle")
        .attr("x", 0)
        .attr("y", 0)
        .attr("dy", "1em")
        .attr("transform", "translate(0, " + dy + "), 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);
    }
  }
};
</script>