← back to AbramsOS
views/purchases.ejs
60 lines
<%- include('partials/header', { title: 'Purchases' }) %>
<section class="page-head">
<h1>Purchases</h1>
<div class="grid-controls">
<label>Sort
<select id="sortSelect">
<option value="date-desc">Newest</option>
<option value="date-asc">Oldest</option>
<option value="merchant">Merchant A→Z</option>
<option value="amount-desc">Total ↓</option>
<option value="amount-asc">Total ↑</option>
</select>
</label>
<label>Density
<input id="densityRange" type="range" min="180" max="420" step="10" value="280">
</label>
</div>
</section>
<% if (!purchases.length) { %>
<section class="empty glass">
<p>No purchases yet. <a href="/connectors">Sync a connector</a> to ingest receipts.</p>
</section>
<% } else { %>
<section id="purchaseGrid" class="purchase-grid" style="grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));">
<% purchases.forEach(p => { %>
<article class="purchase glass"
data-merchant="<%= (p.merchant_name || '').toLowerCase() %>"
data-amount="<%= p.total_amount || 0 %>"
data-date="<%= new Date(p.purchase_date).toISOString() %>">
<header>
<h3><%= p.merchant_name %></h3>
<% if (p.confidence != null) { %>
<span class="confidence" title="Extraction confidence"><%= Math.round(Number(p.confidence) * 100) %>%</span>
<% } %>
</header>
<div class="amount">
<% if (p.total_amount) { %>
<%= p.currency || 'USD' %> <%= Number(p.total_amount).toFixed(2) %>
<% } else { %>
<span class="subtle">amount unknown</span>
<% } %>
</div>
<dl class="meta">
<dt>Date</dt><dd><%= new Date(p.purchase_date).toLocaleDateString() %></dd>
<% if (p.order_number) { %>
<dt>Order</dt><dd><%= p.order_number %></dd>
<% } %>
<% if (p.merchant_domain) { %>
<dt>Domain</dt><dd><%= p.merchant_domain %></dd>
<% } %>
</dl>
</article>
<% }) %>
</section>
<% } %>
<%- include('partials/footer', { gridScript: true }) %>