From 0b761f1a75ba6f1b5997982349cd701100a038e9 Mon Sep 17 00:00:00 2001
From: Xiao Gui <xgui3783@gmail.com>
Date: Mon, 9 Sep 2019 17:23:15 +0200
Subject: [PATCH] bugfix: fix shuffling of panels

---
 src/services/state/ngViewerState.store.ts | 78 ++++++++++++++++++-----
 1 file changed, 62 insertions(+), 16 deletions(-)

diff --git a/src/services/state/ngViewerState.store.ts b/src/services/state/ngViewerState.store.ts
index 4464aa288..7ca39242e 100644
--- a/src/services/state/ngViewerState.store.ts
+++ b/src/services/state/ngViewerState.store.ts
@@ -17,6 +17,9 @@ export interface NgViewerStateInterface{
   nehubaReady: boolean
   panelMode: string
   panelOrder: string
+
+  showSubstrate: boolean
+  showZoomlevel: boolean
 }
 
 export interface NgViewerAction extends Action{
@@ -31,7 +34,10 @@ const defaultState:NgViewerStateInterface = {
   forceShowSegment:null,
   nehubaReady: false,
   panelMode: FOUR_PANEL,
-  panelOrder: `0123`
+  panelOrder: `0123`,
+
+  showSubstrate: null,
+  showZoomlevel: null
 }
 
 export function ngViewerState(prevState:NgViewerStateInterface = defaultState, action:NgViewerAction):NgViewerStateInterface{
@@ -39,6 +45,7 @@ export function ngViewerState(prevState:NgViewerStateInterface = defaultState, a
     case ACTION_TYPES.SET_PANEL_ORDER: {
       const { payload } = action
       const { panelOrder } = payload
+
       return {
         ...prevState,
         panelOrder
@@ -119,7 +126,10 @@ export class NgViewerUseEffect implements OnDestroy{
   public toggleMaximiseMode$: Observable<any>
 
   @Effect()
-  public toggleMaximiseOrder$: Observable<any>
+  public unmaximiseOrder$: Observable<any>
+
+  @Effect()
+  public maximiseOrder$: Observable<any>
 
   @Effect()
   public toggleMaximiseCycleMessage$: Observable<any>
@@ -170,22 +180,61 @@ export class NgViewerUseEffect implements OnDestroy{
       })
     )
 
-    this.toggleMaximiseOrder$ = toggleMaxmimise$.pipe(
+    this.maximiseOrder$ = toggleMaxmimise$.pipe(
       withLatestFrom(
         combineLatest(
-          this.panelOrder$.pipe(
-            scan((acc, curr: string) => [curr, ...acc.slice(0,1)], []),
-          ),
+          this.panelOrder$,
           this.panelMode$
         )
       ),
-      map(([action, [panelOrders, panelMode]]) => {
+      filter(([_action, [_panelOrder, panelMode]]) => panelMode !== SINGLE_PANEL),
+      map(([ action, [ oldPanelOrder ] ]) => {
         const { payload } = action as NgViewerAction
         const { index = 0 } = payload
 
-        const panelOrder = panelMode === SINGLE_PANEL && !!panelOrders[1]
-          ? panelOrders[1]
-          : [...panelOrders[0].slice(index), ...panelOrders[0].slice(0, index)].join('')
+        const panelOrder = [...oldPanelOrder.slice(index), ...oldPanelOrder.slice(0, index)].join('')
+        return {
+          type: ACTION_TYPES.SET_PANEL_ORDER,
+          payload: {
+            panelOrder
+          }
+        }
+      })
+    )
+
+    this.unmaximiseOrder$ = toggleMaxmimise$.pipe(
+      withLatestFrom(
+        combineLatest(
+          this.panelOrder$,
+          this.panelMode$
+        )
+      ),
+      scan((acc, curr) => {
+        const [action, [panelOrders, panelMode]] = curr
+        return [{
+          action, 
+          panelOrders,
+          panelMode
+        }, ...acc.slice(0, 1)]
+      }, [] as any[]),
+      filter(([ { panelMode } ]) => panelMode === SINGLE_PANEL),
+      map(arr => {
+        const {
+          action,
+          panelOrders
+        } = arr[0]
+
+        const {
+          panelOrders: panelOrdersPrev = null,
+        } = arr[1] || {}
+
+        const { payload } = action as NgViewerAction
+        const { index = 0 } = payload
+
+        const panelOrder = !!panelOrdersPrev
+          ? panelOrdersPrev
+          : [...panelOrders.slice(index), ...panelOrders.slice(0, index)].join('')
+
         return {
           type: ACTION_TYPES.SET_PANEL_ORDER,
           payload: {
@@ -220,12 +269,9 @@ export class NgViewerUseEffect implements OnDestroy{
       })
     )
 
-    this.spacebarListener$ = combineLatest(
-      fromEvent(document.body, 'keydown', { capture: true }).pipe(
-        filter((ev: KeyboardEvent) => ev.key === ' ')
-      ),
-      this.panelMode$
-    ).pipe(
+    this.spacebarListener$ = fromEvent(document.body, 'keydown', { capture: true }).pipe(
+      filter((ev: KeyboardEvent) => ev.key === ' '),
+      withLatestFrom(this.panelMode$),
       filter(([_ , panelMode]) => panelMode === SINGLE_PANEL),
       mapTo({
         type: ACTION_TYPES.CYCLE_VIEWS
-- 
GitLab