- Options page gains a 'Default tablet for this machine' picker,
populated from the device list once base URL + terminal key are
configured, auto-saved on change (small enough setting not to warrant
its own Save button).
- Popup pre-selects the default in its device dropdown but still shows
the full picker — opening the popup is already a deliberate action, so
staff can still override it there.
- Injected buttons (row + banner) skip the dropdown entirely when a
default is configured — one click pushes straight to it. Only falls
back to the full picker if that specific push comes back busy (409),
with a note explaining why it's asking despite a default being set.
background.js's pushBooking() now returns the HTTP status alongside
ok/error so this can be detected reliably rather than string-matching
the error message.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
New injection point on bookings_view pages — NewBook's own 'This Booking
is due to Arrive today. Do you want to go to Check-In?' banner
(.newbook_message.plain), confirmed from a real sample 2026-09-01. Shares
the row-injection's button/panel logic rather than duplicating it;
makeSendButton/togglePanel now take a variant ('block' for the list row's
table cell, 'inline' for this banner's flowing text context). Booking ID
extraction differs per shape: the list row has a checkbox value, this
banner's Check In button only carries it inside its onclick attribute's
URL, no separate structured attribute.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- setBookingCustomFields: use bookings_update's own custom_fields array
(confirmed from the real legacy plugin code) instead of
instance_custom_fields_set, which was only ever proven for a different,
unrelated plugin
- online_checkin_complete is now a configurable per-hotel custom field
(online_checkin_complete_custom_field_id setting), not a bogus top-level
bookings_update field NewBook would silently ignore
- Fix field-name mismatches vs a real live NewBook booking response:
booking_arrival/departure/length, guest address (street/city/state/
postcode/country, not a single field), phone/mobile (in contact_details,
not top-level), and pickPrimaryGuest now checks primary_client (was
checking fields that don't exist in the real API)
- Bundle the standalone push extension into backend/extension-src/, add
GET /api/extension/download (zips on request via archiver) and a
download button on the Settings page
- Remove newbook_hotel_id — vestigial from the legacy system's multi-hotel
routing model, never actually reached NewBook's API, this stack is
single-hotel-per-deployment so there's nothing to route between
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>