Until now there was no way to find a completed session without already knowing which event it belonged to - navigation was strictly Events -> one event -> its sessions. A new "Resultatarkiv" view lists every finished session across all events, searchable by event/session name, class, driver and date range. Opening a session reuses the existing single-session leaderboard builder for standings and the existing per-competitor lap lookup for lap history - no new results logic - plus a session-wide penalties/ corrections list (resultsBySession[id].adjustments), previously only visible in the live judging action log. Export buttons reuse the existing per-event PDF and race-package JSON export functions rather than adding a new format. Investigated what should happen to raw timing data when a race is deleted. Training statistics and session replay already read from their own independent, deliberately-retained copies that survive deletion by existing design - unaffected either way. The one thing that outlived deletion with no purpose was the raw `passings` SQLite rows (write-only; nothing in the app reads them), growing forever with driver IDs never purged. A new POST /api/passings/purge endpoint now removes exactly the deleted session(s)' rows, called as a best-effort side call from both delete-event and delete-session. Also fixes a real bug found while building this: ensureSessionResult guarded adjustments/splits/pitEvents/pitStops against being missing on an already-existing result, but not passings itself, so viewing lap history for such a result (e.g. an older/imported race package) crashed outright. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
124 lines
9.8 KiB
Markdown
124 lines
9.8 KiB
Markdown
# Changelog
|
|
|
|
User-visible changes to RC RaceCore are recorded here, starting with the 1.1.0 baseline. Earlier development has not been reconstructed as individual releases.
|
|
|
|
The application version is maintained in `package.json` and displayed in the administration menu. Add changes under **Unreleased** as they are made. When preparing a release, move those entries into a dated version section and update the version in both `package.json` and `package-lock.json`.
|
|
|
|
## Unreleased
|
|
|
|
No changes recorded yet.
|
|
|
|
## 1.6.0 - 2026-09-09
|
|
|
|
### Added
|
|
|
|
- A new "Resultatarkiv" (results archive) view lists every completed session across all events, searchable by event/session name, class, driver and date - no more needing to already know which event a session belonged to. Opening a session shows its standings, penalties/corrections, and a per-driver lap history, and offers the same PDF and race-package (JSON) export already available from Event Manager. Deleting an event or session now also removes its raw timing rows from the database instead of leaving them behind indefinitely - driver-visible training statistics and session replay are unaffected, since they already keep their own independent copy.
|
|
|
|
### Fixed
|
|
|
|
- Opening a session's lap history in the archive (or anywhere reusing the same lookup) crashed if that session's result was missing its passings list - e.g. an older or hand-edited/imported race package. It's now backfilled the same way other missing result fields already were.
|
|
|
|
## 1.5.0 - 2026-09-09
|
|
|
|
### Added
|
|
|
|
- A "Pass avslutat" (practice complete) summary now appears on the driver's personal mobile profile the moment their 5-minute practice timer finishes: how their pace and consistency compared to their recent sessions, any goal or lap-count milestone reached during that pass with its reward shown prominently, and one suggested next goal - scoped to their current class, with a plain explanation whenever there isn't enough data yet to judge pace or consistency.
|
|
|
|
## 1.4.3 - 2026-09-09
|
|
|
|
### Fixed
|
|
|
|
- Two admin browsers open at once could silently overwrite each other's work: any save pushed a browser's entire in-memory copy of the data, so an idle tab's next save - even an unrelated one - could revert another browser's more recent changes, including a live race's in-progress results. Live results computed from real timing data are now protected from being reverted for a short window after they arrive, and every view now quietly refreshes its data in the background every 15 seconds (without ever discarding an open, unsaved edit), so the data behind any save stays fresh instead of getting stale over hours.
|
|
|
|
## 1.4.2 - 2026-09-09
|
|
|
|
### Fixed
|
|
|
|
- Sync and backups could fail everywhere with an unexplained "Failed to fetch", while the server itself was completely healthy, whenever the page was opened via a different address (e.g. a LAN IP) than the one saved in Settings under "Backend URL" - browsers treat those as different origins, and the browser's own security check (CORS) silently blocks the requests without explaining why. Settings now detects this mismatch, names the page's actual address, and offers a one-click button to fix it.
|
|
|
|
## 1.4.1 - 2026-09-09
|
|
|
|
### Fixed
|
|
|
|
- A backup failure at startup (e.g. no write permission for the backups folder, a path beyond Windows' MAX_PATH, a OneDrive/cloud-sync folder locking it, or antivirus interference) could crash the entire server before it started listening, instead of just leaving backups unavailable. Backup-directory creation is now non-fatal and retried on each backup attempt, and a file rename right after a backup completes now retries briefly if a file is momentarily locked by antivirus/cloud-sync scanning.
|
|
|
|
## 1.4.0 - 2026-09-09
|
|
|
|
### Added
|
|
|
|
- "Jämna varv" and "Stegträning" can now be configured, started and stopped directly from the driver's own personal mobile profile link, the same way the existing self-service practice timer already works there - independent of whether an admin has the Training page open. Live progress (streak, today's best, tolerance-based lap coloring, step pills) is computed server-side from the driver's own share token, so raw lap rows and driver IDs never reach the mobile page - only sanitized aggregates, matching the existing public-profile security boundary. Each exercise tracks its own elapsed time independently of the general 5-minute practice timer and of each other.
|
|
|
|
## 1.3.0 - 2026-09-09
|
|
|
|
### Added
|
|
|
|
- "Stegträning" (step training): a second guided practice exercise inside an active Open Practice session. Configure a sequence of steps (lap count plus calm/controlled/fast effort per step, defaulting to the classic pyramid); the Training page shows the current step, remaining laps, and a per-step progress pill, and once two "controlled" steps have laps it shows the plain pace difference between the first and last one - never labeled as fatigue.
|
|
|
|
## 1.2.0 - 2026-09-09
|
|
|
|
### Added
|
|
|
|
- "Jämna varv" (even laps): a guided practice exercise inside an active Open Practice session. Set a target lap time, tolerance and lap count (with a suggested target from the driver's own personal best); the Training page shows the live streak and today's best streak, and a missed lap starts a new streak without losing the best one.
|
|
- Personal mobile profiles show last successful data retrieval, stale-data and failed-update warnings, and a Retry button without replacing loaded statistics or active forms. Requests time out after 15 seconds and cannot overlap.
|
|
- Browser coverage for Race Day start/pause/resume/finish and switching to the next queued heat, against a simulated decoder socket.
|
|
- Browser coverage for opening the OBS overlay as a real popup window (not a direct URL load): compact layout, and live clock updates that freeze on pause, polling independently of the admin page.
|
|
- Browser coverage for decoder auto-reconnect after a dropped socket (simulated network interruption): reconnects onto exactly one connection, never a duplicate, and stops retrying once auto-reconnect is turned off.
|
|
|
|
### Fixed
|
|
|
|
- Open Practice sessions on a sponsor (track-mode) event could show a ready/green Race Day preflight yet refuse to start, blocked by a stricter assignment check the preflight never warned about. Open Practice is now exempt from that check everywhere, matching the preflight.
|
|
- The Race Day view did not refresh when the decoder connected, disconnected, or errored, so its Start button and preflight checklist could stay stale after a page load until something else triggered a re-render.
|
|
- Printing or exporting start lists, results, heat sheets and team reports always showed a false "popup blocked" error and produced nothing, in every modern browser. Opening the OBS overlay as a popup had the same false "blocked" check and its window never received focus. Both used `window.open(..., "noopener,noreferrer,...")`, which returns `null` even on success by current browser standards; both now open without those flags.
|
|
- The Training page crashed for any driver with fewer than 3 laps in every stint - a common state, e.g. a driver's first couple of laps in a session - because a dedup step read a property off a `null` "best stint" entry.
|
|
|
|
## 1.1.2 - 2026-09-08
|
|
|
|
### Reliability checks
|
|
|
|
- Browser coverage for sponsor-event edits, endurance race creation, team membership changes/deletion, session-type conversion and lap-limit persistence.
|
|
- Overlay sorting headings share the same column tracks as driver rows. Narrow displays scroll the headings and values together.
|
|
|
|
### Added
|
|
|
|
- Browser-local decoder/socket diagnostics in Settings: per-channel counters, bounded logs, pause/clear/copy and independent updates that preserve form drafts.
|
|
- A prioritized ROADMAP.md with completion checklists.
|
|
- Server/save status, last load/save times, stale/offline warnings and manual retry of local changes.
|
|
- Isolated browser regression checks for class/driver/car creation and editing, retained drafts, reload persistence and offline save recovery (`npm run test:browser`).
|
|
|
|
### Fixed
|
|
|
|
- New browser profiles connect to the page origin rather than assuming backend port 8081.
|
|
- Correct chronological sorting of zero-padded times and deterministic ordering of distinct numeric-looking driver/car names. Name and identifier columns are explicitly treated as text.
|
|
- OBS race-info and standings panels wrap on narrow sources. Driver names retain space and timing fields wrap instead of overflowing.
|
|
|
|
## 1.1.1 - 2026-09-07
|
|
|
|
### Added
|
|
|
|
- Sortable columns in the leaderboard, recent passings, and training tables/lists, with each list remembering its own sort choice.
|
|
- OBS overlay leaderboard layout split into a race-info panel (left) and a driver-stats panel (right), so each can be positioned independently on stream.
|
|
|
|
### Fixed
|
|
|
|
- Sorting by driver or car name no longer merges differently zero-padded numbers (e.g. "09" and "9") into the same position.
|
|
- Sorting the interactive overlay no longer changes the row order shown on the OBS broadcast source.
|
|
|
|
## 1.1.0 - 2026-09-05
|
|
|
|
### Added
|
|
|
|
- Visible application version in the menu, read from the running server's package version.
|
|
- This changelog as the starting point for tracking future changes.
|
|
|
|
### Baseline
|
|
|
|
The existing feature set includes race and sponsor-event setup, team racing, AMMC timing, Race Day preflight, overlays and OBS views, Swedish and English race audio, training statistics, personal mobile profiles, import/export, and backups. See the README and in-app guide for configuration and usage.
|
|
|
|
Recent improvements included in this baseline:
|
|
|
|
- More compact mobile training profiles and consistent class-selector text sizing.
|
|
- Mobile refresh protection while entering data, selecting a class, or saving a car change.
|
|
- Separate unsaved car-change notes per class during page updates and class switching.
|
|
- Preservation of loaded mobile statistics during temporary refresh failures.
|
|
- Race Day preflight lists blockers first and provides shortcuts to the relevant configuration.
|