diff --git a/src/app.js b/src/app.js index a58f76b..23dad75 100644 --- a/src/app.js +++ b/src/app.js @@ -11,7 +11,7 @@ const NAV_ITEMS = [ { id: "guide", titleKey: "nav.guide", subtitleKey: "nav.guide_sub" }, ]; -const SESSION_TYPES = ["free_practice", "practice", "qualification", "heat", "final"]; +const SESSION_TYPES = ["open_practice", "free_practice", "practice", "qualification", "heat", "final"]; const STORAGE_KEY = "rc_timing_control_v1"; const DEFAULT_LANGUAGE = "sv"; @@ -64,6 +64,7 @@ const TRANSLATIONS = { "dashboard.connect_decoder": "Anslut Decoder", "dashboard.recent_sessions": "Senaste sessioner", "dashboard.free_practice": "Fri träning", + "dashboard.open_practice": "Open Practice", "session.none_yet": "Inga sessioner ännu.", "classes.create": "Skapa klass", "classes.placeholder": "Klassnamn (t.ex. 2WD Buggy)", @@ -168,6 +169,7 @@ const TRANSLATIONS = { "events.export_heat_sheet": "Exportera heatsheet", "events.pdf_heat_sheet": "PDF heatsheet", "events.free_practice_note": "Free Practice visar löpande varvtider och används inte för seedning.", + "events.open_practice_note": "Open Practice visar alla inkommande transpondrar löpande. Om ingen förare matchar visas bara transpondern.", "events.generate_qualifying": "Skapa kval från practice", "events.clear_generated_qualifying": "Rensa genererade kval", "events.generate_finals": "Skapa finaler från kval", @@ -373,6 +375,8 @@ const TRANSLATIONS = { "status.leader": "LEDARE", "status.seeded": "SEED", "status.free_practice": "FREE", + "status.open_practice": "OPEN", + "session.open_practice": "open practice", "session.free_practice": "fri träning", "session.practice": "träning", "session.qualification": "kval", @@ -421,6 +425,10 @@ const TRANSLATIONS = { "guide.free_practice_1": "Använd sessionstypen fri träning när du bara vill visa löpande varvtider.", "guide.free_practice_2": "Free Practice påverkar inte seedning till kval eller finaler.", "guide.free_practice_3": "Leaderboarden visar varv, senaste varv, bästa varv, gap till framförvarande och eget delta mot föregående varv.", + "guide.open_practice_title": "Open Practice", + "guide.open_practice_1": "Använd Open Practice när du vill att systemet bara ska lista alla transpondrar som kommer in.", + "guide.open_practice_2": "Om transpondern inte matchar en registrerad förare visas transpondernumret som namn.", + "guide.open_practice_3": "Open Practice påverkar inte seedning, kval eller finaler.", "overlay.title": "Overlay", "overlay.subtitle": "Extern leaderboard-skärm", "overlay.no_active": "Ingen aktiv session vald.", @@ -511,6 +519,7 @@ const TRANSLATIONS = { "dashboard.connect_decoder": "Connect Decoder", "dashboard.recent_sessions": "Recent Sessions", "dashboard.free_practice": "Free Practice", + "dashboard.open_practice": "Open Practice", "session.none_yet": "No sessions yet.", "classes.create": "Create Class", "classes.placeholder": "Class name (e.g. 2WD Buggy)", @@ -615,6 +624,7 @@ const TRANSLATIONS = { "events.export_heat_sheet": "Export heat sheet", "events.pdf_heat_sheet": "PDF heat sheet", "events.free_practice_note": "Free Practice shows rolling lap times and is not used for seeding.", + "events.open_practice_note": "Open Practice shows all incoming transponders live. If no driver matches, only the transponder is shown.", "events.generate_qualifying": "Generate qualifying from practice", "events.clear_generated_qualifying": "Clear generated qualifying", "events.generate_finals": "Generate finals from qualifying", @@ -820,6 +830,8 @@ const TRANSLATIONS = { "status.leader": "LEADER", "status.seeded": "SEED", "status.free_practice": "FREE", + "status.open_practice": "OPEN", + "session.open_practice": "open practice", "session.free_practice": "free practice", "session.practice": "practice", "session.qualification": "qualification", @@ -868,6 +880,10 @@ const TRANSLATIONS = { "guide.free_practice_1": "Use the free practice session type when you only want to show live lap times.", "guide.free_practice_2": "Free Practice does not affect seeding for qualifying or finals.", "guide.free_practice_3": "The leaderboard shows laps, last lap, best lap, gap to the car ahead and your own delta versus the previous lap.", + "guide.open_practice_title": "Open Practice", + "guide.open_practice_1": "Use Open Practice when you want the system to simply list every transponder that comes in.", + "guide.open_practice_2": "If the transponder does not match a registered driver, the transponder number is shown as the name.", + "guide.open_practice_3": "Open Practice does not affect seeding, qualifying or finals.", "overlay.title": "Overlay", "overlay.subtitle": "External leaderboard screen", "overlay.no_active": "No active session selected.", @@ -2307,6 +2323,7 @@ function renderEventManager(eventId) {
${t("events.seed_best_laps_hint")}
${t("events.free_practice_note")}
+${t("events.open_practice_note")}
${t("timing.remaining")}: ${formatCountdown(sessionTiming?.remainingMs ?? 0)}
${t("timing.total_passings")}: ${result.passings.length}
- ${active.type === "free_practice" ? `${t("events.free_practice_note")}
` : ""}` + ${ + active.type === "free_practice" + ? `${t("events.free_practice_note")}
` + : active.type === "open_practice" + ? `${t("events.open_practice_note")}
` + : "" + }` : `${t("timing.no_active")}
` } ${showFinishedBanner ? `` : ""} @@ -3359,6 +3382,17 @@ function renderGuide() {