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