From a94f437ba8740d0f1015bfe4d110cc092d6cd48e Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Mon, 1 Apr 2019 13:48:39 +0200 Subject: [PATCH 01/10] methods now use correct mixins --- .../api/creature/properties/Actions.js | 33 +++++++++++-------- .../api/creature/properties/Attributes.js | 7 ++-- app/imports/api/creature/properties/Buffs.js | 13 +++----- .../api/creature/properties/ClassLevels.js | 17 +++++----- .../api/creature/properties/Classes.js | 13 +++----- .../creature/properties/DamageMultipliers.js | 17 ++++------ .../api/creature/properties/Effects.js | 21 +++++++----- .../api/creature/properties/Experiences.js | 12 +++---- .../api/creature/properties/Features.js | 18 +++++----- .../api/creature/properties/Folders.js | 22 +++++++------ app/imports/api/creature/properties/Notes.js | 13 +++----- .../api/creature/properties/Proficiencies.js | 20 ++++++----- app/imports/api/creature/properties/Rolls.js | 25 ++++---------- app/imports/api/creature/properties/Skills.js | 23 ++++++++----- .../api/creature/properties/SpellLists.js | 13 +++----- app/imports/api/creature/properties/Spells.js | 28 +++++++++------- app/imports/api/mixins/updateSchemaMixin.js | 23 +++++++------ 17 files changed, 160 insertions(+), 158 deletions(-) diff --git a/app/imports/api/creature/properties/Actions.js b/app/imports/api/creature/properties/Actions.js index 2bc8b12a..f86b9129 100644 --- a/app/imports/api/creature/properties/Actions.js +++ b/app/imports/api/creature/properties/Actions.js @@ -11,26 +11,35 @@ import creaturePermissionMixin from '/imports/api/mixins/creaturePermissionMixin import { setDocToLastMixin } from '/imports/api/mixins/setDocToLastMixin.js'; import { setDocAncestryMixin, ensureAncestryContainsCharIdMixin } from '/imports/api/parenting/parenting.js'; import simpleSchemaMixin from '/imports/api/mixins/simpleSchemaMixin.js'; - +import propagateInheritanceUpdateMixin from '/imports/api/mixins/propagateInheritanceUpdateMixin.js'; +import updateSchemaMixin from '/imports/api/mixins/updateSchemaMixin.js'; let Actions = new Mongo.Collection('actions'); /* * Actions are things a character can do + * Any rolls that are children of actions will be rolled when taking the action + * Any actions that are children of this action will be considered alternatives + * to this action */ let ActionSchema = schema({ name: { type: String, optional: true, }, + enabled: { + type: Boolean, + defaultValue: true, + }, description: { type: String, optional: true, }, // What time-resource is used to take the action in combat + // long actions take longer than 1 round to cast type: { type: String, - allowedValues: ['attack', 'action', 'bonus', 'reaction', 'free'], + allowedValues: ['action', 'bonus', 'attack', 'reaction', 'free', 'long'], defaultValue: 'action', }, // Who is the action directed at @@ -42,8 +51,8 @@ let ActionSchema = schema({ 'multipleTargets', ], }, - // Adjustments applied when taking this action, regardless of roll outcomes - // If these adjustments can't be made, the action should be unusable + // Adjustments applied when taking this action + // Ideally, if these adjustments can't be made, the action should be unusable adjustments: { type: Array, defaultValue: [], @@ -51,7 +60,7 @@ let ActionSchema = schema({ 'adjustments.$': { type: AdjustmentSchema, }, - // Buffs applied when taking this action, regardless of roll outcomes + // Buffs applied when taking this action buffs: { type: Array, defaultValue: [], @@ -60,7 +69,8 @@ let ActionSchema = schema({ type: StoredBuffSchema, }, // Calculation of how many times this action can be used - // Only set if this action tracks its own uses + // Only set if this action tracks its own uses, rather than adjusting + // resources uses: { type: String, optional: true, @@ -104,18 +114,13 @@ const insertAction = new ValidatedMethod({ const updateAction = new ValidatedMethod({ name: 'Actions.methods.update', mixins: [ + propagateInheritanceUpdateMixin, + updateSchemaMixin, creaturePermissionMixin, - simpleSchemaMixin, ], collection: Actions, permission: 'edit', - schema: new SimpleSchema({ - _id: SimpleSchema.RegEx.Id, - update: ActionSchema.omit('name'), - }), - run({_id, update}) { - return Actions.update(_id, {$set: update}); - }, + schema: ActionSchema, }); export default Actions; diff --git a/app/imports/api/creature/properties/Attributes.js b/app/imports/api/creature/properties/Attributes.js index cff80927..076ec855 100644 --- a/app/imports/api/creature/properties/Attributes.js +++ b/app/imports/api/creature/properties/Attributes.js @@ -79,7 +79,6 @@ let AttributeSchema = schema({ }); AttributeSchema.extend(ColorSchema); -AttributeSchema.extend(PropertySchema); const ComputedAttributeSchema = schema({ // The computed value of the attribute @@ -94,6 +93,7 @@ const ComputedAttributeSchema = schema({ }, }).extend(AttributeSchema); +Attributes.attachSchema(PropertySchema); Attributes.attachSchema(ComputedAttributeSchema); Attributes.attachSchema(ChildSchema); @@ -125,7 +125,7 @@ const updateAttribute = new ValidatedMethod({ ], collection: Attributes, permission: 'edit', - updateSchema: AttributeSchema, + schema: AttributeSchema.omit(['adjutment']), skipRecompute({update}){ let fields = getModifierFields(update); return !fields.hasAny([ @@ -134,9 +134,6 @@ const updateAttribute = new ValidatedMethod({ 'baseValue', ]); }, - run({_id, update}) { - return Attributes.update(_id, update); - }, }); const adjustAttribute = new ValidatedMethod({ diff --git a/app/imports/api/creature/properties/Buffs.js b/app/imports/api/creature/properties/Buffs.js index 54a8be9b..3ac52d3c 100644 --- a/app/imports/api/creature/properties/Buffs.js +++ b/app/imports/api/creature/properties/Buffs.js @@ -9,6 +9,8 @@ import creaturePermissionMixin from '/imports/api/mixins/creaturePermissionMixin import { setDocToLastMixin } from '/imports/api/mixins/setDocToLastMixin.js'; import { setDocAncestryMixin, ensureAncestryContainsCharIdMixin } from '/imports/api/parenting/parenting.js'; import simpleSchemaMixin from '/imports/api/mixins/simpleSchemaMixin.js'; +import propagateInheritanceUpdateMixin from '/imports/api/mixins/propagateInheritanceUpdateMixin.js'; +import updateSchemaMixin from '/imports/api/mixins/updateSchemaMixin.js'; let Buffs = new Mongo.Collection('buffs'); @@ -99,18 +101,13 @@ const insertBuff = new ValidatedMethod({ const updateBuff = new ValidatedMethod({ name: 'Buffs.methods.update', mixins: [ + propagateInheritanceUpdateMixin, + updateSchemaMixin, creaturePermissionMixin, - simpleSchemaMixin, ], collection: Buffs, permission: 'edit', - schema: new SimpleSchema({ - _id: SimpleSchema.RegEx.Id, - update: BuffSchema.omit('name'), - }), - run({_id, update}) { - return Buffs.update(_id, {$set: update}); - }, + schema: BuffSchema, }); export default Buffs; diff --git a/app/imports/api/creature/properties/ClassLevels.js b/app/imports/api/creature/properties/ClassLevels.js index 111d2aee..f3aa70f9 100644 --- a/app/imports/api/creature/properties/ClassLevels.js +++ b/app/imports/api/creature/properties/ClassLevels.js @@ -9,6 +9,8 @@ import creaturePermissionMixin from '/imports/api/mixins/creaturePermissionMixin import { setDocToLastMixin } from '/imports/api/mixins/setDocToLastMixin.js'; import { setDocAncestryMixin, ensureAncestryContainsCharIdMixin } from '/imports/api/parenting/parenting.js'; import simpleSchemaMixin from '/imports/api/mixins/simpleSchemaMixin.js'; +import propagateInheritanceUpdateMixin from '/imports/api/mixins/propagateInheritanceUpdateMixin.js'; +import updateSchemaMixin from '/imports/api/mixins/updateSchemaMixin.js'; let ClassLevels = new Mongo.Collection("classLevels"); @@ -17,6 +19,10 @@ let ClassLevelSchema = schema({ type: String, optional: true, }, + enabled: { + type: Boolean, + defaultValue: true, + }, // The name of this class level's variable variableName: { type: String, @@ -66,18 +72,13 @@ const insertClassLevel = new ValidatedMethod({ const updateClassLevel = new ValidatedMethod({ name: 'ClassLevels.methods.update', mixins: [ + propagateInheritanceUpdateMixin, + updateSchemaMixin, creaturePermissionMixin, - simpleSchemaMixin, ], collection: ClassLevels, permission: 'edit', - schema: new SimpleSchema({ - _id: SimpleSchema.RegEx.Id, - update: ClassLevelSchema.omit('name'), - }), - run({_id, update}) { - return ClassLevels.update(_id, {$set: update}); - }, + schema: ClassLevelSchema, }); export default ClassLevels; diff --git a/app/imports/api/creature/properties/Classes.js b/app/imports/api/creature/properties/Classes.js index d38dcb89..adcafbf2 100644 --- a/app/imports/api/creature/properties/Classes.js +++ b/app/imports/api/creature/properties/Classes.js @@ -10,6 +10,8 @@ import creaturePermissionMixin from '/imports/api/mixins/creaturePermissionMixin import { setDocToLastMixin } from '/imports/api/mixins/setDocToLastMixin.js'; import { setDocAncestryMixin, ensureAncestryContainsCharIdMixin } from '/imports/api/parenting/parenting.js'; import simpleSchemaMixin from '/imports/api/mixins/simpleSchemaMixin.js'; +import propagateInheritanceUpdateMixin from '/imports/api/mixins/propagateInheritanceUpdateMixin.js'; +import updateSchemaMixin from '/imports/api/mixins/updateSchemaMixin.js'; let Classes = new Mongo.Collection("classes"); @@ -51,18 +53,13 @@ const insertClass = new ValidatedMethod({ const updateClass = new ValidatedMethod({ name: 'Classes.methods.update', mixins: [ + propagateInheritanceUpdateMixin, + updateSchemaMixin, creaturePermissionMixin, - simpleSchemaMixin, ], collection: Classes, permission: 'edit', - schema: new SimpleSchema({ - _id: SimpleSchema.RegEx.Id, - update: ClassSchema.omit('name'), - }), - run({_id, update}) { - return Classes.update(_id, {$set: update}); - }, + schema: ClassSchema, }); export default Classes; diff --git a/app/imports/api/creature/properties/DamageMultipliers.js b/app/imports/api/creature/properties/DamageMultipliers.js index 74d939b9..627feaac 100644 --- a/app/imports/api/creature/properties/DamageMultipliers.js +++ b/app/imports/api/creature/properties/DamageMultipliers.js @@ -10,6 +10,8 @@ import creaturePermissionMixin from '/imports/api/mixins/creaturePermissionMixin import { setDocToLastMixin } from '/imports/api/mixins/setDocToLastMixin.js'; import { setDocAncestryMixin, ensureAncestryContainsCharIdMixin } from '/imports/api/parenting/parenting.js'; import simpleSchemaMixin from '/imports/api/mixins/simpleSchemaMixin.js'; +import propagateInheritanceUpdateMixin from '/imports/api/mixins/propagateInheritanceUpdateMixin.js'; +import updateSchemaMixin from '/imports/api/mixins/updateSchemaMixin.js'; let DamageMultipliers = new Mongo.Collection("damageMultipliers"); @@ -42,12 +44,12 @@ DamageMultipliers.attachSchema(ChildSchema); const insertDamageMultiplier = new ValidatedMethod({ name: 'DamageMultipliers.methods.insert', mixins: [ - creaturePermissionMixin, setDocAncestryMixin, ensureAncestryContainsCharIdMixin, recomputeCreatureMixin, setDocToLastMixin, simpleSchemaMixin, + creaturePermissionMixin, ], collection: DamageMultipliers, permission: 'edit', @@ -60,19 +62,14 @@ const insertDamageMultiplier = new ValidatedMethod({ const updateDamageMultiplier = new ValidatedMethod({ name: 'DamageMultipliers.methods.update', mixins: [ - creaturePermissionMixin, recomputeCreatureMixin, - simpleSchemaMixin, + propagateInheritanceUpdateMixin, + updateSchemaMixin, + creaturePermissionMixin, ], collection: DamageMultipliers, permission: 'edit', - schema: new SimpleSchema({ - _id: SimpleSchema.RegEx.Id, - update: DamageMultiplierSchema.omit('name'), - }), - run({_id, update}) { - return DamageMultipliers.update(_id, {$set: update}); - }, + schema: DamageMultiplierSchema, }); export default DamageMultipliers; diff --git a/app/imports/api/creature/properties/Effects.js b/app/imports/api/creature/properties/Effects.js index d833bc38..387f198d 100644 --- a/app/imports/api/creature/properties/Effects.js +++ b/app/imports/api/creature/properties/Effects.js @@ -9,6 +9,8 @@ import creaturePermissionMixin from '/imports/api/mixins/creaturePermissionMixin import { setDocToLastMixin } from '/imports/api/mixins/setDocToLastMixin.js'; import { setDocAncestryMixin, ensureAncestryContainsCharIdMixin } from '/imports/api/parenting/parenting.js'; import simpleSchemaMixin from '/imports/api/mixins/simpleSchemaMixin.js'; +import propagateInheritanceUpdateMixin from '/imports/api/mixins/propagateInheritanceUpdateMixin.js'; +import updateSchemaMixin from '/imports/api/mixins/updateSchemaMixin.js'; let Effects = new Mongo.Collection('effects'); @@ -81,18 +83,21 @@ const insertEffect = new ValidatedMethod({ const updateEffect = new ValidatedMethod({ name: 'Effects.methods.update', mixins: [ - creaturePermissionMixin, recomputeCreatureMixin, - simpleSchemaMixin, + propagateInheritanceUpdateMixin, + updateSchemaMixin, + creaturePermissionMixin, ], collection: Effects, permission: 'edit', - schema: new SimpleSchema({ - _id: SimpleSchema.RegEx.Id, - update: EffectSchema.omit('name'), - }), - run({_id, update}) { - return Effects.update(_id, {$set: update}); + schema: EffectSchema, + skipRecompute({update}){ + let fields = getModifierFields(update); + return !fields.hasAny([ + 'operation', + 'calculation', + 'stat', + ]); }, }); diff --git a/app/imports/api/creature/properties/Experiences.js b/app/imports/api/creature/properties/Experiences.js index 8ff256f0..ca81ec9b 100644 --- a/app/imports/api/creature/properties/Experiences.js +++ b/app/imports/api/creature/properties/Experiences.js @@ -9,6 +9,8 @@ import creaturePermissionMixin from '/imports/api/mixins/creaturePermissionMixin import { setDocToLastMixin } from '/imports/api/mixins/setDocToLastMixin.js'; import { setDocAncestryMixin, ensureAncestryContainsCharIdMixin } from '/imports/api/parenting/parenting.js'; import simpleSchemaMixin from '/imports/api/mixins/simpleSchemaMixin.js'; +import propagateInheritanceUpdateMixin from '/imports/api/mixins/propagateInheritanceUpdateMixin.js'; +import updateSchemaMixin from '/imports/api/mixins/updateSchemaMixin.js'; let Experiences = new Mongo.Collection("experience"); @@ -77,16 +79,14 @@ const insertExperience = new ValidatedMethod({ const updateExperience = new ValidatedMethod({ name: 'Experiences.methods.update', mixins: [ - creaturePermissionMixin, recomputeCreatureMixin, - simpleSchemaMixin, + ropagateInheritanceUpdateMixin, + updateSchemaMixin, + creaturePermissionMixin, ], collection: Experiences, permission: 'edit', - schema: new SimpleSchema({ - _id: SimpleSchema.RegEx.Id, - update: ExperienceSchema.omit('name'), - }), + schema: ExperienceSchema, skipRecompute({update}){ return !('value' in update); }, diff --git a/app/imports/api/creature/properties/Features.js b/app/imports/api/creature/properties/Features.js index d08591a7..eba5d322 100644 --- a/app/imports/api/creature/properties/Features.js +++ b/app/imports/api/creature/properties/Features.js @@ -8,11 +8,12 @@ import ChildSchema from '/imports/api/parenting/ChildSchema.js'; import ColorSchema from '/imports/api/creature/subSchemas/ColorSchema.js'; // Mixins -import recomputeCreatureMixin from '/imports/api/mixins/recomputeCreatureMixin.js'; import creaturePermissionMixin from '/imports/api/mixins/creaturePermissionMixin.js'; import { setDocToLastMixin } from '/imports/api/mixins/setDocToLastMixin.js'; import { setDocAncestryMixin, ensureAncestryContainsCharIdMixin } from '/imports/api/parenting/parenting.js'; import simpleSchemaMixin from '/imports/api/mixins/simpleSchemaMixin.js'; +import propagateInheritanceUpdateMixin from '/imports/api/mixins/propagateInheritanceUpdateMixin.js'; +import updateSchemaMixin from '/imports/api/mixins/updateSchemaMixin.js'; let Features = new Mongo.Collection('features'); @@ -21,6 +22,10 @@ let FeatureSchema = schema({ type: String, optional: true, }, + enabled: { + type: Boolean, + defaultValue: true, + }, description: { type: String, optional: true, @@ -57,18 +62,13 @@ const insertFeature = new ValidatedMethod({ const updateFeature = new ValidatedMethod({ name: 'Features.methods.update', mixins: [ + propagateInheritanceUpdateMixin, + updateSchemaMixin, creaturePermissionMixin, - simpleSchemaMixin, ], collection: Features, permission: 'edit', - schema: new SimpleSchema({ - _id: SimpleSchema.RegEx.Id, - update: FeatureSchema.omit('name'), - }), - run({_id, update}) { - return Features.update(_id, {$set: update}); - }, + schema: FeatureSchema, }); export default Features; diff --git a/app/imports/api/creature/properties/Folders.js b/app/imports/api/creature/properties/Folders.js index 53fdb86b..b33a0b26 100644 --- a/app/imports/api/creature/properties/Folders.js +++ b/app/imports/api/creature/properties/Folders.js @@ -8,18 +8,25 @@ import creaturePermissionMixin from '/imports/api/mixins/creaturePermissionMixin import { setDocToLastMixin } from '/imports/api/mixins/setDocToLastMixin.js'; import { setDocAncestryMixin, ensureAncestryContainsCharIdMixin } from '/imports/api/parenting/parenting.js'; import simpleSchemaMixin from '/imports/api/mixins/simpleSchemaMixin.js'; +import propagateInheritanceUpdateMixin from '/imports/api/mixins/propagateInheritanceUpdateMixin.js'; +import updateSchemaMixin from '/imports/api/mixins/updateSchemaMixin.js'; let Folders = new Mongo.Collection('folders'); +// Folders organize a character sheet into a tree, particularly to group things +// like 'race' and 'background' let FolderSchema = schema({ name: { type: String, optional: true, }, -}); + enabled: { + type: Boolean, + defaultValue: true, + }, +}).extend(PropertySchema); Folders.attachSchema(FolderSchema); -Folders.attachSchema(PropertySchema); Folders.attachSchema(ChildSchema); const insertFolder = new ValidatedMethod({ @@ -42,18 +49,13 @@ const insertFolder = new ValidatedMethod({ const updateFolder = new ValidatedMethod({ name: 'Folders.methods.update', mixins: [ + propagateInheritanceUpdateMixin, + updateSchemaMixin, creaturePermissionMixin, - simpleSchemaMixin, ], collection: Folders, permission: 'edit', - schema: new SimpleSchema({ - _id: SimpleSchema.RegEx.Id, - update: FolderSchema.omit('name'), - }), - run({_id, update}) { - return Folders.update(_id, {$set: update}); - }, + schema: FolderSchema, }); export default Folders; diff --git a/app/imports/api/creature/properties/Notes.js b/app/imports/api/creature/properties/Notes.js index af74d733..f98cfd22 100644 --- a/app/imports/api/creature/properties/Notes.js +++ b/app/imports/api/creature/properties/Notes.js @@ -8,6 +8,8 @@ import creaturePermissionMixin from '/imports/api/mixins/creaturePermissionMixin import { setDocToLastMixin } from '/imports/api/mixins/setDocToLastMixin.js'; import { setDocAncestryMixin, ensureAncestryContainsCharIdMixin } from '/imports/api/parenting/parenting.js'; import simpleSchemaMixin from '/imports/api/mixins/simpleSchemaMixin.js'; +import propagateInheritanceUpdateMixin from '/imports/api/mixins/propagateInheritanceUpdateMixin.js'; +import updateSchemaMixin from '/imports/api/mixins/updateSchemaMixin.js'; let Notes = new Mongo.Collection("notes"); @@ -47,18 +49,13 @@ const insertNote = new ValidatedMethod({ const updateNote = new ValidatedMethod({ name: 'Notes.methods.update', mixins: [ + propagateInheritanceUpdateMixin, + updateSchemaMixin, creaturePermissionMixin, - simpleSchemaMixin, ], collection: Notes, permission: 'edit', - schema: new SimpleSchema({ - _id: SimpleSchema.RegEx.Id, - update: NoteSchema.omit('name'), - }), - run({_id, update}) { - return Notes.update(_id, {$set: update}); - }, + schema: NoteSchema, }); export default Notes; diff --git a/app/imports/api/creature/properties/Proficiencies.js b/app/imports/api/creature/properties/Proficiencies.js index 3df0227d..5770ea23 100644 --- a/app/imports/api/creature/properties/Proficiencies.js +++ b/app/imports/api/creature/properties/Proficiencies.js @@ -9,6 +9,8 @@ import creaturePermissionMixin from '/imports/api/mixins/creaturePermissionMixin import { setDocToLastMixin } from '/imports/api/mixins/setDocToLastMixin.js'; import { setDocAncestryMixin, ensureAncestryContainsCharIdMixin } from '/imports/api/parenting/parenting.js'; import simpleSchemaMixin from '/imports/api/mixins/simpleSchemaMixin.js'; +import propagateInheritanceUpdateMixin from '/imports/api/mixins/propagateInheritanceUpdateMixin.js'; +import updateSchemaMixin from '/imports/api/mixins/updateSchemaMixin.js'; let Proficiencies = new Mongo.Collection("proficiencies"); @@ -55,18 +57,20 @@ const insertProficiency = new ValidatedMethod({ const updateProficiency = new ValidatedMethod({ name: 'Proficiencies.methods.update', mixins: [ - creaturePermissionMixin, recomputeCreatureMixin, - simpleSchemaMixin, + propagateInheritanceUpdateMixin, + updateSchemaMixin, + creaturePermissionMixin, ], collection: Proficiencies, permission: 'edit', - schema: new SimpleSchema({ - _id: SimpleSchema.RegEx.Id, - update: ProficiencySchema.omit('name'), - }), - run({_id, update}) { - return Proficiencies.update(_id, {$set: update}); + schema: ProficiencySchema, + skipRecompute({update}){ + let fields = getModifierFields(update); + return !fields.hasAny([ + 'value', + 'skill', + ]); }, }); diff --git a/app/imports/api/creature/properties/Rolls.js b/app/imports/api/creature/properties/Rolls.js index 892c0285..75d5067f 100644 --- a/app/imports/api/creature/properties/Rolls.js +++ b/app/imports/api/creature/properties/Rolls.js @@ -9,14 +9,12 @@ import creaturePermissionMixin from '/imports/api/mixins/creaturePermissionMixin import { setDocToLastMixin } from '/imports/api/mixins/setDocToLastMixin.js'; import { setDocAncestryMixin, ensureAncestryContainsCharIdMixin } from '/imports/api/parenting/parenting.js'; import simpleSchemaMixin from '/imports/api/mixins/simpleSchemaMixin.js'; +import propagateInheritanceUpdateMixin from '/imports/api/mixins/propagateInheritanceUpdateMixin.js'; +import updateSchemaMixin from '/imports/api/mixins/updateSchemaMixin.js'; let Rolls = new Mongo.Collection('rolls'); let RollChildrenSchema = new SimpleSchema({ - name: { - type: String, - optional: true, - }, // The adjustments to be applied adjustments: { type: Array, @@ -91,12 +89,8 @@ let RollSchema = new SimpleSchema({ optional: true, }, // The buffs and adjustments to apply based on the outcome of the roll - hit: { - type: RollChildrenSchema, - }, - miss: { - type: RollChildrenSchema, - }, + hit: RollChildrenSchema, + miss: RollChildrenSchema, }); Rolls.attachSchema(RollSchema); @@ -123,18 +117,13 @@ const insertRoll = new ValidatedMethod({ const updateRoll = new ValidatedMethod({ name: 'Rolls.methods.update', mixins: [ + propagateInheritanceUpdateMixin, + updateSchemaMixin, creaturePermissionMixin, - simpleSchemaMixin, ], collection: Rolls, permission: 'edit', - schema: new SimpleSchema({ - _id: SimpleSchema.RegEx.Id, - update: RollSchema.omit('name'), - }), - run({_id, update}) { - return Rolls.update(_id, {$set: update}); - }, + schema: RollSchema, }); export default Rolls; diff --git a/app/imports/api/creature/properties/Skills.js b/app/imports/api/creature/properties/Skills.js index 1b6267d9..e117da53 100644 --- a/app/imports/api/creature/properties/Skills.js +++ b/app/imports/api/creature/properties/Skills.js @@ -10,6 +10,8 @@ import creaturePermissionMixin from '/imports/api/mixins/creaturePermissionMixin import { setDocToLastMixin } from '/imports/api/mixins/setDocToLastMixin.js'; import { setDocAncestryMixin, ensureAncestryContainsCharIdMixin } from '/imports/api/parenting/parenting.js'; import simpleSchemaMixin from '/imports/api/mixins/simpleSchemaMixin.js'; +import propagateInheritanceUpdateMixin from '/imports/api/mixins/propagateInheritanceUpdateMixin.js'; +import updateSchemaMixin from '/imports/api/mixins/updateSchemaMixin.js'; let Skills = new Mongo.Collection("skills"); @@ -124,18 +126,23 @@ const insertSkill = new ValidatedMethod({ const updateSkill = new ValidatedMethod({ name: 'Skills.methods.update', mixins: [ - creaturePermissionMixin, recomputeCreatureMixin, - simpleSchemaMixin, + propagateInheritanceUpdateMixin, + updateSchemaMixin, + creaturePermissionMixin, ], collection: Skills, permission: 'edit', - schema: new SimpleSchema({ - _id: SimpleSchema.RegEx.Id, - update: SkillSchema.omit('name'), - }), - run({_id, update}) { - return Skills.update(_id, {$set: update}); + schema: SkillSchema, + skipRecompute({update}){ + let fields = getModifierFields(update); + return !fields.hasAny([ + 'variableName', + 'ability', + 'type', + 'baseValue', + 'baseProficiency', + ]); }, }); diff --git a/app/imports/api/creature/properties/SpellLists.js b/app/imports/api/creature/properties/SpellLists.js index 14ff7532..ed104b4b 100644 --- a/app/imports/api/creature/properties/SpellLists.js +++ b/app/imports/api/creature/properties/SpellLists.js @@ -9,6 +9,8 @@ import creaturePermissionMixin from '/imports/api/mixins/creaturePermissionMixin import { setDocToLastMixin } from '/imports/api/mixins/setDocToLastMixin.js'; import { setDocAncestryMixin, ensureAncestryContainsCharIdMixin } from '/imports/api/parenting/parenting.js'; import simpleSchemaMixin from '/imports/api/mixins/simpleSchemaMixin.js'; +import propagateInheritanceUpdateMixin from '/imports/api/mixins/propagateInheritanceUpdateMixin.js'; +import updateSchemaMixin from '/imports/api/mixins/updateSchemaMixin.js'; let SpellLists = new Mongo.Collection("spellLists"); @@ -64,18 +66,13 @@ const insertSpellList = new ValidatedMethod({ const updateSpellList = new ValidatedMethod({ name: 'SpellLists.methods.update', mixins: [ + propagateInheritanceUpdateMixin, + updateSchemaMixin, creaturePermissionMixin, - simpleSchemaMixin, ], collection: SpellLists, permission: 'edit', - schema: new SimpleSchema({ - _id: SimpleSchema.RegEx.Id, - update: SpellListSchema.omit('name'), - }), - run({_id, update}) { - return SpellLists.update(_id, {$set: update}); - }, + schema: SpellListSchema, }); export default SpellLists; diff --git a/app/imports/api/creature/properties/Spells.js b/app/imports/api/creature/properties/Spells.js index 0ee95348..7bdd1080 100644 --- a/app/imports/api/creature/properties/Spells.js +++ b/app/imports/api/creature/properties/Spells.js @@ -9,6 +9,8 @@ import creaturePermissionMixin from '/imports/api/mixins/creaturePermissionMixin import { setDocToLastMixin } from '/imports/api/mixins/setDocToLastMixin.js'; import { setDocAncestryMixin, ensureAncestryContainsCharIdMixin } from '/imports/api/parenting/parenting.js'; import simpleSchemaMixin from '/imports/api/mixins/simpleSchemaMixin.js'; +import propagateInheritanceUpdateMixin from '/imports/api/mixins/propagateInheritanceUpdateMixin.js'; +import updateSchemaMixin from '/imports/api/mixins/updateSchemaMixin.js'; const magicSchools = [ 'Abjuration', @@ -28,11 +30,18 @@ let SpellSchema = schema({ type: String, optional: true, }, - prepared: { - type: String, - defaultValue: 'prepared', - allowedValues: ['prepared', 'unprepared', 'always'], + // If it's always prepared, it doesn't count against the number of spells + // prepared in a spell list, and enabled should be true + alwaysPrepared: { + type: Boolean, + defaultValue: false, }, + // Spells are enabled when they are prepared, so that unprepared spells don't + // show their actions + enabled: { + type: Boolean, + defaultValue: true, + }, description: { type: String, optional: true, @@ -108,18 +117,13 @@ const insertSpell = new ValidatedMethod({ const updateSpell = new ValidatedMethod({ name: 'Spells.methods.update', mixins: [ + propagateInheritanceUpdateMixin, + updateSchemaMixin, creaturePermissionMixin, - simpleSchemaMixin, ], collection: Spells, permission: 'edit', - schema: new SimpleSchema({ - _id: SimpleSchema.RegEx.Id, - update: SpellSchema.omit('name'), - }), - run({_id, update}) { - return Spells.update(_id, {$set: update}); - }, + schema: SpellSchema, }); export default Spells; diff --git a/app/imports/api/mixins/updateSchemaMixin.js b/app/imports/api/mixins/updateSchemaMixin.js index 2e840492..c62ff9a8 100644 --- a/app/imports/api/mixins/updateSchemaMixin.js +++ b/app/imports/api/mixins/updateSchemaMixin.js @@ -12,16 +12,12 @@ import SimpleSchema from 'simpl-schema'; export default function updateSchemaMixin(methodOptions) { // If the user didn't give us a schema and they did give us a validate, assume // that they are choosing to use the validate way of doing things in this call. - // If they've built a wrapper around ValidateMethod that includes this mixin - // all the time, this could happen semi-"intentionally". There may be times they - // just don't want to use a schema and have specified a "validate" option. So - // returning the unchanged options instead of an error seems proper. if (( - typeof methodOptions.updateSchema === 'undefined' && + typeof methodOptions.schema === 'undefined' && typeof methodOptions.validate !== 'undefined' ) || ( - typeof methodOptions.updateSchema !== 'undefined' && - methodOptions.updateSchema === null && + typeof methodOptions.schema !== 'undefined' && + methodOptions.schema === null && typeof methodOptions.validate !== 'undefined' && methodOptions.validate !== null )) { @@ -46,10 +42,10 @@ export default function updateSchemaMixin(methodOptions) { // Make the update schema a SimpleSchema, if it isn't already let updateSchema; - if (methodOptions.updateSchema instanceof SimpleSchema) { - updateSchema = methodOptions.updateSchema; + if (methodOptions.schema instanceof SimpleSchema) { + updateSchema = methodOptions.schema; } else { - updateSchema = new SimpleSchema(methodOptions.updateSchema); + updateSchema = new SimpleSchema(methodOptions.schema); } // Set up the new validation @@ -57,5 +53,12 @@ export default function updateSchemaMixin(methodOptions) { argumentSchema.validate(args); updateSchema.validate(args.update, methodOptions.schemaValidatorOptions); }; + + // Give a default run function if one isn't supplied + if (!methodOptions.run){ + methodOptions.run = function({_id, update}){ + return MethodOptions.collection.update(_id, {$set: update}); + }; + } return methodOptions; } From 18493afbbf370c33d136b5e8d3f03ad6b6ed0adf Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Mon, 1 Apr 2019 15:51:11 +0200 Subject: [PATCH 02/10] Collated update methods into an index, fixed typo --- .../api/creature/properties/Experiences.js | 2 +- .../properties/propertyUpdateMethods.js | 35 +++++++++++++++++++ app/imports/api/parenting/fetchDocByRef.js | 2 +- 3 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 app/imports/api/creature/properties/propertyUpdateMethods.js diff --git a/app/imports/api/creature/properties/Experiences.js b/app/imports/api/creature/properties/Experiences.js index ca81ec9b..4f7ff4da 100644 --- a/app/imports/api/creature/properties/Experiences.js +++ b/app/imports/api/creature/properties/Experiences.js @@ -80,7 +80,7 @@ const updateExperience = new ValidatedMethod({ name: 'Experiences.methods.update', mixins: [ recomputeCreatureMixin, - ropagateInheritanceUpdateMixin, + propagateInheritanceUpdateMixin, updateSchemaMixin, creaturePermissionMixin, ], diff --git a/app/imports/api/creature/properties/propertyUpdateMethods.js b/app/imports/api/creature/properties/propertyUpdateMethods.js new file mode 100644 index 00000000..c66cd043 --- /dev/null +++ b/app/imports/api/creature/properties/propertyUpdateMethods.js @@ -0,0 +1,35 @@ +import updateAction from '/imports/api/creature/properties/Actions.js'; +import updateAttribute from '/imports/api/creature/properties/Attributes.js'; +import updateBuff from '/imports/api/creature/properties/Buff.js'; +import updateClass from '/imports/api/creature/properties/Classes.js'; +import updateClassLevel from '/imports/api/creature/properties/ClassLevels.js'; +import updateDamageMiliplier from '/imports/api/creature/properties/DamageMilipliers.js'; +import updateEffect from '/imports/api/creature/properties/Effects.js'; +import updateExperience from '/imports/api/creature/properties/Experiences.js'; +import updateFeature from '/imports/api/creature/properties/Features.js'; +import updateFolder from '/imports/api/creature/properties/Folders.js'; +import updateNote from '/imports/api/creature/properties/Notes.js'; +import updateProficiency from '/imports/api/creature/properties/Proficiencies.js'; +import updateRoll from '/imports/api/creature/properties/Rolls.js'; +import updateSkill from '/imports/api/creature/properties/Skills.js'; +import updateSpellList from '/imports/api/creature/properties/SpellLists.js'; +import updateSpell from '/imports/api/creature/properties/Spells.js'; + +export default Object.freeze({ + actions: updateAction, + attributes: updateAttribute, + buffs: updateBuff, + classs: updateClass, + classLevels: updateClassLevel, + damageMilipliers: updateDamageMiliplier, + effects: updateEffect, + experiences: updateExperience, + features: updateFeature, + folders: updateFolder, + notes: updateNote, + proficienciess: updateProficiency, + rolls: updateRoll, + skills: updateSkill, + spellLists: updateSpellList, + spells: updateSpell, +}); diff --git a/app/imports/api/parenting/fetchDocByRef.js b/app/imports/api/parenting/fetchDocByRef.js index 23766707..dfa485dc 100644 --- a/app/imports/api/parenting/fetchDocByRef.js +++ b/app/imports/api/parenting/fetchDocByRef.js @@ -9,4 +9,4 @@ const docNotFoundError = function({id, collection}){ export default function fetchDocByRef({id, collection}, options){ return getCollectionByName(collection).findOne(id, options) || docNotFoundError({id, collection}); -}; +} From 6d68796a112532c096328ca343cc7c925b4026b4 Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Mon, 1 Apr 2019 16:57:29 +0200 Subject: [PATCH 03/10] Fixed nasty bug where mixins were bashing the schemas passed to them --- .../api/creature/properties/Features.js | 19 +++++++++++-------- .../api/creature/subSchemas/ColorSchema.js | 18 ++++-------------- app/imports/api/mixins/setDocToLastMixin.js | 4 ++-- app/imports/api/parenting/parenting.js | 15 ++++++++++----- app/imports/api/schema.js | 10 +++------- 5 files changed, 30 insertions(+), 36 deletions(-) diff --git a/app/imports/api/creature/properties/Features.js b/app/imports/api/creature/properties/Features.js index eba5d322..dce84077 100644 --- a/app/imports/api/creature/properties/Features.js +++ b/app/imports/api/creature/properties/Features.js @@ -17,7 +17,7 @@ import updateSchemaMixin from '/imports/api/mixins/updateSchemaMixin.js'; let Features = new Mongo.Collection('features'); -let FeatureSchema = schema({ +let FeatureSchema = new SimpleSchema({ name: { type: String, optional: true, @@ -38,18 +38,21 @@ let FeatureSchema = schema({ FeatureSchema.extend(ColorSchema); -Features.attachSchema(FeatureSchema); -Features.attachSchema(PropertySchema); -Features.attachSchema(ChildSchema); +Features.attachSchema( + schema(FeatureSchema) + .extend(PropertySchema) + .extend(ChildSchema) +); + const insertFeature = new ValidatedMethod({ name: 'Features.methods.insert', mixins: [ - creaturePermissionMixin, - setDocAncestryMixin, - ensureAncestryContainsCharIdMixin, setDocToLastMixin, - simpleSchemaMixin, + simpleSchemaMixin, + ensureAncestryContainsCharIdMixin, + setDocAncestryMixin, + creaturePermissionMixin, ], collection: Features, permission: 'edit', diff --git a/app/imports/api/creature/subSchemas/ColorSchema.js b/app/imports/api/creature/subSchemas/ColorSchema.js index e0b74c61..f258c269 100644 --- a/app/imports/api/creature/subSchemas/ColorSchema.js +++ b/app/imports/api/creature/subSchemas/ColorSchema.js @@ -1,22 +1,12 @@ import SimpleSchema from 'simpl-schema'; -const getColorSchema = function({optional = true} = {}){ - let schema = { +const ColorSchema = new SimpleSchema({ + color: { type: String, // match hex colors of the form #A23 or #A23f56 regEx: /^#([a-f0-9]{3}){1,2}\b$/i, - }; - if (optional) { - schema.optional = true; - } else { - schema.defaultValue = "#9E9E9E"; - } - return schema -}; - -const ColorSchema = new SimpleSchema({ - color: getColorSchema(), + optional: true, + }, }); export default ColorSchema; -export { getColorSchema }; diff --git a/app/imports/api/mixins/setDocToLastMixin.js b/app/imports/api/mixins/setDocToLastMixin.js index 1b31b90d..db056d9b 100644 --- a/app/imports/api/mixins/setDocToLastMixin.js +++ b/app/imports/api/mixins/setDocToLastMixin.js @@ -8,12 +8,12 @@ export function setDocToLastMixin(methodOptions){ if (methodOptions.validate){ throw new Meteor.Error(`setDocToLastMixin should come before simpleSchemaMixin`); } - methodOptions.schema.extend({ + methodOptions.schema = new SimpleSchema({ charId: { type: String, regEx: SimpleSchema.RegEx.Id, }, - }); + }).extend(methodOptions.schema); let collection = methodOptions.collection; if (!collection){ throw new Meteor.Error("`collection` required in method options for setDocToLastMixin"); diff --git a/app/imports/api/parenting/parenting.js b/app/imports/api/parenting/parenting.js index 88bba7f0..04fd6a4e 100644 --- a/app/imports/api/parenting/parenting.js +++ b/app/imports/api/parenting/parenting.js @@ -81,7 +81,7 @@ export function getAncestry({id, collection}){ }; // Ancestors is [...parent's ancestors, parent ref] - let ancestors = parentDoc.ancestors; + let ancestors = parentDoc.ancestors || []; ancestors.push(parent); return {parent, ancestors}; @@ -90,9 +90,10 @@ export function getAncestry({id, collection}){ export function setDocAncestryMixin(methodOptions){ // Extend the method's schema to require the needed properties // This mixin should come before simpleschema mixin - methodOptions.schema.extend({ + methodOptions.schema = new SimpleSchema({ parent: { type: Object, + optional: true, }, 'parent.id': { type: String, @@ -101,10 +102,14 @@ export function setDocAncestryMixin(methodOptions){ 'parent.collection': { type: String, }, - }); + }).extend(methodOptions.schema); // Change the doc's ancestry before running let runFunc = methodOptions.run; methodOptions.run = function(doc, ...rest){ + // If the doc's parent doesn't exist, set it to the character + if (!doc.parent && doc.charId) { + doc.parent = {id: doc.charId, collection: 'creatures'}; + } let {parent, ancestors} = getAncestry(doc.parent); doc.parent = parent; doc.ancestors = ancestors; @@ -137,12 +142,12 @@ function ensureAncestryContainsId(ancestors, id){ export function ensureAncestryContainsCharIdMixin(methodOptions){ // Extend the method's schema to require the needed properties // This mixin should come before simpleSchemaMixin - methodOptions.schema.extend({ + methodOptions.schema = new SimpleSchema({ charId: { type: String, regEx: SimpleSchema.RegEx.Id, }, - }); + }).extend(methodOptions.schema); let runFunc = methodOptions.run; methodOptions.run = function({charId, ancestors}){ ensureAncestryContainsId(ancestors, charId); diff --git a/app/imports/api/schema.js b/app/imports/api/schema.js index 4ec13855..de1f8fe9 100644 --- a/app/imports/api/schema.js +++ b/app/imports/api/schema.js @@ -1,7 +1,7 @@ import SimpleSchema from 'simpl-schema'; -function getDefaultSchema(){ - return new SimpleSchema({}, { +export default function schema(options){ + return new SimpleSchema(options, { clean: { filter: true, autoConvert: true, @@ -11,8 +11,4 @@ function getDefaultSchema(){ removeNullsFromArrays: true, }, }); -}; - -export default function schema(options){ - return getDefaultSchema().extend(options); -}; +} From 053a7a36a665aeed120be3534e4ca2ad571ac881 Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Mon, 1 Apr 2019 16:58:15 +0200 Subject: [PATCH 04/10] Began generalizing insert forms for character properties to reduce duplicated code --- app/imports/ui/character/FeaturesTab.vue | 2 +- .../ui/components/features/FeatureCard.vue | 20 ------ .../features/FeatureCreationDialog.vue | 71 +++++++------------ .../{FeatureEdit.vue => FeatureForm.vue} | 44 ++---------- .../properties/PropertyDialogContainer.vue | 42 +++++++++++ .../properties/PropertyInsertDialog.vue | 67 +++++++++++++++++ app/imports/ui/dialogStack/DialogBase.vue | 6 ++ app/imports/ui/dialogStack/DialogStack.vue | 7 +- app/package-lock.json | 62 ---------------- 9 files changed, 149 insertions(+), 172 deletions(-) rename app/imports/ui/components/features/{FeatureEdit.vue => FeatureForm.vue} (56%) create mode 100644 app/imports/ui/components/properties/PropertyDialogContainer.vue create mode 100644 app/imports/ui/components/properties/PropertyInsertDialog.vue diff --git a/app/imports/ui/character/FeaturesTab.vue b/app/imports/ui/character/FeaturesTab.vue index f05ca9f3..82a9b59b 100644 --- a/app/imports/ui/character/FeaturesTab.vue +++ b/app/imports/ui/character/FeaturesTab.vue @@ -60,7 +60,7 @@ callback(feature){ if (!feature) return; feature.charId = charId; - let featureId = insertFeature.call({feature}); + let featureId = insertFeature.call(feature); return featureId } }); diff --git a/app/imports/ui/components/features/FeatureCard.vue b/app/imports/ui/components/features/FeatureCard.vue index 94bf6085..a47cb459 100644 --- a/app/imports/ui/components/features/FeatureCard.vue +++ b/app/imports/ui/components/features/FeatureCard.vue @@ -15,23 +15,6 @@ {{description}} - - - - Use - - - Reset - - @@ -43,9 +26,6 @@ charId: String, name: String, description: String, - uses: Number, - used: Number, - reset: String, color: String, enabled: Boolean, alwaysEnabled: Boolean, diff --git a/app/imports/ui/components/features/FeatureCreationDialog.vue b/app/imports/ui/components/features/FeatureCreationDialog.vue index bfa31879..6a021aae 100644 --- a/app/imports/ui/components/features/FeatureCreationDialog.vue +++ b/app/imports/ui/components/features/FeatureCreationDialog.vue @@ -1,74 +1,51 @@ + + diff --git a/app/imports/ui/components/properties/PropertyInsertDialog.vue b/app/imports/ui/components/properties/PropertyInsertDialog.vue new file mode 100644 index 00000000..bf767eb9 --- /dev/null +++ b/app/imports/ui/components/properties/PropertyInsertDialog.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/app/imports/ui/dialogStack/DialogBase.vue b/app/imports/ui/dialogStack/DialogBase.vue index b8dc2586..400c8442 100644 --- a/app/imports/ui/dialogStack/DialogBase.vue +++ b/app/imports/ui/dialogStack/DialogBase.vue @@ -15,6 +15,11 @@ + @@ -37,6 +42,7 @@ export default { props: { color: String, + breadcrumbs: Object, }, data(){ return { offsetTop: 0, diff --git a/app/imports/ui/dialogStack/DialogStack.vue b/app/imports/ui/dialogStack/DialogStack.vue index 538e1817..d62c6e34 100644 --- a/app/imports/ui/dialogStack/DialogStack.vue +++ b/app/imports/ui/dialogStack/DialogStack.vue @@ -14,7 +14,6 @@ @enter="enter" @leave="leave" > -
- + + + @@ -168,7 +169,7 @@ e.preventDefault(); } }, - watch:{ + watch: { dialogs(newDialogs) { let el = document.documentElement; if (newDialogs.length) { diff --git a/app/package-lock.json b/app/package-lock.json index 367ddeae..73542f7e 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -1456,37 +1456,6 @@ "requires": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://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": { @@ -1499,37 +1468,6 @@ "readable-stream": "^2.3.3", "to-arraybuffer": "^1.0.0", "xtend": "^4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://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": { From 888a7ea5928a8a2853d78a4e78c4f8eaaf354fe4 Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Wed, 3 Apr 2019 10:27:11 +0200 Subject: [PATCH 05/10] Removed Bowerrc, nothing uses bower anymore --- app/.bowerrc | 1 - 1 file changed, 1 deletion(-) delete mode 100644 app/.bowerrc diff --git a/app/.bowerrc b/app/.bowerrc deleted file mode 100644 index 1ad2d4f1..00000000 --- a/app/.bowerrc +++ /dev/null @@ -1 +0,0 @@ -{"directory":"public/components/"} \ No newline at end of file From 28ffcc87b4ad0c741277e80913a448029a1ca63a Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Wed, 3 Apr 2019 10:28:04 +0200 Subject: [PATCH 06/10] updated package name --- app/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/package.json b/app/package.json index ba92bb35..278ceaea 100644 --- a/app/package.json +++ b/app/package.json @@ -1,5 +1,5 @@ { - "name": "rpg-docs", + "name": "dicecloud", "version": "0.10.0", "description": "Unofficial Online Realtime D&D 5e App", "license": "GPL-3.0", From 681e669e7628315ce49cd5e784be61538b00d2ae Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Wed, 3 Apr 2019 12:38:01 +0200 Subject: [PATCH 07/10] Refactored schemas to make properties all implicitely children --- .../api/creature/properties/Actions.js | 2 -- .../api/creature/properties/Attributes.js | 4 +-- app/imports/api/creature/properties/Buffs.js | 2 -- .../api/creature/properties/ClassLevels.js | 2 -- .../api/creature/properties/Classes.js | 2 -- .../creature/properties/DamageMultipliers.js | 2 -- .../api/creature/properties/Effects.js | 4 +-- .../api/creature/properties/Experiences.js | 2 +- .../api/creature/properties/Features.js | 14 +++------- .../api/creature/properties/Folders.js | 5 ++-- .../api/creature/properties/Proficiencies.js | 2 -- app/imports/api/creature/properties/Rolls.js | 2 -- app/imports/api/creature/properties/Skills.js | 2 -- .../api/creature/properties/SpellLists.js | 2 -- app/imports/api/creature/properties/Spells.js | 2 -- .../properties/propertyUpdateMethods.js | 6 ++--- .../api/creature/subSchemas/PropertySchema.js | 10 ++++--- app/imports/api/mixins/updateSchemaMixin.js | 7 +++-- app/imports/api/parenting/ChildSchema.js | 27 ++++++++++--------- 19 files changed, 37 insertions(+), 62 deletions(-) diff --git a/app/imports/api/creature/properties/Actions.js b/app/imports/api/creature/properties/Actions.js index f86b9129..6df2c72a 100644 --- a/app/imports/api/creature/properties/Actions.js +++ b/app/imports/api/creature/properties/Actions.js @@ -3,7 +3,6 @@ import schema from '/imports/api/schema.js'; import AdjustmentSchema from '/imports/api/creature/subSchemas/AdjustmentSchema.js'; import StoredBuffSchema from '/imports/api/creature/properties/Buffs.js'; import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; -import ChildSchema from '/imports/api/parenting/ChildSchema.js'; import ColorSchema from '/imports/api/creature/subSchemas/ColorSchema.js'; // Mixins @@ -92,7 +91,6 @@ ActionSchema.extend(ColorSchema); Actions.attachSchema(ActionSchema); Actions.attachSchema(PropertySchema); -Actions.attachSchema(ChildSchema); const insertAction = new ValidatedMethod({ name: 'Actions.methods.insert', diff --git a/app/imports/api/creature/properties/Attributes.js b/app/imports/api/creature/properties/Attributes.js index 076ec855..530b0ad5 100644 --- a/app/imports/api/creature/properties/Attributes.js +++ b/app/imports/api/creature/properties/Attributes.js @@ -1,5 +1,4 @@ import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; -import ChildSchema from '/imports/api/parenting/ChildSchema.js'; import ColorSchema from '/imports/api/creature/subSchemas/ColorSchema.js'; import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; @@ -93,9 +92,8 @@ const ComputedAttributeSchema = schema({ }, }).extend(AttributeSchema); -Attributes.attachSchema(PropertySchema); Attributes.attachSchema(ComputedAttributeSchema); -Attributes.attachSchema(ChildSchema); +Attributes.attachSchema(PropertySchema); const insertAttribute = new ValidatedMethod({ name: 'Attributes.methods.insert', diff --git a/app/imports/api/creature/properties/Buffs.js b/app/imports/api/creature/properties/Buffs.js index 3ac52d3c..bfdcdaea 100644 --- a/app/imports/api/creature/properties/Buffs.js +++ b/app/imports/api/creature/properties/Buffs.js @@ -1,7 +1,6 @@ import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; -import ChildSchema from '/imports/api/parenting/ChildSchema.js'; import { EffectSchema } from '/imports/api/creature/properties/Effects.js'; // Mixins @@ -79,7 +78,6 @@ let AppliedBuffSchema = schema({ Buffs.attachSchema(AppliedBuffSchema); Buffs.attachSchema(PropertySchema); -Buffs.attachSchema(ChildSchema); const insertBuff = new ValidatedMethod({ name: 'Buffs.methods.insert', diff --git a/app/imports/api/creature/properties/ClassLevels.js b/app/imports/api/creature/properties/ClassLevels.js index f3aa70f9..09cc2422 100644 --- a/app/imports/api/creature/properties/ClassLevels.js +++ b/app/imports/api/creature/properties/ClassLevels.js @@ -1,7 +1,6 @@ import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; -import ChildSchema from '/imports/api/parenting/ChildSchema.js'; import VARIABLE_NAME_REGEX from '/imports/constants/VARIABLE_NAME_REGEX.js'; // Mixins @@ -48,7 +47,6 @@ let ClassLevelSchema = schema({ ClassLevels.attachSchema(ClassLevelSchema); ClassLevels.attachSchema(PropertySchema); -ClassLevels.attachSchema(ChildSchema); // Todo ensure the class level is being parented to a compatible class, and that // previous level requirements are met diff --git a/app/imports/api/creature/properties/Classes.js b/app/imports/api/creature/properties/Classes.js index adcafbf2..60174f71 100644 --- a/app/imports/api/creature/properties/Classes.js +++ b/app/imports/api/creature/properties/Classes.js @@ -1,7 +1,6 @@ import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; -import ChildSchema from '/imports/api/parenting/ChildSchema.js'; import ColorSchema from "/imports/api/creature/subSchemas/ColorSchema.js"; import VARIABLE_NAME_REGEX from '/imports/constants/VARIABLE_NAME_REGEX.js'; @@ -31,7 +30,6 @@ ClassSchema.extend(ColorSchema); Classes.attachSchema(ClassSchema); Classes.attachSchema(PropertySchema); -Classes.attachSchema(ChildSchema); const insertClass = new ValidatedMethod({ name: 'Classes.methods.insert', diff --git a/app/imports/api/creature/properties/DamageMultipliers.js b/app/imports/api/creature/properties/DamageMultipliers.js index 627feaac..9330d658 100644 --- a/app/imports/api/creature/properties/DamageMultipliers.js +++ b/app/imports/api/creature/properties/DamageMultipliers.js @@ -1,7 +1,6 @@ import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; -import ChildSchema from '/imports/api/parenting/ChildSchema.js'; import DAMAGE_TYPES from '/imports/constants/DAMAGE_TYPES.js'; // Mixins @@ -39,7 +38,6 @@ let DamageMultiplierSchema = schema({ DamageMultipliers.attachSchema(DamageMultiplierSchema); DamageMultipliers.attachSchema(PropertySchema); -DamageMultipliers.attachSchema(ChildSchema); const insertDamageMultiplier = new ValidatedMethod({ name: 'DamageMultipliers.methods.insert', diff --git a/app/imports/api/creature/properties/Effects.js b/app/imports/api/creature/properties/Effects.js index 387f198d..7ebf1170 100644 --- a/app/imports/api/creature/properties/Effects.js +++ b/app/imports/api/creature/properties/Effects.js @@ -1,7 +1,6 @@ import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; -import ChildSchema from '/imports/api/parenting/ChildSchema.js'; // Mixins import recomputeCreatureMixin from '/imports/api/mixins/recomputeCreatureMixin.js'; @@ -58,9 +57,8 @@ const EffectComputedSchema = new SimpleSchema({ }, }).extend(EffectSchema); -Effects.attachSchema(PropertySchema); -Effects.attachSchema(ChildSchema); Effects.attachSchema(EffectComputedSchema); +Effects.attachSchema(PropertySchema); const insertEffect = new ValidatedMethod({ name: 'Effects.methods.insert', diff --git a/app/imports/api/creature/properties/Experiences.js b/app/imports/api/creature/properties/Experiences.js index 4f7ff4da..27985fef 100644 --- a/app/imports/api/creature/properties/Experiences.js +++ b/app/imports/api/creature/properties/Experiences.js @@ -48,8 +48,8 @@ let ExperienceSchema = schema({ }, }); -Experiences.attachSchema(PropertySchema); Experiences.attachSchema(ExperienceSchema); +Experiences.attachSchema(PropertySchema); const insertExperience = new ValidatedMethod({ name: 'Experiences.methods.insert', diff --git a/app/imports/api/creature/properties/Features.js b/app/imports/api/creature/properties/Features.js index dce84077..a31b73fa 100644 --- a/app/imports/api/creature/properties/Features.js +++ b/app/imports/api/creature/properties/Features.js @@ -1,10 +1,6 @@ import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; -import { assertEditPermission } from '/imports/api/creature/creaturePermissions.js'; -import { recomputeCreatureById } from '/imports/api/creature/creatureComputation.js' -import { getHighestOrder } from '/imports/api/order/order.js'; import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; -import ChildSchema from '/imports/api/parenting/ChildSchema.js'; import ColorSchema from '/imports/api/creature/subSchemas/ColorSchema.js'; // Mixins @@ -38,12 +34,8 @@ let FeatureSchema = new SimpleSchema({ FeatureSchema.extend(ColorSchema); -Features.attachSchema( - schema(FeatureSchema) - .extend(PropertySchema) - .extend(ChildSchema) -); - +Features.attachSchema(FeatureSchema); +Features.attachSchema(PropertySchema); const insertFeature = new ValidatedMethod({ name: 'Features.methods.insert', @@ -65,8 +57,8 @@ const insertFeature = new ValidatedMethod({ const updateFeature = new ValidatedMethod({ name: 'Features.methods.update', mixins: [ + updateSchemaMixin, propagateInheritanceUpdateMixin, - updateSchemaMixin, creaturePermissionMixin, ], collection: Features, diff --git a/app/imports/api/creature/properties/Folders.js b/app/imports/api/creature/properties/Folders.js index b33a0b26..5538d1dd 100644 --- a/app/imports/api/creature/properties/Folders.js +++ b/app/imports/api/creature/properties/Folders.js @@ -1,7 +1,6 @@ import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; -import ChildSchema from '/imports/api/parenting/ChildSchema.js'; // Mixins import creaturePermissionMixin from '/imports/api/mixins/creaturePermissionMixin.js'; @@ -24,10 +23,10 @@ let FolderSchema = schema({ type: Boolean, defaultValue: true, }, -}).extend(PropertySchema); +}); Folders.attachSchema(FolderSchema); -Folders.attachSchema(ChildSchema); +Folders.attachSchema(PropertySchema); const insertFolder = new ValidatedMethod({ name: 'Folders.methods.insert', diff --git a/app/imports/api/creature/properties/Proficiencies.js b/app/imports/api/creature/properties/Proficiencies.js index 5770ea23..615743a0 100644 --- a/app/imports/api/creature/properties/Proficiencies.js +++ b/app/imports/api/creature/properties/Proficiencies.js @@ -1,7 +1,6 @@ import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; -import ChildSchema from '/imports/api/parenting/ChildSchema.js'; // Mixins import recomputeCreatureMixin from '/imports/api/mixins/recomputeCreatureMixin.js'; @@ -34,7 +33,6 @@ let ProficiencySchema = schema({ Proficiencies.attachSchema(ProficiencySchema); Proficiencies.attachSchema(PropertySchema); -Proficiencies.attachSchema(ChildSchema); const insertProficiency = new ValidatedMethod({ name: 'Proficiencies.methods.insert', diff --git a/app/imports/api/creature/properties/Rolls.js b/app/imports/api/creature/properties/Rolls.js index 75d5067f..6a53a3f1 100644 --- a/app/imports/api/creature/properties/Rolls.js +++ b/app/imports/api/creature/properties/Rolls.js @@ -1,6 +1,5 @@ import SimpleSchema from 'simpl-schema'; import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; -import ChildSchema from '/imports/api/parenting/ChildSchema.js'; import AdjustmentSchema from '/imports/api/creature/subSchemas/AdjustmentSchema.js'; import StoredBuffSchema from '/imports/api/creature/properties/Buffs.js'; @@ -95,7 +94,6 @@ let RollSchema = new SimpleSchema({ Rolls.attachSchema(RollSchema); Rolls.attachSchema(PropertySchema); -Rolls.attachSchema(ChildSchema); const insertRoll = new ValidatedMethod({ name: 'Rolls.methods.insert', diff --git a/app/imports/api/creature/properties/Skills.js b/app/imports/api/creature/properties/Skills.js index e117da53..086e44f0 100644 --- a/app/imports/api/creature/properties/Skills.js +++ b/app/imports/api/creature/properties/Skills.js @@ -1,7 +1,6 @@ import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; -import ChildSchema from '/imports/api/parenting/ChildSchema.js'; import ColorSchema from '/imports/api/creature/subSchemas/ColorSchema.js'; // Mixins @@ -103,7 +102,6 @@ let ComputedSkillSchema = schema({ Skills.attachSchema(ComputedSkillSchema); Skills.attachSchema(PropertySchema); -Skills.attachSchema(ChildSchema); const insertSkill = new ValidatedMethod({ name: 'Skills.methods.insert', diff --git a/app/imports/api/creature/properties/SpellLists.js b/app/imports/api/creature/properties/SpellLists.js index ed104b4b..20f58ad8 100644 --- a/app/imports/api/creature/properties/SpellLists.js +++ b/app/imports/api/creature/properties/SpellLists.js @@ -2,7 +2,6 @@ import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; import ColorSchema from "/imports/api/creature/subSchemas/ColorSchema.js"; import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; -import ChildSchema from '/imports/api/parenting/ChildSchema.js'; // Mixins import creaturePermissionMixin from '/imports/api/mixins/creaturePermissionMixin.js'; @@ -44,7 +43,6 @@ SpellListSchema.extend(ColorSchema); SpellLists.attachSchema(SpellListSchema); SpellLists.attachSchema(PropertySchema); -SpellLists.attachSchema(ChildSchema); const insertSpellList = new ValidatedMethod({ name: 'SpellLists.methods.insert', diff --git a/app/imports/api/creature/properties/Spells.js b/app/imports/api/creature/properties/Spells.js index 7bdd1080..be4f061e 100644 --- a/app/imports/api/creature/properties/Spells.js +++ b/app/imports/api/creature/properties/Spells.js @@ -2,7 +2,6 @@ import ColorSchema from '/imports/api/creature/subSchemas/ColorSchema.js'; import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; -import ChildSchema from '/imports/api/parenting/ChildSchema.js'; // Mixins import creaturePermissionMixin from '/imports/api/mixins/creaturePermissionMixin.js'; @@ -95,7 +94,6 @@ SpellSchema.extend(ColorSchema); Spells.attachSchema(SpellSchema); Spells.attachSchema(PropertySchema); -Spells.attachSchema(ChildSchema); const insertSpell = new ValidatedMethod({ name: 'Spells.methods.insert', diff --git a/app/imports/api/creature/properties/propertyUpdateMethods.js b/app/imports/api/creature/properties/propertyUpdateMethods.js index c66cd043..a8f353b0 100644 --- a/app/imports/api/creature/properties/propertyUpdateMethods.js +++ b/app/imports/api/creature/properties/propertyUpdateMethods.js @@ -1,9 +1,9 @@ import updateAction from '/imports/api/creature/properties/Actions.js'; import updateAttribute from '/imports/api/creature/properties/Attributes.js'; -import updateBuff from '/imports/api/creature/properties/Buff.js'; +import updateBuff from '/imports/api/creature/properties/Buffs.js'; import updateClass from '/imports/api/creature/properties/Classes.js'; import updateClassLevel from '/imports/api/creature/properties/ClassLevels.js'; -import updateDamageMiliplier from '/imports/api/creature/properties/DamageMilipliers.js'; +import updateDamageMultiplier from '/imports/api/creature/properties/DamageMultipliers.js'; import updateEffect from '/imports/api/creature/properties/Effects.js'; import updateExperience from '/imports/api/creature/properties/Experiences.js'; import updateFeature from '/imports/api/creature/properties/Features.js'; @@ -21,7 +21,7 @@ export default Object.freeze({ buffs: updateBuff, classs: updateClass, classLevels: updateClassLevel, - damageMilipliers: updateDamageMiliplier, + damageMultipliers: updateDamageMultiplier, effects: updateEffect, experiences: updateExperience, features: updateFeature, diff --git a/app/imports/api/creature/subSchemas/PropertySchema.js b/app/imports/api/creature/subSchemas/PropertySchema.js index c1126787..2adc7066 100644 --- a/app/imports/api/creature/subSchemas/PropertySchema.js +++ b/app/imports/api/creature/subSchemas/PropertySchema.js @@ -1,5 +1,6 @@ import SimpleSchema from 'simpl-schema'; import SoftRemovableSchema from '/imports/api/parenting/SoftRemovableSchema.js'; +import ChildSchema from '/imports/api/parenting/ChildSchema.js'; const PropertySchema = new SimpleSchema({ charId: { @@ -8,14 +9,14 @@ const PropertySchema = new SimpleSchema({ index: 1, optional: true, }, + name: { + type: String, + optional: true, + }, enabled: { type: Boolean, defaultValue: true, }, - name: { - type: String, - optional: true, - }, order: { type: SimpleSchema.Integer, index: true, @@ -23,5 +24,6 @@ const PropertySchema = new SimpleSchema({ }); PropertySchema.extend(SoftRemovableSchema); +PropertySchema.extend(ChildSchema); export default PropertySchema; diff --git a/app/imports/api/mixins/updateSchemaMixin.js b/app/imports/api/mixins/updateSchemaMixin.js index c62ff9a8..9f6d52b5 100644 --- a/app/imports/api/mixins/updateSchemaMixin.js +++ b/app/imports/api/mixins/updateSchemaMixin.js @@ -51,13 +51,16 @@ export default function updateSchemaMixin(methodOptions) { // Set up the new validation methodOptions.validate = function(args){ argumentSchema.validate(args); - updateSchema.validate(args.update, methodOptions.schemaValidatorOptions); + updateSchema.validate( + {$set: args.update}, + methodOptions.schemaValidatorOptions + ); }; // Give a default run function if one isn't supplied if (!methodOptions.run){ methodOptions.run = function({_id, update}){ - return MethodOptions.collection.update(_id, {$set: update}); + return methodOptions.collection.update(_id, {$set: update}); }; } return methodOptions; diff --git a/app/imports/api/parenting/ChildSchema.js b/app/imports/api/parenting/ChildSchema.js index 10500921..badd8219 100644 --- a/app/imports/api/parenting/ChildSchema.js +++ b/app/imports/api/parenting/ChildSchema.js @@ -1,15 +1,7 @@ import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; -const RefSchema = new SimpleSchema({ - id: { - type: String, - regEx: SimpleSchema.RegEx.Id, - index: 1 - }, - collection: { - type: String - }, +const inhertitedFieldsSchema = new SimpleSchema({ name: { type: String, optional: true, @@ -21,6 +13,19 @@ const RefSchema = new SimpleSchema({ }, }); +const RefSchema = new SimpleSchema({ + id: { + type: String, + regEx: SimpleSchema.RegEx.Id, + index: 1 + }, + collection: { + type: String + }, +}); + +RefSchema.extend(inhertitedFieldsSchema); + let ChildSchema = schema({ parent: { type: RefSchema, @@ -35,9 +40,7 @@ let ChildSchema = schema({ }, }); -const inheritedFields = new Set(RefSchema.objectKeys()); -inheritedFields.delete('id'); -inheritedFields.delete('collection'); +const inheritedFields = new Set(inhertitedFieldsSchema.objectKeys()); export default ChildSchema; export { inheritedFields }; From 021a53ef36c77613495711d219cfc99d755ffb04 Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Wed, 3 Apr 2019 16:50:12 +0200 Subject: [PATCH 08/10] Moved properties schema, added 'removeProperty' method --- .../api/creature/properties/Actions.js | 2 +- .../api/creature/properties/Attributes.js | 2 +- app/imports/api/creature/properties/Buffs.js | 2 +- .../api/creature/properties/ClassLevels.js | 2 +- .../api/creature/properties/Classes.js | 2 +- .../creature/properties/DamageMultipliers.js | 2 +- .../api/creature/properties/Effects.js | 2 +- .../api/creature/properties/Experiences.js | 2 +- .../api/creature/properties/Features.js | 2 +- .../api/creature/properties/Folders.js | 2 +- app/imports/api/creature/properties/Notes.js | 2 +- .../api/creature/properties/Proficiencies.js | 2 +- .../api/creature/properties/Properties.js | 64 +++++++++++++++++++ app/imports/api/creature/properties/Rolls.js | 2 +- app/imports/api/creature/properties/Skills.js | 2 +- .../api/creature/properties/SpellLists.js | 2 +- app/imports/api/creature/properties/Spells.js | 2 +- .../properties/propertyUpdateMethods.js | 35 ---------- .../api/creature/subSchemas/PropertySchema.js | 29 --------- app/imports/api/inventory/Containers.js | 2 +- app/imports/api/inventory/Items.js | 2 +- app/imports/api/parenting/softRemove.js | 18 +++--- 22 files changed, 91 insertions(+), 91 deletions(-) create mode 100644 app/imports/api/creature/properties/Properties.js delete mode 100644 app/imports/api/creature/properties/propertyUpdateMethods.js delete mode 100644 app/imports/api/creature/subSchemas/PropertySchema.js diff --git a/app/imports/api/creature/properties/Actions.js b/app/imports/api/creature/properties/Actions.js index 6df2c72a..409c9459 100644 --- a/app/imports/api/creature/properties/Actions.js +++ b/app/imports/api/creature/properties/Actions.js @@ -2,7 +2,7 @@ import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; import AdjustmentSchema from '/imports/api/creature/subSchemas/AdjustmentSchema.js'; import StoredBuffSchema from '/imports/api/creature/properties/Buffs.js'; -import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; +import { PropertySchema } from '/imports/api/creature/properties/Properties.js' import ColorSchema from '/imports/api/creature/subSchemas/ColorSchema.js'; // Mixins diff --git a/app/imports/api/creature/properties/Attributes.js b/app/imports/api/creature/properties/Attributes.js index 530b0ad5..75619fe4 100644 --- a/app/imports/api/creature/properties/Attributes.js +++ b/app/imports/api/creature/properties/Attributes.js @@ -1,4 +1,4 @@ -import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; +import { PropertySchema } from '/imports/api/creature/properties/Properties.js' import ColorSchema from '/imports/api/creature/subSchemas/ColorSchema.js'; import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; diff --git a/app/imports/api/creature/properties/Buffs.js b/app/imports/api/creature/properties/Buffs.js index bfdcdaea..29359715 100644 --- a/app/imports/api/creature/properties/Buffs.js +++ b/app/imports/api/creature/properties/Buffs.js @@ -1,6 +1,6 @@ import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; -import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; +import { PropertySchema } from '/imports/api/creature/properties/Properties.js' import { EffectSchema } from '/imports/api/creature/properties/Effects.js'; // Mixins diff --git a/app/imports/api/creature/properties/ClassLevels.js b/app/imports/api/creature/properties/ClassLevels.js index 09cc2422..b9aa42d2 100644 --- a/app/imports/api/creature/properties/ClassLevels.js +++ b/app/imports/api/creature/properties/ClassLevels.js @@ -1,6 +1,6 @@ import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; -import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; +import { PropertySchema } from '/imports/api/creature/properties/Properties.js' import VARIABLE_NAME_REGEX from '/imports/constants/VARIABLE_NAME_REGEX.js'; // Mixins diff --git a/app/imports/api/creature/properties/Classes.js b/app/imports/api/creature/properties/Classes.js index 60174f71..7f12f41a 100644 --- a/app/imports/api/creature/properties/Classes.js +++ b/app/imports/api/creature/properties/Classes.js @@ -1,6 +1,6 @@ import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; -import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; +import { PropertySchema } from '/imports/api/creature/properties/Properties.js' import ColorSchema from "/imports/api/creature/subSchemas/ColorSchema.js"; import VARIABLE_NAME_REGEX from '/imports/constants/VARIABLE_NAME_REGEX.js'; diff --git a/app/imports/api/creature/properties/DamageMultipliers.js b/app/imports/api/creature/properties/DamageMultipliers.js index 9330d658..24badb1a 100644 --- a/app/imports/api/creature/properties/DamageMultipliers.js +++ b/app/imports/api/creature/properties/DamageMultipliers.js @@ -1,6 +1,6 @@ import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; -import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; +import { PropertySchema } from '/imports/api/creature/properties/Properties.js' import DAMAGE_TYPES from '/imports/constants/DAMAGE_TYPES.js'; // Mixins diff --git a/app/imports/api/creature/properties/Effects.js b/app/imports/api/creature/properties/Effects.js index 7ebf1170..81118182 100644 --- a/app/imports/api/creature/properties/Effects.js +++ b/app/imports/api/creature/properties/Effects.js @@ -1,6 +1,6 @@ import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; -import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; +import { PropertySchema } from '/imports/api/creature/properties/Properties.js' // Mixins import recomputeCreatureMixin from '/imports/api/mixins/recomputeCreatureMixin.js'; diff --git a/app/imports/api/creature/properties/Experiences.js b/app/imports/api/creature/properties/Experiences.js index 27985fef..9c9937b5 100644 --- a/app/imports/api/creature/properties/Experiences.js +++ b/app/imports/api/creature/properties/Experiences.js @@ -1,6 +1,6 @@ import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; -import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; +import { PropertySchema } from '/imports/api/creature/properties/Properties.js' import recomputeCreatureXP from '/imports/api/creature/creatureComputation.js'; // Mixins diff --git a/app/imports/api/creature/properties/Features.js b/app/imports/api/creature/properties/Features.js index a31b73fa..2c2ffa2e 100644 --- a/app/imports/api/creature/properties/Features.js +++ b/app/imports/api/creature/properties/Features.js @@ -1,6 +1,6 @@ import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; -import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; +import { PropertySchema } from '/imports/api/creature/properties/Properties.js' import ColorSchema from '/imports/api/creature/subSchemas/ColorSchema.js'; // Mixins diff --git a/app/imports/api/creature/properties/Folders.js b/app/imports/api/creature/properties/Folders.js index 5538d1dd..3fb32e40 100644 --- a/app/imports/api/creature/properties/Folders.js +++ b/app/imports/api/creature/properties/Folders.js @@ -1,6 +1,6 @@ import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; -import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; +import { PropertySchema } from '/imports/api/creature/properties/Properties.js' // Mixins import creaturePermissionMixin from '/imports/api/mixins/creaturePermissionMixin.js'; diff --git a/app/imports/api/creature/properties/Notes.js b/app/imports/api/creature/properties/Notes.js index f98cfd22..f2070aa2 100644 --- a/app/imports/api/creature/properties/Notes.js +++ b/app/imports/api/creature/properties/Notes.js @@ -1,7 +1,7 @@ import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; import ColorSchema from "/imports/api/creature/subSchemas/ColorSchema.js"; -import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; +import { PropertySchema } from '/imports/api/creature/properties/Properties.js' // Mixins import creaturePermissionMixin from '/imports/api/mixins/creaturePermissionMixin.js'; diff --git a/app/imports/api/creature/properties/Proficiencies.js b/app/imports/api/creature/properties/Proficiencies.js index 615743a0..a50d3a42 100644 --- a/app/imports/api/creature/properties/Proficiencies.js +++ b/app/imports/api/creature/properties/Proficiencies.js @@ -1,6 +1,6 @@ import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; -import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; +import { PropertySchema } from '/imports/api/creature/properties/Properties.js' // Mixins import recomputeCreatureMixin from '/imports/api/mixins/recomputeCreatureMixin.js'; diff --git a/app/imports/api/creature/properties/Properties.js b/app/imports/api/creature/properties/Properties.js new file mode 100644 index 00000000..f10afc30 --- /dev/null +++ b/app/imports/api/creature/properties/Properties.js @@ -0,0 +1,64 @@ +import SimpleSchema from 'simpl-schema'; +import SoftRemovableSchema from '/imports/api/parenting/SoftRemovableSchema.js'; +import ChildSchema from '/imports/api/parenting/ChildSchema.js'; +import softRemove from '/imports/api/parenting/softRemove.js'; +import getCollectionByName from '/imports/api/parenting/getCollectionByName.js'; + +// Mixins +import recomputeCreatureMixin from '/imports/api/mixins/recomputeCreatureMixin.js'; +import creaturePermissionMixin from '/imports/api/mixins/creaturePermissionMixin.js'; +import simpleSchemaMixin from '/imports/api/mixins/simpleSchemaMixin.js'; + +const PropertySchema = new SimpleSchema({ + charId: { + type: String, + regEx: SimpleSchema.RegEx.Id, + index: 1, + optional: true, + }, + name: { + type: String, + optional: true, + }, + enabled: { + type: Boolean, + defaultValue: true, + }, + order: { + type: SimpleSchema.Integer, + index: true, + }, +}); + +PropertySchema.extend(SoftRemovableSchema); +PropertySchema.extend(ChildSchema); + +// Always recomputes the character, because we don't know the extent of the tree +// that was removed with this document +const softRemoveProperty = new ValidatedMethod({ + name: 'softRemoveProperty', + mixins: [ + simpleSchemaMixin, + recomputeCreatureMixin, + creaturePermissionMixin, + ], + getCharId({_id, collection}){ + let col = getCollectionByName(collection); + let doc = col.findOne(_id, {fields: {charId: 1}}); + if (!doc || !doc.charId){ + throw new Meteor.Error(`Could not find charId of ${_id} in ${collection}`); + } else { + return doc.charId; + } + }, + permission: 'edit', + schema: new SimpleSchema({ + _id: SimpleSchema.RegEx.Id, + collection: String, + }), + run({_id, collection}){ + softRemove({_id, collection}); + }, +}); + +export { PropertySchema, softRemoveProperty }; diff --git a/app/imports/api/creature/properties/Rolls.js b/app/imports/api/creature/properties/Rolls.js index 6a53a3f1..2d498300 100644 --- a/app/imports/api/creature/properties/Rolls.js +++ b/app/imports/api/creature/properties/Rolls.js @@ -1,5 +1,5 @@ import SimpleSchema from 'simpl-schema'; -import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; +import { PropertySchema } from '/imports/api/creature/properties/Properties.js' import AdjustmentSchema from '/imports/api/creature/subSchemas/AdjustmentSchema.js'; import StoredBuffSchema from '/imports/api/creature/properties/Buffs.js'; diff --git a/app/imports/api/creature/properties/Skills.js b/app/imports/api/creature/properties/Skills.js index 086e44f0..7a1404af 100644 --- a/app/imports/api/creature/properties/Skills.js +++ b/app/imports/api/creature/properties/Skills.js @@ -1,6 +1,6 @@ import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; -import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; +import { PropertySchema } from '/imports/api/creature/properties/Properties.js' import ColorSchema from '/imports/api/creature/subSchemas/ColorSchema.js'; // Mixins diff --git a/app/imports/api/creature/properties/SpellLists.js b/app/imports/api/creature/properties/SpellLists.js index 20f58ad8..b5f8a5d9 100644 --- a/app/imports/api/creature/properties/SpellLists.js +++ b/app/imports/api/creature/properties/SpellLists.js @@ -1,7 +1,7 @@ import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; import ColorSchema from "/imports/api/creature/subSchemas/ColorSchema.js"; -import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; +import { PropertySchema } from '/imports/api/creature/properties/Properties.js' // Mixins import creaturePermissionMixin from '/imports/api/mixins/creaturePermissionMixin.js'; diff --git a/app/imports/api/creature/properties/Spells.js b/app/imports/api/creature/properties/Spells.js index be4f061e..8290fc0d 100644 --- a/app/imports/api/creature/properties/Spells.js +++ b/app/imports/api/creature/properties/Spells.js @@ -1,7 +1,7 @@ import ColorSchema from '/imports/api/creature/subSchemas/ColorSchema.js'; import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; -import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; +import { PropertySchema } from '/imports/api/creature/properties/Properties.js' // Mixins import creaturePermissionMixin from '/imports/api/mixins/creaturePermissionMixin.js'; diff --git a/app/imports/api/creature/properties/propertyUpdateMethods.js b/app/imports/api/creature/properties/propertyUpdateMethods.js deleted file mode 100644 index a8f353b0..00000000 --- a/app/imports/api/creature/properties/propertyUpdateMethods.js +++ /dev/null @@ -1,35 +0,0 @@ -import updateAction from '/imports/api/creature/properties/Actions.js'; -import updateAttribute from '/imports/api/creature/properties/Attributes.js'; -import updateBuff from '/imports/api/creature/properties/Buffs.js'; -import updateClass from '/imports/api/creature/properties/Classes.js'; -import updateClassLevel from '/imports/api/creature/properties/ClassLevels.js'; -import updateDamageMultiplier from '/imports/api/creature/properties/DamageMultipliers.js'; -import updateEffect from '/imports/api/creature/properties/Effects.js'; -import updateExperience from '/imports/api/creature/properties/Experiences.js'; -import updateFeature from '/imports/api/creature/properties/Features.js'; -import updateFolder from '/imports/api/creature/properties/Folders.js'; -import updateNote from '/imports/api/creature/properties/Notes.js'; -import updateProficiency from '/imports/api/creature/properties/Proficiencies.js'; -import updateRoll from '/imports/api/creature/properties/Rolls.js'; -import updateSkill from '/imports/api/creature/properties/Skills.js'; -import updateSpellList from '/imports/api/creature/properties/SpellLists.js'; -import updateSpell from '/imports/api/creature/properties/Spells.js'; - -export default Object.freeze({ - actions: updateAction, - attributes: updateAttribute, - buffs: updateBuff, - classs: updateClass, - classLevels: updateClassLevel, - damageMultipliers: updateDamageMultiplier, - effects: updateEffect, - experiences: updateExperience, - features: updateFeature, - folders: updateFolder, - notes: updateNote, - proficienciess: updateProficiency, - rolls: updateRoll, - skills: updateSkill, - spellLists: updateSpellList, - spells: updateSpell, -}); diff --git a/app/imports/api/creature/subSchemas/PropertySchema.js b/app/imports/api/creature/subSchemas/PropertySchema.js deleted file mode 100644 index 2adc7066..00000000 --- a/app/imports/api/creature/subSchemas/PropertySchema.js +++ /dev/null @@ -1,29 +0,0 @@ -import SimpleSchema from 'simpl-schema'; -import SoftRemovableSchema from '/imports/api/parenting/SoftRemovableSchema.js'; -import ChildSchema from '/imports/api/parenting/ChildSchema.js'; - -const PropertySchema = new SimpleSchema({ - charId: { - type: String, - regEx: SimpleSchema.RegEx.Id, - index: 1, - optional: true, - }, - name: { - type: String, - optional: true, - }, - enabled: { - type: Boolean, - defaultValue: true, - }, - order: { - type: SimpleSchema.Integer, - index: true, - }, -}); - -PropertySchema.extend(SoftRemovableSchema); -PropertySchema.extend(ChildSchema); - -export default PropertySchema; diff --git a/app/imports/api/inventory/Containers.js b/app/imports/api/inventory/Containers.js index 98ac4bf5..efd13b41 100644 --- a/app/imports/api/inventory/Containers.js +++ b/app/imports/api/inventory/Containers.js @@ -1,7 +1,7 @@ import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; import ColorSchema from "/imports/api/creature/subSchemas/ColorSchema.js"; -import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; +import { PropertySchema } from '/imports/api/creature/properties/Properties.js' import ChildSchema from '/imports/api/parenting/ChildSchema.js'; //set up the collection for containers diff --git a/app/imports/api/inventory/Items.js b/app/imports/api/inventory/Items.js index c704b942..a87291f1 100644 --- a/app/imports/api/inventory/Items.js +++ b/app/imports/api/inventory/Items.js @@ -1,7 +1,7 @@ import SimpleSchema from 'simpl-schema'; import schema from '/imports/api/schema.js'; import ColorSchema from "/imports/api/creature/subSchemas/ColorSchema.js"; -import PropertySchema from '/imports/api/creature/subSchemas/PropertySchema.js'; +import { PropertySchema } from '/imports/api/creature/properties/Properties.js' import ChildSchema from '/imports/api/parenting/ChildSchema.js'; Items = new Mongo.Collection("items"); diff --git a/app/imports/api/parenting/softRemove.js b/app/imports/api/parenting/softRemove.js index a64053de..71eb3b18 100644 --- a/app/imports/api/parenting/softRemove.js +++ b/app/imports/api/parenting/softRemove.js @@ -2,11 +2,11 @@ import getCollectionByName from '/imports/api/parenting/getCollectionByName.js'; import updateDecendents from '/imports/api/parenting/parenting.js'; // 1 + n database hits -export function softRemove({id, collection}){ +export function softRemove({_id, collection}){ let removalDate = new Date(); // Remove this document collection = getCollectionByName(collection); - collection.update(id, {$set: { + collection.update(_id, {$set: { removed: true, removedAt: removalDate, }, $unset: { @@ -15,15 +15,15 @@ export function softRemove({id, collection}){ // Remove all the decendents that have not yet been removed, and set them to be // removed with this document updateDecendents({ - ancestorId: id, + ancestorId: _id, filter: {removed: {$ne: true}}, modifier: {$set: { removed: true, removedAt: removalDate, - removedWith: id, + removedWith: _id, }}, }); -}; +} const restoreError = function(){ throw new Meteor.Error('restore-failed', @@ -31,10 +31,10 @@ const restoreError = function(){ ); }; -export function restore({id, collection}){ +export function restore({_id, collection}){ collection = getCollectionByName(collection); let numUpdated = collection.update({ - _id: id, + _id, removedWith: {$exists: false} }, { $unset: { removed: 1, @@ -42,9 +42,9 @@ export function restore({id, collection}){ }}); if (numUpdated === 0) restoreError(); updateDecendents({ - ancestorId: id, + ancestorId: _id, filter: { - removedWith: id, + removedWith: _id, }, modifier: { $unset: { removed: 1, From b35e08b9b44be40a0292f97f4d4c902c9c10b172 Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Wed, 3 Apr 2019 16:50:22 +0200 Subject: [PATCH 09/10] Iterated on features UI --- app/imports/ui/character/FeaturesTab.vue | 29 ++++++++--- app/imports/ui/components/ToolbarCard.vue | 11 ++-- .../ui/components/features/FeatureCard.vue | 29 ++++++----- .../features/FeatureCreationDialog.vue | 9 +--- .../ui/components/features/FeatureDialog.vue | 51 +++++++------------ .../features/FeatureDialogContainer.vue | 36 +++++-------- .../components/properties/PropertyDialog.vue | 28 ++++++++++ .../properties/PropertyDialogContainer.vue | 42 --------------- .../properties/PropertyInsertDialog.vue | 2 +- app/imports/ui/dialogStack/DialogBase.vue | 2 +- .../ui/dialogStack/DialogComponentIndex.js | 2 + .../ui/dialogStack/dialogStackStore.js | 13 +++++ app/package-lock.json | 2 +- 13 files changed, 125 insertions(+), 131 deletions(-) create mode 100644 app/imports/ui/components/properties/PropertyDialog.vue delete mode 100644 app/imports/ui/components/properties/PropertyDialogContainer.vue diff --git a/app/imports/ui/character/FeaturesTab.vue b/app/imports/ui/character/FeaturesTab.vue index 82a9b59b..549f7822 100644 --- a/app/imports/ui/character/FeaturesTab.vue +++ b/app/imports/ui/character/FeaturesTab.vue @@ -3,8 +3,10 @@
@@ -21,7 +23,7 @@ diff --git a/app/imports/ui/components/ToolbarCard.vue b/app/imports/ui/components/ToolbarCard.vue index a26a0501..69f3cda4 100644 --- a/app/imports/ui/components/ToolbarCard.vue +++ b/app/imports/ui/components/ToolbarCard.vue @@ -1,15 +1,15 @@ diff --git a/app/imports/ui/components/features/FeatureDialog.vue b/app/imports/ui/components/features/FeatureDialog.vue index 3cfc8e7e..36c4e69c 100644 --- a/app/imports/ui/components/features/FeatureDialog.vue +++ b/app/imports/ui/components/features/FeatureDialog.vue @@ -1,25 +1,27 @@