v30.2.1Admin User Removal
- Added an Admin-only Remove User action to User Management.
- Removal deletes the user's Firebase Authentication account and Firestore user-role record, revokes refresh tokens, and signs an already-open web session out when its authorization record disappears.
- Admins cannot remove their own currently signed-in account, and the backend prevents removal or demotion of the last remaining Admin.
- Added User / Remove User entries to the Audit Trail so account removals are attributable.
- Tightened asset and activity reads so authenticated web users must still have an authorized user record; the iPhone app's anonymous-auth read path remains supported.
- This release requires Firestore Rules, Cloud Functions, and Hosting deployment; the one-click updater handles all three automatically.
v30.2.0Reports / Export Center
- Added a Reports / Export Center available from the main action row.
- Added Current Deployed Inventory, Current Inventory, Active Unit Deployments, Asset History, Deployment History, Equipment Utilization, and Audit Trail reports.
- Added asset-type and Eastern-Time date filters where applicable, with historical reports loading up to the 5,000 most recent Audit Trail records on demand.
- Added downloadable CSV exports plus a print-friendly report view that can be printed or saved as PDF from the browser.
- Out-of-Service reporting is intentionally reserved until an Out-of-Service status is added to the asset model.
- No Firestore schema, Rules, Cloud Functions, or authentication changes are required.
v30.1.2Header Status + Expanded Automated Coverage
- Moved the version, Firestore connection status, and signed-in role/user badges into a compact status row directly below the main Audit Trail / Users / Changelog / theme / Sign Out action row.
- Removed those badges from the Live Status heading so the asset workspace stays cleaner and the connection/user state is visible near the primary navigation.
- Added comprehensive automated UI-contract coverage that verifies every static DOM dependency referenced by the main tracker and Audit Trail JavaScript, catches duplicate IDs, validates release/cache versions, and protects the new header-status placement.
- Added additional core edge-case regression coverage for inventory, normalization, identity aliases, timestamps, deployment helpers, validation, and batch parsing.
- No Firestore data, Rules, Cloud Functions, authentication, or collection-schema changes.
v30.1.1Collapsible Operations Overview
- Simplified the main dashboard by collapsing the new Operations Overview by default.
- Kept the existing asset-type overview cards visible while moving Current Inventory, Active Unit Deployments, Most Recently Deployed, Longest Outstanding, and Recent Activity behind one expandable Operations Overview control.
- Preserved the full v30.1.0 Operations Overview and Asset History functionality without changing Firestore data, Rules, or Cloud Functions.
v30.1.0Operations Overview + Asset History
- Added a command-level Operations Overview spanning Radios, Phones, MDTs, and EPCRs.
- Added live inventory totals, active Unit Deployments, recently deployed assets, longest-outstanding assets, and recent activity.
- Added a History action to every asset card with a per-asset timeline sourced from the existing audit log.
- Asset History shows status transitions, person or unit, assignment, comments, editor, radio accessories, and event time when available.
- Uses the existing Firestore collections and audit records; no data migration, Rules deployment, or Cloud Functions deployment is required.
v30.0.0Stabilization Baseline + Semantic Versioning
- Started the permanent Major.Minor.Patch versioning system: major releases are stabilization baselines, minor releases add capabilities, and patch releases fix or refine existing behavior.
- Completed a full web/backend contract audit covering Firestore collections, roles, Cloud Functions exports, deployment IDs, audit records, iPhone compatibility aliases, and hosting boundaries.
- Fixed a latent global Sign In Multiple return bug: cross-type results now resolve the selected Radio, Phone, MDT, or EPCR from the full inventory when the return is actually submitted.
- Global batch-return selections now use type-qualified keys so similarly named or keyed assets in different collections cannot collide.
- Added automated configuration and backend audit commands and repaired the previously incomplete npm verify workflow.
- Replaced the version-specific preflight workflow with a reusable release preflight while retaining the old v28 command as a compatibility wrapper.
- Documented the v30 architecture, release process, semantic-versioning rules, backend audit findings, and known intentional security boundary.
- Preserved the transitional iPhone write compatibility path; no authentication/security migration was mixed into this stabilization release.
- No Firestore data migration, Firestore Rules deployment, or Cloud Functions deployment is required.
- Preserved the complete historical changelog.
v29.2.2Batch Return Window Runtime Fix
- Fixed a JavaScript runtime error that prevented Sign In Multiple from opening after the global equipment search change.
- Global Sign In Multiple continues to include deployed Radios, Phones, MDTs, and EPCRs regardless of the selected main equipment tab.
- Corrected equipment-type sorting to use the keys of the ASSET_TYPES configuration object.
- Added regression coverage for this exact runtime error.
- No Firestore Rules, Cloud Functions, authentication, or collection-schema changes.
v29.2.1Global Batch Return Search Fix
- Sign In Multiple now loads deployed assets from all equipment types instead of only the currently selected equipment tab.
- Searching from Radios can now find deployed Phones, MDTs, and EPCRs, and vice versa.
- Search continues to match asset, Unit, Full Name, and Assignment.
- Select All continues to affect only visible filtered results.
- No Firestore Rules, Cloud Functions, authentication, or collection-schema changes.
v29.2Editable Unit Deployments + Batch Return Search
- Added Edit Deployment to active Unit Deployments in the Deployed Units view.
- Editors/Admins can add available Radios, Phones, MDTs, or EPCRs to the same existing Unit Deployment without creating a new deployment ID.
- Editors/Admins can uncheck currently deployed assets to return only those assets while the rest of the Unit Deployment stays active.
- Unit Name, optional Full Name, and Comments can be updated across assets that remain in the Unit Deployment.
- New radios added during an edit receive the selected radio accessories; radios already deployed keep their existing accessory assignments.
- Edit mode shows current assets, additions, and returns before saving.
- Added search to Sign In Multiple, including asset, unit, person, and assignment text.
- Select All in Sign In Multiple selects only the currently visible search results.
- Audit Trail records Unit Deployment Edit, Unit Asset Added, and Unit Asset Removed actions.
- No Firestore Rules, Cloud Functions, iPhone authentication, or collection-schema changes.
- Preserved the complete changelog from all prior releases.
v29.1Paired Asset Return
- Added Sign In Radio + Phone for radios and Surge phones that were originally signed out together.
- The paired-return option is available from either member of the pair while both assets are still deployed together.
- Pair matching requires the same deployment ID plus reciprocal radio/phone links, preventing unrelated assets from being returned accidentally.
- Individual Sign In remains available when only one asset should be returned.
- Paired returns use one atomic multi-asset Firestore write and clear deployment/link metadata on both assets.
- Audit Trail records a Paired Sign In entry for each returned asset and preserves the prior deployment information for history.
- No Firestore Rules, Cloud Functions, iPhone authentication, or asset-schema changes.
- Preserved the complete changelog from all prior releases.
v29Unit Operations
- Added a Deployed Units view showing every active Unit Deployment and the Radios, Phones, MDTs, and EPCRs assigned with it.
- Radio entries in Deployed Units show the additional equipment deployed with each radio.
- Deployed Units shows the Unit Name, optional Full Name, active asset count, equipment-type totals, and latest deployment update time.
- Editors and Admins can Sign In Entire Unit directly from the Deployed Units view.
- Individual Sign In now also offers Sign In Entire Unit when multiple assets from the same Unit Deployment remain deployed.
- Entire-unit returns use the shared deployment ID, so unrelated deployments with the same Unit Name are never returned accidentally.
- Viewers can inspect Deployed Units but cannot perform returns.
- Audit Trail records each returned asset as Unit Sign In and includes Unit Deployment and Unit Sign In filters.
- Legacy unit deployments without deployment IDs remain visible but must be signed in individually.
- No Firestore Rules, Cloud Functions, or iPhone authentication changes.
- Preserved the complete changelog from all prior releases.
v28.3Unit Deployment Optional Name
- Added an optional Full Name field to Unit Deployment.
- When Unit Name and Full Name are both entered, selected assets store and display both values.
- Unit Name remains required and Full Name remains optional.
- Kept the Unit Deployment window compact by placing Unit Name and Full Name side-by-side on larger screens.
- No Firestore Rules, Cloud Functions, iPhone authentication, or deployment-ID changes.
- Preserved the complete changelog from all prior releases.
v28.2iPhone Anonymous Auth Compatibility
- Restored iPhone-to-Firestore writes for the current mobile app using Firebase Anonymous Authentication.
- Preserved the existing transitional unauthenticated mobile write path for compatibility.
- Asset deletes remain Admin-only, and protected reads still require an authenticated Firebase session.
- No Cloud Functions, asset schema, deployment logic, or user-interface behavior changes.
- Preserved the complete changelog from all prior releases.
v28.1Responsive Management Toolbar
- Fixed management controls overflowing past the right edge at common laptop/browser widths.
- Management buttons now move to a clean full-width row when the toolbar cannot safely fit three columns.
- Preserved the existing mobile arrangement and all v28 deployment, audit, compatibility, and data logic.
- No Firestore Rules, Cloud Functions, schema, or deployment-logic changes.
- Preserved the complete changelog from all prior releases.
v28Codebase Refactor & Stabilization
- Refactored deployment, validation, Firestore write, payload, and audit logic into focused internal modules without intentionally changing the operator interface.
- Added deployment IDs so assets issued together can be traced as one deployment.
- Upgraded new Audit Trail records with consistent before/after state snapshots while preserving legacy display fields.
- Strengthened iPhone/web compatibility and UI-freeze regression tests.
- Added Firestore data-contract, architecture, backup/release, compatibility, and security-hardening documentation.
- Added local backup and v28 preflight tools for safer future releases.
- Preserved the complete changelog from all prior releases.
v27.6Image Consistency + Unit/Name Display
- Corrected the Audit Trail header image to use the same full-width Communications banner as the main tracker.
- Replaced the old login image with the true transparent Communications Unit logo on both login pages.
- Asset cards now show both Unit and Name when both values are present.
- Unit-deployed assets can retain and edit an optional person name and phone number alongside the Unit Name.
- Preserved the complete changelog from all prior releases.
v27.5Phone Formatting + Audit Header Fix
- Phone Number fields now format automatically as (###) ###-####.
- Phone Number remains optional, but any entered number must contain exactly 10 digits.
- Existing stored phone numbers are formatted consistently when displayed.
- Corrected the Audit Trail header so external dashboard links stay on the navigation row and Asset Tracker, Light/Dark, and Sign Out appear on the action row beneath it.
- Preserved the complete changelog from all prior releases.
v27.4Individual Asset Editing
- Restored an Edit button on individual asset cards while keeping Sign Out and Sign In.
- Edit changes asset information without changing the current Available or Deployed status.
- Person deployments can edit name, phone number, assignment, comments, and deployed radio equipment.
- Unit deployments can edit Unit Name, assignment, comments, and deployed radio equipment.
- Every saved edit receives its own Audit Trail entry.
- Preserved the complete changelog from all prior releases.
v27.3Unit Deployment Search Fix
- Fixed Unit Deployment equipment searches so matching results now actually filter on screen.
- Search visibility now uses explicit display control instead of relying only on the HTML hidden attribute.
- Existing selections remain checked when filtered out and return when the search is cleared.
- Preserved the complete changelog from all prior releases.
v27.2Unit Deployment Equipment Search
- Added separate search boxes for Radios, Phones, MDTs, and EPCRs in Unit Deployment.
- Each equipment list filters independently as you type.
- Filtering does not clear assets that are already selected.
- Available and selected counts remain based on the full live inventory, not only visible search results.
- Preserved the complete changelog from all prior releases.
v27.1Unit Deployment Window Fit
- Fixed the Unit Deployment window so it stays completely inside the browser viewport.
- Made the dialog use the available screen width instead of overflowing from the narrower default dialog size.
- Added internal scrolling and responsive asset-list heights so the top and bottom controls remain reachable on shorter screens.
- Improved the two-column layout so Select All and Clear controls no longer get clipped.
- Preserved the complete changelog from all prior releases.
v27Unit Deployment
- Added a Unit Deployment workflow for Editors and Admins.
- Assets can now be deployed to a unit instead of an individual person.
- Unit Deployment supports selecting any combination of Radios, Phones, MDTs, and EPCRs in one operation.
- Only currently available assets are selectable.
- Selected radio accessories can be assigned across all radios in the deployment.
- Every selected asset receives its own Unit Deployment Audit Trail entry and can still be signed in individually or by asset type.
- Preserved the complete changelog from all prior releases.
v26.6Radio + Surge Phone Sign Out
- Added an optional Surge Phone selector to the individual radio Sign Out screen.
- The selector lists only currently available Surge phones.
- When selected, the radio and Surge phone are deployed together to the same person and assignment.
- Both assets are written together and each receives its own Audit Trail Sign Out entry.
- Preserved the complete changelog from all prior releases.
v26.5Full-Width Communications Header
- Made the wide District of Columbia Fire Department Communications artwork the entire top header.
- Moved dashboard navigation and action controls underneath the banner so the artwork gets the full width.
- Applied the full-width banner to both the main tracker and Audit Trail page.
- Preserved the complete changelog from all prior releases.
v26.4Transparent Header Logo
- Removed the baked-in checkerboard/light background from the Communications Unit header logo.
- Header logos now use a true transparent PNG so they blend correctly in Dark and Light mode.
- Preserved the original logo artwork and the complete changelog.
v26.3Header Action Row Reorder
- Moved Audit Trail from the top navigation row to the action row underneath.
- Reordered the second row left-to-right as Audit Trail, Users, Changelog, Light/Dark, then Sign Out.
- Kept Map Live View, Unit Tallies, and BMT Dashboard on the top row.
- Preserved the complete changelog from all prior releases.
v26.2Department Name Update
- Updated site-wide department branding to District of Columbia Fire Department.
- Updated both the main asset tracker and Audit Trail page.
- Preserved the complete changelog from all prior releases.
v26.1Separate Audit Trail Page
- Moved the Audit Trail off the main asset dashboard to a dedicated authenticated page.
- Added Audit Trail to the main navigation.
- Added search plus Action and Asset Type filters to the Audit Trail page.
- Started decimal versioning for smaller updates while preserving the complete changelog.
v26Editor Remove Box Access
- Made Remove Box available to both Editors and Admins.
- Added a dedicated secured backend function that limits Editor removal to the configured radio box ranges.
- Kept ordinary asset deletion and Batch Delete restricted to Admins.
- Preserved the complete changelog from all prior releases.
v25Individual Sign In / Sign Out Actions
- Replaced individual asset Edit and Delete buttons with operational Sign Out and Sign In actions.
- Available assets display Sign Out; deployed assets display Sign In.
- Individual deletion was removed from asset cards; admin batch and box removal tools remain available.
- Preserved the complete changelog from all prior releases.
v24Box A + Box B Assignments
- Assigned NCR DC 001–020 to Box A in radio asset details.
- Assigned NCR DC 021–040 to Box B in radio asset details.
- Preserved the complete changelog from all prior releases.
v23Radio Box Details + Full Changelog
- Radio asset details now show the assigned deployment box when applicable.
- Box assignment is read from Firestore when stored and otherwise derived from the NCR DC radio number.
- Restored the complete in-app changelog so prior releases remain visible.
v22Login Required
- Added a dedicated Email/Password sign-in page as the first screen.
- Dashboard content stays hidden until Firebase Authentication succeeds.
- Firestore listeners start only after authentication.
- Signing out clears protected data and returns to the login screen.
- Tracker collection reads now require authentication.
v21Operational UI Refresh
- Redesigned the viewer as a cleaner internal operations dashboard.
- Removed glass/blur styling and animated navigation effects.
- Reduced shadows, corner radii, motion, and visual noise.
- Made asset cards denser and easier to scan.
v20Radio Boxes + Admin Fixes
- Added the DCFD Communications Unit logo.
- Dark mode became the default and the selected theme is remembered.
- Added Add Box for Boxes C, D, E, F, G, H, I, J, K, L, N, P, R, and S.
- Added Admin-only Remove Box with typed confirmation.
- Improved user creation and role-management errors.
v19Live Inventory Merge Fix
- Fixed live Firestore snapshots replacing the built-in inventory with cloud-only records.
- Kept the default radios and phones visible while overlaying live cloud state.
v18Shared iPhone/Web Inventory Sync
- Web inventory now mirrors the iPhone app defaults: NCR DC 001–040 and Surge 1–100.
- Firestore records overlay built-in inventory so live status remains authoritative.
- Web writes use iPhone-compatible identity fields.
- Added support for the iPhone transactions collection.
v17App Radio Identity Fix
- Fixed app-created UUID radio records displaying UUIDs instead of NCR DC radio names.
- Improved radio alias normalization between app and web records.
v16Multi-Asset + Permissions
- Added Radios, Phones, MDTs, and EPCRs.
- Added batch add, batch delete, multiple sign-out, and multiple sign-in.
- Added Viewer, Editor, and Admin permission levels.
- Added admin user creation and role management.
- Made phone number optional.
- Expanded radio additional-equipment tracking.
v15Automated Regression Tests
- Added automated regression tests.
v14Navigation Refresh
- Refreshed navigation, styling, and theme interactions.
v13Dashboard Navigation Header
- Added Map Live View, Unit Tallies, and BMT Dashboard links.
v12Additional Equipment Tracking
- Added radio accessory selections and deployed-equipment display.