Fixed
- "Undo" in the toast messages works again. Deleting a note, a task, a shopping item or an entry
in any other module offers a short "Undo" window at the bottom of the screen - and clicking it did
nothing at all. The button and its action were both in place; the click never reached them,
because the swipe-to-dismiss gesture on the toast captured the pointer as soon as it went down,
which redirects the resulting click to the toast instead of the button underneath. Keyboard and
touch took a different route and still worked, which is why this stayed hidden for so long: it
only ever broke for mouse users. Two more faults sat in the same place and are fixed with it -
simply moving the mouse across a toast pushed it off-screen and faded it to invisible before the
pointer could reach the button, and the horizontal swipe was never triggerable on a phone at all,
because the browser claimed the gesture for scrolling.
Added
- Retry-safe writes for the API (
Idempotency-Key). If aPOSTto the API goes out and the
answer is lost on the way - a timeout, a dropped connection, a restart at the wrong moment - the
caller cannot tell whether the record was created. Retrying may create a duplicate; not retrying
may lose the entry. AnyPOSTunder/api/v1now accepts an optionalIdempotency-Keyheader:
repeating the same request with the same key returns the original response instead of creating a
second record, and says so with anIdempotent-Replayed: trueheader. Reusing a key for a
different request, or retrying while the first attempt is still running, is answered with409
rather than silently handing back someone else's result; a request that failed releases its key,
so a corrected payload can be sent again under the same one. Keys belong to the account that used
them, are kept for 24 hours and survive a restart. Callers that send no header are unaffected -
nothing about the existing API changes. Reported for task creation, implemented for every
endpoint, and documented in the OpenAPI spec.