Abwesenheitskalender erweitert

This commit is contained in:
2026-04-01 23:59:28 +02:00
parent 6360af272a
commit aae89a45a8
12 changed files with 1416 additions and 622 deletions
+34 -10
View File
@@ -10,14 +10,21 @@ include 'header.php';
<div class="container">
<h2>Team Urlaubskalender</h2>
<p>Dieser Kalender zeigt nur Urlaub von Personen sowie Betriebsurlaub. Andere Abwesenheitsarten werden hier bewusst ausgeblendet.</p>
<div id="calendar"></div>
<br>
<div>
<span class="badge badge-success">genehmigt</span>
<span class="badge badge-warning">beantragt</span>
<div class="mb-3">
<strong>Anzeige:</strong><br>
<span class="badge badge-success">Urlaub</span>
<span class="badge badge-primary">Betriebsurlaub</span>
</div>
<br>
<div class="mb-3">
<strong>Status:</strong><br>
<span class="badge badge-success">Genehmigt</span>
<span class="badge badge-warning">Beantragt</span>
<span class="badge badge-secondary">Abgelehnt</span>
</div>
<div id="eventDetails" style="display:none;">
<h4>Details</h4>
<div id="detailsContent"></div>
@@ -30,27 +37,44 @@ include 'header.php';
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
function formatAllDayRange(start, end) {
var startLabel = start.toLocaleDateString('de-DE');
if (!end) {
return startLabel;
}
var inclusiveEnd = new Date(end.getTime() - 24 * 60 * 60 * 1000);
return startLabel + ' - ' + inclusiveEnd.toLocaleDateString('de-DE');
}
var calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'dayGridMonth',
firstDay: 1,
height: 650,
events: function(info, successCallback, failureCallback) {
var url = 'api/vacations.php?start=' + info.startStr + '&end=' + info.endStr + '&public=1&public_all=1';
fetch(url).then(function(res){ return res.json(); }).then(function(data){ successCallback(data); }).catch(function(err){ failureCallback(err); });
var url = 'api/vacations.php?start=' + info.startStr + '&end=' + info.endStr + '&scope=team&include_company=1&status_filter=active';
fetch(url)
.then(function(res){ return res.json(); })
.then(function(data){ successCallback(data); })
.catch(function(err){ failureCallback(err); });
},
eventClick: function(info) {
var ev = info.event;
var props = ev.extendedProps;
var html = '<strong>' + ev.title + '</strong><br>' + ev.start.toLocaleDateString() + ' - ' + (new Date(ev.end).toLocaleDateString()) + '<br>';
var props = ev.extendedProps || {};
var html = '<strong>' + ev.title + '</strong><br>' +
formatAllDayRange(ev.start, ev.end) + '<br>';
if (props.type === 'user') {
html += 'Mitarbeiter: ' + (props.employee_name || ev.title || '') + '<br>';
html += 'Status: ' + (props.status || '') + '<br>';
html += 'Mitarbeiter: ' + (props.employee_name || '') + '<br>';
html += 'Abwesenheitsgrund: ' + (props.absence_label || props.absence_type || '') + '<br>';
html += 'Status: ' + (props.status_label || props.status || '') + '<br>';
if (props.comment) {
html += 'Kommentar: ' + props.comment + '<br>';
}
} else if (props.type === 'company') {
html += 'Beschreibung: ' + (props.description || '') + '<br>';
}
document.getElementById('detailsContent').innerHTML = html;
document.getElementById('eventDetails').style.display = 'block';
}