commit message
This commit is contained in:
204
PackAufgabenMonitor.php
Normal file
204
PackAufgabenMonitor.php
Normal file
@@ -0,0 +1,204 @@
|
||||
<?php
|
||||
|
||||
require('config.php');
|
||||
require('EpiApi.php');
|
||||
require('vendor/autoload.php');
|
||||
|
||||
$Epi = new Epirent();
|
||||
|
||||
?>
|
||||
|
||||
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
|
||||
<title>Packmonitor</title>
|
||||
|
||||
<!-- Bootstrap -->
|
||||
<link rel="stylesheet" href="vendor/twbs/bootstrap/dist/css/bootstrap.min.css" >
|
||||
<script src="scripts/jquery-3.5.1.min.js"></script>
|
||||
<link href="css/sticky-footer.css" rel="stylesheet">
|
||||
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
|
||||
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
|
||||
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
|
||||
<script type="text/javascript">
|
||||
// Dynamische Höhe: Wrapper exakt bis Viewport-Unterkante
|
||||
function sizeScrollContainers() {
|
||||
$('.tableFixHead').each(function () {
|
||||
const rect = this.getBoundingClientRect();
|
||||
const bottomMargin = 16; // kleiner Abstand zum Rand
|
||||
const available = window.innerHeight - rect.top - bottomMargin;
|
||||
this.style.maxHeight = (available > 120 ? available : 120) + 'px';
|
||||
});
|
||||
}
|
||||
|
||||
// Lädt tbody via AJAX und erhält die Scrollposition relativ zum unteren Rand
|
||||
function smartLoad($scroller, $target, url, intervalMs) {
|
||||
const scroller = $scroller.get(0);
|
||||
// Abstand vom unteren Rand merken (wichtiger als absolute scrollTop)
|
||||
const fromBottomBefore = scroller.scrollHeight - scroller.clientHeight - scroller.scrollTop;
|
||||
|
||||
$target.load(url, function () {
|
||||
// Nach dem Ersetzen: dieselbe Distanz zum unteren Rand wiederherstellen
|
||||
const newScrollTop = scroller.scrollHeight - scroller.clientHeight - fromBottomBefore;
|
||||
// Begrenzen, falls weniger Inhalt
|
||||
scroller.scrollTop = Math.max(0, newScrollTop);
|
||||
|
||||
// Nächstes Update planen
|
||||
setTimeout(function () {
|
||||
smartLoad($scroller, $target, url, intervalMs);
|
||||
}, intervalMs);
|
||||
});
|
||||
}
|
||||
|
||||
$(document).ready(function () {
|
||||
sizeScrollContainers();
|
||||
$(window).on('resize', sizeScrollContainers);
|
||||
|
||||
// Initial laden + Auto-Refresh, jeweils eigener Scroller
|
||||
smartLoad($('#checkout-scroll'), $('#getCheckOutTableHolder'), 'sources/getCheckOutTable.php', 5000);
|
||||
smartLoad($('#checkin-scroll'), $('#getCheckInTableHolder'), 'sources/getCheckInTable.php', 5000);
|
||||
smartLoad($('#aufgaben-scroll'), $('#AufgabenTableHolder'), 'sources/getAufgabenTable.php', 30000);
|
||||
});
|
||||
</script>
|
||||
|
||||
<style>
|
||||
/* Scroll-Wrapper je Tabelle */
|
||||
.tableFixHead {
|
||||
overflow-y: auto;
|
||||
/* Höhe wird per JS dynamisch gesetzt, damit genau bis zum Viewport-Ende gescrollt wird */
|
||||
max-height: 60vh; /* Fallback */
|
||||
border: 1px solid rgba(255,255,255,.1);
|
||||
border-radius: .25rem;
|
||||
}
|
||||
|
||||
/* Sticky Header */
|
||||
.tableFixHead thead th {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 2; /* über Body-Zellen */
|
||||
}
|
||||
|
||||
/* Saubere Hintergrundfarbe für sticky Header (Bootstrap .table-dark) */
|
||||
.table-dark thead th {
|
||||
background-color: #212529; /* gleiche Farbe wie .table-dark header */
|
||||
}
|
||||
|
||||
/* Optional: dünne Trennlinien */
|
||||
.table-dark tbody tr + tr td {
|
||||
border-top: 1px solid rgba(255,255,255,.08);
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body style="background-color: black;">
|
||||
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-sm">
|
||||
<h2 class="text-light">Check-Out</h2>
|
||||
<div class="tableFixHead" id="checkout-scroll">
|
||||
<table class="table table-dark mb-0" id="checkout-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">#</th>
|
||||
<th scope="col">Kunde</th>
|
||||
<th scope="col">Event</th>
|
||||
<th scope="col">Dispo-Start<br><i>VB-Start</i></th>
|
||||
<?php
|
||||
|
||||
if(!HideCheckInTimeOnCheckout){
|
||||
echo "<th scope='col'>Dispo-Ende<br><i>VB-Ende</i></th>";
|
||||
}
|
||||
?>
|
||||
<th scope="col">Status</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="getCheckOutTableHolder"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm">
|
||||
<h2 class="text-light">Check-In</h2>
|
||||
<div class="tableFixHead" id="checkin-scroll">
|
||||
<table class="table table-dark mb-0" id="checkin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">#</th>
|
||||
<th scope="col">Kunde</th>
|
||||
<th scope="col">Event</th>
|
||||
<?php
|
||||
|
||||
if(!HideCheckOutTimeOnCheckin){
|
||||
echo "<th scope='col'>Dispo-Start<br><i>RP-Start</i></th>";
|
||||
}
|
||||
?>
|
||||
<th scope="col">Dispo-Ende<br><i>RP-Ende</i></th>
|
||||
<th scope="col">Status</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="getCheckInTableHolder"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm">
|
||||
<h2 class="text-light">Aufgaben</h2>
|
||||
<div class="tableFixHead" id="aufgaben-scroll">
|
||||
<table class="table table-dark mb-0" id="aufgaben-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">#</th>
|
||||
<th scope="col">Bearbeiter</th>
|
||||
<th scope="col">Aufgabe</th>
|
||||
<th scope="col">Zieldatum</th>
|
||||
<th scope="col">Priorität</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="AufgabenTableHolder"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
</header>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
|
||||
<script src="https://code.jquery.com/jquery-1.12.4.min.js" integrity="sha384-nvAa0+6Qg9clwYCGGPpDQLVpLNn0fRaROjHqs13t4Ggj3Ez50XnGQqc/r8MhnRDZ" crossorigin="anonymous"></script>
|
||||
<!-- Include all compiled plugins (below), or include individual files as needed -->
|
||||
<script src="vendor/twbs/bootstrap/dist/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
function getTimeFromSeconds(string $timestring) {
|
||||
|
||||
$hours = floor($timestring / 3600);
|
||||
$mins = floor($timestring / 60 % 60);
|
||||
$secs = floor($timestring % 60);
|
||||
|
||||
$timeFormat = sprintf('%02d:%02d', $hours, $mins);
|
||||
|
||||
return $timeFormat;
|
||||
}
|
||||
?>
|
||||
Reference in New Issue
Block a user