diff --git a/app/app/components/document/document-view.js b/app/app/components/document/document-view.js index a0656c7b..59a528d8 100644 --- a/app/app/components/document/document-view.js +++ b/app/app/components/document/document-view.js @@ -74,6 +74,10 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { this.attrs.onAddBlock(block); }, + onCopyPage(pageId, documentId) { + this.attrs.onCopyPage(pageId, documentId); + }, + onDeletePage(id, deleteChildren) { let page = this.get('pages').findBy("id", id); diff --git a/app/app/components/document/page-heading.js b/app/app/components/document/page-heading.js index 8e1ee5ce..cd2898a1 100644 --- a/app/app/components/document/page-heading.js +++ b/app/app/components/document/page-heading.js @@ -23,6 +23,9 @@ export default Ember.Component.extend(TooltipMixin, { menuOpen: false, blockTitle: "", blockExcerpt: "", + documentList: [], //includes the current document + documentListOthers: [], //excludes the current document + selectedDocument: null, checkId: computed('page', function () { let id = this.get('page.id'); @@ -52,6 +55,14 @@ export default Ember.Component.extend(TooltipMixin, { let id = this.get('page.id'); return `block-excerpt-${id}`; }), + copyButtonId: computed('page', function () { + let id = this.get('page.id'); + return `copy-page-button-${id}`; + }), + copyDialogId: computed('page', function () { + let id = this.get('page.id'); + return `copy-dialog-${id}`; + }), didRender() { if (this.get('isEditor')) { @@ -125,5 +136,33 @@ export default Ember.Component.extend(TooltipMixin, { return true; }); }, + + // Copy action + onCopyDialogOpen() { + // Fetch document targets once. + if (this.get('documentList').length > 0) { + return; + } + + this.get('documentService').getPageMoveCopyTargets().then((d) => { + let me = this.get('document'); + this.set('documentList', d); + this.set('documentListOthers', d.filter((item) => item.get('id') !== me.get('id'))); + }); + }, + + onTargetChange(d) { + this.set('selectedDocument', d); + }, + + onCopyPage(page) { + let targetDocumentId = this.get('document.id'); + if (is.not.null(this.get('selectedDocument'))) { + targetDocumentId = this.get('selectedDocument.id') + } + + this.attrs.onCopyPage(page.get('id'), targetDocumentId); + return true; + } } }); diff --git a/app/app/pods/document/index/controller.js b/app/app/pods/document/index/controller.js index 716531d9..4c6fd658 100644 --- a/app/app/pods/document/index/controller.js +++ b/app/app/pods/document/index/controller.js @@ -92,6 +92,18 @@ export default Ember.Controller.extend(NotifierMixin, { }); }, + onCopyPage(pageId, targetDocumentId) { + let documentId = this.get('model.document.id'); + this.get('documentService').copyPage(documentId, pageId, targetDocumentId).then((page) => { + this.showNotification("Copied"); + + // refresh data if copied to same document + if (documentId === targetDocumentId) { + this.get('target.router').refresh(); + } + }); + }, + onPageDeleted(deletePage) { let documentId = this.get('model.document.id'); let pages = this.get('model.pages'); diff --git a/app/app/pods/document/index/template.hbs b/app/app/pods/document/index/template.hbs index 28a9a265..09c8b792 100644 --- a/app/app/pods/document/index/template.hbs +++ b/app/app/pods/document/index/template.hbs @@ -1,2 +1,2 @@ {{document/document-view document=model.document links=model.links allPages=model.allPages tabs=model.tabs pages=model.pages folder=model.folder folders=model.folders isEditor=model.isEditor - gotoPage=(action 'gotoPage') onAddBlock=(action 'onAddBlock') onDeletePage=(action 'onPageDeleted')}} + gotoPage=(action 'gotoPage') onAddBlock=(action 'onAddBlock') onCopyPage=(action 'onCopyPage') onDeletePage=(action 'onPageDeleted')}} diff --git a/app/app/services/document.js b/app/app/services/document.js index 53499202..98f0abb8 100644 --- a/app/app/services/document.js +++ b/app/app/services/document.js @@ -292,10 +292,39 @@ export default Ember.Service.extend({ // nuke an attachment deleteAttachment(documentId, attachmentId) { - return this.get('ajax').request(`documents/${documentId}/attachments/${attachmentId}`, { method: 'DELETE' }); + }, + + //************************************************** + // Page Move Copy + //************************************************** + + // Return list of documents that can accept a page. + getPageMoveCopyTargets() { + return this.get('ajax').request(`sections/targets`, { + method: 'GET' + }).then((response) => { + let data = []; + + data = response.map((obj) => { + let data = this.get('store').normalize('document', obj); + return this.get('store').push(data); + }); + + return data; + }); + }, + + // Copy existing page to same or different document. + copyPage(documentId, pageId, targetDocumentId) { + return this.get('ajax').request(`documents/${documentId}/pages/${pageId}/copy/${targetDocumentId}`, { + method: 'POST' + }).then((response) => { + let data = this.get('store').normalize('page', response); + return this.get('store').push(data); + }); } }); diff --git a/app/app/templates/components/document/document-view.hbs b/app/app/templates/components/document/document-view.hbs index 51e70a2b..79721305 100644 --- a/app/app/templates/components/document/document-view.hbs +++ b/app/app/templates/components/document/document-view.hbs @@ -17,7 +17,8 @@ {{#each pages key="id" as |page index|}}