@@ -0,0 +1,327 @@
|
||||
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 }
|
||||
|
||||
// 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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user