diff --git a/app/imports/api/library/LibraryNodes.js b/app/imports/api/library/LibraryNodes.js index a4b23aae..b6932bb9 100644 --- a/app/imports/api/library/LibraryNodes.js +++ b/app/imports/api/library/LibraryNodes.js @@ -52,11 +52,28 @@ const insertNode = new ValidatedMethod({ name: 'LibraryNodes.methods.insert', validate: null, run(libraryNode) { + delete libraryNode._id; assertNodeEditPermission(libraryNode, this.userId); return LibraryNodes.insert(libraryNode); }, }); +const duplicateNode = new ValidatedMethod({ + name: 'LibraryNodes.methods.duplicate', + validate: new SimpleSchema({ + _id: { + type: String, + regEx: SimpleSchema.RegEx.Id, + } + }).validator(), + run({_id}) { + let libraryNode = LibraryNodes.findOne(_id); + assertNodeEditPermission(libraryNode, this.userId); + delete libraryNode._id; + return LibraryNodes.insert(libraryNode); + }, +}) + const updateLibraryNode = new ValidatedMethod({ name: 'LibraryNodes.methods.update', validate({_id, path}){ @@ -132,6 +149,7 @@ export default LibraryNodes; export { LibraryNodeSchema, insertNode, + duplicateNode, updateLibraryNode, pullFromLibraryNode, pushToLibraryNode, diff --git a/app/imports/ui/components/propertyToolbar.vue b/app/imports/ui/components/propertyToolbar.vue index 44b95de7..2172418e 100644 --- a/app/imports/ui/components/propertyToolbar.vue +++ b/app/imports/ui/components/propertyToolbar.vue @@ -39,10 +39,25 @@ + + + + Duplicate + + + + file_copy + + - - Delete delete - + + + Delete + + + + delete + diff --git a/app/imports/ui/library/LibraryNodeDialog.vue b/app/imports/ui/library/LibraryNodeDialog.vue index f72b1753..36432a28 100644 --- a/app/imports/ui/library/LibraryNodeDialog.vue +++ b/app/imports/ui/library/LibraryNodeDialog.vue @@ -5,6 +5,7 @@ :model="model" :editing="editing" :flat="flat" + @duplicate="duplicate" @remove="remove" @toggle-editing="editing = !editing" @color-changed="value => change({path: ['color'], value})" @@ -47,6 +48,7 @@