diff --git a/app/app/components/document/document-view.js b/app/app/components/document/document-view.js index 59a528d8..15466ae7 100644 --- a/app/app/components/document/document-view.js +++ b/app/app/components/document/document-view.js @@ -78,6 +78,10 @@ export default Ember.Component.extend(NotifierMixin, TooltipMixin, { this.attrs.onCopyPage(pageId, documentId); }, + onMovePage(pageId, documentId) { + this.attrs.onMovePage(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 cd2898a1..4eee7354 100644 --- a/app/app/components/document/page-heading.js +++ b/app/app/components/document/page-heading.js @@ -39,13 +39,13 @@ export default Ember.Component.extend(TooltipMixin, { let id = this.get('page.id'); return `delete-page-button-${id}`; }), - saveAsTarget: computed('page', function () { + publishButtonId: computed('page', function () { let id = this.get('page.id'); - return `saveas-page-button-${id}`; + return `publish-button-${id}`; }), - saveAsDialogId: computed('page', function () { + publishDialogId: computed('page', function () { let id = this.get('page.id'); - return `save-as-dialog-${id}`; + return `publish-dialog-${id}`; }), blockTitleId: computed('page', function () { let id = this.get('page.id'); @@ -63,6 +63,14 @@ export default Ember.Component.extend(TooltipMixin, { let id = this.get('page.id'); return `copy-dialog-${id}`; }), + moveButtonId: computed('page', function () { + let id = this.get('page.id'); + return `move-page-button-${id}`; + }), + moveDialogId: computed('page', function () { + let id = this.get('page.id'); + return `move-dialog-${id}`; + }), didRender() { if (this.get('isEditor')) { @@ -82,7 +90,13 @@ export default Ember.Component.extend(TooltipMixin, { actions: { onMenuOpen() { - if ($('#' + this.get('saveAsDialogId')).is( ":visible" )) { + if ($('#' + this.get('publishDialogId')).is( ":visible" )) { + return; + } + if ($('#' + this.get('copyDialogId')).is( ":visible" )) { + return; + } + if ($('#' + this.get('moveDialogId')).is( ":visible" )) { return; } @@ -137,9 +151,9 @@ export default Ember.Component.extend(TooltipMixin, { }); }, - // Copy action + // Copy/move actions onCopyDialogOpen() { - // Fetch document targets once. + // Fetch document targets once. if (this.get('documentList').length > 0) { return; } @@ -156,13 +170,34 @@ export default Ember.Component.extend(TooltipMixin, { }, onCopyPage(page) { + // can't proceed if no data + if (this.get('documentList'.length) === 0) { + return; + } + let targetDocumentId = this.get('document.id'); if (is.not.null(this.get('selectedDocument'))) { - targetDocumentId = this.get('selectedDocument.id') + targetDocumentId = this.get('selectedDocument.id'); } this.attrs.onCopyPage(page.get('id'), targetDocumentId); return true; - } + }, + + onMovePage(page) { + // can't proceed if no data + if (this.get('documentListOthers.length') === 0) { + return; + } + + if (is.null(this.get('selectedDocument'))) { + this.set('selectedDocument', this.get('documentListOthers')[0]); + } + + let targetDocumentId = this.get('selectedDocument.id'); + + this.attrs.onMovePage(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 4c6fd658..b8fbbb14 100644 --- a/app/app/pods/document/index/controller.js +++ b/app/app/pods/document/index/controller.js @@ -94,7 +94,7 @@ 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.get('documentService').copyPage(documentId, pageId, targetDocumentId).then(() => { this.showNotification("Copied"); // refresh data if copied to same document @@ -104,6 +104,16 @@ export default Ember.Controller.extend(NotifierMixin, { }); }, + onMovePage(pageId, targetDocumentId) { + let documentId = this.get('model.document.id'); + + this.get('documentService').copyPage(documentId, pageId, targetDocumentId).then(() => { + this.showNotification("Moved"); + + this.send('onPageDeleted', { id: pageId, children: false }); + }); + }, + 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 09c8b792..70063ee5 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') onCopyPage=(action 'onCopyPage') onDeletePage=(action 'onPageDeleted')}} + gotoPage=(action 'gotoPage') onAddBlock=(action 'onAddBlock') onCopyPage=(action 'onCopyPage') onMovePage=(action 'onMovePage') onDeletePage=(action 'onPageDeleted')}} diff --git a/app/app/services/document.js b/app/app/services/document.js index 98f0abb8..7d1d1130 100644 --- a/app/app/services/document.js +++ b/app/app/services/document.js @@ -325,6 +325,16 @@ export default Ember.Service.extend({ let data = this.get('store').normalize('page', response); return this.get('store').push(data); }); + }, + + // Move existing page to different document. + movePage(documentId, pageId, targetDocumentId) { + return this.get('ajax').request(`documents/${documentId}/pages/${pageId}/move/${targetDocumentId}`, { + method: 'POST' + }).then((response) => { + let data = this.get('store').normalize('page', response); + return this.get('store').push(data); + }); } }); diff --git a/app/app/styles/view/document/content.scss b/app/app/styles/view/document/content.scss index d2c23b9e..47756abd 100644 --- a/app/app/styles/view/document/content.scss +++ b/app/app/styles/view/document/content.scss @@ -41,12 +41,13 @@ > .is-a-page { .page-title { > .page-toolbar { - opacity: 0.5; + // opacity: 0.5; + opacity: 0; @extend .transition-all; - &:hover { - opacity: 1; - } + // &:hover { + // opacity: 1; + // } } &:hover { diff --git a/app/app/templates/components/document/document-view.hbs b/app/app/templates/components/document/document-view.hbs index 79721305..6b5f7b4f 100644 --- a/app/app/templates/components/document/document-view.hbs +++ b/app/app/templates/components/document/document-view.hbs @@ -18,7 +18,7 @@
{{document/page-heading tagName=page.tagName document=document folder=folder page=page isEditor=isEditor - onAddBlock=(action 'onAddBlock') onCopyPage=(action 'onCopyPage') onDeletePage=(action 'onDeletePage')}} + onAddBlock=(action 'onAddBlock') onCopyPage=(action 'onCopyPage') onMovePage=(action 'onMovePage') onDeletePage=(action 'onDeletePage')}} {{section/base-renderer page=page}}
diff --git a/app/app/templates/components/document/page-heading.hbs b/app/app/templates/components/document/page-heading.hbs index b7563c40..95258f8b 100644 --- a/app/app/templates/components/document/page-heading.hbs +++ b/app/app/templates/components/document/page-heading.hbs @@ -15,8 +15,8 @@ {{#dropdown-menu target=menuTarget position="bottom right" open="click" onOpenCallback=(action 'onMenuOpen') onCloseCallback=(action 'onMenuOpen')}} @@ -30,7 +30,7 @@

{{/dropdown-dialog}} - {{#dropdown-dialog id=saveAsDialogId target=saveAsTarget position="bottom right" button="Publish" color="flat-green" focusOn=blockTitleId onAction=(action 'onAddBlock' page)}} + {{#dropdown-dialog id=publishDialogId target=publishButtonId position="bottom right" button="Publish" color="flat-green" focusOn=blockTitleId onAction=(action 'onAddBlock' page)}}
{{folder.name}}: Content Block @@ -58,6 +58,18 @@
Select where the content should be copied to
{{ui-select content=documentList action=(action 'onTargetChange') optionValuePath="id" optionLabelPath="name" selection=document}}
+ {{/dropdown-dialog}} + {{#dropdown-dialog id=moveDialogId target=moveButtonId position="bottom right" button="Move" color="flat-green" onOpenCallback=(action 'onCopyDialogOpen') onAction=(action 'onMovePage' page)}} +
+
+ move: {{page.title}} +
+
+
+ +
Select where the content should be moved to
+ {{ui-select content=documentListOthers action=(action 'onTargetChange') optionValuePath="id" optionLabelPath="name"}} +
{{/dropdown-dialog}} {{/if}} {{/if}} diff --git a/core/api/request/page.go b/core/api/request/page.go index 8b35725b..8cb7c6fd 100644 --- a/core/api/request/page.go +++ b/core/api/request/page.go @@ -496,3 +496,17 @@ func (p *Persister) DeletePageRevisions(pageID string) (rows int64, err error) { return } + +// GetNextPageSequence returns the next sequence numbner to use for a page in given document. +func (p *Persister) GetNextPageSequence(documentID string) (maxSeq float64, err error) { + row := Db.QueryRow("SELECT max(sequence) FROM page WHERE orgid=? AND documentid=? AND pagetype='section'", p.Context.OrgID, documentID) + + err = row.Scan(&maxSeq) + if err != nil { + maxSeq = 2048 + } + + maxSeq = maxSeq * 2 + + return +}