331 lines
9.3 KiB
Go
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)
|
|
}
|
|
}
|