diff --git a/static/script.js b/static/script.js index 6a95578..efb752b 100644 --- a/static/script.js +++ b/static/script.js @@ -1036,7 +1036,12 @@ function updatePeriodButtons() { } function addPlayerEvent(side, type, playerId, playerName) { - pushEvent(side, type, playerName, `Игрок #${playerId ?? ""}`, playerId); + const row = + findLineupRowByPlayerId(side, "starting", playerId) || + findLineupRowByPlayerId(side, "bench", playerId); + + const displayName = getRowDisplayName(row) || String(playerName || "").trim(); + pushEvent(side, type, displayName, `Игрок #${playerId ?? ""}`, playerId); } @@ -1173,7 +1178,7 @@ function getPlayersForSide(side) { .filter((row) => row.dataset.temporary !== "1") .map((row) => ({ player_id: row.dataset.playerId || "", - player_name: row.dataset.playerName || "", + player_name: getRowDisplayName(row), player_number: row.dataset.playerNumber || "" })) .filter((p) => p.player_name.trim() !== ""); @@ -1293,19 +1298,29 @@ function getScoreSum() { } function getSubOutName(payload) { + const explicit = String(payload.player_name_out || "").trim(); + if (explicit) { + return explicit; + } + const raw = String(payload.player_name || ""); if (raw.includes("→")) { return raw.split("→")[0].trim(); } - return String(payload.player_name_out || "").trim(); + return ""; } function getSubInName(payload) { + const explicit = String(payload.player_name_in || "").trim(); + if (explicit) { + return explicit; + } + const raw = String(payload.player_name || ""); if (raw.includes("→")) { return raw.split("→")[1].trim(); } - return String(payload.player_name_in || "").trim(); + return ""; } function escapeVmixValue(value) { @@ -1425,8 +1440,12 @@ function getPlayerNumberByEvent(event) { }; } - const row = findLineupRowByPlayerId(event.side, "starting", event.player_id) - || findLineupRowByPlayerId(event.side, "bench", event.player_id); + const playerSide = event.type === "own_goal" + ? getOppositeSide(event.side) + : event.side; + + const row = findLineupRowByPlayerId(playerSide, "starting", event.player_id) + || findLineupRowByPlayerId(playerSide, "bench", event.player_id); return row?.dataset.playerNumber || ""; } @@ -1602,6 +1621,10 @@ function renderEvents() { ]; const eventNumberData = getPlayerNumberByEvent(event); + const eventNameData = getPlayerNamesByEvent(event); + const vmixPlayerName = event.type === "sub" + ? `${eventNameData.out || ""} → ${eventNameData.in || ""}`.trim() + : getVmixPlayerDisplayName(event); const isClickable = clickableTypes.includes(event.type); @@ -1612,10 +1635,12 @@ function renderEvents() { side: event.side ?? "", minute: event.minute ?? "", seconds: event.seconds ?? 0, - player_name: event.player_name ?? "", + player_name: vmixPlayerName, player_id: event.player_id ?? null, player_out_id: event.player_out_id ?? null, player_in_id: event.player_in_id ?? null, + player_name_out: eventNameData.out ?? "", + player_name_in: eventNameData.in ?? "", player_number: typeof eventNumberData === "string" ? eventNumberData : "", player_out_number: typeof eventNumberData === "object" ? (eventNumberData.out ?? "") : "", player_in_number: typeof eventNumberData === "object" ? (eventNumberData.in ?? "") : "", @@ -1665,9 +1690,13 @@ function getVmixPlayerDisplayName(event) { return String(event?.player_name || "").trim(); } + const playerSide = event.type === "own_goal" + ? getOppositeSide(event.side) + : event.side; + const row = - findLineupRowByPlayerId(event.side, "starting", event.player_id) || - findLineupRowByPlayerId(event.side, "bench", event.player_id); + findLineupRowByPlayerId(playerSide, "starting", event.player_id) || + findLineupRowByPlayerId(playerSide, "bench", event.player_id); if (!row) { return String(event.player_name || "").trim(); @@ -2324,9 +2353,13 @@ function getDisplayNameForEvent(event) { } if (event.player_id) { + const playerSide = event.type === "own_goal" + ? getOppositeSide(event.side) + : event.side; + const row = - findLineupRowByPlayerId(event.side, "starting", event.player_id) || - findLineupRowByPlayerId(event.side, "bench", event.player_id); + findLineupRowByPlayerId(playerSide, "starting", event.player_id) || + findLineupRowByPlayerId(playerSide, "bench", event.player_id); if (row) { return getRowDisplayName(row); @@ -2446,6 +2479,7 @@ function renderLineupRow(row) { class="player-link-btn vmix-person-trigger" data-vmix-person-type="player" data-side="${escapeHtml(side)}" + data-name="${escapeHtml(displayName)}" data-first-name="${escapeHtml(player.firstName || "")}" data-last-name="${escapeHtml(player.lastName || "")}" data-role="${escapeHtml(player.position || "")}" diff --git a/templates/match_workspace.html b/templates/match_workspace.html index 02acbb4..3c62f00 100644 --- a/templates/match_workspace.html +++ b/templates/match_workspace.html @@ -427,6 +427,7 @@ class="player-inline vmix-person-trigger player-link" data-vmix-person-type="player" data-side="home" + data-name="{{ (((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '') }}" data-first-name="{{ p.first_name or '' }}" data-last-name="{{ p.last_name or '' }}" data-role="{{ p.position or '' }}" @@ -452,7 +453,7 @@ data-role="{{ p.position or '' }}" type="button" class="icon-btn goal" title="Гол" - onclick="addPlayerEvent('home', 'goal', {{ p.player_id | default(p.number) | tojson }}, {{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim | tojson }})" + onclick="addPlayerEvent('home', 'goal', {{ p.player_id | default(p.number) | tojson }}, {{ ((((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '')) | tojson }})" > ⚽ @@ -460,7 +461,7 @@ data-role="{{ p.position or '' }}" type="button" class="icon-btn" title="Автогол" - onclick="addPlayerEvent('home', 'own_goal', {{ p.player_id | default(p.number) | tojson }}, {{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim | tojson }})" + onclick="addPlayerEvent('home', 'own_goal', {{ p.player_id | default(p.number) | tojson }}, {{ ((((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '')) | tojson }})" > АГ @@ -468,7 +469,7 @@ data-role="{{ p.position or '' }}" type="button" class="icon-btn" title="Пенальти" - onclick="addPlayerEvent('home', 'penalty', {{ p.player_id | default(p.number) | tojson }}, {{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim | tojson }})" + onclick="addPlayerEvent('home', 'penalty', {{ p.player_id | default(p.number) | tojson }}, {{ ((((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '')) | tojson }})" > П @@ -476,7 +477,7 @@ data-role="{{ p.position or '' }}" type="button" class="icon-btn sub" title="Замена" - onclick="beginSubstitution('home', {{ p.player_id | default(p.number) | tojson }}, {{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim | tojson }}, this)" + onclick="beginSubstitution('home', {{ p.player_id | default(p.number) | tojson }}, {{ ((((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '')) | tojson }}, this)" > ⇄ @@ -484,13 +485,13 @@ data-role="{{ p.position or '' }}" type="button" class="icon-btn yellow-card" title="Жёлтая карточка" - onclick="addPlayerEvent('home', 'yellow', {{ p.player_id | default(p.number) | tojson }}, {{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim | tojson }})" + onclick="addPlayerEvent('home', 'yellow', {{ p.player_id | default(p.number) | tojson }}, {{ ((((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '')) | tojson }})" > @@ -543,6 +544,7 @@ data-role="{{ p.position or '' }}" class="player-inline vmix-person-trigger player-link" data-vmix-person-type="player" data-side="home" + data-name="{{ (((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '') }}" data-first-name="{{ p.first_name or '' }}" data-last-name="{{ p.last_name or '' }}" data-role="{{ p.position or '' }}" @@ -568,7 +570,7 @@ data-role="{{ p.position or '' }}" type="button" class="icon-btn sub" title="Замена" - onclick="selectBenchPlayer('home', {{ p.player_id | default(p.number) | tojson }}, {{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim | tojson }}, this)" + onclick="selectBenchPlayer('home', {{ p.player_id | default(p.number) | tojson }}, {{ ((((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '')) | tojson }}, this)" > ⇄ @@ -669,6 +671,7 @@ data-role="{{ p.position or '' }}" class="player-inline vmix-person-trigger player-link" data-vmix-person-type="player" data-side="away" + data-name="{{ (((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '') }}" data-first-name="{{ p.first_name or '' }}" data-last-name="{{ p.last_name or '' }}" data-role="{{ p.position or '' }}" @@ -694,7 +697,7 @@ data-role="{{ p.position or '' }}" type="button" class="icon-btn goal" title="Гол" - onclick="addPlayerEvent('away', 'goal', {{ p.player_id | default(p.number) | tojson }}, {{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim | tojson }})" + onclick="addPlayerEvent('away', 'goal', {{ p.player_id | default(p.number) | tojson }}, {{ ((((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '')) | tojson }})" > ⚽ @@ -702,7 +705,7 @@ data-role="{{ p.position or '' }}" type="button" class="icon-btn" title="Автогол" - onclick="addPlayerEvent('away', 'own_goal', {{ p.player_id | default(p.number) | tojson }}, {{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim | tojson }})" + onclick="addPlayerEvent('away', 'own_goal', {{ p.player_id | default(p.number) | tojson }}, {{ ((((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '')) | tojson }})" > АГ @@ -710,7 +713,7 @@ data-role="{{ p.position or '' }}" type="button" class="icon-btn" title="Пенальти" - onclick="addPlayerEvent('away', 'penalty', {{ p.player_id | default(p.number) | tojson }}, {{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim | tojson }})" + onclick="addPlayerEvent('away', 'penalty', {{ p.player_id | default(p.number) | tojson }}, {{ ((((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '')) | tojson }})" > П @@ -718,7 +721,7 @@ data-role="{{ p.position or '' }}" type="button" class="icon-btn sub" title="Замена" - onclick="beginSubstitution('away', {{ p.player_id | default(p.number) | tojson }}, {{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim | tojson }}, this)" + onclick="beginSubstitution('away', {{ p.player_id | default(p.number) | tojson }}, {{ ((((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '')) | tojson }}, this)" > ⇄ @@ -726,13 +729,13 @@ data-role="{{ p.position or '' }}" type="button" class="icon-btn yellow-card" title="Жёлтая карточка" - onclick="addPlayerEvent('away', 'yellow', {{ p.player_id | default(p.number) | tojson }}, {{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim | tojson }})" + onclick="addPlayerEvent('away', 'yellow', {{ p.player_id | default(p.number) | tojson }}, {{ ((((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '')) | tojson }})" > @@ -785,6 +788,7 @@ data-role="{{ p.position or '' }}" class="player-inline vmix-person-trigger player-link" data-vmix-person-type="player" data-side="away" + data-name="{{ (((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '') }}" data-first-name="{{ p.first_name or '' }}" data-last-name="{{ p.last_name or '' }}" data-role="{{ p.position or '' }}" @@ -810,7 +814,7 @@ data-role="{{ p.position or '' }}" type="button" class="icon-btn sub" title="Замена" - onclick="selectBenchPlayer('away', {{ p.player_id | default(p.number) | tojson }}, {{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim | tojson }}, this)" + onclick="selectBenchPlayer('away', {{ p.player_id | default(p.number) | tojson }}, {{ ((((p.first_name or '') ~ ' ' ~ (p.last_name or '')) | trim) or (p.player_name or '')) | tojson }}, this)" > ⇄