changeset 1147:c84dbc608b85

merge
author Markus Kottlaender <markus@intevation.de>
date Tue, 13 Nov 2018 11:12:54 +0100
parents 74e180ad3d6b (diff) 2d34715dd52e (current diff)
children 67c45d2d1aad
files client/src/App.vue
diffstat 8 files changed, 138 insertions(+), 201 deletions(-) [+]
line wrap: on
line diff
--- a/client/src/App.vue	Mon Nov 12 17:41:41 2018 +0100
+++ b/client/src/App.vue	Tue Nov 13 11:12:54 2018 +0100
@@ -13,7 +13,6 @@
                 <div class="rightcontainer"></div>
             </div>
             <div class="bottomcontainer d-flex flex-row align-items-end">
-                <Userbar></Userbar>
                 <Morphtool v-if="routeName == 'mainview'"></Morphtool>
                 <Pdftool v-if="routeName == 'mainview'"></Pdftool>
                 <Drawtool v-if="routeName == 'mainview'"></Drawtool>
@@ -103,7 +102,6 @@
     Sidebar: () => import("./application/Sidebar"),
     Bottlenecks: () => import("./bottlenecks/Bottlenecks"),
     Topbar: () => import("./application/Topbar"),
-    Userbar: () => import("./application/Userbar"),
     Drawtool: () => import("./drawtool/Drawtool"),
     Morphtool: () => import("./morphtool/Morphtool"),
     Pdftool: () => import("./pdftool/Pdftool"),
--- a/client/src/application/Main.vue	Mon Nov 12 17:41:41 2018 +0100
+++ b/client/src/application/Main.vue	Tue Nov 13 11:12:54 2018 +0100
@@ -1,27 +1,18 @@
 <template>
     <div class="main d-flex flex-column">
         <Maplayer :split="showSplitscreen" :lat="6155376" :long="1819178" :zoom="11"></Maplayer>
-        <div v-if="showSplitscreen" class="profile d-flex flex-row">
-            <FairwayProfile
-                :additionalSurveys="additionalSurveys"
-                :height="height"
-                :width="width"
-                :xScale="xAxis"
-                :yScaleLeft="yAxisLeft"
-                :yScaleRight="yAxisRight"
-                :margin="margins"
-            ></FairwayProfile>
-        </div>
+        <FairwayProfile
+            :additionalSurveys="additionalSurveys"
+            :height="height"
+            :width="width"
+            :xScale="xAxis"
+            :yScaleLeft="yAxisLeft"
+            :yScaleRight="yAxisRight"
+            :margin="margins"
+        ></FairwayProfile>
     </div>
 </template>
 
-<style lang="scss" scoped>
-.profile {
-  background-color: white;
-  height: 50vh;
-}
-</style>
-
 <script>
 /*
  * This is Free Software under GNU Affero General Public License v >= 3.0
@@ -122,12 +113,13 @@
       console.log("test: ", evt);
     },
     scaleFairwayProfile() {
-      if (!document.querySelector(".profile")) return;
-      const clientHeight = document.querySelector(".profile").clientHeight;
-      const clientWidth = document.querySelector(".profile").clientWidth;
+      if (!document.querySelector(".fairwayprofile")) return;
+      const clientHeight = document.querySelector(".fairwayprofile")
+        .clientHeight;
+      const clientWidth = document.querySelector(".fairwayprofile").clientWidth;
       if (!clientHeight || !clientWidth) return;
-      this.height = document.querySelector(".profile").clientHeight - 25;
-      this.width = document.querySelector(".profile").clientWidth - 220;
+      this.height = clientHeight;
+      this.width = clientWidth;
     }
   }
 };
--- a/client/src/application/Sidebar.vue	Mon Nov 12 17:41:41 2018 +0100
+++ b/client/src/application/Sidebar.vue	Tue Nov 13 11:12:54 2018 +0100
@@ -30,6 +30,10 @@
                         <i class="fa fa-book align-self-center navicon"></i>Systeminformation
                     </router-link>
                 </div>
+                <hr>
+                <a href="#" @click="logoff" class="text-body d-flex flex-row nav-link">
+                    <i class="fa fa-power-off align-self-center navicon"></i> Logout {{ user }}
+                </a>
             </div>
         </div>
     </div>
@@ -58,6 +62,7 @@
   props: ["routeName"],
   computed: {
     ...mapGetters("user", ["isSysAdmin"]),
+    ...mapState("user", ["user"]),
     ...mapState("application", ["showSidebar", "showBottlenecks"]),
     menuStyle() {
       return {
@@ -77,6 +82,15 @@
         "d-print-none": true
       };
     }
+  },
+  methods: {
+    logoff() {
+      this.$store.commit("user/clearAuth");
+      this.$store.commit("application/showSidebar", false);
+      this.$store.commit("application/showUsermenu", false);
+      this.$store.commit("application/showSplitscreen", false);
+      this.$router.push("/login");
+    }
   }
 };
 </script>
--- a/client/src/application/Topbar.vue	Mon Nov 12 17:41:41 2018 +0100
+++ b/client/src/application/Topbar.vue	Tue Nov 13 11:12:54 2018 +0100
@@ -18,9 +18,6 @@
                 </ul>
             </div>
         </div>
-        <div v-if="routeName == 'mainview' && Object.keys(currentProfile).length" class="splitbutton">
-            <i @click="$store.commit('application/showSplitscreen', !showSplitscreen)" class="ui-element splitscreen fa fa-window-restore shadow"></i>
-        </div>
         <div class="">
             <Layers v-if="routeName == 'mainview'"></Layers>
         </div>
--- a/client/src/application/Userbar.vue	Mon Nov 12 17:41:41 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,94 +0,0 @@
-<template>
-    <div>
-        <img @click="$store.commit('application/showUsermenu', !showUsermenu)" class="ui-element userpic shadow" src="../application/assets/user.png">
-        <div :class="userManagementStyle">
-            <span v-if="showUsermenu" class="username align-self-center">{{ user }}</span>
-            <span v-if="showUsermenu" class="logout align-self-center" @click="logoff">
-                <i class="fa fa-power-off"></i>
-            </span>
-        </div>
-    </div>
-</template>
-
-<style lang="scss" scoped>
-.userpic {
-  background: white;
-  position: absolute;
-  bottom: $offset;
-  left: $offset;
-  height: $icon-width;
-  width: $icon-height;
-  border-radius: $border-radius;
-}
-
-.username {
-  margin-left: 40px;
-}
-
-.usermanagement {
-  background: white;
-  margin-left: $offset;
-  padding: $offset;
-  border-radius: $border-radius;
-  margin-bottom: $offset;
-  height: $icon-height;
-}
-
-.usermanagementcollapsed {
-  transition: 0.3s;
-  width: $icon-width;
-}
-
-.usermanagementexpanded {
-  width: $sidebar-width;
-}
-</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>
- */
-import { mapState } from "vuex";
-export default {
-  name: "user",
-  data() {
-    return {};
-  },
-  methods: {
-    logoff() {
-      this.$store.commit("user/clearAuth");
-      this.$store.commit("application/showSidebar", false);
-      this.$store.commit("application/showUsermenu", false);
-      this.$store.commit("application/showSplitscreen", false);
-      this.$router.push("/login");
-    }
-  },
-  computed: {
-    ...mapState("user", ["user"]),
-    ...mapState("application", ["showUsermenu"]),
-    userManagementStyle() {
-      return {
-        "ui-element": true,
-        "d-flex": true,
-        "flex-row": true,
-        "justify-content-around": true,
-        usermanagement: true,
-        usermanagementcollapsed: !this.showUsermenu,
-        usermanagementexpanded: this.showUsermenu,
-        shadow: true
-      };
-    }
-  }
-};
-</script>
--- a/client/src/fairway/Fairwayprofile.vue	Mon Nov 12 17:41:41 2018 +0100
+++ b/client/src/fairway/Fairwayprofile.vue	Tue Nov 13 11:12:54 2018 +0100
@@ -1,66 +1,98 @@
 <template>
-    <div class="profiledisplay d-flex flex-row">
-        <div class="fairwayprofile"></div>
-        <div class="additionalsurveys d-flex flex-column">
-            <small class="label">Available Additional Surveys</small>
-            <select v-model="additionalSurvey">
-                <option value="">None</option>
-                <option
-                    v-for="survey in additionalSurveys"
-                    :key="survey.date_info"
-                    :value="survey"
-                >{{survey.date_info}}</option>
-            </select>
-            <small class="mt-2">
-                <b>Start:</b>
-                <br>
-                Lat: {{ startPoint[1] }}
-                <br>
-                Lon: {{ startPoint[0] }}
-                <br>
-                <b>End:</b>
-                <br>
-                Lat: {{ endPoint[1] }}
-                <br>
-                Lon: {{ endPoint[0] }}
-                <br>
-            </small>
+    <div :class="['position-relative', {show: showSplitscreen}]" v-if="Object.keys(currentProfile).length">
+        <button
+            class="rounded bg-white border-0 position-absolute splitscreen-toggle shadow"
+            @click="$store.commit('application/showSplitscreen', false)"
+            v-if="showSplitscreen">
+            <i class="fa fa-angle-down"></i>
+        </button>
+        <button
+            class="rounded bg-white border-0 position-absolute clear-selection shadow"
+            @click="$store.dispatch('fairwayprofile/clearSelection');"
+            v-if="showSplitscreen">
+            <i class="fa fa-times text-danger"></i>
+        </button>
+        <div class="profile d-flex flex-column">
+            <h5 class="mb-0 mt-2">{{ selectedBottleneck }} ({{ selectedSurvey.date_info }})</h5>
+            <div class="d-flex flex-fill">
+                <div class="fairwayprofile flex-fill"></div>
+                <div class="additionalsurveys d-flex flex-column">
+                    <small class="label">Available Additional Surveys</small>
+                    <select v-model="additionalSurvey">
+                        <option value="">None</option>
+                        <option
+                            v-for="survey in additionalSurveys"
+                            :key="survey.date_info"
+                            :value="survey"
+                        >{{survey.date_info}}</option>
+                    </select>
+                    <small class="mt-2">
+                        <b>Start:</b>
+                        <br>
+                        Lat: {{ startPoint[1] }}
+                        <br>
+                        Lon: {{ startPoint[0] }}
+                        <br>
+                        <b>End:</b>
+                        <br>
+                        Lat: {{ endPoint[1] }}
+                        <br>
+                        Lon: {{ endPoint[0] }}
+                        <br>
+                    </small>
+                </div>
+            </div>
         </div>
     </div>
 </template>
 
-<style scoped lang="scss">
-.label {
-  margin-bottom: $small-offset;
-}
-.waterlevelselection {
-  margin-top: $large-offset;
-  margin-right: $large-offset;
-}
+<style lang="sass" scoped>
+.profile
+  background-color: white
+  width: 100vw
+  height: 0
+  overflow: hidden
+  position: relative
+  z-index: 2
+
+.splitscreen-toggle,
+.clear-selection
+  top: -$icon-height
+  right: $icon-width + $offset + $offset
+  width: $icon-width
+  height: $icon-height
+  margin-top: 2px
+  z-index: 1
+  outline: none
+
+.clear-selection
+  right: $offset
 
-.additionalsurveys {
-  width: 300px;
-  margin-top: $large-offset;
-  margin-bottom: auto;
-  margin-right: $large-offset;
-  margin-left: auto;
-}
+.show
+  .profile
+    height: 50vh
 
-.additionalsurveys input {
-  margin-right: $small-offset;
-}
+.label
+  margin-bottom: $small-offset
+
+.waterlevelselection
+  margin-top: $large-offset
+  margin-right: $large-offset
 
-.profiledisplay {
-  width: 100vw;
-}
+.additionalsurveys
+  width: 200px
+  margin-top: $large-offset
+  margin-bottom: auto
+  margin-right: $large-offset
+  margin-left: auto
 
-.fairwayprofile {
-  background-color: white;
-  margin-left: auto;
-  margin-right: $offset;
-  margin-top: auto;
-  margin-bottom: auto;
-}
+.additionalsurveys input
+  margin-right: $small-offset
+
+.fairwayprofile
+  background-color: white
+  margin: $offset
+  margin-top: 0
 </style>
 
 <script>
@@ -96,6 +128,7 @@
     "additionalSurveys"
   ],
   computed: {
+    ...mapState("application", ["showSplitscreen"]),
     ...mapState("fairwayprofile", [
       "startPoint",
       "endPoint",
@@ -107,7 +140,7 @@
       "waterLevels",
       "selectedWaterLevel"
     ]),
-    ...mapState("bottlenecks", ["selectedSurvey"]),
+    ...mapState("bottlenecks", ["selectedBottleneck", "selectedSurvey"]),
     additionalSurvey: {
       get() {
         return this.$store.getters["fairwayprofile/additionalSurvey"];
@@ -146,6 +179,9 @@
     };
   },
   watch: {
+    showSplitscreen() {
+      this.drawDiagram();
+    },
     currentData() {
       this.drawDiagram();
     },
--- a/client/src/morphtool/Morphtool.vue	Mon Nov 12 17:41:41 2018 +0100
+++ b/client/src/morphtool/Morphtool.vue	Tue Nov 13 11:12:54 2018 +0100
@@ -5,7 +5,7 @@
                 <h4>{{ selectedBottleneck }}</h4>
                 <hr>
                 <div
-                    @click="clearSelection"
+                    @click="$store.dispatch('fairwayprofile/clearSelection');"
                     class="float-left ui-element d-flex morphtoolminus"
                 >
                     <i class="fa fa-close morphtoolsminus"></i>
@@ -22,14 +22,14 @@
                 </li>
             </ul>
         </div>
-        <div v-if="selectedSurvey" @click="clearSelection" class="ui-element shadow morphtool">
+        <div v-if="selectedSurvey && !showSplitscreen" class="ui-element shadow morphtool">
             <div class="d-flex flex-row justify-content-between">
-                <i class="fa fa-close text-danger"></i>
-                <small>Bottleneck:&nbsp;</small>
-                <h6>
+                <h6 class="my-auto px-2">
                     {{ selectedBottleneck }}
-                    <small>( {{ selectedSurvey.date_info }} )</small>
+                    ({{ selectedSurvey.date_info }})
                 </h6>
+                <i class="fa fa-angle-up py-2 px-2 border-left" @click="$store.commit('application/showSplitscreen', true)" v-if="Object.keys(currentProfile).length"></i>
+                <i class="fa fa-close text-danger py-2 px-2 border-left" @click="$store.dispatch('fairwayprofile/clearSelection');"></i>
             </div>
         </div>
     </div>
@@ -43,7 +43,6 @@
 .morphcontainer {
   margin-bottom: $offset;
   margin-left: auto;
-  margin-right: $large-offset + $icon-width;
   border-radius: $border-radius;
 }
 .surveylist {
@@ -63,19 +62,13 @@
 .morphtool {
   position: relative;
   background-color: white;
-  padding: $small-offset;
   border-radius: $border-radius;
   height: $icon-width;
-  margin-right: $offset;
   margin-top: auto;
   margin-bottom: auto;
   z-index: 2;
 }
 
-.morphcontainer i {
-  margin-right: $small-offset;
-}
-
 .morphtoolminus {
   position: absolute;
   top: 0;
@@ -111,22 +104,13 @@
   computed: {
     ...mapGetters("map", ["getLayerByName"]),
     ...mapState("map", ["openLayersMap", "cutTool"]),
+    ...mapState("application", ["showSplitscreen"]),
+    ...mapState("fairwayprofile", ["currentProfile"]),
     ...mapState("bottlenecks", [
       "selectedBottleneck",
       "surveys",
       "selectedSurvey"
     ])
-  },
-  methods: {
-    clearSelection() {
-      this.$store.dispatch("bottlenecks/setSelectedBottleneck", null);
-      this.$store.commit("application/showSplitscreen", false);
-      this.$store.commit("map/cutMode", false);
-      this.getLayerByName("Cut Tool")
-        .data.getSource()
-        .clear();
-      this.openLayersMap.removeInteraction(this.cutTool);
-    }
   }
 };
 </script>
--- a/client/src/store/fairway.js	Mon Nov 12 17:41:41 2018 +0100
+++ b/client/src/store/fairway.js	Tue Nov 13 11:12:54 2018 +0100
@@ -93,6 +93,16 @@
     }
   },
   actions: {
+    clearSelection({ commit, dispatch, rootGetters, rootState }) {
+      dispatch("bottlenecks/setSelectedBottleneck", null, { root: true });
+      commit("clearCurrentProfile");
+      commit("application/showSplitscreen", false, { root: true });
+      commit("map/cutMode", false, { root: true });
+      rootGetters["map/getLayerByName"]("Cut Tool")
+        .data.getSource()
+        .clear();
+      rootState.map.openLayersMap.removeInteraction(rootState.map.cutTool);
+    },
     loadProfile({ commit, state }, survey) {
       return new Promise((resolve, reject) => {
         const profileLine = new LineString([state.startPoint, state.endPoint]);