160 lines
6.8 KiB
JavaScript
160 lines
6.8 KiB
JavaScript
import { DEFAULT_AUGMENTS, getAttachedFeature } from './ikonis-data.js';
|
|
|
|
export class IkonisAugmentConfig {
|
|
static async open() {
|
|
const augments = game.settings.get('dh-ikonis', 'augmentsList') || DEFAULT_AUGMENTS;
|
|
const defaultBondedUuid = game.settings.get('dh-ikonis', 'defaultBondedUuid') || "";
|
|
|
|
const processedAugments = [];
|
|
for (const a of augments) {
|
|
const aug = { ...a };
|
|
if (aug.featureUuid) {
|
|
const item = await getAttachedFeature(aug.featureUuid);
|
|
if (item) aug.featureName = item.name;
|
|
}
|
|
processedAugments.push(aug);
|
|
}
|
|
|
|
let bondedName = "";
|
|
if (defaultBondedUuid) {
|
|
const item = await getAttachedFeature(defaultBondedUuid);
|
|
if (item) bondedName = item.name;
|
|
}
|
|
|
|
const template = "modules/dh-ikonis/templates/ikonis-config.hbs";
|
|
const content = await foundry.applications.handlebars.renderTemplate(template, { augments: processedAugments, defaultBondedUuid, bondedName });
|
|
|
|
return foundry.applications.api.DialogV2.wait({
|
|
window: {
|
|
title: "Global Hardware Manager",
|
|
icon: "fa-solid fa-microchip",
|
|
width: 800,
|
|
height: 650,
|
|
resizable: true
|
|
},
|
|
content: content,
|
|
buttons: [
|
|
{
|
|
action: "add", label: "Add New", icon: "fa-solid fa-plus",
|
|
callback: () => { this._onAdd(); return false; }
|
|
},
|
|
{
|
|
action: "reset", label: "Reset", icon: "fa-solid fa-undo",
|
|
callback: () => { this._onReset(); return false; }
|
|
},
|
|
{
|
|
action: "save", label: "Save & Close", icon: "fa-solid fa-save",
|
|
callback: (event, button) => this._onSave(event, button)
|
|
}
|
|
],
|
|
render: (event, app) => {
|
|
const html = app.element;
|
|
|
|
const form = html.querySelector('form');
|
|
if (form) {
|
|
form.style.height = "100%";
|
|
form.style.maxHeight = "100%";
|
|
form.style.display = "flex";
|
|
form.style.flexDirection = "column";
|
|
form.style.overflow = "hidden";
|
|
}
|
|
const formContent = html.querySelector('.form-content');
|
|
if (formContent) {
|
|
formContent.style.flex = "1";
|
|
formContent.style.overflow = "hidden";
|
|
formContent.style.display = "flex";
|
|
formContent.style.flexDirection = "column";
|
|
}
|
|
|
|
html.querySelectorAll('[data-action="delete"]').forEach(el => {
|
|
el.addEventListener('click', () => this._onDelete(el.dataset.id, app));
|
|
});
|
|
|
|
html.addEventListener('drop', async (e) => {
|
|
// V14 namespaced TextEditor
|
|
const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(e);
|
|
if (data.type !== "Item") return;
|
|
|
|
const targetRow = e.target.closest('[data-id]');
|
|
const targetBonded = e.target.closest('.bonded-drop-zone');
|
|
|
|
if (targetBonded) {
|
|
await game.settings.set('dh-ikonis', 'defaultBondedUuid', data.uuid);
|
|
app.close(); this.open();
|
|
return;
|
|
}
|
|
|
|
if (targetRow) {
|
|
const id = targetRow.dataset.id;
|
|
const augs = game.settings.get('dh-ikonis', 'augmentsList') || [...DEFAULT_AUGMENTS];
|
|
const idx = augs.findIndex(a => String(a.id) === String(id));
|
|
if (idx !== -1) {
|
|
augs[idx].featureUuid = data.uuid;
|
|
await game.settings.set('dh-ikonis', 'augmentsList', augs);
|
|
}
|
|
app.close(); this.open();
|
|
}
|
|
});
|
|
|
|
html.querySelectorAll('[data-action="clearFeature"]').forEach(el => {
|
|
el.addEventListener('click', async (e) => {
|
|
const id = el.dataset.id;
|
|
const augs = game.settings.get('dh-ikonis', 'augmentsList') || [...DEFAULT_AUGMENTS];
|
|
const idx = augs.findIndex(a => String(a.id) === String(id));
|
|
if (idx !== -1) {
|
|
augs[idx].featureUuid = null;
|
|
await game.settings.set('dh-ikonis', 'augmentsList', augs);
|
|
}
|
|
app.close(); this.open();
|
|
});
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
static async _onAdd() {
|
|
const augments = game.settings.get('dh-ikonis', 'augmentsList') || [...DEFAULT_AUGMENTS];
|
|
augments.push({ id: foundry.utils.randomID(), name: "New Augment", effect: "Effect", cost: "Cost", precompile: 1 });
|
|
await game.settings.set('dh-ikonis', 'augmentsList', augments);
|
|
this.open();
|
|
}
|
|
|
|
static async _onDelete(id, app) {
|
|
const augments = (game.settings.get('dh-ikonis', 'augmentsList') || []).filter(a => String(a.id) !== String(id));
|
|
await game.settings.set('dh-ikonis', 'augmentsList', augments);
|
|
app.close(); this.open();
|
|
}
|
|
|
|
static async _onReset() {
|
|
const confirmed = await foundry.applications.api.DialogV2.confirm({
|
|
window: { title: "Reset" }, content: "Reset to defaults?", yes: { label: "Reset" }
|
|
});
|
|
if (confirmed) {
|
|
await game.settings.set('dh-ikonis', 'augmentsList', DEFAULT_AUGMENTS);
|
|
await game.settings.set('dh-ikonis', 'defaultBondedUuid', "");
|
|
this.open();
|
|
}
|
|
}
|
|
|
|
static async _onSave(event, button) {
|
|
// V14 namespaced FormDataExtended
|
|
const fde = new foundry.applications.ux.FormDataExtended(button.form);
|
|
const data = foundry.utils.expandObject(fde.object);
|
|
const currentAugs = game.settings.get('dh-ikonis', 'augmentsList') || [];
|
|
|
|
const augments = Object.entries(data.augments || {}).map(([id, val]) => {
|
|
const existing = currentAugs.find(a => String(a.id) === String(id));
|
|
return {
|
|
id,
|
|
name: val.name,
|
|
effect: val.effect,
|
|
cost: val.cost,
|
|
precompile: parseInt(val.precompile) || 1,
|
|
featureUuid: existing?.featureUuid || null
|
|
};
|
|
});
|
|
|
|
await game.settings.set('dh-ikonis', 'augmentsList', augments);
|
|
ui.notifications.info("Global Hardware saved!");
|
|
}
|
|
}
|