From b93218d37fcc50858db2639b073c839b5a2b3746 Mon Sep 17 00:00:00 2001
From: Eugen Ciur <eugen@papermerge.com>
Date: Wed, 8 Dec 2021 20:27:42 +0100
Subject: [PATCH] add notification for nodes move

---
 app/components/commander/index.js | 38 +++++++++++++++----------------
 app/components/document/index.hbs |  1 +
 app/components/folder/index.hbs   |  4 +++-
 app/modifiers/draggable.js        |  8 +++++--
 app/services/requests.js          | 15 ++++++++++++
 app/services/ws_nodes_move.js     | 37 ++++++++++++++++++++++++++++++
 6 files changed, 80 insertions(+), 23 deletions(-)
 create mode 100644 app/services/ws_nodes_move.js

diff --git a/app/components/commander/index.js b/app/components/commander/index.js
index 0a6e35c..5611d0b 100644
--- a/app/components/commander/index.js
+++ b/app/components/commander/index.js
@@ -17,7 +17,9 @@ export default class CommanderComponent extends Component {
   */
 
   @service websockets;
+  @service ws_nodes_move;
   @service store;
+  @service requests;
 
   // show create new folder modal dialog?
   @tracked show_new_folder_modal = false;
@@ -43,6 +45,10 @@ export default class CommanderComponent extends Component {
     super(owner, args);
 
     this.websockets.addHandler(this.messageHandler, this);
+    this.ws_nodes_move.addHandler(this.wsNodesMoveHandler, this);
+  }
+
+  wsNodesMoveHandler() {
   }
 
   messageHandler(message) {
@@ -143,27 +149,19 @@ export default class CommanderComponent extends Component {
   }
 
   @action
-  onDrop(json_node_model) {
-    /**
-      Action invoked when a node (folder/document) was
-      successfully dropped from one panel into another.
-
-      `json_node_model` is dictionary with following keys:
-        - id
-        - model_name
-    */
-    let found_obj;
-
-    found_obj = this.store.peekRecord(
-      json_node_model.model_name,
-      json_node_model.id
-    );
-
-    if (found_obj) {
-      console.log(`onDrop on ${this.args.hint}: ${found_obj}`);
-      console.log(`model type = ${found_obj.nodeType}`);
-      console.log(`model id = ${found_obj.id}`);
+  onDrop(source_data) {
+    let nodes_move_data;
+
+    nodes_move_data = {
+      'nodes': [{ 'id': source_data.node.id }],
+      'source_parent': {
+        'id': source_data.source_parent.id
+      },
+      'target_parent': {
+        'id': this.args.node.id
+      }
     }
+    this.requests.nodesMove(nodes_move_data);
   }
 
   @action
diff --git a/app/components/document/index.hbs b/app/components/document/index.hbs
index a25ed6c..53ebfca 100644
--- a/app/components/document/index.hbs
+++ b/app/components/document/index.hbs
@@ -1,5 +1,6 @@
 <div class="node document {{if this.is_selected "checked"}}"
   {{draggable @model
+    sourceParent=@sourceParen
     onDragendSuccess=@onDragendSuccess
     onDragendCancel=@onDragendCancel}}>
   <Input
diff --git a/app/components/folder/index.hbs b/app/components/folder/index.hbs
index ceddd3f..c3e6f26 100644
--- a/app/components/folder/index.hbs
+++ b/app/components/folder/index.hbs
@@ -1,6 +1,8 @@
 <div class="node folder
   {{if this.is_selected "checked"}}"
-  {{draggable @model onDragendSuccess=@onDragendSuccess onDragendCancel=@onDragendCancel}}>
+  {{draggable @model
+    onDragendSuccess=@onDragendSuccess
+    onDragendCancel=@onDragendCancel}}>
   <Input
     @type="checkbox"
     @checked={{this.is_selected}}
diff --git a/app/modifiers/draggable.js b/app/modifiers/draggable.js
index 814766c..1bb683e 100644
--- a/app/modifiers/draggable.js
+++ b/app/modifiers/draggable.js
@@ -63,8 +63,12 @@ export default class DraggableModifier extends Modifier {
     this.model = this.args.positional[0];
 
     data = {
-      id: this.model.id,
-      model_name: this.model._internalModel.modelName
+      node: {
+        id: this.model.id
+      },
+      source_parent: {
+        id: this.model.parent.get('id')
+      }
     }
 
     event.dataTransfer.setData(
diff --git a/app/services/requests.js b/app/services/requests.js
index fedbb59..23dc89e 100644
--- a/app/services/requests.js
+++ b/app/services/requests.js
@@ -67,6 +67,21 @@ export default class Requests extends Service {
     });
   }
 
+  async nodesMove(data) {
+    let url, headers_copy = {};
+
+    url = `${this.base_url}nodes/move/`;
+
+    Object.assign(headers_copy, this.headers);  // create a copy of `this.headers`
+    headers_copy['Content-Type'] = 'application/json';
+
+    return fetch(url, {
+      method: 'POST',
+      headers: headers_copy,
+      body: JSON.stringify(data)
+    });
+  }
+
   get base_url() {
     return `${ENV.APP.HOST}/${ENV.APP.NAMESPACE}/`;
   }
diff --git a/app/services/ws_nodes_move.js b/app/services/ws_nodes_move.js
new file mode 100644
index 0000000..ce67783
--- /dev/null
+++ b/app/services/ws_nodes_move.js
@@ -0,0 +1,37 @@
+import ENV from 'papermerge/config/environment';
+import Service from '@ember/service';
+
+
+export default class WSNodesMove extends Service {
+
+
+  constructor(owner, args) {
+    super(owner, args);
+
+    let that = this;
+
+    this._socket = new WebSocket(`${this.base_url}nodes/move`);
+    this._handlers = [];
+
+    this._socket.onmessage = function(event) {
+      that._handlers.forEach((item) => {
+        let json_data;
+
+        try {
+          json_data = JSON.parse(event.data);
+          item.handler.apply(item.context, [json_data, event]);
+        } catch (err) {
+          console.log(`Error ${err} while parsing incoming data: ${event.data}`);
+        }
+      });
+    }
+  }
+
+  get base_url() {
+    return `${ENV.APP.WS_HOST}/${ENV.APP.WS_NAMESPACE}/`;
+  }
+
+  addHandler(handler, context) {
+    this._handlers.push({handler, context});
+  }
+}
\ No newline at end of file
-- 
GitLab