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