Extract shared event and session helpers into module
This commit is contained in:
87
src/event_common.js
Normal file
87
src/event_common.js
Normal file
@@ -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 `
|
||||
<li>
|
||||
${escapeHtml(driver?.name || t("common.unknown_driver"))} -> ${escapeHtml(car?.name || t("common.unknown_car"))} (${escapeHtml(car?.transponder || "-")})
|
||||
<button id="as-delete-${a.id}" class="btn btn-danger btn-mini">x</button>
|
||||
</li>
|
||||
`;
|
||||
})
|
||||
.join("");
|
||||
|
||||
return `
|
||||
<div class="assignment-group">
|
||||
<h4>${escapeHtml(s.name)} (${escapeHtml(getSessionTypeLabel(s.type))})</h4>
|
||||
<ul>${items || `<li>${t("events.no_assignments")}</li>`}</ul>
|
||||
</div>
|
||||
`;
|
||||
})
|
||||
.join("");
|
||||
|
||||
sessions.forEach((s) => {
|
||||
(s.assignments || []).forEach((a) => {
|
||||
document.getElementById(`as-delete-${a.id}`)?.addEventListener("click", () => {
|
||||
s.assignments = s.assignments.filter((x) => x.id !== a.id);
|
||||
saveState();
|
||||
renderAssignmentList(eventId);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export function renderSessionsTableView(sessions, deps) {
|
||||
const { t, renderTable, escapeHtml, getEventName, getSessionTypeLabel, getStatusLabel, getModeLabel } = deps;
|
||||
if (!sessions.length) {
|
||||
return `<p>${t("session.none_yet")}</p>`;
|
||||
}
|
||||
return renderTable(
|
||||
[t("table.event"), t("table.session"), t("table.type"), t("table.status"), t("table.mode")],
|
||||
sessions.map(
|
||||
(s) => `
|
||||
<tr>
|
||||
<td>${escapeHtml(getEventName(s.eventId))}</td>
|
||||
<td>${escapeHtml(s.name)}</td>
|
||||
<td>${escapeHtml(getSessionTypeLabel(s.type))}</td>
|
||||
<td>${escapeHtml(getStatusLabel(s.status))}</td>
|
||||
<td>${getModeLabel(s.mode)}</td>
|
||||
</tr>
|
||||
`
|
||||
)
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user