From ff4f6a22d3089b8064b062d60c9acf1dab27027b Mon Sep 17 00:00:00 2001 From: Joaquin Pereyra Date: Wed, 11 Jun 2025 15:02:58 -0300 Subject: [PATCH] FEAT: basic PseudoDocumentSheet --- module/applications/_module.mjs | 2 + .../sheets/pseudo-documents/_module.mjs | 1 + .../pseudo-documents-sheet.mjs | 67 +++++++++++++++++++ module/config/pseudoConfig.mjs | 4 +- module/data/pseudo-documents/base/base.mjs | 2 +- .../base/sheetManagementMixin.mjs | 4 +- .../feature/baseFeatureData.mjs | 2 +- templates/sheets/pseudo-documents/header.hbs | 3 + 8 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 module/applications/sheets/pseudo-documents/_module.mjs create mode 100644 module/applications/sheets/pseudo-documents/pseudo-documents-sheet.mjs create mode 100644 templates/sheets/pseudo-documents/header.hbs diff --git a/module/applications/_module.mjs b/module/applications/_module.mjs index 5c031db0..c879f315 100644 --- a/module/applications/_module.mjs +++ b/module/applications/_module.mjs @@ -12,3 +12,5 @@ export { default as DhpWeapon } from './sheets/items/weapon.mjs'; export { default as DhpArmor } from './sheets/items/armor.mjs'; export { default as DhpChatMessage } from './chatMessage.mjs'; export { default as DhpEnvironment } from './sheets/environment.mjs'; + +export * as pseudoDocumentSheet from "./sheets/pseudo-documents/_module.mjs"; \ No newline at end of file diff --git a/module/applications/sheets/pseudo-documents/_module.mjs b/module/applications/sheets/pseudo-documents/_module.mjs new file mode 100644 index 00000000..9dc4d356 --- /dev/null +++ b/module/applications/sheets/pseudo-documents/_module.mjs @@ -0,0 +1 @@ +export {default as PseudoDocumentSheet }from "./pseudo-documents-sheet.mjs"; \ No newline at end of file diff --git a/module/applications/sheets/pseudo-documents/pseudo-documents-sheet.mjs b/module/applications/sheets/pseudo-documents/pseudo-documents-sheet.mjs new file mode 100644 index 00000000..3192403a --- /dev/null +++ b/module/applications/sheets/pseudo-documents/pseudo-documents-sheet.mjs @@ -0,0 +1,67 @@ +const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api; + +export default class PseudoDocumentSheet extends HandlebarsApplicationMixin(ApplicationV2) { + constructor(options) { + super(options); + this.#pseudoDocument = options.document; + } + + /** + * The UUID of the associated pseudo-document + * @type {string} + */ + get pseudoUuid() { + return this.pseudoDocument.uuid; + } + + #pseudoDocument; + + /** + * The pseudo-document instance this sheet represents + * @type {object} + */ + get pseudoDocument() { + return this.#pseudoDocument; + } + + static DEFAULT_OPTIONS = { + tag: 'form', + classes: ['daggerheart', 'sheet'], + position: { width: 600 }, + form: { + handler: PseudoDocumentSheet.#onSubmitForm, + submitOnChange: true, + closeOnSubmit: false + }, + dragDrop: [{ dragSelector: null, dropSelector: null }], + }; + + static PARTS = { + header: { template: 'systems/daggerheart/templates/sheets/pseudo-documents/header.hbs' }, + }; + + /** @inheritDoc */ + async _prepareContext(options) { + const context = await super._prepareContext(options); + const document = this.pseudoDocument; + return Object.assign(context, { + document, + source: document._source, + fields: document.schema.fields, + editable: this.isEditable, + user: game.user, + rootId: this.id, + }); + } + + /** + * Form submission handler + * @param {SubmitEvent | Event} event - The originating form submission or input change event + * @param {HTMLFormElement} form - The form element that was submitted + * @param {foundry.applications.ux.FormDataExtended} formData - Processed data for the submitted form + */ + static async #onSubmitForm(event, form, formData) { + const submitData = foundry.utils.expandObject(formData.object); + await this.pseudoDocument.update(submitData, options); + } +} diff --git a/module/config/pseudoConfig.mjs b/module/config/pseudoConfig.mjs index 7312f59d..297d42cf 100644 --- a/module/config/pseudoConfig.mjs +++ b/module/config/pseudoConfig.mjs @@ -1,12 +1,14 @@ import { pseudoDocuments } from "../data/_module.mjs"; +import { pseudoDocumentSheet } from "../applications/_module.mjs"; //CONFIG.daggerheart.pseudoDocuments export default { + sheetClass: pseudoDocumentSheet.PseudoDocumentSheet, feature: { label: "DAGGERHEART.Feature.Label", documentClass: pseudoDocuments.feature.BaseFeatureData, types: { - weapon:{ + weapon: { label: "DAGGERHEART.Feature.Weapon.Label", documentClass: pseudoDocuments.feature.WeaponFeature, } diff --git a/module/data/pseudo-documents/base/base.mjs b/module/data/pseudo-documents/base/base.mjs index e7dcce4a..4d5313ba 100644 --- a/module/data/pseudo-documents/base/base.mjs +++ b/module/data/pseudo-documents/base/base.mjs @@ -20,7 +20,7 @@ export default class BasePseudoDocument extends foundry.abstract.DataModel { name: '', embedded: {}, defaultArtwork: foundry.documents.Item.DEFAULT_ICON, - sheetClass: null + sheetClass: CONFIG.daggerheart.pseudoDocuments.sheetClass, }; } diff --git a/module/data/pseudo-documents/base/sheetManagementMixin.mjs b/module/data/pseudo-documents/base/sheetManagementMixin.mjs index 11b053e1..796faf51 100644 --- a/module/data/pseudo-documents/base/sheetManagementMixin.mjs +++ b/module/data/pseudo-documents/base/sheetManagementMixin.mjs @@ -16,7 +16,8 @@ export default function SheetManagementMixin(Base) { get sheet() { if (this._sheet) return this._sheet; const cls = this.constructor.metadata.sheetClass ?? ApplicationV2; - if (!ApplicationV2.isPrototypeOf(cls)) { + + if (!foundry.utils.isSubclass(cls, ApplicationV2)) { return void ui.notifications.error( 'Daggerheart | Error on PseudoDocument | sheetClass must be ApplicationV2' ); @@ -24,6 +25,7 @@ export default function SheetManagementMixin(Base) { const sheet = new cls({ document: this }); this._sheet = sheet; + return sheet; } /* -------------------------------------------- */ diff --git a/module/data/pseudo-documents/feature/baseFeatureData.mjs b/module/data/pseudo-documents/feature/baseFeatureData.mjs index e693d9f1..61d1468d 100644 --- a/module/data/pseudo-documents/feature/baseFeatureData.mjs +++ b/module/data/pseudo-documents/feature/baseFeatureData.mjs @@ -8,7 +8,7 @@ export default class BaseFeatureData extends PseudoDocument { { name: 'feature', embedded: {}, - sheetClass: null //TODO: define feature-sheet + //sheetClass: null //TODO: define feature-sheet }, { inplace: false } ); diff --git a/templates/sheets/pseudo-documents/header.hbs b/templates/sheets/pseudo-documents/header.hbs new file mode 100644 index 00000000..759a8d74 --- /dev/null +++ b/templates/sheets/pseudo-documents/header.hbs @@ -0,0 +1,3 @@ +
+ {{log this}} +
\ No newline at end of file