From b36fe27182562c2f4fb69b2dbf1cd15b8bfebc68 Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 7 May 2026 18:05:00 -0600 Subject: [PATCH 1/5] Fix the issue with ContextMenus being completely non-functional in v13 (closes #91) --- module/apps/PlayerSheet.mjs | 10 +++++----- module/apps/utils.mjs | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/module/apps/PlayerSheet.mjs b/module/apps/PlayerSheet.mjs index 74830d6..7002a72 100644 --- a/module/apps/PlayerSheet.mjs +++ b/module/apps/PlayerSheet.mjs @@ -1,5 +1,5 @@ import { __ID__, filePath } from "../consts.mjs"; -import { deleteItemFromElement, editItemFromElement } from "./utils.mjs"; +import { createContextMenuOption, deleteItemFromElement, editItemFromElement } from "./utils.mjs"; import { config } from "../config.mjs"; import { Logger } from "../utils/Logger.mjs"; import { TAFDocumentSheetConfig } from "./TAFDocumentSheetConfig.mjs"; @@ -226,7 +226,7 @@ export class PlayerSheet extends this.element, `[data-item-uuid]`, [ - { + createContextMenuOption({ label: _loc(`taf.misc.edit`), condition: (el) => { const itemUuid = el.dataset.itemUuid; @@ -234,8 +234,8 @@ export class PlayerSheet extends return this.isEditable && itemExists; }, onClick: editItemFromElement, - }, - { + }), + createContextMenuOption({ label: _loc(`taf.misc.delete`), condition: (el) => { const itemUuid = el.dataset.itemUuid; @@ -243,7 +243,7 @@ export class PlayerSheet extends return this.isEditable && itemExists; }, onClick: deleteItemFromElement, - }, + }), ], { jQuery: false, fixed: true }, ); diff --git a/module/apps/utils.mjs b/module/apps/utils.mjs index de8edcc..e6e492a 100644 --- a/module/apps/utils.mjs +++ b/module/apps/utils.mjs @@ -3,6 +3,25 @@ This file contains utility methods used by Applications in order to be DRYer */ +/** + * A helper function that takes a v14-compatible ContextMenuEntry option + * and adjusts it for v13 if required + * + * @param {ContextMenuEntry} option The v14+ compatible menu entry option + * @returns {ContextMenuEntry} The v14+ or option.onClick(null, target), + }; + }; + + return option; +}; + /** * @param {Event} _event The click event * @param {HTMLElement} target The element to operate on From 500eabc755b7938a14ec63be87eae113e423fa95 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 10 May 2026 14:56:28 -0600 Subject: [PATCH 2/5] Fix the deprecation warning in v14 & hide the context menu options in v13 correctly --- module/apps/PlayerSheet.mjs | 4 ++-- module/apps/utils.mjs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/module/apps/PlayerSheet.mjs b/module/apps/PlayerSheet.mjs index 7002a72..46c3225 100644 --- a/module/apps/PlayerSheet.mjs +++ b/module/apps/PlayerSheet.mjs @@ -228,7 +228,7 @@ export class PlayerSheet extends [ createContextMenuOption({ label: _loc(`taf.misc.edit`), - condition: (el) => { + visible: (el) => { const itemUuid = el.dataset.itemUuid; const itemExists = itemUuid != null && itemUuid !== ``; return this.isEditable && itemExists; @@ -237,7 +237,7 @@ export class PlayerSheet extends }), createContextMenuOption({ label: _loc(`taf.misc.delete`), - condition: (el) => { + visible: (el) => { const itemUuid = el.dataset.itemUuid; const itemExists = itemUuid != null && itemUuid !== ``; return this.isEditable && itemExists; diff --git a/module/apps/utils.mjs b/module/apps/utils.mjs index e6e492a..b883ddf 100644 --- a/module/apps/utils.mjs +++ b/module/apps/utils.mjs @@ -14,7 +14,7 @@ export function createContextMenuOption(option) { if (game.release.generation < 14) { return { name: option.label, - visible: option.condition, + condition: option.visible, callback: (target) => option.onClick(null, target), }; }; From 849da4bb5403594f550138d0bf15ab950396cdd6 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 10 May 2026 15:07:04 -0600 Subject: [PATCH 3/5] Add dev-only hook to remove the core software update notification because it annoys me --- dev/dev.mjs | 1 + dev/hooks/renderSettings.mjs | 5 +++++ system.json | 3 ++- 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 dev/dev.mjs create mode 100644 dev/hooks/renderSettings.mjs diff --git a/dev/dev.mjs b/dev/dev.mjs new file mode 100644 index 0000000..186743f --- /dev/null +++ b/dev/dev.mjs @@ -0,0 +1 @@ +import "./hooks/renderSettings.mjs"; diff --git a/dev/hooks/renderSettings.mjs b/dev/hooks/renderSettings.mjs new file mode 100644 index 0000000..ad11762 --- /dev/null +++ b/dev/hooks/renderSettings.mjs @@ -0,0 +1,5 @@ +Hooks.on(`renderSettings`, (app, html, ctx, options) => { + /** @type {HTMLElement|undefined} */ + const coreUpdateTooltip = html.querySelector(`.build .value a`); + coreUpdateTooltip?.remove(); +}); diff --git a/system.json b/system.json index 8e186b1..754695b 100644 --- a/system.json +++ b/system.json @@ -15,7 +15,8 @@ { "name": "Oliver" } ], "esmodules": [ - "module/main.mjs" + "module/main.mjs", + "dev/dev.mjs" ], "styles": [ { From 8cadd8318b8d657cb292334f2bd4fd41925c5e35 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 10 May 2026 23:45:00 -0600 Subject: [PATCH 4/5] Add some TAF-specific links into the settings sidebar --- langs/en-ca.json | 5 ++ module/apps/PlayerSheet.mjs | 2 +- .../TAFDocumentSheetConfig.mjs | 6 +-- module/apps/overrides/TAFSettingsSidebar.mjs | 30 ++++++++++++ module/hooks/init.mjs | 5 ++ styles/Apps/TAFSettingsSidebar.css | 29 +++++++++++ styles/main.css | 1 + templates/settings-sidebar-addition.hbs | 48 +++++++++++++++++++ 8 files changed, 122 insertions(+), 4 deletions(-) rename module/apps/{ => overrides}/TAFDocumentSheetConfig.mjs (96%) create mode 100644 module/apps/overrides/TAFSettingsSidebar.mjs create mode 100644 styles/Apps/TAFSettingsSidebar.css create mode 100644 templates/settings-sidebar-addition.hbs diff --git a/langs/en-ca.json b/langs/en-ca.json index 149bb72..43dcbb0 100644 --- a/langs/en-ca.json +++ b/langs/en-ca.json @@ -67,6 +67,11 @@ "macro-is-in-use": "The Macro is used by {count} items/attributes in the world or Actors, the items will lose their ability to use the macro.", "roll": "Roll", "use": "Use", + "version": "Version {version}", + "whats-new": "What's New", + "releases": "Releases", + "wiki": "Wiki", + "issues": "Issues", "item": { "weight": "Weight", "quantity": "Quantity", diff --git a/module/apps/PlayerSheet.mjs b/module/apps/PlayerSheet.mjs index 46c3225..5dfab59 100644 --- a/module/apps/PlayerSheet.mjs +++ b/module/apps/PlayerSheet.mjs @@ -2,7 +2,7 @@ import { __ID__, filePath } from "../consts.mjs"; import { createContextMenuOption, deleteItemFromElement, editItemFromElement } from "./utils.mjs"; import { config } from "../config.mjs"; import { Logger } from "../utils/Logger.mjs"; -import { TAFDocumentSheetConfig } from "./TAFDocumentSheetConfig.mjs"; +import { TAFDocumentSheetConfig } from "./overrides/TAFDocumentSheetConfig.mjs"; import { TAFDocumentSheetMixin } from "./mixins/TAFDocumentSheetMixin.mjs"; import { TAFActor } from "../documents/Actor.mjs"; diff --git a/module/apps/TAFDocumentSheetConfig.mjs b/module/apps/overrides/TAFDocumentSheetConfig.mjs similarity index 96% rename from module/apps/TAFDocumentSheetConfig.mjs rename to module/apps/overrides/TAFDocumentSheetConfig.mjs index c35b8f6..f31f585 100644 --- a/module/apps/TAFDocumentSheetConfig.mjs +++ b/module/apps/overrides/TAFDocumentSheetConfig.mjs @@ -1,6 +1,6 @@ -import { __ID__, filePath } from "../consts.mjs"; -import { getDefaultSizing } from "../utils/getSizing.mjs"; -import { localizer } from "../utils/localizer.mjs"; +import { __ID__, filePath } from "../../consts.mjs"; +import { getDefaultSizing } from "../../utils/getSizing.mjs"; +import { localizer } from "../../utils/localizer.mjs"; const { diffObject, expandObject, flattenObject } = foundry.utils; const { DocumentSheetConfig } = foundry.applications.apps; diff --git a/module/apps/overrides/TAFSettingsSidebar.mjs b/module/apps/overrides/TAFSettingsSidebar.mjs new file mode 100644 index 0000000..b33bbb8 --- /dev/null +++ b/module/apps/overrides/TAFSettingsSidebar.mjs @@ -0,0 +1,30 @@ +import { filePath } from "../../consts.mjs"; + +const { renderTemplate } = foundry.applications.handlebars; +const { Settings } = foundry.applications.sidebar.tabs; + +export class TAFSettingsSidebar extends Settings { + // #region Lifecycle + async _onRender() { + // remove the row from the HTML + const systemRow = this.element.querySelector(`.info .system`); + systemRow?.remove(); + + // add the more customized system info into the sidebar + const systemBlock = this.element.querySelector(`section.system`); + if (!systemBlock) { + const htmlString = await renderTemplate( + filePath(`templates/settings-sidebar-addition.hbs`), + { system: game.system, }, + ); + + const temp = document.createElement(`div`); + temp.innerHTML = htmlString; + const rendered = temp.firstChild; + + const info = this.element.querySelector(`section.info`); + info.insertAdjacentElement(`afterend`, rendered); + }; + }; + // #endregion Lifecycle +}; diff --git a/module/hooks/init.mjs b/module/hooks/init.mjs index e898f46..b06467e 100644 --- a/module/hooks/init.mjs +++ b/module/hooks/init.mjs @@ -26,6 +26,7 @@ import helpers from "../handlebarsHelpers/_index.mjs"; import { Logger } from "../utils/Logger.mjs"; import { registerCustomComponents } from "../apps/elements/_index.mjs"; import { registerSockets } from "../sockets/_index.mjs"; +import { TAFSettingsSidebar } from "../apps/overrides/TAFSettingsSidebar.mjs"; Hooks.on(`init`, () => { Logger.debug(`Initializing`); @@ -44,6 +45,10 @@ Hooks.on(`init`, () => { CONFIG.Item.dataModels.attribute = AttributeItemData; // #endregion Data Models + // #region App Overrides + CONFIG.ui.settings = TAFSettingsSidebar; + // #endregion App Overrides + // #region Sheets foundry.documents.collections.Actors.registerSheet( __ID__, diff --git a/styles/Apps/TAFSettingsSidebar.css b/styles/Apps/TAFSettingsSidebar.css new file mode 100644 index 0000000..010d6b4 --- /dev/null +++ b/styles/Apps/TAFSettingsSidebar.css @@ -0,0 +1,29 @@ +#settings > .system { + .version-info { + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; + gap: 8px; + + .whats-new { + font-size: smaller; + } + } + + .links { + display: flex; + justify-content: center; + align-items: center; + flex-direction: row; + flex-wrap: wrap; + gap: 8px; + list-style-type: none; + padding: 0; + margin: 0; + + li { + margin: 0; + } + } +} diff --git a/styles/main.css b/styles/main.css index 627b546..682b25d 100644 --- a/styles/main.css +++ b/styles/main.css @@ -31,3 +31,4 @@ @import url("./Apps/PlayerSheet.css") layer(apps); @import url("./Apps/QueryStatus.css") layer(apps); @import url("./Apps/TAFDocumentSheetConfig.css") layer(apps); +@import url("./Apps/TAFSettingsSidebar.css") layer(apps); diff --git a/templates/settings-sidebar-addition.hbs b/templates/settings-sidebar-addition.hbs new file mode 100644 index 0000000..71fed2b --- /dev/null +++ b/templates/settings-sidebar-addition.hbs @@ -0,0 +1,48 @@ +
+

+ {{ system.title }} +

+
+ + {{localize "taf.misc.version" version=system.version}} + + + {{localize "taf.misc.whats-new"}} + +
+ +
From 211b9b313524b1cd7f5aced31c8db342b8bcadfb Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 10 May 2026 23:46:31 -0600 Subject: [PATCH 5/5] Update version to 3.0.2 in the manifest --- system.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system.json b/system.json index 754695b..22a301f 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "id": "taf", "title": "Text-Based Actors", "description": "An intentionally minimalist system that enables you to play rules-light games without getting in your way!", - "version": "3.0.1", + "version": "3.0.2", "download": "", "manifest": "", "url": "https://git.varify.ca/Foundry/taf", @@ -55,6 +55,7 @@ }, "socket": true, "flags": { + "forgejo_api": "https://git.varify.ca/api/v1", "hotReload": { "extensions": ["css", "hbs", "json", "js", "mjs", "svg"], "paths": ["templates", "langs", "styles", "module", "assets"]