From a5503460947ebca59864544567571c8850f330d2 Mon Sep 17 00:00:00 2001 From: larssand Date: Wed, 25 Mar 2026 19:23:29 +0100 Subject: [PATCH] fix event --- src/app.js | 197 +++++++++++++++++++++++++++++++++++++++---------- src/styles.css | 16 ++++ 2 files changed, 173 insertions(+), 40 deletions(-) diff --git a/src/app.js b/src/app.js index ca3e37a..cdf1244 100644 --- a/src/app.js +++ b/src/app.js @@ -13,6 +13,10 @@ const NAV_ITEMS = [ ]; const SESSION_TYPES = ["open_practice", "free_practice", "practice", "qualification", "heat", "final", "team_race"]; + +function getSessionTypeChoices(mode) { + return mode === "track" ? SESSION_TYPES.filter((type) => type !== "team_race") : SESSION_TYPES; +} const STORAGE_KEY = "rc_timing_control_v1"; const DEFAULT_LANGUAGE = "sv"; const DEFAULT_THEME = "dark"; @@ -385,6 +389,24 @@ const TRANSLATIONS = { "events.print_team_results": "Skriv ut lagrapport", "events.pdf_team_results": "PDF lagrapport", "events.add_session": "Lägg till session", + "events.session_type_label": "Sessionstyp", + "events.session_type_hint_track": "Välj vilken del av sponsor-eventet du skapar: träning, kval, heat eller final. Eventet i sig är redan ett sponsor-event.", + "events.session_type_hint_race": "Välj vilken session i racet du skapar: träning, kval, heat, final eller lagrace.", + "events.session_duration_label": "Längd (min)", + "events.session_duration_hint": "Ordinarie körtid för sessionen i minuter.", + "events.session_followup_label": "Follow-up (sek)", + "events.session_followup_hint": "Extra tid efter ordinarie sluttid så sista bilarna kan fullfölja.", + "events.session_start_mode_label": "Starttyp", + "events.session_start_mode_hint": "Mass-start, positionsstart eller individuell staggered start.", + "events.session_seed_laps_label": "Seedning bästa varv", + "events.session_seed_laps_hint": "0 = av. Använd 2 eller 3 för practice/kval-seedning.", + "events.session_seed_method_label": "Seedmetod", + "events.session_seed_method_hint": "Hur de bästa varven ska räknas: summa, snitt eller följdvarv.", + "events.session_stagger_gap_label": "Stagger-gap (sek)", + "events.session_stagger_gap_hint": "Används bara för staggered start. 0 = ingen extra lucka.", + "events.session_max_cars_label": "Max bilar (valfritt)", + "events.session_max_cars_hint": "Sätt gräns om just den sessionen bara ska ha ett visst antal bilar.", + "events.edit_session_help": "Ändra sessionens namn, typ, tid och seed-/startinställningar här.", "events.set_active": "Sätt aktiv", "events.assignments": "Tilldelningar", "events.na": "ej relevant", @@ -1174,6 +1196,24 @@ const TRANSLATIONS = { "events.print_team_results": "Print team report", "events.pdf_team_results": "PDF team report", "events.add_session": "Add Session", + "events.session_type_label": "Session type", + "events.session_type_hint_track": "Choose which part of the sponsor event you are creating: practice, qualifying, heat or final. The event itself is already a sponsor event.", + "events.session_type_hint_race": "Choose which race session you are creating: practice, qualifying, heat, final or team race.", + "events.session_duration_label": "Duration (min)", + "events.session_duration_hint": "Main running time for the session in minutes.", + "events.session_followup_label": "Follow-up (sec)", + "events.session_followup_hint": "Extra time after the main timer so the last cars can finish.", + "events.session_start_mode_label": "Start mode", + "events.session_start_mode_hint": "Mass start, position start or individual staggered start.", + "events.session_seed_laps_label": "Seed best laps", + "events.session_seed_laps_hint": "0 = off. Use 2 or 3 for practice/qualifying seeding.", + "events.session_seed_method_label": "Seed method", + "events.session_seed_method_hint": "How to count the best laps: sum, average or consecutive laps.", + "events.session_stagger_gap_label": "Stagger gap (sec)", + "events.session_stagger_gap_hint": "Only used for staggered starts. 0 = no extra gap.", + "events.session_max_cars_label": "Max cars (optional)", + "events.session_max_cars_hint": "Set a limit if this session should only allow a certain number of cars.", + "events.edit_session_help": "Edit the session name, type, timing and seed/start settings here.", "events.set_active": "Set Active", "events.assignments": "Assignments", "events.na": "n/a", @@ -4300,6 +4340,8 @@ function renderEventManager(eventId) { .join(""); const branding = normalizeBrandingConfig(event.branding); const editingSession = sessions.find((session) => session.id === selectedSessionEditId) || null; + const sessionTypeChoices = getSessionTypeChoices(event.mode); + const sessionTypeHintKey = event.mode === "track" ? "events.session_type_hint_track" : "events.session_type_hint_race"; const racePresets = getRaceFormatPresets(); const selectedPreset = racePresets.find((preset) => preset.id === event.raceConfig.presetId) || racePresets[0]; const isEndurancePreset = event.mode === "race" && selectedPreset?.id === "endurance"; @@ -4326,26 +4368,63 @@ function renderEventManager(eventId) {
- - - - - - - - - - + + + + + + + + + +
+ +

${t("events.seed_best_laps_hint")}

${t("events.free_practice_note")}

@@ -5000,26 +5079,63 @@ function renderEventManager(eventId) {
- - - - - - - - +

${t("events.edit_session_help")}

+ + + + + + + + +
@@ -5215,6 +5331,7 @@ function renderEventManager(eventId) { ? String(form.get("seedMethod")).toLowerCase() : "best_sum"; editingSession.staggerGapSec = Math.max(0, Number(form.get("staggerGapSec") || 0) || 0); + editingSession.maxCars = Number(form.get("maxCars") || 0) || null; selectedSessionEditId = null; saveState(); renderEventManager(eventId); diff --git a/src/styles.css b/src/styles.css index 8bef530..3334231 100644 --- a/src/styles.css +++ b/src/styles.css @@ -379,6 +379,22 @@ body { gap: 10px; } +.form-grid > label { + display: grid; + gap: 6px; + align-content: start; +} + +.form-grid > label > small { + color: var(--muted); + font-size: 0.78rem; + line-height: 1.35; +} + +.span-5 { + grid-column: span 5; +} + .field-card { display: grid; gap: 8px;