changeset 1096:aa1f5daf6fc9

refac: centralized stores
author Thomas Junk <thomas.junk@intevation.de>
date Tue, 30 Oct 2018 16:55:29 +0100
parents 2d6d8b676e3f
children b0aec3b1e426
files client/src/application/stores/application.js client/src/application/stores/user.js client/src/bottlenecks/store.js client/src/fairway/store.js client/src/identify/store.js client/src/map/store.js client/src/store.js client/src/store/application.js client/src/store/bottlenecks.js client/src/store/fairway.js client/src/store/identify.js client/src/store/map.js client/src/store/user.js client/src/store/usermanagement.js client/src/usermanagement/store.js
diffstat 15 files changed, 658 insertions(+), 658 deletions(-) [+]
line wrap: on
line diff
--- a/client/src/application/stores/application.js	Tue Oct 30 13:37:04 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,132 +0,0 @@
-/* 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>
- *   Bernhard E. Reiter <bernhard.reiter@intevation.de>
- */
-
-import { version } from "../../../package.json";
-
-const defaultCollapseState = true;
-
-const initializeSplitScreen = () => {
-  return {
-    active: false,
-    mode: "v"
-  };
-};
-
-const Application = {
-  namespaced: true,
-  state: {
-    appTitle: process.env.VUE_APP_TITLE,
-    secondaryLogo: process.env.VUE_APP_SECONDARY_LOGO_URL,
-    sidebar: {
-      iscollapsed: defaultCollapseState
-    },
-    bottlenecksCollapsed: true,
-    splitsceen: initializeSplitScreen(),
-    usermenu: {
-      iscollapsed: defaultCollapseState
-    },
-    countries: ["AT", "SK", "HU", "HR", "RS", "BiH", "BG", "RO", "UA"],
-    // there are three states of drawMode: null, "LineString", "Polygon"
-    drawMode: null,
-    version
-  },
-  getters: {
-    countries: state => {
-      return state.countries;
-    },
-    sidebarCollapsed: state => {
-      return state.sidebar.iscollapsed;
-    },
-    isUsermenuCollapsed: state => {
-      return state.usermenu.iscollapsed;
-    },
-    appTitle: state => {
-      return state.appTitle;
-    },
-    secondaryLogo: state => {
-      return state.secondaryLogo;
-    },
-    isSplitscreen: state => {
-      return state.splitsceen.active;
-    },
-    splitMode: state => {
-      return state.splitsceen.mode;
-    },
-    versionStr: state => {
-      // version number from package.json
-      let versionStr = "v" + state.version;
-
-      // hg revision
-      if (
-        process.env.VUE_APP_HGREV &&
-        (state.version.includes("dev") ||
-          state.version.includes("beta") ||
-          state.version.includes("alpha"))
-      )
-        versionStr += " " + process.env.VUE_APP_HGREV;
-
-      return versionStr;
-    }
-  },
-  mutations: {
-    toggleSidebar: state => {
-      state.sidebar.iscollapsed = !state.sidebar.iscollapsed;
-    },
-    toggleBottlenecks: state => {
-      state.bottlenecksCollapsed = !state.bottlenecksCollapsed;
-    },
-    toggleUserMenu: state => {
-      state.usermenu.iscollapsed = !state.usermenu.iscollapsed;
-    },
-    toggleSplitScreen: state => {
-      state.splitsceen.active = !state.splitsceen.active;
-    },
-    openSplitScreen: state => {
-      state.splitsceen.active = true;
-    },
-    closeSplitScreen: state => {
-      state.splitsceen.active = false;
-    },
-    resetSidebar: state => {
-      state.sidebar.iscollapsed = defaultCollapseState;
-    },
-    collapseSidebar: state => {
-      state.sidebar.iscollapsed = true;
-    },
-    resetUserMenu: state => {
-      state.usermenu.iscollapsed = defaultCollapseState;
-    },
-    collapseUserMenu: state => {
-      state.usermenu.iscollapsed = true;
-    },
-    resetSplitScreen: state => {
-      state.splitsceen = initializeSplitScreen();
-    },
-    toggleDrawModeLine: state => {
-      if (state.drawMode) {
-        state.drawMode = null;
-      } else {
-        state.drawMode = "LineString";
-      }
-    },
-    activateDrawModePolygon: state => {
-      state.drawMode = "Polygon";
-    }
-  },
-  actions: {}
-};
-
-export default Application;
--- a/client/src/application/stores/user.js	Tue Oct 30 13:37:04 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-/*
- * 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>
- */
-
-import { HTTP } from "../lib/http";
-
-const User = {
-  namespaced: true,
-  state: {
-    authenticated: false,
-    expires: null,
-    roles: [],
-    user: ""
-  },
-  getters: {
-    isAuthenticated: state => {
-      return state.authenticated;
-    },
-    userinfo: state => {
-      return state.user;
-    },
-    roles: state => {
-      return state.roles;
-    },
-    expires: state => {
-      return state.expires;
-    },
-    isWaterwayAdmin: state => {
-      return state.roles.includes("waterway_admin");
-    },
-    isSysAdmin: state => {
-      return state.roles.includes("sys_admin");
-    }
-  },
-  mutations: {
-    auth_success: (state, data) => {
-      const { token, user, expires, roles } = data;
-      localStorage.setItem("expires", expires);
-      localStorage.setItem("roles", roles);
-      localStorage.setItem("token", token);
-      localStorage.setItem("user", user);
-      state.expires = expires;
-      state.roles = roles;
-      state.user = user;
-      state.authenticated = true;
-    },
-    clear_auth: state => {
-      state.authenticated = false;
-      state.expires = null;
-      state.roles = [];
-      state.user = "";
-      localStorage.clear();
-    },
-    set_user: (state, name) => {
-      state.user = name;
-    },
-    set_roles: (state, roles) => {
-      state.roles = roles;
-    },
-    set_expires: (state, expires) => {
-      state.expires = expires;
-    },
-    set_authenticate: state => {
-      state.authenticated = true;
-    }
-  },
-  actions: {
-    login({ commit }, user) {
-      // using POST is a bit more secure than GET
-      return new Promise((resolve, reject) => {
-        HTTP.post("/login", user)
-          .then(response => {
-            commit("auth_success", response.data);
-            resolve(response);
-          })
-          .catch(error => {
-            commit("clear_auth");
-            reject(error);
-          });
-      });
-    }
-  }
-};
-
-export default User;
--- a/client/src/bottlenecks/store.js	Tue Oct 30 13:37:04 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-/*
- * 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):
- * Markus Kottländer <markuks.kottlaender@intevation.de>
- */
-import { HTTP } from "../application/lib/http";
-import { WFS } from "ol/format.js";
-
-const Bottlenecks = {
-  namespaced: true,
-  state: {
-    bottlenecks: []
-  },
-  mutations: {
-    setBottlenecks: (state, bottlenecks) => {
-      state.bottlenecks = bottlenecks;
-    }
-  },
-  actions: {
-    loadBottlenecks({ commit }) {
-      var bottleneckFeatureCollectionRequest = new WFS().writeGetFeature({
-        srsName: "EPSG:4326",
-        featureNS: "gemma",
-        featurePrefix: "gemma",
-        featureTypes: ["bottleneck_overview"],
-        outputFormat: "application/json"
-      });
-
-      HTTP.post(
-        "/internal/wfs",
-        new XMLSerializer().serializeToString(
-          bottleneckFeatureCollectionRequest
-        ),
-        {
-          headers: {
-            "X-Gemma-Auth": localStorage.getItem("token"),
-            "Content-type": "text/xml; charset=UTF-8"
-          }
-        }
-      ).then(response => {
-        commit("setBottlenecks", response.data.features);
-      });
-    }
-  }
-};
-
-export default Bottlenecks;
--- a/client/src/fairway/store.js	Tue Oct 30 13:37:04 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,130 +0,0 @@
-/*
- * 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 <markuks.kottlaender@intevation.de>
- */
-import Vue from "vue";
-import { HTTP } from "../application/lib/http";
-import { prepareProfile } from "../application/lib/geo";
-import LineString from "ol/geom/LineString.js";
-import { generateFeatureRequest } from "../application/lib/geo.js";
-
-const DEMOLEVEL = 149.345;
-
-const FairwayProfile = {
-  namespaced: true,
-  state: {
-    additionalSurvey: "",
-    availableSurveys: null,
-    totalLength: 0,
-    minAlt: 0,
-    maxAlt: 0,
-    currentProfile: {},
-    waterLevels: [{ year: "2016", level: DEMOLEVEL, color: "#005DFF" }],
-    selectedWaterLevel: DEMOLEVEL,
-    fairwayCoordinates: [],
-    startPoint: null,
-    endPoint: null,
-    selectedMorph: null
-  },
-  getters: {
-    length: state => {
-      return state.totalLength;
-    },
-    additionalSurvey: state => {
-      return state.additionalSurvey;
-    }
-  },
-  mutations: {
-    setAdditionalSurvey: (state, additionalSurvey) => {
-      state.additionalSurvey = additionalSurvey;
-    },
-    setSelectedMorph: (state, selectedMorph) => {
-      state.selectedMorph = selectedMorph;
-    },
-    setAvailableSurveys: (state, surveys) => {
-      state.availableSurveys = surveys;
-    },
-    setSelectedWaterLevel: (state, level) => {
-      state.selectedWaterLevel = level;
-    },
-    profileLoaded: (state, answer) => {
-      const { response, surveyDate } = answer;
-      const { data } = response;
-      const coordinates = data.geometry.coordinates;
-      if (!coordinates) return;
-      const startPoint = state.startPoint;
-      const endPoint = state.endPoint;
-      const geoJSON = data;
-      const result = prepareProfile({ geoJSON, startPoint, endPoint });
-      // Use Vue.set() to make new object properties rective
-      // https://vuejs.org/v2/guide/reactivity.html#Change-Detection-Caveats
-      Vue.set(state.currentProfile, surveyDate, result.points);
-      if (!state.minAlt || state.minAlt > result.minAlt) {
-        state.minAlt = result.minAlt;
-      }
-      if (!state.maxAlt || state.maxAlt < result.maxAlt) {
-        state.maxAlt = result.maxAlt;
-      }
-      if (!state.totalLength || state.totalLength < result.lengthPolyLine) {
-        state.totalLength = result.lengthPolyLine;
-      }
-    },
-    setStartPoint: (state, start) => {
-      state.startPoint = start;
-    },
-    setEndPoint: (state, end) => {
-      state.endPoint = end;
-    },
-    setFairwayCoordinates: (state, coordinates) => {
-      state.fairwayCoordinates = coordinates;
-    },
-    clearCurrentProfile: state => {
-      state.additionalSurvey = "";
-      state.currentProfile = {};
-      state.minAlt = null;
-      state.maxAlt = null;
-      state.totalLength = null;
-      state.fairwayCoordinates = [];
-      state.startPoint = null;
-      state.endPoint = null;
-    }
-  },
-  actions: {
-    loadProfile({ commit, state }, date_info) {
-      return new Promise((resolve, reject) => {
-        const profileLine = new LineString([state.startPoint, state.endPoint]);
-        const geoJSON = generateFeatureRequest(
-          profileLine,
-          state.selectedMorph.bottleneck_id,
-          date_info
-        );
-        HTTP.post("/cross", geoJSON, {
-          headers: { "X-Gemma-Auth": localStorage.getItem("token") }
-        })
-          .then(response => {
-            commit("profileLoaded", {
-              response: response,
-              surveyDate: date_info
-            });
-            resolve(response);
-          })
-          .catch(error => {
-            reject(error);
-          });
-      });
-    }
-  }
-};
-
-export default FairwayProfile;
--- a/client/src/identify/store.js	Tue Oct 30 13:37:04 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-/*
- * 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>
- */
-
-// note that some identified features may not have an id
-// especially related to drawing in our own vector layer
-
-const IndentifyStore = {
-  namespaced: true,
-  state: {
-    identifiedFeatures: [],
-    currentMeasurement: null
-  },
-  getters: {
-    identifiedFeatures: state => {
-      return state.identifiedFeatures;
-    },
-    currentMeasurement: state => {
-      return state.currentMeasurement;
-    }
-  },
-  mutations: {
-    setIdentifiedFeatures: (state, identifiedFeatures) => {
-      state.identifiedFeatures = identifiedFeatures;
-    },
-    setCurrentMeasurement: (state, measurement) => {
-      state.currentMeasurement = measurement;
-    }
-  }
-};
-
-export default IndentifyStore;
--- a/client/src/map/store.js	Tue Oct 30 13:37:04 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-/*
- * 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>
- */
-
-//import { HTTP } from "../lib/http";
-
-import { layers } from "../layers/layers";
-
-const MapStore = {
-  namespaced: true,
-  state: {
-    openLayersMap: null,
-    layers: layers
-  },
-  getters: {
-    layers: state => {
-      return state.layers;
-    },
-    getLayerByName: state => name => {
-      return state.layers.find(layer => layer.name === name);
-    }
-  },
-  mutations: {
-    toggleVisibility: (state, layer) => {
-      state.layers[layer].isVisible = !state.layers[layer].isVisible;
-      state.layers[layer].data.setVisible(state.layers[layer].isVisible);
-    },
-    setOpenLayersMap: (state, map) => {
-      state.openLayersMap = map;
-    }
-  }
-};
-
-export default MapStore;
--- a/client/src/store.js	Tue Oct 30 13:37:04 2018 +0100
+++ b/client/src/store.js	Tue Oct 30 16:55:29 2018 +0100
@@ -16,13 +16,13 @@
 
 import Vue from "vue";
 import Vuex from "vuex";
-import Application from "./application/stores/application";
-import user from "./application/stores/user";
-import usermanagement from "./usermanagement/store";
-import mapstore from "./map/store";
-import FairwayProfile from "./fairway/store";
-import IdentifyStore from "./identify/store";
-import Bottlenecks from "./bottlenecks/store";
+import Application from "./store/application";
+import user from "./store/user";
+import usermanagement from "./store/usermanagement";
+import mapstore from "./store/map";
+import FairwayProfile from "./store/fairway";
+import IdentifyStore from "./store/identify";
+import Bottlenecks from "./store/bottlenecks";
 
 Vue.use(Vuex);
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/src/store/application.js	Tue Oct 30 16:55:29 2018 +0100
@@ -0,0 +1,132 @@
+/* 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>
+ *   Bernhard E. Reiter <bernhard.reiter@intevation.de>
+ */
+
+import { version } from "../../package.json";
+
+const defaultCollapseState = true;
+
+const initializeSplitScreen = () => {
+  return {
+    active: false,
+    mode: "v"
+  };
+};
+
+const Application = {
+  namespaced: true,
+  state: {
+    appTitle: process.env.VUE_APP_TITLE,
+    secondaryLogo: process.env.VUE_APP_SECONDARY_LOGO_URL,
+    sidebar: {
+      iscollapsed: defaultCollapseState
+    },
+    bottlenecksCollapsed: true,
+    splitsceen: initializeSplitScreen(),
+    usermenu: {
+      iscollapsed: defaultCollapseState
+    },
+    countries: ["AT", "SK", "HU", "HR", "RS", "BiH", "BG", "RO", "UA"],
+    // there are three states of drawMode: null, "LineString", "Polygon"
+    drawMode: null,
+    version
+  },
+  getters: {
+    countries: state => {
+      return state.countries;
+    },
+    sidebarCollapsed: state => {
+      return state.sidebar.iscollapsed;
+    },
+    isUsermenuCollapsed: state => {
+      return state.usermenu.iscollapsed;
+    },
+    appTitle: state => {
+      return state.appTitle;
+    },
+    secondaryLogo: state => {
+      return state.secondaryLogo;
+    },
+    isSplitscreen: state => {
+      return state.splitsceen.active;
+    },
+    splitMode: state => {
+      return state.splitsceen.mode;
+    },
+    versionStr: state => {
+      // version number from package.json
+      let versionStr = "v" + state.version;
+
+      // hg revision
+      if (
+        process.env.VUE_APP_HGREV &&
+        (state.version.includes("dev") ||
+          state.version.includes("beta") ||
+          state.version.includes("alpha"))
+      )
+        versionStr += " " + process.env.VUE_APP_HGREV;
+
+      return versionStr;
+    }
+  },
+  mutations: {
+    toggleSidebar: state => {
+      state.sidebar.iscollapsed = !state.sidebar.iscollapsed;
+    },
+    toggleBottlenecks: state => {
+      state.bottlenecksCollapsed = !state.bottlenecksCollapsed;
+    },
+    toggleUserMenu: state => {
+      state.usermenu.iscollapsed = !state.usermenu.iscollapsed;
+    },
+    toggleSplitScreen: state => {
+      state.splitsceen.active = !state.splitsceen.active;
+    },
+    openSplitScreen: state => {
+      state.splitsceen.active = true;
+    },
+    closeSplitScreen: state => {
+      state.splitsceen.active = false;
+    },
+    resetSidebar: state => {
+      state.sidebar.iscollapsed = defaultCollapseState;
+    },
+    collapseSidebar: state => {
+      state.sidebar.iscollapsed = true;
+    },
+    resetUserMenu: state => {
+      state.usermenu.iscollapsed = defaultCollapseState;
+    },
+    collapseUserMenu: state => {
+      state.usermenu.iscollapsed = true;
+    },
+    resetSplitScreen: state => {
+      state.splitsceen = initializeSplitScreen();
+    },
+    toggleDrawModeLine: state => {
+      if (state.drawMode) {
+        state.drawMode = null;
+      } else {
+        state.drawMode = "LineString";
+      }
+    },
+    activateDrawModePolygon: state => {
+      state.drawMode = "Polygon";
+    }
+  },
+  actions: {}
+};
+
+export default Application;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/src/store/bottlenecks.js	Tue Oct 30 16:55:29 2018 +0100
@@ -0,0 +1,56 @@
+/*
+ * 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):
+ * Markus Kottländer <markuks.kottlaender@intevation.de>
+ */
+import { HTTP } from "../application/lib/http";
+import { WFS } from "ol/format.js";
+
+const Bottlenecks = {
+  namespaced: true,
+  state: {
+    bottlenecks: []
+  },
+  mutations: {
+    setBottlenecks: (state, bottlenecks) => {
+      state.bottlenecks = bottlenecks;
+    }
+  },
+  actions: {
+    loadBottlenecks({ commit }) {
+      var bottleneckFeatureCollectionRequest = new WFS().writeGetFeature({
+        srsName: "EPSG:4326",
+        featureNS: "gemma",
+        featurePrefix: "gemma",
+        featureTypes: ["bottleneck_overview"],
+        outputFormat: "application/json"
+      });
+
+      HTTP.post(
+        "/internal/wfs",
+        new XMLSerializer().serializeToString(
+          bottleneckFeatureCollectionRequest
+        ),
+        {
+          headers: {
+            "X-Gemma-Auth": localStorage.getItem("token"),
+            "Content-type": "text/xml; charset=UTF-8"
+          }
+        }
+      ).then(response => {
+        commit("setBottlenecks", response.data.features);
+      });
+    }
+  }
+};
+
+export default Bottlenecks;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/src/store/fairway.js	Tue Oct 30 16:55:29 2018 +0100
@@ -0,0 +1,130 @@
+/*
+ * 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 <markuks.kottlaender@intevation.de>
+ */
+import Vue from "vue";
+import { HTTP } from "../application/lib/http";
+import { prepareProfile } from "../application/lib/geo";
+import LineString from "ol/geom/LineString.js";
+import { generateFeatureRequest } from "../application/lib/geo.js";
+
+const DEMOLEVEL = 149.345;
+
+const FairwayProfile = {
+  namespaced: true,
+  state: {
+    additionalSurvey: "",
+    availableSurveys: null,
+    totalLength: 0,
+    minAlt: 0,
+    maxAlt: 0,
+    currentProfile: {},
+    waterLevels: [{ year: "2016", level: DEMOLEVEL, color: "#005DFF" }],
+    selectedWaterLevel: DEMOLEVEL,
+    fairwayCoordinates: [],
+    startPoint: null,
+    endPoint: null,
+    selectedMorph: null
+  },
+  getters: {
+    length: state => {
+      return state.totalLength;
+    },
+    additionalSurvey: state => {
+      return state.additionalSurvey;
+    }
+  },
+  mutations: {
+    setAdditionalSurvey: (state, additionalSurvey) => {
+      state.additionalSurvey = additionalSurvey;
+    },
+    setSelectedMorph: (state, selectedMorph) => {
+      state.selectedMorph = selectedMorph;
+    },
+    setAvailableSurveys: (state, surveys) => {
+      state.availableSurveys = surveys;
+    },
+    setSelectedWaterLevel: (state, level) => {
+      state.selectedWaterLevel = level;
+    },
+    profileLoaded: (state, answer) => {
+      const { response, surveyDate } = answer;
+      const { data } = response;
+      const coordinates = data.geometry.coordinates;
+      if (!coordinates) return;
+      const startPoint = state.startPoint;
+      const endPoint = state.endPoint;
+      const geoJSON = data;
+      const result = prepareProfile({ geoJSON, startPoint, endPoint });
+      // Use Vue.set() to make new object properties rective
+      // https://vuejs.org/v2/guide/reactivity.html#Change-Detection-Caveats
+      Vue.set(state.currentProfile, surveyDate, result.points);
+      if (!state.minAlt || state.minAlt > result.minAlt) {
+        state.minAlt = result.minAlt;
+      }
+      if (!state.maxAlt || state.maxAlt < result.maxAlt) {
+        state.maxAlt = result.maxAlt;
+      }
+      if (!state.totalLength || state.totalLength < result.lengthPolyLine) {
+        state.totalLength = result.lengthPolyLine;
+      }
+    },
+    setStartPoint: (state, start) => {
+      state.startPoint = start;
+    },
+    setEndPoint: (state, end) => {
+      state.endPoint = end;
+    },
+    setFairwayCoordinates: (state, coordinates) => {
+      state.fairwayCoordinates = coordinates;
+    },
+    clearCurrentProfile: state => {
+      state.additionalSurvey = "";
+      state.currentProfile = {};
+      state.minAlt = null;
+      state.maxAlt = null;
+      state.totalLength = null;
+      state.fairwayCoordinates = [];
+      state.startPoint = null;
+      state.endPoint = null;
+    }
+  },
+  actions: {
+    loadProfile({ commit, state }, date_info) {
+      return new Promise((resolve, reject) => {
+        const profileLine = new LineString([state.startPoint, state.endPoint]);
+        const geoJSON = generateFeatureRequest(
+          profileLine,
+          state.selectedMorph.bottleneck_id,
+          date_info
+        );
+        HTTP.post("/cross", geoJSON, {
+          headers: { "X-Gemma-Auth": localStorage.getItem("token") }
+        })
+          .then(response => {
+            commit("profileLoaded", {
+              response: response,
+              surveyDate: date_info
+            });
+            resolve(response);
+          })
+          .catch(error => {
+            reject(error);
+          });
+      });
+    }
+  }
+};
+
+export default FairwayProfile;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/src/store/identify.js	Tue Oct 30 16:55:29 2018 +0100
@@ -0,0 +1,43 @@
+/*
+ * 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>
+ */
+
+// note that some identified features may not have an id
+// especially related to drawing in our own vector layer
+
+const IndentifyStore = {
+  namespaced: true,
+  state: {
+    identifiedFeatures: [],
+    currentMeasurement: null
+  },
+  getters: {
+    identifiedFeatures: state => {
+      return state.identifiedFeatures;
+    },
+    currentMeasurement: state => {
+      return state.currentMeasurement;
+    }
+  },
+  mutations: {
+    setIdentifiedFeatures: (state, identifiedFeatures) => {
+      state.identifiedFeatures = identifiedFeatures;
+    },
+    setCurrentMeasurement: (state, measurement) => {
+      state.currentMeasurement = measurement;
+    }
+  }
+};
+
+export default IndentifyStore;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/src/store/map.js	Tue Oct 30 16:55:29 2018 +0100
@@ -0,0 +1,45 @@
+/*
+ * 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>
+ */
+
+//import { HTTP } from "../lib/http";
+
+import { layers } from "../layers/layers";
+
+const MapStore = {
+  namespaced: true,
+  state: {
+    openLayersMap: null,
+    layers: layers
+  },
+  getters: {
+    layers: state => {
+      return state.layers;
+    },
+    getLayerByName: state => name => {
+      return state.layers.find(layer => layer.name === name);
+    }
+  },
+  mutations: {
+    toggleVisibility: (state, layer) => {
+      state.layers[layer].isVisible = !state.layers[layer].isVisible;
+      state.layers[layer].data.setVisible(state.layers[layer].isVisible);
+    },
+    setOpenLayersMap: (state, map) => {
+      state.openLayersMap = map;
+    }
+  }
+};
+
+export default MapStore;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/src/store/user.js	Tue Oct 30 16:55:29 2018 +0100
@@ -0,0 +1,96 @@
+/*
+ * 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>
+ */
+
+import { HTTP } from "../application/lib/http";
+
+const User = {
+  namespaced: true,
+  state: {
+    authenticated: false,
+    expires: null,
+    roles: [],
+    user: ""
+  },
+  getters: {
+    isAuthenticated: state => {
+      return state.authenticated;
+    },
+    userinfo: state => {
+      return state.user;
+    },
+    roles: state => {
+      return state.roles;
+    },
+    expires: state => {
+      return state.expires;
+    },
+    isWaterwayAdmin: state => {
+      return state.roles.includes("waterway_admin");
+    },
+    isSysAdmin: state => {
+      return state.roles.includes("sys_admin");
+    }
+  },
+  mutations: {
+    auth_success: (state, data) => {
+      const { token, user, expires, roles } = data;
+      localStorage.setItem("expires", expires);
+      localStorage.setItem("roles", roles);
+      localStorage.setItem("token", token);
+      localStorage.setItem("user", user);
+      state.expires = expires;
+      state.roles = roles;
+      state.user = user;
+      state.authenticated = true;
+    },
+    clear_auth: state => {
+      state.authenticated = false;
+      state.expires = null;
+      state.roles = [];
+      state.user = "";
+      localStorage.clear();
+    },
+    set_user: (state, name) => {
+      state.user = name;
+    },
+    set_roles: (state, roles) => {
+      state.roles = roles;
+    },
+    set_expires: (state, expires) => {
+      state.expires = expires;
+    },
+    set_authenticate: state => {
+      state.authenticated = true;
+    }
+  },
+  actions: {
+    login({ commit }, user) {
+      // using POST is a bit more secure than GET
+      return new Promise((resolve, reject) => {
+        HTTP.post("/login", user)
+          .then(response => {
+            commit("auth_success", response.data);
+            resolve(response);
+          })
+          .catch(error => {
+            commit("clear_auth");
+            reject(error);
+          });
+      });
+    }
+  }
+};
+
+export default User;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/src/store/usermanagement.js	Tue Oct 30 16:55:29 2018 +0100
@@ -0,0 +1,149 @@
+/*
+ * 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>
+ */
+
+import { HTTP } from "../application/lib/http";
+
+const newUser = () => {
+  return {
+    user: "",
+    email: "",
+    country: null,
+    role: null,
+    isNew: true,
+    password: "",
+    roleLabel: ""
+  };
+};
+
+const UserManagement = {
+  namespaced: true,
+  state: {
+    users: null,
+    currentUser: null,
+    userDetailsVisible: false
+  },
+  getters: {
+    isUserDetailsVisible: state => {
+      return state.userDetailsVisible;
+    },
+    currentUser: state => {
+      return state.currentUser;
+    },
+    users: state => {
+      return state.users;
+    },
+    getUserByName: state => name => {
+      return state.users.find(user => {
+        return user.user === name;
+      });
+    }
+  },
+  mutations: {
+    setUserDetailsInvisible: state => {
+      state.userDetailsVisible = false;
+    },
+    setUserDetailsVisible: state => {
+      state.userDetailsVisible = true;
+    },
+    usersLoaded: (state, data) => {
+      const resolveLabel = x => {
+        const labels = {
+          waterway_user: "Waterway User",
+          waterway_admin: "Waterway Administrator",
+          sys_admin: "System Admininistrator"
+        };
+        return labels[x];
+      };
+      let users = data.users.map(u => {
+        u["roleLabel"] = resolveLabel(u["role"]);
+        return u;
+      });
+      state.users = users;
+    },
+    setCurrentUser: (state, data) => {
+      state.currentUser = data;
+      state.userDetailsVisible = true;
+    },
+    clearCurrentUser: state => {
+      state.currentUser = newUser();
+    }
+  },
+  actions: {
+    deleteUser({ commit }, data) {
+      const { name } = data;
+      return new Promise((resolve, reject) => {
+        HTTP.delete("/users/" + name, {
+          headers: { "X-Gemma-Auth": localStorage.getItem("token") }
+        })
+          .then(response => {
+            commit("clearCurrentUser");
+            commit("setUserDetailsInvisible");
+            resolve(response);
+          })
+          .catch(error => {
+            reject(error);
+          });
+      });
+    },
+    saveCurrentUser({ commit }, data) {
+      const { path, user } = data;
+      if (user.isNew) {
+        return new Promise((resolve, reject) => {
+          HTTP.post("/users", user, {
+            headers: { "X-Gemma-Auth": localStorage.getItem("token") }
+          })
+            .then(response => {
+              commit("setUserDetailsInvisible");
+              commit("clearCurrentUser");
+              resolve(response);
+            })
+            .catch(error => {
+              reject(error);
+            });
+        });
+      } else {
+        return new Promise((resolve, reject) => {
+          HTTP.put("/users/" + path, user, {
+            headers: { "X-Gemma-Auth": localStorage.getItem("token") }
+          })
+            .then(response => {
+              commit("setUserDetailsInvisible");
+              commit("clearCurrentUser");
+              resolve(response);
+            })
+            .catch(error => {
+              reject(error);
+            });
+        });
+      }
+    },
+    loadUsers({ commit }) {
+      return new Promise((resolve, reject) => {
+        HTTP.get("/users", {
+          headers: { "X-Gemma-Auth": localStorage.getItem("token") }
+        })
+          .then(response => {
+            commit("usersLoaded", response.data);
+            resolve(response);
+          })
+          .catch(error => {
+            reject(error);
+          });
+      });
+    }
+  }
+};
+
+export default UserManagement;
--- a/client/src/usermanagement/store.js	Tue Oct 30 13:37:04 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,149 +0,0 @@
-/*
- * 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>
- */
-
-import { HTTP } from "../application/lib/http";
-
-const newUser = () => {
-  return {
-    user: "",
-    email: "",
-    country: null,
-    role: null,
-    isNew: true,
-    password: "",
-    roleLabel: ""
-  };
-};
-
-const UserManagement = {
-  namespaced: true,
-  state: {
-    users: null,
-    currentUser: null,
-    userDetailsVisible: false
-  },
-  getters: {
-    isUserDetailsVisible: state => {
-      return state.userDetailsVisible;
-    },
-    currentUser: state => {
-      return state.currentUser;
-    },
-    users: state => {
-      return state.users;
-    },
-    getUserByName: state => name => {
-      return state.users.find(user => {
-        return user.user === name;
-      });
-    }
-  },
-  mutations: {
-    setUserDetailsInvisible: state => {
-      state.userDetailsVisible = false;
-    },
-    setUserDetailsVisible: state => {
-      state.userDetailsVisible = true;
-    },
-    usersLoaded: (state, data) => {
-      const resolveLabel = x => {
-        const labels = {
-          waterway_user: "Waterway User",
-          waterway_admin: "Waterway Administrator",
-          sys_admin: "System Admininistrator"
-        };
-        return labels[x];
-      };
-      let users = data.users.map(u => {
-        u["roleLabel"] = resolveLabel(u["role"]);
-        return u;
-      });
-      state.users = users;
-    },
-    setCurrentUser: (state, data) => {
-      state.currentUser = data;
-      state.userDetailsVisible = true;
-    },
-    clearCurrentUser: state => {
-      state.currentUser = newUser();
-    }
-  },
-  actions: {
-    deleteUser({ commit }, data) {
-      const { name } = data;
-      return new Promise((resolve, reject) => {
-        HTTP.delete("/users/" + name, {
-          headers: { "X-Gemma-Auth": localStorage.getItem("token") }
-        })
-          .then(response => {
-            commit("clearCurrentUser");
-            commit("setUserDetailsInvisible");
-            resolve(response);
-          })
-          .catch(error => {
-            reject(error);
-          });
-      });
-    },
-    saveCurrentUser({ commit }, data) {
-      const { path, user } = data;
-      if (user.isNew) {
-        return new Promise((resolve, reject) => {
-          HTTP.post("/users", user, {
-            headers: { "X-Gemma-Auth": localStorage.getItem("token") }
-          })
-            .then(response => {
-              commit("setUserDetailsInvisible");
-              commit("clearCurrentUser");
-              resolve(response);
-            })
-            .catch(error => {
-              reject(error);
-            });
-        });
-      } else {
-        return new Promise((resolve, reject) => {
-          HTTP.put("/users/" + path, user, {
-            headers: { "X-Gemma-Auth": localStorage.getItem("token") }
-          })
-            .then(response => {
-              commit("setUserDetailsInvisible");
-              commit("clearCurrentUser");
-              resolve(response);
-            })
-            .catch(error => {
-              reject(error);
-            });
-        });
-      }
-    },
-    loadUsers({ commit }) {
-      return new Promise((resolve, reject) => {
-        HTTP.get("/users", {
-          headers: { "X-Gemma-Auth": localStorage.getItem("token") }
-        })
-          .then(response => {
-            commit("usersLoaded", response.data);
-            resolve(response);
-          })
-          .catch(error => {
-            reject(error);
-          });
-      });
-    }
-  }
-};
-
-export default UserManagement;