package templates import ( "encoding/json" "fmt" "veola/internal/models" ) type ItemResultsData struct { Page Item models.Item Badge BadgeData History []models.PricePoint Results []models.Result Page_ int TotalPages int Order string HistoryChartJSON string } type BadgeData struct { Label string Class string // v-badge-low / v-badge-avg / v-badge-target / "" } type GlobalResultsData struct { Page Items []models.Item Results []ItemResultRow ItemID int64 From string To string } type ItemResultRow struct { models.Result ItemName string } templ itemResultsBody(d ItemResultsData) {

{ d.Item.Name }

if d.Item.Category != "" {
{ d.Item.Category }
}
if d.Item.BestPrice != nil {
{ fmtPrice(d.Item.BestPrice, "USD") }
if d.Item.BestPriceURL != "" { { d.Item.BestPriceStore } } } else {
no price yet
} if d.Badge.Label != "" {
{ d.Badge.Label }
}

Price History

if len(d.History) < 2 {
Not enough history yet.
} else { }
for _, r := range d.Results { }
Title Price Store Found Alert
if r.ImageURL != "" { } if r.URL != "" { { r.Title } } else { { r.Title } } if r.MatchedQuery != "" {
via "{ r.MatchedQuery }"
}
{ fmtPrice(r.Price, r.Currency) } { r.Source } { humanTime(r.FoundAt) } if r.Alerted { sent }
if d.TotalPages > 1 {
for i := 1; i <= d.TotalPages; i++ { { fmt.Sprintf("%d", i) } }
}
} func pageClass(i, current int) string { if i == current { return "v-btn" } return "v-btn-ghost" } func toggleOrder(current, axis string) string { switch axis { case "price": if current == "price_asc" { return "price_desc" } return "price_asc" case "found": if current == "found_desc" || current == "" { return "found_asc" } return "found_desc" } return "" } templ ItemResults(d ItemResultsData) { @Layout(d.Page, itemResultsBody(d)) } templ globalResultsBody(d GlobalResultsData) {

All Results

for _, r := range d.Results { }
ItemTitlePriceStoreFoundAlert
{ r.ItemName } if r.URL != "" { { r.Title } } else { { r.Title } } if r.MatchedQuery != "" {
via "{ r.MatchedQuery }"
}
{ fmtPrice(r.Price, r.Currency) } { r.Source } { humanTime(r.FoundAt) } if r.Alerted { sent }
} templ GlobalResults(d GlobalResultsData) { @Layout(d.Page, globalResultsBody(d)) } // ChartJSON helper for handlers. type ChartJSON struct { Labels []string `json:"labels"` Points []float64 `json:"points"` } func MustChartJSON(c ChartJSON) string { b, _ := json.Marshal(c) return string(b) }