view client/src/components/layers/Layerselect.vue @ 3006:44493664d40e

client: refactored layers config Layers are not stored in the vuex store anymore but instead they are served from a factory function, so that different maps can haved individual layer objects
author Markus Kottlaender <markus@intevation.de>
date Thu, 11 Apr 2019 11:44:11 +0200
parents 41cdff9b7f4a
children b3c24c47931c
line wrap: on
line source

<template>
  <div>
    <div class="form-check d-flex flex-start">
      <input
        class="form-check-input"
        type="checkbox"
        @change="visibilityToggled"
        :checked="layer.getVisible()"
      />
      <LegendElement :layer="layer"></LegendElement>
      <label
        class="pointer layername form-check-label ml-2"
        @click="visibilityToggled"
      >
        {{ label }}
      </label>
    </div>
    <div v-if="layer.getVisible() && layer.get('id') === 'BOTTLENECKISOLINE'">
      <img class="rounded my-1 d-block" :src="isolinesLegendImgDataURL" />
    </div>
    <div v-if="layer.getVisible() && layer.get('id') === 'DIFFERENCES'">
      <img class="rounded my-1 d-block" :src="differencesLegendImgDataURL" />
    </div>
  </div>
</template>

<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, 2019 by via donau
 *   – Österreichische Wasserstraßen-Gesellschaft mbH
 * Software engineering by Intevation GmbH
 *
 * Author(s):
 * * Thomas Junk <thomas.junk@intevation.de>
 * * Bernhard Reiter <bernhard.reiter@intevation.de>
 */
import { HTTP } from "@/lib/http";
import { displayError } from "@/lib/errors";
import { mapState } from "vuex";

export default {
  props: ["layer"],
  components: {
    LegendElement: () => import("./LegendElement")
  },
  computed: {
    ...mapState("map", [
      "layers",
      "isolinesLegendImgDataURL",
      "differencesLegendImgDataURL"
    ]),
    label() {
      return this.$gettext(this.layer.get("label"));
    }
  },
  methods: {
    visibilityToggled() {
      this.layer.setVisible(!this.layer.getVisible());
    },
    loadLegendImage(layer, storeTarget) {
      HTTP.get(
        `/internal/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=${layer}&legend_options=columns:4;fontAntiAliasing:true`,
        {
          headers: {
            Accept: "image/png",
            "X-Gemma-Auth": localStorage.getItem("token")
          },
          responseType: "blob"
        }
      )
        .then(response => {
          const reader = new FileReader();
          reader.onload = event => {
            this.$store.commit("map/" + storeTarget, event.target.result);
          };
          reader.readAsDataURL(response.data);
        })
        .catch(error => {
          displayError({
            title: this.$gettext("Backend Error"),
            message: `${error.response.status}: ${error.response.statusText}`
          });
        });
    }
  },
  created() {
    if (this.layer.get("id") === "BOTTLENECKISOLINE") {
      this.loadLegendImage(
        "sounding_results_contour_lines_geoserver",
        "isolinesLegendImgDataURL"
      );
    }
    if (this.layer.get("id") === "DIFFERENCES") {
      this.loadLegendImage(
        "sounding_differences",
        "differencesLegendImgDataURL"
      );
    }
  }
};
</script>