fix: EditEvent returns standalone form fragment, not full page
- Edit button now shows inline form with pre-filled values - Cancel button hides the form again - Computes sample claim from existing exchange rate - No full-page rendering issues
This commit is contained in:
parent
0f39f3dc24
commit
0748af7c26
1 changed files with 47 additions and 14 deletions
|
|
@ -6,6 +6,8 @@ package handlers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
|
"fmt"
|
||||||
|
"html/template"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
@ -264,7 +266,7 @@ func (h *EventHandler) ViewEventExpenses(w http.ResponseWriter, r *http.Request)
|
||||||
// GET /events/{id}/edit — EditEvent
|
// GET /events/{id}/edit — EditEvent
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
// EditEvent returns the event edit form pre-filled with current event data.
|
// EditEvent returns the event edit form fragment pre-filled with current data.
|
||||||
func (h *EventHandler) EditEvent(w http.ResponseWriter, r *http.Request) {
|
func (h *EventHandler) EditEvent(w http.ResponseWriter, r *http.Request) {
|
||||||
eventID := chi.URLParam(r, "id")
|
eventID := chi.URLParam(r, "id")
|
||||||
event, err := database.GetEventByID(h.DB, eventID)
|
event, err := database.GetEventByID(h.DB, eventID)
|
||||||
|
|
@ -273,20 +275,51 @@ func (h *EventHandler) EditEvent(w http.ResponseWriter, r *http.Request) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
tmpl := getTemplate("dashboard.html")
|
// Build a slug for the sample receipt currency (use base currency as default).
|
||||||
data := map[string]interface{}{
|
rcptCur := event.BaseCurrency
|
||||||
"Event": event,
|
if rcptCur == "" {
|
||||||
"Editing": true,
|
rcptCur = "KES"
|
||||||
"Events": []database.Event{},
|
|
||||||
"BaseCurrency": event.BaseCurrency,
|
|
||||||
"ExchangeRate": event.ExchangeRate,
|
|
||||||
"LastSampleRcpt": "",
|
|
||||||
"LastSampleClm": "",
|
|
||||||
}
|
|
||||||
if err := tmpl.Execute(w, data); err != nil {
|
|
||||||
log.Printf("ERROR [%s] handlers: EditEvent: execute template: %v",
|
|
||||||
time.Now().Format(time.RFC3339), err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Compute a rough reverse sample from the exchange rate:
|
||||||
|
// rate = claim / receipt → sample_receipt = 1000, sample_claim = 1000 * rate
|
||||||
|
sampleClm := event.ExchangeRate * 1000
|
||||||
|
|
||||||
|
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
||||||
|
fmt.Fprintf(w, `<div class="card" style="padding: 1rem;">
|
||||||
|
<h3 style="margin-bottom: 1rem;">Edit Event</h3>
|
||||||
|
<form hx-put="/events/%s" hx-target="body" hx-push-url="true">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="form-label">Event</label>
|
||||||
|
<input type="text" name="name" value="%s" placeholder="Event name">
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="form-label">Claim Currency</label>
|
||||||
|
<input type="text" name="base_currency" value="%s" required maxlength="3" style="text-transform: uppercase;">
|
||||||
|
</div>
|
||||||
|
<div style="background: #064e3b; border: 1px solid #065f46; border-radius: 0.5rem; padding: 0.75rem; margin-bottom: 0.5rem;">
|
||||||
|
<div style="font-size: 0.8rem; font-weight: 600; color: #6ee7b7; margin-bottom: 0.5rem;">Conversion Sample</div>
|
||||||
|
<p style="font-size: 0.75rem; color: var(--color-text-muted); margin-bottom: 0.5rem;">Update the sample to recalculate the rate.</p>
|
||||||
|
<div class="form-row">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="form-label">Receipt Amount</label>
|
||||||
|
<input type="number" name="sample_receipt_amount" value="1000" step="0.01" min="0.01" required>
|
||||||
|
</div>
|
||||||
|
<div class="form-group" style="flex: 0 0 110px;">
|
||||||
|
<label class="form-label">Currency</label>
|
||||||
|
<input type="text" name="sample_receipt_currency" value="%s" required maxlength="3" style="text-transform: uppercase;">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="form-label">Converted amount</label>
|
||||||
|
<input type="number" name="sample_claim_amount" value="%.2f" step="0.01" min="0.01" required>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button type="submit" class="btn btn-primary btn-block">Save Changes</button>
|
||||||
|
<button type="button" class="btn btn-secondary btn-block" style="margin-top: 0.5rem;"
|
||||||
|
onclick="document.getElementById('create-event-form').innerHTML='';document.getElementById('create-event-form').classList.add('hidden')">Cancel</button>
|
||||||
|
</form>
|
||||||
|
</div>`, event.ID, template.HTMLEscapeString(event.Name), template.HTMLEscapeString(event.BaseCurrency), template.HTMLEscapeString(rcptCur), sampleClm)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue