From 13a9ddba46adee5740effa43051fe8a6e3377c18 Mon Sep 17 00:00:00 2001 From: Carlos Fernandez Date: Fri, 15 May 2026 18:39:44 -0400 Subject: [PATCH 1/2] Update file organization a bit --- .../sheets-configs/action-base-config.mjs | 158 ++++++++---------- .../sheets-configs/action-config.mjs | 8 +- 2 files changed, 77 insertions(+), 89 deletions(-) diff --git a/module/applications/sheets-configs/action-base-config.mjs b/module/applications/sheets-configs/action-base-config.mjs index 49aa36fb..dda9a2b4 100644 --- a/module/applications/sheets-configs/action-base-config.mjs +++ b/module/applications/sheets-configs/action-base-config.mjs @@ -18,75 +18,6 @@ export default class DHActionBaseConfig extends DaggerheartSheet(ApplicationV2) return `${game.i18n.localize('DAGGERHEART.GENERAL.Tabs.settings')}: ${this.action.name}`; } - /* Needs to consider effect altOutcomes aswell */ - static getOutcomeTabs(action) { - const outcomeKeys = [ - 'default', - ...Object.keys(action.damage?.altOutcomes ?? {}).filter(key => action.damage.altOutcomes[key]) - ]; - return outcomeKeys.reduce((acc, key, index) => { - acc[key] = { - active: index === 0, - cssClass: '', - group: 'outcomes', - id: key, - icon: null, - label: game.i18n.localize(CONFIG.DH.ACTIONS.outcomeTypes[key].label) - }; - return acc; - }, {}); - } - - /* Needs to consider effect altOutcomes aswell */ - static selectOutcome(action, callback) { - const choices = Object.entries(CONFIG.DH.ACTIONS.outcomeTypes).reduce((acc, [key, value]) => { - if (action.damage.altOutcomes[key] === null) acc.push({ id: key, label: game.i18n.localize(value.label) }); - - return acc; - }, []); - const content = new foundry.data.fields.StringField({ - label: game.i18n.localize('Outcome'), - choices, - required: true - }).toFormGroup( - {}, - { - name: 'outcome', - localize: true, - nameAttr: 'value', - labelAttr: 'label' - } - ).outerHTML; - - const callbackWrapper = (_, button) => { - const choiceIndex = button.form.elements.outcome.value; - callback(choices[choiceIndex]?.id); - }; - - const typeDialog = new foundry.applications.api.DialogV2({ - buttons: [ - foundry.utils.mergeObject( - { - action: 'ok', - label: 'Confirm', - icon: 'fas fa-check', - default: true - }, - { callback: callbackWrapper } - ) - ], - content: content, - rejectClose: false, - modal: false, - window: { - title: game.i18n.localize('Add Outcome') - }, - position: { width: 300 } - }); - - typeDialog.render(true); - } - static DEFAULT_OPTIONS = { tag: 'form', classes: ['daggerheart', 'dh-style', 'action-config', 'dialog', 'max-800'], @@ -97,16 +28,11 @@ export default class DHActionBaseConfig extends DaggerheartSheet(ApplicationV2) position: { width: 600, height: 'auto' }, actions: { toggleSection: this.toggleSection, - addEffect: this.addEffect, - removeEffect: this.removeEffect, addElement: this.addElement, removeElement: this.removeElement, removeTransformActor: this.removeTransformActor, - addOutcome: this.addOutcome, - removeOutcome: this.removeOutcome, - editEffect: this.editEffect, - addDamage: this.addDamage, - removeDamage: this.removeDamage, + addDamage: this.onAddDamage, + removeDamage: this.onRemoveDamage, editDoc: this.editDoc, addTrigger: this.addTrigger, removeTrigger: this.removeTrigger, @@ -195,6 +121,75 @@ export default class DHActionBaseConfig extends DaggerheartSheet(ApplicationV2) static CLEAN_ARRAYS = ['cost', 'effects', 'summon']; + /* Needs to consider effect altOutcomes aswell */ + static getOutcomeTabs(action) { + const outcomeKeys = [ + 'default', + ...Object.keys(action.damage?.altOutcomes ?? {}).filter(key => action.damage.altOutcomes[key]) + ]; + return outcomeKeys.reduce((acc, key, index) => { + acc[key] = { + active: index === 0, + cssClass: '', + group: 'outcomes', + id: key, + icon: null, + label: game.i18n.localize(CONFIG.DH.ACTIONS.outcomeTypes[key].label) + }; + return acc; + }, {}); + } + + /* Needs to consider effect altOutcomes aswell */ + static selectOutcome(action, callback) { + const choices = Object.entries(CONFIG.DH.ACTIONS.outcomeTypes).reduce((acc, [key, value]) => { + if (action.damage.altOutcomes[key] === null) acc.push({ id: key, label: game.i18n.localize(value.label) }); + + return acc; + }, []); + const content = new foundry.data.fields.StringField({ + label: game.i18n.localize('Outcome'), + choices, + required: true + }).toFormGroup( + {}, + { + name: 'outcome', + localize: true, + nameAttr: 'value', + labelAttr: 'label' + } + ).outerHTML; + + const callbackWrapper = (_, button) => { + const choiceIndex = button.form.elements.outcome.value; + callback(choices[choiceIndex]?.id); + }; + + const typeDialog = new foundry.applications.api.DialogV2({ + buttons: [ + foundry.utils.mergeObject( + { + action: 'ok', + label: 'Confirm', + icon: 'fas fa-check', + default: true + }, + { callback: callbackWrapper } + ) + ], + content: content, + rejectClose: false, + modal: false, + window: { + title: game.i18n.localize('Add Outcome') + }, + position: { width: 300 } + }); + + typeDialog.render(true); + } + _getTabs(tabs) { for (const v of Object.values(tabs)) { v.active = this.tabGroups[v.group] ? this.tabGroups[v.group] === v.id : v.active; @@ -389,7 +384,7 @@ export default class DHActionBaseConfig extends DaggerheartSheet(ApplicationV2) this.constructor.updateForm.bind(this)(null, null, { object: foundry.utils.flattenObject(data) }); } - static addDamage(_event, button) { + static onAddDamage(_event, button) { if (!this.action.damage.parts) return; const outcome = button.dataset.outcome; @@ -456,7 +451,7 @@ export default class DHActionBaseConfig extends DaggerheartSheet(ApplicationV2) typeDialog.render(true); } - static removeDamage(_event, button) { + static onRemoveDamage(_event, button) { if (!this.action.damage.parts) return; const data = this.action.toObject(); const { key, outcome } = button.dataset; @@ -557,13 +552,6 @@ export default class DHActionBaseConfig extends DaggerheartSheet(ApplicationV2) this.constructor.updateForm.bind(this)(null, null, { object: foundry.utils.flattenObject(data) }); } - /** Specific implementation in extending classes **/ - static addOutcome(_event) {} - static removeOutcome(_event) {} - static async addEffect(_event) {} - static removeEffect(_event, _button) {} - static editEffect(_event) {} - async close(options) { this.tabGroups.primary = 'base'; await super.close(options); diff --git a/module/applications/sheets-configs/action-config.mjs b/module/applications/sheets-configs/action-config.mjs index 833c3ebd..a4b0a6c4 100644 --- a/module/applications/sheets-configs/action-config.mjs +++ b/module/applications/sheets-configs/action-config.mjs @@ -6,8 +6,8 @@ export default class DHActionConfig extends DHActionBaseConfig { ...DHActionBaseConfig.DEFAULT_OPTIONS, actions: { ...DHActionBaseConfig.DEFAULT_OPTIONS.actions, - addOutcome: this.addOutcome, - removeOutcome: this.removeOutcome, + addOutcome: this.onAddOutcome, + removeOutcome: this.onRemoveOutcome, addEffect: this.addEffect, removeEffect: this.removeEffect, editEffect: this.editEffect @@ -22,7 +22,7 @@ export default class DHActionConfig extends DHActionBaseConfig { return context; } - static addOutcome() { + static onAddOutcome() { const data = this.action.toObject(); DHActionBaseConfig.selectOutcome(this.action, key => { @@ -34,7 +34,7 @@ export default class DHActionConfig extends DHActionBaseConfig { }); } - static removeOutcome(_event, button) { + static onRemoveOutcome(_event, button) { const { outcome } = button.dataset; const data = this.action.toObject(); From 87a7a7505b8d8b2be76957b63d8098c88ade6e84 Mon Sep 17 00:00:00 2001 From: Carlos Fernandez Date: Fri, 15 May 2026 20:23:59 -0400 Subject: [PATCH 2/2] Cleanup of damage outcomes add/remove --- .../sheets-configs/action-base-config.mjs | 45 ++++++------------- 1 file changed, 14 insertions(+), 31 deletions(-) diff --git a/module/applications/sheets-configs/action-base-config.mjs b/module/applications/sheets-configs/action-base-config.mjs index dda9a2b4..5fa37915 100644 --- a/module/applications/sheets-configs/action-base-config.mjs +++ b/module/applications/sheets-configs/action-base-config.mjs @@ -388,10 +388,8 @@ export default class DHActionBaseConfig extends DaggerheartSheet(ApplicationV2) if (!this.action.damage.parts) return; const outcome = button.dataset.outcome; - const outcomeParts = - outcome === 'default' - ? this.action._source.damage.parts - : this.action._source.damage.altOutcomes[outcome].parts; + const source = this.action._source; + const outcomeParts = outcome === 'default' ? source.damage.parts : source.damage.altOutcomes[outcome].parts; const choices = getUnusedDamageTypes(outcomeParts); const content = new foundry.data.fields.StringField({ label: game.i18n.localize('Damage Type'), @@ -412,32 +410,23 @@ export default class DHActionBaseConfig extends DaggerheartSheet(ApplicationV2) const type = choices[button.form.elements.type.value].value; const part = this.action.schema.fields.damage.fields.parts.element.getInitialValue(); part.applyTo = type; - if (type === CONFIG.DH.GENERAL.healingTypes.hitPoints.id) + if (type === CONFIG.DH.GENERAL.healingTypes.hitPoints.id) { part.type = this.action.schema.fields.damage.fields.parts.element.fields.type.element.initial; - - if (outcome === 'default') data.damage.parts[type] = part; - else { - if (!data.damage.altOutcomes[outcome]) { - data.damage.altOutcomes[outcome] = new AltDamageOutcome(); - } - - data.damage.altOutcomes[outcome].parts[type] = part; } - + if (outcome !== 'default') data.damage.altOutcomes[outcome] ??= new AltDamageOutcome(); + (outcome === 'default' ? data.damage.parts : data.damage.altOutcomes[outcome])[type] = part; this.constructor.updateForm.bind(this)(null, null, { object: foundry.utils.flattenObject(data) }); }; const typeDialog = new foundry.applications.api.DialogV2({ buttons: [ - foundry.utils.mergeObject( - { - action: 'ok', - label: 'Confirm', - icon: 'fas fa-check', - default: true - }, - { callback: callback } - ) + { + action: 'ok', + label: 'Confirm', + icon: 'fas fa-check', + default: true, + callback + } ], content: content, rejectClose: false, @@ -455,14 +444,8 @@ export default class DHActionBaseConfig extends DaggerheartSheet(ApplicationV2) if (!this.action.damage.parts) return; const data = this.action.toObject(); const { key, outcome } = button.dataset; - if (outcome === 'default') { - delete data.damage.parts[key]; - data.damage.parts[`${key}`] = _del; - } else { - delete data.damage.altOutcomes[outcome].parts[key]; - data.damage.altOutcomes[outcome].parts[`${key}`] = _del; - } - + const parts = outcome === 'default' ? data.damage.parts : data.damage.altOutcomes[outcome].parts; + parts[key] = _del; this.constructor.updateForm.bind(this)(null, null, { object: foundry.utils.flattenObject(data) }); }