256 lines
6.6 KiB
PHP
256 lines
6.6 KiB
PHP
<?php
|
|
|
|
ini_set('display_errors', 1);
|
|
ini_set('display_startup_errors', 1);
|
|
|
|
$baseDir = $_SERVER['DOCUMENT_ROOT'];
|
|
|
|
require_once $baseDir . '/../scripts/session_functions.php';
|
|
|
|
ini_wkvs_session(true);
|
|
|
|
$csrf_token = $_SESSION['csrf_token'] ?? '';
|
|
|
|
$access_granted_wkl = check_user_permission('wk_leitung', true) ?? 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 csrf_token = "<?= $csrf_token ?>";
|
|
|
|
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, csrf_token })
|
|
});
|
|
|
|
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`;
|
|
|
|
fetch(url,{
|
|
method: 'POST',
|
|
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
|
|
body: new URLSearchParams({
|
|
csrf_token,
|
|
type: typeValue,
|
|
ctext
|
|
})
|
|
})
|
|
.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;
|