From 76da2c8393a33323db237b7c6de28bb9d055a389 Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Fri, 21 Dec 2018 12:17:49 +0200 Subject: [PATCH] Added Character sheet --- app/imports/api/creature/Creatures.js | 23 +----- app/imports/api/creature/insertCreature.js | 2 +- .../api/creature/properties/Bundles.js | 2 +- .../api/creature/properties/Experiences.js | 2 + .../api/creature/properties/Proficiencies.js | 2 + app/imports/api/creature/removeCreature.js | 76 ++++++++++++++++++ app/imports/ui/character/CharacterSheet.vue | 45 +++++++++++ app/imports/ui/layouts/ToolbarLayout.vue | 4 +- app/imports/ui/pages/CharacterSheetPage.vue | 12 +++ app/imports/ui/router.js | 9 ++- app/package-lock.json | 78 ++----------------- 11 files changed, 159 insertions(+), 96 deletions(-) create mode 100644 app/imports/api/creature/removeCreature.js create mode 100644 app/imports/ui/character/CharacterSheet.vue create mode 100644 app/imports/ui/pages/CharacterSheetPage.vue diff --git a/app/imports/api/creature/Creatures.js b/app/imports/api/creature/Creatures.js index aa0fe97c..4f041104 100644 --- a/app/imports/api/creature/Creatures.js +++ b/app/imports/api/creature/Creatures.js @@ -1,10 +1,10 @@ import SimpleSchema from 'simpl-schema'; -import Effects from "/imports/api/creature/properties/Effects.js" import deathSaveSchema from "/imports/api/creature/subSchemas/DeathSavesSchema.js" import ColorSchema from "/imports/api/creature/subSchemas/ColorSchema.js"; //Methods import '/imports/api/creature/insertCreature.js'; +import '/imports/api/creature/removeCreature.js'; //set up the collection for creatures Creatures = new Mongo.Collection("creatures"); @@ -62,27 +62,8 @@ let creatureSchema = new SimpleSchema({ Creatures.attachSchema(creatureSchema); Creatures.attachSchema(ColorSchema); -//clean up all data related to that creature before removing it +//Keep the urlName up to date if (Meteor.isServer){ - Creatures.after.remove(function(userId, creature) { - let charId = creature._id; - Actions .remove({charId}); - Attacks .remove({charId}); - Attributes .remove({charId}); - Buffs .remove({charId}); - Classes .remove({charId}); - CustomBuffs .remove({charId}); - DamageMultipliers.remove({charId}); - Effects .remove({charId}); - Experiences .remove({charId}); - Features .remove({charId}); - Notes .remove({charId}); - Proficiencies .remove({charId}); - Skills .remove({charId}); - SpellLists .remove({charId}); - Items .remove({charId}); - Containers .remove({charId}); - }); Creatures.after.update(function(userId, doc, fieldNames, modifier, options) { if (_.contains(fieldNames, "name")){ var urlName = getSlug(doc.name, {maintainCase: true}) || "-"; diff --git a/app/imports/api/creature/insertCreature.js b/app/imports/api/creature/insertCreature.js index 05f2e9b3..1313de67 100644 --- a/app/imports/api/creature/insertCreature.js +++ b/app/imports/api/creature/insertCreature.js @@ -19,7 +19,7 @@ const addDefaultDocs = function(docs){ const insertCreature = new ValidatedMethod({ - name: "Creatures.methods.insertCharacter", // DDP method name + name: "Creatures.methods.insertCreature", validate: null, diff --git a/app/imports/api/creature/properties/Bundles.js b/app/imports/api/creature/properties/Bundles.js index 876e21a2..5b8e9ea4 100644 --- a/app/imports/api/creature/properties/Bundles.js +++ b/app/imports/api/creature/properties/Bundles.js @@ -1,6 +1,6 @@ import SimpleSchema from "simpl-schema"; -let Bundle = new Mongo.Collection("bundle"); +let Bundles = new Mongo.Collection("bundle"); let attributeSchema = new SimpleSchema({ name: String, diff --git a/app/imports/api/creature/properties/Experiences.js b/app/imports/api/creature/properties/Experiences.js index f26de8c7..994884db 100644 --- a/app/imports/api/creature/properties/Experiences.js +++ b/app/imports/api/creature/properties/Experiences.js @@ -24,3 +24,5 @@ let experienceSchema = new SimpleSchema({ Experiences.attachSchema(experienceSchema); //Experiences.attachBehaviour("softRemovable"); + +export default Experiences; diff --git a/app/imports/api/creature/properties/Proficiencies.js b/app/imports/api/creature/properties/Proficiencies.js index c3171c90..0a13ab15 100644 --- a/app/imports/api/creature/properties/Proficiencies.js +++ b/app/imports/api/creature/properties/Proficiencies.js @@ -34,3 +34,5 @@ Proficiencies.attachSchema(proficiencySchema); // Proficiencies.attachBehaviour("softRemovable"); makeChild(Proficiencies, ["enabled"]); + +export default Proficiencies; diff --git a/app/imports/api/creature/removeCreature.js b/app/imports/api/creature/removeCreature.js new file mode 100644 index 00000000..29856cde --- /dev/null +++ b/app/imports/api/creature/removeCreature.js @@ -0,0 +1,76 @@ +import Creatures from '/imports/api/creature/Creatures.js'; +import Actions from '/imports/api/creature/properties/Actions.js'; +import Attacks from '/imports/api/creature/properties/Attacks.js'; +import Attributes from '/imports/api/creature/properties/Attributes.js'; +import Buffs from '/imports/api/creature/properties/Buffs.js'; +import Bundles from '/imports/api/creature/properties/Bundles.js'; +import Classes from '/imports/api/creature/properties/Classes.js'; +import Conditions from '/imports/api/creature/properties/Conditions.js'; +import CustomBuffs from '/imports/api/creature/properties/CustomBuffs.js'; +import DamageMultipliers from '/imports/api/creature/properties/DamageMultipliers.js'; +import Effects from '/imports/api/creature/properties/Effects.js'; +import Experiences from '/imports/api/creature/properties/Experiences.js'; +import Features from '/imports/api/creature/properties/Features.js'; +import Notes from '/imports/api/creature/properties/Notes.js'; +import Proficiencies from '/imports/api/creature/properties/Proficiencies.js'; +import Skills from '/imports/api/creature/properties/Skills.js'; +import SpellLists from '/imports/api/creature/properties/SpellLists.js'; +import Spells from '/imports/api/creature/properties/Spells.js'; +import Items from '/imports/api/inventory/Items.js'; +import Containers from '/imports/api/inventory/Containers.js'; + +const checkRemovePermissions = function(userId, charId, creature){ + // Must be logged in + if (!userId) { + throw new Meteor.Error("Creatures.methods.removeCreature.denied", + "You need to be logged in to remove a creature"); + } + + // Creature must exist + if (!creature) { + throw new Meteor.Error("Creatures.methods.removeCreature.denied", + `No creature exists with the given id: ${charId}`); + } + + // Must be creatures owner + if (creature.owner !== userId){ + throw new Meteor.Error("Creatures.methods.removeCreature.denied", + "Only the owner is allowed to remove a creature, you are not the owner"); + } +} + +const removeRelatedDocuments = function(charId){ + Actions .remove({charId}); + Attacks .remove({charId}); + Attributes .remove({charId}); + Buffs .remove({charId}); + Bundles .remove({charId}); + Classes .remove({charId}); + Conditions .remove({charId}); + CustomBuffs .remove({charId}); + DamageMultipliers.remove({charId}); + Effects .remove({charId}); + Experiences .remove({charId}); + Features .remove({charId}); + Notes .remove({charId}); + Proficiencies .remove({charId}); + Skills .remove({charId}); + SpellLists .remove({charId}); + Spells .remove({charId}); + Items .remove({charId}); + Containers .remove({charId}); +}; + +const removeCreature = new ValidatedMethod({ + name: "Creatures.methods.removeCreature", // DDP method name + validate: null, + run(charId) { + let creature = Creatures.findOne(charId); + checkRemovePermissions(this.userId, charId, creature); + Creatures.remove(charId); + this.unblock(); + removeRelatedDocuments(charId); + }, +}); + +export default removeCreature; diff --git a/app/imports/ui/character/CharacterSheet.vue b/app/imports/ui/character/CharacterSheet.vue new file mode 100644 index 00000000..320aa3f0 --- /dev/null +++ b/app/imports/ui/character/CharacterSheet.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/app/imports/ui/layouts/ToolbarLayout.vue b/app/imports/ui/layouts/ToolbarLayout.vue index ba3f1564..e4fe854f 100644 --- a/app/imports/ui/layouts/ToolbarLayout.vue +++ b/app/imports/ui/layouts/ToolbarLayout.vue @@ -13,9 +13,9 @@ diff --git a/app/imports/ui/router.js b/app/imports/ui/router.js index 68bec2b5..337da359 100644 --- a/app/imports/ui/router.js +++ b/app/imports/ui/router.js @@ -4,10 +4,11 @@ import Vue from "vue"; // Components import Home from '/imports/ui/pages/Home.vue'; import CharacterList from "/imports/ui/pages/CharacterList.vue"; +import CharacterSheetPage from "/imports/ui/pages/CharacterSheetPage.vue"; import SignIn from "/imports/ui/pages/SignIn.vue" ; import Register from "/imports/ui/pages/Register.vue" ; import Account from "/imports/ui/pages/Account.vue" ; -import TestDialog from "/imports/ui/dialogStack/TestDialog.vue" +import TestDialog from "/imports/ui/dialogStack/TestDialog.vue"; // Not found import NotFound from '/imports/ui/pages/NotFound.vue'; @@ -30,6 +31,12 @@ RouterFactory.configure(factory => { },{ path: "/characterList", component: CharacterList, + },{ + path: "/character/:id/:urlName", + component: CharacterSheetPage, + },{ + path: "/character/:id", + component: CharacterSheetPage, },{ path: "/sign-in", component: SignIn, diff --git a/app/package-lock.json b/app/package-lock.json index 163b1de3..06225c04 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -105,7 +105,7 @@ }, "block-stream": { "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "resolved": false, "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "requires": { "inherits": "~2.0.0" @@ -453,7 +453,7 @@ }, "inherits": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "resolved": false, "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { @@ -1394,37 +1394,6 @@ "requires": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "stream-http": { @@ -1437,37 +1406,6 @@ "readable-stream": "^2.3.3", "to-arraybuffer": "^1.0.0", "xtend": "^4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "string_decoder": { @@ -1685,7 +1623,7 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-locale": { @@ -1700,7 +1638,7 @@ }, "os-tmpdir": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "osenv": { @@ -1753,7 +1691,7 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { @@ -1841,7 +1779,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": false, "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } @@ -2058,7 +1996,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { "safe-buffer": "~5.1.0" @@ -2089,7 +2027,7 @@ }, "tar": { "version": "2.2.1", - "resolved": "http://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "requires": { "block-stream": "*",