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