Files
2026-09-14 19:58:31 +02:00

331 lines
9.3 KiB
Go

package web
import (
"time"
"gardomatic.kleiax.de/lib/client"
)
// templateData is the internal builder used by handlers. pageView projects it
// to the feature sets explicitly available to a particular page template.
type templateData struct {
commonTemplateData
accountTemplateData
adminTemplateData
gardenTemplateData
plantTemplateData
speciesTemplateData
locationTemplateData
taskTemplateData
journalTemplateData
mediaTemplateData
searchTemplateData
}
// CommonTemplateData contains values available to every rendered page.
type CommonTemplateData struct {
CurrentYear int
ErrorStatus int
ErrorTitle string
ErrorMessage string
ContentKind string
Form any
Flash string
IsAuthenticated bool
IsActivated bool
CSRFToken string
CurrentUser *client.User
Garden *client.Garden
Filters map[string]string
Pagination *paginationData
TagSuggestions []string
UseJournalEditor bool
Health *client.Health
HealthError string
SystemTime time.Time
WebVersion string
}
// AccountTemplateData contains account-management page data.
type AccountTemplateData struct {
AccountSessions []client.AccountSession
AccountProtected bool
}
// AdminTemplateData contains application-administration page data.
type AdminTemplateData struct {
AdminUsers []client.User
ApplicationRoles []client.Role
GardenRoles []client.Role
GardenRoleSettings []client.GardenRoleSetting
ApplicationPermissions []permissionOption
GardenPermissions []permissionOption
RoleEditors []roleEditorData
ApplicationSettings *client.ApplicationSettings
SpeciesCategories []client.SpeciesCategory
TaskPriorities []client.TaskPriority
EnvironmentVariables []client.EnvironmentVariable
}
// GardenTemplateData contains garden membership and invitation page data.
type GardenTemplateData struct {
Gardens []client.Garden
Members []client.GardenMember
Invites []client.GardenInvite
}
// PlantTemplateData contains plant, placement, and plant-task page data.
type PlantTemplateData struct {
Plants []client.Plant
PlantTasks []plantTaskForm
TaskDialogNew bool
PlantID int
PlantCreatedBy int
PlantLocations map[int][]client.PlantLocation
PendingPlantName string
}
// SpeciesTemplateData contains species, care, and task-template page data.
type SpeciesTemplateData struct {
Species []client.Species
TaskTemplates map[int][]client.SpeciesTaskTemplate
TemplateOptOuts map[int]bool
TemplateID int
SpeciesID int
SpeciesGlobal bool
TemplateSpeciesID int
CareInstructions []client.CareInstruction
WizardStep string
}
// LocationTemplateData contains location hierarchy and occupancy page data.
type LocationTemplateData struct {
Locations []client.Location
LocationID int
LocationCreatedBy int
LocationPlants []locationPlant
LocationHistory []locationPlantHistory
LocationTree []locationNode
LocationNames map[int]string
}
// TaskTemplateData contains task-list and calendar page data.
type TaskTemplateData struct {
TaskYears []int
Tasks []client.Task
TaskID int
TaskCreatedBy int
CalendarDays []calendarDay
CalendarStart time.Time
CalendarEnd time.Time
CalendarView string
PreviousDate string
NextDate string
}
// JournalTemplateData contains journal and pinboard page data.
type JournalTemplateData struct {
JournalEntries []client.JournalEntry
PinboardEntries []client.JournalEntry
JournalEntry *client.JournalEntry
EntryID int
}
// MediaTemplateData contains reusable garden image-library page data.
type MediaTemplateData struct {
Images []client.Image
PhotoCount int
}
// SearchTemplateData contains cross-resource search results.
type SearchTemplateData struct{ Search searchResults }
// Private aliases keep handler construction concise while the actual embedded
// projection types remain visible to html/template's reflection logic.
type commonTemplateData = CommonTemplateData
type accountTemplateData = AccountTemplateData
type adminTemplateData = AdminTemplateData
type gardenTemplateData = GardenTemplateData
type plantTemplateData = PlantTemplateData
type speciesTemplateData = SpeciesTemplateData
type locationTemplateData = LocationTemplateData
type taskTemplateData = TaskTemplateData
type journalTemplateData = JournalTemplateData
type mediaTemplateData = MediaTemplateData
type searchTemplateData = SearchTemplateData
type calendarDay struct {
Date time.Time
Tasks []client.Task
}
type searchResults struct {
Query string
Mode string
Month int
MonthName string
Year int
Years []int
All []searchCard
Tasks []searchCard
Plants []searchCard
Tags []searchCard
Species []searchCard
Journal []searchCard
Pinboard []searchCard
}
type searchCard struct {
Title string
Detail string
Meta string
Type string
URL string
}
type locationPlant struct {
Plant client.Plant
Assignment client.PlantLocation
}
type locationPlantHistory struct {
Year int
Plants []locationPlant
}
type permissionOption struct {
Name string
Label string
}
func (data *templateData) pageView(page string) any {
switch page {
case "activate.tmpl", "email_confirm.tmpl", "error.tmpl", "healthcheck.tmpl", "home.tmpl", "invite.tmpl", "privacy.tmpl", "settings.tmpl", "signin.tmpl":
return struct{ CommonTemplateData }{data.commonTemplateData}
case "account.tmpl":
return struct {
CommonTemplateData
AccountTemplateData
}{data.commonTemplateData, data.accountTemplateData}
case "admin.tmpl":
return struct {
CommonTemplateData
AdminTemplateData
}{data.commonTemplateData, data.adminTemplateData}
case "garden_form.tmpl":
return struct {
CommonTemplateData
AdminTemplateData
GardenTemplateData
MediaTemplateData
}{data.commonTemplateData, data.adminTemplateData, data.gardenTemplateData, data.mediaTemplateData}
case "garden_new.tmpl":
return struct {
CommonTemplateData
MediaTemplateData
}{data.commonTemplateData, data.mediaTemplateData}
case "gardens.tmpl":
return struct {
CommonTemplateData
GardenTemplateData
}{data.commonTemplateData, data.gardenTemplateData}
case "dashboard.tmpl":
return struct {
CommonTemplateData
PlantTemplateData
LocationTemplateData
TaskTemplateData
JournalTemplateData
MediaTemplateData
}{data.commonTemplateData, data.plantTemplateData, data.locationTemplateData, data.taskTemplateData, data.journalTemplateData, data.mediaTemplateData}
case "images.tmpl":
return struct {
CommonTemplateData
MediaTemplateData
}{data.commonTemplateData, data.mediaTemplateData}
case "journal.tmpl":
return struct {
CommonTemplateData
JournalTemplateData
}{data.commonTemplateData, data.journalTemplateData}
case "journal_form.tmpl":
return struct {
CommonTemplateData
JournalTemplateData
MediaTemplateData
}{data.commonTemplateData, data.journalTemplateData, data.mediaTemplateData}
case "location_form.tmpl":
return struct {
CommonTemplateData
LocationTemplateData
PlantTemplateData
MediaTemplateData
}{data.commonTemplateData, data.locationTemplateData, data.plantTemplateData, data.mediaTemplateData}
case "locations.tmpl":
return struct {
CommonTemplateData
LocationTemplateData
}{data.commonTemplateData, data.locationTemplateData}
case "plant.tmpl":
return struct {
CommonTemplateData
PlantTemplateData
SpeciesTemplateData
LocationTemplateData
}{data.commonTemplateData, data.plantTemplateData, data.speciesTemplateData, data.locationTemplateData}
case "plant_form.tmpl":
return struct {
CommonTemplateData
AdminTemplateData
PlantTemplateData
SpeciesTemplateData
LocationTemplateData
MediaTemplateData
}{data.commonTemplateData, data.adminTemplateData, data.plantTemplateData, data.speciesTemplateData, data.locationTemplateData, data.mediaTemplateData}
case "plant_location_form.tmpl":
return struct {
CommonTemplateData
PlantTemplateData
LocationTemplateData
}{data.commonTemplateData, data.plantTemplateData, data.locationTemplateData}
case "search.tmpl":
return struct {
CommonTemplateData
SearchTemplateData
}{data.commonTemplateData, data.searchTemplateData}
case "species.tmpl":
return struct {
CommonTemplateData
SpeciesTemplateData
}{data.commonTemplateData, data.speciesTemplateData}
case "species_form.tmpl":
return struct {
CommonTemplateData
AdminTemplateData
SpeciesTemplateData
MediaTemplateData
}{data.commonTemplateData, data.adminTemplateData, data.speciesTemplateData, data.mediaTemplateData}
case "task_calendar.tmpl":
return struct {
CommonTemplateData
TaskTemplateData
}{data.commonTemplateData, data.taskTemplateData}
case "task_form.tmpl", "tasks.tmpl":
return struct {
CommonTemplateData
AdminTemplateData
PlantTemplateData
LocationTemplateData
TaskTemplateData
}{data.commonTemplateData, data.adminTemplateData, data.plantTemplateData, data.locationTemplateData, data.taskTemplateData}
case "task_template_form.tmpl":
return struct {
CommonTemplateData
AdminTemplateData
SpeciesTemplateData
}{data.commonTemplateData, data.adminTemplateData, data.speciesTemplateData}
default:
panic("missing page data projection for " + page)
}
}