поправил капитанов на расстановки
This commit is contained in:
109
static/script.js
109
static/script.js
@@ -2580,6 +2580,13 @@ function makeDraggable(el) {
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
setEditMode(false);
|
||||
renderRefereesEditor();
|
||||
|
||||
if (isGameTabActive()) {
|
||||
const missingCaptainSides = getMissingCaptainSidesFromMatchData();
|
||||
if (missingCaptainSides.length) {
|
||||
window.setTimeout(() => showCaptainRequiredWarning(missingCaptainSides), 150);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -3354,6 +3361,69 @@ function cloneSideState(side) {
|
||||
};
|
||||
}
|
||||
|
||||
let suppressNextCaptainWarning = false;
|
||||
|
||||
function sideNeedsCaptain(state) {
|
||||
const starting = Array.isArray(state?.starting) ? state.starting : [];
|
||||
return starting.length > 0 && !starting.some(player => !!player.is_captain);
|
||||
}
|
||||
|
||||
function getMissingCaptainSidesFromEditor() {
|
||||
const missing = [];
|
||||
if (sideNeedsCaptain(squadEditorState.home)) missing.push("home");
|
||||
if (sideNeedsCaptain(squadEditorState.away)) missing.push("away");
|
||||
return missing;
|
||||
}
|
||||
|
||||
function getMissingCaptainSidesFromMatchData() {
|
||||
const missing = [];
|
||||
const homeState = { starting: window.MATCH_DATA?.homeStarting || [] };
|
||||
const awayState = { starting: window.MATCH_DATA?.awayStarting || [] };
|
||||
if (sideNeedsCaptain(homeState)) missing.push("home");
|
||||
if (sideNeedsCaptain(awayState)) missing.push("away");
|
||||
return missing;
|
||||
}
|
||||
|
||||
function getCaptainWarningTeamNames(sides) {
|
||||
return sides.map(side => {
|
||||
const fallback = side === "home" ? "Домашняя команда" : "Гостевая команда";
|
||||
return String(window.MATCH_DATA?.teamNames?.[side] || fallback).trim() || fallback;
|
||||
});
|
||||
}
|
||||
|
||||
function showCaptainRequiredWarning(sides) {
|
||||
const uniqueSides = Array.from(new Set((sides || []).filter(side => side === "home" || side === "away")));
|
||||
if (!uniqueSides.length) {
|
||||
closeCaptainRequiredWarning();
|
||||
return;
|
||||
}
|
||||
|
||||
const modal = document.getElementById("captainRequiredModal");
|
||||
const text = document.getElementById("captainRequiredText");
|
||||
if (!modal || !text) return;
|
||||
|
||||
const names = getCaptainWarningTeamNames(uniqueSides);
|
||||
if (names.length === 1) {
|
||||
text.textContent = `У команды «${names[0]}» не выбран капитан. Обязательно назначьте капитана из основного состава перед сохранением.`;
|
||||
} else {
|
||||
text.textContent = `У команд «${names[0]}» и «${names[1]}» не выбраны капитаны. Обязательно назначьте капитана каждой команды из основного состава перед сохранением.`;
|
||||
}
|
||||
|
||||
modal.classList.add("show");
|
||||
}
|
||||
|
||||
function closeCaptainRequiredWarning() {
|
||||
document.getElementById("captainRequiredModal")?.classList.remove("show");
|
||||
}
|
||||
|
||||
function openCaptainEditorFromWarning() {
|
||||
closeCaptainRequiredWarning();
|
||||
if (!editModeEnabled) {
|
||||
suppressNextCaptainWarning = true;
|
||||
setEditMode(true);
|
||||
}
|
||||
}
|
||||
|
||||
async function openSquadEditor() {
|
||||
if (!editModeEnabled) return;
|
||||
|
||||
@@ -3370,6 +3440,13 @@ async function openSquadEditor() {
|
||||
renderSquadEditorSide("away");
|
||||
|
||||
document.getElementById("squadEditorModal")?.classList.add("show");
|
||||
|
||||
const missingCaptainSides = getMissingCaptainSidesFromEditor();
|
||||
if (suppressNextCaptainWarning) {
|
||||
suppressNextCaptainWarning = false;
|
||||
} else if (missingCaptainSides.length) {
|
||||
showCaptainRequiredWarning(missingCaptainSides);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3410,8 +3487,12 @@ function renderSquadEditorSide(side) {
|
||||
|
||||
const availablePlayers = getAvailableSquadPool(side);
|
||||
const coachOptions = state.coachPool;
|
||||
const captainWarning = sideNeedsCaptain(state)
|
||||
? `<div class="squad-editor-captain-warning">⚠ Капитан не выбран. Назначьте капитана из основного состава.</div>`
|
||||
: "";
|
||||
|
||||
mount.innerHTML = `
|
||||
${captainWarning}
|
||||
<div class="squad-editor-section">
|
||||
<div class="squad-editor-section-title">Добавить игрока</div>
|
||||
<div class="squad-editor-box">
|
||||
@@ -3560,6 +3641,9 @@ function removePlayerFromEditor(side, playerId, role) {
|
||||
const state = getSideEditorState(side);
|
||||
if (!state) return;
|
||||
|
||||
const removedPlayer = state[role]?.find(p => String(p.player_id) === String(playerId));
|
||||
const removedCaptain = role === "starting" && !!removedPlayer?.is_captain;
|
||||
|
||||
const hasLinkedEvents = matchEvents.some(event =>
|
||||
String(event.side) === String(side) &&
|
||||
(
|
||||
@@ -3576,6 +3660,10 @@ function removePlayerFromEditor(side, playerId, role) {
|
||||
|
||||
state[role] = state[role].filter(p => String(p.player_id) !== String(playerId));
|
||||
renderSquadEditorSide(side);
|
||||
|
||||
if (removedCaptain && sideNeedsCaptain(state)) {
|
||||
showCaptainRequiredWarning([side]);
|
||||
}
|
||||
}
|
||||
|
||||
function movePlayerBetweenZones(side, playerId, fromRole, toRole) {
|
||||
@@ -3586,19 +3674,18 @@ function movePlayerBetweenZones(side, playerId, fromRole, toRole) {
|
||||
if (idx === -1) return;
|
||||
|
||||
const [player] = state[fromRole].splice(idx, 1);
|
||||
const movedCaptainOutOfStarting = fromRole === "starting" && toRole === "bench" && !!player.is_captain;
|
||||
|
||||
if (toRole === "bench") {
|
||||
player.is_captain = false;
|
||||
}
|
||||
|
||||
state[toRole].push(player);
|
||||
|
||||
const hasCaptainInStarting = state.starting.some(p => p.is_captain);
|
||||
if (!hasCaptainInStarting && state.starting.length) {
|
||||
state.starting[0].is_captain = true;
|
||||
}
|
||||
|
||||
renderSquadEditorSide(side);
|
||||
|
||||
if (movedCaptainOutOfStarting && sideNeedsCaptain(state)) {
|
||||
showCaptainRequiredWarning([side]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3620,6 +3707,10 @@ function setCaptainInEditor(side, playerId, role) {
|
||||
});
|
||||
|
||||
renderSquadEditorSide(side);
|
||||
|
||||
if (!getMissingCaptainSidesFromEditor().length) {
|
||||
closeCaptainRequiredWarning();
|
||||
}
|
||||
}
|
||||
|
||||
function updateCoachInEditor(side, index, coachId) {
|
||||
@@ -3757,6 +3848,12 @@ function rebuildFormationFromMatchData(side) {
|
||||
async function applySquadEditorChanges() {
|
||||
if (!squadEditorState.home || !squadEditorState.away) return;
|
||||
|
||||
const missingCaptainSides = getMissingCaptainSidesFromEditor();
|
||||
if (missingCaptainSides.length) {
|
||||
showCaptainRequiredWarning(missingCaptainSides);
|
||||
return;
|
||||
}
|
||||
|
||||
const payload = buildSquadSavePayload();
|
||||
const result = await saveSquadEditorChangesToServer(payload);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user