diff client/src/components/Main.vue @ 3041:ccda334eed92

client: panes: improved panes rotation, works with pure css so that components don't need to be re-mounted
author Markus Kottlaender <markus@intevation.de>
date Sat, 13 Apr 2019 14:51:56 +0200
parents 5d7db2ea16c8
children 0233845cadb7
line wrap: on
line diff
--- a/client/src/components/Main.vue	Fri Apr 12 17:27:21 2019 +0200
+++ b/client/src/components/Main.vue	Sat Apr 13 14:51:56 2019 +0200
@@ -1,94 +1,32 @@
 <template>
-  <div
-    id="panes"
-    :class="[
-      'd-flex flex-wrap position-absolute',
-      { 'flex-column': ['left', 'right'].includes(paneMode) }
-    ]"
-  >
-    <template v-if="panes.length === 1">
-      <div id="pane1" class="pane d-flex wh-100">
-        <component :is="panes[0]" />
-      </div>
-    </template>
+  <div id="panes" :class="'d-flex position-absolute rotate' + paneRotate">
+    <div id="pane1" :class="'pane d-flex ' + pane1Class">
+      <component :is="panes[0]" />
+    </div>
 
     <template v-if="panes.length === 2">
-      <template v-if="paneMode === 'horizontal'">
-        <div id="pane1" class="pane d-flex w-100 h-50">
-          <component :is="panes[0]" />
-        </div>
-        <div id="pane2" class="pane d-flex w-100 h-50">
-          <component :is="panes[1]" />
-        </div>
-      </template>
-      <template v-if="paneMode === 'vertical'">
-        <div id="pane1" class="pane d-flex w-50 h-100">
-          <component :is="panes[0]" />
-        </div>
-        <div id="pane2" class="pane d-flex w-50 h-100">
-          <component :is="panes[1]" />
-        </div>
-      </template>
+      <div id="pane2" :class="'pane d-flex ' + pane2Class">
+        <component :is="panes[1]" />
+      </div>
     </template>
 
     <template v-if="panes.length === 3">
-      <template v-if="paneMode === 'top'">
-        <div id="pane1" class="pane d-flex w-100 h-50">
-          <component :is="panes[0]" />
-        </div>
-        <div id="pane3" class="pane d-flex w-50 h-50">
-          <component :is="panes[2]" />
-        </div>
-        <div id="pane2" class="pane d-flex w-50 h-50">
-          <component :is="panes[1]" />
-        </div>
-      </template>
-      <template v-if="paneMode === 'right'">
-        <div id="pane3" class="pane d-flex w-50 h-50">
-          <component :is="panes[2]" />
-        </div>
-        <div id="pane2" class="pane d-flex w-50 h-50">
-          <component :is="panes[1]" />
-        </div>
-        <div id="pane1" class="pane d-flex w-50 h-100">
-          <component :is="panes[0]" />
-        </div>
-      </template>
-      <template v-if="paneMode === 'bottom'">
-        <div id="pane2" class="pane d-flex w-50 h-50">
-          <component :is="panes[1]" />
-        </div>
-        <div id="pane3" class="pane d-flex w-50 h-50">
-          <component :is="panes[2]" />
-        </div>
-        <div id="pane1" class="pane d-flex w-100 h-50">
-          <component :is="panes[0]" />
-        </div>
-      </template>
-      <template v-if="paneMode === 'left'">
-        <div id="pane1" class="pane d-flex w-50 h-100">
-          <component :is="panes[0]" />
-        </div>
-        <div id="pane2" class="pane d-flex w-50 h-50">
-          <component :is="panes[1]" />
-        </div>
-        <div id="pane3" class="pane d-flex w-50 h-50">
-          <component :is="panes[2]" />
-        </div>
-      </template>
+      <div id="pane3" class="pane d-flex wh-50">
+        <component :is="panes[2]" />
+      </div>
+      <div id="pane2" class="pane d-flex wh-50">
+        <component :is="panes[1]" />
+      </div>
     </template>
 
     <template v-if="panes.length === 4">
-      <div id="pane1" class="pane d-flex w-50 h-50">
-        <component :is="panes[0]" />
-      </div>
-      <div id="pane2" class="pane d-flex w-50 h-50">
+      <div id="pane2" class="pane d-flex wh-50">
         <component :is="panes[1]" />
       </div>
-      <div id="pane4" class="pane d-flex w-50 h-50">
+      <div id="pane4" class="pane d-flex wh-50">
         <component :is="panes[3]" />
       </div>
-      <div id="pane3" class="pane d-flex w-50 h-50">
+      <div id="pane3" class="pane d-flex wh-50">
         <component :is="panes[2]" />
       </div>
     </template>
@@ -102,6 +40,18 @@
   bottom: -0.5px
   left: -0.5px
   z-index: 1
+  &.rotate1
+    flex-wrap: wrap
+    flex-direction: row
+  &.rotate2
+    flex-wrap: wrap-reverse
+    flex-direction: column
+  &.rotate3
+    flex-wrap: wrap-reverse
+    flex-direction: row-reverse
+  &.rotate4
+    flex-wrap: wrap
+    flex-direction: column-reverse
   .pane
     border: solid 0.5px #fff
     background: #fff
@@ -135,7 +85,27 @@
     HydrologicalConditions: () => import("./gauge/HydrologicalConditions")
   },
   computed: {
-    ...mapState("application", ["panes", "paneMode"])
+    ...mapState("application", ["panes", "paneRotate"]),
+    // pane 1 and 2 are the only ones that can have varying size
+    // thats why tehre is no pane3class or pane4class
+    pane1Class() {
+      if (this.panes.length === 1) return "wh-100";
+      if (this.panes.length === 2 || this.panes.length === 3) {
+        if (this.paneRotate === 1 || this.paneRotate === 3) return "w-100 h-50";
+        if (this.paneRotate === 2 || this.paneRotate === 4) return "w-50 h-100";
+      }
+      if (this.panes.length === 4) {
+        return "wh-50";
+      }
+    },
+    pane2Class() {
+      if (this.panes.length === 2) {
+        if (this.paneRotate === 1 || this.paneRotate === 3) return "w-100 h-50";
+        if (this.paneRotate === 2 || this.paneRotate === 4) return "w-50 h-100";
+      } else {
+        return "wh-50";
+      }
+    }
   }
 };
 </script>