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:
parent
67def8ac19
commit
a37654cdc4
5 changed files with 139 additions and 21 deletions
|
|
@ -89,14 +89,68 @@ function makeSendButton(bookingId, guestName, variant = 'block') {
|
|||
btn.addEventListener('click', e => {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
togglePanel(btn, bookingId, guestName, variant);
|
||||
handleSendClick(btn, bookingId, guestName, variant);
|
||||
});
|
||||
return btn;
|
||||
}
|
||||
|
||||
// Injected buttons skip asking which tablet entirely when a default is
|
||||
// configured for this machine (see options.js) — push straight to it. Only
|
||||
// falls back to the full device-picker panel if that specific push comes
|
||||
// back busy (409), or if no default is configured at all — see
|
||||
// project_checkin memory's extension notes, this was an explicit UX request
|
||||
// ("injected buttons don't need to ask which tablet, just use/send to
|
||||
// default unless busy"). The popup is deliberately different — it always
|
||||
// shows the picker, just pre-selected to the default (see popup.js) — since
|
||||
// opening the popup is already a more deliberate action than a one-click
|
||||
// inline button.
|
||||
async function handleSendClick(anchorBtn, bookingId, guestName, variant) {
|
||||
const { defaultDeviceId } = await chrome.storage.local.get('defaultDeviceId');
|
||||
|
||||
if (defaultDeviceId) {
|
||||
const status = showInlineStatus(anchorBtn, variant, 'Sending…');
|
||||
const result = await chrome.runtime.sendMessage({
|
||||
action: 'tcpPush', bookingId, deviceId: defaultDeviceId,
|
||||
});
|
||||
if (result?.ok) {
|
||||
status.textContent = 'Sent — the tablet should navigate now.';
|
||||
status.style.color = '#166534';
|
||||
return;
|
||||
}
|
||||
if (result?.status === 409) {
|
||||
status.remove();
|
||||
// fall through to the picker below, with a note explaining why it's
|
||||
// asking despite a default being configured
|
||||
await togglePanel(anchorBtn, bookingId, guestName, variant, 'Default tablet is busy — choose another:');
|
||||
return;
|
||||
}
|
||||
status.textContent = `Failed: ${result?.error || 'unknown error'}`;
|
||||
status.style.color = '#dc2626';
|
||||
return;
|
||||
}
|
||||
|
||||
await togglePanel(anchorBtn, bookingId, guestName, variant);
|
||||
}
|
||||
|
||||
// Small text-only status line for the default-tablet fast path — no
|
||||
// dropdown, nothing to pick, just feedback on what happened.
|
||||
function showInlineStatus(anchorBtn, variant, text) {
|
||||
if (openPanel) { openPanel.remove(); openPanel = null; }
|
||||
const el = document.createElement('div');
|
||||
const width = variant === 'block' ? 'width: 100%;' : '';
|
||||
el.style.cssText = `
|
||||
display: block; margin-top: 6px; ${width} font-size: 12px; color: #64748b;
|
||||
font-family: -apple-system, BlinkMacSystemFont, sans-serif;
|
||||
`;
|
||||
el.textContent = text;
|
||||
anchorBtn.insertAdjacentElement('afterend', el);
|
||||
openPanel = el;
|
||||
return el;
|
||||
}
|
||||
|
||||
let openPanel = null;
|
||||
|
||||
async function togglePanel(anchorBtn, bookingId, guestName, variant = 'block') {
|
||||
async function togglePanel(anchorBtn, bookingId, guestName, variant = 'block', note = '') {
|
||||
if (openPanel) { openPanel.remove(); openPanel = null; }
|
||||
|
||||
const panel = document.createElement('div');
|
||||
|
|
@ -111,7 +165,7 @@ async function togglePanel(anchorBtn, bookingId, guestName, variant = 'block') {
|
|||
font-family: -apple-system, BlinkMacSystemFont, sans-serif;
|
||||
font-size: 12px; color: #1e293b;
|
||||
`;
|
||||
panel.textContent = 'Loading tablets…';
|
||||
panel.textContent = note ? `${note} loading…` : 'Loading tablets…';
|
||||
anchorBtn.insertAdjacentElement('afterend', panel);
|
||||
openPanel = panel;
|
||||
|
||||
|
|
@ -151,6 +205,12 @@ async function togglePanel(anchorBtn, bookingId, guestName, variant = 'block') {
|
|||
});
|
||||
|
||||
panel.innerHTML = '';
|
||||
if (note) {
|
||||
const noteEl = document.createElement('div');
|
||||
noteEl.textContent = note;
|
||||
noteEl.style.cssText = 'margin-bottom: 6px; color: #b45309; font-weight: 600;';
|
||||
panel.appendChild(noteEl);
|
||||
}
|
||||
panel.appendChild(select);
|
||||
panel.appendChild(sendBtn);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue