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>
This commit is contained in:
jtricerolph 2026-09-01 20:42:35 +00:00
parent 67def8ac19
commit a37654cdc4
5 changed files with 139 additions and 21 deletions

View file

@ -20,7 +20,7 @@ async function main() {
nbStatusEl.className = `nb-status ${ok ? 'ok' : 'no'}`;
});
const { baseUrl, apiKey } = await chrome.storage.local.get(['baseUrl', 'apiKey']);
const { baseUrl, apiKey, defaultDeviceId } = await chrome.storage.local.get(['baseUrl', 'apiKey', 'defaultDeviceId']);
if (!baseUrl || !apiKey) {
contentEl.innerHTML = `
<p class="muted">Not set up yet — add the tablet-checkin URL and a terminal API key first.</p>
@ -72,6 +72,12 @@ async function main() {
${escapeHtml(d.name)}${d.status === 'busy' ? ' (busy)' : ''}
</option>`
).join('');
// Pre-select this machine's configured default tablet — still just a
// starting point, staff can pick a different one from the dropdown.
// Setting .value to a disabled (busy) option is a no-op in every browser
// that matters here, so a busy default just falls through to whatever the
// browser's own first-enabled-option default would have been anyway.
if (defaultDeviceId) deviceSelect.value = defaultDeviceId;
sendBtn.disabled = false;
sendBtn.addEventListener('click', async () => {