diff --git a/app/imports/api/creature/creatureFolders/CreatureFolders.js b/app/imports/api/creature/creatureFolders/CreatureFolders.js index a61140c1..3d00b3a9 100644 --- a/app/imports/api/creature/creatureFolders/CreatureFolders.js +++ b/app/imports/api/creature/creatureFolders/CreatureFolders.js @@ -5,7 +5,6 @@ let CreatureFolders = new Mongo.Collection('creatureFolders'); let creatureFolderSchema = new SimpleSchema({ name: { type: String, - defaultValue: 'Folder', trim: false, optional: true, }, diff --git a/app/imports/api/creature/creatureFolders/methods.js/index.js b/app/imports/api/creature/creatureFolders/methods.js/index.js index 687f1d97..26782576 100644 --- a/app/imports/api/creature/creatureFolders/methods.js/index.js +++ b/app/imports/api/creature/creatureFolders/methods.js/index.js @@ -1,3 +1,4 @@ import '/imports/api/creature/creatureFolders/methods.js/insertCreatureFolder.js'; import '/imports/api/creature/creatureFolders/methods.js/updateCreatureFolderName.js'; -import '/imports/api/creature/creatureFolders/methods.js/removeCreatureFolder.js'; \ No newline at end of file +import '/imports/api/creature/creatureFolders/methods.js/removeCreatureFolder.js'; +import '/imports/api/creature/creatureFolders/methods.js/moveCreatureToFolder.js'; diff --git a/app/imports/api/creature/creatureFolders/methods.js/insertCreatureFolder.js b/app/imports/api/creature/creatureFolders/methods.js/insertCreatureFolder.js index 7c5d4e15..8df44d40 100644 --- a/app/imports/api/creature/creatureFolders/methods.js/insertCreatureFolder.js +++ b/app/imports/api/creature/creatureFolders/methods.js/insertCreatureFolder.js @@ -36,6 +36,7 @@ const insertCreatureFolder = new ValidatedMethod({ } // Insert return CreatureFolders.insert({ + name: 'Folder', owner: userId, order, }); diff --git a/app/imports/api/creature/creatureFolders/methods.js/moveCreatureToFolder.js b/app/imports/api/creature/creatureFolders/methods.js/moveCreatureToFolder.js new file mode 100644 index 00000000..46f9b696 --- /dev/null +++ b/app/imports/api/creature/creatureFolders/methods.js/moveCreatureToFolder.js @@ -0,0 +1,45 @@ +import CreatureFolders from '/imports/api/creature/creatureFolders/CreatureFolders.js'; +import { ValidatedMethod } from 'meteor/mdg:validated-method'; +import { RateLimiterMixin } from 'ddp-rate-limiter-mixin'; + +const moveCreatureToFolder = new ValidatedMethod({ + name: 'creatureFolders.methods.moveCreatureToFolder', + validate: null, + mixins: [RateLimiterMixin], + rateLimit: { + numRequests: 5, + timeInterval: 5000, + }, + run({creatureId, folderId}) { + // Ensure logged in + let userId = this.userId; + if (!userId) { + throw new Meteor.Error('creatureFolders.methods.updateName.denied', + 'You need to be logged in to remove a folder'); + } + // Check that this folder is owned by the user + if (folderId){ + let existingFolder = CreatureFolders.findOne(folderId); + if (existingFolder.owner !== userId){ + throw new Meteor.Error('creatureFolders.methods.updateName.denied', + 'This folder does not belong to you'); + } + } + // Remove from other folders + CreatureFolders.update({ + owner: userId + }, { + $pull: {creatures: creatureId}, + }, { + multi: true, + }); + if (folderId){ + // Add to this folder + CreatureFolders.update(folderId, { + $addToSet: {creatures: creatureId}, + }); + } + }, +}); + +export default moveCreatureToFolder; diff --git a/app/imports/ui/creature/creatureList/CreatureList.vue b/app/imports/ui/creature/creatureList/CreatureList.vue new file mode 100644 index 00000000..eaf1476d --- /dev/null +++ b/app/imports/ui/creature/creatureList/CreatureList.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/app/imports/ui/creature/CreatureListTile.vue b/app/imports/ui/creature/creatureList/CreatureListTile.vue similarity index 84% rename from app/imports/ui/creature/CreatureListTile.vue rename to app/imports/ui/creature/creatureList/CreatureListTile.vue index ea2772c4..29c67e97 100644 --- a/app/imports/ui/creature/CreatureListTile.vue +++ b/app/imports/ui/creature/creatureList/CreatureListTile.vue @@ -21,11 +21,18 @@ {{ model.alignment }} {{ model.gender }} {{ model.race }} - + + + mdi-drag + diff --git a/app/imports/ui/pages/CharacterList.vue b/app/imports/ui/pages/CharacterList.vue index c3b595dd..53cc878d 100644 --- a/app/imports/ui/pages/CharacterList.vue +++ b/app/imports/ui/pages/CharacterList.vue @@ -4,16 +4,12 @@ style="height: 100%" > - - - + - + - - - + - - add folder - +
+ + add folder + +
{ - loadingInsertFolder = false; + this.loadingInsertFolder = false; if (!error) return; console.error(error); snackbar({ diff --git a/app/imports/ui/tabletop/SelectCreaturesDialog.vue b/app/imports/ui/tabletop/SelectCreaturesDialog.vue index 851b26a7..2a647119 100644 --- a/app/imports/ui/tabletop/SelectCreaturesDialog.vue +++ b/app/imports/ui/tabletop/SelectCreaturesDialog.vue @@ -32,7 +32,7 @@