205 lines
5.4 KiB
JavaScript
205 lines
5.4 KiB
JavaScript
Template.libraryItemDialog.helpers({
|
|
item(){
|
|
return LibraryItems.findOne(this.itemId);
|
|
},
|
|
calculationOrValue(){
|
|
return this.calculation || this.value;
|
|
},
|
|
indexedEffects(){
|
|
let item = LibraryItems.findOne(this.itemId);
|
|
if (!item) return;
|
|
return _.map(item.effects, (effect, index) => {
|
|
if (!effect) return;
|
|
effect.index = index;
|
|
return effect;
|
|
});
|
|
},
|
|
indexedAttacks(){
|
|
let item = LibraryItems.findOne(this.itemId);
|
|
if (!item) return;
|
|
return _.map(item.attacks, (attack, index) => {
|
|
if (!attack) return;
|
|
attack.index = index;
|
|
return attack;
|
|
});
|
|
},
|
|
operationIndex(operation){
|
|
const ref = {
|
|
base: 0,
|
|
add: 1,
|
|
mul: 2,
|
|
min: 3,
|
|
max: 4,
|
|
advantage: 5,
|
|
disadvantage: 6,
|
|
passiveAdd: 7,
|
|
fail: 8,
|
|
conditional: 9,
|
|
};
|
|
return ref[operation];
|
|
},
|
|
damageTypeIndex(damageType){
|
|
const ref = {
|
|
bludgeoning: 0,
|
|
piercing: 1,
|
|
slashing: 2,
|
|
acid: 3,
|
|
cold: 4,
|
|
fire: 5,
|
|
force: 6,
|
|
lightning: 7,
|
|
necrotic: 8,
|
|
poison: 9,
|
|
psychic: 10,
|
|
radiant: 11,
|
|
thunder: 12,
|
|
};
|
|
return ref[damageType];
|
|
}
|
|
});
|
|
|
|
const bind = function(field){
|
|
return _.debounce(function(event){
|
|
const input = event.currentTarget;
|
|
var value = input.value;
|
|
LibraryItems.update(this.itemId, {
|
|
$set: {[field]: value}
|
|
}, {
|
|
removeEmptyStrings: false,
|
|
trimStrings: false,
|
|
});
|
|
}, 300);
|
|
};
|
|
|
|
Template.libraryItemDialog.events({
|
|
"click #backButton": function(){
|
|
popDialogStack();
|
|
},
|
|
"click #deleteButton": function(){
|
|
LibraryItems.remove(this.itemId);
|
|
popDialogStack();
|
|
},
|
|
"input #libraryItemLibraryNameInput": bind("libraryName"),
|
|
"input #libraryItemNameInput": bind("name"),
|
|
"input #libraryItemPluralInput": bind("plural"),
|
|
"input #libraryItemQuantityInput": bind("quantity"),
|
|
"input #libraryItemValueInput": bind("value"),
|
|
"input #libraryItemWeightInput": bind("weight"),
|
|
"change #attunementCheckbox": function(event){
|
|
LibraryItems.update(this.itemId, {
|
|
$set: {requiresAttunement: event.currentTarget.checked}
|
|
});
|
|
},
|
|
"change #incrementCheckbox": function(event){
|
|
LibraryItems.update(this.itemId, {
|
|
$set: {"settings.showIncrement": event.currentTarget.checked}
|
|
});
|
|
},
|
|
"input #libraryItemDescriptionInput": bind("description"),
|
|
|
|
// Effects
|
|
"click #addEffect": function(event, template){
|
|
LibraryItems.update(template.data.itemId, {
|
|
$push: {
|
|
effects: {operation: "add"}
|
|
}
|
|
});
|
|
},
|
|
"iron-select .operationMenu": function(event, template){
|
|
var detail = event.originalEvent.detail;
|
|
var opName = detail.item.getAttribute("name");
|
|
if (opName == this.operation) return;
|
|
Meteor.call("updateLibraryItemEffect", {
|
|
itemId: template.data.itemId,
|
|
effectIndex: this.index,
|
|
field: "operation",
|
|
value: opName,
|
|
});
|
|
},
|
|
"input .LibraryItemEffectStat": _.debounce(function(event, template){
|
|
Meteor.call("updateLibraryItemEffect", {
|
|
itemId: template.data.itemId,
|
|
effectIndex: this.index,
|
|
field: "stat",
|
|
value: event.currentTarget.value,
|
|
});
|
|
}, 300),
|
|
"input .LibraryItemEffectValue": _.debounce(function(event, template){
|
|
let value = event.currentTarget.value;
|
|
if (value && _.isFinite(+value)){
|
|
Meteor.call("updateLibraryItemEffect", {
|
|
itemId: template.data.itemId,
|
|
effectIndex: this.index,
|
|
field: "value",
|
|
unsetField: "calculation",
|
|
value,
|
|
});
|
|
} else {
|
|
Meteor.call("updateLibraryItemEffect", {
|
|
itemId: template.data.itemId,
|
|
effectIndex: this.index,
|
|
field: "calculation",
|
|
unsetField: "value",
|
|
value,
|
|
});
|
|
}
|
|
}, 300),
|
|
"click .deleteEffect": function (event, template) {
|
|
Meteor.call("removeLibraryItemEffect", {
|
|
itemId: template.data.itemId,
|
|
effectIndex: this.index,
|
|
});
|
|
},
|
|
|
|
// Attacks
|
|
"click #addAttack": function(event, template){
|
|
LibraryItems.update(template.data.itemId, {
|
|
$push: {
|
|
attacks: {damageType: "slashing"}
|
|
}
|
|
});
|
|
},
|
|
"iron-select .damageTypeMenu": function(event, template){
|
|
var detail = event.originalEvent.detail;
|
|
var damageType = detail.item.getAttribute("name");
|
|
if (damageType == this.damageType) return;
|
|
Meteor.call("updateLibraryItemAttack", {
|
|
itemId: template.data.itemId,
|
|
attackIndex: this.index,
|
|
field: "damageType",
|
|
value: damageType,
|
|
});
|
|
},
|
|
"input .LibraryItemAttackBonusInput": _.debounce(function(event, template){
|
|
Meteor.call("updateLibraryItemAttack", {
|
|
itemId: template.data.itemId,
|
|
attackIndex: this.index,
|
|
field: "attackBonus",
|
|
value: event.currentTarget.value,
|
|
});
|
|
}, 300),
|
|
"input .LibraryItemAttackDamageInput": _.debounce(function(event, template){
|
|
Meteor.call("updateLibraryItemAttack", {
|
|
itemId: template.data.itemId,
|
|
attackIndex: this.index,
|
|
field: "damage",
|
|
value: event.currentTarget.value,
|
|
});
|
|
}, 300),
|
|
"input .LibraryItemAttackDetailsInput": _.debounce(function(event, template){
|
|
Meteor.call("updateLibraryItemAttack", {
|
|
itemId: template.data.itemId,
|
|
attackIndex: this.index,
|
|
field: "details",
|
|
value: event.currentTarget.value,
|
|
});
|
|
}, 300),
|
|
|
|
"click .deleteAttack": function (event, template) {
|
|
Meteor.call("removeLibraryItemAttack", {
|
|
itemId: template.data.itemId,
|
|
attackIndex: this.index,
|
|
});
|
|
},
|
|
});
|