Added Krank Button, LDAP Sync auth
This commit is contained in:
@@ -261,6 +261,7 @@ function renderWeek() {
|
||||
const hours = entry.total_hours || 0;
|
||||
const overtimeTaken = entry.overtime_taken_hours || '';
|
||||
const vacationType = entry.vacation_type || '';
|
||||
const sickStatus = entry.sick_status || false;
|
||||
|
||||
// Tätigkeiten laden
|
||||
const activities = [
|
||||
@@ -272,26 +273,27 @@ function renderWeek() {
|
||||
];
|
||||
|
||||
// Prüfen ob Werktag (Montag-Freitag, i < 5) ausgefüllt ist
|
||||
// Bei ganztägigem Urlaub gilt der Tag als ausgefüllt
|
||||
if (i < 5 && vacationType !== 'full' && (!startTime || !endTime || startTime.trim() === '' || endTime.trim() === '')) {
|
||||
// Bei ganztägigem Urlaub oder Krank gilt der Tag als ausgefüllt
|
||||
if (i < 5 && vacationType !== 'full' && !sickStatus && (!startTime || !endTime || startTime.trim() === '' || endTime.trim() === '')) {
|
||||
allWeekdaysFilled = false;
|
||||
}
|
||||
|
||||
// Stunden zur Summe hinzufügen
|
||||
// Bei ganztägigem Urlaub sollten es bereits 8 Stunden sein (vom Backend gesetzt)
|
||||
// Bei ganztägigem Urlaub oder Krank sollten es bereits 8 Stunden sein (vom Backend gesetzt)
|
||||
// Bei halbem Tag Urlaub werden die Urlaubsstunden später in der Überstunden-Berechnung hinzugezählt
|
||||
totalHours += hours;
|
||||
|
||||
// Bearbeitung ist immer möglich, auch nach Abschicken
|
||||
// Bei ganztägigem Urlaub werden Zeitfelder deaktiviert
|
||||
// Bei ganztägigem Urlaub oder Krank werden Zeitfelder deaktiviert
|
||||
const isFullDayVacation = vacationType === 'full';
|
||||
const timeFieldsDisabled = isFullDayVacation ? 'disabled' : '';
|
||||
const isSick = sickStatus === true || sickStatus === 1;
|
||||
const timeFieldsDisabled = (isFullDayVacation || isSick) ? 'disabled' : '';
|
||||
const disabled = '';
|
||||
|
||||
html += `
|
||||
<tr>
|
||||
<td><strong>${getWeekday(dateStr)}</strong></td>
|
||||
<td>${formatDateDE(dateStr)}${isFullDayVacation ? ' <span style="color: #28a745;">(Urlaub - ganzer Tag)</span>' : ''}</td>
|
||||
<td>${formatDateDE(dateStr)}${isFullDayVacation ? ' <span style="color: #28a745;">(Urlaub - ganzer Tag)</span>' : ''}${isSick ? ' <span style="color: #e74c3c;">(Krank)</span>' : ''}</td>
|
||||
<td>
|
||||
<input type="time" value="${startTime}"
|
||||
data-date="${dateStr}" data-field="start_time"
|
||||
@@ -309,7 +311,7 @@ function renderWeek() {
|
||||
data-date="${dateStr}" data-field="break_minutes"
|
||||
${timeFieldsDisabled} ${disabled} oninput="saveEntry(this)" onchange="saveEntry(this)">
|
||||
</td>
|
||||
<td><strong id="hours_${dateStr}">${isFullDayVacation ? '8.00 h (Urlaub)' : hours.toFixed(2) + ' h'}</strong></td>
|
||||
<td><strong id="hours_${dateStr}">${isFullDayVacation ? '8.00 h (Urlaub)' : isSick ? '8.00 h (Krank)' : hours.toFixed(2) + ' h'}</strong></td>
|
||||
</tr>
|
||||
<tr class="activities-row">
|
||||
<td colspan="6" class="activities-cell">
|
||||
@@ -395,6 +397,21 @@ function renderWeek() {
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sick-control">
|
||||
<button type="button" class="btn btn-secondary btn-sm" onclick="toggleSickStatus('${dateStr}')" style="margin-right: 5px;">
|
||||
Krank
|
||||
</button>
|
||||
<div id="sick-checkbox-${dateStr}" style="display: ${sickStatus ? 'inline-block' : 'none'};">
|
||||
<input type="checkbox"
|
||||
data-date="${dateStr}"
|
||||
data-field="sick_status"
|
||||
${sickStatus ? 'checked' : ''}
|
||||
${disabled}
|
||||
onchange="saveEntry(this); updateOvertimeDisplay();"
|
||||
style="margin-left: 5px;"
|
||||
class="sick-checkbox">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -486,12 +503,16 @@ function updateOvertimeDisplay() {
|
||||
date.setDate(date.getDate() + i);
|
||||
const dateStr = formatDate(date);
|
||||
|
||||
// Prüfe Urlaub-Status
|
||||
// Prüfe Urlaub-Status und Krank-Status
|
||||
const vacationSelect = document.querySelector(`select[data-date="${dateStr}"][data-field="vacation_type"]`);
|
||||
const vacationType = vacationSelect ? vacationSelect.value : (currentEntries[dateStr]?.vacation_type || '');
|
||||
const sickCheckbox = document.querySelector(`input[data-date="${dateStr}"][data-field="sick_status"]`);
|
||||
const sickStatus = sickCheckbox ? sickCheckbox.checked : (currentEntries[dateStr]?.sick_status || false);
|
||||
|
||||
if (vacationType === 'full') {
|
||||
totalHours += 8; // Ganzer Tag Urlaub = 8 Stunden
|
||||
} else if (sickStatus) {
|
||||
totalHours += 8; // Krank = 8 Stunden
|
||||
} else {
|
||||
// Berechne Stunden direkt aus Start-/Endzeit und Pause
|
||||
const startInput = document.querySelector(`input[data-date="${dateStr}"][data-field="start_time"]`);
|
||||
@@ -594,6 +615,7 @@ async function saveEntry(input) {
|
||||
const notesInput = document.querySelector(`textarea[data-date="${date}"][data-field="notes"]`);
|
||||
const vacationSelect = document.querySelector(`select[data-date="${date}"][data-field="vacation_type"]`);
|
||||
const overtimeInput = document.querySelector(`input[data-date="${date}"][data-field="overtime_taken_hours"]`);
|
||||
const sickCheckbox = document.querySelector(`input[data-date="${date}"][data-field="sick_status"]`);
|
||||
|
||||
// Wenn das aktuelle Input-Element das gesuchte Feld ist, verwende dessen Wert direkt
|
||||
// Das stellt sicher, dass der Wert auch bei oninput/onchange sofort verfügbar ist
|
||||
@@ -612,6 +634,7 @@ async function saveEntry(input) {
|
||||
const notes = notesInput ? (notesInput.value || '') : (currentEntries[date].notes || '');
|
||||
const vacation_type = vacationSelect && vacationSelect.value ? vacationSelect.value : (currentEntries[date].vacation_type || null);
|
||||
const overtime_taken_hours = overtimeInput && overtimeInput.value ? overtimeInput.value : (currentEntries[date].overtime_taken_hours || null);
|
||||
const sick_status = sickCheckbox ? (sickCheckbox.checked ? true : false) : (currentEntries[date].sick_status || false);
|
||||
|
||||
// Activity-Felder aus DOM lesen
|
||||
const activities = [];
|
||||
@@ -634,6 +657,7 @@ async function saveEntry(input) {
|
||||
currentEntries[date].notes = notes;
|
||||
currentEntries[date].vacation_type = vacation_type;
|
||||
currentEntries[date].overtime_taken_hours = overtime_taken_hours;
|
||||
currentEntries[date].sick_status = sick_status;
|
||||
for (let i = 1; i <= 5; i++) {
|
||||
currentEntries[date][`activity${i}_desc`] = activities[i-1].desc;
|
||||
currentEntries[date][`activity${i}_hours`] = activities[i-1].hours;
|
||||
@@ -671,7 +695,8 @@ async function saveEntry(input) {
|
||||
activity5_hours: activities[4].hours,
|
||||
activity5_project_number: activities[4].projectNumber,
|
||||
overtime_taken_hours: overtime_taken_hours,
|
||||
vacation_type: vacation_type
|
||||
vacation_type: vacation_type,
|
||||
sick_status: sick_status
|
||||
})
|
||||
});
|
||||
|
||||
@@ -727,15 +752,17 @@ function checkWeekComplete() {
|
||||
date.setDate(date.getDate() + i);
|
||||
const dateStr = formatDate(date);
|
||||
|
||||
// Prüfe Urlaub-Status
|
||||
// Prüfe Urlaub-Status und Krank-Status
|
||||
const entry = currentEntries[dateStr] || {};
|
||||
const vacationType = entry.vacation_type;
|
||||
const vacationSelect = document.querySelector(`select[data-date="${dateStr}"][data-field="vacation_type"]`);
|
||||
const vacationValue = vacationSelect ? vacationSelect.value : (vacationType || '');
|
||||
const sickCheckbox = document.querySelector(`input[data-date="${dateStr}"][data-field="sick_status"]`);
|
||||
const sickStatus = sickCheckbox ? sickCheckbox.checked : (entry.sick_status || false);
|
||||
|
||||
// Wenn ganzer Tag Urlaub, dann ist der Tag als ausgefüllt zu betrachten
|
||||
if (vacationValue === 'full') {
|
||||
continue; // Tag ist ausgefüllt (ganzer Tag Urlaub)
|
||||
// Wenn ganzer Tag Urlaub oder Krank, dann ist der Tag als ausgefüllt zu betrachten
|
||||
if (vacationValue === 'full' || sickStatus) {
|
||||
continue; // Tag ist ausgefüllt (ganzer Tag Urlaub oder Krank)
|
||||
}
|
||||
|
||||
// Prüfe IMMER direkt die Input-Felder im DOM (das ist die zuverlässigste Quelle)
|
||||
@@ -832,14 +859,16 @@ async function submitWeek() {
|
||||
const weekday = getWeekday(dateStr);
|
||||
const dateDisplay = formatDateDE(dateStr);
|
||||
|
||||
// Prüfe Urlaub-Status
|
||||
// Prüfe Urlaub-Status und Krank-Status
|
||||
const entry = currentEntries[dateStr] || {};
|
||||
const vacationSelect = document.querySelector(`select[data-date="${dateStr}"][data-field="vacation_type"]`);
|
||||
const vacationValue = vacationSelect ? vacationSelect.value : (entry.vacation_type || '');
|
||||
const sickCheckbox = document.querySelector(`input[data-date="${dateStr}"][data-field="sick_status"]`);
|
||||
const sickStatus = sickCheckbox ? sickCheckbox.checked : (entry.sick_status || false);
|
||||
|
||||
// Wenn ganzer Tag Urlaub, dann ist der Tag als ausgefüllt zu betrachten
|
||||
if (vacationValue === 'full') {
|
||||
continue; // Tag ist ausgefüllt (ganzer Tag Urlaub)
|
||||
// Wenn ganzer Tag Urlaub oder Krank, dann ist der Tag als ausgefüllt zu betrachten
|
||||
if (vacationValue === 'full' || sickStatus) {
|
||||
continue; // Tag ist ausgefüllt (ganzer Tag Urlaub oder Krank)
|
||||
}
|
||||
|
||||
// Prüfe IMMER direkt die Input-Felder im DOM - auch bei manueller Eingabe
|
||||
@@ -1105,3 +1134,36 @@ function toggleVacationSelect(dateStr) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Krank-Status ein-/ausblenden
|
||||
function toggleSickStatus(dateStr) {
|
||||
const checkboxDiv = document.getElementById(`sick-checkbox-${dateStr}`);
|
||||
if (checkboxDiv) {
|
||||
if (checkboxDiv.style.display === 'none' || !checkboxDiv.style.display) {
|
||||
checkboxDiv.style.display = 'inline-block';
|
||||
const checkbox = checkboxDiv.querySelector('input[type="checkbox"]');
|
||||
if (checkbox) {
|
||||
// Prüfe aktuellen Status aus currentEntries
|
||||
const currentSickStatus = currentEntries[dateStr]?.sick_status || false;
|
||||
checkbox.checked = currentSickStatus || true; // Wenn nicht gesetzt, auf true setzen
|
||||
checkbox.focus();
|
||||
// Sofort speichern wenn aktiviert
|
||||
if (!currentSickStatus) {
|
||||
saveEntry(checkbox);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Wert löschen wenn ausgeblendet
|
||||
const checkbox = checkboxDiv.querySelector('input[type="checkbox"]');
|
||||
if (checkbox) {
|
||||
checkbox.checked = false;
|
||||
// Speichern
|
||||
if (currentEntries[dateStr]) {
|
||||
currentEntries[dateStr].sick_status = false;
|
||||
saveEntry(checkbox);
|
||||
}
|
||||
}
|
||||
checkboxDiv.style.display = 'none';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user