mirror of
https://github.com/myronblair/tomtomgames
synced 2026-06-30 17:51:08 -05:00
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:
@@ -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>
|
<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>
|
<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>
|
||||||
|
<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>
|
||||||
<div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px;margin-bottom:14px">
|
<div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px;margin-bottom:14px">
|
||||||
<div>
|
<div>
|
||||||
@@ -2742,6 +2768,24 @@ async function loadGames() {
|
|||||||
<span class="game-url-val">${escHtmlA(g.agent_password)}</span>
|
<span class="game-url-val">${escHtmlA(g.agent_password)}</span>
|
||||||
</div>` : ''}
|
</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.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>
|
</div>
|
||||||
<div style="text-align:right;flex-shrink:0">
|
<div style="text-align:right;flex-shrink:0">
|
||||||
@@ -2769,6 +2813,10 @@ function editGame(id) {
|
|||||||
document.getElementById('gf-agent-password').value= g.agent_password || '';
|
document.getElementById('gf-agent-password').value= g.agent_password || '';
|
||||||
document.getElementById('gf-games-link').value = g.games_link || '';
|
document.getElementById('gf-games-link').value = g.games_link || '';
|
||||||
document.getElementById('gf-agent-guide').value = g.agent_guide || '';
|
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').value = g.color || '#f0c040';
|
||||||
document.getElementById('gf-color-hex').value = g.color || '#f0c040';
|
document.getElementById('gf-color-hex').value = g.color || '#f0c040';
|
||||||
document.getElementById('gf-sort').value = g.sort_order;
|
document.getElementById('gf-sort').value = g.sort_order;
|
||||||
@@ -2788,6 +2836,10 @@ function resetGameForm() {
|
|||||||
document.getElementById('gf-agent-password').value= '';
|
document.getElementById('gf-agent-password').value= '';
|
||||||
document.getElementById('gf-games-link').value = '';
|
document.getElementById('gf-games-link').value = '';
|
||||||
document.getElementById('gf-agent-guide').value = '';
|
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').value = '#f0c040';
|
||||||
document.getElementById('gf-color-hex').value = '#f0c040';
|
document.getElementById('gf-color-hex').value = '#f0c040';
|
||||||
document.getElementById('gf-sort').value = '99';
|
document.getElementById('gf-sort').value = '99';
|
||||||
@@ -2813,6 +2865,10 @@ async function saveGame() {
|
|||||||
agent_password: document.getElementById('gf-agent-password').value.trim(),
|
agent_password: document.getElementById('gf-agent-password').value.trim(),
|
||||||
games_link: document.getElementById('gf-games-link').value.trim(),
|
games_link: document.getElementById('gf-games-link').value.trim(),
|
||||||
agent_guide: document.getElementById('gf-agent-guide').value.trim(),
|
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,
|
color: document.getElementById('gf-color-hex').value.trim() || document.getElementById('gf-color').value,
|
||||||
sort_order: parseInt(document.getElementById('gf-sort').value) || 99,
|
sort_order: parseInt(document.getElementById('gf-sort').value) || 99,
|
||||||
is_active: parseInt(document.getElementById('gf-active').value),
|
is_active: parseInt(document.getElementById('gf-active').value),
|
||||||
|
|||||||
+12
-4
@@ -42,13 +42,17 @@ switch ($action) {
|
|||||||
$agent_password = substr(trim($d['agent_password'] ?? ''), 0, 200);
|
$agent_password = substr(trim($d['agent_password'] ?? ''), 0, 200);
|
||||||
$games_link = substr(trim($d['games_link'] ?? ''), 0, 500);
|
$games_link = substr(trim($d['games_link'] ?? ''), 0, 500);
|
||||||
$agent_guide = trim($d['agent_guide'] ?? '');
|
$agent_guide = trim($d['agent_guide'] ?? '');
|
||||||
|
$sub_agent_login = substr(trim($d['sub_agent_login'] ?? ''), 0, 200);
|
||||||
|
$sub_agent_password= substr(trim($d['sub_agent_password'] ?? ''), 0, 200);
|
||||||
|
$cashier_login = substr(trim($d['cashier_login'] ?? ''), 0, 200);
|
||||||
|
$cashier_password = substr(trim($d['cashier_password'] ?? ''), 0, 200);
|
||||||
$color = preg_match('/^#[0-9a-fA-F]{3,8}$/', $d['color'] ?? '') ? $d['color'] : '#f0c040';
|
$color = preg_match('/^#[0-9a-fA-F]{3,8}$/', $d['color'] ?? '') ? $d['color'] : '#f0c040';
|
||||||
$sort_order = (int)($d['sort_order'] ?? 99);
|
$sort_order = (int)($d['sort_order'] ?? 99);
|
||||||
$is_active = isset($d['is_active']) ? (int)(bool)$d['is_active'] : 1;
|
$is_active = isset($d['is_active']) ? (int)(bool)$d['is_active'] : 1;
|
||||||
if (!$slug || !$name || !$player_url) { echo json_encode(['success'=>false,'error'=>'Slug, name, and player URL are required']); exit; }
|
if (!$slug || !$name || !$player_url) { echo json_encode(['success'=>false,'error'=>'Slug, name, and player URL are required']); exit; }
|
||||||
try {
|
try {
|
||||||
$stmt = db()->prepare("INSERT INTO platforms (slug,name,player_url,agent_link,agent_login,agent_password,games_link,agent_guide,color,sort_order,is_active) VALUES (?,?,?,?,?,?,?,?,?,?,?)");
|
$stmt = db()->prepare("INSERT INTO platforms (slug,name,player_url,agent_link,agent_login,agent_password,games_link,agent_guide,sub_agent_login,sub_agent_password,cashier_login,cashier_password,color,sort_order,is_active) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
|
||||||
$stmt->execute([$slug,$name,$player_url,$agent_link,$agent_login,$agent_password,$games_link,$agent_guide,$color,$sort_order,$is_active]);
|
$stmt->execute([$slug,$name,$player_url,$agent_link,$agent_login,$agent_password,$games_link,$agent_guide,$sub_agent_login,$sub_agent_password,$cashier_login,$cashier_password,$color,$sort_order,$is_active]);
|
||||||
echo json_encode(['success'=>true,'id'=>db()->lastInsertId()]);
|
echo json_encode(['success'=>true,'id'=>db()->lastInsertId()]);
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
echo json_encode(['success'=>false,'error'=>'Slug already exists or DB error']);
|
echo json_encode(['success'=>false,'error'=>'Slug already exists or DB error']);
|
||||||
@@ -67,12 +71,16 @@ switch ($action) {
|
|||||||
$agent_password = substr(trim($d['agent_password'] ?? ''), 0, 200);
|
$agent_password = substr(trim($d['agent_password'] ?? ''), 0, 200);
|
||||||
$games_link = substr(trim($d['games_link'] ?? ''), 0, 500);
|
$games_link = substr(trim($d['games_link'] ?? ''), 0, 500);
|
||||||
$agent_guide = trim($d['agent_guide'] ?? '');
|
$agent_guide = trim($d['agent_guide'] ?? '');
|
||||||
|
$sub_agent_login = substr(trim($d['sub_agent_login'] ?? ''), 0, 200);
|
||||||
|
$sub_agent_password= substr(trim($d['sub_agent_password'] ?? ''), 0, 200);
|
||||||
|
$cashier_login = substr(trim($d['cashier_login'] ?? ''), 0, 200);
|
||||||
|
$cashier_password = substr(trim($d['cashier_password'] ?? ''), 0, 200);
|
||||||
$color = preg_match('/^#[0-9a-fA-F]{3,8}$/', $d['color'] ?? '') ? $d['color'] : '#f0c040';
|
$color = preg_match('/^#[0-9a-fA-F]{3,8}$/', $d['color'] ?? '') ? $d['color'] : '#f0c040';
|
||||||
$sort_order = (int)($d['sort_order'] ?? 99);
|
$sort_order = (int)($d['sort_order'] ?? 99);
|
||||||
$is_active = (int)(bool)($d['is_active'] ?? 1);
|
$is_active = (int)(bool)($d['is_active'] ?? 1);
|
||||||
if (!$id || !$name || !$player_url) { echo json_encode(['success'=>false,'error'=>'ID, name, and player URL required']); exit; }
|
if (!$id || !$name || !$player_url) { echo json_encode(['success'=>false,'error'=>'ID, name, and player URL required']); exit; }
|
||||||
db()->prepare("UPDATE platforms SET name=?,player_url=?,agent_link=?,agent_login=?,agent_password=?,games_link=?,agent_guide=?,color=?,sort_order=?,is_active=? WHERE id=?")
|
db()->prepare("UPDATE platforms SET name=?,player_url=?,agent_link=?,agent_login=?,agent_password=?,games_link=?,agent_guide=?,sub_agent_login=?,sub_agent_password=?,cashier_login=?,cashier_password=?,color=?,sort_order=?,is_active=? WHERE id=?")
|
||||||
->execute([$name,$player_url,$agent_link,$agent_login,$agent_password,$games_link,$agent_guide,$color,$sort_order,$is_active,$id]);
|
->execute([$name,$player_url,$agent_link,$agent_login,$agent_password,$games_link,$agent_guide,$sub_agent_login,$sub_agent_password,$cashier_login,$cashier_password,$color,$sort_order,$is_active,$id]);
|
||||||
echo json_encode(['success'=>true]);
|
echo json_encode(['success'=>true]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user