From 227f99c84addddf54ce5a06484c509bffb7ee064 Mon Sep 17 00:00:00 2001
From: Eugen Ciur <eugen@papermerge.com>
Date: Sat, 4 Dec 2021 07:27:39 +0100
Subject: [PATCH] very cool ember based dual panel !

---
 .babelrc.json                                 |  3 +-
 app/components/commander/action_modes.hbs     |  2 +-
 app/components/commander/index.hbs            |  3 +-
 app/components/dual_link_to/index.js          | 12 ++++---
 app/components/viewer/action_modes.hbs        |  2 +-
 app/components/viewer/index.hbs               |  3 +-
 app/controllers/authenticated/document.js     | 34 ++++++++++---------
 .../authenticated/dualpanel_base.js           | 21 +++---------
 app/controllers/authenticated/nodes.js        | 32 +++++++++++++++++
 app/routes/authenticated/document.js          | 12 +++----
 app/routes/authenticated/nodes.js             | 12 +++----
 11 files changed, 82 insertions(+), 54 deletions(-)

diff --git a/.babelrc.json b/.babelrc.json
index 9d8d625..98f9058 100644
--- a/.babelrc.json
+++ b/.babelrc.json
@@ -1,3 +1,4 @@
 [
-  "@babel/plugin-proposal-private-property-in-object", { "loose": true }
+  "@babel/plugin-proposal-private-property-in-object", { "loose": true },
+  "@babel/plugin-proposal-private-methods", { "loose": true }
 ]
\ No newline at end of file
diff --git a/app/components/commander/action_modes.hbs b/app/components/commander/action_modes.hbs
index e192709..9525a7c 100644
--- a/app/components/commander/action_modes.hbs
+++ b/app/components/commander/action_modes.hbs
@@ -3,7 +3,7 @@
     @onViewModeChange={{@onViewModeChange}} />
   <div class="panel-mode">
     <button type="button" class="btn btn-light mx-1"
-      {{on "click" (fn @onPanelToggle "nodes") }}>
+      {{on "click" (fn @onPanelToggle @hint) }}>
       {{#if @dualPanelMode}}
         <i class="bi-x"></i>
       {{else}}
diff --git a/app/components/commander/index.hbs b/app/components/commander/index.hbs
index 8dddf46..b61da1d 100644
--- a/app/components/commander/index.hbs
+++ b/app/components/commander/index.hbs
@@ -11,7 +11,8 @@
     <Commander::ActionModes
       @onPanelToggle={{@onPanelToggle}}
       @dualPanelMode={{@dualPanelMode}}
-      @onViewModeChange={{this.onViewModeChange}} />
+      @onViewModeChange={{this.onViewModeChange}}
+      @hint={{@hint}} />
   </div>
 
   <Modal::NewFolder
diff --git a/app/components/dual_link_to/index.js b/app/components/dual_link_to/index.js
index 356052c..f5b1718 100644
--- a/app/components/dual_link_to/index.js
+++ b/app/components/dual_link_to/index.js
@@ -129,11 +129,13 @@ export default class DualLinkToComponent extends Component {
     if ((hint === 'left') && extranode) {
       if (extranode.get('nodeType') === 'document') {
         return {
-          'extradoc_id': extranode.get('id')
+          'extra_id': extranode.get('id'),
+          'extra_type': 'doc'
         };
       } else if (extranode.get('nodeType') === 'folder') {
         return {
-          'extranode_id': extranode.get('id')
+          'extra_id': extranode.get('id'),
+          'extra_type': 'folder'
         };
       }
     }
@@ -141,11 +143,13 @@ export default class DualLinkToComponent extends Component {
     if (hint === 'right' && node) {
       if (node.get('nodeType') === 'document') {
         return {
-          'extradoc_id': node.get('id')
+          'extra_id': node.get('id'),
+          'extra_type': 'doc'
         }
       } else if (node.get('nodeType') === 'folder' ) {
         return {
-          'extranode_id': node.get('id')
+          'extra_id': node.get('id'),
+          'extra_type': 'folder'
         }
       }
     }
diff --git a/app/components/viewer/action_modes.hbs b/app/components/viewer/action_modes.hbs
index 4a54b63..cd50f34 100644
--- a/app/components/viewer/action_modes.hbs
+++ b/app/components/viewer/action_modes.hbs
@@ -1,7 +1,7 @@
 <div class="d-flex">
   <div class="panel-mode">
     <button type="button" class="btn btn-light mx-1"
-      {{on "click" (fn @onPanelToggle "document")}}>
+      {{on "click" (fn @onPanelToggle @hint)}}>
       {{#if @dualPanelMode}}
         <i class="bi-x"></i>
       {{else}}
diff --git a/app/components/viewer/index.hbs b/app/components/viewer/index.hbs
index 48fc964..879576f 100644
--- a/app/components/viewer/index.hbs
+++ b/app/components/viewer/index.hbs
@@ -8,7 +8,8 @@
 
     <Viewer::ActionModes
       @onPanelToggle={{@onPanelToggle}}
-      @dualPanelMode={{@dualPanelMode}} />
+      @dualPanelMode={{@dualPanelMode}}
+      @hint={{@hint}} />
   </div>
 
   <Breadcrumb
diff --git a/app/controllers/authenticated/document.js b/app/controllers/authenticated/document.js
index 221d101..4a7d91e 100644
--- a/app/controllers/authenticated/document.js
+++ b/app/controllers/authenticated/document.js
@@ -5,32 +5,34 @@ import DualPanelBaseController from "./dualpanel_base";
 export default class DocumentController extends DualPanelBaseController {
 
   @action
-  async onPanelToggle(origin) {
+  async onPanelToggle(hint) {
     /*
-      origin is either "document" or "nodes" depending where
+      hint is either "left" or "right" depending where
       the onPanelToggle originated from.
     */
     let home_folder;
 
-    if (this.extranode_id) {
-      /*
-        Here we have document viewer as main panel (left) and nodes panel as
-        extra (on the right).
-      */
-      if (origin === "document") {
-        // user decided to close document panel
-        this.replaceRoute('authenticated.nodes', this.extranode_id);
-        this.extranode_id = null;
-      } else if (origin === "nodes") {
-        // User decided to close nodes extra panel.
-        // He/She decided to view only the document
-        this.extranode_id = null;
+    if (this.extra_id) {
+      if (hint === "left") {
+        // user decided to close left panel
+        if (this.extra_type === 'folder') {
+          this.replaceRoute('authenticated.nodes', this.extra_id);
+        } else {
+          this.replaceRoute('authenticated.document', this.extra_id);
+        }
+        this.extra_id = null;
+        this.extra_type = null;
+      } else if (hint === "right") {
+        console.log('Closing right panel');
+        this.extra_id = null;
+        this.extra_type = null;
       } else {
         throw `Unknown value for origin argument: ${origin}`;
       }
     } else {
       home_folder = await this.currentUser.user.home_folder;
-      this.extranode_id = home_folder.get('id');
+      this.extra_id = home_folder.get('id');
+      this.extra_type = 'folder';
     }
   }
 
diff --git a/app/controllers/authenticated/dualpanel_base.js b/app/controllers/authenticated/dualpanel_base.js
index 7aab372..3d64b94 100644
--- a/app/controllers/authenticated/dualpanel_base.js
+++ b/app/controllers/authenticated/dualpanel_base.js
@@ -1,5 +1,4 @@
 import Controller from '@ember/controller';
-import { action } from '@ember/object';
 import { tracked } from "@glimmer/tracking";
 import { inject as service } from '@ember/service';
 
@@ -8,24 +7,12 @@ export default class DualPanelBaseController extends Controller {
 
   @service currentUser;
 
-  @tracked extranode_id = null;
-  @tracked extradoc_id = null;
+  @tracked extra_id = null;
+  @tracked extra_type = null; // can be either 'doc' or 'node'
 
-  queryParams = ['extranode_id', 'extradoc_id']
-
-  @action
-  async onPanelToggle() {
-    let home_folder;
-
-    if (this.extranode_id) {
-      this.extranode_id = null;
-    } else {
-      home_folder = await this.currentUser.user.home_folder;
-      this.extranode_id = home_folder.get('id');
-    }
-  }
+  queryParams = ['extra_id', 'extra_type']
 
   get dualpanel_mode() {
-    return this.extranode_id || this.extradoc_id;
+    return this.extra_id;
   }
 }
diff --git a/app/controllers/authenticated/nodes.js b/app/controllers/authenticated/nodes.js
index 75a8302..811a7f1 100644
--- a/app/controllers/authenticated/nodes.js
+++ b/app/controllers/authenticated/nodes.js
@@ -1,6 +1,38 @@
+import { action } from '@ember/object';
 import DualPanelBaseController from "./dualpanel_base";
 
 
 export default class NodesController extends DualPanelBaseController {
 
+  @action
+  async onPanelToggle(hint) {
+    /*
+      hint is either "left" or "right" depending where
+      the onPanelToggle originated from.
+    */
+    let home_folder;
+
+    if (this.extra_id) {
+      if (hint === "left") {
+        // user decided to close left panel
+        if (this.extra_type === 'folder') {
+          this.replaceRoute('authenticated.nodes', this.extra_id);
+        } else {
+          this.replaceRoute('authenticated.document', this.extra_id);
+        }
+        this.extra_id = null;
+        this.extra_type = null;
+      } else if (hint === "right") {
+        this.extra_id = null;
+        this.extra_type = null;
+      } else {
+        throw `Unknown value for origin argument: ${origin}`;
+      }
+    } else {
+      home_folder = await this.currentUser.user.home_folder;
+      this.extra_id = home_folder.get('id');
+      this.extra_type = 'folder';
+    }
+  }
+
 }
diff --git a/app/routes/authenticated/document.js b/app/routes/authenticated/document.js
index 5701156..d164077 100644
--- a/app/routes/authenticated/document.js
+++ b/app/routes/authenticated/document.js
@@ -8,10 +8,10 @@ export default class DocumentRoute extends Route {
   @service store;
 
   queryParams = {
-    extranode_id: {
+    extra_id: {
       refreshModel: true
     },
-    extradoc_id: {
+    extra_type: {
       refreshModel: true
     }
   };
@@ -39,10 +39,10 @@ export default class DocumentRoute extends Route {
 
     pages_with_url = await page_adapter.loadImages(last_version.pages, 'image/svg+xml');
 
-    if (params.extradoc_id) {
+    if (params.extra_id && params.extra_type === 'doc') {
       extra_doc  = await this.store.findRecord(
         'document',
-        params.extradoc_id,
+        params.extra_id,
         { reload: true }
       );
       extra_last_version = extra_doc.last_version
@@ -64,11 +64,11 @@ export default class DocumentRoute extends Route {
       };
     }
 
-    if (params.extranode_id) {
+    if (params.extra_id && params.extra_type === 'folder') {
 
       extranode = await getPanelInfo({
         store: this.store,
-        node_id: params.extranode_id,
+        node_id: params.extra_id,
         page: 1
       });
 
diff --git a/app/routes/authenticated/nodes.js b/app/routes/authenticated/nodes.js
index 268ace6..6643227 100644
--- a/app/routes/authenticated/nodes.js
+++ b/app/routes/authenticated/nodes.js
@@ -10,10 +10,10 @@ export default class FolderRoute extends Route {
   @service currentUser;
 
   queryParams = {
-    extranode_id: {
+    extra_id: {
       refreshModel: true
     },
-    extradoc_id: {
+    extra_type: {
       refreshModel: true
     },
     page: {
@@ -43,8 +43,8 @@ export default class FolderRoute extends Route {
     });
 
 
-    if (params.extradoc_id) {
-      document_version  = await doc_adapter.getDocumentVersion(params.extradoc_id);
+    if (params.extra_id && params.extra_type === 'doc') {
+      document_version  = await doc_adapter.getDocumentVersion(params.extra_id);
       pages = await document_version.pages;
       pages_with_url = await page_adapter.loadBinaryImages(pages);
       this.dualpanel_mode = true;
@@ -57,10 +57,10 @@ export default class FolderRoute extends Route {
       });
     }
 
-    if (params.extranode_id) {
+    if (params.extra_id && params.extra_type === 'folder') {
       context['extranode'] = await getPanelInfo({
         store: this.store,
-        node_id: params.extranode_id,
+        node_id: params.extra_id,
         page: 1
       });
       this.dualpanel_mode = true;
-- 
GitLab