1
0
Fork 0
mirror of https://github.com/documize/community.git synced 2025-08-05 05:25:27 +02:00

implemented copy page facility

This commit is contained in:
Harvey Kandola 2017-01-22 14:12:10 -08:00
parent fc9127e165
commit 07ee2248d4
11 changed files with 269 additions and 18 deletions

View file

@ -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);

View file

@ -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;
}
}
});

View file

@ -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');

View file

@ -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')}}

View file

@ -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);
});
}
});

View file

@ -17,7 +17,8 @@
{{#each pages key="id" as |page index|}}
<div class="wysiwyg">
<div id="page-{{ page.id }}" class="is-a-page" data-id="{{ page.id }}" data-type="{{ page.contentType }}">
{{document/page-heading tagName=page.tagName document=document folder=folder page=page isEditor=isEditor onAddBlock=(action 'onAddBlock') onDeletePage=(action 'onDeletePage')}}
{{document/page-heading tagName=page.tagName document=document folder=folder page=page isEditor=isEditor
onAddBlock=(action 'onAddBlock') onCopyPage=(action 'onCopyPage') onDeletePage=(action 'onDeletePage')}}
{{section/base-renderer page=page}}
</div>
</div>

View file

@ -14,7 +14,7 @@
{{#dropdown-menu target=menuTarget position="bottom right" open="click" onOpenCallback=(action 'onMenuOpen') onCloseCallback=(action 'onMenuOpen')}}
<ul class="menu">
<li class="item">Duplicate</li>
<li class="item" id={{copyButtonId}}>Copy</li>
<li class="item">Move</li>
<li class="item" id="saveas-page-button-{{page.id}}">Publish</li>
<li class="divider"></li>
@ -23,14 +23,14 @@
{{/dropdown-menu}}
{{#if menuOpen}}
{{#dropdown-dialog target=deleteButtonId position="top right" button="Delete" color="flat-red" onAction=(action 'deletePage' page.id)}}
{{#dropdown-dialog target=deleteButtonId position="bottom right" button="Delete" color="flat-red" onAction=(action 'deletePage' page.id)}}
<p>Are you sure you want to delete <span class="bold">{{page.title}}?</span></p>
<p>
{{input type="checkbox" id=checkId class="margin-left-20" checked=deleteChildren}}
<label for="{{checkId}}">&nbsp;Delete child pages</label>
</p>
{{/dropdown-dialog}}
{{#dropdown-dialog id=saveAsDialogId target=saveAsTarget position="top right" button="Publish" color="flat-green" focusOn=blockTitleId onAction=(action 'onAddBlock' page)}}
{{#dropdown-dialog id=saveAsDialogId target=saveAsTarget position="bottom right" button="Publish" color="flat-green" focusOn=blockTitleId onAction=(action 'onAddBlock' page)}}
<div class="form-header">
<div class="tip">
<span class="bold">{{folder.name}}:</span> Content Block
@ -46,6 +46,18 @@
<div class="tip">Short description to help others understand<br/>the reusable content block</div>
{{textarea rows="3" value=blockExcerpt id=blockExcerptId}}
</div>
{{/dropdown-dialog}}
{{#dropdown-dialog id=copyDialogId target=copyButtonId position="bottom right" button="Copy" color="flat-green" onOpenCallback=(action 'onCopyDialogOpen') onAction=(action 'onCopyPage' page)}}
<div class="form-header">
<div class="tip">
<span class="bold">Copy:</span> {{page.title}}
</div>
</div>
<div class="input-control">
<label>Target</label>
<div class="tip">Select where the content should be copied to</div>
{{ui-select content=documentList action=(action 'onTargetChange') optionValuePath="id" optionLabelPath="name" selection=document}}
</div>
{{/dropdown-dialog}}
{{/if}}
{{/if}}

View file

@ -21,7 +21,7 @@
</ul>
{{#if hasBlocks}}
<div class="divider"></div>
<div class="template-caption">Reusable Content</div>
<div class="template-caption">Reusable content</div>
<ul class="list">
{{#each blocks as |block|}}
<li class="item">
@ -54,7 +54,7 @@
</ul>
{{else}}
<div class="divider"></div>
<div class="template-caption">Published, reusable sections appear below</div>
<div class="template-caption">Reusable content appears below</div>
{{/if}}
</div>
</div>