From 3599b5fbc4232b775994d7f13f882e165a884640 Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 26 Jul 2017 19:23:41 +0100 Subject: [PATCH] Added basic drag-and-drop functionality between spell lists Closes #105 --- rpg-docs/Model/Character/Spells.js | 81 +++++++++++++++++++ .../client/views/character/spells/spells.html | 4 +- .../client/views/character/spells/spells.js | 23 ++++++ 3 files changed, 107 insertions(+), 1 deletion(-) diff --git a/rpg-docs/Model/Character/Spells.js b/rpg-docs/Model/Character/Spells.js index 58f21cd2..c6036ee4 100644 --- a/rpg-docs/Model/Character/Spells.js +++ b/rpg-docs/Model/Character/Spells.js @@ -83,3 +83,84 @@ Spells.after.update(function (userId, spell, fieldNames) { Spells.allow(CHARACTER_SUBSCHEMA_ALLOW); Spells.deny(CHARACTER_SUBSCHEMA_DENY); + + + + +var checkMovePermission = function(spellId, parent) { + var spell = Spells.findOne(spellId); + if (!spell) + throw new Meteor.Error("No such spell", + "An spell could not be found to move"); + //handle permissions + var permission = Meteor.call("canWriteCharacter", spell.charId); + if (!permission){ + throw new Meteor.Error("Access denied", + "Not permitted to move spells from this character"); + } + if (parent.collection === "Characters"){ + permission = Meteor.call("canWriteCharacter", parent.id); + if (!permission){ + throw new Meteor.Error("Access denied", + "Not permitted to move spells to this character"); + } + } else { + var parentCollectionObject = global[parent.collection]; + var parentObject = null; + if (parentCollectionObject) + parentObject = parentCollectionObject.findOne( + parent.id, {fields: {_id: 1, charId: 1}} + ); + if (!parentObject) throw new Meteor.Error( + "Invalid parent", + "The destination parent " + parent.id + + " does not exist in the collection " + parent.collection + ); + if (parentObject.charId){ + permission = Meteor.call("canWriteCharacter", parentObject.charId); + if (!permission){ + throw new Meteor.Error("Access denied", + "Not permitted to move spells to this character"); + } + } + } +}; + +var moveSpell = function(spellId, parentCollection, parentId) { + var spell = Spells.findOne(spellId); + if (!spell) return; + parentCollection = parentCollection || spell.parent.collection; + parentId = parentId || spell.parent.id; + + if (Meteor.isServer) { + checkMovePermission(spellId, {collection: parentCollection, id: parentId}); + } + + + if (spell.parentCollection == "Characters") { //then we are moving the spell to a different character. + + } else { //else we are moving the spell within the same character + //update the spell provided the update will actually change something + if ( + spell.parent.collection !== parentCollection || + spell.parent.id !== parentId + ){ + Spells.update( + spellId, + {$set: { + "parent.collection": parentCollection, + "parent.id": parentId, + }} + ); + } + } +}; + + +Meteor.methods({ + moveSpellToList: function(spellId, spellListId) { + check(spellId, String); + check(spellListId, String); + moveSpell(spellId, "SpellLists", spellListId); + }, +}); \ No newline at end of file diff --git a/rpg-docs/client/views/character/spells/spells.html b/rpg-docs/client/views/character/spells/spells.html index 7158c8c3..b5011f82 100644 --- a/rpg-docs/client/views/character/spells/spells.html +++ b/rpg-docs/client/views/character/spells/spells.html @@ -83,7 +83,9 @@ {{#each spells ../_id ../../_id}} {{#if showSpell ../../_id}}
-
+