From 097ecd6dfc99511bb103117ee2ce6839d8931fe6 Mon Sep 17 00:00:00 2001 From: Daniel Eder Date: Fri, 21 Feb 2025 14:17:36 +0100 Subject: [PATCH] show trainers in training list --- main.go | 66 ++++++++++++++++++++++++++++++------ templates/training_list.html | 35 +++++++++++++------ 2 files changed, 81 insertions(+), 20 deletions(-) diff --git a/main.go b/main.go index 3ff2782..4441a97 100644 --- a/main.go +++ b/main.go @@ -241,29 +241,75 @@ func addTrainingAreaHandler(w http.ResponseWriter, r *http.Request) { } func fetchTrainings() ([]Training, error) { - log.Println("Fetching trainings from the database") - rows, err := db.Query("SELECT id, title, training_type, mode, strftime('%Y-%m-%d %H:%M:%S', start), strftime('%Y-%m-%d %H:%M:%S', end), status FROM trainings") + log.Println("Fetching trainings with assigned trainers from the database") + + query := ` + SELECT + t.id, t.title, t.training_type, t.mode, + strftime('%Y-%m-%d %H:%M:%S', t.start), strftime('%Y-%m-%d %H:%M:%S', t.end), t.status, + tr.id, tr.name, tr.email + FROM trainings t + LEFT JOIN training_trainers tt ON t.id = tt.training_id + LEFT JOIN trainers tr ON tt.trainer_id = tr.id + ORDER BY t.id, tr.name + ` + + rows, err := db.Query(query) if err != nil { log.Printf("Error fetching trainings: %v", err) return nil, err } defer rows.Close() - var trainings []Training + trainingMap := make(map[int]*Training) + for rows.Next() { - var t Training - var start, end string - err := rows.Scan(&t.ID, &t.Title, &t.TrainingType, &t.Mode, &start, &end, &t.Status) + var trainingID int + var title, trainingType, mode, status, startStr, endStr string + var trainerID sql.NullInt64 + var trainerName sql.NullString + var trainerEmail sql.NullString + + err := rows.Scan(&trainingID, &title, &trainingType, &mode, &startStr, &endStr, &status, + &trainerID, &trainerName, &trainerEmail) if err != nil { log.Printf("Error scanning row for training: %v", err) return nil, err } - t.Start, _ = time.Parse(time.DateTime, start) - t.End, _ = time.Parse(time.DateTime, end) - trainings = append(trainings, t) + + start, _ := time.Parse(time.DateTime, startStr) + end, _ := time.Parse(time.DateTime, endStr) + + training, exists := trainingMap[trainingID] + if !exists { + training = &Training{ + ID: trainingID, + Title: title, + TrainingType: trainingType, + Mode: mode, + Start: start, + End: end, + Status: status, + Trainers: []Trainer{}, + } + trainingMap[trainingID] = training + } + + if trainerID.Valid { + training.Trainers = append(training.Trainers, Trainer{ + ID: int(trainerID.Int64), + Name: trainerName.String, + Email: trainerEmail.String, + }) + } } - log.Printf("Found %d trainings", len(trainings)) + var trainings []Training + for _, training := range trainingMap { + trainings = append(trainings, *training) + } + + log.Printf("Found %d trainings with trainers", len(trainings)) return trainings, nil } diff --git a/templates/training_list.html b/templates/training_list.html index 478def2..457889f 100644 --- a/templates/training_list.html +++ b/templates/training_list.html @@ -2,7 +2,8 @@

Trainings

- +
+ @@ -10,17 +11,31 @@ + - {{ range . }} + + + {{range .}} - - - - - - + + + + + + + - {{ end }} -
Title TypeStart End StatusTrainers
{{ .Title }}{{ .TrainingType }}{{ .Mode }}{{ .Start }}{{ .End }}{{ .Status }}{{.Title}}{{.TrainingType}}{{.Mode}}{{.Start.Format "2006-01-02 15:04"}}{{.End.Format "2006-01-02 15:04"}}{{.Status}} + {{if .Trainers}} + {{range .Trainers}} + {{.Name}} ({{.Email}})
+ {{end}} + {{else}} + No trainers assigned + {{end}} +
+ {{end}} + + + {{template "epilogue.html" }} \ No newline at end of file