170 lines
6.4 KiB
Plaintext
170 lines
6.4 KiB
Plaintext
package templates
|
|
|
|
import (
|
|
"arbeitszeitmessung/helper"
|
|
"arbeitszeitmessung/models"
|
|
"net/url"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
templ TimePage(workDays []models.WorkDay, lastSub time.Time) {
|
|
{{
|
|
allDays := ctx.Value("days").([]models.IWorkDay)
|
|
}}
|
|
@Base()
|
|
@headerComponent()
|
|
<div class="grid-main divide-y-1">
|
|
@inputForm()
|
|
for _, day := range allDays {
|
|
@defaultDayComponent(day)
|
|
if (day.Date().Weekday() == time.Monday) {
|
|
<div class="grid-sub responsive bg-neutral-300 h-2"></div>
|
|
}
|
|
}
|
|
</div>
|
|
@LegendComponent()
|
|
}
|
|
|
|
templ inputForm() {
|
|
{{
|
|
urlParams := ctx.Value("urlParams").(url.Values)
|
|
user := ctx.Value("user").(models.User)
|
|
}}
|
|
<div class="grid-sub divide-x-1 bg-neutral-300 responsive">
|
|
<div class="grid-cell md:col-span-1 max-md:grid grid-cols-2">
|
|
<p class="font-bold uppercase">{ user.Vorname + " " + user.Name }</p>
|
|
<div class="justify-self-end">
|
|
<p class="text-sm">Überstunden</p>
|
|
<p class="text-accent">{ user.Overtime }</p>
|
|
</div>
|
|
</div>
|
|
<form id="timeRangeForm" method="GET" class="grid-cell flex flex-row md:col-span-3 gap-2 ">
|
|
@lineComponent()
|
|
<div class="flex flex-col gap-2 justify-between grow-1">
|
|
<input type="date" value={ urlParams.Get("time_from") } name="time_from" class="btn bg-neutral-100" placeholder="Zeitraum von..."/>
|
|
<input type="date" value={ urlParams.Get("time_to") } name="time_to" class="btn bg-neutral-100" placeholder="Zeitraum bis..."/>
|
|
</div>
|
|
</form>
|
|
<div class="grid-cell content-end">
|
|
<button type="submit" form="timeRangeForm" class="btn bg-neutral-100 hover:bg-neutral-700 color-neutral-700">
|
|
<p class="">Anzeigen</p>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
<form id="absence_form" method="POST" action="/absence" class="grid-sub responsive scroll-m-2 bg-neutral-300 hidden">
|
|
<input type="hidden" name="aw_id" value=""/>
|
|
<div class="grid-cell border-r-1"><p class="font-bold uppercase">Abwesenheit</p></div>
|
|
<div class="grid-cell">
|
|
<label class="block mb-1 text-sm text-neutral-700">Abwesenheitsart</label>
|
|
<div class="relative">
|
|
<select name="aw_type" class="btn appearance-none cursor-pointer bg-neutral-100">
|
|
for _, absence := range models.GetAbsenceTypesCached() {
|
|
<option value={ strconv.Itoa(int(absence.Id)) }>{ absence.Name }</option>
|
|
}
|
|
</select>
|
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.2" stroke="currentColor" class="h-5 w-5 ml-1 absolute top-2.5 right-2.5 text-slate-700">
|
|
<path stroke-linecap="round" stroke-linejoin="round" d="M8.25 15 12 18.75 15.75 15m-7.5-6L12 5.25 15.75 9"></path>
|
|
</svg>
|
|
</div>
|
|
</div>
|
|
<div class="grid-cell">
|
|
<label class="block mb-1 text-sm text-neutral-700">Abwesenheit ab</label>
|
|
<input name="date_from" type="date" class="btn bg-neutral-100"/>
|
|
</div>
|
|
<div class="grid-cell border-r-1">
|
|
<label class="block mb-1 text-sm text-neutral-700">Abwesenheit bis</label>
|
|
<input name="date_to" type="date" class="btn bg-neutral-100"/>
|
|
</div>
|
|
<div class="grid-cell flex flex-row items-end">
|
|
<div class="flex flex-row gap-2 w-full">
|
|
<button name="action" value="insert" type="submit" class="bg-neutral-100 btn hover:bg-neutral-700">Speichern</button>
|
|
<button name="action" value="delete" type="submit" class="bg-neutral-100 btn hover:bg-red-700 flex basis-[content]"><span class="icon-[material-symbols-light--delete-outline]"></span></button>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
}
|
|
|
|
templ defaultDayComponent(day models.IWorkDay) {
|
|
{{
|
|
user := ctx.Value("user").(models.User)
|
|
justify := "justify-center"
|
|
if day.IsWorkDay() && len(day.(*models.WorkDay).Bookings) > 1 {
|
|
justify = "justify-between"
|
|
}
|
|
}}
|
|
<div class={ "grid-sub divide-x-1 hover:bg-neutral-200 transition-colors" }>
|
|
<div class="grid-cell md:col-span-1 flex flex-row gap-2">
|
|
@timeGaugeComponent(day.GetDayProgress(user), day.Date().Equal(time.Now().Truncate(24*time.Hour)))
|
|
<div>
|
|
<p>
|
|
<span class="font-bold uppercase hidden md:inline">{ day.Date().Format("Mon") }:</span> { day.Date().Format(
|
|
|
|
"02.01.2006") }
|
|
</p>
|
|
if day.IsWorkDay() {
|
|
{{
|
|
workDay, _ := day.(*models.WorkDay)
|
|
work, pause, overtime := workDay.GetAllWorkTimesVirtual(user)
|
|
}}
|
|
if day.RequiresAction() {
|
|
<p class="text-red-600">Bitte anpassen</p>
|
|
} else {
|
|
if work > 0 {
|
|
<p class=" text-sm mt-1">Arbeitszeit:</p>
|
|
<p class="text-accent flex flex-row items-center"><span class="icon-[material-symbols-light--schedule-outline]"></span>{ helper.FormatDuration(work) }</p>
|
|
}
|
|
if pause > 0 {
|
|
<p class="text-neutral-500 flex flex-row items-center"><span class="icon-[material-symbols-light--motion-photos-paused-outline]"></span>{ helper.FormatDuration(pause) }</p>
|
|
}
|
|
if overtime != 0 && len(workDay.Bookings) > 0 {
|
|
<p class="text-neutral-500 flex flex-row items-center">
|
|
<span class="icon-[material-symbols-light--more-time]"></span>
|
|
{ helper.FormatDuration(overtime) }
|
|
</p>
|
|
}
|
|
}
|
|
}
|
|
</div>
|
|
</div>
|
|
<div class="all-booking-component grid-cell flex flex-row md:col-span-3 gap-2 w-full">
|
|
@lineComponent()
|
|
<form id={ "time-" + day.Date().Format("2006-01-02") } class={ "flex flex-col gap-2 group w-full ", justify } method="post">
|
|
@newAbsenceComponent()
|
|
if day.IsWorkDay() {
|
|
{{
|
|
workDay, _ := day.(*models.WorkDay)
|
|
}}
|
|
if len(workDay.Bookings) < 1 {
|
|
<p class="text group-[.edit]:hidden">Keine Buchung gefunden. Bitte Arbeitsstunden oder Grund der Abwesenheit eingeben!</p>
|
|
}
|
|
for _, booking := range workDay.Bookings {
|
|
@bookingComponent(booking)
|
|
}
|
|
@newBookingComponent(workDay)
|
|
if workDay.IsKurzArbeit() {
|
|
@absentInput(workDay.GetKurzArbeit())
|
|
<p>Kurzarbeit</p>
|
|
}
|
|
} else {
|
|
{{
|
|
absentDay, _ := day.(*models.Absence)
|
|
}}
|
|
@absentInput(*absentDay)
|
|
<p>{ absentDay.AbwesenheitTyp.Name } <span class="text-neutral-700">bis { absentDay.DateTo.Format("02.01.2006") }</span></p>
|
|
}
|
|
</form>
|
|
</div>
|
|
<div class="grid-cell">
|
|
@changeButtonComponent("time-"+day.Date().Format("2006-01-02"), day.IsWorkDay())
|
|
</div>
|
|
</div>
|
|
}
|
|
|
|
templ absentInput(a models.Absence) {
|
|
<input type="hidden" name="date_from" value={ a.DateFrom.Format("2006-01-02") }/>
|
|
<input type="hidden" name="date_to" value={ a.DateTo.Format("2006-01-02") }/>
|
|
<input type="hidden" name="aw_type" value={ a.AbwesenheitTyp.Id }/>
|
|
<input type="hidden" name="aw_id" value={ a.CounterId }/>
|
|
}
|