From 65ea9c63e9e50411cfe52864e4f10f7a8ccee1df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=20Tr=C3=B6ger?= Date: Thu, 10 Apr 2025 09:16:37 +0200 Subject: [PATCH] added Team Presence Page --- Backend/endpoints/team_presence.go | 45 ++++++++++++++ Backend/helper/web.go | 2 + Backend/main.go | 2 +- Backend/models/user.go | 9 +++ Backend/templates/headerComponent.templ | 7 ++- Backend/templates/headerComponent_templ.go | 12 +++- Backend/templates/pages.templ | 24 ++++++++ Backend/templates/pages_templ.go | 57 ++++++++++++++++++ Backend/templates/teamComponents.templ | 11 ++++ Backend/templates/teamComponents_templ.go | 70 ++++++++++++++++++++++ 10 files changed, 236 insertions(+), 3 deletions(-) create mode 100644 Backend/endpoints/team_presence.go diff --git a/Backend/endpoints/team_presence.go b/Backend/endpoints/team_presence.go new file mode 100644 index 0000000..5ca18e0 --- /dev/null +++ b/Backend/endpoints/team_presence.go @@ -0,0 +1,45 @@ +package endpoints + +import ( + "arbeitszeitmessung/helper" + "arbeitszeitmessung/models" + "arbeitszeitmessung/templates" + "log" + "net/http" +) + +func TeamPresenceHandler(w http.ResponseWriter, r *http.Request){ + helper.RequiresLogin(Session, w, r) + helper.SetCors(w) + switch r.Method { + case http.MethodGet: + teamPresence(w, r) + break + case http.MethodOptions: + // just support options header for non GET Requests from SWAGGER + w.WriteHeader(http.StatusOK) + break + default: + http.Error(w, "Method not allowed!", http.StatusMethodNotAllowed) + break + } +} + +func teamPresence(w http.ResponseWriter, r *http.Request){ + user, err := (*models.User).GetUserFromSession(nil, Session, r.Context()) + if err != nil { + log.Println("Error getting user!", err) + } + team, err := user.GetTeamMembers() + teamPresence := make(map[bool][]models.User) + for _, user := range team { + present := user.CheckAnwesenheit() + teamPresence[present] = append(teamPresence[present], user) + } + + + if(err != nil){ + log.Println("Error getting team", err) + } + templates.TeamPresencePage(teamPresence).Render(r.Context(), w) +} diff --git a/Backend/helper/web.go b/Backend/helper/web.go index 0bae9bf..32fca7a 100644 --- a/Backend/helper/web.go +++ b/Backend/helper/web.go @@ -1,6 +1,7 @@ package helper import ( + "context" "net/http" "os" @@ -20,6 +21,7 @@ func SetCors(w http.ResponseWriter) { } func RequiresLogin(session *scs.SessionManager, w http.ResponseWriter, r *http.Request) { + r = r.WithContext(context.WithValue(r.Context(), "session", session)) if GetEnv("GO_ENV", "production") == "debug" { return } diff --git a/Backend/main.go b/Backend/main.go index 9077586..969ab60 100644 --- a/Backend/main.go +++ b/Backend/main.go @@ -51,7 +51,7 @@ func main() { server.HandleFunc("/user/login", endpoints.LoginHandler) server.HandleFunc("/user/settings", endpoints.UserSettingsHandler) server.HandleFunc("/team", endpoints.TeamHandler) - server.HandleFunc("/team/presence", endpoints.TeamHandler) + server.HandleFunc("/team/presence", endpoints.TeamPresenceHandler) server.Handle("/", http.RedirectHandler("/time", http.StatusPermanentRedirect)) server.Handle("/static/", http.StripPrefix("/static/", fs)) diff --git a/Backend/models/user.go b/Backend/models/user.go index 1e0155f..e5f5bd0 100644 --- a/Backend/models/user.go +++ b/Backend/models/user.go @@ -167,6 +167,15 @@ func (u *User) GetTeamMembers() ([]User, error) { return teamMembers, nil } +func (u *User) IsTeamLeader() bool { + team, err := u.GetTeamMembers() + if err != nil { + log.Println("Error getting team Members", err) + return false + } + return len(team) > 0 +} + func (u *User) GetWeek(tsFrom time.Time) WorkWeek { var bookings []WorkDay weekStart := tsFrom.AddDate(0, 0, -1*int(tsFrom.Local().Weekday())-1) diff --git a/Backend/templates/headerComponent.templ b/Backend/templates/headerComponent.templ index bff5766..bfb040f 100644 --- a/Backend/templates/headerComponent.templ +++ b/Backend/templates/headerComponent.templ @@ -1,9 +1,14 @@ package templates + + templ headerComponent() {
Zeitverwaltung Abrechnung - Einstellungen + if true { + Anwesenheit + } + Einstellungen
} diff --git a/Backend/templates/headerComponent_templ.go b/Backend/templates/headerComponent_templ.go index e3cf58d..4710b0a 100644 --- a/Backend/templates/headerComponent_templ.go +++ b/Backend/templates/headerComponent_templ.go @@ -29,7 +29,17 @@ func headerComponent() templ.Component { templ_7745c5c3_Var1 = templ.NopComponent } ctx = templ.ClearChildren(ctx) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "
Zeitverwaltung Abrechnung Einstellungen
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "
Zeitverwaltung Abrechnung ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if true { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "Anwesenheit ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "Einstellungen
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } diff --git a/Backend/templates/pages.templ b/Backend/templates/pages.templ index ba80498..0867308 100644 --- a/Backend/templates/pages.templ +++ b/Backend/templates/pages.templ @@ -115,3 +115,27 @@ templ NavPage() { } + +templ TeamPresencePage(teamPresence map[bool][]models.User) { + @Base() + @headerComponent() +
+
+

Anwesend

+
+ for _, user := range teamPresence[true] { + + @userPresenceComponent(user, true) + } +
+
+
+

Nicht Anwesend

+
+ for _, user := range teamPresence[false] { + @userPresenceComponent(user, false) + } +
+
+
+} diff --git a/Backend/templates/pages_templ.go b/Backend/templates/pages_templ.go index c16ffac..d93ac8d 100644 --- a/Backend/templates/pages_templ.go +++ b/Backend/templates/pages_templ.go @@ -344,4 +344,61 @@ func NavPage() templ.Component { }) } +func TeamPresencePage(teamPresence map[bool][]models.User) templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var11 := templ.GetChildren(ctx) + if templ_7745c5c3_Var11 == nil { + templ_7745c5c3_Var11 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + templ_7745c5c3_Err = Base().Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = headerComponent().Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "

Anwesend

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + for _, user := range teamPresence[true] { + templ_7745c5c3_Err = userPresenceComponent(user, true).Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, "

Nicht Anwesend

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + for _, user := range teamPresence[false] { + templ_7745c5c3_Err = userPresenceComponent(user, false).Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) +} + var _ = templruntime.GeneratedTemplate diff --git a/Backend/templates/teamComponents.templ b/Backend/templates/teamComponents.templ index ab917cb..9cebb77 100644 --- a/Backend/templates/teamComponents.templ +++ b/Backend/templates/teamComponents.templ @@ -56,3 +56,14 @@ templ employeComponent(week models.WorkWeek) { } + +templ userPresenceComponent(user models.User, present bool){ +
+ if present { +
Anwesend
+ } else { +
Abwesend
+ } +

{user.Vorname} {user.Name}

+
+} diff --git a/Backend/templates/teamComponents_templ.go b/Backend/templates/teamComponents_templ.go index c096fc6..2a56f46 100644 --- a/Backend/templates/teamComponents_templ.go +++ b/Backend/templates/teamComponents_templ.go @@ -250,4 +250,74 @@ func employeComponent(week models.WorkWeek) templ.Component { }) } +func userPresenceComponent(user models.User, present bool) templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var15 := templ.GetChildren(ctx) + if templ_7745c5c3_Var15 == nil { + templ_7745c5c3_Var15 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if present { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "
Anwesend
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } else { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "
Abwesend
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var16 string + templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinStringErrs(user.Vorname) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 67, Col: 17} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, " ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var17 string + templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(user.Name) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 67, Col: 29} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, "

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) +} + var _ = templruntime.GeneratedTemplate