From 7ff7f718ed54ba4eed2d1307633ad8338200ad14 Mon Sep 17 00:00:00 2001 From: WBHarry Date: Thu, 24 Jul 2025 21:42:05 +0200 Subject: [PATCH] Remade apps handling --- .../sheets/api/application-mixin.mjs | 29 +++++++++-------- module/applications/sheets/items/ancestry.mjs | 5 +++ .../applications/sheets/items/beastform.mjs | 5 +++ module/applications/sheets/items/class.mjs | 5 +++ .../applications/sheets/items/community.mjs | 5 +++ module/applications/sheets/items/subclass.mjs | 5 +++ module/data/item/base.mjs | 31 +++++++++++++++++++ 7 files changed, 72 insertions(+), 13 deletions(-) diff --git a/module/applications/sheets/api/application-mixin.mjs b/module/applications/sheets/api/application-mixin.mjs index 92653df4..ed289d8c 100644 --- a/module/applications/sheets/api/application-mixin.mjs +++ b/module/applications/sheets/api/application-mixin.mjs @@ -108,6 +108,13 @@ export default function DHApplicationMixin(Base) { tagifyConfigs: [] }; + /** + * Related documents that should cause a rerender of this application when updated. + */ + get relatedDocs() { + return []; + } + /* -------------------------------------------- */ /**@inheritdoc */ @@ -118,9 +125,17 @@ export default function DHApplicationMixin(Base) { /**@inheritdoc */ async _onFirstRender(context, options) { await super._onFirstRender(context, options); + this.relatedDocs.map(doc => (doc.apps[this.id] = this)); + if (!!this.options.contextMenus.length) this._createContextMenus(); } + /** @inheritDoc */ + _onClose(options) { + super._onClose(options); + this.relatedDocs.map(doc => delete doc.apps[this.id]); + } + /**@inheritdoc */ async _onRender(context, options) { await super._onRender(context, options); @@ -511,19 +526,7 @@ export default function DHApplicationMixin(Base) { */ static async #editDoc(_event, target) { const doc = getDocFromElement(target); - if (doc) { - const appId = this.element.id; - doc.apps[appId] = this; - const app = await doc.sheet.render({ force: true }); - app.addEventListener( - 'close', - () => { - delete doc.apps[appId]; - }, - { once: true } - ); - return; - } + if (doc) return doc.sheet.render({ force: true }); // TODO: REDO this const { actionId } = target.closest('[data-action-id]').dataset; diff --git a/module/applications/sheets/items/ancestry.mjs b/module/applications/sheets/items/ancestry.mjs index d806d39f..c7796f9a 100644 --- a/module/applications/sheets/items/ancestry.mjs +++ b/module/applications/sheets/items/ancestry.mjs @@ -13,6 +13,11 @@ export default class AncestrySheet extends DHHeritageSheet { features: { template: 'systems/daggerheart/templates/sheets/items/ancestry/features.hbs' } }; + /**@inheritdoc */ + get relatedDocs() { + return this.document.system.features.map(x => x.item); + } + /* -------------------------------------------- */ /* Application Drag/Drop */ /* -------------------------------------------- */ diff --git a/module/applications/sheets/items/beastform.mjs b/module/applications/sheets/items/beastform.mjs index 8894b694..1d6adcd3 100644 --- a/module/applications/sheets/items/beastform.mjs +++ b/module/applications/sheets/items/beastform.mjs @@ -31,6 +31,11 @@ export default class BeastformSheet extends DHBaseItemSheet { } }; + /**@inheritdoc */ + get relatedDocs() { + return this.document.system.features; + } + _attachPartListeners(partId, htmlElement, options) { super._attachPartListeners(partId, htmlElement, options); diff --git a/module/applications/sheets/items/class.mjs b/module/applications/sheets/items/class.mjs index 4244879c..e4c04b62 100644 --- a/module/applications/sheets/items/class.mjs +++ b/module/applications/sheets/items/class.mjs @@ -58,6 +58,11 @@ export default class ClassSheet extends DHBaseItemSheet { } }; + /**@inheritdoc */ + get relatedDocs() { + return this.document.system.features.map(x => x.item); + } + /**@inheritdoc */ async _prepareContext(_options) { const context = await super._prepareContext(_options); diff --git a/module/applications/sheets/items/community.mjs b/module/applications/sheets/items/community.mjs index 3650dec6..40af1eb3 100644 --- a/module/applications/sheets/items/community.mjs +++ b/module/applications/sheets/items/community.mjs @@ -15,4 +15,9 @@ export default class CommunitySheet extends DHHeritageSheet { scrollable: ['.feature'] } }; + + /**@inheritdoc */ + get relatedDocs() { + return this.document.system.features; + } } diff --git a/module/applications/sheets/items/subclass.mjs b/module/applications/sheets/items/subclass.mjs index 8748f883..54250f51 100644 --- a/module/applications/sheets/items/subclass.mjs +++ b/module/applications/sheets/items/subclass.mjs @@ -35,4 +35,9 @@ export default class SubclassSheet extends DHBaseItemSheet { labelPrefix: 'DAGGERHEART.GENERAL.Tabs' } }; + + /**@inheritdoc */ + get relatedDocs() { + return this.document.system.features.map(x => x.item); + } } diff --git a/module/data/item/base.mjs b/module/data/item/base.mjs index 09edfb58..636ca7ad 100644 --- a/module/data/item/base.mjs +++ b/module/data/item/base.mjs @@ -148,4 +148,35 @@ export default class BaseDataItem extends foundry.abstract.TypeDataModel { items.map(x => x.id) ); } + + async _preUpdate(changed, options, userId) { + const allowed = await super._preUpdate(changed, options, userId); + if (allowed === false) return false; + + if (changed.system?.features) { + const prevFeatures = new Set(this.features); + const newFeatures = new Set(changed.system.features); + options.changedFeatures = { + toLink: Array.from(newFeatures.difference(prevFeatures).map(feature => feature.item ?? feature)), + toUnlink: Array.from( + prevFeatures.difference(newFeatures).map(feature => feature.item?.uuid ?? feature.uuid) + ) + }; + } + } + + _onUpdate(changed, options, userId) { + super._onUpdate(changed, options, userId); + + if (options.changedFeatures) { + options.changedFeatures.toLink.forEach(featureUuid => { + const doc = foundry.utils.fromUuidSync(featureUuid); + doc.apps[this.parent.sheet.id] = this.parent.sheet; + }); + options.changedFeatures.toUnlink.forEach(featureUuid => { + const doc = foundry.utils.fromUuidSync(featureUuid); + delete doc.apps[this.parent.sheet.id]; + }); + } + } }