From c49e8fc5431c8de3db3a3e7fe03a9c963b682584 Mon Sep 17 00:00:00 2001
From: Eugen Ciur <eugen@papermerge.com>
Date: Tue, 15 Mar 2022 20:55:01 +0100
Subject: [PATCH] move pages to folder

---
 app/components/commander/index.hbs   |  7 +++++
 app/components/commander/index.js    | 29 ++++++++++++++++--
 app/components/modal/delete_pages.js |  1 -
 app/components/modal/move_pages.hbs  | 22 ++++++++++++++
 app/components/modal/move_pages.js   | 45 ++++++++++++++++++++++++++++
 app/services/requests.js             |  8 +++++
 6 files changed, 109 insertions(+), 3 deletions(-)
 create mode 100644 app/components/modal/move_pages.hbs
 create mode 100644 app/components/modal/move_pages.js

diff --git a/app/components/commander/index.hbs b/app/components/commander/index.hbs
index 8330202..a7208a7 100644
--- a/app/components/commander/index.hbs
+++ b/app/components/commander/index.hbs
@@ -58,6 +58,13 @@
     @onClose={{this.closeConfirmDeletionModal}}
     {{show-when this.show_confirm_deletion_modal}} />
 
+  <Modal::MovePages
+    id="move-pages"
+    @page_ids={{this.move_pages_modal_page_ids}}
+    @dst_folder={{this.move_pages_modal_dst_folder}}
+    @onSubmit={{this.onSubmitMovePages}}
+    {{show-when this.show_confirm_move_pages_modal}} />
+
   <Breadcrumb
     @node={{@node}}
     @extranode={{@extranode}}
diff --git a/app/components/commander/index.js b/app/components/commander/index.js
index bd35b4f..0287bbb 100644
--- a/app/components/commander/index.js
+++ b/app/components/commander/index.js
@@ -45,6 +45,11 @@ export default class CommanderComponent extends Component {
   @tracked deleted_records = A([]);
   @tracked __deleted_record; // used as workaround for an ember bug
 
+  // data passed to `confirm_move_pages_modal` dialog.
+  @tracked move_pages_modal_page_ids = A([]);
+  @tracked move_pages_modal_dst_folder = undefined;
+  @tracked show_confirm_move_pages_modal = false;
+
   constructor(owner, args) {
     super(owner, args);
     this.websockets.addHandler(this.messageHandler, this);
@@ -172,7 +177,8 @@ export default class CommanderComponent extends Component {
   @action
   onDrop({event, element}) {
     let data, files_list;
-    const isNodeDrop = event.dataTransfer.types.includes("application/x.node");
+    const isNodeDrop = event.dataTransfer.types.includes('application/x.node');
+    const isPageDrop = event.dataTransfer.types.includes('application/x.page');
 
     event.preventDefault();
     element.classList.remove('droparea');
@@ -185,6 +191,9 @@ export default class CommanderComponent extends Component {
           'application/x.node': JSON.parse(data)
         });
       }
+    } else if (isPageDrop) {
+      data = event.dataTransfer.getData('application/x.page');
+      this.page_drop_callback(JSON.parse(data));
     } else if (this._is_desktop_drop(event)) {
       files_list = this._get_desktop_files(event);
       this.drop_callback({
@@ -293,7 +302,24 @@ export default class CommanderComponent extends Component {
       });
 
     }
+  }
 
+  page_drop_callback(json_page_data) {
+    let dst_folder;
+
+    dst_folder = this.args.node;
+    this.move_pages_modal_page_ids = json_page_data['pages'].map(
+      page => page.id
+    );
+    this.move_pages_modal_dst_folder = dst_folder;
+    this.show_confirm_move_pages_modal = true;
+  }
+
+  @action
+  async onSubmitMovePages({dst, page_ids, single_page}) {
+    await this.requests.moveToFolder({dst, page_ids, single_page});
+    this.show_confirm_move_pages_modal = false;
+    this.router.refresh();
   }
 
   @action
@@ -317,7 +343,6 @@ export default class CommanderComponent extends Component {
       `model` is instance of `model.document` or `model.folder`
     */
     console.log(`onDragendCancel on ${this.args.hint}: id=${model.id} type=${model.nodeType}`);
-
   }
 
   @action
diff --git a/app/components/modal/delete_pages.js b/app/components/modal/delete_pages.js
index e37de21..1ab547b 100644
--- a/app/components/modal/delete_pages.js
+++ b/app/components/modal/delete_pages.js
@@ -16,7 +16,6 @@ export default class DeletePagesComponent extends BaseComponent {
   @action
   onSubmit() {
     let pages_copy = A(this.pages);
-  
     this.args.onClose(pages_copy);
   }
 
diff --git a/app/components/modal/move_pages.hbs b/app/components/modal/move_pages.hbs
new file mode 100644
index 0000000..996feae
--- /dev/null
+++ b/app/components/modal/move_pages.hbs
@@ -0,0 +1,22 @@
+<Modal::Base
+  @title="Confirm Page Move"
+  @actionTitle="Yes"
+  @onClose={{this.onCancel}}
+  @onSubmit={{this.onSubmit}}
+  @submitButtonClass="btn-success"
+  @onCancel={{this.onCancel}}
+  ...attributes>
+  <p>
+    You selected {{this.count}} page(s).
+    Do you want to move selected page(s) to folder {{this.dst_title}}?
+  </p>
+  <p>
+    <Input @checked={{this.single_page}}
+      @type="checkbox"
+      class="form-control-checkbox"
+      id="single_page" />
+    <Label
+      @for="single_page"
+      @text="Extract each page into separate document" />
+  </p>
+</Modal::Base>
diff --git a/app/components/modal/move_pages.js b/app/components/modal/move_pages.js
new file mode 100644
index 0000000..17f6a0d
--- /dev/null
+++ b/app/components/modal/move_pages.js
@@ -0,0 +1,45 @@
+import { action } from '@ember/object';
+import { inject as service } from '@ember/service';
+import { A } from '@ember/array';
+import { tracked } from '@glimmer/tracking';
+
+import BaseComponent from "./base";
+
+
+export default class MovePagesComponent extends BaseComponent {
+  @service store;
+  @service currentUser;
+  @tracked single_page = true;
+
+  get page_ids() {
+    return this.args.page_ids;
+  }
+
+  @action
+  onSubmit() {
+    this.args.onSubmit({
+      page_ids: this.page_ids,
+      dst: this.args.dst_folder,
+      single_page: this.single_page
+    });
+  }
+
+  get count() {
+    if (this.args.page_ids) {
+      return this.args.page_ids.length;
+    }
+    return 0;
+  }
+
+  get dst_title() {
+    if (this.args.dst_folder) {
+      return this.args.dst_folder.title;
+    }
+    return '';
+  }
+
+  @action
+  onCancel() {
+  }
+
+}
diff --git a/app/services/requests.js b/app/services/requests.js
index 77e6d91..57d2d71 100644
--- a/app/services/requests.js
+++ b/app/services/requests.js
@@ -68,6 +68,14 @@ export default class Requests extends Service {
     return this._post('/pages/move-to-document/', {dst, pages, position});
   }
 
+  async moveToFolder({dst, page_ids, single_page}) {
+    return this._post('/pages/move-to-folder/', {
+      dst: dst.id,
+      pages: page_ids,
+      single_page: single_page
+    });
+  }
+
   /**
   *  `document_version` contains following attributes:
   *    id
-- 
GitLab