docs(guide): add a Series / cup tab to the in-app guide

Explains creating a series, running each round from the series page,
points and standings, and a worked winter-series example.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
larssand
2026-10-11 19:31:19 +02:00
parent b5707f92d1
commit 42e53fd356
7 changed files with 92 additions and 5 deletions

View File

@@ -1484,6 +1484,34 @@ const TRANSLATIONS = {
"guide.tab_create": "Skapa ett race",
"guide.tab_run": "Köra ett race",
"guide.tab_training": "Träning & resultat",
"guide.tab_series": "Serie / cup",
"guide.series_title": "Serie / cup",
"guide.card_series_blurb": "Samla flera race i en serie med poäng per placering, strukna resultat och ställning per klass.",
"guide.series_create_title": "Skapa en serie",
"guide.series_create_1": "1. Lägg först in klasser och förare (med rätt klass). Ska bara klubbmedlemmar få poäng behöver förarens klubb vara ifylld under Förare.",
"guide.series_create_2": "2. Menyn Serier / cup -> Ny serie. Steg 1: namn och vilka klasser som ingår. Varje klass får en egen ställning, poängen blandas aldrig mellan klasser.",
"guide.series_create_3": "3. Steg 2: vem som får poäng (alla förare, eller endast klubbmedlemmar), poängtabell (t.ex. 100, 90, 82 ... eller egen lista) och hur många resultat som räknas (bästa N, eller alla utom X sämsta).",
"guide.series_create_4": "4. Steg 3: klistra in datumen (ett per rad), välj antal kvalomgångar, finaler och max bilar per heat, och tryck Skapa deltävlingar. Ett race skapas per datum och klass.",
"guide.series_create_5": "5. Allt sparas direkt när du ändrar något. En befintlig tävling kan också läggas till i serien från listan under tabellen.",
"guide.series_day_title": "Varje tävlingsdag",
"guide.series_day_1": "1. Allt görs i tabellen i steg 3, en rad per race (datum och klass).",
"guide.series_day_2": "2. Klicka på antalet förare och bocka ur dem som inte kör. Kopiera från förra tar samma startfält som förra deltävlingen i klassen; Ny förare lägger in en efteranmäld förare och bockar i hen.",
"guide.series_day_3": "3. Ändra vid behov antal kval, finaler och max bilar per heat för just den deltävlingen - det kan skilja mellan deltävlingar och klasser.",
"guide.series_day_4": "4. Skapa kval: antalet heat räknas ut efter hur många som är med och fördelas jämnt (9 förare, max 8 per heat -> 5 + 4). Formatet låses sedan.",
"guide.series_day_5": "5. Kör kvalen på Race Day. När kvalet är klart visas Skapa finaler. Status visar var deltävlingen är: ej startad, kval skapat, kval pågår, kval klart, finaler, klar.",
"guide.series_day_6": "6. Öppna tar dig till racet i Race Setup om du vill ändra något mer där. Ställningen i steg 4 uppdateras av sig själv.",
"guide.series_points_title": "Poäng och ställning",
"guide.series_points_1": "Dagens placering i en deltävling: slutresultatet (A-final före B-final), sedan förare utan final i kvalordning. Utan finaler används kvalordningen.",
"guide.series_points_2": "Endast klubbmedlemmar: förare från andra klubbar kör och syns i dagens resultat men får inga poäng, och medlemmarna rangordnas om utan dem.",
"guide.series_points_3": "Den som inte kört något registrerat varv får 0 poäng. Frånvaro räknas som 0 och kan strykas.",
"guide.series_points_4": "Bästa N räknas, eller alla körda utom X sämsta - då minskar antalet automatiskt om en deltävling ställs in. Strukna resultat visas inom parentes.",
"guide.series_points_5": "Lika poäng: flest segrar bland räknade resultat, sedan andraplatser osv., sedan senaste gemensamma deltävling. Annars delad placering.",
"guide.series_points_6": "Ställningen kan skrivas ut eller exporteras som PDF (breda tabeller blir liggande A4). Inga kontaktuppgifter visas.",
"guide.series_example_title": "Exempel: klubbens vinterserie",
"guide.series_example_1": "12 söndagar, klasserna 2WD, 4WD och Rookie, poäng 100, 90, 82, 75, 69, 64, 60, 56, 52, 48 och sedan -4 per plats ner till 10, bästa 9 av 12, endast klubbmedlemmar.",
"guide.series_example_2": "Steg 1: bocka i 2WD, 4WD och Rookie. Steg 2: Endast klubbmedlemmar + klubben, poängtabellen 100, 90, 82 ... (-4, lägst 10), Bästa N räknas = 9.",
"guide.series_example_3": "Steg 3: klistra in de 12 datumen, 3 kval, 3 finaler, 6 bilar per heat -> 36 race (12 datum × 3 klasser).",
"guide.series_example_4": "Varje söndag: välj förare per klass, Skapa kval, kör, Skapa finaler, kör. Ställningen per klass är klar direkt efter sista finalen.",
"guide.tab_videos": "Videoguider",
"warmup.title": "Transponderkontroll",
"warmup.hint": "Under nedräkningen är banan öppen. Grön bock = transpondern har passerat linjen sedan nedräkningen började. Saknas någon kan du byta transponder direkt här, eller koppla en okänd transponder som just passerat.",
@@ -3254,6 +3282,34 @@ const TRANSLATIONS = {
"guide.tab_create": "Create a race",
"guide.tab_run": "Run a race",
"guide.tab_training": "Training & results",
"guide.tab_series": "Series / cup",
"guide.series_title": "Series / cup",
"guide.card_series_blurb": "Group several races into a series with points per place, dropped results and standings per class.",
"guide.series_create_title": "Create a series",
"guide.series_create_1": "1. First add classes and drivers (in the right class). For a members-only series, each driver's club must be filled in under Drivers.",
"guide.series_create_2": "2. Menu Series / cup -> New series. Step 1: name and which classes are included. Each class gets its own standings; points never mix between classes.",
"guide.series_create_3": "3. Step 2: who scores (every driver, or club members only), the points table (e.g. 100, 90, 82 ... or your own list) and how many results count (best N, or all but the X worst).",
"guide.series_create_4": "4. Step 3: paste the dates (one per line), pick qualifying rounds, finals and max cars per heat, and press Create rounds. One race is created per date and class.",
"guide.series_create_5": "5. Every change is saved straight away. An existing race can also be added from the list below the table.",
"guide.series_day_title": "Each race day",
"guide.series_day_1": "1. Everything is done in the table in step 3, one row per race (date and class).",
"guide.series_day_2": "2. Click the number of drivers and untick those not racing. Copy from previous takes the field of the previous round in the class; New driver registers a late entry and ticks them.",
"guide.series_day_3": "3. Change qualifying rounds, finals and max cars per heat for that round if needed - it can differ between rounds and classes.",
"guide.series_day_4": "4. Create qualifying: the number of heats follows how many take part, split evenly (9 drivers, max 8 per heat -> 5 + 4). The format then locks.",
"guide.series_day_5": "5. Run qualifying on Race Day. When it's done, Create finals appears. Status shows where the round is: not started, qualifying created, running, done, finals, done.",
"guide.series_day_6": "6. Open goes to the race in Race Setup if you want to change more there. The standings in step 4 update by themselves.",
"guide.series_points_title": "Points and standings",
"guide.series_points_1": "A round's placing: the final standings (A final before B final), then drivers without a final in qualifying order. Without finals, the qualifying order is used.",
"guide.series_points_2": "Members only: drivers from other clubs race and appear in the day result but get no points, and members are re-ranked without them.",
"guide.series_points_3": "A driver with no registered lap gets 0 points. Absence counts as 0 and can be dropped.",
"guide.series_points_4": "Best N count, or all run rounds except the X worst - then a cancelled round lowers the count by itself. Dropped results are shown in brackets.",
"guide.series_points_5": "Ties: most wins among counted results, then 2nd places etc., then the latest common round. Otherwise a shared position.",
"guide.series_points_6": "The standings can be printed or exported as PDF (wide tables switch to landscape A4). No contact details are shown.",
"guide.series_example_title": "Example: the club's winter series",
"guide.series_example_1": "12 Sundays, classes 2WD, 4WD and Rookie, points 100, 90, 82, 75, 69, 64, 60, 56, 52, 48 then -4 per place down to 10, best 9 of 12, club members only.",
"guide.series_example_2": "Step 1: tick 2WD, 4WD and Rookie. Step 2: Club members only + the club, points table 100, 90, 82 ... (-4, min 10), Best N count = 9.",
"guide.series_example_3": "Step 3: paste the 12 dates, 3 qualifying rounds, 3 finals, 6 cars per heat -> 36 races (12 dates × 3 classes).",
"guide.series_example_4": "Each Sunday: pick drivers per class, Create qualifying, run, Create finals, run. Each class's standings are ready right after the last final.",
"guide.tab_videos": "Video guides",
"warmup.title": "Transponder check",
"warmup.hint": "The track is open during the count-down. Green tick = the transponder has crossed the line since the count-down began. If someone is missing, change their transponder right here, or link an unknown transponder that just crossed.",

View File

@@ -1,5 +1,5 @@
let activeGuideTab = "start";
const GUIDE_TAB_IDS = ["start", "create", "run", "training", "videos"];
const GUIDE_TAB_IDS = ["start", "create", "run", "series", "training", "videos"];
function renderGuidePanel(titleKey, itemKeys, extras = "", { t }) {
return `
@@ -35,6 +35,7 @@ export function renderGuideView({ dom, t }) {
${renderGuideOverviewCard("guide.race_title", "guide.card_race_blurb", { t })}
${renderGuideOverviewCard("guide.race_day_title", "guide.card_race_day_blurb", { t })}
${renderGuideOverviewCard("guide.team_title", "guide.card_team_blurb", { t })}
${renderGuideOverviewCard("guide.series_title", "guide.card_series_blurb", { t })}
${renderGuideOverviewCard("guide.training_title", "guide.card_training_blurb", { t })}
${renderGuideOverviewCard("guide.archive_title", "guide.card_archive_blurb", { t })}
${renderGuideOverviewCard("guide.windows_title", "guide.card_decoder_blurb", { t })}
@@ -48,6 +49,7 @@ export function renderGuideView({ dom, t }) {
<button type="button" class="guide-tab" data-guide-tab="start">${t("guide.tab_start")}</button>
<button type="button" class="guide-tab" data-guide-tab="create">${t("guide.tab_create")}</button>
<button type="button" class="guide-tab" data-guide-tab="run">${t("guide.tab_run")}</button>
<button type="button" class="guide-tab" data-guide-tab="series">${t("guide.tab_series")}</button>
<button type="button" class="guide-tab" data-guide-tab="training">${t("guide.tab_training")}</button>
<button type="button" class="guide-tab" data-guide-tab="videos">${t("guide.tab_videos")}</button>
</div>
@@ -121,6 +123,15 @@ export function renderGuideView({ dom, t }) {
</div>
</div>
<div data-guide-panel="series">
<div class="guide-section-grid mt-16">
${renderGuidePanel("guide.series_create_title", ["guide.series_create_1", "guide.series_create_2", "guide.series_create_3", "guide.series_create_4", "guide.series_create_5"], "", { t })}
${renderGuidePanel("guide.series_day_title", ["guide.series_day_1", "guide.series_day_2", "guide.series_day_3", "guide.series_day_4", "guide.series_day_5", "guide.series_day_6"], "", { t })}
${renderGuidePanel("guide.series_points_title", ["guide.series_points_1", "guide.series_points_2", "guide.series_points_3", "guide.series_points_4", "guide.series_points_5", "guide.series_points_6"], "", { t })}
${renderGuidePanel("guide.series_example_title", ["guide.series_example_1", "guide.series_example_2", "guide.series_example_3", "guide.series_example_4"], "", { t })}
</div>
</div>
<div data-guide-panel="training">
<div class="guide-section-grid mt-16">
${renderGuidePanel("guide.training_title", ["guide.training_1", "guide.training_2", "guide.training_3", "guide.training_4", "guide.training_5", "guide.training_6", "guide.training_7", "guide.training_8", "guide.training_9", "guide.training_10", "guide.training_11", "guide.training_12", "guide.training_13", "guide.training_14", "guide.training_15", "guide.training_16", "guide.training_17", "guide.training_18", "guide.training_19", "guide.training_20", "guide.training_21", "guide.training_22", "guide.training_23", "guide.training_24", "guide.training_25", "guide.training_26", "guide.training_27", "guide.training_28", "guide.training_29", "guide.training_30", "guide.training_31"], "", { t })}