From 63c1d0496b6018bcdda53d4df4b145894871ad0c Mon Sep 17 00:00:00 2001 From: larssand Date: Thu, 26 Mar 2026 19:55:15 +0100 Subject: [PATCH] Extract event manager markup into module --- src/app.js | 832 ++----------------------------------- src/event_manager_view.js | 833 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 878 insertions(+), 787 deletions(-) create mode 100644 src/event_manager_view.js diff --git a/src/app.js b/src/app.js index ea58f27..2cb0b44 100644 --- a/src/app.js +++ b/src/app.js @@ -13,6 +13,7 @@ import { renderDashboardView, renderClassesView, renderDriversView, renderCarsVi import { renderGuideView, renderOverlayPageView } from "./misc_views.js"; import { getSessionsForEventHelper, getModeLabelHelper, normalizeStartModeHelper, getStartModeLabelHelper, getClassNameHelper, getEventNameHelper, renderAssignmentListView, renderSessionsTableView } from "./event_common.js"; import { renderEventWorkspaceMarkup } from "./event_views.js"; +import { renderEventManagerMarkup } from "./event_manager_view.js"; import { createDefaultAmmcConfigHelper, getManagedWsUrlHelper, loadAmmcConfigFromBackendHelper, saveAmmcConfigToBackendHelper, refreshAmmcStatusHelper, startManagedAmmcHelper, stopManagedAmmcHelper, applyPersistedStateHelper, hydrateFromBackendHelper, scheduleBackendSyncHelper, syncStateToBackendHelper, pingBackendHelper, checkAppVersionHelper, startAppVersionPollingHelper, startOverlaySyncHelper, startOverlayRotationHelper, startOverlayLiveRefreshHelper, ensureAudioContextHelper, playPassingBeepHelper, playFinishSirenHelper, playLeaderCueHelper, playStartCueHelper, playBestLapCueHelper, pushOverlayEventHelper, speakTextHelper, announcePassingHelper, announceRaceFinishedHelper, handleSessionTimerTickHelper, tickClockHelper } from "./runtime_services.js"; import { connectDecoderHelper, disconnectDecoderHelper, processDecoderMessageHelper } from "./decoder_runtime.js"; @@ -3145,793 +3146,50 @@ function renderEventManager(eventId) { selectedGridSessionId = selectedGridSession.id; } - eventManageArea.innerHTML = ` -
-
-

${t("events.manage_title")}: ${escapeHtml(event.name)}

-
-
-
- - - - - - - - - -
- -
-
-

${t("events.seed_best_laps_hint")}

-

${t("events.free_practice_note")}

-

${t("events.open_practice_note")}

- -
- ${renderTable( - [t("table.session"), t("table.type"), t("table.duration"), t("table.start_mode"), t("table.seeding"), t("table.status"), t(event.mode === "track" ? "events.assignments" : "events.participants"), t("events.actions")], - sessions.map((s) => { - const assignCount = - event.mode === "track" - ? (s.assignments || []).length - : s.type === "team_race" - ? raceTeams.length - : getSessionEntrants(s).length; - return ` - - ${escapeHtml(s.name)} - ${escapeHtml(getSessionTypeLabel(s.type))} - ${s.durationMin} min - ${escapeHtml(getStartModeLabel(s.startMode))} - ${s.seedBestLapCount > 0 ? `${s.seedBestLapCount}` : "-"} - ${escapeHtml(getStatusLabel(s.status))} - ${assignCount || (event.mode === "track" ? t("events.na") : "-")} - - - - ${ - event.mode === "race" && normalizeStartMode(s.startMode) === "position" - ? `` - : "" - } - ${ - event.mode === "race" && ["qualification", "final"].includes(s.type) - ? ` - - - - ` - : "" - } - - - - `; - }) - )} -
-
-
- -
-

${t("events.branding")}

-
- - - - - -
-
-

${t("events.branding_note")}

-
- - -
- ${branding.logoDataUrl ? `
event-logo
` : ""} -
-
- - ${ - event.mode === "track" - ? ` -
-

${t("events.sponsor_tools")}

-
-
- - - - - -
-

- ${t("events.tp_rule")} -

-
-
- -
-

${t("events.assign_title")}

-
-
- - - - -
-
- - -
-
-
-
- ` - : "" - } - - ${ - event.mode === "race" - ? ` -
-
-
-
${t("events.manage_step_setup")}${renderManageStatusBadgeView(manageStatuses?.setup?.status || "pending")}
-
${escapeHtml(manageStatuses?.setup?.detail || "")}
-

${t("events.manage_step_setup_hint")}

-
-
-
${t("events.manage_step_format")}${renderManageStatusBadgeView(manageStatuses?.format?.status || "pending")}
-
${escapeHtml(manageStatuses?.format?.detail || "")}
-

${t("events.manage_step_format_hint")}

-
-
-
${t("events.manage_step_generate")}${renderManageStatusBadgeView(manageStatuses?.generation?.status || "pending")}
-
${escapeHtml(manageStatuses?.generation?.detail || "")}
-

${t("events.manage_step_generate_hint")}

-
-
-
${t("events.manage_step_live")}${renderManageStatusBadgeView(manageStatuses?.live?.status || "pending")}
-
${escapeHtml(manageStatuses?.live?.detail || "")}
-

${t("events.manage_step_live_hint")}

-
-
-
- -
-
-
-

${t("events.select_participants")}

- ${selectedParticipantCount} -
-
-
- - -
-
- ${raceDrivers - .map((driver) => { - const checked = event.raceConfig.participantsConfigured - ? (event.raceConfig.driverIds || []).includes(driver.id) - : true; - return ` - - `; - }) - .join("")} -
-
-
- -
-
-

${t("events.teams")}

- ${raceTeams.length} -
-
-

${t("events.team_race_intro")}

-

${t("events.team_steps")}

-
- - -
-

${t("events.team_hint")}

-
-
-

${t("events.team_drivers")}

-

${t("events.team_form_drivers")}

- ${teamDriverPool.fallback ? `

${t("events.team_driver_fallback")}

` : ""} -
- ${raceDrivers - .map( - (driver) => ` - - ` - ) - .join("")} -
-
-
-

${t("events.team_cars")}

-

${t("events.team_form_cars")}

-
- ${state.cars - .map( - (car) => ` - - ` - ) - .join("")} -
-
-
-
- ${ - raceTeams.length - ? raceTeams - .map( - (team) => ` -
-
- ${escapeHtml(team.name)} -
${t("events.team_drivers")}: ${escapeHtml( - team.driverIds.map((driverId) => getDriverDisplayById(driverId)).join(", ") || "-" - )}
-
${t("events.team_cars")}: ${escapeHtml( - team.carIds - .map((carId) => { - const car = state.cars.find((item) => item.id === carId); - return car ? `${car.name} (${car.transponder || "-"})` : ""; - }) - .filter(Boolean) - .join(", ") || "-" - )}
-
-
- - -
-
- ` - ) - .join("") - : `

${t("events.no_teams")}

` - } -
-
-
-
- -
-

${t("events.race_format")}

-
-

${t("events.race_format_intro")}

-
-
-
-
-
- ${t("events.race_format")} -
${t("events.race_actions_hint")}
-
-
- - -
-
-
-
-

${t("events.practice_block")}

-

${t("events.practice_block_hint")}

-
- ${renderRaceFormatContextCardView(isEndurancePreset ? "events.context_endurance_title" : "events.context_standard_title", isEndurancePreset ? "events.context_endurance_hint" : "events.context_standard_hint")} - ${renderRaceFormatFieldView( - "events.race_preset", - "events.race_preset_hint", - `` - )} - ${raceFormatAdvanced - ? ` -
- ${t("events.preset_name")} - ${t("events.race_preset_hint")} - -
- - - -
-
- ` - : ` -
- ${t("events.race_preset")} - ${t("events.race_preset_hint")} -
- -
-
- `} - ${showBasicQualifyingFields ? renderRaceFormatFieldView( - "events.qualifying_scoring", - "events.qualifying_scoring_hint", - `` - ) : ""} - ${showBasicQualifyingFields ? renderRaceFormatFieldView( - "events.qualifying_rounds", - "events.qualifying_rounds_hint", - `` - ) : ""} - ${showBasicQualifyingFields ? renderRaceFormatFieldView( - "events.cars_per_heat", - "events.cars_per_heat_hint", - `` - ) : ""} - ${showBasicQualifyingFields ? renderRaceFormatFieldView( - "events.qual_duration", - "events.qual_duration_hint", - `` - ) : ""} - ${showBasicQualifyingFields ? renderRaceFormatFieldView( - "events.qual_start_mode", - "events.qual_start_mode_hint", - `` - ) : ""} - ${raceFormatAdvanced - ? renderRaceFormatFieldView( - "events.qual_seed_laps", - "events.qual_seed_laps_hint", - `` - ) - : ""} - ${raceFormatAdvanced - ? renderRaceFormatFieldView( - "events.qual_seed_method", - "events.qual_seed_method_hint", - `` - ) - : ""} - ${raceFormatAdvanced - ? renderRaceFormatFieldView( - "events.counted_qual_rounds", - "events.counted_qual_rounds_hint", - `` - ) - : ""} - ${raceFormatAdvanced - ? renderRaceFormatFieldView( - "events.qual_points_table", - "events.qual_points_table_hint", - `` - ) - : ""} - ${raceFormatAdvanced - ? renderRaceFormatFieldView( - "events.qual_tie_break", - "events.qual_tie_break_hint", - `` - ) - : ""} -
-
-
-

${t("events.finals_block")}

-

${t("events.finals_block_hint")}

-
- ${renderRaceFormatContextCardView(isEndurancePreset ? "events.context_endurance_title" : "events.context_standard_title", isEndurancePreset ? "events.context_endurance_hint" : "events.context_standard_hint")} - ${showBasicFinalFields ? renderRaceFormatFieldView( - "events.cars_per_final", - "events.cars_per_final_hint", - `` - ) : ""} - ${showBasicFinalFields ? renderRaceFormatFieldView( - "events.final_legs", - "events.final_legs_hint", - `` - ) : ""} - ${raceFormatAdvanced - ? renderRaceFormatFieldView( - "events.counted_final_legs", - "events.counted_final_legs_hint", - `` - ) - : ""} - ${showBasicFinalFields ? renderRaceFormatFieldView( - "events.final_duration", - "events.final_duration_hint", - `` - ) : ""} - ${showBasicFinalFields ? renderRaceFormatFieldView( - "events.final_start_mode", - "events.final_start_mode_hint", - `` - ) : ""} - ${showBasicFinalFields ? renderRaceFormatFieldView( - "events.bump_count", - "events.bump_count_hint", - `` - ) : ""} - ${showBasicFinalFields ? renderRaceFormatFieldView( - "events.source_for_finals", - "events.finals_source_hint", - `` - ) : ""} - ${raceFormatAdvanced - ? renderRaceFormatFieldView( - "events.reserve_bump_slots", - "events.reserve_bump_slots_hint", - ``, - { checkbox: true } - ) - : ""} -
-
-
-

${t("events.rules_block")}

-

${t("events.rules_block_hint")}

-
- ${renderRaceFormatContextCardView("events.context_rules_title", "events.context_rules_hint")} - ${renderRaceFormatFieldView( - "events.follow_up_sec", - "events.follow_up_sec_hint", - `` - )} - ${renderRaceFormatFieldView( - "events.min_lap_time", - "events.min_lap_time_hint", - `` - )} - ${renderRaceFormatFieldView( - "events.max_lap_time", - "events.max_lap_time_hint", - `` - )} -
- ${t("events.actions")} - ${t("events.race_driver_scope")} - ${t("events.bump_reserved_note")} -
-
-
-
- -
-
-
- -
-
-

${t("events.race_actions_title")}

-

${t("events.race_actions_hint")}

-
- - - - - - -
-
- - -
-

${t("events.race_package_hint")}

-
-
- -
-

${t("events.grid_editor")}

-
- ${renderGridEditor(selectedGridSession)} -
-
- -
-

${t("events.practice_standings")}

-
- ${renderRaceStandingsTableView(buildPracticeStandings(event), t("events.no_practice_results"))} -
-
- -
-

${t("events.qualifying_standings")}

-
- ${renderRaceStandingsTableView(buildQualifyingStandings(event), t("events.no_qualifying_results"))} -
-
- -
-

${t("events.final_standings")}

-
- ${renderRaceStandingsTableView(buildFinalStandings(event), t("events.no_final_results"))} -
-
- -
-

${t("events.team_standings")}

-
-
- - -
-
- ${renderTeamRaceStandings(event)} -
-
-
- -
-

${t("events.final_matrix")}

-
-
- - - - -
-
- ${renderFinalMatrix(event)} -
-
-
- ` - : "" - } - - ${ - editingTeam - ? ` - - ` - : "" - } - - ${ - editingSession - ? ` - - ` - : "" - } - `; + eventManageArea.innerHTML = renderEventManagerMarkup({ + event, + t, + escapeHtml, + sessions, + sessionTypeChoices, + sessionTypeHintKey, + raceTeams, + getSessionEntrants, + getSessionTypeLabel, + getStartModeLabel, + getStatusLabel, + normalizeStartMode, + branding, + driverOptions, + carOptions, + manageStatuses, + renderManageStatusBadgeView, + selectedParticipantCount, + raceDrivers, + teamDriverPool, + state, + getDriverDisplayById, + raceFormatAdvanced, + racePresets, + selectedPreset, + isEndurancePreset, + renderRaceFormatContextCardView, + renderRaceFormatFieldView, + raceSummaryWarnings, + raceSummaryItems, + selectedGridSession, + renderGridEditor, + renderRaceStandingsTableView, + buildPracticeStandings, + buildQualifyingStandings, + buildFinalStandings, + renderTeamRaceStandings, + renderFinalMatrix, + editingTeam, + editingSession, + getModeLabel, + renderTable, + }); const bindManageJump = (node) => { const triggerJump = () => { diff --git a/src/event_manager_view.js b/src/event_manager_view.js new file mode 100644 index 0000000..557a17d --- /dev/null +++ b/src/event_manager_view.js @@ -0,0 +1,833 @@ +export function renderEventManagerMarkup(context) { + const { + event, + t, + escapeHtml, + sessions, + sessionTypeChoices, + sessionTypeHintKey, + raceTeams, + getSessionEntrants, + getSessionTypeLabel, + getStartModeLabel, + getStatusLabel, + normalizeStartMode, + branding, + driverOptions, + carOptions, + manageStatuses, + renderManageStatusBadgeView, + selectedParticipantCount, + raceDrivers, + teamDriverPool, + state, + getDriverDisplayById, + raceFormatAdvanced, + racePresets, + selectedPreset, + isEndurancePreset, + renderRaceFormatContextCardView, + renderRaceFormatFieldView, + raceSummaryWarnings, + raceSummaryItems, + selectedGridSession, + renderGridEditor, + renderRaceStandingsTableView, + buildPracticeStandings, + buildQualifyingStandings, + buildFinalStandings, + renderTeamRaceStandings, + renderFinalMatrix, + editingTeam, + editingSession, + getModeLabel, + renderTable, + } = context; + return ` +
+
+

${t("events.manage_title")}: ${escapeHtml(event.name)}

+
+
+
+ + + + + + + + + +
+ +
+
+

${t("events.seed_best_laps_hint")}

+

${t("events.free_practice_note")}

+

${t("events.open_practice_note")}

+ +
+ ${renderTable( + [t("table.session"), t("table.type"), t("table.duration"), t("table.start_mode"), t("table.seeding"), t("table.status"), t(event.mode === "track" ? "events.assignments" : "events.participants"), t("events.actions")], + sessions.map((s) => { + const assignCount = + event.mode === "track" + ? (s.assignments || []).length + : s.type === "team_race" + ? raceTeams.length + : getSessionEntrants(s).length; + return ` + + ${escapeHtml(s.name)} + ${escapeHtml(getSessionTypeLabel(s.type))} + ${s.durationMin} min + ${escapeHtml(getStartModeLabel(s.startMode))} + ${s.seedBestLapCount > 0 ? `${s.seedBestLapCount}` : "-"} + ${escapeHtml(getStatusLabel(s.status))} + ${assignCount || (event.mode === "track" ? t("events.na") : "-")} + + + + ${ + event.mode === "race" && normalizeStartMode(s.startMode) === "position" + ? `` + : "" + } + ${ + event.mode === "race" && ["qualification", "final"].includes(s.type) + ? ` + + + + ` + : "" + } + + + + `; + }) + )} +
+
+
+ +
+

${t("events.branding")}

+
+ + + + + +
+
+

${t("events.branding_note")}

+
+ + +
+ ${branding.logoDataUrl ? `
event-logo
` : ""} +
+
+ + ${ + event.mode === "track" + ? ` +
+

${t("events.sponsor_tools")}

+
+
+ + + + + +
+

+ ${t("events.tp_rule")} +

+
+
+ +
+

${t("events.assign_title")}

+
+
+ + + + +
+
+ + +
+
+
+
+ ` + : "" + } + + ${ + event.mode === "race" + ? ` +
+
+
+
${t("events.manage_step_setup")}${renderManageStatusBadgeView(manageStatuses?.setup?.status || "pending")}
+
${escapeHtml(manageStatuses?.setup?.detail || "")}
+

${t("events.manage_step_setup_hint")}

+
+
+
${t("events.manage_step_format")}${renderManageStatusBadgeView(manageStatuses?.format?.status || "pending")}
+
${escapeHtml(manageStatuses?.format?.detail || "")}
+

${t("events.manage_step_format_hint")}

+
+
+
${t("events.manage_step_generate")}${renderManageStatusBadgeView(manageStatuses?.generation?.status || "pending")}
+
${escapeHtml(manageStatuses?.generation?.detail || "")}
+

${t("events.manage_step_generate_hint")}

+
+
+
${t("events.manage_step_live")}${renderManageStatusBadgeView(manageStatuses?.live?.status || "pending")}
+
${escapeHtml(manageStatuses?.live?.detail || "")}
+

${t("events.manage_step_live_hint")}

+
+
+
+ +
+
+
+

${t("events.select_participants")}

+ ${selectedParticipantCount} +
+
+
+ + +
+
+ ${raceDrivers + .map((driver) => { + const checked = event.raceConfig.participantsConfigured + ? (event.raceConfig.driverIds || []).includes(driver.id) + : true; + return ` + + `; + }) + .join("")} +
+
+
+ +
+
+

${t("events.teams")}

+ ${raceTeams.length} +
+
+

${t("events.team_race_intro")}

+

${t("events.team_steps")}

+
+ + +
+

${t("events.team_hint")}

+
+
+

${t("events.team_drivers")}

+

${t("events.team_form_drivers")}

+ ${teamDriverPool.fallback ? `

${t("events.team_driver_fallback")}

` : ""} +
+ ${raceDrivers + .map( + (driver) => ` + + ` + ) + .join("")} +
+
+
+

${t("events.team_cars")}

+

${t("events.team_form_cars")}

+
+ ${state.cars + .map( + (car) => ` + + ` + ) + .join("")} +
+
+
+
+ ${ + raceTeams.length + ? raceTeams + .map( + (team) => ` +
+
+ ${escapeHtml(team.name)} +
${t("events.team_drivers")}: ${escapeHtml( + team.driverIds.map((driverId) => getDriverDisplayById(driverId)).join(", ") || "-" + )}
+
${t("events.team_cars")}: ${escapeHtml( + team.carIds + .map((carId) => { + const car = state.cars.find((item) => item.id === carId); + return car ? `${car.name} (${car.transponder || "-"})` : ""; + }) + .filter(Boolean) + .join(", ") || "-" + )}
+
+
+ + +
+
+ ` + ) + .join("") + : `

${t("events.no_teams")}

` + } +
+
+
+
+ +
+

${t("events.race_format")}

+
+

${t("events.race_format_intro")}

+
+
+
+
+
+ ${t("events.race_format")} +
${t("events.race_actions_hint")}
+
+
+ + +
+
+
+
+

${t("events.practice_block")}

+

${t("events.practice_block_hint")}

+
+ ${renderRaceFormatContextCardView(isEndurancePreset ? "events.context_endurance_title" : "events.context_standard_title", isEndurancePreset ? "events.context_endurance_hint" : "events.context_standard_hint")} + ${renderRaceFormatFieldView( + "events.race_preset", + "events.race_preset_hint", + `` + )} + ${raceFormatAdvanced + ? ` +
+ ${t("events.preset_name")} + ${t("events.race_preset_hint")} + +
+ + + +
+
+ ` + : ` +
+ ${t("events.race_preset")} + ${t("events.race_preset_hint")} +
+ +
+
+ `} + ${showBasicQualifyingFields ? renderRaceFormatFieldView( + "events.qualifying_scoring", + "events.qualifying_scoring_hint", + `` + ) : ""} + ${showBasicQualifyingFields ? renderRaceFormatFieldView( + "events.qualifying_rounds", + "events.qualifying_rounds_hint", + `` + ) : ""} + ${showBasicQualifyingFields ? renderRaceFormatFieldView( + "events.cars_per_heat", + "events.cars_per_heat_hint", + `` + ) : ""} + ${showBasicQualifyingFields ? renderRaceFormatFieldView( + "events.qual_duration", + "events.qual_duration_hint", + `` + ) : ""} + ${showBasicQualifyingFields ? renderRaceFormatFieldView( + "events.qual_start_mode", + "events.qual_start_mode_hint", + `` + ) : ""} + ${raceFormatAdvanced + ? renderRaceFormatFieldView( + "events.qual_seed_laps", + "events.qual_seed_laps_hint", + `` + ) + : ""} + ${raceFormatAdvanced + ? renderRaceFormatFieldView( + "events.qual_seed_method", + "events.qual_seed_method_hint", + `` + ) + : ""} + ${raceFormatAdvanced + ? renderRaceFormatFieldView( + "events.counted_qual_rounds", + "events.counted_qual_rounds_hint", + `` + ) + : ""} + ${raceFormatAdvanced + ? renderRaceFormatFieldView( + "events.qual_points_table", + "events.qual_points_table_hint", + `` + ) + : ""} + ${raceFormatAdvanced + ? renderRaceFormatFieldView( + "events.qual_tie_break", + "events.qual_tie_break_hint", + `` + ) + : ""} +
+
+
+

${t("events.finals_block")}

+

${t("events.finals_block_hint")}

+
+ ${renderRaceFormatContextCardView(isEndurancePreset ? "events.context_endurance_title" : "events.context_standard_title", isEndurancePreset ? "events.context_endurance_hint" : "events.context_standard_hint")} + ${showBasicFinalFields ? renderRaceFormatFieldView( + "events.cars_per_final", + "events.cars_per_final_hint", + `` + ) : ""} + ${showBasicFinalFields ? renderRaceFormatFieldView( + "events.final_legs", + "events.final_legs_hint", + `` + ) : ""} + ${raceFormatAdvanced + ? renderRaceFormatFieldView( + "events.counted_final_legs", + "events.counted_final_legs_hint", + `` + ) + : ""} + ${showBasicFinalFields ? renderRaceFormatFieldView( + "events.final_duration", + "events.final_duration_hint", + `` + ) : ""} + ${showBasicFinalFields ? renderRaceFormatFieldView( + "events.final_start_mode", + "events.final_start_mode_hint", + `` + ) : ""} + ${showBasicFinalFields ? renderRaceFormatFieldView( + "events.bump_count", + "events.bump_count_hint", + `` + ) : ""} + ${showBasicFinalFields ? renderRaceFormatFieldView( + "events.source_for_finals", + "events.finals_source_hint", + `` + ) : ""} + ${raceFormatAdvanced + ? renderRaceFormatFieldView( + "events.reserve_bump_slots", + "events.reserve_bump_slots_hint", + ``, + { checkbox: true } + ) + : ""} +
+
+
+

${t("events.rules_block")}

+

${t("events.rules_block_hint")}

+
+ ${renderRaceFormatContextCardView("events.context_rules_title", "events.context_rules_hint")} + ${renderRaceFormatFieldView( + "events.follow_up_sec", + "events.follow_up_sec_hint", + `` + )} + ${renderRaceFormatFieldView( + "events.min_lap_time", + "events.min_lap_time_hint", + `` + )} + ${renderRaceFormatFieldView( + "events.max_lap_time", + "events.max_lap_time_hint", + `` + )} +
+ ${t("events.actions")} + ${t("events.race_driver_scope")} + ${t("events.bump_reserved_note")} +
+
+
+
+ +
+
+
+ +
+
+

${t("events.race_actions_title")}

+

${t("events.race_actions_hint")}

+
+ + + + + + +
+
+ + +
+

${t("events.race_package_hint")}

+
+
+ +
+

${t("events.grid_editor")}

+
+ ${renderGridEditor(selectedGridSession)} +
+
+ +
+

${t("events.practice_standings")}

+
+ ${renderRaceStandingsTableView(buildPracticeStandings(event), t("events.no_practice_results"))} +
+
+ +
+

${t("events.qualifying_standings")}

+
+ ${renderRaceStandingsTableView(buildQualifyingStandings(event), t("events.no_qualifying_results"))} +
+
+ +
+

${t("events.final_standings")}

+
+ ${renderRaceStandingsTableView(buildFinalStandings(event), t("events.no_final_results"))} +
+
+ +
+

${t("events.team_standings")}

+
+
+ + +
+
+ ${renderTeamRaceStandings(event)} +
+
+
+ +
+

${t("events.final_matrix")}

+
+
+ + + + +
+
+ ${renderFinalMatrix(event)} +
+
+
+ ` + : "" + } + + ${ + editingTeam + ? ` + + ` + : "" + } + + ${ + editingSession + ? ` + + ` + : "" + } + `;; +}