From f8c21ac8d8aecfd2b72f4d27344d7773626a7495 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 22 Nov 2025 00:08:19 -0700 Subject: [PATCH] Begin working on an attempt to make the required setting, but be blocked by Foundry for listening to open/close events on the prose-mirror editor --- langs/en-ca.json | 4 ++++ module/apps/PlayerSheet.mjs | 29 ++++++++++++++++++++++++++ module/hooks/init.mjs | 2 ++ module/settings/user.mjs | 12 +++++++++++ scripts/macros/testRequest.mjs | 34 +++++++++++++++++++++++++++++++ templates/PlayerSheet/content.hbs | 2 +- 6 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 module/settings/user.mjs create mode 100644 scripts/macros/testRequest.mjs diff --git a/langs/en-ca.json b/langs/en-ca.json index 1136454..95d9e86 100644 --- a/langs/en-ca.json +++ b/langs/en-ca.json @@ -9,6 +9,10 @@ "canPlayersManageAttributes": { "name": "Players Can Manage Attributes", "hint": "This allows players who have edit access to a document to be able to edit what attributes those characters have via the attribute editor" + }, + "openSheetInEdit": { + "name": "Open Sheets in Edit Mode", + "hint": "This makes the default when you open an Actor sheet for the first time each session to put the text editor into edit mode instead of read-only mode. On subsequent opens, the sheet" } }, "sheet-names": { diff --git a/module/apps/PlayerSheet.mjs b/module/apps/PlayerSheet.mjs index 257182a..d677532 100644 --- a/module/apps/PlayerSheet.mjs +++ b/module/apps/PlayerSheet.mjs @@ -64,6 +64,33 @@ export class PlayerSheet extends HandlebarsApplicationMixin(ActorSheetV2) { return super._initializeApplicationOptions(options); }; + /** @type {boolean | null} */ + #inEditMode = null; + async _onFirstRender(context, options) { + super._onFirstRender(context, options); + console.log(`_onFirstRender`) + this.#inEditMode ??= game.settings.get(__ID__, `openSheetInEdit`) ?? false; + this.element.querySelectorAll(`prose-mirror`).forEach(editor => { + editor.open = this.#inEditMode; + }); + }; + + async _onRender(context, options) { + super._onRender(context, options); + + if (options.parts?.includes(`content`)) { + const el = this.element.querySelector(`prose-mirror[name="system.content"]`); + el?.addEventListener(`open`, () => { + console.log(`event: open`); + this.#inEditMode = true; + }); + el?.addEventListener(`close`, () => { + console.log(`event: close`); + this.#inEditMode = false; + }); + }; + }; + _getHeaderControls() { const controls = super._getHeaderControls(); @@ -125,7 +152,9 @@ export class PlayerSheet extends HandlebarsApplicationMixin(ActorSheetV2) { ctx.attrs = attrs.toSorted(attributeSorter); }; + /** @type {boolean | null} */ async _prepareContent(ctx) { + const TextEditor = foundry.applications.ux.TextEditor.implementation; ctx.enriched = { system: { diff --git a/module/hooks/init.mjs b/module/hooks/init.mjs index f3db2fb..d12f5e3 100644 --- a/module/hooks/init.mjs +++ b/module/hooks/init.mjs @@ -10,6 +10,7 @@ import { TAFItem } from "../documents/Item.mjs"; import { TAFTokenDocument } from "../documents/Token.mjs"; // Settings +import { registerUserSettings } from "../settings/user.mjs"; import { registerWorldSettings } from "../settings/world.mjs"; // Utils @@ -41,6 +42,7 @@ Hooks.on(`init`, () => { ); registerWorldSettings(); + registerUserSettings(); registerSockets(); registerCustomComponents(); diff --git a/module/settings/user.mjs b/module/settings/user.mjs new file mode 100644 index 0000000..e8b26d6 --- /dev/null +++ b/module/settings/user.mjs @@ -0,0 +1,12 @@ +import { __ID__ } from "../consts.mjs"; + +export function registerUserSettings() { + game.settings.register(__ID__, `openSheetInEdit`, { + name: `taf.settings.openSheetInEdit.name`, + hint: `taf.settings.openSheetInEdit.hint`, + config: true, + type: Boolean, + default: false, + scope: `user`, + }); +}; diff --git a/scripts/macros/testRequest.mjs b/scripts/macros/testRequest.mjs new file mode 100644 index 0000000..1ac661f --- /dev/null +++ b/scripts/macros/testRequest.mjs @@ -0,0 +1,34 @@ +const rolls = {}; + +const response = await taf.QueryManager.query( + { + id: `test-data-request`, + question: `Test Data`, + inputs: [ + { + type: `input`, + inputType: `number`, + key: `statBase`, + label: `Stat Base`, + } + ], + }, + { + onSubmit: async (userID, answers) => { + + rolls[userID] = []; + + const diceHTML = []; + for (let i = 0; i < answers.statBase; i++) { + const rolled = Math.floor(Math.random() * 6) + 1; + rolls[userID].push(rolled); + diceHTML.push(`
  • ${rolled}
  • `); + }; + + const content = `Rolls:
      ${diceHTML.join(`\n`)}
    `; + + await taf.QueryManager.notify(userID, content); + }, + } +); +console.log({ response, rolls }); diff --git a/templates/PlayerSheet/content.hbs b/templates/PlayerSheet/content.hbs index c7b547d..771cf79 100644 --- a/templates/PlayerSheet/content.hbs +++ b/templates/PlayerSheet/content.hbs @@ -6,7 +6,7 @@ value="{{system.content}}" collaborate="true" data-document-uuid="{{actor.uuid}}" - toggled="true" + toggled > {{{ enriched.system.content }}}