From 24bbc5337bebd5b7c7a267a6248d5a154fbccf8d Mon Sep 17 00:00:00 2001 From: Haelnorr Date: Mon, 2 Feb 2026 22:39:03 +1100 Subject: [PATCH] updated seasons list --- internal/db/season.go | 2 +- internal/handlers/newseason.go | 2 +- internal/handlers/seasons.go | 2 +- internal/view/component/season/status.templ | 71 +++++++++++++++++++++ internal/view/page/season.templ | 50 ++------------- internal/view/page/seasons_list.templ | 45 +++++++++---- pkg/embedfs/files/css/output.css | 6 +- 7 files changed, 116 insertions(+), 62 deletions(-) create mode 100644 internal/view/component/season/status.templ diff --git a/internal/db/season.go b/internal/db/season.go index 6bc45d7..261a68d 100644 --- a/internal/db/season.go +++ b/internal/db/season.go @@ -63,7 +63,7 @@ func ListSeasons(ctx context.Context, tx bun.Tx, pageOpts *PageOpts) (*SeasonLis pageOpts.Order = bun.OrderDesc } if pageOpts.OrderBy == "" { - pageOpts.OrderBy = "name" + pageOpts.OrderBy = "start_date" } seasons := []Season{} err := tx.NewSelect(). diff --git a/internal/handlers/newseason.go b/internal/handlers/newseason.go index 16a3c49..0ed80a1 100644 --- a/internal/handlers/newseason.go +++ b/internal/handlers/newseason.go @@ -180,7 +180,7 @@ func NewSeasonSubmit( // Helper function to validate alphanumeric strings func isAlphanumeric(s string) bool { for _, r := range s { - if !((r >= 'A' && r <= 'Z') || (r >= '0' && r <= '9')) { + if ((r < 'A') || (r > 'Z')) && ((r < '0') || (r > '9')) { return false } } diff --git a/internal/handlers/seasons.go b/internal/handlers/seasons.go index 92840ae..0f4fcdd 100644 --- a/internal/handlers/seasons.go +++ b/internal/handlers/seasons.go @@ -58,7 +58,7 @@ func SeasonsPage( return } tx.Commit() - renderSafely(page.SeasonsList(seasons), s, r, w) + renderSafely(page.SeasonsPage(seasons), s, r, w) }) } diff --git a/internal/view/component/season/status.templ b/internal/view/component/season/status.templ new file mode 100644 index 0000000..c317cbb --- /dev/null +++ b/internal/view/component/season/status.templ @@ -0,0 +1,71 @@ +package season + +import "git.haelnorr.com/h/oslstats/internal/db" +import "time" + +// StatusBadge renders a season status badge +// Parameters: +// - season: pointer to db.Season +// - compact: bool - true for list view (text only, small), false for detail view (icon + text, large) +// - useShortLabels: bool - true for "Active/Finals", false for "In Progress/Finals in Progress" +templ StatusBadge(season *db.Season, compact bool, useShortLabels bool) { + {{ + now := time.Now() + status := "" + statusColor := "" + statusBg := "" + + // Determine status based on dates + if now.Before(season.StartDate) { + status = "Upcoming" + statusColor = "text-blue" + statusBg = "bg-blue/10 border-blue" + } else if !season.EndDate.IsZero() && now.After(season.EndDate.Time) { + status = "Completed" + statusColor = "text-green" + statusBg = "bg-green/10 border-green" + } else if !season.FinalsStartDate.IsZero() && now.After(season.FinalsStartDate.Time) { + if !season.FinalsEndDate.IsZero() && now.After(season.FinalsEndDate.Time) { + status = "Completed" + statusColor = "text-green" + statusBg = "bg-green/10 border-green" + } else { + if useShortLabels { + status = "Finals" + } else { + status = "Finals in Progress" + } + statusColor = "text-yellow" + statusBg = "bg-yellow/10 border-yellow" + } + } else { + if useShortLabels { + status = "Active" + } else { + status = "In Progress" + } + statusColor = "text-green" + statusBg = "bg-green/10 border-green" + } + + // Determine size classes + var sizeClasses string + var textSize string + var iconSize string + if compact { + sizeClasses = "px-2 py-1" + textSize = "text-xs" + iconSize = "text-sm" + } else { + sizeClasses = "px-4 py-2" + textSize = "text-lg" + iconSize = "text-2xl" + } + }} +
+ if !compact { + + } + { status } +
+} diff --git a/internal/view/page/season.templ b/internal/view/page/season.templ index 80e10a9..384cbdf 100644 --- a/internal/view/page/season.templ +++ b/internal/view/page/season.templ @@ -2,6 +2,7 @@ package page import "git.haelnorr.com/h/oslstats/internal/db" import "git.haelnorr.com/h/oslstats/internal/view/layout" +import seasoncomp "git.haelnorr.com/h/oslstats/internal/view/component/season" import "time" import "strconv" @@ -54,14 +55,14 @@ templ SeasonDetails(season *db.Season) {
Start Date: - { formatDate(season.StartDate) } + { formatDateLong(season.StartDate) }
End Date: if !season.EndDate.IsZero() { - { formatDate(season.EndDate.Time) } + { formatDateLong(season.EndDate.Time) } } else { Not set } @@ -90,7 +91,7 @@ templ SeasonDetails(season *db.Season) { Start Date: if !season.FinalsStartDate.IsZero() { - { formatDate(season.FinalsStartDate.Time) } + { formatDateLong(season.FinalsStartDate.Time) } } else { Not set } @@ -100,7 +101,7 @@ templ SeasonDetails(season *db.Season) { End Date: if !season.FinalsEndDate.IsZero() { - { formatDate(season.FinalsEndDate.Time) } + { formatDateLong(season.FinalsEndDate.Time) } } else { Not set } @@ -124,51 +125,14 @@ templ SeasonDetails(season *db.Season) {

Status

- @SeasonStatus(season) + @seasoncomp.StatusBadge(season, false, false)
} -templ SeasonStatus(season *db.Season) { - {{ - now := time.Now() - status := "" - statusColor := "" - statusBg := "" - - if now.Before(season.StartDate) { - status = "Upcoming" - statusColor = "text-blue" - statusBg = "bg-blue/10 border-blue" - } else if !season.EndDate.IsZero() && now.After(season.EndDate.Time) { - status = "Completed" - statusColor = "text-green" - statusBg = "bg-green/10 border-green" - } else if !season.FinalsStartDate.IsZero() && now.After(season.FinalsStartDate.Time) { - if !season.FinalsEndDate.IsZero() && now.After(season.FinalsEndDate.Time) { - status = "Completed" - statusColor = "text-green" - statusBg = "bg-green/10 border-green" - } else { - status = "Finals in Progress" - statusColor = "text-yellow" - statusBg = "bg-yellow/10 border-yellow" - } - } else { - status = "In Progress" - statusColor = "text-green" - statusBg = "bg-green/10 border-green" - } - }} -
- - { status } -
-} - -func formatDate(t time.Time) string { +func formatDateLong(t time.Time) string { return t.Format("January 2, 2006") } diff --git a/internal/view/page/seasons_list.templ b/internal/view/page/seasons_list.templ index 5bd60cc..b7b53c6 100644 --- a/internal/view/page/seasons_list.templ +++ b/internal/view/page/seasons_list.templ @@ -4,7 +4,9 @@ import "git.haelnorr.com/h/oslstats/internal/db" import "git.haelnorr.com/h/oslstats/internal/view/layout" import "git.haelnorr.com/h/oslstats/internal/view/component/pagination" import "git.haelnorr.com/h/oslstats/internal/view/component/sort" +import "git.haelnorr.com/h/oslstats/internal/view/component/season" import "fmt" +import "time" import "github.com/uptrace/bun" templ SeasonsPage(seasons *db.SeasonList) { @@ -18,6 +20,16 @@ templ SeasonsPage(seasons *db.SeasonList) { templ SeasonsList(seasons *db.SeasonList) { {{ sortOpts := []db.OrderOpts{ + { + Order: bun.OrderDesc, + OrderBy: "start_date", + Label: "Start Date (Newest First)", + }, + { + Order: bun.OrderAsc, + OrderBy: "start_date", + Label: "Start Date (Oldest First)", + }, { Order: bun.OrderAsc, OrderBy: "name", @@ -28,16 +40,6 @@ templ SeasonsList(seasons *db.SeasonList) { OrderBy: "name", Label: "Name (Z-A)", }, - { - Order: bun.OrderAsc, - OrderBy: "short_name", - Label: "Short Name (A-Z)", - }, - { - Order: bun.OrderDesc, - OrderBy: "short_name", - Label: "Short Name (Z-A)", - }, } }}
@@ -74,12 +76,25 @@ templ SeasonsList(seasons *db.SeasonList) { } else { @@ -90,3 +105,7 @@ templ SeasonsList(seasons *db.SeasonList) {
} + +func formatDate(t time.Time) string { + return t.Format("02/01/2006") // DD/MM/YYYY +} diff --git a/pkg/embedfs/files/css/output.css b/pkg/embedfs/files/css/output.css index 5b14b8c..b73637c 100644 --- a/pkg/embedfs/files/css/output.css +++ b/pkg/embedfs/files/css/output.css @@ -318,6 +318,9 @@ .mb-2 { margin-bottom: calc(var(--spacing) * 2); } + .mb-3 { + margin-bottom: calc(var(--spacing) * 3); + } .mb-4 { margin-bottom: calc(var(--spacing) * 4); } @@ -439,9 +442,6 @@ .flex-1 { flex: 1; } - .flex-shrink-0 { - flex-shrink: 0; - } .shrink-0 { flex-shrink: 0; }