+
-
-
-
-
{$auth.user?.username}
-
Administrator
-
-
-
-
-
- {user?.username?.charAt(0).toUpperCase()}
-
+
+
+
+
+
+
{$auth.user?.username}
+
Administrator
+
+
+
+
+
+ {user?.username?.charAt(0).toUpperCase()}
+
+
+
+
+
+
+
+
+ {#if activeTab === "schedule"}
+
+ {:else if activeTab === "users"}
+
+ {:else if activeTab === "timeEntries"}
+
+ {:else if activeTab === "schoolYears"}
+
+ {:else if activeTab === "settings"}
+
+ {/if}
-
- {#if activeTab === 'schedule'}
-
- {:else if activeTab === 'users'}
-
- {:else if activeTab === 'timeEntries'}
-
- {:else if activeTab === 'schoolYears'}
-
- {:else if activeTab === 'settings'}
-
- {/if}
-
+
+
-
-
-
-
-
-
diff --git a/frontend/src/components/ScheduleItems.svelte b/frontend/src/components/ScheduleItems.svelte
index 11ce34d..c95444d 100644
--- a/frontend/src/components/ScheduleItems.svelte
+++ b/frontend/src/components/ScheduleItems.svelte
@@ -1,31 +1,33 @@
-
isClickable && dispatch('toggle')}
+ on:click={() => isClickable && dispatch("toggle")}
on:keydown={() => {}}
role="button"
tabindex="0"
@@ -34,6 +36,7 @@
{schedule.startTime} - {schedule.endTime}
- {schedule.title} {schedule.scheduleType === 'break' ? '(Pause)' : ''}
+ {schedule.title}
+ {schedule.scheduleType === "break" ? "(Pause)" : ""}
diff --git a/frontend/src/components/ToastNotification.svelte b/frontend/src/components/ToastNotification.svelte
index c8e6f23..0541026 100644
--- a/frontend/src/components/ToastNotification.svelte
+++ b/frontend/src/components/ToastNotification.svelte
@@ -1,34 +1,74 @@
{#each $toasts as toast (toast.id)}
-
- {#if toast.type === 'error'}
-
- {:else if toast.type === 'success'}
-
+ {#if toast.type === "error"}
+
+ {:else if toast.type === "success"}
+
{:else}
-
+
{/if}
-
+
{toast.message}
-
-
+
+
{/each}
diff --git a/frontend/src/components/UserDashboard.svelte b/frontend/src/components/UserDashboard.svelte
index ec4534e..5c74191 100644
--- a/frontend/src/components/UserDashboard.svelte
+++ b/frontend/src/components/UserDashboard.svelte
@@ -1,99 +1,135 @@
-
-
+
+
-
-
-
-
-
-
-
- - Mein Bereich
- - Stundenplan
-
-
-
KW {currentWeek}
-
-
-
-
-
{$auth.user?.username}
-
Benutzer
-
-
-
-
- {$auth.user?.username?.charAt(0).toUpperCase()}
-
-
-
-
-
+
+
-
-
-
-
-
-
-
Kalenderwoche
-
KW {currentWeek} / {currentISOYear}
-
{weekDates[0]?.date} — {weekDates[4]?.date}
-
-
-
-
-
-
-
-
-
Geleistet
-
{yearlyTotal.toFixed(1)}
-
-
-
-
-
Offen
-
{Math.max(0, remaining).toFixed(1)}
-
-
-
-
- {#if isLoadingData}
-
-
- {#each Array(5) as _}
-
- {/each}
-
-
-
- {#each Array(5) as _}
{/each}
-
-
- {:else}
- {#if hasEntriesForWeek && !weekEditMode}
-
-
-
Erfasst!
Stunden gespeichert.
-
-
- {:else if weekEditMode}
-
-
-
Bearbeitungsmodus
Speichern nicht vergessen!
-
-
-
-
-
- {:else}
-
-
-
Zeiterfassung
Wählen Sie Ihre Stunden.
-
- {/if}
-
-
-
-
-
- {#each weekDates as day}
- |
- {day.name}
- {day.date}
- |
- {/each}
-
-
-
-
- {#each weekDates as day}
- |
-
- {#each schedules.filter(s => s.dayOfWeek === day.dayIndex) as schedule}
- e.scheduleId === schedule.id && e.dayOfWeek === day.dayIndex)}
- isClickable={(!hasEntriesForWeek || weekEditMode) && !processing}
- on:toggle={() => toggleSelection(schedule.id, day.dayIndex)}
- />
- {/each}
-
- |
- {/each}
-
-
-
-
-
-
- {#each weekDates as day}
-
-
-
- {day.name}
- {day.date}
-
-
-
- {#each schedules.filter(s => s.dayOfWeek === day.dayIndex) as schedule}
- e.scheduleId === schedule.id && e.dayOfWeek === day.dayIndex)}
- isClickable={(!hasEntriesForWeek || weekEditMode) && !processing}
- on:toggle={() => toggleSelection(schedule.id, day.dayIndex)}
- />
- {/each}
-
-
-
- {/each}
-
- {/if}
-
+
+
+
+ - Mein Bereich
+ - Stundenplan
+
+
+
KW {currentWeek}
-
- {#if (!hasEntriesForWeek || weekEditMode) && !isLoadingData}
-
-
+
-
-
Jahresfortschritt
-
-
-
-
{yearlyTotal.toFixed(1)}
-
von {userTarget.toFixed(1)} Stunden
-
-
- {Math.round(progressPercent)}%
-
-
+
+
+
+
changeWeek(-1)}
+ disabled={isLoadingData}
+ >
+
+
+
+
+ Kalenderwoche
+
+
+ KW {currentWeek} /
+ {currentISOYear}
+
+
+ {weekDates[0]?.date} — {weekDates[4]?.date}
+
+
+
changeWeek(1)}
+ disabled={isLoadingData}
+ >
+
+
+
+
-
+
+
+
+
Geleistet
+
{yearlyTotal.toFixed(1)}
+
+
+
+
+
Offen
+
+ {Math.max(0, remaining).toFixed(1)}
+
+
+
+
-
- Verbleibend:
-
- {Math.max(0, remaining).toFixed(1)} h
-
-
-
-
+ {#if isLoadingData}
+
+
+ {#each Array(5) as _}
+
+ {/each}
+
+
+
+ {#each Array(5) as _}
+
+ {/each}
+
+ {:else}
+ {#if hasEntriesForWeek && !weekEditMode}
+
+
+
+
Erfasst!
+
Stunden gespeichert.
+
+
(weekEditMode = true)}
+ disabled={processing}>Bearbeiten
+
+ {:else if weekEditMode}
+
+
+
+
Bearbeitungsmodus
+
Speichern nicht vergessen!
+
+
+ Löschen
+ (weekEditMode = false)}>Abbrechen
+
+
+ {:else}
+
+
+
+
Zeiterfassung
+
Wählen Sie Ihre Stunden.
+
+
+ {/if}
+
+
+
+
+
+ {#each weekDates as day}
+ |
+ {day.name}
+ {day.date}
+ |
+ {/each}
+
+
+
+
+ {#each weekDates as day}
+ |
+
+ {#each schedules.filter((s) => s.dayOfWeek === day.dayIndex) as schedule}
+
+ e.scheduleId === schedule.id &&
+ e.dayOfWeek === day.dayIndex,
+ )}
+ isClickable={(!hasEntriesForWeek || weekEditMode) &&
+ !processing}
+ on:toggle={() =>
+ toggleSelection(schedule.id, day.dayIndex)}
+ />
+ {/each}
+
+ |
+ {/each}
+
+
+
-
-
-
- Abmelden
-
+
+ {#each weekDates as day}
+
+
+
+ {day.name}
+ {day.date}
+
+
+
+ {#each schedules.filter((s) => s.dayOfWeek === day.dayIndex) as schedule}
+
+ e.scheduleId === schedule.id &&
+ e.dayOfWeek === day.dayIndex,
+ )}
+ isClickable={(!hasEntriesForWeek || weekEditMode) &&
+ !processing}
+ on:toggle={() =>
+ toggleSelection(schedule.id, day.dayIndex)}
+ />
+ {/each}
+
+
+
+ {/each}
+ {/if}
+
+
+ {#if (!hasEntriesForWeek || weekEditMode) && !isLoadingData}
+
+
+ {#if processing}{/if}
+ {weekEditMode ? "Änderungen speichern" : "Speichern"}
+
+
+ {/if}
+
+
+
@@ -417,29 +677,59 @@
+
diff --git a/frontend/src/components/admin/AdminScheduleTab.svelte b/frontend/src/components/admin/AdminScheduleTab.svelte
index 323eb83..34ab17d 100644
--- a/frontend/src/components/admin/AdminScheduleTab.svelte
+++ b/frontend/src/components/admin/AdminScheduleTab.svelte
@@ -1,205 +1,341 @@
-
-
Neuen Eintrag erstellen
-
-
-
-
+
- | Tag | Zeit | Typ | Titel | Aktion |
+ | Tag | Zeit | Typ | Titel | Aktion |
{#each schedules as s (s.id)}
| {dayNames[s.dayOfWeek]} |
{s.startTime} - {s.endTime} |
- {s.scheduleType === 'break' ? 'Pause' : 'Unterricht'} |
+ {s.scheduleType === "break"
+ ? "Pause"
+ : "Unterricht"} |
{s.title} |
- handleDelete(s.id)}>Löschen |
+ handleDelete(s.id)}>Löschen |
{/each}
@@ -207,47 +343,78 @@