v2.1.0 – Performance update: stats are cached in localStorage so the page paints instantly on load and refreshes silently in the background; pie and bar charts now update in-place instead of being destroyed and recreated (no flicker on month switch or auto-refresh); auto-refresh skips re-rendering entirely when data hasn't changed; fixed auto-refresh snapping the month selector back to the current month while browsing an older month; backend now caches computed stats server-side (5 min) with automatic invalidation on new form submissions.
v2.0.1 – Fixed scroll-position jump when switching metrics on the Monthly Trends tab; chart now updates data in-place instead of destroying and recreating the canvas.
v2.0.0 – Complete ground-up rebuild matching site-wide design system. Migrated from CSV polling to on-demand JSON via GAS Web App (?action=statsJSON). Added always-visible KPI cards (Air, Scene, IFT, Declines, Top Requestor, Top Destination). New "View YTD" toggle swaps all cards and charts between selected month and year-to-date. Monthly Trends chart now updates in-place on metric switch (no scroll-position jump). Top Sending and Top Destinations tabs show ranked bar lists side-by-side for month vs. YTD. Tab state persisted via localStorage.
v1.7.3 – Fully migrated dashboard to unified statistics CSV; removed redundant script blocks and resolved rendering glitches.
v1.6.0 – Added "← Tools" navigation button.
v1.5.0 – Unified design, dark mode fixes, timestamp, and version display.
v1.4.3 – Final layout with tab split and mobile height fix.
v1.4.2 – Chart background and refresh logic fixes.
v1.4.0 – Styling unified with calendar, timestamp footer added.
v1.3.0 – Tab persistence and dark mode support.
v1.2.0 – Rebuild with parsed-date logic and new CSV layout.
v1.1.0 – Added chart tabs for requestors/destinations.
v1.0.0 – Initial dashboard implementation.
Flight Calendarv3.1.023 entries
v3.1.0 – Performance update: month list and per-month flights are cached in localStorage — the page paints instantly on load and previously viewed months switch instantly, revalidating silently in the background; auto-refresh no longer replays pill animations when nothing changed; removed unused PapaParse CDN script left over from the CSV era; backend caches month list and per-month payloads server-side with invalidation on new form submissions; hospital-name cleanup now writes only the two name columns instead of rewriting the entire sheet, eliminating a race with concurrent form submissions.
v3.0.2 – Improved today highlight visibility: day number now displays in a filled navy circle, cell gets a solid 3px top accent bar and stronger tinted background.
v3.0.1 – Post-rebuild polish: flight pill colors switched to solid saturated backgrounds with white text for legibility; blocking loading overlay replaced with a bottom-center toast notification; QR code moved out of the calendar grid to a fixed floating FAB (bottom-right), collapsing to a "+" button on narrow screens.
v3.0.0 – Complete ground-up rebuild matching site-wide design system. Migrated from full-dataset CSV polling to a two-step lazy-load strategy: page load fetches only the month list (?action=monthList), then each month change or refresh fetches only that month's flights (?action=calendarJSON&month=YYYY-MM) — keeping performance consistent even with years of historical data. Flight pills redesigned with solid saturated backgrounds and white text for legibility. Blocking loading overlay replaced with a non-blocking bottom toast. QR code moved from inside the grid to a fixed floating FAB (bottom-right); collapses to a "+" button on narrow screens. Hospital abbreviation file and QR modal retained.
v2.8.4 – Changed disposition suffixes to emoji.
v2.8.3 – Enabled click-to-enlarge QR code modal with close functionality.
v2.8.2 – Fixed automatic refresh not updating current day highlight; ensured PR flights always display at bottom.
v2.8.1 – Styled month selector; returned QR code.
v2.8.0 – Added month navigation with dynamic dropdown and historical data rendering.
v2.7.1 – Updated calendar footer to use Unified Stats CSV source.
v2.6.1 – Fixed QR modal loading logic.
v2.6.0 – QR code is now clickable; added "← Tools" button.
v2.5.0 – PR flights now center-aligned with single line break.
v2.3.1 – Footer layout improvements and dark mode fixes.
v2.3.0 – Reverted to current-month-only layout, grid fix, and footer styling.
v2.2.0 – Mobile phantom scroll and header alignment fixes.
v2.1.0 – Print-friendly layout and styling.
v2.0.0 – Major rebuild with parsed date logic and clean export.
v1.3.0 – Added dark mode, rounded corners, font scaling.
v1.2.0 – Added QR code, stats summary, and footer.
v1.1.0 – Color-coded dispositions.
v1.0.0 – Basic calendar grid with entries.
ABRAT Survey Statusv2.0.114 entries
v2.0.1 – QR code modal now auto-closes when a background refresh detects the associated survey has been completed; modal remains open if the survey is still missing.
v2.0.0 – Complete "next-gen" UI overhaul with card-based interface, pulsing urgency badges, tablet-optimized action buttons, and flicker-free data refresh logic.
v1.7.0 – Switched dashboard to Apps Script JSON route and added better error handling.
v1.6.0 – Added QR code button to allow for easier completion of forms.
v1.5.4 – Added floating "← Tools" button in header.
v1.5.3 – Adjusted mobile layout and version display in index.
v1.5.2 – Final tweaks to column width and mobile scroll behavior.
v1.5.1 – Bugfixes to tab toggle and header styling.
v1.5.0 – Implemented version-aware loading logic.
v1.4.0 – Made print/export enhancements.
v1.3.0 – Added dark mode toggle, animation, and style match.
v1.2.0 – Added animation and filter tabs.
v1.1.0 – Improved mobile layout.
v1.0.0 – Initial implementation.
Supply Dashboardv2.2.014 entries
v2.2.0 – Received-items email report: when the housekeeping job clears items marked Received/Stocked from the sheet, it now first emails a formatted summary of everything being removed (item, type, ID); deletion only happens after the email sends successfully, so no item is ever removed unreported.
v2.1.0 – Reliability update for the Aircraft Check card: failed loads now retry automatically (twice, with backoff) before giving up, and if all attempts fail the card shows the last successfully loaded data with a warning noting when it was saved, instead of an error; fixed a bug where a single failed load permanently broke the card until the page was reloaded; the card also paints instantly from the last saved data on page open; Aircraft Check and Crew Notepad now load independently of the supply lists, so a supply fetch failure no longer blocks them. Backend: the aircraft check endpoint now reads only the latest row instead of the full check history, and the cache clears the moment a new check is submitted so fresh checks appear immediately. Crew Notepad: added data-loss protection — edits are backed up locally on the device and offered for restore if a session ends with unsaved changes, failed loads fall back to the local draft instead of wiping the note, failed saves retry automatically and keep changes locally, closing the tab with unsaved changes warns first, and auto-save is guaranteed within ~75s even during continuous typing.
v2.0.1 – Condensed supply item row padding and font size to fit more items before overflow; supply card bodies are now individually scrollable with a max height, keeping the Aircraft Check and Crew Notepad visible on screen; removed bottom spacer that was pushing lower cards off-screen on longer lists; tightened supply grid and wide-card spacing for a more consistent vertical rhythm.
v2.0.0 – Full UI overhaul to match site-wide design system; Supply Admin restyled with two-column card layout; replaced inline status banner with floating toast; centered section headers; restored 5-minute auto-refresh countdown with pulse animation.
v1.6.1 – Fixed loading issue in Supply Admin; restored proper item rendering with improved fetch error handling.
v1.6.0 – Enhanced Supply Admin with mobile-responsive layout and clickable ID chips for fast edits.
v1.5.0 – Prevented full-page refresh when changing item status.
v1.4.1 – Replaced blocking alerts with non-blocking status banners.
v1.4.0 – Switched to Apps Script JSON route.
v1.3.2 – Added notepad/scratchpad functionality.
v1.3.1 – Added ✔ Receive button to Ordered items.
v1.2.0 – Added animation and expiry highlighting for aircraft checks.
v1.1.0 – Introduced aircraft check summary with narc tags.
v1.0.0 – Initial implementation of categorized supply lists.
Inventory Dashboardv2.5.015 entries
v2.5.0 – Added a duplicate finder and merge tool to the admin panel. “🔍 Duplicates” groups entries with similar names using character-trigram similarity, with Strict / Normal / Loose sensitivity and a match percentage per group; a shared item number counts as strong evidence on its own. Entries whose names state different sizes — NPA 12 Fr. vs 14 Fr., Miller 3 vs Miller 4, Lidocaine 100 mg vs 200 mg — are never grouped no matter how alike the wording, since merging those would destroy real stock. Each group lets you choose which entry survives (defaulting to the most complete record) and shows a live preview of the result. Merging combines locations by name, adding the counts and keeping the earlier expiry where the same place appears twice, fills blank fields from the other entries, and preserves every distinct note. Warnings appear when the merged name differs from a dropped one, or when more than three locations would result and some can't fit. Merging is guarded by a confirmation dialog listing exactly what is kept and what is permanently deleted, with a tick-box that must be checked before the button enables. Counts in that dialog are editable: each location shows what every entry contributed ("from 1 + 1") with the total pre-filled by adding them, plus one-click "largest only" and "added up" options — because when the same stock has simply been entered twice, adding would double it. The aircraft / stock / total figures update as you type, and whatever is left in the boxes is what gets saved. The surviving entry is written before anything is deleted, so a failure part-way through leaves the combined data intact and the leftovers still visible to re-merge.
v2.4.1 – Dashboard table tidy-up: narrowed the Aircraft / Stock / Total columns and pinned the Status column so its badge no longer gets cut off, and removed the Supplier column from the on-screen table to make room. Supplier is still searchable and still appears in both printable reports.
v2.4.0 – Items can now be stored in up to three locations, and each location carries its own count and expiration date. The item's overall Count and Soonest Expiry are derived automatically — the count is the sum of the per-location counts and the expiry is the earliest of the per-location dates — so the figures always reconcile. The dashboard's separate Primary/Secondary columns are replaced by a single Locations column listing every place an item lives with the quantity held there and its own colour-coded expiry beside it. Location filtering, the location dropdown counts, and the printable report all recognise the third location. Admin: the add/edit form moved from the narrow sidebar into a full-width modal with a two-column layout, so far more is visible at once while filling it out; the item table now spans the full page width and gains an "Add Item" button. Each location row pairs a location with its own count and date, with a live note showing the total count and soonest expiry the item will be saved with; fallback count and date fields cover items whose stock hasn't been split by location yet. Every item now shows its quantity split three ways — ✈️ Aircraft (everything held in Aircraft locations), 📦 Stock (everywhere else) and Total — so an item kept 1 on the aircraft and 5 in a cabinet reads 1 / 5 / 6. These are shown by default on the dashboard as three sortable columns in place of the old single Count, and appear per item in both printable reports. Report builder: added tertiary-location grouping, per-location counts and dates in the Location column, and individually selectable Aircraft / Stock / Total columns; each section header carries its own aircraft, stock and total subtotals, and any quantity not yet assigned to a location is called out separately so the parts always add up. The admin table gains the same location drill-down as the dashboard — a dropdown beside the search box with live per-location counts, narrowing the table to a single bag or cabinet and combining with the search. Searching for something that isn't there now offers to create it: the empty state shows an “➕ Add …” button, and the Add Item button carries the searched text straight into the Item Name when the search found nothing, pre-selecting the location being browsed and landing the cursor on whatever's left to fill. Backend: the sheet gains six columns (a count and expiration date for each of the three locations, plus Tertiary Location); run migrateSheet() once to add them in place without disturbing existing data — it upgrades from either the original or the interim layout and seeds each item's existing Count into its Primary Count so totals stay correct immediately.
v2.3.2 – Trimmed redundant group prefixes from location labels: the dashboard dropdown and the admin report builder's location checkboxes now read "Primary Bag" and "Cabinet 1" under their Aircraft and Hangar headings instead of repeating the group name in every entry. Full location names are kept as hover tooltips and are still used everywhere else (table, summary bar, and reports).
v2.3.1 – Fixed the location dropdown turning purple and becoming hard to read once a location was selected; the text now stays the normal color in both light and dark mode, and the active-filter cue is shown with an accent border and ring instead.
v2.3.0 – Location filtering and an advanced report builder. Dashboard: added a location selector that narrows the table to a single bag or cabinet — an item is shown if the location is either its primary or secondary — with live item counts in the dropdown; stat cards, the summary bar, and the printable report all follow the selected location, so you can print one cabinet at a time. Admin: new 📄 Report builder with checkbox selection of any combination of locations, grouping by expiration urgency, primary location, secondary location, location (primary + secondary), supplier, or a flat list; sorting by expiry, name, count, expiring quantity, supplier, or primary location in either direction; an optional filter to include only items in a given expiration range; selectable columns (item number, supplier, locations, count, expiry, expiring quantity, days remaining, notes, last updated); and an optional blank "Counted ✓" column for doing physical counts on paper. Reports print in landscape with summary totals and per-section item counts.
v2.2.0 – Major performance update: both pages now cache inventory in localStorage and paint instantly on load, refreshing silently in the background (stale-while-revalidate); admin add/edit/delete update the table immediately instead of waiting on a full re-download; search is debounced and row animations only play on first paint, eliminating typing lag; uploaded photos are downscaled to 600px to shrink data payloads; backend saves edits in one batched write instead of 11 separate calls and caches inventory reads server-side with automatic invalidation on changes; fixed Delete button breaking on item names containing an apostrophe.
v2.1.1 – Fixed report column misalignment across sections using fixed table layout and shared colgroup; status column now shows color-coded days remaining instead of "Good"; report sections only render when items exist, with an all-clear checkmark when nothing is expiring.
v2.1.0 – Added 📄 Report button generating a printable inventory report; report mirrors the current dashboard sort order and includes a sort label in the header; sections split by urgency (critical, soon, good standing, no expiry); stat summary cards in report header; Print / Save as PDF button.
v2.0.0 – Admin columns now scroll independently; photo field replaced with upload-and-crop tool that converts to base64; thumbnails open a full-screen lightbox on click; box emoji removed when no photo is set; note icon (ⓘ) with hover tooltip added next to item names on both dashboard and admin.
v1.3.0 – Added password gate to Admin panel with session persistence and shake animation; replaced auto-refresh countdown with manual refresh button; restyled Admin nav link to match Tools button height.
v1.2.1 – Fixed empty-state colspan mismatch after location columns were added.
v1.2.0 – Expanded location dropdowns to include Office (Cabinet A–B) and Hangar (Cabinet 1–7); grouped with optgroup labels.
v1.1.0 – Added Primary and Secondary Location columns with icon badges; location options include Aircraft bags (Primary, Peds, Drug, Misc.).
v1.0.0 – Initial implementation: dashboard with stat cards, expiration highlighting, sortable table, search, and filter chips; admin panel with add/edit/delete and photo preview; Apps Script backend with CRUD and weekly expiration email.
PR Flight Requestv1.0.12 entries
v1.0.1 – Moved "Signed Off By" and "Area Manager Approval" (with their dates) out of the After the Flight section into their own Approvals card on the main form, since they're filled in when the request is submitted rather than afterward. Removed the Year field from the form entirely — the year stamped in the top-right corner is taken straight from the event date, so there's nothing to fill in or keep in sync. Mobile fixes: the Clear and Generate PDF buttons now sit together on their own line below the draft-status text instead of splitting awkwardly across two rows, and the preview's Back and Open/Print buttons share a row with Download PDF full-width beneath them. The Tools index now fills a column top-to-bottom and starts a second column after four buttons on desktop, while phones keep one continuous scrolling column.
v1.0.0 – Initial implementation: fill out a web form and generate a completed Air Evac Public Relations Flight Request PDF, with the scheduled year stamped in the upper-right corner of the page. Covers every field on the paper form — event details, contacts and alternate numbers, LZ training, county and agency, request type (Flight Marketing / Membership / Early Activation), coordinators and phone numbers, estimated flight hours, radio frequencies, landing zone directions, up to five participating agencies, special instructions, and crew attending — plus a collapsible after-the-flight section for completion, total flight time, follow-up comments, and sign-off. Long entries shrink to fit their line automatically, and the free-text boxes show a live line count that warns before anything would be cut off. Includes an on-screen preview of the finished page, download with an auto-named file, and automatic draft saving on the device. Runs entirely in the browser with the blank form embedded in the page — no upload and no server round-trip.