# HG changeset patch # User Markus Kottlaender # Date 1541063995 -3600 # Node ID b0aec3b1e426298e7bb4989bb9268e4a8a4f1f80 # Parent 874d19f32015ff6cd9d087d0ff9a8e69e41a8214# Parent aa1f5daf6fc9e7e352aaedc1004908a8e723b3b2 merge diff -r 874d19f32015 -r b0aec3b1e426 client/src/application/Main.vue --- a/client/src/application/Main.vue Thu Nov 01 10:19:28 2018 +0100 +++ b/client/src/application/Main.vue Thu Nov 01 10:19:55 2018 +0100 @@ -43,8 +43,6 @@ import { mapGetters, mapState } from "vuex"; import debounce from "debounce"; -const DELTA = 0.2; - export default { name: "mainview", components: { @@ -90,6 +88,7 @@ return [this.yScaleLeft.lo, hi]; }, yAxisRight() { + const DELTA = this.maxAlt * 1.1 - this.maxAlt; return [this.maxAlt * 1 + DELTA, -DELTA]; }, margins() { diff -r 874d19f32015 -r b0aec3b1e426 client/src/application/stores/application.js --- a/client/src/application/stores/application.js Thu Nov 01 10:19:28 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 - * Markus Kottländer - * Bernhard E. Reiter - */ - -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; diff -r 874d19f32015 -r b0aec3b1e426 client/src/application/stores/user.js --- a/client/src/application/stores/user.js Thu Nov 01 10:19:28 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 - */ - -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; diff -r 874d19f32015 -r b0aec3b1e426 client/src/bottlenecks/store.js --- a/client/src/bottlenecks/store.js Thu Nov 01 10:19:28 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 - */ -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; diff -r 874d19f32015 -r b0aec3b1e426 client/src/fairway/store.js --- a/client/src/fairway/store.js Thu Nov 01 10:19:28 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 - * Markus Kottländer - */ -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; diff -r 874d19f32015 -r b0aec3b1e426 client/src/identify/store.js --- a/client/src/identify/store.js Thu Nov 01 10:19:28 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 - */ - -// 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; diff -r 874d19f32015 -r b0aec3b1e426 client/src/map/store.js --- a/client/src/map/store.js Thu Nov 01 10:19:28 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 - */ - -//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; diff -r 874d19f32015 -r b0aec3b1e426 client/src/store.js --- a/client/src/store.js Thu Nov 01 10:19:28 2018 +0100 +++ b/client/src/store.js Thu Nov 01 10:19:55 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); diff -r 874d19f32015 -r b0aec3b1e426 client/src/store/application.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/src/store/application.js Thu Nov 01 10:19:55 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 + * Markus Kottländer + * Bernhard E. Reiter + */ + +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; diff -r 874d19f32015 -r b0aec3b1e426 client/src/store/bottlenecks.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/src/store/bottlenecks.js Thu Nov 01 10:19:55 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 + */ +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; diff -r 874d19f32015 -r b0aec3b1e426 client/src/store/fairway.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/src/store/fairway.js Thu Nov 01 10:19:55 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 + * Markus Kottländer + */ +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; diff -r 874d19f32015 -r b0aec3b1e426 client/src/store/identify.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/src/store/identify.js Thu Nov 01 10:19:55 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 + */ + +// 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; diff -r 874d19f32015 -r b0aec3b1e426 client/src/store/map.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/src/store/map.js Thu Nov 01 10:19:55 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 + */ + +//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; diff -r 874d19f32015 -r b0aec3b1e426 client/src/store/user.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/src/store/user.js Thu Nov 01 10:19:55 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 + */ + +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; diff -r 874d19f32015 -r b0aec3b1e426 client/src/store/usermanagement.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/src/store/usermanagement.js Thu Nov 01 10:19:55 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 + */ + +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; diff -r 874d19f32015 -r b0aec3b1e426 client/src/usermanagement/store.js --- a/client/src/usermanagement/store.js Thu Nov 01 10:19:28 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 - */ - -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;