93 lines
2.5 KiB
JavaScript
93 lines
2.5 KiB
JavaScript
|
export class BladesHelpers {
|
||
|
|
||
|
/**
|
||
|
* Removes a duplicate item type from charlist.
|
||
|
*
|
||
|
* @param {string} item_type
|
||
|
* @param {Actor} actor
|
||
|
*/
|
||
|
static removeDuplicatedItemType(item_type, actor) {
|
||
|
|
||
|
let distinct_types = ["class", "heritage", "background", "vice", "crew_type"];
|
||
|
|
||
|
if (distinct_types.indexOf(item_type) >= 0) {
|
||
|
actor.items.forEach(i => {
|
||
|
if (i.data.type === item_type) {
|
||
|
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;
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|