v1.05w 4-9-2026 — Bug fixes: draft-restore-banner HTML added (checkForDraft was silently targeting null); msd-notes + msd-notes-status added to mysite-modal (saveSiteNotes was targeting missing elements)
v1.05u 4-9-2026 — Fix PIN keypad: X button (bottom right) now calls pinClear() to clear all digits; was incorrectly wired to pinDel() (backspace) same as ⌫ button
v1.05t 4-9-2026 — Start/Update Survey launch panel replaces prefill banner; data loads before survey starts (eliminates iOS race condition); tabs disabled until tech taps Start/Update; Update Survey loads existing data, Start Fresh clears it; site card shows immediately; Sync button retained as emergency override
v1.05s 4-9-2026 — Fix iOS arrow lock: race condition between loadPrefill JSONP and pushSingleEntry JSONP; _prefillReady flag blocks push queue until prefill returns; drainQueue() called when prefill completes; resync also respects flag; push timeout 8s→5s; eliminates iPad freeze on first entry
v1.05r 4-9-2026 — iOS arrow fix: scrollIntoView smooth replaced with instant (iOS Safari freezes on smooth scroll); _pushBusy deadlock protection: force-resets after 10s stuck; touch-action:manipulation already present globally
v1.05q 4-8-2026 — Submit progress shows "Sending 15 of 48 entries..." instead of batch count
v1.05p 4-8-2026 — Fix: batch progress shows as small grey text not a styled green button block
v1.05o 4-8-2026 — Submit progress: button shows clean "Submitting..." text, batch count moves to status message below
v1.05n 4-8-2026 — Final submit now uses pushPending action (new) — writes rows as pending status; in_progress auto-save rows remain untouched; full history preserved in sheet
v1.05m 4-8-2026 — Fix submit: replaced single submitTechIO call (URL too long for Apps Script 8KB GET limit) with batched pushEntry calls, 15 rows per batch — works for any size survey; progress shown as "Submitting 1/5..."
v1.05l 4-8-2026 — Fix submit: top button now has id; both buttons update together; _submitting guard prevents double-submit; sc.onerror added; sc declared before callbacks to fix hoisting; 20s timeout
v1.05k 4-8-2026 — My Sites: search bar restored at top, filters by site name or address as you type, clears on screen open
v1.05j 4-8-2026 — Site Notes unified: same widget (textarea + dot + status + Save Notes button) on all three screens — survey/IO screen, My Sites modal, Hub site card; fixed function collision that was causing grey dot/broken save on survey screen; Hub card now shows notes on site select
v1.05i 4-8-2026 — Site Notes redesigned: label above textarea, Save Notes button below with status text — "No notes saved" / "Unsaved changes" / "Saving..." / "Saved ✔" / "⚠ Save failed"; blue Save Notes button always visible and tappable below notes area
v1.05h 4-8-2026 — Performance: fetchPin converted to JSONP (eliminates PIN "still loading" when 2 techs login simultaneously); loadSites pre-warms on page load so sites ready before phone entry; loadPrefill and resyncFromSheet converted to JSONP with fetch fallback — eliminates all raw Sheets API quota hits; parallel login sequence reduces total login time from ~10s to ~3s
v1.05g 4-8-2026 — Site Notes: persistent per site under Matrix Type — saves to localStorage instantly, status dot (grey=unsaved, green=saved, red=failed), Save Notes button pushes to sheet; entry screen: removed Save & Next (arrows handle nav), yellow Review Site Survey button; review screen: read-only with green Submit at top and bottom, confirmation dialog; submit returns to Hub; crash recovery: in_progress rows trigger yellow warning banner on site select
v1.05f 4-8-2026 — Login: JSONP with automatic fetch() fallback — if Apps Script JSONP blocked (CSP/network), silently retries via Sheets API; same dual-path for loadSites; fixes "Network error" on Netlify
v1.05e 4-8-2026 — Fix: doLogin and loadSites converted from fetch()+Sheets API key to JSONP via Apps Script — eliminates quota limit errors causing "still loading" for techs in field; 15s timeout with clear error messages
v1.05d 4-7-2026 — Post-submit efficiency summary shown to tech for surveys with 25+ entries (duration, inputs, outputs, entries/min); in_progress rows archived by Apps Script on submit
v1.05c 4-7-2026 — Fix: version change now reliably forces logout on Samsung Chrome — uses localStorage flag that survives the reload cycle; sessionStorage.clear on next load instead of same load prevents browser cache restoration of session
v1.05b 4-7-2026 — Dot color system: grey=no data, hot pink=previous sheet data, green=confirmed today, bright pink=final submitted; resync button below dots fetches ground truth from sheet and recolors; push only fires on navigation (not on choice tap); saveAndNext deduped (navTo handles save internally); in-flight push supersede to prevent duplicates; updateDots preserves cloud-confirmed state across navigation; saveProgressToSheet uses pushEntry not submitEntry
v1.05a 4-7-2026 — Architecture: append-only data model — no deletes ever during active use; entry push queue processes sequentially with confirmation (green dot = confirmed to sheet); loadPrefill now uses most recent row per slot across any status from any tech; submitAll uses submitEntry (append only, no delete); all dots turn pink on final submit; queue supersedes duplicate entries so fast tapping never loses data
v1.04z 4-7-2026 — Major architecture: hub search fully decoupled from survey (hubSite and selSite independent); survey site card now matches hub card (VM badge, tappable address/phone, Google Maps, managers); launchIOSurvey offers hub site as convenience if selected; prefill banner always visible after site select (buttons greyed when no data); per-entry debounced push (800ms) only pushes entries that changed from prefill; Hub button clears survey state; _prefillEntries stored for change detection
v1.04y 4-6-2026 — Save Your Progress: fixed raw HTML entity showing as text (textContent changed to innerHTML); dots flash green for 2.5s after successful cloud save; dot-wrap top padding increased for breathing room above dots
v1.04x 4-6-2026 — Added full-width green Save Your Progress button above nav arrows — manual checkpoint pushes current entries to sheet as status:draft; shows checkmark on success, warning on timeout
v1.04w 4-6-2026 — Added green Review & Submit button below Save & Next in survey entry screen — saves current notes then goes directly to review/submit page
v1.04v 4-6-2026 — Prefill banner buttons split to equal 1/3 width: Use This Data (green) + View Survey (blue) + Start Fresh (grey)
v1.04u 4-6-2026 — BWW I/O Survey site search now matches hub behavior — assigned sites list on focus with None/Clear Selection at top, matrix color dots, X close button, state-filtered search on typing, outside-click dismiss
v1.04t 4-6-2026 — Review button moved from header to full-width bar above Inputs/Outputs tabs — yellow/gold when previous survey exists ("★ Review Current Site Survey"), grey when no data ("— No Previous Site Survey"); resets on site change or Start Fresh
v1.04s 4-6-2026 — Google Maps and View Survey buttons now equal width using flex:1 with box-sizing:border-box — eliminates size mismatch between anchor and button elements
v1.04r 4-6-2026 — Fix initial load: hubShowAssigned now calls buildAssignedSitesList() before showing — ensures list is populated on first tap regardless of load timing; added X close button beside search bar to reliably dismiss keyboard and list without fighting Android re-tap behavior
v1.04q 4-6-2026 — Root fix: removed onclick from search input (onfocus+onclick caused double-fire on Android — show then immediate hide); hubShowAssigned no longer toggles, just shows; hubChangeSite no longer auto-shows assigned list; removed document touchstart listener; None row uses onclick only
v1.04p 4-6-2026 — Fix: None/Clear Selection now uses touchend for reliable Android tap; search bar tap toggles list (second tap hides it); outside-click handler uses touchstart for Android dismissal
v1.04o 4-6-2026 — Fix: None button now works — stopPropagation prevents outside-click handler from eating the tap; search bar re-tap now works via onclick in addition to onfocus
v1.04n 4-6-2026 — Removed "Your Assigned Sites" label; assigned list no longer auto-shows on any hub screen transition — only appears when tech taps/focuses the search bar; hides when tapping outside
v1.04m 4-6-2026 — Fix: My Sites then Hub no longer locks up with persistent dropdown — hub-site-results cleared on every screen transition; buildAssignedSitesList only shows list when hub screen is actually active; search input blurred on all screen changes
v1.04l 4-6-2026 — Change Site button moved below address as underline link — no longer overlaps site name; edit context bar added above Inputs/Outputs tabs showing survey date when using pre-filled data (e.g. "Editing your survey from Apr 4, 2026")
v1.04k 4-6-2026 — Fix: tapping None on Android no longer leaves keyboard up — hubChangeSite now blurs search input and hides dropdown
v1.04j 4-6-2026 — None / Clear Selection added to top of assigned sites list, search dropdown, and site picker sheet — tapping clears current site selection; hub tool icons confirmed at 34px
v1.04i 4-6-2026 — Security fix: covered states now saved to sessionStorage on login and restored on page reload/refresh — previously swipe-refresh cleared _techStates causing all sites to appear; search dropdown now dismisses on click outside
v1.04h 4-6-2026 — Fix race condition: covered states (_techStates) now set immediately on login from Techs col F — previously only set when My Sites was opened, causing hub search to show all sites on first load before the swipe-refresh workaround
v1.04g 4-6-2026 — Security fix: hub search strictly filtered to tech's covered states only — no out-of-state sites can appear in search or dropdown under any circumstance; on focus with no query shows all assigned state sites
v1.04f 4-6-2026 — Hub search now shows all BWW sites (no state filter) with out-of-state sites labeled in amber; shows first 20 on focus before typing; Google Maps + View Survey buttons aligned with margin-top; prefill banner now has Use This Data button (keeps data, dismisses) and Start Fresh shows confirm warning (only clears this tech's data, not others)
v1.04e 4-6-2026 — Version corrected to v1.04e (was mislabeled d); all version tags updated across all locations
v1.04d 4-6-2026 — Fix: hubChangeSite (X button) was missing — now defined; hub search input blurs after site select to dismiss mobile keyboard; assigned sites list hides when site selected and re-shows on hub return; showScreen hub re-shows list when no site active
v1.04c 4-6-2026 — Auto-save: every input/output tap saves to localStorage + sessionStorage; on login shows green resume banner if draft or last submitted survey found; resume restores site, all entries, VM type, site notes; mark submitted on success — data never lost; View Survey button on hub site card shows last submission (inputs, outputs, VM, tech notes); Dish Network + OTA Antenna added to inputs; Video Wall 2x2, 3x3, Custom added to outputs
v1.04b 4-6-2026 — Hub: assigned sites list below search bar showing all sites in tech's covered states with matrix color dot; BWW I/O Survey with no site selected opens slide-up site picker instead of error banner; Copy buttons now prepend section header to clipboard text
v1.04a 4-6-2026 — Feedback now routes to Feedback tab (was polluting TechIO_Staging); Info Change requests route to TechInfoChanges tab (new); updateSiteNotes action added to Apps Script; survey viewer header row ghost card fixed in Dispatch App
v1.03g 4-3-2026 — Welcome screen: added Settings and Feedback entries; phone formatted (xxx) xxx-xxxx in Settings My Info; Cloudflare email obfuscation fixed (Samsung + EverPass); version shown on PIN screen
v1.03f 4-3-2026 — Settings: My Info section shows tech name, ID, phone, address, state; Request Information Change submits to TechIO_Staging row 996 value "update address"; login now reads address and state from Techs cols D and E
v1.03e 4-3-2026 — Copy buttons added to all sections in Required Photos (Tips, Wall Mounted) and Troubleshooting (Samsung, Panasonic, Chief); code comment added to remind future additions
v1.03d 4-3-2026 — Fixed garbled emoji in site search placeholder text
v1.03c 4-3-2026 — BWW I/O Survey always active (no longer greyed); prompts to search site if none selected; Settings screen restored with Dark/BWW/Light themes; CSS variables; theme persists via localStorage
v1.03b 4-3-2026 — Hub search filtered to tech covers states; Feedback screen (bottom left hub): Name/Type dropdown/Details submits to TechIO_Staging row 998; videoMatrix now submits with num 997 for easy search/filter
v1.02i 4-3-2026 — My Sites: badge shows checkmark+Survey (no date); modal survey line centered with date; Start I/O Survey goes direct to survey screen
v1.02h 4-3-2026 — Fixed garbled icons (escaped bytes showing as water-drop symbols); My Sites modal uses event listeners instead of inline onclick to avoid quote conflicts; survey badge shows checkmark + date; buttons use clean text labels
v1.02g 4-3-2026 — My Sites: phone shown on list card; survey badge shows date; site detail modal: Google Maps button, Call button, State/Matrix grid, editable Site Notes (saves to Sites col H); Start Survey goes directly to I/O survey
v1.02f 4-3-2026 — Fixed JS syntax error in mySiteSelect (broken inline onclick quote string was silently killing all JS including PIN keypad); Start Survey button now uses window variable for safe string passing
v1.02e 4-3-2026 — Restored all 8 hub buttons (BWW Survey, Required Photos, Troubleshooting, Contact LSA were missing); My Sites cards now clickable - slide-up modal shows address/phone/maps/matrix type and Start Survey button; brighter text on site cards
v1.02d 4-3-2026 — My Sites reads covers from Techs col F (already in sheet)
v1.02c 4-3-2026 — Fixed file corruption; My Sites screen shows all sites in tech state with survey status; reads states from Techs col D (primary) and col E (extra, comma separated); Request Additional States sends to Feedback tab
v1.02b 4-3-2026 — Version number shown top-left on hub screen in small text below app name, always visible
v1.02a 4-3-2026 — Major update: Welcome updated with all features; App Guide hub button; Log out button; DOA TV added; Copy buttons on all sections; Contact Samsung, Upshow/EverPass, Panasonic FRZ50, Chief Mount guides added with YouTube links
v1.01z 4-3-2026 — Fixed phone/address column swap: Sites sheet col C=address col D=phone (was reversed); phone now dials correctly, address opens maps correctly
v1.01y 4-3-2026 — Required Photos: new dedicated screen always active; 3 sections (Wall Mount, MSBUB Pole, 2-Arm Pole) each with photo checklist, stud requirements, and parts info; installation tips at top
v1.01x 4-3-2026 — Fixed iOS double-tap zoom on buttons: added touch-action:manipulation and -webkit-tap-highlight-color to all buttons and links; viewport set to user-scalable=no
v1.01w 4-3-2026 — Version refresh fixed: on version change clears session then calls location.reload() so page fully reloads and lands on PIN screen
v1.01v 4-3-2026 — Troubleshooting Guides screen added; first guide: Samsung TV model number by year 2013-2023; always accessible from hub
v1.01u 4-3-2026 — iOS fixes: Apple Maps URL on iPhone/iPad (was Google Maps which fails on iOS); removed target=_blank from map/address links; phone tap fixed; version change now clears session so new deploy forces fresh login
v1.01t 4-3-2026 — PIN keypad larger for iOS: keys 88x72px (was 72x56px), font 26px (was 20px), dots 18px (was 14px), grid gap increased
v1.01s 4-3-2026 — Screen scroll reset: each screen transition scrolls to top so hub and other screens always start at top of page
v1.01r 4-3-2026 — Config tab: row 1 = headers (A1=pin, B1=email), row 2 = values (A2=code, B2=address); reads Config!A2:B2
v1.01q 4-3-2026 — Config tab reads full A:B range, finds pin and email by key name in col A; consistent with rest of sheet structure (A=key, B=value reading down)
v1.01p 4-3-2026 — Email loaded from Config tab B2 (not in HTML source); contactLSA() injects it into modal at open time; bot scraping source sees no email address
v1.01o 4-3-2026 — Fixed email obfuscation:
[email protected] now shows correctly in contact modal
v1.01n 4-3-2026 — PIN fetch reads Config!A2 directly (cleaner than searching A:B for pin row); setup: A1=label/header, A2=your 6-digit PIN
v1.01m 4-3-2026 — PIN fetch fallback: if Sheets API blocked (file:// local), uses hardcoded fallback PIN; on Netlify always loads from Config tab
v1.01l 4-3-2026 — PIN loaded from Config tab (col A=pin, col B=value) not stored in HTML; fetchPin() runs on load
v1.01k 4-3-2026 — Added 6-digit PIN access code screen as first gate before phone number login; PIN stored in sessionStorage so only required once per browser session; incorrect PIN shakes and resets; showScreen blocks navigation if PIN not passed
v1.01j 4-3-2026 — Removed redundant invisible 5-tap admin zone (top-right corner); version button click already opens changelog panel
v1.01i 4-3-2026 — Navigation: added ◀ Hub button to main survey screen and review screen so tech can return to site/tool hub from anywhere without losing progress
v1.01h 4-3-2026 — None submits as None (no TV confirmation); Custom shows text input for description; Site Notes textarea on review submits as siteNotes/999 row; Matrix Type prominent in review
v1.01g 4-3-2026 — Reverted double-pump: Apps Script deletes all pending for tech+site before insert so batch 2 was wiping batch 1; back to single JSONP call with inputs first then outputs; None rows still skipped
v1.01f 4-3-2026 — Double-pump submit: batch 1 = inputs + VM type, batch 2 = outputs; sequential JSONP calls; button shows progress; each batch independently safe for large data
v1.01e 4-3-2026 — Submit fix: skip None/unset rows to keep JSONP URL within browser limits; only real data rows sent to TechIO_Staging (was sending all 97 rows causing URL too long error)
v1.01d 4-3-2026 — Version number now consistent across all locations (title, login page, intro, admin label, APP_VERSION); strict version-bump discipline enforced going forward
v1.01c 4-3-2026 — Admin panel: version log scroll area expanded to 480px; width restored to portrait-friendly 480px
v1.01b 4-3-2026 — App Info and Tools sections removed from admin panel; all version displays unified to APP_VERSION via DOMContentLoaded; intro screen version tag added; Clear Session & Reload button removed
v1.01a 4-3-2026 — Version number now sets on page load before login via DOMContentLoaded; Clear Session & Reload removed from admin tools
v1.00z 4-3-2026 — Pre-fill from last submission: on site select, loads tech's previous TechIO_Staging entries; green banner shows count + date; Start Fresh button clears prefill; matrix type restored from last visit
v1.00y 4-3-2026 — Submit changed from fetch() to JSONP to fix CORS blocking from file:// origin; same mechanism as BWW writes
v1.00x 4-3-2026 — Review page: Inputs section moved above Outputs
v1.00w 4-3-2026 — All headers updated to LSA Field Service App; Inputs tab moved to left, Outputs to right
v1.00p fixed 4-3-2026 — Root fix: completed truncated clearAndReload function and added closing script/body/html tags; resolved fmtPhone and doLogin not defined errors caused by Cloudflare file truncation
v1.00p 4-3-2026 — Fix: restored missing closing brace on updateToolStates (Cloudflare corruption); restored window.updateToolStates binding
v1.00o 4-3-2026 — Questions bar tappable (no label); model placeholder updated to BE55C-H example; review outputs show brand + (model) format
v1.00n 4-3-2026 — VM badge moved to left of site name in hub card
v1.00m 4-3-2026 — Questions bar on intro screen tappable → opens Contact LSA modal
v1.00l 4-3-2026 — Contact modal: reduced font weight, system font stack, Save to Contacts (.vcf download)
v1.00k 4-3-2026 — Contact LSA button opens full contact modal: text line (503) 847-9846, main line (619) 722-1749, AV PM team extensions (Robert/Gideon/Mauricio/Dan), email
[email protected]; all entries are tappable links
v1.00j 4-3-2026 — Coming Soon tiles renamed to Coming Soon 1-4
v1.00i 4-3-2026 — Hub tool grid: bigger buttons, white labels, colored dark backgrounds; 4 Coming Soon tiles added (Job Reports, Parts & Equipment, My Schedule, Messages); site-required tools activate with color on site select
v1.00h 4-3-2026 — Tools always visible on hub; site-required tools (I/O Survey, Troubleshooting, Photos) show greyed with "Select a site to access" until site chosen; Contact LSA always active
v1.00g 4-3-2026 — Intro screen: personalized time-of-day greeting with tech name; header name fixed to "LSA Field Service App" throughout
v1.00f 4-3-2026 — Brand/model/serial fields added to output entries; staging sheet updated to 14 columns
v1.00c 4-3-2026 — Brand/model/serial fields added to output entries; staging sheet updated to 14 columns
v1.00b 4-3-2026 — Site hub screen added: clickable address/phone, manager contacts, tool buttons, Google Maps link
v1.00a 4-3-2026 — Initial release: phone login, intro screen, BWW I/O Survey (72 outputs/24 inputs), review and submit to TechIO_Staging; rebranded as LSA Field Service App