foundryvtt-beam-saber/module/blades-helpers.js
Peter Varaksin 6a10138291 GH-1 Add Cohort functionality
- Closes #1
- Adds cohort functionality and styles
- Adds Cohort block view
- Adds "Add Item" functionality
- CSS design fixes
2020-05-04 13:10:57 +03:00

172 lines
4.2 KiB
JavaScript

export class BladesHelpers {
/**
* Removes a duplicate item type from charlist.
*
* @param {Object} item_data
* @param {Entity} actor
*/
static removeDuplicatedItemType(item_data, actor) {
// If the Item has the exact same name - remove it from list.
actor.items.forEach(i => {
if (i.data.name === item_data.name) {
actor.deleteOwnedItem(i.id);
}
});
}
/**
* _getFormData() override helper.
* @param {*} form
*/
static getFormDataHelper(form, editors) {
const FD = new FormData(form);
const dtypes = {};
const editorTargets = Object.keys(editors);
// Always include checkboxes
for ( let el of form.elements ) {
if ( !el.name ) continue;
// Handle Radio groups
if ( form[el.name] instanceof RadioNodeList ) {
const inputs = Array.from(form[el.name]);
if ( inputs.every(i => i.disabled) ) FD.delete(k);
let values = "";
let type = "Checkboxes";
values = inputs.map(i => i.checked ? i.value : false).filter(i => i);
FD.set(el.name, JSON.stringify(values));
dtypes[el.name] = 'Radio';
}
// Remove disabled elements
else if ( el.disabled ) FD.delete(el.name);
// Checkboxes
else if ( el.type == "checkbox" ) {
FD.set(el.name, el.checked || false);
dtypes[el.name] = "Boolean";
}
// Include dataset dtype
else if ( el.dataset.dtype ) dtypes[el.name] = el.dataset.dtype;
}
// Process editable images
for ( let img of form.querySelectorAll('img[data-edit]') ) {
if ( img.getAttribute("disabled") ) continue;
let basePath = window.location.origin+"/";
if ( ROUTE_PREFIX ) basePath += ROUTE_PREFIX+"/";
FD.set(img.dataset.edit, img.src.replace(basePath, ""));
}
// Process editable divs (excluding MCE editors)
for ( let div of form.querySelectorAll('div[data-edit]') ) {
if ( div.getAttribute("disabled") ) continue;
else if ( editorTargets.includes(div.dataset.edit) ) continue;
FD.set(div.dataset.edit, div.innerHTML.trim());
}
// Handle MCE editors
Object.values(editors).forEach(ed => {
if ( ed.mce ) {
FD.delete(ed.mce.id);
if ( ed.changed ) FD.set(ed.target, ed.mce.getContent());
}
});
// Record target data types for casting
FD._dtypes = dtypes;
return FD;
}
/**
* Add item modification if logic exists.
* @param {Object} item_data
* @param {Entity} entity
*/
static callItemLogic(item_data, entity) {
if ('logic' in item_data.data) {
let logic = JSON.parse(item_data.data.logic);
if (logic) {
// Different logic behav. dep on operator.
switch (logic.operator) {
// Add when creating.
case "addition":
entity.update({
[logic.attribute]: Number(BladesHelpers.getNestedProperty(entity, "data." + logic.attribute)) + logic.value
});
break;
}
}
}
}
/**
* Undo Item modifications when item is removed.
* @param {Object} item_data
* @param {Entity} entity
*/
static undoItemLogic(item_data, entity) {
if ('logic' in item_data.data) {
let logic = JSON.parse(item_data.data.logic)
if (logic) {
// Different logic behav. dep on operator.
switch (logic.operator) {
// Subtract when removing.
case "addition":
entity.update({
[logic.attribute]: Number(BladesHelpers.getNestedProperty(entity, "data." + logic.attribute)) - logic.value
});
break;
}
}
}
}
/**
* Get a nested dynamic attribute.
* @param {Object} obj
* @param {string} property
*/
static getNestedProperty(obj, property) {
return property.split('.').reduce((r, e) => {
return r[e];
}, obj);
}
/**
* Add item functionality
*/
static _addOwnedItem(event, actor) {
event.preventDefault();
const a = event.currentTarget;
const item_type = a.dataset.itemType;
let data = {
name: randomID(),
type: item_type
};
return actor.createEmbeddedEntity("OwnedItem", data);
}
}