diff --git a/Backend/endpoints/time.go b/Backend/endpoints/time.go index 803dc92..a108b1b 100644 --- a/Backend/endpoints/time.go +++ b/Backend/endpoints/time.go @@ -4,6 +4,7 @@ import ( "arbeitszeitmessung/helper" "arbeitszeitmessung/models" "arbeitszeitmessung/templates" + "context" "encoding/json" "log" "net/http" @@ -42,15 +43,21 @@ func parseTimestamp(r *http.Request , get_key string, fallback string) (time.Tim // Returns bookings from DB with similar card uid -> checks for card uid in http query params func getBookings(w http.ResponseWriter, r *http.Request) { - card_uid := r.URL.Query().Get("card_uid") - if card_uid == "" && Session.Exists(r.Context(), "card_uid"){ - card_uid = Session.GetString(r.Context(), "user") - } - if card_uid == "" { - http.Error(w, "Missing card_uid query parameter", http.StatusBadRequest) + // if(!Session.Exists(r.Context(), "user")){ + // log.Println("No user in session storage!") + // http.Error(w, "Not logged in!", http.StatusForbidden) + // return + // } + + // user, err := (*models.User).GetByPersonalNummer(nil, Session.GetInt(r.Context(), "user")) + user, err := (*models.User).GetByPersonalNummer(nil, 123) + if(err != nil){ + log.Println("No user found with the given personal number!") + http.Error(w, "No user found", http.StatusNotFound) return } + tsFrom, err := parseTimestamp(r, "time_from", "2000-01-01") if(err != nil ){ log.Println("Error parsing 'from' time", err) @@ -65,19 +72,45 @@ func getBookings(w http.ResponseWriter, r *http.Request) { } tsTo = tsTo.AddDate(0,0,1) // so that today is inside - bookings, err := (*models.Booking).GetBookingsGrouped(nil, card_uid, tsFrom, tsTo) + bookings, err := (*models.Booking).GetBookingsGrouped(nil, user.CardUID, tsFrom, tsTo) if err != nil { log.Println("Error getting bookings: ", err) http.Error(w, "Internal Server Error", http.StatusInternalServerError) return } - templates.OverviewPage(bookings).Render(r.Context(), w) + ctx := context.WithValue(r.Context(), "user", user) + templates.TimeDashboard(bookings).Render(ctx, w) // w.Header().Set("Content-Type", "application/json") // json.NewEncoder(w).Encode(bookings) } +func updateBooking(w http.ResponseWriter, r *http.Request){ + r.ParseForm() + for index, possibleBooking := range r.PostForm{ + if(index[:7] == "booking"){ + booking_id, err := strconv.Atoi(index[8:]) + if(err != nil){ + log.Println("Error parsing bookingId", err) + continue + } + booking, err := (*models.Booking).GetBookingById(nil, booking_id) + if(err != nil){ + log.Println("Error getting booking!", err) + continue + } + parsedTime, err := time.Parse("15:04", possibleBooking[0]) + if(err != nil){ + log.Println("Error parsing time!", err) + continue + } + booking.UpdateTime(parsedTime) + } + } + getBookings(w, r) +} + // Updates a booking form the given json body -func updateBooking(w http.ResponseWriter, r *http.Request) { +func updateBookingAPI(w http.ResponseWriter, r *http.Request) { _booking_id := r.URL.Query().Get("counter_id") if _booking_id == "" { http.Error(w, "Missing bookingID query parameter", http.StatusBadRequest) diff --git a/Backend/endpoints/user.go b/Backend/endpoints/user.go index 585d3a6..9e98a31 100644 --- a/Backend/endpoints/user.go +++ b/Backend/endpoints/user.go @@ -45,7 +45,7 @@ func loginUser(w http.ResponseWriter, r *http.Request){ log.Println("No card_uid provided!") http.Error(w, "No card_uid provided", http.StatusBadRequest) } - user, err := (*models.User).GetById(nil, card_uid) + user, err := (*models.User).GetByCardUID(nil, card_uid) if(err != nil){ log.Println("No user found under this card_uid!") http.Error(w, "No user found!", http.StatusNotFound) @@ -54,7 +54,7 @@ func loginUser(w http.ResponseWriter, r *http.Request){ password := r.FormValue("password") if(user.Login(password)){ log.Printf("New succesfull user login from %s %s!\n", user.Vorname, user.Name) - Session.Put(r.Context(), "user", user.CardUID) + Session.Put(r.Context(), "user", user.PersonalNummer) http.Redirect(w, r, "/time", http.StatusSeeOther) //with this browser always uses GET } diff --git a/Backend/models/booking.go b/Backend/models/booking.go index 5a83347..4574e16 100644 --- a/Backend/models/booking.go +++ b/Backend/models/booking.go @@ -132,6 +132,9 @@ func (b *Booking) GetBookingsGrouped(card_uid string, tsFrom time.Time, tsTo tim var result []WorkDay for key, bookings := range grouped { day, _ := time.Parse("2006-01-02", key) + sort.Slice(bookings, func(i, j int) bool { + return bookings[i].Timestamp.Before(bookings[j].Timestamp) + }) result = append(result, WorkDay{Day: day, Bookings: bookings}) } @@ -157,11 +160,11 @@ func (b Booking) Save() { func (b *Booking) GetBookingType() string { switch b.CheckInOut{ - case (1): + case 1,3: //manuelle Änderung return "kommen" - case (2): + case 2, 4: //manuelle Änderung return "gehen" - case(255): + case 255: return "abgemeldet" default: return "Buchungs Typ unbekannt" @@ -203,3 +206,22 @@ func checkLastBooking(b Booking) bool { } return true } + +func (b *Booking) UpdateTime(newTime time.Time){ + hour, minute, _ := newTime.Clock() + if(hour == b.Timestamp.Local().Hour() && minute == b.Timestamp.Local().Minute()){ + return + } + // TODO: add check for time overlap + + var newBooking Booking + newBooking.Timestamp = time.Date(b.Timestamp.Year(), b.Timestamp.Month(), b.Timestamp.Day(), hour, minute, 0, 0, time.Local).UTC() + if(b.CheckInOut < 3){ + newBooking.CheckInOut = b.CheckInOut + 2 + } + if(b.CheckInOut == 255){ + newBooking.CheckInOut = 4 + } + b.Update(newBooking) + b.Save() +} diff --git a/Backend/models/user.go b/Backend/models/user.go index 3846524..e2823e8 100644 --- a/Backend/models/user.go +++ b/Backend/models/user.go @@ -10,6 +10,7 @@ type User struct { Name string `json:"name"` Vorname string `json:"vorname"` HauptbeschaeftigungsOrt int8 `json:"hauptbeschaeftigungsort"` + PersonalNummer int `json:"personal_nummer"` } func (u *User) GetAll() ([]User, error) { @@ -66,13 +67,27 @@ func (u *User) Logout() error { return nil } -func (u *User) GetById(card_uid string) (User, error) { +func (u *User) GetByCardUID(card_uid string) (User, error) { var user User - qStr, err := DB.Prepare((`SELECT card_uid, vorname, nachname, hauptbeschaeftigung_ort FROM personal_daten WHERE card_uid = $1;`)) + qStr, err := DB.Prepare((`SELECT personal_nummer, card_uid, vorname, nachname, hauptbeschaeftigung_ort FROM personal_daten WHERE card_uid = $1;`)) if err != nil { return user, err } - err = qStr.QueryRow(card_uid).Scan(&user.CardUID, &user.Vorname, &user.Name, &user.HauptbeschaeftigungsOrt) + err = qStr.QueryRow(card_uid).Scan(&user.PersonalNummer, &user.CardUID, &user.Vorname, &user.Name, &user.HauptbeschaeftigungsOrt) + if err != nil{ + return user, err + } + return user, nil +} + +func (u *User) GetByPersonalNummer (personalNummer int) (User, error) { + var user User + + qStr, err := DB.Prepare((`SELECT personal_nummer, card_uid, vorname, nachname, hauptbeschaeftigung_ort FROM personal_daten WHERE personal_nummer = $1;`)) + if err != nil { + return user, err + } + err = qStr.QueryRow(personalNummer).Scan(&user.PersonalNummer, &user.CardUID, &user.Vorname, &user.Name, &user.HauptbeschaeftigungsOrt) if err != nil{ return user, err } diff --git a/Backend/models/workDay.go b/Backend/models/workDay.go index da0a42e..86d3eb6 100644 --- a/Backend/models/workDay.go +++ b/Backend/models/workDay.go @@ -1,31 +1,34 @@ package models -import "time" +import ( + "time" +) type WorkDay struct { Day time.Time - workTime time.Duration Bookings []Booking + workTime time.Duration } +// Gets the duration someone worked that day func (d WorkDay) GetWorkTime() time.Duration{ - if(d.workTime > 0) { - return d.workTime + d.workTime = 0 + for i := 0; i < len(d.Bookings) - (1 + len(d.Bookings)%2); i += 2{ + start := d.Bookings[i].Timestamp + end := d.Bookings[i+1].Timestamp + d.workTime += end.Sub(start) } - var lastCame Booking - for _, booking := range d.Bookings{ - if(booking.CheckInOut == 1){//kommen - lastCame = booking - }else{ - d.workTime = d.workTime + booking.Timestamp.Sub(lastCame.Timestamp) - } - } - if(time.Since(d.Day) < 24 * time.Hour && len(d.Bookings) % 2 == 1){ - d.workTime += time.Since(lastCame.Timestamp) + + // checks if booking is today and has no gehen yet, so the time since last kommen booking is added to workTime + if(d.Day.Equal(time.Now().Truncate(24 * time.Hour)) && len(d.Bookings) % 2 == 1){ + d.workTime += time.Since(d.Bookings[len(d.Bookings)-1].Timestamp) } return d.workTime } +// Converts duration to string and replaces 0s with in +// +// -> output xhxmin func (d WorkDay) GetWorkTimeString() string { str := d.GetWorkTime().Abs().Round(time.Minute).String() str = str[:len(str)-2] + "in" @@ -35,10 +38,12 @@ func (d WorkDay) GetWorkTimeString() string { return "" } +// returns bool wheter the workday was ended with an automatic logout func (d WorkDay) RequiresAction() bool { return d.Bookings[len(d.Bookings)-1].CheckInOut == 255 } +// returns a integer percentage of how much day has been worked of func (d WorkDay) GetWorkDayProgress() uint8 { defaultWorkTime, _ := time.ParseDuration("7h42m") progress := (d.GetWorkTime().Seconds()/defaultWorkTime.Seconds())*100 diff --git a/Backend/static/css/styles.css b/Backend/static/css/styles.css index 1a07df8..04deaa6 100644 --- a/Backend/static/css/styles.css +++ b/Backend/static/css/styles.css @@ -541,6 +541,12 @@ } } @layer utilities { + .collapse { + visibility: collapse; + } + .relative { + position: relative; + } .static { position: static; } @@ -550,12 +556,30 @@ .col-span-3 { grid-column: span 3 / span 3; } + .col-span-5 { + grid-column: span 5 / span 5; + } + .col-span-full { + grid-column: 1 / -1; + } + .row-span-3 { + grid-row: span 3 / span 3; + } + .row-span-full { + grid-row: 1 / -1; + } .-my-1 { margin-block: calc(var(--spacing) * -1); } + .my-2 { + margin-block: calc(var(--spacing) * 2); + } .mt-1 { margin-top: calc(var(--spacing) * 1); } + .block { + display: block; + } .flex { display: flex; } @@ -565,6 +589,18 @@ .hidden { display: none; } + .inline { + display: inline; + } + .inline-flex { + display: inline-flex; + } + .list-item { + display: list-item; + } + .table { + display: table; + } .size-2 { width: calc(var(--spacing) * 2); height: calc(var(--spacing) * 2); @@ -591,18 +627,36 @@ .w-full { width: 100%; } + .max-w-\[70\%\] { + max-width: 70%; + } .flex-grow { flex-grow: 1; } .grow-1 { flex-grow: 1; } + .border-collapse { + border-collapse: collapse; + } + .transform { + transform: var(--tw-rotate-x) var(--tw-rotate-y) var(--tw-rotate-z) var(--tw-skew-x) var(--tw-skew-y); + } .cursor-pointer { cursor: pointer; } + .resize { + resize: both; + } + .grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } .grid-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)); } + .grid-cols-subgrid { + grid-template-columns: subgrid; + } .flex-col { flex-direction: column; } @@ -641,6 +695,11 @@ border-bottom-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); } } + .divide-neutral-300 { + :where(& > :not(:last-child)) { + border-color: var(--color-neutral-300); + } + } .divide-neutral-400 { :where(& > :not(:last-child)) { border-color: var(--color-neutral-400); @@ -727,6 +786,9 @@ .text-accent { color: var(--color-accent); } + .text-black { + color: var(--color-black); + } .text-neutral-500 { color: var(--color-neutral-500); } @@ -742,9 +804,20 @@ .uppercase { text-transform: uppercase; } + .underline { + text-decoration-line: underline; + } + .outline { + outline-style: var(--tw-outline-style); + outline-width: 1px; + } .filter { filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,); } + .backdrop-filter { + -webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,); + backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,); + } .transition { transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter; transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); @@ -759,6 +832,31 @@ --tw-duration: 300ms; transition-duration: 300ms; } + .group-\[\.edit\]\:block { + &:is(:where(.group):is(.edit) *) { + display: block; + } + } + .group-\[\.edit\]\:hidden { + &:is(:where(.group):is(.edit) *) { + display: none; + } + } + .group-\[\.edit\]\:inline { + &:is(:where(.group):is(.edit) *) { + display: inline; + } + } + .peer-\[\.edit\]\:block { + &:is(:where(.peer):is(.edit) ~ *) { + display: block; + } + } + .peer-\[\.edit\]\:hidden { + &:is(:where(.peer):is(.edit) ~ *) { + display: none; + } + } .placeholder\:text-neutral-400 { &::placeholder { color: var(--color-neutral-400); @@ -851,6 +949,20 @@ padding-inline: calc(var(--spacing) * 4); } } + .group-\[\.edit\]\:md\:block { + &:is(:where(.group):is(.edit) *) { + @media (width >= 48rem) { + display: block; + } + } + } + .md\:group-\[\.edit\]\:block { + @media (width >= 48rem) { + &:is(:where(.group):is(.edit) *) { + display: block; + } + } + } .print\:hidden { @media print { display: none; @@ -883,6 +995,31 @@ animation-timing-function: cubic-bezier(0, 0, 0.2, 1); } } +@property --tw-rotate-x { + syntax: "*"; + inherits: false; + initial-value: rotateX(0); +} +@property --tw-rotate-y { + syntax: "*"; + inherits: false; + initial-value: rotateY(0); +} +@property --tw-rotate-z { + syntax: "*"; + inherits: false; + initial-value: rotateZ(0); +} +@property --tw-skew-x { + syntax: "*"; + inherits: false; + initial-value: skewX(0); +} +@property --tw-skew-y { + syntax: "*"; + inherits: false; + initial-value: skewY(0); +} @property --tw-divide-x-reverse { syntax: "*"; inherits: false; @@ -902,6 +1039,11 @@ syntax: "*"; inherits: false; } +@property --tw-outline-style { + syntax: "*"; + inherits: false; + initial-value: solid; +} @property --tw-blur { syntax: "*"; inherits: false; @@ -938,6 +1080,42 @@ syntax: "*"; inherits: false; } +@property --tw-backdrop-blur { + syntax: "*"; + inherits: false; +} +@property --tw-backdrop-brightness { + syntax: "*"; + inherits: false; +} +@property --tw-backdrop-contrast { + syntax: "*"; + inherits: false; +} +@property --tw-backdrop-grayscale { + syntax: "*"; + inherits: false; +} +@property --tw-backdrop-hue-rotate { + syntax: "*"; + inherits: false; +} +@property --tw-backdrop-invert { + syntax: "*"; + inherits: false; +} +@property --tw-backdrop-opacity { + syntax: "*"; + inherits: false; +} +@property --tw-backdrop-saturate { + syntax: "*"; + inherits: false; +} +@property --tw-backdrop-sepia { + syntax: "*"; + inherits: false; +} @property --tw-duration { syntax: "*"; inherits: false; diff --git a/Backend/static/script.js b/Backend/static/script.js new file mode 100644 index 0000000..405464f --- /dev/null +++ b/Backend/static/script.js @@ -0,0 +1,12 @@ +function editDay(element, event, formId) { + var form = element + .closest(".grid-cols-subgrid") + .querySelector(".time-component > form"); + form.classList.toggle("edit"); + element.classList.toggle("edit"); + if (element.classList.contains("edit")) { + event.preventDefault(); + } else { + form.submit(); + } +} diff --git a/Backend/templates/base.templ b/Backend/templates/base.templ index 868fddd..aee9b30 100644 --- a/Backend/templates/base.templ +++ b/Backend/templates/base.templ @@ -6,5 +6,6 @@ templ Style(){
Tom Tröger
Überstunden
4h 32min
- -
-: -
Arbeitszeit
-Bitte anpassen
--
-Tom Tröger
+{user.Vorname + " " + user.Name}
Überstunden
4h 32min
{booking.Timestamp.Local().Format("15:04")} {booking.GetBookingType()}
-{workDay.Day.Format("Mon")}: {workDay.Day.Format("02.01.2006")}
Arbeitszeit
if (workDay.RequiresAction()) {Bitte anpassen
- }else{ -{workDay.GetWorkTimeString()}
+ }else { +{workDay.GetWorkTimeString()}
}+ {booking.Timestamp.Local().Format("15:04")} + + {booking.GetBookingType()}
+Tom Tröger
Überstunden
4h 32min
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var6 string + templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(workDay.Day.Format("Mon")) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 44, Col: 77} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, ": ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var7 string + templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(workDay.Day.Format("02.01.2006")) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 44, Col: 120} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "
Arbeitszeit
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if workDay.RequiresAction() { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "Bitte anpassen
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } else { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var8 string + templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(workDay.GetWorkTimeString()) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 49, Col: 56} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var5 string - templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(booking.Timestamp.Local().Format("15:04")) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/overview.templ`, Line: 39, Col: 47} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, " ") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var6 string - templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(booking.GetBookingType()) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/overview.templ`, Line: 39, Col: 105} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var11 string - templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(workDay.Day.Format("Mon")) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/overview.templ`, Line: 64, Col: 77} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, ": ") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var12 string - templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(workDay.Day.Format("02.01.2006")) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/overview.templ`, Line: 64, Col: 120} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "
Arbeitszeit
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - if workDay.RequiresAction() { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "Bitte anpassen
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - } else { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var13 string - templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(workDay.GetWorkTimeString()) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/overview.templ`, Line: 69, Col: 55} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err } - return nil - }) -} - -func timeGaugeComponent(progress uint8, today bool, warning 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 + var templ_7745c5c3_Var20 string + templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.JoinStringErrs(booking.Timestamp.Local().Format("15:04")) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 123, Col: 103} } - 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 - } - }() + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var20)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err } - ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Var20 := templ.GetChildren(ctx) - if templ_7745c5c3_Var20 == nil { - templ_7745c5c3_Var20 = templ.NopComponent + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, " 0 && progress < 80): - bgColor = "bg-orange-500" - break - case (80 < progress && progress <= 110): - bgColor = "bg-accent" - break - case (progress > 110): - bgColor = "bg-purple-600" - break - default: - bgColor = "bg-neutral-400" - break + var templ_7745c5c3_Var21 string + templ_7745c5c3_Var21, templ_7745c5c3_Err = templ.JoinStringErrs("booking_" + strconv.Itoa(booking.CounterId)) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 124, Col: 59} } - if today { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "
+
Überstunden
4h 32min
+: +
Arbeitszeit
+Bitte anpassen
++
++ +