[BUG] - Sending an active effect to chat doesnt work (#727)

Fixes #616

Co-authored-by: Joaquin Pereyra <joaquinpereyra98@users.noreply.github.com>
This commit is contained in:
joaquinpereyra98 2025-08-08 18:32:32 -03:00 committed by GitHub
parent 45b3569cba
commit 85982bac8c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 33 additions and 34 deletions

View file

@ -2259,11 +2259,6 @@
"abilityCheckTitle": "{ability} Check" "abilityCheckTitle": "{ability} Check"
}, },
"featureTitle": "Class Feature", "featureTitle": "Class Feature",
"foundationCard": {
"ancestryTitle": "Ancestry Card",
"communityTitle": "Community Card",
"subclassFeatureTitle": "Subclass Feature"
},
"healingRoll": { "healingRoll": {
"title": "Heal - {damage}", "title": "Heal - {damage}",
"heal": "Heal", "heal": "Heal",

View file

@ -51,9 +51,8 @@ import { ItemBrowser } from '../../ui/itemBrowser.mjs';
*/ */
/** /**
* @template {Constructor<foundry.applications.api.DocumentSheet>} BaseDocumentSheet * @template {new (...args: any[]) => {}} T
* @param {BaseDocumentSheet} Base - The base class to extend. * @arg Base {T}
* @returns {BaseDocumentSheet}
*/ */
export default function DHApplicationMixin(Base) { export default function DHApplicationMixin(Base) {
class DHSheetV2 extends HandlebarsApplicationMixin(Base) { class DHSheetV2 extends HandlebarsApplicationMixin(Base) {
@ -123,12 +122,13 @@ export default function DHApplicationMixin(Base) {
super._attachPartListeners(partId, htmlElement, options); super._attachPartListeners(partId, htmlElement, options);
this._dragDrop.forEach(d => d.bind(htmlElement)); this._dragDrop.forEach(d => d.bind(htmlElement));
} }
/**@inheritdoc */ /**@inheritdoc */
async _onFirstRender(context, options) { async _onFirstRender(context, options) {
await super._onFirstRender(context, options); await super._onFirstRender(context, options);
const docs = []; const docs = [];
for (var docData of this.relatedDocs) { for (const docData of this.relatedDocs) {
const doc = await foundry.utils.fromUuid(docData.uuid); const doc = await foundry.utils.fromUuid(docData.uuid);
docs.push(doc); docs.push(doc);
} }
@ -247,6 +247,9 @@ export default function DHApplicationMixin(Base) {
/* Context Menu */ /* Context Menu */
/* -------------------------------------------- */ /* -------------------------------------------- */
/**
* Create all configured context menus for this application ins tance.
*/
_createContextMenus() { _createContextMenus() {
for (const config of this.options.contextMenus) { for (const config of this.options.contextMenus) {
const { handler, selector, options } = config; const { handler, selector, options } = config;
@ -257,9 +260,9 @@ export default function DHApplicationMixin(Base) {
/* -------------------------------------------- */ /* -------------------------------------------- */
/** /**
* Get the set of ContextMenu options for DomainCards. * Get the set of ContextMenu options for ActiveEffects.
* @returns {import('@client/applications/ux/context-menu.mjs').ContextMenuEntry[]} - The Array of context options passed to the ContextMenu instance * @returns {import('@client/applications/ux/context-menu.mjs').ContextMenuEntry[]} - The Array of context options passed to the ContextMenu instance
* @this {CharacterSheet} * @this {DHSheetV2}
* @protected * @protected
*/ */
static #getEffectContextOptions() { static #getEffectContextOptions() {
@ -305,8 +308,13 @@ export default function DHApplicationMixin(Base) {
} }
/** /**
* Get the set of ContextMenu options. * Get the common ContextMenu options for an element.
* @returns {import('@client/applications/ux/context-menu.mjs').ContextMenuEntry[]} - The Array of context options passed to the ContextMenu instance * @param {Object} options
* @param {boolean} [options.usable=false] - Whether to include an option to use the item or apply damage.
* @param {boolean} [options.toChat=false] - Whether to include an option to send the item to chat.
* @param {boolean} [options.deletable=true] - Whether to include an option to delete the item.
*
* @returns {import('@client/applications/ux/context-menu.mjs').ContextMenuEntry[]}
*/ */
_getContextMenuCommonOptions({ usable = false, toChat = false, deletable = true }) { _getContextMenuCommonOptions({ usable = false, toChat = false, deletable = true }) {
const options = [ const options = [

View file

@ -7,8 +7,6 @@ const { ActorSheetV2 } = foundry.applications.sheets;
/** /**
* A base actor sheet extending {@link ActorSheetV2} via {@link DHApplicationMixin} * A base actor sheet extending {@link ActorSheetV2} via {@link DHApplicationMixin}
* @extends ActorSheetV2
* @mixes DHSheetV2
*/ */
export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) { export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) {
/** @inheritDoc */ /** @inheritDoc */
@ -106,7 +104,7 @@ export default class DHBaseActorSheet extends DHApplicationMixin(ActorSheetV2) {
/** /**
* Get the set of ContextMenu options for Features. * Get the set of ContextMenu options for Features.
* @returns {import('@client/applications/ux/context-menu.mjs').ContextMenuEntry[]} - The Array of context options passed to the ContextMenu instance * @returns {import('@client/applications/ux/context-menu.mjs').ContextMenuEntry[]} - The Array of context options passed to the ContextMenu instance
* @this {DHSheetV2} * @this {DHBaseActorSheet}
* @protected * @protected
*/ */
static #getFeatureContextOptions() { static #getFeatureContextOptions() {

View file

@ -7,8 +7,6 @@ const { ItemSheetV2 } = foundry.applications.sheets;
/** /**
* A base item sheet extending {@link ItemSheetV2} via {@link DHApplicationMixin} * A base item sheet extending {@link ItemSheetV2} via {@link DHApplicationMixin}
* @extends ItemSheetV2
* @mixes DHSheetV2
*/ */
export default class DHBaseItemSheet extends DHApplicationMixin(ItemSheetV2) { export default class DHBaseItemSheet extends DHApplicationMixin(ItemSheetV2) {
/** @inheritDoc */ /** @inheritDoc */
@ -108,7 +106,7 @@ export default class DHBaseItemSheet extends DHApplicationMixin(ItemSheetV2) {
/** /**
* Get the set of ContextMenu options for Features. * Get the set of ContextMenu options for Features.
* @returns {import('@client/applications/ux/context-menu.mjs').ContextMenuEntry[]} - The Array of context options passed to the ContextMenu instance * @returns {import('@client/applications/ux/context-menu.mjs').ContextMenuEntry[]} - The Array of context options passed to the ContextMenu instance
* @this {DHSheetV2} * @this {DHBaseItemSheet}
* @protected * @protected
*/ */
static #getFeatureContextOptions() { static #getFeatureContextOptions() {

View file

@ -3,7 +3,6 @@ export default class DHAbilityUse extends foundry.abstract.TypeDataModel {
const fields = foundry.data.fields; const fields = foundry.data.fields;
return { return {
title: new fields.StringField({}),
origin: new fields.StringField({}), origin: new fields.StringField({}),
img: new fields.StringField({}), img: new fields.StringField({}),
name: new fields.StringField({}), name: new fields.StringField({}),

View file

@ -124,15 +124,20 @@ export default class DhActiveEffect extends foundry.documents.ActiveEffect {
return tags; return tags;
} }
/**
* Create a new ChatMessage to display this documents data.
* @param {String} origin - uuid of a document. TODO: This needs to be reviewed.
*/
async toChat(origin) { async toChat(origin) {
/**@type {foundry.documents.ChatMessage} */
const cls = getDocumentClass('ChatMessage'); const cls = getDocumentClass('ChatMessage');
const actor = game.actors.get(cls.getSpeaker().actor); const speaker = cls.getSpeaker();
const actor = cls.getSpeakerActor(speaker);
const systemData = { const systemData = {
action: { img: this.img, name: this.name }, action: { img: this.img, name: this.name },
actor: { name: actor.name, img: actor.img }, actor: { name: actor?.name, img: actor?.img },
author: this.author, speaker,
speaker: cls.getSpeaker(), origin,
origin: origin,
description: this.description, description: this.description,
actions: [] actions: []
}; };

View file

@ -142,19 +142,16 @@ export default class DHItem extends foundry.documents.Item {
} }
} }
/**
* Create a new ChatMessage to display this documents data
* @param {String} origin - uuid of a document. TODO: This needs to be reviewed.
*/
async toChat(origin) { async toChat(origin) {
/**@type {foundry.documents.ChatMessage} */
const cls = getDocumentClass('ChatMessage'); const cls = getDocumentClass('ChatMessage');
const item = await foundry.utils.fromUuid(origin); const item = await foundry.utils.fromUuid(origin);
const systemData = { const systemData = {
title:
this.type === 'ancestry'
? game.i18n.localize('DAGGERHEART.UI.Chat.foundationCard.ancestryTitle')
: this.type === 'community'
? game.i18n.localize('DAGGERHEART.UI.Chat.foundationCard.communityTitle')
: this.type === 'feature'
? game.i18n.localize('TYPES.Item.feature')
: game.i18n.localize('DAGGERHEART.UI.Chat.foundationCard.subclassFeatureTitle'),
origin: origin, origin: origin,
img: this.img, img: this.img,
item: { item: {
@ -170,7 +167,6 @@ export default class DHItem extends foundry.documents.Item {
type: 'abilityUse', type: 'abilityUse',
user: game.user.id, user: game.user.id,
actor: item.parent, actor: item.parent,
author: this.author,
speaker: cls.getSpeaker(), speaker: cls.getSpeaker(),
system: systemData, system: systemData,
title: game.i18n.localize('DAGGERHEART.ACTIONS.Config.displayInChat'), title: game.i18n.localize('DAGGERHEART.ACTIONS.Config.displayInChat'),