From 48427bd4211ebaf28305715caec01bfc8e8b20cb Mon Sep 17 00:00:00 2001 From: Carlos Fernandez Date: Mon, 8 Dec 2025 22:23:09 -0500 Subject: [PATCH] Implement delta input for gold fields --- .../sheets/api/application-mixin.mjs | 54 +++++++++++++++++++ .../sheets/actors/character/inventory.hbs | 2 +- templates/sheets/actors/party/inventory.hbs | 2 +- 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/module/applications/sheets/api/application-mixin.mjs b/module/applications/sheets/api/application-mixin.mjs index 449d6723..b11fc779 100644 --- a/module/applications/sheets/api/application-mixin.mjs +++ b/module/applications/sheets/api/application-mixin.mjs @@ -178,6 +178,60 @@ export default function DHApplicationMixin(Base) { _attachPartListeners(partId, htmlElement, options) { super._attachPartListeners(partId, htmlElement, options); this._dragDrop.forEach(d => d.bind(htmlElement)); + + for (const deltaInput of htmlElement.querySelectorAll('input[data-allow-delta]')) { + deltaInput.dataset.numValue = deltaInput.value; + deltaInput.inputMode = 'numeric'; + deltaInput.pattern = '^[+=\\-]?\d*'; + + const handleUpdate = (delta = 0) => { + const min = Number(deltaInput.min) || 0; + const max = Number(deltaInput.max) || Infinity; + const current = Number(deltaInput.dataset.numValue); + const rawNumber = Number(deltaInput.value); + if (Number.isNaN(rawNumber)) { + deltaInput.value = delta ? Math.clamp(current + delta, min, max) : current; + return; + } + + const newValue = + deltaInput.value.startsWith('+') || deltaInput.value.startsWith('-') + ? Math.clamp(current + rawNumber + delta, min, max) + : Math.clamp(rawNumber + delta, min, max); + deltaInput.value = deltaInput.dataset.numValue = newValue; + }; + + // Force valid characters while inputting + deltaInput.addEventListener('input', () => { + deltaInput.value = /[+=\-]?\d*/.exec(deltaInput.value)?.at(0) ?? deltaInput.value; + }); + + // Recreate Keyup/Keydown support + deltaInput.addEventListener('keydown', event => { + const step = event.key === 'ArrowUp' ? 1 : event.key === 'ArrowDown' ? -1 : 0; + if (step !== 0) { + handleUpdate(step); + deltaInput.dispatchEvent(new Event("change", { bubbles: true })); + } + }); + + // Mousewheel while focused support + deltaInput.addEventListener( + 'wheel', + event => { + if (deltaInput === document.activeElement) { + event.preventDefault(); + handleUpdate(Math.sign(-1 * event.deltaY)); + deltaInput.dispatchEvent(new Event("change", { bubbles: true })); + } + }, + { passive: false } + ); + + deltaInput.addEventListener('change', () => { + handleUpdate(); + }); + } } /**@inheritdoc */ diff --git a/templates/sheets/actors/character/inventory.hbs b/templates/sheets/actors/character/inventory.hbs index e96d597c..71b3696c 100644 --- a/templates/sheets/actors/character/inventory.hbs +++ b/templates/sheets/actors/character/inventory.hbs @@ -18,7 +18,7 @@ {{#if currency.enabled}}
{{localize currency.label}} - {{formInput currency.field value=currency.value enriched=currency.value toggled=true}} +
{{/if}} {{/each}} diff --git a/templates/sheets/actors/party/inventory.hbs b/templates/sheets/actors/party/inventory.hbs index a3397145..17c5f486 100644 --- a/templates/sheets/actors/party/inventory.hbs +++ b/templates/sheets/actors/party/inventory.hbs @@ -21,7 +21,7 @@ {{#if currency.enabled}}
{{localize currency.label}} - {{formInput currency.field value=currency.value enriched=currency.value toggled=true}} +
{{/if}} {{/each}}