тест простой подписи игроков и тренеров по клику из веб морды

This commit is contained in:
2026-04-21 14:19:51 +03:00
parent de7c798837
commit ac1904f538

View File

@@ -246,7 +246,14 @@
<div class="coaches-block" id="homeCoachesBlock"> <div class="coaches-block" id="homeCoachesBlock">
{% for c in coaches.home %} {% for c in coaches.home %}
<div class="coach-line"> <div class="coach-line">
<div class="coach-left"> <div
class="coach-left vmix-person-trigger"
data-vmix-person-type="coach"
data-side="home"
data-name="{{ c.coach_name }}"
data-role="{{ c.role or '' }}"
title="Показать титр тренера"
>
<span class="coach-name">{{ c.coach_name }}</span> <span class="coach-name">{{ c.coach_name }}</span>
{% if c.role %} {% if c.role %}
<span class="coach-badge">{{ c.role }}</span> <span class="coach-badge">{{ c.role }}</span>
@@ -303,8 +310,15 @@
data-player-captain="{{ 1 if p.is_captain else 0 }}" data-player-captain="{{ 1 if p.is_captain else 0 }}"
> >
<td class="num-cell">{{ p.number }}</td> <td class="num-cell">{{ p.number }}</td>
<td class="player-cell"> <td
<div class="player-inline"> class="player-cell vmix-person-trigger"
data-vmix-person-type="player"
data-side="{{ 'home' if true else 'away' }}"
data-name="{{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim }}"
data-role="{{ p.position or '' }}"
title="Показать титр игрока"
>
<div class="player-inline">
<div class="player-inline-text"> <div class="player-inline-text">
<span <span
class="last-name" class="last-name"
@@ -408,8 +422,15 @@
data-player-captain="{{ 1 if p.is_captain else 0 }}" data-player-captain="{{ 1 if p.is_captain else 0 }}"
> >
<td class="num-cell">{{ p.number }}</td> <td class="num-cell">{{ p.number }}</td>
<td class="player-cell"> <td
<div class="player-inline"> class="player-cell vmix-person-trigger"
data-vmix-person-type="player"
data-side="{{ 'home' if true else 'away' }}"
data-name="{{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim }}"
data-role="{{ p.position or '' }}"
title="Показать титр игрока"
>
<div class="player-inline">
<div class="player-inline-text"> <div class="player-inline-text">
<span <span
class="last-name" class="last-name"
@@ -458,7 +479,14 @@
> >
{% for c in coaches.away %} {% for c in coaches.away %}
<div class="coach-line"> <div class="coach-line">
<div class="coach-left"> <div
class="coach-left vmix-person-trigger"
data-vmix-person-type="coach"
data-side="away"
data-name="{{ c.coach_name }}"
data-role="{{ c.role or '' }}"
title="Показать титр тренера"
>
<span class="coach-name">{{ c.coach_name }}</span> <span class="coach-name">{{ c.coach_name }}</span>
{% if c.role %} {% if c.role %}
<span class="coach-badge">{{ c.role }}</span> <span class="coach-badge">{{ c.role }}</span>
@@ -515,8 +543,14 @@
data-player-captain="{{ 1 if p.is_captain else 0 }}" data-player-captain="{{ 1 if p.is_captain else 0 }}"
> >
<td class="num-cell">{{ p.number }}</td> <td class="num-cell">{{ p.number }}</td>
<td class="player-cell"> <td
<div class="player-inline"> class="player-cell vmix-person-trigger"
data-vmix-person-type="player"
data-side="away"
data-name="{{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim }}"
data-role="{{ p.position or '' }}"
title="Показать титр игрока"
>
<div class="player-inline-text"> <div class="player-inline-text">
<span <span
class="last-name" class="last-name"
@@ -620,8 +654,14 @@
data-player-captain="{{ 1 if p.is_captain else 0 }}" data-player-captain="{{ 1 if p.is_captain else 0 }}"
> >
<td class="num-cell">{{ p.number }}</td> <td class="num-cell">{{ p.number }}</td>
<td class="player-cell"> <td
<div class="player-inline"> class="player-cell vmix-person-trigger"
data-vmix-person-type="player"
data-side="away"
data-name="{{ ((p.last_name or p.player_name or '') ~ ' ' ~ (p.first_name or '')) | trim }}"
data-role="{{ p.position or '' }}"
title="Показать титр игрока"
>
<div class="player-inline-text"> <div class="player-inline-text">
<span <span
class="last-name" class="last-name"
@@ -932,35 +972,39 @@
</div> </div>
</div> </div>
<script> <script>
window.MATCH_DATA = { window.MATCH_DATA = {
teamNames: { teamNames: {
home: {{ session[14] | tojson }}, home: {{ session[14] | tojson }},
away: {{ session[17] | tojson }} away: {{ session[17] | tojson }}
}, },
sessionToken: {{ session[3] | tojson }}, teamLogos: {
matchId: {{ session[1] | tojson }}, home: {{ session[15] | tojson }},
away: {{ session[18] | tojson }}
},
sessionToken: {{ session[3] | tojson }},
matchId: {{ session[1] | tojson }},
homeFormations: {{ home_formations | tojson }}, homeFormations: {{ home_formations | tojson }},
awayFormations: {{ away_formations | tojson }}, awayFormations: {{ away_formations | tojson }},
homeStarting: {{ lineups.home_starting | tojson }}, homeStarting: {{ lineups.home_starting | tojson }},
awayStarting: {{ lineups.away_starting | tojson }}, awayStarting: {{ lineups.away_starting | tojson }},
homeBench: {{ lineups.home_bench | tojson }}, homeBench: {{ lineups.home_bench | tojson }},
awayBench: {{ lineups.away_bench | tojson }}, awayBench: {{ lineups.away_bench | tojson }},
homeCoaches: {{ coaches.home | tojson }}, homeCoaches: {{ coaches.home | tojson }},
awayCoaches: {{ coaches.away | tojson }}, awayCoaches: {{ coaches.away | tojson }},
referees: {{ referees | tojson }}, referees: {{ referees | tojson }},
refereePool: {{ referee_pool | tojson }}, refereePool: {{ referee_pool | tojson }},
homeSquadPool: [], homeSquadPool: [],
awaySquadPool: [], awaySquadPool: [],
homeCoachPool: [], homeCoachPool: [],
awayCoachPool: [] awayCoachPool: []
}; };
</script> </script>
<div class="formation-modal" id="formationAssignModal"> <div class="formation-modal" id="formationAssignModal">
<div <div
class="formation-modal-backdrop" class="formation-modal-backdrop"
@@ -1382,6 +1426,72 @@
} }
}); });
})(); })();
</script>
<script>
(function () {
const matchId = window.MATCH_DATA?.matchId;
const sessionToken = window.MATCH_DATA?.sessionToken;
const teamLogos = window.MATCH_DATA?.teamLogos || {};
if (!matchId || !sessionToken) {
return;
}
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 {
const response = await fetch("/api/vmix/publish-command", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Accept": "application/json",
"X-Requested-With": "XMLHttpRequest"
},
credentials: "same-origin",
body: JSON.stringify({
match_id: matchId,
session_token: sessionToken,
commands,
meta: {
source: "person_click",
title_input: inputName,
person_name: name,
person_role: role,
logo_url: logoUrl
}
})
});
if (!response.ok) {
console.error("Ошибка отправки титра в vMix:", response.status);
}
} catch (error) {
console.error("Не удалось отправить титр в vMix:", error);
}
}
document.addEventListener("click", function (event) {
const trigger = event.target.closest(".vmix-person-trigger");
if (!trigger) return;
const side = trigger.dataset.side;
const name = (trigger.dataset.name || "").trim();
const role = (trigger.dataset.role || "").trim();
const logoUrl = side === "away" ? teamLogos.away : teamLogos.home;
if (!name) return;
sendNeutralPersonTitle(name, role, logoUrl);
});
})();
</script> </script>
</body> </body>
</html> </html>