diff --git a/app/menus/DocumentMenu.js b/app/menus/DocumentMenu.js index f2cdeb892..859a05626 100644 --- a/app/menus/DocumentMenu.js +++ b/app/menus/DocumentMenu.js @@ -36,6 +36,10 @@ class DocumentMenu extends React.Component { this.props.history.push(documentMoveUrl(this.props.document)); }; + handleDuplicate = async (ev: SyntheticEvent<*>) => { + this.props.document.duplicate(); + }; + handlePin = (ev: SyntheticEvent<*>) => { this.props.document.pin(); }; @@ -100,6 +104,9 @@ class DocumentMenu extends React.Component { > New child document + + Duplicate + Move… )} diff --git a/app/models/Document.js b/app/models/Document.js index d80ddd3d0..43369297d 100644 --- a/app/models/Document.js +++ b/app/models/Document.js @@ -270,6 +270,10 @@ class Document extends BaseModel { return false; }; + duplicate = () => { + this.emit('documents.duplicate', this); + }; + download() { const a = window.document.createElement('a'); a.textContent = 'download'; diff --git a/app/stores/DocumentsStore.js b/app/stores/DocumentsStore.js index 63452b5a2..488cc2ff8 100644 --- a/app/stores/DocumentsStore.js +++ b/app/stores/DocumentsStore.js @@ -203,6 +203,26 @@ class DocumentsStore extends BaseStore { } }; + @action + duplicate = async (document: Document): * => { + const res = await client.post('/documents.create', { + publish: true, + parentDocument: document.parentDocumentId, + collection: document.collection.id, + title: `${document.title} (duplicate)`, + text: document.text, + }); + + if (res && res.data) { + const duped = res.data; + this.emit('documents.create', duped); + this.emit('documents.publish', { + id: duped.id, + collectionId: duped.collection.id, + }); + } + }; + @action add = (document: Document): void => { this.data.set(document.id, document); @@ -235,6 +255,9 @@ class DocumentsStore extends BaseStore { this.on('documents.create', (data: Document) => { this.add(new Document(data)); }); + this.on('documents.duplicate', (data: Document) => { + this.duplicate(data); + }); // Re-fetch dashboard content so that we don't show deleted documents this.on('collections.delete', () => {