Fixed parenting. Started on UI rewrite for new parenting system

This commit is contained in:
Thaum
2015-03-18 13:56:41 +00:00
parent 3656a0b66f
commit ecc43752aa
12 changed files with 76 additions and 40 deletions

View File

@@ -1 +1 @@
METEOR@1.0.4 METEOR@1.0.4.1

View File

@@ -66,7 +66,7 @@ Schemas.Attack = new SimpleSchema({
Attacks.attachSchema(Schemas.Attack); Attacks.attachSchema(Schemas.Attack);
Attacks.attachBehaviour('softRemovable'); Attacks.attachBehaviour('softRemovable');
makeChild(Attacks); //children of lots of things makeChild(Attacks, ['name', 'enabled']); //children of lots of things
Attacks.allow(CHARACTER_SUBSCHEMA_ALLOW); Attacks.allow(CHARACTER_SUBSCHEMA_ALLOW);
Attacks.deny(CHARACTER_SUBSCHEMA_DENY); Attacks.deny(CHARACTER_SUBSCHEMA_DENY);

View File

@@ -21,7 +21,7 @@ Schemas.Buff = new SimpleSchema({
Buffs.attachSchema(Schemas.Buff); Buffs.attachSchema(Schemas.Buff);
Buffs.attachBehaviour('softRemovable'); Buffs.attachBehaviour('softRemovable');
makeParent(Buffs); //parents of effects and attacks makeParent(Buffs, 'name'); //parents of effects and attacks
Buffs.allow(CHARACTER_SUBSCHEMA_ALLOW); Buffs.allow(CHARACTER_SUBSCHEMA_ALLOW);
Buffs.deny(CHARACTER_SUBSCHEMA_DENY); Buffs.deny(CHARACTER_SUBSCHEMA_DENY);

View File

@@ -22,7 +22,7 @@ Schemas.Class = new SimpleSchema({
Classes.attachSchema(Schemas.Class); Classes.attachSchema(Schemas.Class);
Classes.attachBehaviour('softRemovable'); Classes.attachBehaviour('softRemovable');
makeParent(Classes); //parents of effects and attacks makeParent(Classes, 'name'); //parents of effects and attacks
Classes.allow(CHARACTER_SUBSCHEMA_ALLOW); Classes.allow(CHARACTER_SUBSCHEMA_ALLOW);
Classes.deny(CHARACTER_SUBSCHEMA_DENY); Classes.deny(CHARACTER_SUBSCHEMA_DENY);

View File

@@ -90,7 +90,7 @@ Characters.after.insert(function (userId, char) {
}); });
Effects.attachBehaviour('softRemovable'); Effects.attachBehaviour('softRemovable');
makeChild(Effects); //children of lots of things makeChild(Effects, ['name', 'enabled']); //children of lots of things
Effects.allow(CHARACTER_SUBSCHEMA_ALLOW); Effects.allow(CHARACTER_SUBSCHEMA_ALLOW);
Effects.deny(CHARACTER_SUBSCHEMA_DENY); Effects.deny(CHARACTER_SUBSCHEMA_DENY);

View File

@@ -1,13 +1,14 @@
Features = new Mongo.Collection("features"); Features = new Mongo.Collection("features");
Schemas.Feature = new SimpleSchema({ Schemas.Feature = new SimpleSchema({
charId: {type: String, regEx: SimpleSchema.RegEx.Id}, charId: {type: String, regEx: SimpleSchema.RegEx.Id},
name: {type: String, trim: false}, name: {type: String, trim: false},
description:{type: String, optional: true, trim: false}, description: {type: String, optional: true, trim: false},
uses: {type: String, optional: true, trim: false}, uses: {type: String, optional: true, trim: false},
used: {type: Number, defaultValue: 0}, used: {type: Number, defaultValue: 0},
reset: {type: String, allowedValues: ["manual", "longRest", "shortRest"], defaultValue: "manual"}, reset: {type: String, allowedValues: ["manual", "longRest", "shortRest"], defaultValue: "manual"},
enabled: {type: String, allowedValues: ["enabled", "disabled", "alwaysEnabled"], defaultValue: "alwaysEnabled"}, enabled: {type: Boolean, defaultValue: true},
alwaysEnabled:{type: Boolean, defaultValue: true},
color: {type: String, allowedValues: _.pluck(colorOptions, "key"), defaultValue: "q"} color: {type: String, allowedValues: _.pluck(colorOptions, "key"), defaultValue: "q"}
}); });
@@ -23,7 +24,7 @@ Features.helpers({
}); });
Features.attachBehaviour('softRemovable'); Features.attachBehaviour('softRemovable');
makeParent(Features); //parents of effects and attacks makeParent(Features, ['name', 'enabled']); //parents of effects and attacks
Features.allow(CHARACTER_SUBSCHEMA_ALLOW); Features.allow(CHARACTER_SUBSCHEMA_ALLOW);
Features.deny(CHARACTER_SUBSCHEMA_DENY); Features.deny(CHARACTER_SUBSCHEMA_DENY);

View File

@@ -27,6 +27,10 @@ Containers.helpers({
weight += item.totalWeight(); weight += item.totalWeight();
}); });
return weight; return weight;
},
moveToCharacter: function(characterId){
if(this.charId === characterId) return;
Items.update(this._id, {$set: {charId: characterId}});
} }
}); });

View File

@@ -32,11 +32,31 @@ Items.helpers({
} else{ } else{
return this.name; return this.name;
} }
},
equip: function(){
Items.update(this._id, {$set: {enabled: true}});
},
unequip: function(){
Items.update(this._id, {$set: {enabled: false}});
},
moveToContainer: function(containerId){
Items.update(this._id, {$set: {"parent.collection": "Containers", "parent.id": containerId, enabled: false}});
},
moveToCharacter: function(characterId){
if(this.charId === characterId) return;
Items.update(this._id, {$set: {"parent.collection": "Characters", "parent.id": characterId, charId: characterId, enabled: false}});
}
});
Items.before.update(function(userId, doc, fieldNames, modifier, options){
if(modifier && modifier.$set && modifier.$set.enabled){
modifier.$set["parent.collection"] = "Characters";
modifier.$set["parent.id"] = doc.charId;
} }
}); });
Items.attachBehaviour('softRemovable'); Items.attachBehaviour('softRemovable');
makeChild(Items); //children of containers makeChild(Items); //children of containers
makeParent(Items); //parents of effects and attacks makeParent(Items, ['name', 'enabled']); //parents of effects and attacks
Items.allow(CHARACTER_SUBSCHEMA_ALLOW); Items.allow(CHARACTER_SUBSCHEMA_ALLOW);

View File

@@ -32,8 +32,16 @@ Template.featureDialog.events({
var detail = event.originalEvent.detail; var detail = event.originalEvent.detail;
if(!detail.isSelected) return; if(!detail.isSelected) return;
var value = detail.item.getAttribute("name"); var value = detail.item.getAttribute("name");
if (value === this.enabled) return; var setter;
Features.update(this._id, {$set: {enabled: value}}); if(value === "enabled"){
setter = {enabled: true, alwaysEnabled: false};
} else if (value === "disabled"){
setter = {enabled: false, alwaysEnabled: false};
} else{
setter = {enabled: true, alwaysEnabled: true};
}
if (setter.enabled === this.enabled && setter.alwaysEnabled === this.alwaysEnabled) return;
Features.update(this._id, {$set: setter});
}, },
}); });

View File

@@ -71,7 +71,7 @@
<paper-ripple fit></paper-ripple> <paper-ripple fit></paper-ripple>
{{#if canEnable}} {{#if canEnable}}
<core-tooltip label="Feature enabled" position="left"> <core-tooltip label="Feature enabled" position="left">
<paper-checkbox class="enabledCheckbox" checked={{isEnabled}}></paper-checkbox> <paper-checkbox class="enabledCheckbox" checked={{enabled}}></paper-checkbox>
</core-tooltip> </core-tooltip>
{{/if}} {{/if}}
</div> </div>

View File

@@ -26,10 +26,7 @@ Template.features.helpers({
return char && char.proficiencies; return char && char.proficiencies;
}, },
canEnable: function(){ canEnable: function(){
return this.enabled !== "alwaysEnabled"; return !this.alwaysEnabled;
},
isEnabled: function(){
return this.enabled !== "disabled";
} }
}); });
@@ -94,9 +91,7 @@ Template.features.events({
event.stopPropagation(); event.stopPropagation();
}, },
"change .enabledCheckbox": function(event){ "change .enabledCheckbox": function(event){
var enabled; var enabled = !this.enabled;
if(this.enabled === "enabled") enabled = "disabled";
else enabled = "enabled";
Features.update(this._id, {$set: {enabled: enabled}}); Features.update(this._id, {$set: {enabled: enabled}});
} }
}); });

View File

@@ -7,7 +7,6 @@ var childSchema = new SimpleSchema({
var joinWithDefaultKeys = function(keys){ var joinWithDefaultKeys = function(keys){
var defaultKeys = [ var defaultKeys = [
'charId', 'charId',
'enabled',
'removed', 'removed',
'removedAt', 'removedAt',
'removedBy', 'removedBy',
@@ -17,11 +16,21 @@ var joinWithDefaultKeys = function(keys){
return _.union(keys, defaultKeys); return _.union(keys, defaultKeys);
} }
var limitModifierToKeys = function(modifier, keys){
if(!modifier) return;
modifier = _.pick(modifier, ['$set', '$unset']);
if(modifier.$set) modifier.$set = _.pick(modifier.$set, keys);
if(modifier.$unset) modifier.$unset = _.pick(modifier.$unset, keys);
if(_.isEmpty(modifier.$set)) delete modifier.$set;
if(_.isEmpty(modifier.$unset)) delete modifier.$unset;
return modifier;
}
var childCollections = []; var childCollections = [];
makeChild = function(collection, inheritedKeys){ makeChild = function(collection, inheritedKeys){
collection.inheritedKeys = joinWithDefaultKeys(inheritedKeys); inheritedKeys = inheritedKeys || [];
if(inheritedKeys) collection.inheritedKeys = joinWithDefaultKeys(inheritedKeys);
collection.helpers({ collection.helpers({
//returns the parent even if it's removed //returns the parent even if it's removed
getParent: function(){ getParent: function(){
@@ -53,16 +62,13 @@ makeChild = function(collection, inheritedKeys){
}; };
makeParent = function(collection, donatedKeys){ makeParent = function(collection, donatedKeys){
collection.donatedKeys = joinWithDefaultKeys(donatedKeys); donatedKeys = joinWithDefaultKeys(donatedKeys);
//after changing, push the changes to all children //after changing, push the changes to all children
collection.after.update(function (userId, doc, fieldNames, modifier, options) { collection.after.update(function (userId, doc, fieldNames, modifier, options) {
if(!modifier) return; modifier = limitModifierToKeys(modifier, donatedKeys);
modifier = _.pick(modifier, ['$set', '$unset']);
modifier.$set = _.pick(modifier.$set, donatedKeys);
modifier.$unset = _.pick(modifier.$unset, donatedKeys);
doc = _.pick(doc, ['_id','charId']); doc = _.pick(doc, ['_id','charId']);
Meteor.call('updateChildren', doc, modifier); Meteor.call('updateChildren', doc, modifier, true);
}); });
collection.after.remove(function (userId, doc) { collection.after.remove(function (userId, doc) {
@@ -86,17 +92,19 @@ var checkPermission = function(userId, charId){
}; };
Meteor.methods({ Meteor.methods({
updateChildren: function (parent, modifier) { updateChildren: function (parent, modifier, limitToInheritance) {
check(parent, {_id: String, charId: String}); check(parent, {_id: String, charId: String});
check(modifier, Object); check(modifier, Object);
checkPermission(this.userId, parent.charId); checkPermission(this.userId, parent.charId);
_.each(childCollections, function(collection){ _.each(childCollections, function(collection){
collection.update( var thisModifier;
{charId: parent.charId, 'parent.id': parent._id}, if(limitToInheritance){
modifier, thisModifier = limitModifierToKeys(modifier, collection.inheritedKeys);
{multi: true} } else{
); thisModifier = _.clone(modifier);
}
if(_.isEmpty(thisModifier)) return;
collection.update( {'parent.id': parent._id}, thisModifier, {multi: true});
}); });
}, },
removeChildren: function (parent) { removeChildren: function (parent) {