тест2

This commit is contained in:
2026-04-21 15:08:05 +03:00
parent b42449d42b
commit 84e49b2b39
2 changed files with 86 additions and 24 deletions

View File

@@ -2037,12 +2037,14 @@ function renderLineupRow(row) {
const side = row.dataset.side; const side = row.dataset.side;
const role = row.dataset.role; const role = row.dataset.role;
const player = getRowPlayer(row); const player = getRowPlayer(row);
const fullName = (player.name || `${player.lastName || ""} ${player.firstName || ""}`).trim(); const fullName = (player.name || `${player.lastName || ""} ${player.firstName || ""}`).trim();
const displayName = buildPersonDisplayName( const displayName = buildPersonDisplayName(
player.firstName, player.firstName,
player.lastName, player.lastName,
player.name || fullName player.name || fullName
); );
const gkBadge = isGoalkeeperPosition(player.position) ? '<span class="gk-badge">ВР</span>' : ''; const gkBadge = isGoalkeeperPosition(player.position) ? '<span class="gk-badge">ВР</span>' : '';
const captainBadge = player.isCaptain ? '<span class="captain-badge">К</span>' : ''; const captainBadge = player.isCaptain ? '<span class="captain-badge">К</span>' : '';
const disciplineBadge = player.disciplineType === "yellow_red" const disciplineBadge = player.disciplineType === "yellow_red"
@@ -2050,7 +2052,11 @@ function renderLineupRow(row) {
: (player.disciplineType === "red" : (player.disciplineType === "red"
? '<span class="discipline-badge-red">КК</span>' ? '<span class="discipline-badge-red">КК</span>'
: ''); : '');
const firstNameHtml = player.firstName ? `<span class="first-name"> ${escapeHtml(player.firstName)}</span>` : '';
const firstNameHtml = player.firstName
? `<span class="first-name"> ${escapeHtml(player.firstName)}</span>`
: '';
const idJs = JSON.stringify(player.id || player.number || ""); const idJs = JSON.stringify(player.id || player.number || "");
const nameJs = JSON.stringify(displayName); const nameJs = JSON.stringify(displayName);
@@ -2084,19 +2090,31 @@ function renderLineupRow(row) {
} }
row.innerHTML = ` row.innerHTML = `
<td class="num-cell">${escapeHtml(player.number)}</td> <td class="num-cell">${escapeHtml(player.number || "")}</td>
<td class="player-cell"> <td class="player-cell" title="Показать титр игрока">
<div class="player-inline"> <button
<div class="player-inline-text"> type="button"
<span class="last-name">${escapeHtml(player.lastName || player.name)}</span>${firstNameHtml} class="player-link-btn vmix-person-trigger"
data-vmix-person-type="player"
data-side="${escapeHtml(side)}"
data-name="${escapeHtml(displayName)}"
data-role="${escapeHtml(player.position || "")}"
>
<div class="player-inline">
<div class="player-inline-text">
<span class="last-name">${escapeHtml(player.lastName || player.name || "")}</span>${firstNameHtml}
</div>
<span class="badges">
${gkBadge}
${captainBadge}
${disciplineBadge}
</span>
</div> </div>
<span class="badges">${gkBadge}${captainBadge}${disciplineBadge}</span> </button>
</div>
</td> </td>
<td class="actions-col">${actionsHtml}</td> <td class="actions-col">${actionsHtml}</td>
`; `;
} }
function makeDraggable(el) { function makeDraggable(el) {
let dragging = false; let dragging = false;
@@ -3199,10 +3217,18 @@ function renderLiveCoachBlockForSide(side) {
block.innerHTML = source.map(c => ` block.innerHTML = source.map(c => `
<div class="coach-line"> <div class="coach-line">
<div class="coach-left"> <button
type="button"
class="coach-left vmix-person-trigger player-link-btn coach-link-btn"
data-vmix-person-type="coach"
data-side="${escapeHtml(side)}"
data-name="${escapeHtml(c.coach_name || "")}"
data-role="${escapeHtml(c.role || "")}"
title="Показать титр тренера"
>
<span class="coach-name">${escapeHtml(c.coach_name || "")}</span> <span class="coach-name">${escapeHtml(c.coach_name || "")}</span>
${c.role ? `<span class="coach-badge">${escapeHtml(c.role)}</span>` : ""} ${c.role ? `<span class="coach-badge">${escapeHtml(c.role)}</span>` : ""}
</div> </button>
<div class="coach-actions"> <div class="coach-actions">
<button <button
type="button" type="button"

View File

@@ -1249,13 +1249,37 @@
(function () { (function () {
const matchId = window.MATCH_DATA?.matchId; const matchId = window.MATCH_DATA?.matchId;
const sessionToken = window.MATCH_DATA?.sessionToken; const sessionToken = window.MATCH_DATA?.sessionToken;
const teamLogos = window.MATCH_DATA?.teamLogos || {};
if (!matchId || !sessionToken) { if (!matchId || !sessionToken) {
return; return;
} }
async function sendVmixPreviewInput(inputName) { function formatCoachName(rawName) {
if (!inputName) return; const parts = String(rawName || "").trim().split(/\s+/).filter(Boolean);
if (parts.length >= 2) {
return `${parts[1]} ${parts[0]}`;
}
return String(rawName || "").trim();
}
function formatPlayerName(rawName) {
const parts = String(rawName || "").trim().split(/\s+/).filter(Boolean);
if (parts.length >= 2) {
return `${parts[1]} ${parts[0]}`;
}
return String(rawName || "").trim();
}
async function sendNeutralPersonTitle(name, role, logoUrl) {
const inputName = "ИГРОК - НЕЙТРАЛЬНЫЙ";
const commands = [
`/api/?Function=SetText&Input=${encodeURIComponent(inputName)}&SelectedName=${encodeURIComponent("Тренер.Text")}&Value=${encodeURIComponent(name || "")}`,
`/api/?Function=SetText&Input=${encodeURIComponent(inputName)}&SelectedName=${encodeURIComponent("Должность.Text")}&Value=${encodeURIComponent(role || "")}`,
`/api/?Function=SetImage&Input=${encodeURIComponent(inputName)}&SelectedName=${encodeURIComponent("Лого.Source")}&Value=${encodeURIComponent(logoUrl || "")}`,
`/api/?Function=PreviewInput&Input=${encodeURIComponent(inputName)}`
];
try { try {
const response = await fetch("/api/vmix/publish-command", { const response = await fetch("/api/vmix/publish-command", {
@@ -1269,30 +1293,42 @@
body: JSON.stringify({ body: JSON.stringify({
match_id: matchId, match_id: matchId,
session_token: sessionToken, session_token: sessionToken,
commands: [ commands,
`/api/?Function=PreviewInput&Input=${encodeURIComponent(inputName)}`
],
meta: { meta: {
source: "tab_click", source: "person_click",
input_name: inputName title_input: inputName,
person_name: name,
person_role: role,
logo_url: logoUrl
} }
}) })
}); });
if (!response.ok) { if (!response.ok) {
console.error("Ошибка отправки команды в vMix:", response.status); console.error("Ошибка отправки титра в vMix:", response.status);
} }
} catch (error) { } catch (error) {
console.error("Не удалось отправить команду в vMix:", error); console.error("Не удалось отправить титр в vMix:", error);
} }
} }
document.addEventListener("click", function (event) { document.addEventListener("click", function (event) {
const link = event.target.closest(".tab-link[data-vmix-title]"); const trigger = event.target.closest(".vmix-person-trigger");
if (!link) return; if (!trigger) return;
const inputName = link.dataset.vmixTitle; const personType = (trigger.dataset.vmixPersonType || "").trim();
sendVmixPreviewInput(inputName); const side = (trigger.dataset.side || "").trim();
const rawName = (trigger.dataset.name || "").trim();
const role = (trigger.dataset.role || "").trim();
const logoUrl = side === "away" ? teamLogos.away : teamLogos.home;
if (!rawName) return;
const formattedName = personType === "coach"
? formatCoachName(rawName)
: formatPlayerName(rawName);
sendNeutralPersonTitle(formattedName, role, logoUrl);
}); });
})(); })();
</script> </script>