Commit graph

8 commits

Author SHA1 Message Date
5180adf8d2 Kiosk: live-force reset to welcome screen, configurable inactivity timeout
Kiosk's SSE connection now stays open for the whole session instead of
closing the moment a booking is pushed, so a staff-triggered Reset (from
the extension/Terminals popup or the Devices admin page) now actually
forces the tablet back to the welcome screen immediately, discarding
whatever was mid-entry — not just flipping its status in the DB with
nothing listening tablet-side. Removed the two now-redundant/harmful
pushIdle() calls in routes/checkin.js's own submit success/failure paths,
which would otherwise race the confirmation/error screen now that the
stream stays open. Added a confirm() prompt before Reset on both trigger
surfaces since it's now a real interruption, not just an unstick.

Also made the tablet's inactivity auto-cancel timeout configurable from
Settings (checkin_inactivity_timeout_minutes, default 5, same as the old
hardcoded value) instead of a fixed constant, read via the existing
token-gated GET /api/checkin/:token response.
2026-10-09 12:19:53 +00:00
790431c446 Extension: show installed/latest version for drift tracking
Popup footer shows its own installed version (from manifest.json, via
chrome.runtime.getManifest()); Terminals page shows the latest bundled
version next to the download link (new GET /api/extension/version, reads
the same manifest.json). Bumped manifest.json to 0.2.0 for the Today's
Arrivals change, and documented in extension-src/README.md that every
future change to this folder must bump the version too — nothing else
keeps it in sync automatically.
2026-10-09 12:12:32 +00:00
ebf9875ca8 Extension: add Today's Arrivals list to popup, pushable independent of a NewBook booking page
Adds GET /api/staff/arrivals (NewBook bookings_list, same list_type: 'staying'
pattern room-planner/hvac/maintenance already use) and a popup section that
lists each arrival with its own Push button, falling back to a per-row device
picker on busy/offline/no-default — a second route to the same push flow,
separate from the content-script's injected NewBook page buttons.
2026-10-09 12:09:01 +00:00
d7fbdce04d Extension: icon-state feedback + overlay picker instead of inline panels
- Injected buttons now show state via the tablet icon itself — spinner
  while sending, check on success, warning triangle on busy/offline/error —
  with detail in a hover tooltip, rather than a persistent inline text block
- Replaced the in-page dropdown panel (block-inserted for row/banner
  buttons, fixed-position floating for menu items) with a single centred
  modal overlay used by all three injection shapes — simpler than
  maintaining per-variant positioning logic, and looks the same everywhere
- Picker overlay now opens automatically when the default tablet is busy
  (409) or configured but not actually connected (delivered: false), not
  just when no default is set at all — mirrored in popup.js's own fallback

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-01 12:24:44 +00:00
4aeca15281 Extension: surface a disconnected-tablet warning instead of silent success
A push can succeed server-side (session created) with nowhere to actually
deliver to — the backend's pushNavigate() already distinguishes this via a
delivered:false return (see device-stream.js), but nothing in the extension
read it: every surface just said "Sent" regardless. Confirmed live on the
dev stack 2026-10-01 — the registered dev tablet hadn't heartbeated in a
month, so a push looked successful but nothing happened. Now every send
path (injected buttons' fast path + manual picker, popup's fast path +
manual picker) shows an amber "tablet isn't connected right now" warning
when delivered is false.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-01 12:02:56 +00:00
9f3129b8b5 Extension: Send to Tablet on the checkin page, popup auto-push, reset, new icon
- Inject Send to Tablet into the bookings_checkin page's top/bottom context
  menus (left of Confirm Check-In) and a dedicated banner above the tabs
- Popup now auto-pushes to the default tablet instead of just pre-selecting
  it, with a terminal-key-authed reset route so reception can clear a
  stuck-busy tablet from the extension popup
- Replace the extension icon with a person+checkmark glyph matching the
  app's own UserCheck icon and accent colour

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-01 11:37:44 +00:00
a37654cdc4 Extension: per-machine default tablet, skip asking unless busy
- 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>
2026-09-01 20:42:35 +00:00
4d3774ef0d Fix NewBook write mechanism, bundle push extension, remove vestigial hotel_id
- 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>
2026-09-01 18:11:35 +00:00