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