camera - (real) remote control, brandschutz - configurable course, dashboard - vbb licensed API (a real vbb license, how cool)
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
var configElement = document.getElementById('cameraRemoteConfig');
|
||||
if (!configElement) return;
|
||||
|
||||
var config = JSON.parse(configElement.textContent);
|
||||
var presets = Array.from(document.querySelectorAll('.camera-presets [data-camera-action]'));
|
||||
var power = document.querySelector('[data-camera-action="power"]');
|
||||
var status = document.getElementById('cameraRemoteStatus');
|
||||
var busy = false;
|
||||
|
||||
presets.forEach(function (preset) { preset.setAttribute('aria-pressed', 'false'); });
|
||||
|
||||
function showError(message) {
|
||||
status.textContent = message;
|
||||
status.hidden = false;
|
||||
}
|
||||
|
||||
function clearError() {
|
||||
status.textContent = '';
|
||||
status.hidden = true;
|
||||
}
|
||||
|
||||
function setBusy(active) {
|
||||
busy = active;
|
||||
presets.forEach(function (preset) { preset.disabled = active || !config.configured; });
|
||||
power.disabled = active || !config.configured;
|
||||
}
|
||||
|
||||
function selectPreset(selected) {
|
||||
presets.forEach(function (preset) {
|
||||
var active = preset === selected;
|
||||
preset.classList.toggle('camera-preset-active', active);
|
||||
preset.setAttribute('aria-pressed', String(active));
|
||||
});
|
||||
}
|
||||
|
||||
async function request(action) {
|
||||
var form = new FormData();
|
||||
form.append('csrf_token', config.csrfToken);
|
||||
form.append('action', action);
|
||||
|
||||
var response = await fetch('/intranet_repo/projects/camera_remote/api.php', {
|
||||
method: 'POST',
|
||||
body: form,
|
||||
headers: {'Accept': 'application/json'},
|
||||
});
|
||||
var result;
|
||||
try {
|
||||
result = await response.json();
|
||||
} catch (parseError) {
|
||||
throw new Error('Der Server hat unerwartet geantwortet. Bitte laden Sie die Seite neu.');
|
||||
}
|
||||
if (!response.ok || !result.ok) throw new Error(result.error || 'Der Kamerabefehl ist fehlgeschlagen.');
|
||||
}
|
||||
|
||||
async function runAction(control) {
|
||||
if (busy || !config.configured) return;
|
||||
clearError();
|
||||
if (control === power) selectPreset(null);
|
||||
setBusy(true);
|
||||
|
||||
try {
|
||||
await request(control.dataset.cameraAction);
|
||||
if (control !== power) {
|
||||
selectPreset(control);
|
||||
}
|
||||
} catch (error) {
|
||||
showError(error.message || 'Der Kamerabefehl konnte nicht ausgeführt werden.');
|
||||
} finally {
|
||||
setBusy(false);
|
||||
}
|
||||
}
|
||||
|
||||
presets.forEach(function (preset) {
|
||||
preset.addEventListener('click', function () { runAction(preset); });
|
||||
});
|
||||
power.addEventListener('click', function () { runAction(power); });
|
||||
}());
|
||||
Reference in New Issue
Block a user