diff --git a/src/app.js b/src/app.js index 5be9189..a6d1d65 100644 --- a/src/app.js +++ b/src/app.js @@ -11,6 +11,7 @@ import { getSessionTypeLabel as getSessionTypeLabelLogic, getStatusLabel as getS import { renderDashboardView, renderClassesView, renderDriversView, renderCarsView } from "./core_views.js"; import { renderGuideView, renderOverlayPageView } from "./misc_views.js"; +import { getSessionsForEventHelper, getModeLabelHelper, normalizeStartModeHelper, getStartModeLabelHelper, getClassNameHelper, getEventNameHelper, renderAssignmentListView, renderSessionsTableView } from "./event_common.js"; import { renderTimingView, renderJudgingView } from "./timing_views.js"; @@ -101,6 +102,14 @@ const renderFinalMatrix = (event) => renderFinalMatrixHelper(event, { t, escapeH const buildPrintBrandBlock = (branding) => buildPrintBrandBlockHelper(branding, { escapeHtml }); const buildRaceStartListsHtml = (event) => buildRaceStartListsHtmlHelper(event, { t, state, escapeHtml, resolveEventBranding, getSessionsForEvent, getSessionSortWeight, getClassName, buildPrintBrandBlock, getSessionGridEntries, getSessionTypeLabel, getStartModeLabel, renderTable }); const buildRaceResultsHtml = (event) => buildRaceResultsHtmlHelper(event, { t, escapeHtml, resolveEventBranding, getClassName, buildPrintBrandBlock, renderRaceStandingsTableView, buildPracticeStandings, buildQualifyingStandings, buildFinalStandings, renderTeamRaceStandings }); +const getSessionsForEvent = (eventId) => getSessionsForEventHelper(state, eventId); +const getModeLabel = (mode) => getModeLabelHelper(mode, { t }); +const normalizeStartMode = (mode) => normalizeStartModeHelper(mode); +const getStartModeLabel = (mode) => getStartModeLabelHelper(mode, { t, normalizeStartMode }); +const getClassName = (classId) => getClassNameHelper(state, classId, { t }); +const getEventName = (eventId) => getEventNameHelper(state, eventId, { t }); +const renderAssignmentList = (eventId) => renderAssignmentListView(eventId, { state, t, escapeHtml, getSessionsForEvent, getSessionTypeLabel, saveState, renderAssignmentList }); +const renderSessionsTable = (sessions) => renderSessionsTableView(sessions, { t, renderTable, escapeHtml, getEventName, getSessionTypeLabel, getStatusLabel, getModeLabel }); const buildTeamRaceResultsHtml = (event) => buildTeamRaceResultsHtmlHelper(event, { t, escapeHtml, resolveEventBranding, getClassName, buildPrintBrandBlock, buildTeamRaceStandings, renderTable, formatLap, renderTeamStintLog }); const renderDashboard = () => renderDashboardView({ state, dom, t, backend, getActiveSession, getStatusLabel, getSessionTypeLabel, getEventName, getModeLabel, getBackendUrl, formatLap, renderSessionsTable, setCurrentView: (view) => { currentView = view; }, renderNav, renderView, connectDecoder, disconnectDecoder, openOverlayWindow, ensureAudioContext, playPassingBeep, playFinishSiren, escapeHtml }); const renderClasses = () => renderClassesView({ state, dom, t, selectedClassEditId: () => selectedClassEditId, setSelectedClassEditId: (value) => { selectedClassEditId = value; }, uid, saveState, renderView, renderTable, escapeHtml, setFormError, bindModalShell }); @@ -5091,50 +5100,6 @@ function renderEventManager(eventId) { } } -function renderAssignmentList(eventId) { - const block = document.getElementById("assignmentList"); - if (!block) { - return; - } - - const sessions = getSessionsForEvent(eventId); - block.innerHTML = sessions - .map((s) => { - const items = (s.assignments || []) - .map((a) => { - const driver = state.drivers.find((d) => d.id === a.driverId); - const car = state.cars.find((c) => c.id === a.carId); - return ` -
${t("session.none_yet")}
`; - } - return renderTable( - [t("table.event"), t("table.session"), t("table.type"), t("table.status"), t("table.mode")], - sessions.map( - (s) => ` -${t("common.no_entries")}
`; diff --git a/src/event_common.js b/src/event_common.js new file mode 100644 index 0000000..ae4dd80 --- /dev/null +++ b/src/event_common.js @@ -0,0 +1,87 @@ +export function getSessionsForEventHelper(state, eventId) { + return state.sessions.filter((s) => s.eventId === eventId); +} + +export function getModeLabelHelper(mode, { t }) { + return mode === "track" ? t("mode.track") : t("mode.race"); +} + +export function normalizeStartModeHelper(mode) { + return ["mass", "position", "staggered"].includes(String(mode || "").toLowerCase()) ? String(mode).toLowerCase() : "mass"; +} + +export function getStartModeLabelHelper(mode, { t, normalizeStartMode }) { + return t(`events.start_mode_${normalizeStartMode(mode)}`); +} + +export function getClassNameHelper(state, classId, { t }) { + return state.classes.find((x) => x.id === classId)?.name || t("common.unknown"); +} + +export function getEventNameHelper(state, eventId, { t }) { + return state.events.find((x) => x.id === eventId)?.name || t("common.unknown_event"); +} + +export function renderAssignmentListView(eventId, deps) { + const { state, t, escapeHtml, getSessionsForEvent, getSessionTypeLabel, saveState, renderAssignmentList } = deps; + const block = document.getElementById("assignmentList"); + if (!block) { + return; + } + + const sessions = getSessionsForEvent(eventId); + block.innerHTML = sessions + .map((s) => { + const items = (s.assignments || []) + .map((a) => { + const driver = state.drivers.find((d) => d.id === a.driverId); + const car = state.cars.find((c) => c.id === a.carId); + return ` +${t("session.none_yet")}
`; + } + return renderTable( + [t("table.event"), t("table.session"), t("table.type"), t("table.status"), t("table.mode")], + sessions.map( + (s) => ` +