|
|
|
|
@ -168,13 +168,9 @@
|
|
|
|
|
const API_TERMINALS = "api.php?nav=api_terminal";
|
|
|
|
|
const API_COMMAND = "api.php?nav=api_run_remote_command";
|
|
|
|
|
const VISIBLE_GROUP_NAME = "Produkcja";
|
|
|
|
|
|
|
|
|
|
// GŁÓWNE KOMENDY (Zmiana: 2 nowe komendy Audio)
|
|
|
|
|
const COMMAND_WAKE = "WakeUp";
|
|
|
|
|
const COMMAND_SHUTDOWN = "ShutDown";
|
|
|
|
|
const COMMAND_RESTART = "Restart";
|
|
|
|
|
const COMMAND_AUDIO_ON = "AudioOn";
|
|
|
|
|
const COMMAND_AUDIO_OFF = "AudioOff";
|
|
|
|
|
|
|
|
|
|
// Stan aplikacji
|
|
|
|
|
const state = {
|
|
|
|
|
@ -287,6 +283,7 @@
|
|
|
|
|
document.getElementById('customConfirmMessage').innerHTML = message.replace(/\n/g, '<br>');
|
|
|
|
|
|
|
|
|
|
modal.classList.remove('hidden');
|
|
|
|
|
// Małe opóźnienie dla przeglądarki, żeby zastosowała display:block przed animacją
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
modal.classList.remove('opacity-0');
|
|
|
|
|
box.classList.remove('scale-95');
|
|
|
|
|
@ -494,17 +491,17 @@
|
|
|
|
|
|
|
|
|
|
return `
|
|
|
|
|
<div class="relative bg-white dark:bg-slate-800 rounded-2xl p-5 shadow-soft border border-slate-200 dark:border-slate-700 flex flex-col gap-4">
|
|
|
|
|
|
|
|
|
|
<!-- Nagłówek Karty z wbudowanym panelem przycisków -->
|
|
|
|
|
<div class="flex flex-col sm:flex-row justify-between items-start gap-3 w-full">
|
|
|
|
|
<!-- Lewa strona: Nazwa galerii (Brak ID!) -->
|
|
|
|
|
<div class="flex-shrink-0">
|
|
|
|
|
<h3 class="text-xl font-bold text-slate-900 dark:text-white cursor-pointer hover:text-brand-600 dark:hover:text-brand-400 transition-colors whitespace-nowrap" onclick="openPopover('${loc.id}')">${escapeHtml(loc.label)}</h3>
|
|
|
|
|
<!-- Nagłówek Karty (Elastyczny pasek) -->
|
|
|
|
|
<div class="flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3">
|
|
|
|
|
<!-- Lewa strona: Nazwa galerii -->
|
|
|
|
|
<div>
|
|
|
|
|
<h3 class="text-xl font-bold text-slate-900 dark:text-white cursor-pointer hover:text-brand-600 dark:hover:text-brand-400 transition-colors" onclick="openPopover('${loc.id}')">${escapeHtml(loc.label)}</h3>
|
|
|
|
|
<div class="text-xs text-slate-500 dark:text-slate-400 mt-1 font-mono">${loc.id}</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<!-- Prawa strona: 4 Kontrolki + Przycisk SZCZEGÓŁY -->
|
|
|
|
|
<div class="flex items-center justify-end gap-2 sm:gap-3 flex-1 flex-wrap">
|
|
|
|
|
<!-- Przyciski całej galerii (Włącz/Wyłącz/Audio ON/Audio OFF) -->
|
|
|
|
|
<!-- Prawa strona: Kontrolki Galerii + Przycisk SZCZEGÓŁY -->
|
|
|
|
|
<div class="flex items-center gap-3 self-stretch sm:self-auto flex-wrap">
|
|
|
|
|
<!-- Przyciski całej galerii (Włącz/Wyłącz/Wycisz) -->
|
|
|
|
|
<div class="flex bg-slate-100 dark:bg-slate-800 p-1.5 rounded-xl border border-slate-200 dark:border-slate-700 shadow-inner gap-1">
|
|
|
|
|
<button onclick="runCommand('${COMMAND_WAKE}', '${loc.id}', 'all')" class="px-3 py-1.5 text-emerald-600 hover:bg-white dark:text-emerald-400 dark:hover:bg-slate-700 hover:shadow-sm rounded-lg text-sm font-bold transition-all flex items-center gap-2" title="Włącz całą galerię">
|
|
|
|
|
<i class="fa fa-play"></i> <span class="hidden xl:inline">Włącz</span>
|
|
|
|
|
@ -512,11 +509,8 @@
|
|
|
|
|
<button onclick="runCommand('${COMMAND_SHUTDOWN}', '${loc.id}', 'all')" class="px-3 py-1.5 text-slate-600 hover:bg-white dark:text-slate-300 dark:hover:bg-slate-700 hover:shadow-sm rounded-lg text-sm font-bold transition-all flex items-center gap-2" title="Wyłącz całą galerię">
|
|
|
|
|
<i class="fa fa-stop"></i> <span class="hidden xl:inline">Wyłącz</span>
|
|
|
|
|
</button>
|
|
|
|
|
<button onclick="runCommand('${COMMAND_AUDIO_ON}', '${loc.id}', 'all')" class="px-3 py-1.5 text-sky-600 hover:bg-white dark:text-sky-400 dark:hover:bg-slate-700 hover:shadow-sm rounded-lg text-sm font-bold transition-all flex items-center gap-2" title="Włącz Audio w galerii">
|
|
|
|
|
<i class="fa fa-volume-up"></i> <span class="hidden xl:inline">Audio ON</span>
|
|
|
|
|
</button>
|
|
|
|
|
<button onclick="runCommand('${COMMAND_AUDIO_OFF}', '${loc.id}', 'all')" class="px-3 py-1.5 text-amber-600 hover:bg-white dark:text-amber-400 dark:hover:bg-slate-700 hover:shadow-sm rounded-lg text-sm font-bold transition-all flex items-center gap-2" title="Wyłącz Audio w galerii">
|
|
|
|
|
<i class="fa fa-volume-mute"></i> <span class="hidden xl:inline">Audio OFF</span>
|
|
|
|
|
<button onclick="runCommand('${COMMAND_MUTE}', '${loc.id}', 'all')" class="px-3 py-1.5 text-amber-600 hover:bg-white dark:text-amber-400 dark:hover:bg-slate-700 hover:shadow-sm rounded-lg text-sm font-bold transition-all flex items-center gap-2" title="Wycisz całą galerię">
|
|
|
|
|
<i class="fa fa-volume-mute"></i> <span class="hidden xl:inline">Wycisz</span>
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
@ -566,10 +560,10 @@
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<!-- Dymek (Popover) centralnie nad kafelkiem -->
|
|
|
|
|
<!-- Dymek (Popover) centralnie nad kafelkiem, wymiar w 100% dopasowany do kafelka w ramach siatki -->
|
|
|
|
|
<div id="popover-${loc.id}" class="absolute inset-0 z-50 flex opacity-0 invisible scale-95 transition-all duration-300 pointer-events-none">
|
|
|
|
|
|
|
|
|
|
<!-- Właściwe okienko (zajmujące 100% obszaru) -->
|
|
|
|
|
<!-- Właściwe okienko (zajmujące calutką ramkę) -->
|
|
|
|
|
<div class="relative w-full h-full flex flex-col bg-white dark:bg-slate-800 rounded-2xl shadow-2xl border border-slate-200 dark:border-slate-700 pointer-events-auto overflow-hidden">
|
|
|
|
|
|
|
|
|
|
<!-- Header Dymka -->
|
|
|
|
|
@ -649,16 +643,9 @@
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function runCommand(command, locationId, type) {
|
|
|
|
|
const locName = locationId === 'all' ? "Cała wystawa" : (state.terminals.find(t => t.location_id === locationId)?.location_name || locationId);
|
|
|
|
|
const typeName = type === 'computer' ? 'Kontrolery' : (type === 'ctrl' ? 'Oświetlenie' : 'Wszystkie urządzenia');
|
|
|
|
|
|
|
|
|
|
// Logika nazw dla nowych komend
|
|
|
|
|
let actionName = "";
|
|
|
|
|
if(command === COMMAND_WAKE) actionName = "Włączenie";
|
|
|
|
|
else if(command === COMMAND_SHUTDOWN) actionName = "Wyłączenie";
|
|
|
|
|
else if(command === COMMAND_RESTART) actionName = "Restart";
|
|
|
|
|
else if(command === COMMAND_AUDIO_ON) actionName = "Włączenie Audio";
|
|
|
|
|
else if(command === COMMAND_AUDIO_OFF) actionName = "Wyłączenie Audio";
|
|
|
|
|
const locName = state.terminals.find(t => t.location_id === locationId)?.location_name || locationId;
|
|
|
|
|
const typeName = type === 'computer' ? 'Kontrolery' : 'Oświetlenie';
|
|
|
|
|
const actionName = command === COMMAND_WAKE ? "Włączenie" : (command === COMMAND_SHUTDOWN ? "Wyłączenie" : "Restart");
|
|
|
|
|
|
|
|
|
|
const confirmed = await customConfirm(
|
|
|
|
|
`Akcja grupowa: ${actionName}`,
|
|
|
|
|
@ -668,13 +655,7 @@
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function runSingleCommand(command, terminalId, terminalName) {
|
|
|
|
|
let actionName = "";
|
|
|
|
|
if(command === COMMAND_WAKE) actionName = "Włączenie";
|
|
|
|
|
else if(command === COMMAND_SHUTDOWN) actionName = "Wyłączenie";
|
|
|
|
|
else if(command === COMMAND_RESTART) actionName = "Restart";
|
|
|
|
|
else if(command === COMMAND_AUDIO_ON) actionName = "Włączenie Audio";
|
|
|
|
|
else if(command === COMMAND_AUDIO_OFF) actionName = "Wyłączenie Audio";
|
|
|
|
|
|
|
|
|
|
const actionName = command === COMMAND_WAKE ? "Włączenie" : (command === COMMAND_SHUTDOWN ? "Wyłączenie" : "Restart");
|
|
|
|
|
const terminal = state.terminals.find(t => String(t.id) === String(terminalId));
|
|
|
|
|
|
|
|
|
|
const confirmed = await customConfirm(
|
|
|
|
|
|