Add sub-account and cashier credential fields to game management

- DB: added sub_agent_login, sub_agent_password, cashier_login, cashier_password to platforms table
- API: create/update handle all 4 new fields
- Admin: Sub-Account and Cashier sections added inside Agent Info box; game list cards display all new fields

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-04 17:51:37 +00:00
parent 0aec13daf4
commit 99079340cb
2 changed files with 76 additions and 12 deletions
+62 -6
View File
@@ -818,6 +818,32 @@ tr:hover td{background:rgba(255,255,255,.015)}
<label class="gm-edit-label">Agent Guide <span style="font-weight:400;color:var(--text2)">notes, instructions, tips</span></label>
<textarea class="fi-sm" id="gf-agent-guide" rows="3" placeholder="Step-by-step agent instructions, notes, or tips..." style="width:100%;padding:10px 12px;resize:vertical;font-family:inherit;font-size:14px"></textarea>
</div>
<div style="border-top:1px solid rgba(155,93,229,0.2);margin-top:12px;padding-top:12px">
<div style="font-size:11px;font-weight:700;color:var(--purple);letter-spacing:1px;text-transform:uppercase;margin-bottom:8px">Sub-Account</div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:10px">
<div>
<label class="gm-edit-label">Sub-Account Agent Login</label>
<input class="fi-sm" id="gf-sub-agent-login" type="text" placeholder="Username or email" style="width:100%;padding:10px 12px">
</div>
<div>
<label class="gm-edit-label">Sub-Account Agent Password</label>
<input class="fi-sm" id="gf-sub-agent-password" type="text" placeholder="Password" style="width:100%;padding:10px 12px">
</div>
</div>
</div>
<div style="border-top:1px solid rgba(155,93,229,0.2);margin-top:12px;padding-top:12px">
<div style="font-size:11px;font-weight:700;color:var(--purple);letter-spacing:1px;text-transform:uppercase;margin-bottom:8px">Cashier</div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:10px">
<div>
<label class="gm-edit-label">Cashier Login</label>
<input class="fi-sm" id="gf-cashier-login" type="text" placeholder="Username or email" style="width:100%;padding:10px 12px">
</div>
<div>
<label class="gm-edit-label">Cashier Password</label>
<input class="fi-sm" id="gf-cashier-password" type="text" placeholder="Password" style="width:100%;padding:10px 12px">
</div>
</div>
</div>
</div>
<div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px;margin-bottom:14px">
<div>
@@ -2742,6 +2768,24 @@ async function loadGames() {
<span class="game-url-val">${escHtmlA(g.agent_password)}</span>
</div>` : ''}
${g.agent_guide ? `<div style="margin-top:6px;padding:8px 10px;background:rgba(155,93,229,0.07);border-radius:6px;font-size:12px;color:var(--text2);white-space:pre-wrap;max-height:80px;overflow:auto"><span style="color:var(--purple);font-weight:700;font-size:11px;letter-spacing:1px">AGENT GUIDE </span>${escHtmlA(g.agent_guide)}</div>` : ''}
${(g.sub_agent_login||g.sub_agent_password) ? `<div style="margin-top:4px;font-size:11px;font-weight:700;color:var(--purple);letter-spacing:1px;text-transform:uppercase;margin-bottom:2px">SUB-ACCOUNT</div>` : ''}
${g.sub_agent_login ? `<div class="game-url-row">
<span class="game-url-label" style="color:var(--purple)">LOGIN</span>
<span class="game-url-val">${escHtmlA(g.sub_agent_login)}</span>
</div>` : ''}
${g.sub_agent_password ? `<div class="game-url-row">
<span class="game-url-label" style="color:var(--purple)">PASSWORD</span>
<span class="game-url-val">${escHtmlA(g.sub_agent_password)}</span>
</div>` : ''}
${(g.cashier_login||g.cashier_password) ? `<div style="margin-top:4px;font-size:11px;font-weight:700;color:var(--cyan);letter-spacing:1px;text-transform:uppercase;margin-bottom:2px">CASHIER</div>` : ''}
${g.cashier_login ? `<div class="game-url-row">
<span class="game-url-label" style="color:var(--cyan)">LOGIN</span>
<span class="game-url-val">${escHtmlA(g.cashier_login)}</span>
</div>` : ''}
${g.cashier_password ? `<div class="game-url-row">
<span class="game-url-label" style="color:var(--cyan)">PASSWORD</span>
<span class="game-url-val">${escHtmlA(g.cashier_password)}</span>
</div>` : ''}
</div>
</div>
<div style="text-align:right;flex-shrink:0">
@@ -2768,8 +2812,12 @@ function editGame(id) {
document.getElementById('gf-agent-login').value = g.agent_login || '';
document.getElementById('gf-agent-password').value= g.agent_password || '';
document.getElementById('gf-games-link').value = g.games_link || '';
document.getElementById('gf-agent-guide').value = g.agent_guide || '';
document.getElementById('gf-color').value = g.color || '#f0c040';
document.getElementById('gf-agent-guide').value = g.agent_guide || '';
document.getElementById('gf-sub-agent-login').value = g.sub_agent_login || '';
document.getElementById('gf-sub-agent-password').value = g.sub_agent_password || '';
document.getElementById('gf-cashier-login').value = g.cashier_login || '';
document.getElementById('gf-cashier-password').value = g.cashier_password || '';
document.getElementById('gf-color').value = g.color || '#f0c040';
document.getElementById('gf-color-hex').value = g.color || '#f0c040';
document.getElementById('gf-sort').value = g.sort_order;
document.getElementById('gf-active').value = g.is_active;
@@ -2787,8 +2835,12 @@ function resetGameForm() {
document.getElementById('gf-agent-login').value = '';
document.getElementById('gf-agent-password').value= '';
document.getElementById('gf-games-link').value = '';
document.getElementById('gf-agent-guide').value = '';
document.getElementById('gf-color').value = '#f0c040';
document.getElementById('gf-agent-guide').value = '';
document.getElementById('gf-sub-agent-login').value = '';
document.getElementById('gf-sub-agent-password').value = '';
document.getElementById('gf-cashier-login').value = '';
document.getElementById('gf-cashier-password').value = '';
document.getElementById('gf-color').value = '#f0c040';
document.getElementById('gf-color-hex').value = '#f0c040';
document.getElementById('gf-sort').value = '99';
document.getElementById('gf-active').value = '1';
@@ -2812,8 +2864,12 @@ async function saveGame() {
agent_login: document.getElementById('gf-agent-login').value.trim(),
agent_password: document.getElementById('gf-agent-password').value.trim(),
games_link: document.getElementById('gf-games-link').value.trim(),
agent_guide: document.getElementById('gf-agent-guide').value.trim(),
color: document.getElementById('gf-color-hex').value.trim() || document.getElementById('gf-color').value,
agent_guide: document.getElementById('gf-agent-guide').value.trim(),
sub_agent_login: document.getElementById('gf-sub-agent-login').value.trim(),
sub_agent_password: document.getElementById('gf-sub-agent-password').value.trim(),
cashier_login: document.getElementById('gf-cashier-login').value.trim(),
cashier_password: document.getElementById('gf-cashier-password').value.trim(),
color: document.getElementById('gf-color-hex').value.trim() || document.getElementById('gf-color').value,
sort_order: parseInt(document.getElementById('gf-sort').value) || 99,
is_active: parseInt(document.getElementById('gf-active').value),
};