From c958acabe6d2554b0153be788ac3d39fcbea91ad Mon Sep 17 00:00:00 2001 From: WBHarry <89362246+WBHarry@users.noreply.github.com> Date: Tue, 13 Jan 2026 19:12:50 +0100 Subject: [PATCH] [Fix] Release Fixes (#1530) * Various fixes * . * . * . --- daggerheart.mjs | 9 +++++---- .../applications/scene/sceneConfigSettings.mjs | 15 +++++++-------- .../sheets/api/application-mixin.mjs | 1 + module/applications/ui/itemBrowser.mjs | 8 ++++++++ module/applications/ui/sceneNavigation.mjs | 2 +- module/canvas/placeables/token.mjs | 2 +- module/data/action/attackAction.mjs | 1 + module/dice/damageRoll.mjs | 6 ++++-- module/documents/tooltipManager.mjs | 16 +++++++++++++--- module/systemRegistration/socket.mjs | 4 ---- templates/ui/itemBrowser/itemContainer.hbs | 2 +- 11 files changed, 42 insertions(+), 24 deletions(-) diff --git a/daggerheart.mjs b/daggerheart.mjs index cd4dbc19..f27892e2 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -2,7 +2,6 @@ import { SYSTEM } from './module/config/system.mjs'; import * as applications from './module/applications/_module.mjs'; import * as data from './module/data/_module.mjs'; import * as models from './module/data/_module.mjs'; -import * as canvas from './module/canvas/_module.mjs'; import * as documents from './module/documents/_module.mjs'; import * as dice from './module/dice/_module.mjs'; import * as fields from './module/data/fields/_module.mjs'; @@ -17,7 +16,7 @@ import { settingsRegistration, socketRegistration } from './module/systemRegistration/_module.mjs'; -import { placeables } from './module/canvas/_module.mjs'; +import { placeables, DhTokenLayer } from './module/canvas/_module.mjs'; import './node_modules/@yaireo/tagify/dist/tagify.css'; import TemplateManager from './module/documents/templateManager.mjs'; import TokenManager from './module/documents/tokenManager.mjs'; @@ -53,7 +52,7 @@ CONFIG.ChatMessage.template = 'systems/daggerheart/templates/ui/chat/chat-messag CONFIG.Canvas.rulerClass = placeables.DhRuler; CONFIG.Canvas.layers.templates.layerClass = placeables.DhTemplateLayer; -CONFIG.Canvas.layers.tokens.layerClass = canvas.DhTokenLayer; +CONFIG.Canvas.layers.tokens.layerClass = DhTokenLayer; CONFIG.MeasuredTemplate.objectClass = placeables.DhMeasuredTemplate; @@ -359,7 +358,9 @@ const updateAllRangeDependentEffects = async () => { const effectsAutomation = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).effects; if (!effectsAutomation.rangeDependent) return; - const tokens = canvas.scene.tokens; + const tokens = canvas.scene?.tokens; + if (!tokens) return; + if (game.user.character) { // The character updates their character's token. There can be only one token. const characterToken = tokens.find(x => x.actor === game.user.character); diff --git a/module/applications/scene/sceneConfigSettings.mjs b/module/applications/scene/sceneConfigSettings.mjs index 1b93aa8c..8a58db5c 100644 --- a/module/applications/scene/sceneConfigSettings.mjs +++ b/module/applications/scene/sceneConfigSettings.mjs @@ -5,10 +5,7 @@ export default class DhSceneConfigSettings extends foundry.applications.sheets.S super(options); Hooks.on(socketEvent.Refresh, ({ refreshType }) => { - if (refreshType === RefreshType.Scene) { - this.daggerheartFlag = new game.system.api.data.scenes.DHScene(this.document.flags.daggerheart); - this.render(); - } + if (refreshType === RefreshType.Scene) this.render(); }); } @@ -42,7 +39,9 @@ export default class DhSceneConfigSettings extends foundry.applications.sheets.S async _preRender(context, options) { await super._preFirstRender(context, options); - this.daggerheartFlag = new game.system.api.data.scenes.DHScene(this.document.flags.daggerheart); + + if (!options.internalRefresh) + this.daggerheartFlag = new game.system.api.data.scenes.DHScene(this.document.flags.daggerheart); } _attachPartListeners(partId, htmlElement, options) { @@ -52,7 +51,7 @@ export default class DhSceneConfigSettings extends foundry.applications.sheets.S case 'dh': htmlElement.querySelector('#rangeMeasurementSetting')?.addEventListener('change', async event => { this.daggerheartFlag.updateSource({ rangeMeasurement: { setting: event.target.value } }); - this.render(); + this.render({ internalRefresh: true }); }); const dragArea = htmlElement.querySelector('.scene-environments'); @@ -69,7 +68,7 @@ export default class DhSceneConfigSettings extends foundry.applications.sheets.S await this.daggerheartFlag.updateSource({ sceneEnvironments: [...this.daggerheartFlag.sceneEnvironments, data.uuid] }); - this.render(); + this.render({ internalRefresh: true }); } } @@ -92,7 +91,7 @@ export default class DhSceneConfigSettings extends foundry.applications.sheets.S (_, index) => index !== Number.parseInt(button.dataset.index) ) }); - this.render(); + this.render({ internalRefresh: true }); } /** @override */ diff --git a/module/applications/sheets/api/application-mixin.mjs b/module/applications/sheets/api/application-mixin.mjs index 903caa2a..7276316f 100644 --- a/module/applications/sheets/api/application-mixin.mjs +++ b/module/applications/sheets/api/application-mixin.mjs @@ -505,6 +505,7 @@ export default function DHApplicationMixin(Base) { const doc = await getDocFromElement(target), action = doc?.system?.attack ?? doc; const config = action.prepareConfig(event); + config.effects = Array.from(await this.document.allApplicableEffects()); config.hasRoll = false; return action && action.workflow.get('damage').execute(config, null, true); } diff --git a/module/applications/ui/itemBrowser.mjs b/module/applications/ui/itemBrowser.mjs index 794c3fb6..b35573f7 100644 --- a/module/applications/ui/itemBrowser.mjs +++ b/module/applications/ui/itemBrowser.mjs @@ -230,6 +230,14 @@ export class ItemBrowser extends HandlebarsApplicationMixin(ApplicationV2) { result.flatMap(r => r), 'name' ); + + /* If any noticeable slowdown occurs, consider replacing with enriching description on clicking to expand descriptions */ + for (const item of this.items) { + item.system.enrichedDescription = + (await item.system.getEnrichedDescription?.()) ?? + (await foundry.applications.ux.TextEditor.implementation.enrichHTML(item.description)); + } + this.fieldFilter = this._createFieldFilter(); if (this.presets?.filter) { diff --git a/module/applications/ui/sceneNavigation.mjs b/module/applications/ui/sceneNavigation.mjs index ac16ac99..0a3e08a5 100644 --- a/module/applications/ui/sceneNavigation.mjs +++ b/module/applications/ui/sceneNavigation.mjs @@ -31,7 +31,7 @@ export default class DhSceneNavigation extends foundry.applications.ui.SceneNavi const environments = daggerheartInfo.sceneEnvironments.filter( x => x && x.testUserPermission(game.user, 'LIMITED') ); - const hasEnvironments = environments.length > 0; + const hasEnvironments = environments.length > 0 && x.isView; return { ...x, hasEnvironments, diff --git a/module/canvas/placeables/token.mjs b/module/canvas/placeables/token.mjs index d8acb73a..2266d0da 100644 --- a/module/canvas/placeables/token.mjs +++ b/module/canvas/placeables/token.mjs @@ -153,7 +153,7 @@ export default class DhTokenPlaceable extends foundry.canvas.placeables.Token { textStyle.wordWrapWidth = this.w * 2.5; textStyle.fontStyle = 'italic'; - const helpText = new PreciseText( + const helpText = new foundry.canvas.containers.PreciseText( `(${game.i18n.localize('DAGGERHEART.UI.Tooltip.previewTokenHelp')})`, textStyle ); diff --git a/module/data/action/attackAction.mjs b/module/data/action/attackAction.mjs index ed97072f..7be7461d 100644 --- a/module/data/action/attackAction.mjs +++ b/module/data/action/attackAction.mjs @@ -36,6 +36,7 @@ export default class DHAttackAction extends DHDamageAction { async use(event, options) { const result = await super.use(event, options); + if (!result.message) return; if (result.message.system.action.roll?.type === 'attack') { const { updateCountdowns } = game.system.api.applications.ui.DhCountdowns; diff --git a/module/dice/damageRoll.mjs b/module/dice/damageRoll.mjs index 482d2c41..cd26eb21 100644 --- a/module/dice/damageRoll.mjs +++ b/module/dice/damageRoll.mjs @@ -112,10 +112,12 @@ export default class DamageRoll extends DHRoll { const changeKeys = []; for (const roll of this.options.roll) { - for (const damageType of roll.damageTypes) changeKeys.push(`system.bonuses.${type}.${damageType}`); + for (const damageType of roll.damageTypes?.values?.() ?? []) { + changeKeys.push(`system.bonuses.${type}.${damageType}`); + } } - const item = this.data.parent.items?.get(this.options.source.item); + const item = this.data.parent?.items?.get(this.options.source.item); if (item) { switch (item.type) { case 'weapon': diff --git a/module/documents/tooltipManager.mjs b/module/documents/tooltipManager.mjs index dac5aea3..c4b52bb5 100644 --- a/module/documents/tooltipManager.mjs +++ b/module/documents/tooltipManager.mjs @@ -67,7 +67,7 @@ export default class DhTooltipManager extends foundry.helpers.interaction.Toolti if (item) { const isAction = item instanceof game.system.api.models.actions.actionsTypes.base; const isEffect = item instanceof ActiveEffect; - await this.enrichText(item, isAction || isEffect); + await this.enrichText(item); const type = isAction ? 'action' : isEffect ? 'effect' : item.type; html = await foundry.applications.handlebars.renderTemplate( @@ -202,10 +202,20 @@ export default class DhTooltipManager extends foundry.helpers.interaction.Toolti } } - async enrichText(item, flatStructure) { + async enrichText(item) { const { TextEditor } = foundry.applications.ux; + + if (item.system?.metadata?.hasDescription) { + const enrichedValue = + (await item.system?.getEnrichedDescription?.()) ?? + (await TextEditor.enrichHTML(item.system.description)); + foundry.utils.setProperty(item, 'system.enrichedDescription', enrichedValue); + } else if (item.description) { + const enrichedValue = await TextEditor.enrichHTML(item.description); + foundry.utils.setProperty(item, 'enrichedDescription', enrichedValue); + } + const enrichPaths = [ - { path: flatStructure ? '' : 'system', name: 'description' }, { path: 'system', name: 'features' }, { path: 'system', name: 'actions' }, { path: 'system', name: 'customActions' } diff --git a/module/systemRegistration/socket.mjs b/module/systemRegistration/socket.mjs index 82ca2e1c..a9e86917 100644 --- a/module/systemRegistration/socket.mjs +++ b/module/systemRegistration/socket.mjs @@ -93,10 +93,6 @@ export const registerSocketHooks = () => { } } }); - Hooks.on(socketEvent.RefreshDocument, async data => { - const document = await foundry.utils.fromUuid(data.uuid); - document.sheet.render(); - }); }; export const registerUserQueries = () => { diff --git a/templates/ui/itemBrowser/itemContainer.hbs b/templates/ui/itemBrowser/itemContainer.hbs index f6aefa6b..0040a692 100644 --- a/templates/ui/itemBrowser/itemContainer.hbs +++ b/templates/ui/itemBrowser/itemContainer.hbs @@ -10,7 +10,7 @@