dh-ikonis/scripts/ikonis-config.js

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!");
}
}