fix player win % and visual overhaul

This commit is contained in:
SowinskiBraeden committed 2026-09-05 19:19:46 -07:00
1 parent 1b9f9510ec
commit 5c09266d75
16 files changed
+3123 -1490

No files matched your search

+66 -4
View File
@@ -43,15 +43,27 @@
<p class="kicker" style="margin:0;">Roster</p>
<h2 class="panel__title">Active players</h2>
</div>
<span class="panel__tag">{{ active_players|length }} players</span>
{% if active_players %}
<div class="player-toolbar">
<input id="playerSearch" type="search" placeholder="Search players…" autocomplete="off"
class="player-search">
<div class="player-view-toggle" role="group" aria-label="Player view">
<button class="player-view-toggle__btn is-on" type="button" data-player-view="cards" aria-pressed="true">Cards</button>
<button class="player-view-toggle__btn" type="button" data-player-view="list" aria-pressed="false">List</button>
</div>
<span class="panel__tag" id="playerCount">{{ active_players|length }} players</span>
</div>
{% else %}
<span class="panel__tag">0 players</span>
{% endif %}
</div>
{% if active_players %}
<div class="player-grid">
<div class="player-grid" id="playerGrid">
{% for player in active_players %}
{% set stats = stats_by_name.get(player.display_name) %}
{% set initials = player.display_name.split()|map('first')|join('')|upper %}
{% set avatar_cls = 'player-avatar--pos' if stats and stats.total_net_cents > 0 else 'player-avatar--neg' if stats and stats.total_net_cents < 0 else '' %}
<div class="player-card">
<div class="player-card" data-player-name="{{ player.display_name | lower }}">
<div class="player-card__head">
<div class="player-avatar {{ avatar_cls }}">{{ initials[:2] }}</div>
<div class="player-card__name-block">
@@ -87,7 +99,7 @@
</div>
<div class="player-card__stat">
<span class="kicker">Win rate</span>
<span class="player-card__stat-val">{{ "%.0f"|format(stats.win_pct * 100) }}%</span>
<span class="player-card__stat-val">{{ "%.0f"|format(stats.win_pct) }}%</span>
</div>
<div class="player-card__stat">
<span class="kicker">Best win</span>
@@ -98,6 +110,7 @@
</div>
{% endfor %}
</div>
<p class="player-grid__empty" id="playerSearchEmpty">No players match your search.</p>
{% else %}
<div class="empty-panel">
<p class="kicker">Empty roster</p>
@@ -147,6 +160,55 @@
</div>
{% endif %}
<script>
(function () {
var input = document.getElementById('playerSearch');
var grid = document.getElementById('playerGrid');
var empty = document.getElementById('playerSearchEmpty');
var count = document.getElementById('playerCount');
var viewButtons = Array.from(document.querySelectorAll('[data-player-view]'));
if (!input || !grid) return;
var cards = Array.from(grid.querySelectorAll('.player-card'));
var total = cards.length;
function setView(view) {
var nextView = view === 'list' ? 'list' : 'cards';
grid.dataset.view = nextView;
try { window.localStorage.setItem('myboker.playerView', nextView); } catch (e) {}
viewButtons.forEach(function (button) {
var active = button.dataset.playerView === nextView;
button.classList.toggle('is-on', active);
button.setAttribute('aria-pressed', active ? 'true' : 'false');
});
}
viewButtons.forEach(function (button) {
button.addEventListener('click', function () {
setView(this.dataset.playerView);
});
});
try {
setView(window.localStorage.getItem('myboker.playerView') || 'cards');
} catch (e) {
setView('cards');
}
input.addEventListener('input', function () {
var q = this.value.trim().toLowerCase();
var visible = 0;
cards.forEach(function (card) {
var name = card.dataset.playerName || '';
var show = !q || name.includes(q);
card.style.display = show ? '' : 'none';
if (show) visible++;
});
if (empty) empty.style.display = (q && visible === 0) ? 'block' : 'none';
if (count) count.textContent = (q ? visible + ' of ' + total : total) + ' players';
});
})();
</script>
{% if can_manage %}
<div class="modal-backdrop" id="modal-edit-player" hidden>
<div class="modal-card" role="dialog" aria-modal="true" aria-labelledby="modal-edit-player-title">