xtablo-source/backend/templates/events_forms.go
2026-05-16 00:27:58 +02:00

142 lines
2.9 KiB
Go

package templates
import (
"strconv"
"time"
"backend/internal/db/sqlc"
"github.com/google/uuid"
"github.com/jackc/pgx/v5/pgtype"
)
type EventCreateForm struct {
Title string
EventDate string
StartTime string
EndTime string
Location string
Description string
}
type EventCreateErrors struct {
Title string
EventDate string
StartTime string
EndTime string
General string
}
type EventsCalendar struct {
Month string
MonthLabel string
PrevMonth string
NextMonth string
Days []EventCalendarDay
WeekdayLabs []string
}
type EventCalendarDay struct {
Date string
DayNumber int
InMonth bool
Events []sqlc.Event
MoreCount int
}
func DefaultWeekdayLabels() []string {
return []string{"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"}
}
func EventFormFromEvent(event sqlc.Event) EventCreateForm {
return EventCreateForm{
Title: event.Title,
EventDate: FormatEventDate(event.EventDate),
StartTime: FormatEventTime(event.StartTime),
EndTime: FormatOptionalEventTime(event.EndTime),
Location: event.Location.String,
Description: event.Description.String,
}
}
func FormatEventDate(date pgtype.Date) string {
if !date.Valid {
return ""
}
return date.Time.Format("2006-01-02")
}
func FormatEventTime(value pgtype.Time) string {
if !value.Valid {
return ""
}
minutes := value.Microseconds / int64(time.Minute/time.Microsecond)
hours := minutes / 60
mins := minutes % 60
return twoDigits(int(hours)) + ":" + twoDigits(int(mins))
}
func FormatOptionalEventTime(value pgtype.Time) string {
if !value.Valid {
return ""
}
return FormatEventTime(value)
}
func EventTimeRange(event sqlc.Event) string {
start := FormatEventTime(event.StartTime)
if start == "" {
return ""
}
if !event.EndTime.Valid {
return start
}
return start + "-" + FormatEventTime(event.EndTime)
}
func EventDayEvents(events []sqlc.Event) []sqlc.Event {
if len(events) <= 3 {
return events
}
return events[:3]
}
func EventMoreLabel(count int) string {
if count <= 0 {
return ""
}
return "+" + strconv.Itoa(count) + " more"
}
func EventNewURL(tabloID uuid.UUID, month string) string {
if month == "" {
return "/tablos/" + tabloID.String() + "/events/new"
}
return "/tablos/" + tabloID.String() + "/events/new?month=" + month
}
func EventNewForDayURL(tabloID uuid.UUID, date string, month string) string {
url := "/tablos/" + tabloID.String() + "/events/new?date=" + date
if month != "" {
url += "&month=" + month
}
return url
}
func EventPostURL(tabloID uuid.UUID, month string) string {
if month == "" {
return "/tablos/" + tabloID.String() + "/events"
}
return "/tablos/" + tabloID.String() + "/events?month=" + month
}
func EventMonthURL(tabloID uuid.UUID, month string) string {
return "/tablos/" + tabloID.String() + "/events?month=" + month
}
func twoDigits(value int) string {
if value < 10 {
return "0" + strconv.Itoa(value)
}
return strconv.Itoa(value)
}