- Added ✏️ edit button on every expense in the list
- Clicking loads the receipt form pre-filled with the expense data
- Changes are saved via PUT /expenses/{id}
- Receipt form auto-switches between create (POST) and edit (PUT) mode
- Full HTMX multi-target response: form resets + list refreshes
55 lines
2.5 KiB
HTML
55 lines
2.5 KiB
HTML
<div id="expense-list">
|
|
<h3 style="margin-bottom: 1rem;">Expenses ({{len .Expenses}})</h3>
|
|
|
|
{{if .Expenses}}
|
|
<div class="expense-list">
|
|
{{range .Expenses}}
|
|
<div class="expense-item">
|
|
<div class="expense-item-icon">
|
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
<rect x="3" y="3" width="18" height="18" rx="2" ry="2"/>
|
|
<circle cx="8.5" cy="8.5" r="1.5"/>
|
|
<polyline points="21 15 16 10 5 21"/>
|
|
</svg>
|
|
</div>
|
|
<div class="expense-item-info">
|
|
<div class="expense-item-merchant">{{.Merchant}}</div>
|
|
<div class="expense-item-meta">{{.Date}} · {{.Category}}</div>
|
|
{{if .Description}}
|
|
<div class="expense-item-desc">{{.Description}}</div>
|
|
{{end}}
|
|
</div>
|
|
<div class="expense-item-amount">
|
|
<span class="amount">{{printf "%.2f" .Amount}}</span>
|
|
<span class="currency">{{.Currency}}</span>
|
|
{{if .ConvertedAmount}}
|
|
<div style="font-size: 0.75rem; color: #166534;">
|
|
≈ {{printf "%.2f" .ConvertedAmount}} {{.BaseCurrency}}
|
|
</div>
|
|
{{end}}
|
|
</div>
|
|
<div style="display: flex; align-items: center; margin-left: 0.5rem;">
|
|
<button class="btn btn-sm" style="background: none; border: 1px solid #d1d5db; border-radius: 0.375rem; padding: 0.25rem 0.5rem; font-size: 0.75rem; cursor: pointer;"
|
|
hx-get="/expenses/{{.ID}}/edit"
|
|
hx-target="#receipt-form"
|
|
hx-swap="innerHTML"
|
|
title="Edit expense">
|
|
✏️
|
|
</button>
|
|
</div>
|
|
</div>
|
|
{{end}}
|
|
</div>
|
|
{{else}}
|
|
<div class="empty-state" style="padding: 2rem;">
|
|
<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="#94a3b8" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
|
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/>
|
|
<polyline points="14 2 14 8 20 8"/>
|
|
<line x1="12" y1="18" x2="12" y2="12"/>
|
|
<line x1="9" y1="15" x2="15" y2="15"/>
|
|
</svg>
|
|
<h3>No Expenses Yet</h3>
|
|
<p>Capture a receipt to get started.</p>
|
|
</div>
|
|
{{end}}
|
|
</div>
|