Fix ctrl+clicking on a downtime action on macOS (#378)

* Refactor: handle button data attrs the same.

A small refactor to handle `button.dataset.move` (which was assigned to a
local const) and `button.dataset.category` (which was accessed directly)
in the same way by assigning them both to local consts.

* Fix right-click on downtime activities on macOS.

On macOS with a single-button mouse (e.g. a laptop trackpad) it's common to
trigger a right-click with ctrl+click.

In Chrome, this triggers both a `contextmenu` event and a regular `click`
event. In the context of downtime actions, this meant that we were
deselecting an action in the `contextmenu` handler but then immediately
re-selecting it again in the `click` handler.

This commit works around the problem by stopping the event from propagating
further. This fixes the bug, but also stops Foundry's default `contextmenu`
handler from firing and preventing the browser context menu from appearing,
so we also have prevent the event's default behaviour from firing.
This commit is contained in:
George Brocklehurst 2025-07-19 18:04:28 +01:00 committed by GitHub
parent fc8eb8cb04
commit 615df65415
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -113,13 +113,24 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV
deselectMove(event) { deselectMove(event) {
const button = event.target.closest('.activity-container'); const button = event.target.closest('.activity-container');
const move = button.dataset.move; const { move, category } = button.dataset;
this.moveData[button.dataset.category].moves[move].selected = this.moveData[button.dataset.category].moves[move] this.moveData[category].moves[move].selected = this.moveData[category].moves[move].selected
.selected ? this.moveData[category].moves[move].selected - 1
? this.moveData[button.dataset.category].moves[move].selected - 1
: 0; : 0;
this.render(); this.render();
// On macOS with a single-button mouse (e.g. a laptop trackpad),
// right-click is triggered with ctrl+click, which triggers both a
// `contextmenu` event and a regular click event. We need to stop
// event propagation to prevent the click event from triggering the
// `selectMove` function and undoing the change we just made.
event.stopPropagation();
// Having stopped propagation, we're no longer subject to Foundry's
// default `contextmenu` handler, so we also have to prevent the
// default behaviour to prevent a context menu from appearing.
event.preventDefault();
} }
static async takeDowntime() { static async takeDowntime() {