diff --git a/.gitea/workflows/build-deploy.yaml b/.gitea/workflows/build-deploy.yaml deleted file mode 100644 index 87ac133..0000000 --- a/.gitea/workflows/build-deploy.yaml +++ /dev/null @@ -1,39 +0,0 @@ -name: Arbeitszeitmessung Deploy -run-name: ${{ gitea.actor }} is building and deploying arbeitszeitmesssung -on: - workflow_run: - workflows: ["Tests"] - types: - - completed - -jobs: - build: - name: Build Go Image and Upload - if: | - github.event.workflow_run.conclusion == 'success' && - github.event.workflow_run.event == 'push' && - startsWith(github.event.workflow_run.head_branch, 'main') && - startsWith(github.event.workflow_run.head_commit.ref, 'refs/tags/') - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Login to GitHub Container Registry - uses: docker/login-action@v3 - with: - registry: git.letsstein.de - username: ${{ gitea.actor }} - password: ${{ secrets.REGISTRY_TOKEN }} - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - name: Build and push - uses: docker/build-push-action@v6 - with: - platforms: linux/amd64,linux/arm64 - push: true - context: Backend - tags: | - git.letsstein.de/tom/arbeitszeitmessung:latest - git.letsstein.de/tom/arbeitszeitmessung:${{ github.ref_name }} diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml new file mode 100644 index 0000000..c32282f --- /dev/null +++ b/.gitea/workflows/build.yaml @@ -0,0 +1,76 @@ +name: Arbeitszeitmessung Deploy +run-name: ${{ gitea.actor }} is building and deploying arbeitszeitmesssung +on: + push: + tags: "*" + +jobs: + testing: + name: Run Go Tests + runs-on: ubuntu-latest + services: + postgres: + image: postgres:16 + env: + POSTGRES_USER: root + POSTGRES_PASSWORD: password + POSTGRES_DB: arbeitszeitmessung + env: + POSTGRES_HOST: postgres + POSTGRES_USER: root + POSTGRES_PASSWORD: password + POSTGRES_DB: arbeitszeitmessung + POSTGRES_PORT: 5432 + RUNNER_TOOL_CACHE: /toolcache # Runner Tool Cache + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup go + uses: actions/setup-go@v5 + with: + go-version-file: Backend/go.mod + - uses: https://gitea.com/actions/go-hashfiles@v0.0.1 + id: hash-go + with: + patterns: | + go.mod + go.sum + - name: cache go + id: cache-go + uses: actions/cache@v4 + with: + path: |- + /go_path + /go_cache + key: arbeitszeitmessung-${{ steps.hash-go.outputs.hash }} + restore-keys: |- + arbeitszeitmessung- + - name: Run Go Tests + run: cd Backend && go test ./... + build: + name: Build Go Image and Upload + runs-on: ubuntu-latest + needs: [testing] + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: git.letsstein.de + username: ${{ gitea.actor }} + password: ${{ secrets.REGISTRY_TOKEN }} + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Build and push + uses: docker/build-push-action@v6 + with: + platforms: linux/amd64,linux/arm64 + push: true + context: Backend + tags: | + git.letsstein.de/tom/arbeitszeitmessung:latest + git.letsstein.de/tom/arbeitszeitmessung:${{ github.ref_name }} diff --git a/.gitea/workflows/tests/go-test.yaml b/.gitea/workflows/test.yaml similarity index 99% rename from .gitea/workflows/tests/go-test.yaml rename to .gitea/workflows/test.yaml index 654faa2..08cf542 100644 --- a/.gitea/workflows/tests/go-test.yaml +++ b/.gitea/workflows/test.yaml @@ -1,6 +1,6 @@ name: Tests run-name: ${{ gitea.actor }} is testing golang Code -on: push +on: [push] jobs: testing: diff --git a/Backend/Dockerfile b/Backend/Dockerfile index 098f454..c9ef35d 100644 --- a/Backend/Dockerfile +++ b/Backend/Dockerfile @@ -14,6 +14,7 @@ COPY . . RUN go build -o server . FROM alpine +RUN apk add --no-cache tzdata WORKDIR /app COPY --from=build /app/server /app/server diff --git a/Backend/endpoints/pdf.go b/Backend/endpoints/pdf.go new file mode 100644 index 0000000..0e47fcd --- /dev/null +++ b/Backend/endpoints/pdf.go @@ -0,0 +1,29 @@ +package endpoints + +import ( + "arbeitszeitmessung/helper" + "arbeitszeitmessung/models" + "arbeitszeitmessung/templates" + "log" + "net/http" + "time" +) + +func PDFHandler(w http.ResponseWriter, r *http.Request) { + helper.RequiresLogin(Session, w, r) + startDate, err := time.Parse("2006-01-02", "2025-08-01") + if err != nil { + log.Println("Error") + } + endDate := startDate.AddDate(0, 1, -1) + + user, err := models.GetUserFromSession(Session, r.Context()) + if err != nil { + log.Println("Error getting user!") + } + + weeks := models.GetWorkDays(user.CardUID, startDate, endDate) + + log.Printf("Using Dates: %s - %s\n", startDate.String(), endDate.String()) + templates.PDFReportEmploye(user, weeks, startDate, endDate).Render(r.Context(), w) +} diff --git a/Backend/endpoints/team.go b/Backend/endpoints/team.go index 33c5569..397d45a 100644 --- a/Backend/endpoints/team.go +++ b/Backend/endpoints/team.go @@ -56,7 +56,7 @@ func submitReport(w http.ResponseWriter, r *http.Request) { } func showWeeks(w http.ResponseWriter, r *http.Request) { - user, err := (*models.User).GetUserFromSession(nil, Session, r.Context()) + user, err := models.GetUserFromSession(Session, r.Context()) if err != nil { log.Println("No user found with the given personal number!") http.Redirect(w, r, "/user/login", http.StatusSeeOther) diff --git a/Backend/endpoints/team_presence.go b/Backend/endpoints/team_presence.go index b313627..e4ea775 100644 --- a/Backend/endpoints/team_presence.go +++ b/Backend/endpoints/team_presence.go @@ -23,7 +23,7 @@ func TeamPresenceHandler(w http.ResponseWriter, r *http.Request) { } func teamPresence(w http.ResponseWriter, r *http.Request) { - user, err := (*models.User).GetUserFromSession(nil, Session, r.Context()) + user, err := models.GetUserFromSession(Session, r.Context()) if err != nil { log.Println("Error getting user!", err) } diff --git a/Backend/endpoints/time.go b/Backend/endpoints/time.go index ac930e7..93b2b74 100644 --- a/Backend/endpoints/time.go +++ b/Backend/endpoints/time.go @@ -44,7 +44,7 @@ func parseTimestamp(r *http.Request, getKey string, fallback string) (time.Time, // Returns bookings from DB with similar card uid -> checks for card uid in http query params func getBookings(w http.ResponseWriter, r *http.Request) { - user, err := (*models.User).GetUserFromSession(nil, Session, r.Context()) + user, err := models.GetUserFromSession(Session, r.Context()) if err != nil { log.Println("No user found with the given personal number!") http.Redirect(w, r, "/user/login", http.StatusSeeOther) @@ -66,7 +66,7 @@ func getBookings(w http.ResponseWriter, r *http.Request) { } tsTo = tsTo.AddDate(0, 0, 1) // so that today is inside - workDays := (*models.WorkDay).GetWorkDays(nil, user.CardUID, tsFrom, tsTo) + workDays := models.GetWorkDays(user.CardUID, tsFrom, tsTo) sort.Slice(workDays, func(i, j int) bool { return workDays[i].Day.After(workDays[j].Day) }) @@ -104,7 +104,7 @@ func updateBooking(w http.ResponseWriter, r *http.Request) { log.Println("Error loading location", err) loc = time.Local } - user, err := (*models.User).GetUserFromSession(nil, Session, r.Context()) + user, err := models.GetUserFromSession(Session, r.Context()) if err != nil { log.Println("No user found!", err) return diff --git a/Backend/go.mod b/Backend/go.mod index d5c6953..2472dc8 100644 --- a/Backend/go.mod +++ b/Backend/go.mod @@ -1,6 +1,6 @@ module arbeitszeitmessung -go 1.24.5 +go 1.24.7 require github.com/lib/pq v1.10.9 diff --git a/Backend/helper/strings.go b/Backend/helper/strings.go new file mode 100644 index 0000000..4a15702 --- /dev/null +++ b/Backend/helper/strings.go @@ -0,0 +1,9 @@ +package helper + +func GetFirst[T, U any](val T, _ U) T { + return val +} + +func GetSecond[T, U any](_ T, val U) U { + return val +} diff --git a/Backend/helper/time.go b/Backend/helper/time.go index 643072e..0bd5551 100644 --- a/Backend/helper/time.go +++ b/Backend/helper/time.go @@ -20,6 +20,11 @@ func IsWeekend(ts time.Time) bool { return ts.Weekday() == time.Saturday || ts.Weekday() == time.Sunday } +func GetKW(t time.Time) int { + _, kw := t.ISOWeek() + return kw +} + // Converts duration to string func FormatDuration(d time.Duration) string { hours := int(d.Abs().Hours()) diff --git a/Backend/main.go b/Backend/main.go index 272eb6f..98a5e22 100644 --- a/Backend/main.go +++ b/Backend/main.go @@ -50,6 +50,7 @@ func main() { // server.HandleFunc("/user/settings", endpoints.UserSettingsHandler) server.HandleFunc("/team", endpoints.TeamHandler) server.HandleFunc("/team/presence", endpoints.TeamPresenceHandler) + server.HandleFunc("/pdf", endpoints.PDFHandler) server.Handle("/", http.RedirectHandler("/time", http.StatusPermanentRedirect)) server.Handle("/static/", http.StripPrefix("/static/", fs)) diff --git a/Backend/models/absence.go b/Backend/models/absence.go index c5184d0..bda305e 100644 --- a/Backend/models/absence.go +++ b/Backend/models/absence.go @@ -17,7 +17,6 @@ type Absence struct { CardUID string AbwesenheitTyp AbsenceType Datum time.Time - // Comment string } func NewAbsence(card_uid string, abwesenheit_typ int, datum time.Time) (Absence, error) { diff --git a/Backend/models/booking.go b/Backend/models/booking.go index 8b1140e..ba758f8 100644 --- a/Backend/models/booking.go +++ b/Backend/models/booking.go @@ -15,8 +15,8 @@ import ( type SameBookingError struct{} type BookingType struct { - Id int8 - Name string + Id int8 `json:"anwesenheit_id"` + Name string `json:"anwesenheit_name"` } func (e SameBookingError) Error() string { @@ -29,7 +29,7 @@ type Booking struct { CheckInOut int16 `json:"check_in_out"` Timestamp time.Time `json:"timestamp"` CounterId int `json:"counter_id"` - BookingType BookingType `json:"booking_type"` + BookingType BookingType `json:"anwesenheit_typ"` } type IDatabase interface { @@ -298,7 +298,7 @@ func (b *Booking) UpdateTime(newTime time.Time) { } func (b *Booking) ToString() string { - return fmt.Sprintf("Booking %d: at: %s, as type: %d", b.CounterId, b.Timestamp.Format("15:04"), b.CheckInOut) + return fmt.Sprintf("Booking %d: at: %s, CheckInOut: %d, TypeId: %d", b.CounterId, b.Timestamp.Format("15:04"), b.CheckInOut, b.BookingType.Id) } func GetBookingTypes() ([]BookingType, error) { diff --git a/Backend/models/user.go b/Backend/models/user.go index 6e82c70..016d683 100644 --- a/Backend/models/user.go +++ b/Backend/models/user.go @@ -22,7 +22,7 @@ type User struct { Overtime time.Duration } -func (u *User) GetUserFromSession(Session *scs.SessionManager, ctx context.Context) (User, error) { +func GetUserFromSession(Session *scs.SessionManager, ctx context.Context) (User, error) { var user User var err error if helper.GetEnv("GO_ENV", "production") == "debug" { diff --git a/Backend/models/workDay.go b/Backend/models/workDay.go index c009df3..cf8df46 100644 --- a/Backend/models/workDay.go +++ b/Backend/models/workDay.go @@ -19,69 +19,77 @@ type WorkDay struct { Absence Absence } -func (d *WorkDay) GetWorkDays(card_uid string, tsFrom, tsTo time.Time) []WorkDay { +func GetWorkDays(card_uid string, tsFrom, tsTo time.Time) []WorkDay { var workDays []WorkDay var workSec, pauseSec float64 qStr, err := DB.Prepare(` - WITH all_days AS ( - SELECT generate_series($2::DATE, $3::DATE - INTERVAL '1 day', INTERVAL '1 day')::DATE AS work_date - ), - ordered_bookings AS ( - SELECT - timestamp::DATE AS work_date, - timestamp, - check_in_out, - counter_id, - LAG(timestamp) OVER (PARTITION BY card_uid, timestamp::DATE ORDER BY timestamp) AS prev_timestamp, - LAG(check_in_out) OVER (PARTITION BY card_uid, timestamp::DATE ORDER BY timestamp) AS prev_check - FROM anwesenheit - WHERE card_uid = $1 - AND timestamp::DATE >= $2 - AND timestamp::DATE <= $3 - ), - abwesenheiten AS ( - SELECT - datum::DATE AS work_date, - abwesenheit_typ - FROM abwesenheit - WHERE card_uid = $1 - AND datum::DATE >= $2 - AND datum::DATE <= $3 - ) + WITH all_days AS ( + SELECT generate_series($2::DATE, $3::DATE - INTERVAL '1 day', INTERVAL '1 day')::DATE AS work_date +), +ordered_bookings AS ( SELECT - d.work_date, - COALESCE(MIN(b.timestamp), NOW()) AS time_from, - COALESCE(MAX(b.timestamp), NOW()) AS time_to, - COALESCE( - EXTRACT(EPOCH FROM SUM( - CASE - WHEN b.prev_check IN (1, 3) AND b.check_in_out IN (2, 4, 255) - THEN b.timestamp - b.prev_timestamp - ELSE INTERVAL '0' - END - )), 0 - ) AS total_work_seconds, - COALESCE( - EXTRACT(EPOCH FROM SUM( - CASE - WHEN b.prev_check IN (2, 4, 255) AND b.check_in_out IN (1, 3) - THEN b.timestamp - b.prev_timestamp - ELSE INTERVAL '0' - END - )), 0 - ) AS total_pause_seconds, - COALESCE(jsonb_agg(jsonb_build_object( - 'check_in_out', b.check_in_out, - 'timestamp', b.timestamp, - 'counter_id', b.counter_id - ) ORDER BY b.timestamp), '[]'::jsonb) AS bookings, - a.abwesenheit_typ - FROM all_days d - LEFT JOIN ordered_bookings b ON d.work_date = b.work_date - LEFT JOIN abwesenheiten a ON d.work_date = a.work_date - GROUP BY d.work_date, a.abwesenheit_typ - ORDER BY d.work_date ASC;`) + a.timestamp::DATE AS work_date, + a.timestamp, + a.check_in_out, + a.counter_id, + a.anwesenheit_typ, + sat.anwesenheit_name AS anwesenheit_typ_name, + LAG(a.timestamp) OVER (PARTITION BY a.card_uid, a.timestamp::DATE ORDER BY a.timestamp) AS prev_timestamp, + LAG(a.check_in_out) OVER (PARTITION BY a.card_uid, a.timestamp::DATE ORDER BY a.timestamp) AS prev_check + FROM anwesenheit a + LEFT JOIN s_anwesenheit_typen sat ON a.anwesenheit_typ = sat.anwesenheit_id + WHERE a.card_uid = $1 + AND a.timestamp::DATE >= $2 + AND a.timestamp::DATE <= $3 +), +abwesenheiten AS ( + SELECT + datum::DATE AS work_date, + abwesenheit_typ + FROM abwesenheit + WHERE card_uid = $1 + AND datum::DATE >= $2 + AND datum::DATE <= $3 +) +SELECT + d.work_date, + COALESCE(MIN(b.timestamp), NOW()) AS time_from, + COALESCE(MAX(b.timestamp), NOW()) AS time_to, + COALESCE( + EXTRACT(EPOCH FROM SUM( + CASE + WHEN b.prev_check IN (1, 3) AND b.check_in_out IN (2, 4, 254) + THEN b.timestamp - b.prev_timestamp + ELSE INTERVAL '0' + END + )), 0 + ) AS total_work_seconds, + COALESCE( + EXTRACT(EPOCH FROM SUM( + CASE + WHEN b.prev_check IN (2, 4, 254) AND b.check_in_out IN (1, 3) + THEN b.timestamp - b.prev_timestamp + ELSE INTERVAL '0' + END + )), 0 + ) AS total_pause_seconds, + COALESCE(jsonb_agg(jsonb_build_object( + 'check_in_out', b.check_in_out, + 'timestamp', b.timestamp, + 'counter_id', b.counter_id, + 'anwesenheit_typ', b.anwesenheit_typ, + 'anwesenheit_typ', jsonb_build_object( + 'anwesenheit_id', b.anwesenheit_typ, + 'anwesenheit_name', b.anwesenheit_typ_name + ) + ) ORDER BY b.timestamp), '[]'::jsonb) AS bookings, + a.abwesenheit_typ +FROM all_days d +LEFT JOIN ordered_bookings b ON d.work_date = b.work_date +LEFT JOIN abwesenheiten a ON d.work_date = a.work_date +GROUP BY d.work_date, a.abwesenheit_typ +ORDER BY d.work_date ASC;`) if err != nil { log.Println("Error preparing SQL statement", err) @@ -181,7 +189,7 @@ func (d *WorkDay) getWorkTime() { d.calcPauseTime() } -func (d *WorkDay) GetWorkTimeString() (string, string) { +func (d *WorkDay) GetWorkTimeString() (work string, pause string) { workString := helper.FormatDuration(d.workTime) pauseString := helper.FormatDuration(d.pauseTime) return workString, pauseString @@ -189,10 +197,10 @@ func (d *WorkDay) GetWorkTimeString() (string, string) { // returns bool wheter the workday was ended with an automatic logout func (d *WorkDay) RequiresAction() bool { - if len(d.Bookings) > 0 { - return d.Bookings[len(d.Bookings)-1].CheckInOut == 254 + if len(d.Bookings) == 0 { + return false } - return false + return d.Bookings[len(d.Bookings)-1].CheckInOut == 254 } // returns a integer percentage of how much day has been worked of diff --git a/Backend/models/workWeek.go b/Backend/models/workWeek.go index 5a9ef61..cb473d2 100644 --- a/Backend/models/workWeek.go +++ b/Backend/models/workWeek.go @@ -45,7 +45,7 @@ func NewWorkWeek(user User, tsMonday time.Time, populate bool) WorkWeek { } func (w *WorkWeek) PopulateWithBookings(worktime time.Duration, overtime time.Duration) { - w.WorkDays = (*WorkDay).GetWorkDays(nil, w.User.CardUID, w.WeekStart, w.WeekStart.Add(7*24*time.Hour)) + w.WorkDays = GetWorkDays(w.User.CardUID, w.WeekStart, w.WeekStart.Add(7*24*time.Hour)) if absences, err := GetAbsencesByCardUID(w.User.CardUID, w.WeekStart, w.WeekStart.Add(7*24*time.Hour)); err == nil { w.Absences = absences } else { @@ -193,3 +193,11 @@ func (w *WorkWeek) Accept() error { } return nil } + +func (w *WorkWeek) RequiresAction() bool { + var requiresAction bool = true + for _, day := range w.WorkDays { + requiresAction = requiresAction || day.RequiresAction() + } + return requiresAction +} diff --git a/Backend/static/css/styles.css b/Backend/static/css/styles.css index de26b86..93e47a6 100644 --- a/Backend/static/css/styles.css +++ b/Backend/static/css/styles.css @@ -189,12 +189,21 @@ .\@container { container-type: inline-size; } + .relative { + position: relative; + } .col-span-2 { grid-column: span 2 / span 2; } .col-span-3 { grid-column: span 3 / span 3; } + .col-span-6 { + grid-column: span 6 / span 6; + } + .col-span-7 { + grid-column: span 7 / span 7; + } .col-span-full { grid-column: 1 / -1; } @@ -364,6 +373,18 @@ .grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); } + .grid-cols-\[auto_1fr_1fr_1fr_1fr_1fr\] { + grid-template-columns: auto 1fr 1fr 1fr 1fr 1fr; + } + .grid-cols-\[auto_1fr_1fr_1fr_1fr_1fr_1fr\] { + grid-template-columns: auto 1fr 1fr 1fr 1fr 1fr 1fr; + } + .grid-cols-subgrid { + grid-template-columns: subgrid; + } + .grid-rows-6 { + grid-template-rows: repeat(6, minmax(0, 1fr)); + } .flex-col { flex-direction: column; } @@ -427,10 +448,6 @@ border-style: var(--tw-border-style); border-width: 1px; } - .border-0 { - border-style: var(--tw-border-style); - border-width: 0px; - } .border-neutral-200 { border-color: var(--color-neutral-200); } @@ -452,9 +469,6 @@ .bg-neutral-400 { background-color: var(--color-neutral-400); } - .bg-neutral-700 { - background-color: var(--color-neutral-700); - } .bg-orange-500 { background-color: var(--color-orange-500); } @@ -467,12 +481,21 @@ .mask-repeat { mask-repeat: repeat; } + .p-0 { + padding: calc(var(--spacing) * 0); + } .p-1 { padding: calc(var(--spacing) * 1); } .p-2 { padding: calc(var(--spacing) * 2); } + .p-8 { + padding: calc(var(--spacing) * 8); + } + .px-2 { + padding-inline: calc(var(--spacing) * 2); + } .px-3 { padding-inline: calc(var(--spacing) * 3); } @@ -699,12 +722,6 @@ } } } - .max-md\:border-0 { - @media (width < 48rem) { - border-style: var(--tw-border-style); - border-width: 0px; - } - } .max-md\:border-b-1 { @media (width < 48rem) { border-bottom-style: var(--tw-border-style); diff --git a/Backend/templates/headerComponent_templ.go b/Backend/templates/headerComponent_templ.go index aeef6ec..44846c8 100644 --- a/Backend/templates/headerComponent_templ.go +++ b/Backend/templates/headerComponent_templ.go @@ -1,6 +1,6 @@ // Code generated by templ - DO NOT EDIT. -// templ: version: v0.3.924 +// templ: version: v0.3.833 package templates //lint:file-ignore SA4006 This context is only used if a nested component is present. diff --git a/Backend/templates/pages.templ b/Backend/templates/pages.templ index e7c588e..b7865cf 100644 --- a/Backend/templates/pages.templ +++ b/Backend/templates/pages.templ @@ -150,7 +150,7 @@ templ TeamPage(weeks []models.WorkWeek, userWeek models.WorkWeek) {
vom Vorgesetzten bestätigt
} - + diff --git a/Backend/templates/pages_templ.go b/Backend/templates/pages_templ.go index d7cf3c8..c0d73e3 100644 --- a/Backend/templates/pages_templ.go +++ b/Backend/templates/pages_templ.go @@ -1,6 +1,6 @@ // Code generated by templ - DO NOT EDIT. -// templ: version: v0.3.924 +// templ: version: v0.3.833 package templates //lint:file-ignore SA4006 This context is only used if a nested component is present. @@ -441,7 +441,7 @@ func TeamPage(weeks []models.WorkWeek, userWeek models.WorkWeek) templ.Component if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - if time.Since(userWeek.WeekStart) < 24*7*time.Hour || userWeek.Status >= models.WeekStatusSent { + if time.Since(userWeek.WeekStart) < 24*7*time.Hour || userWeek.Status >= models.WeekStatusSent || userWeek.RequiresAction() { templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 35, " disabled") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err diff --git a/Backend/templates/pdf.templ b/Backend/templates/pdf.templ new file mode 100644 index 0000000..2aacb05 --- /dev/null +++ b/Backend/templates/pdf.templ @@ -0,0 +1,50 @@ +package templates + +import ( + "arbeitszeitmessung/models" + "arbeitszeitmessung/helper" + "time" +) + +templ PDFReportEmploye(e models.User, workDays []models.WorkDay, tsStart time.Time, tsEnd time.Time) { + {{ + _, kw := tsStart.ISOWeek() + }} + @Base() +Zeitraum: { tsStart.Format("02.01.2006") } - { tsEnd.Format("02.01.2006") }
+Arbeitszeit:
+Überstunden:
+{ kw }
+Kommen
+Gehen
+Arbeitsart
+Stunden gesamt
+Pause
+Überstunden
+ for _, day := range workDays{ + if day.Day.Weekday() == time.Monday { +Wochenende
+ } +{ day.Day.Format("02.01.2006") }
+ +{ day.Bookings[bookingI].Timestamp.Format("15:04") }
+{ day.Bookings[bookingI+1].Timestamp.Format("15:04") }
+{ day.Bookings[bookingI].BookingType.Name }
+ } +{ work }
+{ pause }
+{ helper.FormatDuration(day.CalcOvertime(e)) }
+ } + +Zeitraum: ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var2 string + templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(tsStart.Format("02.01.2006")) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/pdf.templ`, Line: 17, Col: 52} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, " - ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var3 string + templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(tsEnd.Format("02.01.2006")) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/pdf.templ`, Line: 17, Col: 98} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "
Arbeitszeit:
Überstunden:
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var4 string + templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(kw) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/pdf.templ`, Line: 22, Col: 34} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "
Kommen
Gehen
Arbeitsart
Stunden gesamt
Pause
Überstunden
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + for _, day := range workDays { + if day.Day.Weekday() == time.Monday { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "Wochenende
") + 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_Var5 string + templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(day.Day.Format("02.01.2006")) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/pdf.templ`, Line: 33, Col: 61} + } + _, 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, 7, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var6 string + templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(day.Bookings[bookingI].Timestamp.Format("15:04")) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/pdf.templ`, Line: 37, Col: 82} + } + _, 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, 9, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var7 string + templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(day.Bookings[bookingI+1].Timestamp.Format("15:04")) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/pdf.templ`, Line: 38, Col: 84} + } + _, 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, 10, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var8 string + templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(day.Bookings[bookingI].BookingType.Name) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/pdf.templ`, Line: 39, Col: 73} + } + _, 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, 11, "
") + 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_Var9 string + templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(work) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/pdf.templ`, Line: 43, Col: 38} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var10 string + templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(pause) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/pdf.templ`, Line: 44, Col: 39} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var11 string + templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(helper.FormatDuration(day.CalcOvertime(e))) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/pdf.templ`, Line: 45, Col: 76} + } + _, 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, 16, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "{ day.Day.Format("02.01.2006") }
-{ day.Absence.AbwesenheitTyp.Name }
- } else if !day.TimeFrom.Equal(day.TimeTo) { - { day.TimeFrom.Format("15:04") } - - - { day.TimeTo.Format("15:04") } - } else { -Keine Anwesenheit
- } -{ day.Absence.AbwesenheitTyp.Name }
+ case !day.TimeFrom.Equal(day.TimeTo): + { day.TimeFrom.Format("15:04") } + - + { day.TimeTo.Format("15:04") } + default: +Keine Anwesenheit
+ } +Bitte anpassen
+ }") + if !day.RequiresAction() { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var11 string + templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(day.Absence.AbwesenheitTyp.Name) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 52, Col: 43} + } + _, 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, 19, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + case !day.TimeFrom.Equal(day.TimeTo): + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var12 string + templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(day.TimeFrom.Format("15:04")) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 54, Col: 43} + } + _, 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, 21, " - ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var13 string + templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(day.TimeTo.Format("15:04")) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 56, Col: 41} + } + _, 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, 22, "") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + default: + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "Keine Anwesenheit
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } } - var templ_7745c5c3_Var13 string - templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(day.TimeTo.Format("15:04")) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 54, Col: 39} - } - _, 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, 21, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "Keine Anwesenheit
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, "Bitte anpassen
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 27, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var15 string templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(week.User.Vorname) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 70, Col: 53} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 75, Col: 53} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 25, " ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, " ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var16 string templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinStringErrs(week.User.Name) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 70, Col: 72} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 75, Col: 72} } _, 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, 26, "
Arbeitszeit: ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 30, "
Arbeitszeit: ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var17 string templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%s", helper.FormatDuration(week.Worktime))) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 74, Col: 78} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 79, Col: 78} } _, 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, 28, "
Überstunden: ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 31, "
Überstunden: ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var18 string templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%s", helper.FormatDuration(week.Overtime))) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 75, Col: 79} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 80, Col: 79} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var18)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 29, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 44, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var23 string templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(user.Vorname) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 108, Col: 19} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 113, Col: 19} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 42, " ") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 45, " ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var24 string templ_7745c5c3_Var24, templ_7745c5c3_Err = templ.JoinStringErrs(user.Name) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 108, Col: 33} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/teamComponents.templ`, Line: 113, Col: 33} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var24)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 43, "
Bitte anpassen
} else { -{ work }
- } -{ pause }
- if overtime != "" { -{ overtime }
+{ work }
+ if pause != "" { +{ pause }
+ } + if overtime != "" { +{ overtime }
+ } } } diff --git a/Backend/templates/timeComponents_templ.go b/Backend/templates/timeComponents_templ.go index 3242c18..aca6f54 100644 --- a/Backend/templates/timeComponents_templ.go +++ b/Backend/templates/timeComponents_templ.go @@ -1,6 +1,6 @@ // Code generated by templ - DO NOT EDIT. -// templ: version: v0.3.924 +// templ: version: v0.3.833 package templates //lint:file-ignore SA4006 This context is only used if a nested component is present. @@ -205,14 +205,14 @@ func dayComponent(workDay models.WorkDay, submitted bool) templ.Component { return templ_7745c5c3_Err } } else { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var11 string templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(work) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 60, Col: 36} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 60, Col: 35} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11)) if templ_7745c5c3_Err != nil { @@ -222,45 +222,51 @@ func dayComponent(workDay models.WorkDay, submitted bool) templ.Component { 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 - } - var templ_7745c5c3_Var12 string - templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(pause) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 62, Col: 148} - } - _, 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, 17, "
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - if overtime != "" { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "") + if pause != "" { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var12 string + templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(pause) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 62, Col: 150} + } + _, 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, 17, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, " ") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - var templ_7745c5c3_Var13 string - templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(overtime) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 64, Col: 133} - } - _, 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, 19, "") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err + if overtime != "" { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var13 string + templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(overtime) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 65, Col: 134} + } + _, 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, 20, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } } } } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "Ändern
Absenden
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -453,7 +459,7 @@ func timeGaugeComponent(progress uint8, today bool, warning bool) templ.Componen break } if today { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 33, "")
+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, " ")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
var templ_7745c5c3_Var34 string
templ_7745c5c3_Var34, templ_7745c5c3_Err = templ.JoinStringErrs(booking.Timestamp.Format("15:04"))
if templ_7745c5c3_Err != nil {
- return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 175, Col: 97}
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 177, Col: 97}
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var34))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 55, " ")
+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, "\" class=\"text-neutral-700 group-[.edit]:inline hidden bg-neutral-100 text-sm border border-neutral-200 rounded-md px-3 py-2 transition duration-300 ease focus:outline-none focus:border-neutral-400 hover:border-neutral-300\"> ")
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
var templ_7745c5c3_Var37 string
templ_7745c5c3_Var37, templ_7745c5c3_Err = templ.JoinStringErrs(booking.GetBookingType())
if templ_7745c5c3_Err != nil {
- return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 177, Col: 29}
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/timeComponents.templ`, Line: 179, Col: 29}
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var37))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, "