mirror of
https://github.com/kbenestad/ClubLedger.git
synced 2026-06-18 09:44:33 +00:00
Fix 1: Replace free-text staff name with a dropdown populated from staff.json
via GET/POST/DELETE /staff endpoints. Staff management panel on cashier page
(type name, Add button, chip list with × remove). Dropdown remembers last
selection per session via sessionStorage.
Fix 2: Split single-page app into /cashier (register + top-up + member list +
staff management) and /bar (charge only). Each page is its own HTML file
with two plain <a> nav links; / redirects to /cashier. Shared helpers
extracted to common.js; page logic in cashier.js and bar.js.
Fix 3: Statement view gains an A4/A5 radio toggle that rewrites a dynamic
<style> @page rule before the browser print dialog opens. Defaults to A4.
Fix 4: POST /topup and POST /charge now return entry_id. Each successful
transaction opens /receipt/{entry_id} in a new tab — server-rendered HTML
showing member name/number, type, amount, balance-after (computed as running
sum up to that entry), staff, note, timestamp. Same A4/A5 print toggle.
https://claude.ai/code/session_01JuRTR5Xjx8emQsyerBgGU7
63 lines
1.9 KiB
HTML
63 lines
1.9 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>Bar – ClubLedger</title>
|
||
<link rel="stylesheet" href="/static/style.css">
|
||
</head>
|
||
<body>
|
||
|
||
<nav>
|
||
<span class="brand" id="navBrand">ClubLedger</span>
|
||
<a class="nav-link" href="/cashier">Cashier</a>
|
||
<a class="nav-link active" href="/bar">Bar</a>
|
||
</nav>
|
||
|
||
<div class="view">
|
||
|
||
<div class="panel">
|
||
<h2>Charge Account</h2>
|
||
<div class="search-row">
|
||
<input type="text" id="barSearch" placeholder="Search member…">
|
||
<button class="btn" onclick="barSearchMembers()">Search</button>
|
||
</div>
|
||
<div id="barMemberList" class="member-pick-list"></div>
|
||
|
||
<div id="barForm" class="hidden">
|
||
<div class="selected-member-box" id="barSelected"></div>
|
||
|
||
<div class="form-row">
|
||
<label>Product Search</label>
|
||
<input type="text" id="barProductSearch" placeholder="Search products…" oninput="barProductLookup()">
|
||
</div>
|
||
<div id="barProductResults" class="product-results"></div>
|
||
|
||
<div class="form-row">
|
||
<label>Amount (<span class="currency-unit"></span>)</label>
|
||
<input type="number" id="barAmount" placeholder="e.g. 350" min="1" step="1">
|
||
</div>
|
||
<div class="form-row">
|
||
<label>PIN</label>
|
||
<input type="password" id="barPin" placeholder="Member PIN" maxlength="20">
|
||
</div>
|
||
<div class="form-row">
|
||
<label>Staff</label>
|
||
<select id="barStaff"></select>
|
||
</div>
|
||
<div class="form-row">
|
||
<label>Note (optional)</label>
|
||
<input type="text" id="barNote" placeholder="">
|
||
</div>
|
||
<button class="btn btn-danger" onclick="doCharge()">Charge</button>
|
||
<button class="btn" onclick="clearBarSelection()">Cancel</button>
|
||
</div>
|
||
<div id="barMsg" class="msg"></div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<script src="/static/common.js"></script>
|
||
<script src="/static/bar.js"></script>
|
||
</body>
|
||
</html>
|