Files
mtg-league/views/session.ejs
T
derekandClaude Opus 5.5 0e14228b8f Upload several Melee exports at once; let admins delete leagues
- The session import takes many files (every round's matches export plus
  the standings export) in one transaction; a bad file, a round repeated
  across files, or two standings exports rejects the whole batch.
- Delete league (with its sessions and results; players are kept).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 17:11:10 +00:00

39 lines
3.1 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<%- include('head') %>
<% if (admin) { %><datalist id="decks"><% known.forEach(k => { %><option value="<%= k %>"><% }) %></datalist><% } %>
<h1><%= lg.name %> – Session <%= gs.number %> (<%= gs.date %>)</h1>
<p><a href="<%= base %>/league/<%= lg.id %>">← Standings</a></p>
<% rounds.forEach(r => { %><h2>Round <%= r.round %></h2><table>
<% r.matches.forEach(m => { %><tr>
<td><%= m.p1 %> <small>(<%= m.p1_deck || '?' %>)</small></td>
<td><% if (m.p2) { %><%= m.p2 %> <small>(<%= m.p2_deck || '?' %>)</small><% } else { %><i>BYE</i><% } %></td>
<td><b><%= m.p1_wins %>–<%= m.p2_wins %><%= m.draws ? '–' + m.draws : '' %></b></td></tr>
<% }) %></table><% }) %>
<% if (!rounds.length && !results.length) { %><p>No results yet.</p><% } %>
<% if (admin && matchPlayers.length) { %><h2>Decks played</h2>
<form method="post" action="<%= base %>/admin/session/<%= gs.id %>/match-decks"><table><tr><th>Player</th><th>Deck</th></tr>
<% matchPlayers.forEach(p => { %><tr><td><%= p.name %></td><td><input name="mdeck_<%= p.id %>" value="<%= p.deck || '' %>" list="decks"></td></tr><% }) %></table>
<button>Save decks</button></form><% } %>
<% if (results.length) { %><h2>Standings <small>(imported)</small></h2>
<form method="post" action="<%= base %>/admin/session/<%= gs.id %>/decks">
<table><tr><th>Player</th><th>Points</th><th>W-D-L</th><th>Deck</th></tr>
<% results.forEach(r => { %><tr><td><%= r.name %></td><td><b><%= r.points %></b></td><td><%= r.rec %></td>
<td><% if (admin) { %><input name="deck_<%= r.id %>" value="<%= r.deck || '' %>" list="decks"><% } else { %><%= r.deck || '' %><% } %></td></tr><% }) %></table>
<% if (admin) { %><button>Save decks</button><% } %>
</form>
<p><small>If this session also has match rows, those are used for scoring instead.</small></p><% } %>
<% if (admin) { %>
<h2>Import Melee export</h2>
<p>Upload the night's Melee exports (JSON or CSV): select every round's <b>matches</b> export and/or the <b>standings</b> export at once, or paste one.
Re-importing a round replaces just that round; a standings export replaces the imported standings. Decks you've entered are kept.
If anything in the batch is invalid, nothing is imported. If a session has matches, they are used for scoring.</p>
<form method="post" enctype="multipart/form-data" action="<%= base %>/admin/session/<%= gs.id %>/import-melee">
<input type="file" name="files" accept=".csv,.json,.txt" multiple><br>
<textarea name="data" rows="5" style="width:100%;font-family:monospace" placeholder="...or paste here"></textarea><br><button>Import</button></form>
<h2>Import matches by hand</h2>
<p>One match per line: <code>round, player1, deck1, player2, deck2, p1 wins, p2 wins, draws</code>. Leave player 2 blank for a bye.
Comma- or tab-separated. Saving <b>replaces</b> this session's matches.</p>
<form method="post" action="<%= base %>/admin/session/<%= gs.id %>/import">
<textarea name="data" rows="12" style="width:100%;font-family:monospace"><%= csvtext %></textarea><br><button>Save matches</button></form>
<form method="post" action="<%= base %>/admin/session/<%= gs.id %>/delete" data-confirm="Delete this session and its results?"><button>Delete session</button></form>
<% } %>