gjort om race o lag
This commit is contained in:
@@ -109,7 +109,6 @@ export function renderEventManagerView(context) {
|
|||||||
const teamDriverPool = event.mode === "race" ? getTeamDriverPool(event) : { drivers: [], fallback: false };
|
const teamDriverPool = event.mode === "race" ? getTeamDriverPool(event) : { drivers: [], fallback: false };
|
||||||
const raceDrivers = event.mode === "race" ? teamDriverPool.drivers : [];
|
const raceDrivers = event.mode === "race" ? teamDriverPool.drivers : [];
|
||||||
const raceTeams = event.mode === "race" ? getEventTeams(event) : [];
|
const raceTeams = event.mode === "race" ? getEventTeams(event) : [];
|
||||||
if (event.mode === "race") { window.__teamRenderCount = raceTeams.length; }
|
|
||||||
if (selectedTeamEditId && !raceTeams.some((team) => team.id === selectedTeamEditId)) {
|
if (selectedTeamEditId && !raceTeams.some((team) => team.id === selectedTeamEditId)) {
|
||||||
setSelectedTeamEditId(null);
|
setSelectedTeamEditId(null);
|
||||||
}
|
}
|
||||||
@@ -124,6 +123,9 @@ export function renderEventManagerView(context) {
|
|||||||
const racePresets = getRaceFormatPresets();
|
const racePresets = getRaceFormatPresets();
|
||||||
const selectedPreset = racePresets.find((preset) => preset.id === event.raceConfig.presetId) || racePresets[0];
|
const selectedPreset = racePresets.find((preset) => preset.id === event.raceConfig.presetId) || racePresets[0];
|
||||||
const isEndurancePreset = event.mode === "race" && selectedPreset?.id === "endurance";
|
const isEndurancePreset = event.mode === "race" && selectedPreset?.id === "endurance";
|
||||||
|
const showTeamsSection =
|
||||||
|
event.mode === "race" &&
|
||||||
|
(isEndurancePreset || sessions.some((session) => session.type === "team_race") || raceTeams.length > 0 || Boolean(selectedTeamEditId));
|
||||||
const showBasicQualifyingFields = raceFormatAdvanced || !isEndurancePreset;
|
const showBasicQualifyingFields = raceFormatAdvanced || !isEndurancePreset;
|
||||||
const showBasicFinalFields = raceFormatAdvanced || !isEndurancePreset;
|
const showBasicFinalFields = raceFormatAdvanced || !isEndurancePreset;
|
||||||
const selectedParticipantCount = event.mode === "race" ? (event.raceConfig.participantsConfigured ? (event.raceConfig.driverIds || []).length : raceDrivers.length) : 0;
|
const selectedParticipantCount = event.mode === "race" ? (event.raceConfig.participantsConfigured ? (event.raceConfig.driverIds || []).length : raceDrivers.length) : 0;
|
||||||
@@ -161,6 +163,7 @@ export function renderEventManagerView(context) {
|
|||||||
selectedParticipantCount,
|
selectedParticipantCount,
|
||||||
raceDrivers,
|
raceDrivers,
|
||||||
teamDriverPool,
|
teamDriverPool,
|
||||||
|
showTeamsSection,
|
||||||
state,
|
state,
|
||||||
getDriverDisplayById,
|
getDriverDisplayById,
|
||||||
raceFormatAdvanced,
|
raceFormatAdvanced,
|
||||||
@@ -490,119 +493,93 @@ export function renderEventManagerView(context) {
|
|||||||
persistRaceParticipants();
|
persistRaceParticipants();
|
||||||
});
|
});
|
||||||
|
|
||||||
const getTeamCreateSelections = () => ({
|
if (showTeamsSection) {
|
||||||
driverIds: Array.from(document.querySelectorAll('[form="teamForm"][name="teamDriverIds"]:checked')).map((node) => String(node.value)).filter(Boolean),
|
document.getElementById("teamForm")?.addEventListener("submit", (e) => {
|
||||||
carIds: Array.from(document.querySelectorAll('[form="teamForm"][name="teamCarIds"]:checked')).map((node) => String(node.value)).filter(Boolean),
|
e.preventDefault();
|
||||||
});
|
const form = new FormData(e.currentTarget);
|
||||||
|
const name = String(form.get("teamName") || "").trim();
|
||||||
const commitTeamCreate = () => {
|
const driverIds = form.getAll("teamDriverIds").map(String).filter(Boolean);
|
||||||
const formNode = document.getElementById("teamForm");
|
const carIds = form.getAll("teamCarIds").map(String).filter(Boolean);
|
||||||
if (!(formNode instanceof HTMLFormElement)) {
|
if (!name) {
|
||||||
return;
|
setFormError("teamCreateError", t("validation.required_name"));
|
||||||
}
|
return;
|
||||||
const form = new FormData(formNode);
|
|
||||||
const name = String(form.get("teamName") || "").trim();
|
|
||||||
const { driverIds, carIds } = getTeamCreateSelections();
|
|
||||||
if (!name) {
|
|
||||||
setFormError("teamCreateError", t("validation.required_name"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!driverIds.length && !carIds.length) {
|
|
||||||
setFormError("teamCreateError", t("validation.invalid_selection"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setFormError("teamCreateError", "");
|
|
||||||
const createdTeam = normalizeRaceTeam({ id: uid("team"), name, driverIds, carIds });
|
|
||||||
event.raceConfig.teams = [...getEventTeams(event), createdTeam];
|
|
||||||
setSelectedTeamEditId(null);
|
|
||||||
saveState();
|
|
||||||
rerenderEventManager(eventId);
|
|
||||||
};
|
|
||||||
|
|
||||||
document.getElementById("teamForm")?.addEventListener("submit", (e) => {
|
|
||||||
e.preventDefault();
|
|
||||||
commitTeamCreate();
|
|
||||||
});
|
|
||||||
|
|
||||||
document.getElementById("teamAddSave")?.addEventListener("click", () => {
|
|
||||||
commitTeamCreate();
|
|
||||||
});
|
|
||||||
|
|
||||||
raceTeams.forEach((team) => {
|
|
||||||
document.getElementById(`team-edit-${team.id}`)?.addEventListener("click", () => {
|
|
||||||
setSelectedTeamEditId(team.id);
|
|
||||||
rerenderEventManager(eventId);
|
|
||||||
});
|
|
||||||
|
|
||||||
document.getElementById(`team-delete-${team.id}`)?.addEventListener("click", () => {
|
|
||||||
event.raceConfig.teams = getEventTeams(event).filter((item) => item.id !== team.id);
|
|
||||||
if (getSelectedTeamEditId() === team.id) {
|
|
||||||
setSelectedTeamEditId(null);
|
|
||||||
}
|
}
|
||||||
|
if (!driverIds.length && !carIds.length) {
|
||||||
|
setFormError("teamCreateError", t("validation.invalid_selection"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setFormError("teamCreateError", "");
|
||||||
|
const createdTeam = normalizeRaceTeam({ id: uid("team"), name, driverIds, carIds });
|
||||||
|
event.raceConfig.teams = [...getEventTeams(event), createdTeam];
|
||||||
|
setSelectedTeamEditId(createdTeam.id);
|
||||||
saveState();
|
saveState();
|
||||||
rerenderEventManager(eventId);
|
rerenderEventManager(eventId);
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
document.getElementById("teamEditCancel")?.addEventListener("click", () => {
|
raceTeams.forEach((team) => {
|
||||||
setSelectedTeamEditId(null);
|
document.getElementById(`team-edit-${team.id}`)?.addEventListener("click", () => {
|
||||||
rerenderEventManager(eventId);
|
setSelectedTeamEditId(team.id);
|
||||||
});
|
rerenderEventManager(eventId);
|
||||||
|
});
|
||||||
|
|
||||||
document.getElementById("teamEditCancelFooter")?.addEventListener("click", () => {
|
document.getElementById(`team-delete-${team.id}`)?.addEventListener("click", () => {
|
||||||
setSelectedTeamEditId(null);
|
event.raceConfig.teams = getEventTeams(event).filter((item) => item.id !== team.id);
|
||||||
rerenderEventManager(eventId);
|
if (getSelectedTeamEditId() === team.id) {
|
||||||
});
|
setSelectedTeamEditId(null);
|
||||||
|
}
|
||||||
|
saveState();
|
||||||
|
rerenderEventManager(eventId);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
document.getElementById("teamEditModalOverlay")?.addEventListener("click", (modalEvent) => {
|
document.getElementById("teamEditCancel")?.addEventListener("click", () => {
|
||||||
if (modalEvent.target?.id === "teamEditModalOverlay") {
|
|
||||||
setSelectedTeamEditId(null);
|
setSelectedTeamEditId(null);
|
||||||
rerenderEventManager(eventId);
|
rerenderEventManager(eventId);
|
||||||
}
|
});
|
||||||
});
|
|
||||||
|
|
||||||
bindModalShell("teamEditModalOverlay", () => {
|
document.getElementById("teamEditCancelFooter")?.addEventListener("click", () => {
|
||||||
setSelectedTeamEditId(null);
|
setSelectedTeamEditId(null);
|
||||||
rerenderEventManager(eventId);
|
rerenderEventManager(eventId);
|
||||||
});
|
});
|
||||||
|
|
||||||
const commitTeamEdit = () => {
|
document.getElementById("teamEditModalOverlay")?.addEventListener("click", (modalEvent) => {
|
||||||
if (!editingTeam) {
|
if (modalEvent.target?.id === "teamEditModalOverlay") {
|
||||||
return;
|
setSelectedTeamEditId(null);
|
||||||
}
|
rerenderEventManager(eventId);
|
||||||
const formNode = document.getElementById("teamEditForm");
|
}
|
||||||
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);
|
|
||||||
if (!name) {
|
|
||||||
setFormError("teamEditError", t("validation.required_name"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!driverIds.length && !carIds.length) {
|
|
||||||
setFormError("teamEditError", t("validation.invalid_selection"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setFormError("teamEditError", "");
|
|
||||||
event.raceConfig.teams = getEventTeams(event).map((team) =>
|
|
||||||
team.id === editingTeam.id ? normalizeRaceTeam({ ...team, name, driverIds, carIds }) : team
|
|
||||||
);
|
|
||||||
setSelectedTeamEditId(null);
|
|
||||||
saveState();
|
|
||||||
rerenderEventManager(eventId);
|
|
||||||
};
|
|
||||||
|
|
||||||
document.getElementById("teamEditForm")?.addEventListener("submit", (submitEvent) => {
|
bindModalShell("teamEditModalOverlay", () => {
|
||||||
submitEvent.preventDefault();
|
setSelectedTeamEditId(null);
|
||||||
commitTeamEdit();
|
rerenderEventManager(eventId);
|
||||||
});
|
});
|
||||||
|
|
||||||
document.getElementById("teamEditSave")?.addEventListener("click", () => {
|
document.getElementById("teamEditForm")?.addEventListener("submit", (submitEvent) => {
|
||||||
commitTeamEdit();
|
submitEvent.preventDefault();
|
||||||
});
|
if (!editingTeam) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const form = new FormData(submitEvent.currentTarget);
|
||||||
|
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);
|
||||||
|
if (!name) {
|
||||||
|
setFormError("teamEditError", t("validation.required_name"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!driverIds.length && !carIds.length) {
|
||||||
|
setFormError("teamEditError", t("validation.invalid_selection"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setFormError("teamEditError", "");
|
||||||
|
event.raceConfig.teams = getEventTeams(event).map((team) =>
|
||||||
|
team.id === editingTeam.id ? normalizeRaceTeam({ ...team, name, driverIds, carIds }) : team
|
||||||
|
);
|
||||||
|
setSelectedTeamEditId(null);
|
||||||
|
saveState();
|
||||||
|
rerenderEventManager(eventId);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
document.getElementById("raceFormatBasicToggle")?.addEventListener("click", () => {
|
document.getElementById("raceFormatBasicToggle")?.addEventListener("click", () => {
|
||||||
setRaceFormatAdvanced(false);
|
setRaceFormatAdvanced(false);
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ export function renderEventManagerMarkup(context) {
|
|||||||
selectedParticipantCount,
|
selectedParticipantCount,
|
||||||
raceDrivers,
|
raceDrivers,
|
||||||
teamDriverPool,
|
teamDriverPool,
|
||||||
|
showTeamsSection,
|
||||||
state,
|
state,
|
||||||
getDriverDisplayById,
|
getDriverDisplayById,
|
||||||
raceFormatAdvanced,
|
raceFormatAdvanced,
|
||||||
@@ -282,91 +283,96 @@ export function renderEventManagerMarkup(context) {
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="panel" id="manage-setup-teams">
|
${
|
||||||
<div class="panel-header panel-header-with-pill">
|
showTeamsSection
|
||||||
<h3>${t("events.teams")}</h3>
|
? `
|
||||||
<span class="pill">${raceTeams.length}</span>
|
<section class="panel" id="manage-setup-teams">
|
||||||
</div>
|
<div class="panel-header panel-header-with-pill">
|
||||||
<div class="panel-body">
|
<h3>${t("events.teams")}</h3>
|
||||||
<p class="hint">${t("events.team_race_intro")}</p>
|
<span class="pill">${raceTeams.length}</span>
|
||||||
<p class="hint">${t("events.team_steps")}</p>
|
</div>
|
||||||
<form id="teamForm" class="form-grid cols-4 team-create-form">
|
<div class="panel-body">
|
||||||
<input name="teamName" required placeholder="${t("events.team_name")}" />
|
<p class="hint">${t("events.team_race_intro")}</p>
|
||||||
<button class="btn btn-primary" id="teamAddSave" type="button">${t("events.add_team")}</button>
|
<p class="hint">${t("events.team_steps")}</p>
|
||||||
<p class="form-error" id="teamCreateError" hidden></p>
|
<form id="teamForm" class="form-grid cols-4 team-create-form">
|
||||||
</form>
|
<input name="teamName" required placeholder="${t("events.team_name")}" />
|
||||||
<p class="hint">${t("events.team_hint")}</p>
|
<button class="btn btn-primary" type="submit">${t("events.add_team")}</button>
|
||||||
<p class="hint" id="teamRenderDebug">teams rendered: ${raceTeams.length}</p>
|
<p class="form-error" id="teamCreateError" hidden></p>
|
||||||
<div class="panel-row mt-16">
|
</form>
|
||||||
<section class="panel">
|
<p class="hint">${t("events.team_hint")}</p>
|
||||||
<div class="panel-header"><h3>${t("events.team_drivers")}</h3></div>
|
<div class="panel-row mt-16">
|
||||||
<div class="panel-body"><p class="hint">${t("events.team_form_drivers")}</p></div>
|
<section class="panel">
|
||||||
${teamDriverPool.fallback ? `<div class="panel-body"><p class="hint">${t("events.team_driver_fallback")}</p></div>` : ""}
|
<div class="panel-header"><h3>${t("events.team_drivers")}</h3></div>
|
||||||
<div class="panel-body check-grid">
|
<div class="panel-body"><p class="hint">${t("events.team_form_drivers")}</p></div>
|
||||||
${raceDrivers
|
${teamDriverPool.fallback ? `<div class="panel-body"><p class="hint">${t("events.team_driver_fallback")}</p></div>` : ""}
|
||||||
.map(
|
<div class="panel-body check-grid">
|
||||||
(driver) => `
|
${raceDrivers
|
||||||
<label class="check-card">
|
.map(
|
||||||
<input type="checkbox" name="teamDriverIds" form="teamForm" value="${driver.id}" />
|
(driver) => `
|
||||||
<span>${escapeHtml(driver.name)}${driver.transponder ? ` (${escapeHtml(driver.transponder)})` : ""}</span>
|
<label class="check-card">
|
||||||
</label>
|
<input type="checkbox" name="teamDriverIds" form="teamForm" value="${driver.id}" />
|
||||||
`
|
<span>${escapeHtml(driver.name)}${driver.transponder ? ` (${escapeHtml(driver.transponder)})` : ""}</span>
|
||||||
)
|
</label>
|
||||||
.join("")}
|
`
|
||||||
</div>
|
)
|
||||||
</section>
|
.join("")}
|
||||||
<section class="panel">
|
</div>
|
||||||
<div class="panel-header"><h3>${t("events.team_cars")}</h3></div>
|
</section>
|
||||||
<div class="panel-body"><p class="hint">${t("events.team_form_cars")}</p></div>
|
<section class="panel">
|
||||||
<div class="panel-body check-grid">
|
<div class="panel-header"><h3>${t("events.team_cars")}</h3></div>
|
||||||
${state.cars
|
<div class="panel-body"><p class="hint">${t("events.team_form_cars")}</p></div>
|
||||||
.map(
|
<div class="panel-body check-grid">
|
||||||
(car) => `
|
${state.cars
|
||||||
<label class="check-card">
|
.map(
|
||||||
<input type="checkbox" name="teamCarIds" form="teamForm" value="${car.id}" />
|
(car) => `
|
||||||
<span>${escapeHtml(car.name)} (${escapeHtml(car.transponder || "-")})</span>
|
<label class="check-card">
|
||||||
</label>
|
<input type="checkbox" name="teamCarIds" form="teamForm" value="${car.id}" />
|
||||||
`
|
<span>${escapeHtml(car.name)} (${escapeHtml(car.transponder || "-")})</span>
|
||||||
)
|
</label>
|
||||||
.join("")}
|
`
|
||||||
</div>
|
)
|
||||||
</section>
|
.join("")}
|
||||||
</div>
|
</div>
|
||||||
<div class="mt-16">
|
</section>
|
||||||
${
|
</div>
|
||||||
raceTeams.length
|
<div class="mt-16">
|
||||||
? raceTeams
|
${
|
||||||
.map(
|
raceTeams.length
|
||||||
(team) => `
|
? raceTeams
|
||||||
<article class="team-card">
|
.map(
|
||||||
<div>
|
(team) => `
|
||||||
<strong>${escapeHtml(team.name)}</strong>
|
<article class="team-card">
|
||||||
<div class="hint">${t("events.team_drivers")}: ${escapeHtml(
|
<div>
|
||||||
team.driverIds.map((driverId) => getDriverDisplayById(driverId)).join(", ") || "-"
|
<strong>${escapeHtml(team.name)}</strong>
|
||||||
)}</div>
|
<div class="hint">${t("events.team_drivers")}: ${escapeHtml(
|
||||||
<div class="hint">${t("events.team_cars")}: ${escapeHtml(
|
team.driverIds.map((driverId) => getDriverDisplayById(driverId)).join(", ") || "-"
|
||||||
team.carIds
|
)}</div>
|
||||||
.map((carId) => {
|
<div class="hint">${t("events.team_cars")}: ${escapeHtml(
|
||||||
const car = state.cars.find((item) => item.id === carId);
|
team.carIds
|
||||||
return car ? `${car.name} (${car.transponder || "-"})` : "";
|
.map((carId) => {
|
||||||
})
|
const car = state.cars.find((item) => item.id === carId);
|
||||||
.filter(Boolean)
|
return car ? `${car.name} (${car.transponder || "-"})` : "";
|
||||||
.join(", ") || "-"
|
})
|
||||||
)}</div>
|
.filter(Boolean)
|
||||||
</div>
|
.join(", ") || "-"
|
||||||
<div class="actions-inline">
|
)}</div>
|
||||||
<button id="team-edit-${team.id}" class="btn" type="button">${t("events.edit_team")}</button>
|
</div>
|
||||||
<button id="team-delete-${team.id}" class="btn btn-danger" type="button">${t("common.delete")}</button>
|
<div class="actions-inline">
|
||||||
</div>
|
<button id="team-edit-${team.id}" class="btn" type="button">${t("events.edit_team")}</button>
|
||||||
</article>
|
<button id="team-delete-${team.id}" class="btn btn-danger" type="button">${t("common.delete")}</button>
|
||||||
`
|
</div>
|
||||||
)
|
</article>
|
||||||
.join("")
|
`
|
||||||
: `<p>${t("events.no_teams")}</p>`
|
)
|
||||||
}
|
.join("")
|
||||||
</div>
|
: `<p>${t("events.no_teams")}</p>`
|
||||||
</div>
|
}
|
||||||
</section>
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
`
|
||||||
|
: ""
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<section class="panel mt-16" id="manage-format">
|
<section class="panel mt-16" id="manage-format">
|
||||||
|
|||||||
@@ -513,10 +513,7 @@ export function getTeamDriverPool(event, { getEventDrivers, state }) {
|
|||||||
if (scopedDrivers.length) {
|
if (scopedDrivers.length) {
|
||||||
return { drivers: scopedDrivers, fallback: false };
|
return { drivers: scopedDrivers, fallback: false };
|
||||||
}
|
}
|
||||||
return {
|
return { drivers: [], fallback: false };
|
||||||
drivers: [...state.drivers],
|
|
||||||
fallback: state.drivers.length > 0,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -782,4 +779,3 @@ export function applyBumpsForRace(event, { buildFinalStandings, getSessionsForEv
|
|||||||
return applied;
|
return applied;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user