Einträge
Stunden, Kosten und Fahrten verwalten
@if (running(); as timer) {
timer Timer läuft {{ elapsed(timer) }} {{ timer.praktikums_typ }} · {{ timer.entry_art }}
30 Minuten Pause abziehen
stop Timer stoppen
} @else {
timer Zeiterfassung Timer starten
Ausbildung @for(t of types;track t){{{t}} }
Art @for(a of timerArts();track a){{{a}} }
play_arrow Timer starten
}
Suche search Ausbildung Alle
@for (t of types; track t) {
{{ t }}
}
Von Jahr Alle @for(y of years();track y){{{y}} }Bis Jahr Alle @for(y of years();track y){{{y}} }
Zurücksetzen
@if (loading()) {
}
Datum
{{ e.date | date: "dd.MM.yyyy" }}
Ausbildung
{{ e.praktikums_typ }}
Art {{e.entry_art}} Zeit
{{ e.hours }} h {{ e.minutes }} min
Details
{{ e.beschreibung || "–" }}
Kilometer {{e.distance_km || 0 | number:"1.0-2"}} km Pauschale {{e.kilometer_pauschale || 0 | number:"1.2-2"}} € Kosten {{e.kosten || 0 | number:"1.2-2"}} € Fortbildung {{e.zaehlt_als_fortbildung ? "check_circle" : "remove"}}
@if (!loading() && !entries().length) {
event_busy
Noch keine passenden Einträge vorhanden.
}
Angezeigt: {{visibleEntries().length}} · Gesamt: {{entries().length}}
`,
styles: [
`
.filters {
margin-bottom: 20px;
}
.entries-page {
max-width: 1720px;
}
.timer-card { margin-bottom: 20px; }
.timer-card mat-card-content { display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap; }
.timer-card mat-card-content > div { display:grid;grid-template-columns:auto 1fr;gap:3px 10px;margin-right:auto; }
.timer-card mat-card-content > div > mat-icon {
grid-row:1/4;
align-self:center;
display:grid;
place-items:center;
width:40px;
height:40px;
border-radius:12px;
color:var(--app-primary);
background:color-mix(in srgb,var(--app-primary) 13%,transparent);
}
.timer-card button mat-icon { color:inherit; }
.timer-card mat-card-content > button,
.filters mat-card-content > button {
align-self:flex-start;
min-height:48px;
margin-top:4px;
}
.timer-start mat-icon, .timer-stop mat-icon { opacity:1; }
.timer-card strong { font-size:1.25rem; }
.filters mat-card-content {
display: flex;
gap: 12px;
align-items: flex-start;
flex-wrap: wrap;
}
.filters mat-form-field {
min-width: 220px;
}
.table-card {
padding: 0;
overflow: hidden;
}
.entry-count { padding:12px 18px;color:#687287;border-top:1px solid rgba(120,130,145,.2);font-size:.85rem; }
.training-state { color:var(--app-muted);vertical-align:middle; }
.training-state.is-active { color:#198754; }
.mat-column-actions { width:108px;min-width:108px;white-space:nowrap; }
.mat-column-time { width:128px;min-width:128px;white-space:nowrap; }
.entry-actions { display:flex;align-items:center;justify-content:flex-end;gap:8px;white-space:nowrap; }
.entry-actions .mat-mdc-icon-button { flex:0 0 40px;width:40px;height:40px;padding:8px;border-radius:10px; }
.edit-action { color:#0d6efd;background:rgba(13,110,253,.11); }
.delete-action { color:#c62828;background:rgba(198,40,40,.11); }
.edit-action:hover { background:rgba(13,110,253,.19); }
.delete-action:hover { background:rgba(198,40,40,.19); }
td strong,
td small {
display: block;
}
td small {
color: #687287;
margin-top: 4px;
}
th {
font-weight: 700;
}
tr.mat-mdc-row > td:first-child {
border-left: 4px solid transparent;
}
tr.mat-mdc-row.type-propaedeutikum:nth-of-type(odd) > td {
background-color: rgba(13, 110, 253, 0.055);
}
tr.mat-mdc-row.type-propaedeutikum:nth-of-type(even) > td {
background-color: rgba(13, 110, 253, 0.115);
}
tr.mat-mdc-row.type-fachspezifikum:nth-of-type(odd) > td {
background-color: rgba(25, 135, 84, 0.055);
}
tr.mat-mdc-row.type-fachspezifikum:nth-of-type(even) > td {
background-color: rgba(25, 135, 84, 0.115);
}
tr.mat-mdc-row.type-mediation:nth-of-type(odd) > td {
background-color: rgba(253, 126, 20, 0.065);
}
tr.mat-mdc-row.type-mediation:nth-of-type(even) > td {
background-color: rgba(253, 126, 20, 0.135);
}
tr.mat-mdc-row.type-propaedeutikum:hover > td {
background-color: rgba(13, 110, 253, 0.17);
}
tr.mat-mdc-row.type-fachspezifikum:hover > td {
background-color: rgba(25, 135, 84, 0.17);
}
tr.mat-mdc-row.type-mediation:hover > td {
background-color: rgba(253, 126, 20, 0.19);
}
tr.mat-mdc-row.type-propaedeutikum > td:first-child { border-left-color: #0d6efd; }
tr.mat-mdc-row.type-fachspezifikum > td:first-child { border-left-color: #198754; }
tr.mat-mdc-row.type-mediation > td:first-child { border-left-color: #fd7e14; }
tr.mat-mdc-row.entry-today {
font-weight: 700;
}
tr.mat-mdc-row.entry-today > td {
box-shadow: inset 0 3px 0 #7c3aed, inset 0 -3px 0 #7c3aed;
}
tr.mat-mdc-row.entry-today > td:first-child {
border-left:6px solid #7c3aed;
}
tr.mat-mdc-row.entry-today > td:last-child {
border-right:3px solid #7c3aed;
}
:host-context(body.dark) tr.mat-mdc-row.type-propaedeutikum:nth-of-type(odd) > td { background-color: rgba(62, 139, 255, 0.12); }
:host-context(body.dark) tr.mat-mdc-row.type-propaedeutikum:nth-of-type(even) > td { background-color: rgba(62, 139, 255, 0.18); }
:host-context(body.dark) tr.mat-mdc-row.type-fachspezifikum:nth-of-type(odd) > td { background-color: rgba(53, 184, 116, 0.12); }
:host-context(body.dark) tr.mat-mdc-row.type-fachspezifikum:nth-of-type(even) > td { background-color: rgba(53, 184, 116, 0.18); }
:host-context(body.dark) tr.mat-mdc-row.type-mediation:nth-of-type(odd) > td { background-color: rgba(255, 143, 51, 0.13); }
:host-context(body.dark) tr.mat-mdc-row.type-mediation:nth-of-type(even) > td { background-color: rgba(255, 143, 51, 0.2); }
:host-context(body.dark) tr.mat-mdc-row.type-propaedeutikum:hover > td { background-color: rgba(62, 139, 255, 0.25); }
:host-context(body.dark) tr.mat-mdc-row.type-fachspezifikum:hover > td { background-color: rgba(53, 184, 116, 0.25); }
:host-context(body.dark) tr.mat-mdc-row.type-mediation:hover > td { background-color: rgba(255, 143, 51, 0.27); }
:host-context(body.dark) tr.mat-mdc-row.entry-today > td {
box-shadow: inset 0 3px 0 #b794f4, inset 0 -3px 0 #b794f4;
}
:host-context(body.dark) tr.mat-mdc-row.entry-today > td:first-child { border-left-color:#b794f4; }
:host-context(body.dark) tr.mat-mdc-row.entry-today > td:last-child { border-right-color:#b794f4; }
:host-context(body.dark) .edit-action { color:#8bb7ff;background:rgba(62,139,255,.2); }
:host-context(body.dark) .delete-action { color:#ff9b9b;background:rgba(255,90,90,.18); }
@media (max-width: 700px) {
.filters mat-form-field {
width: 100%;
}
.mat-column-details {
display: none;
}
}
`,
],
})
export class EntriesComponent implements OnInit {
readonly entries = signal