Share one stepper widget, and coalesce a booker's clicks into one request

Adds a yoyaku_presentation submodule holding the stepper widget every booking surface offers a quantity with, and the queue every click is posted through.

The widget. A real number field with a minus and a plus around it: the field stays the control, the buttons drive it. Named after what it changes, announces the new quantity, and marks the ceiling aria-disabled rather than disabled so a keyboard visitor is not dropped to the top of the page at the moment they reach it. The slot page's stepper moved in unchanged; the seat map's pooled areas gave up their hand-rolled pair of buttons around a read-only output, so an area's quantity is now reachable and typable from the keyboard.

The queue. One delay for the whole site, one request at a time, what was asked for and what was posted both kept so a server correction can be told from a click that landed after the request left, and a watchdog. drain() is for the operations that are not clicks at all - checkout, moving a place, changing an offer - so they act on what the server holds rather than racing what has not left yet.

The endpoint takes a list. The place operation carries what to give back and what to take, and takes them together: one pass of the engine, so the slot is locked once however many places the party picked. Together is not all or nothing - a place somebody else took, or one a rule refuses, is named in a refusal list while everything else is held; only a refused group goes back over the list line by line. Giving back happens first within a request, so a booker who releases one place and takes another in the same breath is owed the capacity they just handed over. The single-place operation is replaced rather than kept alongside it.

The seat map paints a click at once and reconciles it when the answer lands. A click made while a request is out is no longer dropped in silence.

Measured: five places taken together cost 46 queries against 65 taken one at a time, and the recurring click is unchanged at 19. The map's script budget rose by 8 KB, which is the widget and the queue arriving; the slot page's rose by 2 KB and gave up a stepper only it had.

Functional JavaScript coverage on both surfaces, including the keyboard path, the refusal message and a run of clicks proved to be one request. Docs and the French translation updated in the same commit.

Merge request reports

Loading
Loading