commentary:

поправил отображение колонок для левого спортсмена в сезон/карьера и добавил галочки отображения нужных колонок
This commit is contained in:
2025-12-12 11:06:13 +03:00
parent d1d3567f2f
commit 358a58e2ff

View File

@@ -4177,6 +4177,11 @@ async def commentary():
<meta charset="utf-8" /> <meta charset="utf-8" />
<title>Комментаторский дашборд</title> <title>Комментаторский дашборд</title>
<style> <style>
.cmp-head th {{
text-align: center;
vertical-align: middle;
white-space: nowrap;
}}
/* подсветка ячеек PTS/Foul при обновлении (5 секунд) */ /* подсветка ячеек PTS/Foul при обновлении (5 секунд) */
.cell-updated {{ .cell-updated {{
background-color: #00ff00 !important; background-color: #00ff00 !important;
@@ -4965,29 +4970,39 @@ function renderPlayerHeader(p) {{
html += renderPlayerHeader(rightP || {{}}); html += renderPlayerHeader(rightP || {{}});
html += "</div>"; html += "</div>";
html += "<div class='compare-cols-controls' style='margin:8px 0 10px;display:flex;flex-wrap:wrap;gap:12px;align-items:center;'>";
html += " <span style='color:#bbb;'>Колонки:</span>";
html += " <label><input type='checkbox' class='cmp-col-toggle' data-col='cTot'> Карьера тотал</label>";
html += " <label><input type='checkbox' class='cmp-col-toggle' data-col='cAvg'> Карьера сред.</label>";
html += " <label><input type='checkbox' class='cmp-col-toggle' data-col='sTot'> Сезон тотал</label>";
html += " <label><input type='checkbox' class='cmp-col-toggle' data-col='sAvg'> Сезон сред.</label>";
html += "</div>";
// --- СТАРАЯ таблица: 4 колонки слева + 4 справа --- // --- СТАРАЯ таблица: 4 колонки слева + 4 справа ---
html += "<table class='details-wide-table' style='width:100%;border-collapse:collapse;'>"; html += "<table class='details-wide-table' style='width:100%;border-collapse:collapse;'>";
// шапка таблицы // шапка таблицы
html += "<thead>"; html += "<thead class='cmp-head'>";
html += "<tr>"; html += "<tr>";
html += "<th colspan='4' style='text-align:center;border-bottom:2px solid #333;'>Левый игрок</th>"; html += "<th id='cmp-left-title' colspan='4' style='text-align:center;border-bottom:2px solid #333;'>Левый игрок</th>";
html += "<th></th>"; html += "<th></th>";
html += "<th colspan='4' style='text-align:center;border-bottom:2px solid #333;'>Правый игрок</th>"; html += "<th id='cmp-right-title' colspan='4' style='text-align:center;border-bottom:2px solid #333;'>Правый игрок</th>";
html += "</tr>"; html += "</tr>";
html += "<tr>"; html += "<tr>";
html += "<th>Сезон (сред.)</th>"; // ЛЕВЫЙ (порядок: Карьера тотал, Карьера сред, Сезон тотал, Сезон сред)
html += "<th>Сезон (тотал)</th>"; html += "<th class='cmp-col col-cTot'>Карьера (тотал)</th>";
html += "<th>Карьера (сред.)</th>"; html += "<th class='cmp-col col-cAvg'>Карьера (сред.)</th>";
html += "<th>Карьера (тотал)</th>"; html += "<th class='cmp-col col-sTot'>Сезон (тотал)</th>";
html += "<th class='cmp-col col-sAvg'>Сезон (сред.)</th>";
html += "<th>Показатель</th>"; html += "<th>Показатель</th>";
html += "<th>Сезон (сред.)</th>"; // ПРАВЫЙ (можешь оставить свой порядок или сделать такой же — не важно для скрытия)
html += "<th>Сезон (тотал)</th>"; html += "<th class='cmp-col col-sAvg'>Сезон (сред.)</th>";
html += "<th>Карьера (сред.)</th>"; html += "<th class='cmp-col col-sTot'>Сезон (тотал)</th>";
html += "<th>Карьера (тотал)</th>"; html += "<th class='cmp-col col-cAvg'>Карьера (сред.)</th>";
html += "<th class='cmp-col col-cTot'>Карьера (тотал)</th>";
html += "</tr>"; html += "</tr>";
html += "</thead>"; html += "</thead>";
@@ -5000,20 +5015,21 @@ function renderPlayerHeader(p) {{
html += "<tr>"; html += "<tr>";
// левый // левый (тот же порядок что в шапке)
html += "<td style='text-align:center;'>" + safe(L.sAvg) + "</td>"; html += "<td class='cmp-col col-cTot' style='text-align:center;'>" + safe(L.cTot) + "</td>";
html += "<td style='text-align:center;'>" + safe(L.sTot) + "</td>"; html += "<td class='cmp-col col-cAvg' style='text-align:center;'>" + safe(L.cAvg) + "</td>";
html += "<td style='text-align:center;'>" + safe(L.cAvg) + "</td>"; html += "<td class='cmp-col col-sTot' style='text-align:center;'>" + safe(L.sTot) + "</td>";
html += "<td style='text-align:center;'>" + safe(L.cTot) + "</td>"; html += "<td class='cmp-col col-sAvg' style='text-align:center;'>" + safe(L.sAvg) + "</td>";
// показатель // показатель
html += "<td style='text-align:center;font-weight:600;'>" + safe(base[i].label || "") + "</td>"; html += "<td style='text-align:center;font-weight:600;'>" + safe(base[i].label || "") + "</td>";
// правый // правый (как у тебя было)
html += "<td style='text-align:center;'>" + safe(R.sAvg) + "</td>"; html += "<td class='cmp-col col-sAvg' style='text-align:center;'>" + safe(R.sAvg) + "</td>";
html += "<td style='text-align:center;'>" + safe(R.sTot) + "</td>"; html += "<td class='cmp-col col-sTot' style='text-align:center;'>" + safe(R.sTot) + "</td>";
html += "<td style='text-align:center;'>" + safe(R.cAvg) + "</td>"; html += "<td class='cmp-col col-cAvg' style='text-align:center;'>" + safe(R.cAvg) + "</td>";
html += "<td style='text-align:center;'>" + safe(R.cTot) + "</td>"; html += "<td class='cmp-col col-cTot' style='text-align:center;'>" + safe(R.cTot) + "</td>";
html += "</tr>"; html += "</tr>";
}} }}
@@ -5029,10 +5045,80 @@ function renderPlayerHeader(p) {{
// Всегда рисуем вертикальную сравнительную таблицу. // Всегда рисуем вертикальную сравнительную таблицу.
// Если один из игроков не выбран — его половина будет пустой. // Если один из игроков не выбран — его половина будет пустой.
details.innerHTML = renderPlayersComparison(selectedLeft, selectedRight); details.innerHTML = renderPlayersComparison(selectedLeft, selectedRight);
if (window.applyCompareColsUI) window.applyCompareColsUI();
}} else {{ }} else {{
details.innerHTML = '<div class="meta">Кликни по фамилии игрока, чтобы показать сезон/карьеру.</div>'; details.innerHTML = '<div class="meta">Кликни по фамилии игрока, чтобы показать сезон/карьеру.</div>';
}} }}
}} }}
function getCompareColsState() {{
// по умолчанию все включены
var def = {{ cTot: true, cAvg: true, sTot: true, sAvg: true }};
try {{
var raw = localStorage.getItem("commentary_compare_cols");
if (!raw) return def;
var obj = JSON.parse(raw);
return Object.assign(def, obj || {{}});
}} catch (e) {{
return def;
}}
}}
function saveCompareColsState(state) {{
localStorage.setItem("commentary_compare_cols", JSON.stringify(state || {{}}));
}}
function applyCompareColsUI() {{
// навешиваем чекбоксы и применяем видимость колонок
var state = getCompareColsState();
// синхронизируем чекбоксы
var toggles = document.querySelectorAll(".cmp-col-toggle");
for (var i = 0; i < toggles.length; i++) {{
var cb = toggles[i];
var key = cb.getAttribute("data-col");
cb.checked = !!state[key];
cb.onchange = function () {{
var k = this.getAttribute("data-col");
var s = getCompareColsState();
s[k] = !!this.checked;
saveCompareColsState(s);
applyCompareColsVisibility(s);
}};
}}
applyCompareColsVisibility(state);
}}
function applyCompareColsVisibility(state) {{
state = state || getCompareColsState();
// 1) скрыть/показать сами th/td
["cTot","cAvg","sTot","sAvg"].forEach(function (k) {{
var show = !!state[k];
var els = document.querySelectorAll(".cmp-col.col-" + k);
for (var i = 0; i < els.length; i++) {{
els[i].style.display = show ? "table-cell" : "none";
}}
}});
// 2) поправить colspan у "Левый/Правый"
var visibleCount = ["cTot","cAvg","sTot","sAvg"].reduce(function (acc, k) {{
return acc + (state[k] ? 1 : 0);
}}, 0);
// чтобы совсем не схлопывалось, если всё сняли
if (visibleCount < 1) visibleCount = 1;
var leftTitle = document.getElementById("cmp-left-title");
var rightTitle = document.getElementById("cmp-right-title");
if (leftTitle) leftTitle.colSpan = visibleCount;
if (rightTitle) rightTitle.colSpan = visibleCount;
}}
// чтобы можно было вызвать после перерендера
window.applyCompareColsUI = applyCompareColsUI;
// выбор/снятие выбора игрока // выбор/снятие выбора игрока
function selectPlayer(teamKey, pid, noScroll, noSave) {{ function selectPlayer(teamKey, pid, noScroll, noSave) {{