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)"
>
⇄