From 4daee0cd21fa526688840041972ce7a0ce003ff0 Mon Sep 17 00:00:00 2001 From: larssand Date: Fri, 27 Mar 2026 18:47:59 +0100 Subject: [PATCH] gjort om race o lag --- src/event_manager_controller.js | 179 ++++++++++++++------------------ src/event_manager_view.js | 176 ++++++++++++++++--------------- src/event_race_logic.js | 6 +- 3 files changed, 170 insertions(+), 191 deletions(-) diff --git a/src/event_manager_controller.js b/src/event_manager_controller.js index 4913841..618e761 100644 --- a/src/event_manager_controller.js +++ b/src/event_manager_controller.js @@ -109,7 +109,6 @@ export function renderEventManagerView(context) { const teamDriverPool = event.mode === "race" ? getTeamDriverPool(event) : { drivers: [], fallback: false }; const raceDrivers = event.mode === "race" ? teamDriverPool.drivers : []; const raceTeams = event.mode === "race" ? getEventTeams(event) : []; - if (event.mode === "race") { window.__teamRenderCount = raceTeams.length; } if (selectedTeamEditId && !raceTeams.some((team) => team.id === selectedTeamEditId)) { setSelectedTeamEditId(null); } @@ -124,6 +123,9 @@ export function renderEventManagerView(context) { const racePresets = getRaceFormatPresets(); const selectedPreset = racePresets.find((preset) => preset.id === event.raceConfig.presetId) || racePresets[0]; 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 showBasicFinalFields = raceFormatAdvanced || !isEndurancePreset; const selectedParticipantCount = event.mode === "race" ? (event.raceConfig.participantsConfigured ? (event.raceConfig.driverIds || []).length : raceDrivers.length) : 0; @@ -161,6 +163,7 @@ export function renderEventManagerView(context) { selectedParticipantCount, raceDrivers, teamDriverPool, + showTeamsSection, state, getDriverDisplayById, raceFormatAdvanced, @@ -490,119 +493,93 @@ export function renderEventManagerView(context) { persistRaceParticipants(); }); - const getTeamCreateSelections = () => ({ - driverIds: Array.from(document.querySelectorAll('[form="teamForm"][name="teamDriverIds"]:checked')).map((node) => String(node.value)).filter(Boolean), - carIds: Array.from(document.querySelectorAll('[form="teamForm"][name="teamCarIds"]:checked')).map((node) => String(node.value)).filter(Boolean), - }); - - const commitTeamCreate = () => { - const formNode = document.getElementById("teamForm"); - if (!(formNode instanceof HTMLFormElement)) { - 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 (showTeamsSection) { + document.getElementById("teamForm")?.addEventListener("submit", (e) => { + e.preventDefault(); + const form = new FormData(e.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("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(createdTeam.id); saveState(); rerenderEventManager(eventId); }); - }); - document.getElementById("teamEditCancel")?.addEventListener("click", () => { - setSelectedTeamEditId(null); - rerenderEventManager(eventId); - }); + raceTeams.forEach((team) => { + document.getElementById(`team-edit-${team.id}`)?.addEventListener("click", () => { + setSelectedTeamEditId(team.id); + rerenderEventManager(eventId); + }); - document.getElementById("teamEditCancelFooter")?.addEventListener("click", () => { - setSelectedTeamEditId(null); - 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); + } + saveState(); + rerenderEventManager(eventId); + }); + }); - document.getElementById("teamEditModalOverlay")?.addEventListener("click", (modalEvent) => { - if (modalEvent.target?.id === "teamEditModalOverlay") { + document.getElementById("teamEditCancel")?.addEventListener("click", () => { setSelectedTeamEditId(null); rerenderEventManager(eventId); - } - }); + }); - bindModalShell("teamEditModalOverlay", () => { - setSelectedTeamEditId(null); - rerenderEventManager(eventId); - }); + document.getElementById("teamEditCancelFooter")?.addEventListener("click", () => { + setSelectedTeamEditId(null); + rerenderEventManager(eventId); + }); - const commitTeamEdit = () => { - if (!editingTeam) { - return; - } - 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("teamEditModalOverlay")?.addEventListener("click", (modalEvent) => { + if (modalEvent.target?.id === "teamEditModalOverlay") { + setSelectedTeamEditId(null); + rerenderEventManager(eventId); + } + }); - document.getElementById("teamEditForm")?.addEventListener("submit", (submitEvent) => { - submitEvent.preventDefault(); - commitTeamEdit(); - }); + bindModalShell("teamEditModalOverlay", () => { + setSelectedTeamEditId(null); + rerenderEventManager(eventId); + }); - document.getElementById("teamEditSave")?.addEventListener("click", () => { - commitTeamEdit(); - }); + document.getElementById("teamEditForm")?.addEventListener("submit", (submitEvent) => { + 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", () => { setRaceFormatAdvanced(false); diff --git a/src/event_manager_view.js b/src/event_manager_view.js index 4b13ba5..5f45d5b 100644 --- a/src/event_manager_view.js +++ b/src/event_manager_view.js @@ -20,6 +20,7 @@ export function renderEventManagerMarkup(context) { selectedParticipantCount, raceDrivers, teamDriverPool, + showTeamsSection, state, getDriverDisplayById, raceFormatAdvanced, @@ -282,91 +283,96 @@ export function renderEventManagerMarkup(context) { -
-
-

${t("events.teams")}

- ${raceTeams.length} -
-
-

${t("events.team_race_intro")}

-

${t("events.team_steps")}

-
- - - -
-

${t("events.team_hint")}

-

teams rendered: ${raceTeams.length}

-
-
-

${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")}

` - } -
-
-
+ ${ + showTeamsSection + ? ` +
+
+

${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")}

` + } +
+
+
+ ` + : "" + }
diff --git a/src/event_race_logic.js b/src/event_race_logic.js index 04fab4d..1c37e94 100644 --- a/src/event_race_logic.js +++ b/src/event_race_logic.js @@ -513,10 +513,7 @@ export function getTeamDriverPool(event, { getEventDrivers, state }) { if (scopedDrivers.length) { return { drivers: scopedDrivers, fallback: false }; } - return { - drivers: [...state.drivers], - fallback: state.drivers.length > 0, - }; + return { drivers: [], fallback: false }; } @@ -782,4 +779,3 @@ export function applyBumpsForRace(event, { buildFinalStandings, getSessionsForEv return applied; } -