dev/main #19
45
Backend/endpoints/team_presence.go
Normal file
45
Backend/endpoints/team_presence.go
Normal file
@@ -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)
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package helper
|
package helper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
@@ -20,6 +21,7 @@ func SetCors(w http.ResponseWriter) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func RequiresLogin(session *scs.SessionManager, w http.ResponseWriter, r *http.Request) {
|
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" {
|
if GetEnv("GO_ENV", "production") == "debug" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ func main() {
|
|||||||
server.HandleFunc("/user/login", endpoints.LoginHandler)
|
server.HandleFunc("/user/login", endpoints.LoginHandler)
|
||||||
server.HandleFunc("/user/settings", endpoints.UserSettingsHandler)
|
server.HandleFunc("/user/settings", endpoints.UserSettingsHandler)
|
||||||
server.HandleFunc("/team", endpoints.TeamHandler)
|
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("/", http.RedirectHandler("/time", http.StatusPermanentRedirect))
|
||||||
server.Handle("/static/", http.StripPrefix("/static/", fs))
|
server.Handle("/static/", http.StripPrefix("/static/", fs))
|
||||||
|
|
||||||
|
|||||||
@@ -167,6 +167,15 @@ func (u *User) GetTeamMembers() ([]User, error) {
|
|||||||
return teamMembers, nil
|
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 {
|
func (u *User) GetWeek(tsFrom time.Time) WorkWeek {
|
||||||
var bookings []WorkDay
|
var bookings []WorkDay
|
||||||
weekStart := tsFrom.AddDate(0, 0, -1*int(tsFrom.Local().Weekday())-1)
|
weekStart := tsFrom.AddDate(0, 0, -1*int(tsFrom.Local().Weekday())-1)
|
||||||
|
|||||||
@@ -1,9 +1,14 @@
|
|||||||
package templates
|
package templates
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
templ headerComponent() {
|
templ headerComponent() {
|
||||||
<div class="flex flex-row justify-between md:mx-[10%] py-2">
|
<div class="flex flex-row justify-between md:mx-[10%] py-2">
|
||||||
<a href="/time">Zeitverwaltung</a>
|
<a href="/time">Zeitverwaltung</a>
|
||||||
<a href="/team">Abrechnung</a>
|
<a href="/team">Abrechnung</a>
|
||||||
<a href="/user">Einstellungen</a>
|
if true {
|
||||||
|
<a href="/team/presence">Anwesenheit</a>
|
||||||
|
}
|
||||||
|
<a href="/user/settings">Einstellungen</a>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,17 @@ func headerComponent() templ.Component {
|
|||||||
templ_7745c5c3_Var1 = templ.NopComponent
|
templ_7745c5c3_Var1 = templ.NopComponent
|
||||||
}
|
}
|
||||||
ctx = templ.ClearChildren(ctx)
|
ctx = templ.ClearChildren(ctx)
|
||||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "<div class=\"flex flex-row justify-between md:mx-[10%] py-2\"><a href=\"/time\">Zeitverwaltung</a> <a href=\"/team\">Abrechnung</a> <a href=\"/user\">Einstellungen</a></div>")
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "<div class=\"flex flex-row justify-between md:mx-[10%] py-2\"><a href=\"/time\">Zeitverwaltung</a> <a href=\"/team\">Abrechnung</a> ")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
if true {
|
||||||
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "<a href=\"/team/presence\">Anwesenheit</a> ")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "<a href=\"/user/settings\">Einstellungen</a></div>")
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -115,3 +115,27 @@ templ NavPage() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
templ TeamPresencePage(teamPresence map[bool][]models.User) {
|
||||||
|
@Base()
|
||||||
|
@headerComponent()
|
||||||
|
<div class="grid-main divide-y-1">
|
||||||
|
<div class="grid-sub divide-x-1">
|
||||||
|
<h2 class="grid-cell font-bold uppercase">Anwesend</h2>
|
||||||
|
<div class="flex flex-col col-span-2 md:col-span-4">
|
||||||
|
for _, user := range teamPresence[true] {
|
||||||
|
|
||||||
|
@userPresenceComponent(user, true)
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="grid-sub divide-x-1">
|
||||||
|
<h2 class="grid-cell font-bold uppercase">Nicht Anwesend</h2>
|
||||||
|
<div class="flex flex-col col-span-2 md:col-span-4">
|
||||||
|
for _, user := range teamPresence[false] {
|
||||||
|
@userPresenceComponent(user, false)
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|||||||
@@ -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, "<div class=\"grid-main divide-y-1\"><div class=\"grid-sub divide-x-1\"><h2 class=\"grid-cell font-bold uppercase\">Anwesend</h2><div class=\"flex flex-col col-span-2 md:col-span-4\">")
|
||||||
|
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, "</div></div><div class=\"grid-sub divide-x-1\"><h2 class=\"grid-cell font-bold uppercase\">Nicht Anwesend</h2><div class=\"flex flex-col col-span-2 md:col-span-4\">")
|
||||||
|
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, "</div></div></div>")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
var _ = templruntime.GeneratedTemplate
|
var _ = templruntime.GeneratedTemplate
|
||||||
|
|||||||
@@ -56,3 +56,14 @@ templ employeComponent(week models.WorkWeek) {
|
|||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
templ userPresenceComponent(user models.User, present bool){
|
||||||
|
<div class="grid-cell group flex flex-row gap-2">
|
||||||
|
if present {
|
||||||
|
<div class="h-8 bg-accent rounded-md group-hover:text-black md:text-transparent text-center p-1" >Anwesend</div>
|
||||||
|
} else {
|
||||||
|
<div class="h-8 bg-red-600 rounded-md group-hover:text-white md:text-transparent text-center p-1" >Abwesend</div>
|
||||||
|
}
|
||||||
|
<p>{user.Vorname} {user.Name}</p>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|||||||
@@ -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, "<div class=\"grid-cell group flex flex-row gap-2\">")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
if present {
|
||||||
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "<div class=\"h-8 bg-accent rounded-md group-hover:text-black md:text-transparent text-center p-1\">Anwesend</div>")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "<div class=\"h-8 bg-red-600 rounded-md group-hover:text-white md:text-transparent text-center p-1\">Abwesend</div>")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "<p>")
|
||||||
|
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, "</p></div>")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
var _ = templruntime.GeneratedTemplate
|
var _ = templruntime.GeneratedTemplate
|
||||||
|
|||||||
Reference in New Issue
Block a user