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) } }