This commit is contained in:
larssand
2026-03-27 19:07:19 +01:00
parent 05e0bf0c1f
commit f5be5b57ad
2 changed files with 56 additions and 28 deletions

View File

@@ -254,12 +254,18 @@ export function renderEventManagerView(context) {
document.getElementById("sessionForm")?.addEventListener("submit", (e) => {
e.preventDefault();
const form = new FormData(e.currentTarget);
const formNode = e.currentTarget;
if (!(formNode instanceof HTMLFormElement)) {
return;
}
const form = new FormData(formNode);
const typeField = formNode.querySelector('[name="type"]');
const selectedType = typeField instanceof HTMLSelectElement ? typeField.value : String(form.get("type") || "");
state.sessions.push(normalizeSession({
id: uid("session"),
eventId,
name: String(form.get("name")).trim(),
type: String(form.get("type")),
type: selectedType,
durationMin: Number(form.get("durationMin")),
followUpSec: Math.max(0, Number(form.get("followUpSec") || 0) || 0),
startMode: String(form.get("startMode") || "mass"),
@@ -350,7 +356,13 @@ export function renderEventManagerView(context) {
if (!editingSession) {
return;
}
const form = new FormData(event.currentTarget);
const formNode = event.currentTarget;
if (!(formNode instanceof HTMLFormElement)) {
return;
}
const form = new FormData(formNode);
const typeField = formNode.querySelector('[name="type"]');
const selectedType = typeField instanceof HTMLSelectElement ? typeField.value : String(form.get("type") || editingSession.type);
const cleanedName = String(form.get("name") || "").trim();
const cleanedDuration = Number(form.get("durationMin") || editingSession.durationMin || 5) || 0;
if (!cleanedName) {
@@ -363,7 +375,7 @@ export function renderEventManagerView(context) {
}
setFormError("sessionEditError", "");
editingSession.name = cleanedName;
editingSession.type = String(form.get("type") || editingSession.type);
editingSession.type = selectedType;
editingSession.durationMin = Math.max(1, cleanedDuration);
editingSession.followUpSec = Math.max(0, Number(form.get("followUpSec") || 0) || 0);
editingSession.startMode = normalizeStartMode(String(form.get("startMode") || editingSession.startMode || "mass"));
@@ -496,7 +508,11 @@ export function renderEventManagerView(context) {
if (showTeamsSection) {
document.getElementById("teamForm")?.addEventListener("submit", (e) => {
e.preventDefault();
const form = new FormData(e.currentTarget);
const formNode = e.currentTarget;
if (!(formNode instanceof HTMLFormElement)) {
return;
}
const form = new FormData(formNode);
const name = String(form.get("teamName") || "").trim();
const driverIds = form.getAll("teamDriverIds").map(String).filter(Boolean);
const carIds = form.getAll("teamCarIds").map(String).filter(Boolean);
@@ -559,7 +575,11 @@ export function renderEventManagerView(context) {
if (!editingTeam) {
return;
}
const form = new FormData(submitEvent.currentTarget);
const formNode = submitEvent.currentTarget;
if (!(formNode instanceof HTMLFormElement)) {
return;
}
const form = new FormData(formNode);
const name = String(form.get("teamName") || "").trim();
const driverIds = form.getAll("teamDriverIds").map(String).filter(Boolean);
const carIds = form.getAll("teamCarIds").map(String).filter(Boolean);

View File

@@ -59,7 +59,7 @@ export function renderEventManagerMarkup(context) {
</label>
<label>
${t("events.session_type_label")}
<select name="type">
<select id="sessionCreateType" name="type">
${sessionTypeChoices.map((s) => `<option value="${s}">${getSessionTypeLabel(s)}</option>`).join("")}
</select>
<small>${t(sessionTypeHintKey)}</small>
@@ -306,32 +306,40 @@ export function renderEventManagerMarkup(context) {
<div class="panel-body"><p class="hint">${t("events.team_form_drivers")}</p></div>
${teamDriverPool.fallback ? `<div class="panel-body"><p class="hint">${t("events.team_driver_fallback")}</p></div>` : ""}
<div class="panel-body check-grid">
${teamDriverPool.drivers
.map(
(driver) => `
<label class="check-card">
<input type="checkbox" name="teamDriverIds" form="teamForm" value="${driver.id}" />
<span>${escapeHtml(driver.name)}${driver.transponder ? ` (${escapeHtml(driver.transponder)})` : ""}</span>
</label>
`
)
.join("")}
${
teamDriverPool.drivers.length
? teamDriverPool.drivers
.map(
(driver) => `
<label class="check-card">
<input type="checkbox" name="teamDriverIds" form="teamForm" value="${driver.id}" />
<span>${escapeHtml(driver.name)}${driver.transponder ? ` (${escapeHtml(driver.transponder)})` : ""}</span>
</label>
`
)
.join("")
: `<p class="hint">${t("common.no_entries")}</p>`
}
</div>
</section>
<section class="panel">
<div class="panel-header"><h3>${t("events.team_cars")}</h3></div>
<div class="panel-body"><p class="hint">${t("events.team_form_cars")}</p></div>
<div class="panel-body check-grid">
${state.cars
.map(
(car) => `
<label class="check-card">
<input type="checkbox" name="teamCarIds" form="teamForm" value="${car.id}" />
<span>${escapeHtml(car.name)} (${escapeHtml(car.transponder || "-")})</span>
</label>
`
)
.join("")}
${
state.cars.length
? state.cars
.map(
(car) => `
<label class="check-card">
<input type="checkbox" name="teamCarIds" form="teamForm" value="${car.id}" />
<span>${escapeHtml(car.name)} (${escapeHtml(car.transponder || "-")})</span>
</label>
`
)
.join("")
: `<p class="hint">${t("common.no_entries")}</p>`
}
</div>
</section>
</div>
@@ -778,7 +786,7 @@ export function renderEventManagerMarkup(context) {
</label>
<label>
${t("events.session_type_label")}
<select name="type">
<select id="sessionEditType" name="type">
${sessionTypeChoices.map(
(item) => `<option value="${item}" ${item === editingSession.type ? "selected" : ""}>${getSessionTypeLabel(item)}</option>`
).join("")}