First version, for githup; UNSTABLE, DO NOT USE!
This commit is contained in:
244
www/intern/wk-leitung/displaycontrol.php
Normal file
244
www/intern/wk-leitung/displaycontrol.php
Normal file
@@ -0,0 +1,244 @@
|
||||
<?php
|
||||
|
||||
ini_set('display_errors', 1);
|
||||
ini_set('display_startup_errors', 1);
|
||||
|
||||
if (session_status() !== PHP_SESSION_ACTIVE) session_start();
|
||||
|
||||
$baseDir = $_SERVER['DOCUMENT_ROOT'];
|
||||
|
||||
$access_granted_wkl = $_SESSION['access_granted_wk_leitung'] ?? false;
|
||||
|
||||
?>
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="icon" type="png" href="/intern/img/icon.png">
|
||||
<title>Intern - Displaycontrol</title>
|
||||
|
||||
<link rel="stylesheet" href="/intern/css/displaycontrol.css">
|
||||
<link rel="stylesheet" href="/intern/css/custom-msg-display.css">
|
||||
<script src="/intern/js/jquery/jquery-3.7.1.min.js"></script>
|
||||
<script src="/intern/js/custom-msg-display.js"></script>
|
||||
|
||||
|
||||
<link rel="stylesheet" href="/files/fonts/fonts.css">
|
||||
<link rel="stylesheet" href="/intern/css/sidebar.css">
|
||||
|
||||
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<?php
|
||||
|
||||
if ( ! $access_granted_wkl ) :
|
||||
|
||||
$logintype = 'wk_leitung';
|
||||
|
||||
require $baseDir . '/../scripts/login/login.php';
|
||||
|
||||
$logintype = '';
|
||||
|
||||
else :
|
||||
|
||||
$type = 'wkl';
|
||||
|
||||
$dbconnection = require $baseDir . '/../scripts/db/db-verbindung-script.php';
|
||||
|
||||
if ($dbconnection['success'] !== true){
|
||||
echo 'Critical DB Error.';
|
||||
exit;
|
||||
}
|
||||
|
||||
require $baseDir . '/../scripts/websocket/ws-create-token.php';
|
||||
require $baseDir . '/../scripts/db/db-tables.php';
|
||||
|
||||
$stmt = $mysqli->prepare("SELECT `name` FROM $tableGeraete ORDER BY start_index ASC");
|
||||
|
||||
if (!$stmt->execute()) {
|
||||
http_response_code(500);
|
||||
exit;
|
||||
}
|
||||
|
||||
$result = $stmt->get_result();
|
||||
$disciplines = $result->fetch_all(MYSQLI_ASSOC);
|
||||
|
||||
$stmt->close();
|
||||
|
||||
$currentPage = 'displaycontrol';
|
||||
require $baseDir . '/intern/scripts/sidebar/sidebar.php';
|
||||
?>
|
||||
|
||||
<script>
|
||||
let ws;
|
||||
let firstConnect = true;
|
||||
const RETRY_DELAY = 2000;
|
||||
|
||||
const urlAjaxNewWSToken = '/intern/scripts/ajax-create-ws-token.php';
|
||||
|
||||
async function fetchNewWSToken(freigabe) {
|
||||
try {
|
||||
const response = await fetch(urlAjaxNewWSToken, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
'Content-Type': 'application/x-www-form-urlencoded',
|
||||
},
|
||||
body: new URLSearchParams({ access: freigabe })
|
||||
});
|
||||
|
||||
if (!response.ok) return null;
|
||||
|
||||
const data = await response.json();
|
||||
return data.success ? data.token : null;
|
||||
} catch (error) {
|
||||
console.error("Token fetch failed:", error);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
async function startWebSocket() {
|
||||
console.log("Attempting WebSocket connection...");
|
||||
|
||||
let token;
|
||||
if (firstConnect) {
|
||||
token = '<?= generateWSToken('displaycontrol') ?>';
|
||||
} else {
|
||||
token = await fetchNewWSToken('displaycontrol');
|
||||
}
|
||||
|
||||
if (!token) {
|
||||
console.error("No valid token available. Retrying...");
|
||||
scheduleRetry();
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
ws = new WebSocket(`wss://${window.location.hostname}/ws/?access=token&token=${token}`);
|
||||
} catch (err) {
|
||||
console.error("Malformed WebSocket URL", err);
|
||||
scheduleRetry();
|
||||
return;
|
||||
}
|
||||
|
||||
ws.onopen = () => {
|
||||
console.log("WebSocket connected!");
|
||||
if (!firstConnect) {
|
||||
displayMsg(1, "Live Syncronisation wieder verfügbar");
|
||||
}
|
||||
firstConnect = true;
|
||||
};
|
||||
|
||||
ws.onerror = (event) => {
|
||||
console.error("WebSocket error observed.");
|
||||
};
|
||||
|
||||
ws.onclose = (event) => {
|
||||
displayMsg(0, "Live Syncronisation verloren");
|
||||
firstConnect = false;
|
||||
|
||||
scheduleRetry();
|
||||
};
|
||||
}
|
||||
|
||||
function scheduleRetry() {
|
||||
console.log(`Retrying in ${RETRY_DELAY}ms...`);
|
||||
setTimeout(startWebSocket, RETRY_DELAY);
|
||||
}
|
||||
|
||||
startWebSocket();
|
||||
</script>
|
||||
|
||||
<div class="headerDivTrainer">
|
||||
<div class="headingPanelDiv">
|
||||
<h2 class="headingPanel">Anzeigesteuerung</h2>
|
||||
</div>
|
||||
<?php sidebarRender('button'); ?>
|
||||
</div>
|
||||
|
||||
<?php sidebarRender('modal'); ?>
|
||||
|
||||
<section class="bgSection">
|
||||
|
||||
<div class="controls-wrapper">
|
||||
<span>Anzeigeoptionen</span>
|
||||
<div>
|
||||
<button class="change-type" value="logo">Logo + WK-Name</button>
|
||||
<button class="change-type" value="scoring">WK-Betrieb</button>
|
||||
</div>
|
||||
<form class="change-type-form" data-type="ctext">
|
||||
<button type="submit">Individueller Text</button>
|
||||
<input placeholder="Individuellen Text eingeben...">
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="iframe-grid">
|
||||
<?php
|
||||
foreach ($disciplines as $dis){
|
||||
echo '<div class="iframeWithTitle"><h1>Display '.ucfirst($dis['name']).'</h1>';
|
||||
echo '<iframe
|
||||
id="inlineFrame-'.$dis['name'].'"
|
||||
title="Display '.$dis['name'].'"
|
||||
src="/displays/display.php/?geraet='.$dis['name'].'">
|
||||
</iframe></div>';
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<script>
|
||||
|
||||
jQuery(document).ready(function($) {
|
||||
|
||||
const changeTypes = document.querySelectorAll('.change-type');
|
||||
changeTypes.forEach(btn => {
|
||||
btn.addEventListener("click", function() {
|
||||
const $input = $(this);
|
||||
const typeValue = $input.val();
|
||||
sendType(typeValue, $input, '');
|
||||
});
|
||||
});
|
||||
|
||||
$('.change-type-form').on('submit', function(event) {
|
||||
event.preventDefault();
|
||||
const $form = $(this);
|
||||
const typeValue = $form.data('type');
|
||||
const ctext = $form.find('input').val() || '';
|
||||
sendType(typeValue, $form.find('input'), ctext);
|
||||
});
|
||||
|
||||
function sendType(typeValue, $element, ctext) {
|
||||
const url = `/intern/scripts/displaycontrol/ajax-update_display_config_json.php?type=${encodeURIComponent(typeValue)}&ctext=${encodeURIComponent(ctext)}`;
|
||||
|
||||
fetch(url)
|
||||
.then(res => res.json())
|
||||
.then(response => {
|
||||
|
||||
if (response.success) {
|
||||
ws.send(JSON.stringify({
|
||||
type: "DISPLAY_CONTROL",
|
||||
payload: {
|
||||
type: typeValue,
|
||||
ctext: ctext
|
||||
}
|
||||
}));
|
||||
displayMsg(1, "Erfolgreich aktualisiert");
|
||||
} else {
|
||||
alert('Error: ' + response.message);
|
||||
}
|
||||
})
|
||||
.catch(err => {
|
||||
$element.css('background-color', '#f8d7da');
|
||||
console.error('AJAX fetch error:', err);
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
<?php $mysqli->close();
|
||||
endif;
|
||||
Reference in New Issue
Block a user