HBS idea formed. Need to recheck drag drop implementation

This commit is contained in:
Nikhil Nagarajan 2026-01-05 14:34:24 -05:00
parent b8fcd440c6
commit 1375329541
7 changed files with 133 additions and 21 deletions

View file

@ -85,7 +85,7 @@ export default class DHActionBaseConfig extends DaggerheartSheet(ApplicationV2)
}
};
static CLEAN_ARRAYS = ['damage.parts', 'cost', 'effects'];
static CLEAN_ARRAYS = ['damage.parts', 'cost', 'effects','summon'];
_getTabs(tabs) {
for (const v of Object.values(tabs)) {

View file

@ -6,10 +6,13 @@ export default class DHActionSettingsConfig extends DHActionBaseConfig {
this.effects = effects;
this.sheetUpdate = sheetUpdate;
this._dragDrop = this._createDragDropHandlers();
}
static DEFAULT_OPTIONS = {
...DHActionBaseConfig.DEFAULT_OPTIONS,
dragDrop: [{ dragSelector: null, dropSelector: '.summon-actor-drop' }],
actions: {
...DHActionBaseConfig.DEFAULT_OPTIONS.actions,
addEffect: this.addEffect,
@ -18,8 +21,23 @@ export default class DHActionSettingsConfig extends DHActionBaseConfig {
}
};
_createDragDropHandlers() {
return this.options.dragDrop.map(d => {
d.callbacks = {
drop: this._onDrop.bind(this)
};
return new foundry.applications.ux.DragDrop.implementation(d);
});
}
async _prepareContext(options) {
const context = await super._prepareContext(options);
const summonData = this.action.summon || [];
context.summonActors = await Promise.all(summonData.map(async (entry) => {
if (!entry.actorUUID) return null;
const actor = await fromUuid(entry.actorUUID);
return actor ? { name: actor.name, img: actor.img } : { name: "Unknown", img: "icons/svg/mystery-man.svg" };
}));
context.effects = this.effects;
context.getEffectDetails = this.getEffectDetails.bind(this);
@ -63,4 +81,47 @@ export default class DHActionSettingsConfig extends DHActionBaseConfig {
this.effects = await this.sheetUpdate(this.action.toObject(), { ...updatedEffect, id });
this.render();
}
//For drag drop implementation for summon actor selection
_onRender(context, options) {
super._onRender(context, options);
this._dragDrop.forEach(d => d.bind(this.element));
}
async _onDrop(event) {
const data = TextEditor.getDragEventData(event);
console.log("Daggerheart | Summon Drop Data:", data);
if (!data || !data.uuid) return;
const doc = await fromUuid(data.uuid);
if (!doc) return;
let actorUuid = null;
if (doc.documentName === "Actor") {
actorUuid = doc.uuid;
} else if (doc.documentName === "Token" && doc.actor) {
actorUuid = doc.actor.uuid;
} else {
console.warn("Daggerheart | Dropped document is not an Actor:", doc);
return;
}
const dropZone = event.target.closest('.summon-actor-drop');
if (!dropZone) return;
const index = Number(dropZone.dataset.index);
const actionData = this.action.toObject();
if (!actionData.summon) actionData.summon = [];
if (actionData.summon[index]) {
actionData.summon[index].actorUUID = actorUuid;
// Trigger update
this.constructor.updateForm.bind(this)(null, null, { object: foundry.utils.flattenObject(actionData) });
}
}
}

View file

@ -6,18 +6,25 @@ export default class DHSummonAction extends DHBaseAction {
const fields = foundry.data.fields;
return {
...super.defineSchema(),
tokenArray: new fields.ArrayField(new fields.SchemaField({
summon: new fields.ArrayField(new fields.SchemaField({
actorUUID: new fields.DocumentUUIDField({ type: 'Actor', required: true }),
count: new fields.NumberField({ required: true, default: 1, min:1 })
}), { required: false })
count: new fields.NumberField({ required: true, default: 1, min: 1, integer: true })
}), { required: false, initial: [] })
};
}
get defaultValues() {
return {
summon: { actorUUID: "", count: 1 }
};
}
async trigger(event, ...args) {
if (!this.canSummon || !canvas.scene){
ui.notifications.error(game.i18n.localize("DAGGERHEART.ACTIONS.TYPES.summon.error"));
ui.notifications.warn(game.i18n.localize("DAGGERHEART.ACTIONS.TYPES.summon.error"));
return;
}
await this._performAction();
}
get canSummon() {
@ -31,6 +38,18 @@ export default class DHSummonAction extends DHBaseAction {
//Logic to perform the summon action - incomplete implementation
async _performAction(event, ...args) {
return this.summonManager.summonTokens(this.tokenArray);
}
const validSummons = this.summon.filter(entry => entry.actorUUID);
if (validSummons.length === 0) {
ui.notifications.warn("No actors configured for this Summon action.");
return;
}
// FOR NOW: Just log the data to prove the schema working or not
console.group("Summon Action Triggered");
for (const entry of validSummons) {
const actor = await fromUuid(entry.actorUUID);
console.log(`- Ready to summon ${entry.count}x [${actor?.name || "Unknown Actor"}]`);
}
console.groupEnd();
}
}

View file

@ -32,6 +32,7 @@ export const preloadHandlebarsTemplates = async function () {
'systems/daggerheart/templates/actionTypes/effect.hbs',
'systems/daggerheart/templates/actionTypes/beastform.hbs',
'systems/daggerheart/templates/actionTypes/countdown.hbs',
'systems/daggerheart/templates/actionTypes/summon.hbs',
'systems/daggerheart/templates/settings/components/settings-item-line.hbs',
'systems/daggerheart/templates/ui/tooltip/parts/tooltipChips.hbs',
'systems/daggerheart/templates/ui/tooltip/parts/tooltipTags.hbs',