diff --git a/new.php b/new.php index 07906c5..d4ff190 100644 --- a/new.php +++ b/new.php @@ -355,12 +355,26 @@ try { $dir = safe_input_dir($config['uploads_dir'], $_POST['dir'] ?? ''); $enabledNow = !empty($_POST['enabled']); set_input_dir_enabled($dir, $enabledNow); + if ($enabledNow) { + set_input_dir_preview($dir, false); + } $state = input_dir_state($dir); $output = basename((string)($state['output'] ?? '')); $canShow = $output !== '' && is_file($config['videos_dir'].'/'.$output) && !input_dir_preview($dir); if (!$canShow) set_input_dir_visible($dir, false); - if (!empty($_POST['ajax'])) ajax_json(['ok'=>true, 'enabled'=>$enabledNow, 'preview'=>input_dir_preview($dir), 'visible'=>input_dir_visible($dir) && $canShow, 'can_show'=>$canShow, 'dir'=>basename($dir)]); - header('Location: new.php?tab=edit&msg=' . rawurlencode(($enabledNow ? 'Enabled rendering for: in-dir/' : 'Disabled rendering for: in-dir/') . basename($dir))); + $message = ($enabledNow ? 'Enabled rendering for: in-dir/' : 'Disabled rendering for: in-dir/') . basename($dir); + if (!empty($_POST['ajax'])) { + ajax_json([ + 'ok' => true, + 'enabled' => $enabledNow, + 'preview' => input_dir_preview($dir), + 'visible' => input_dir_visible($dir) && $canShow, + 'can_show' => $canShow, + 'dir' => basename($dir), + 'message' => $message, + ]); + } + header('Location: new.php?tab=edit&msg=' . rawurlencode($message)); exit; } elseif ($action === 'set_preview') { $dir = safe_input_dir($config['uploads_dir'], $_POST['dir'] ?? ''); @@ -370,8 +384,19 @@ try { $state = input_dir_state($dir); $output = basename((string)($state['output'] ?? '')); $canShow = $output !== '' && is_file($config['videos_dir'].'/'.$output) && !input_dir_preview($dir); - if (!empty($_POST['ajax'])) ajax_json(['ok'=>true, 'preview'=>$previewNow, 'enabled'=>input_dir_enabled($dir), 'visible'=>input_dir_visible($dir) && $canShow, 'can_show'=>$canShow, 'dir'=>basename($dir)]); - header('Location: new.php?tab=edit&msg=' . rawurlencode(($previewNow ? 'Enabled preview for: in-dir/' : 'Disabled preview for: in-dir/') . basename($dir))); + $message = ($previewNow ? 'Enabled preview for: in-dir/' : 'Disabled preview for: in-dir/') . basename($dir); + if (!empty($_POST['ajax'])) { + ajax_json([ + 'ok' => true, + 'preview' => $previewNow, + 'enabled' => input_dir_enabled($dir), + 'visible' => input_dir_visible($dir) && $canShow, + 'can_show' => $canShow, + 'dir' => basename($dir), + 'message' => $message, + ]); + } + header('Location: new.php?tab=edit&msg=' . rawurlencode($message)); exit; } elseif ($action === 'set_visible') { $dir = safe_input_dir($config['uploads_dir'], $_POST['dir'] ?? ''); @@ -381,8 +406,18 @@ try { $canShow = $output !== '' && is_file($config['videos_dir'].'/'.$output) && !input_dir_preview($dir); if ($visibleNow && !$canShow) throw new RuntimeException('Only finished full-quality videos can be shown.'); set_input_dir_visible($dir, $visibleNow && $canShow); - if (!empty($_POST['ajax'])) ajax_json(['ok'=>true, 'visible'=>input_dir_visible($dir) && $canShow, 'can_show'=>$canShow, 'dir'=>basename($dir)]); - header('Location: new.php?tab=edit&msg=' . rawurlencode(($visibleNow ? 'Shown: in-dir/' : 'Hidden: in-dir/') . basename($dir))); + $message = ($visibleNow ? 'Shown: in-dir/' : 'Hidden: in-dir/') . basename($dir); + $currentVisible = input_dir_visible($dir) && $canShow; + if (!empty($_POST['ajax'])) { + ajax_json([ + 'ok' => true, + 'visible' => $currentVisible, + 'can_show' => $canShow, + 'dir' => basename($dir), + 'message' => $message, + ]); + } + header('Location: new.php?tab=edit&msg=' . rawurlencode($message)); exit; } elseif ($action === 'update') { $dir = safe_input_dir($config['uploads_dir'], $_POST['dir'] ?? ''); @@ -463,7 +498,36 @@ $runningJobs = active_worker_jobs($config);

Videos without input dir

No orphan videos.


MB
-

Existing input dirs

No input directories yet.

No video yet
RenderingEdit

No videoPreview video

· files

+

Existing input dirs

No input directories yet.

No video yet
+
+ + + + +
+
+ + + + +
+
+ + + + +
+ +
RenderingEdit

No videoPreview video

· files

Edit input dir

in-dir/

This input directory is . Editing is disabled until the job completes.

Edit input dir

in-dir/

Files and captions

No caption for audio files

Add new movie input

@@ -529,34 +593,75 @@ function handleAjaxFormSubmit(form, redirectTab) { } const initialMessage = ; if (initialMessage) showToast(initialMessage, true); -const editForm=document.getElementById('edit-form'); -if(editForm){ - editForm.addEventListener('submit', async function(event){ - event.preventDefault(); - const submit=editForm.querySelector('button[type="submit"]'); - const data=new FormData(editForm); - data.set('ajax','1'); - if(submit) submit.disabled=true; - try{ - const res=await fetch('new.php',{method:'POST',body:data,credentials:'same-origin',headers:{'Accept':'application/json'}}); - const json=await res.json().catch(function(){return {};}); - if(!res.ok || !json.ok) throw new Error(json.error || 'Save failed'); - showToast(json.message || ('Updated input directory: in-dir/' + (json.dir || '')), true); - setTimeout(function(){ window.location.href='new.php?tab=edit'; }, 450); - }catch(e){ - showToast(e.message || 'Save failed', false); - }finally{ - if(submit) submit.disabled=false; - } +initSwitchForms(); + +function initSwitchForms(){ + document.querySelectorAll('.switch-form').forEach(function(form){ + const checkbox=form.querySelector('input[type="checkbox"]'); + if(!checkbox) return; + checkbox.dataset.state = checkbox.checked ? '1' : '0'; + form.addEventListener('submit', function(event){ event.preventDefault(); }); + checkbox.addEventListener('change', function(event){ + event.preventDefault(); + handleSwitchToggle(form, checkbox); + }); }); } -document.querySelectorAll('.admin-switches input[type="checkbox"]').forEach(function(input){ - input.addEventListener('change', function(event){ - event.preventDefault(); - const form=input.form; - if(form) form.submit(); - }); -}); + +async function handleSwitchToggle(form, checkbox){ + if(checkbox.disabled) return; + const previousState = checkbox.dataset.state === '1'; + const data = new FormData(form); + data.set('ajax', '1'); + if(checkbox.checked){ + data.set(checkbox.name, '1'); + }else{ + data.delete(checkbox.name); + } + checkbox.disabled = true; + try{ + const res = await fetch('new.php', { method: 'POST', body: data, credentials: 'same-origin', headers: { 'Accept': 'application/json' }}); + const json = await res.json().catch(() => ({})); + if(!res.ok || !json.ok) throw new Error(json.error || 'Switch update failed'); + applySwitchPayload(json); + showToast(json.message || 'Updated input directory', true); + }catch(e){ + checkbox.checked = previousState; + checkbox.dataset.state = previousState ? '1' : '0'; + showToast(e.message || 'Switch update failed', false); + }finally{ + checkbox.disabled = false; + } +} + +function applySwitchPayload(payload){ + if(!payload || !payload.dir) return; + const row = document.querySelector('.admin-video-row[data-job="'+payload.dir+'"]'); + if(!row) return; + function setSwitch(type, value){ + const target = row.querySelector('form[data-switch="'+type+'"] input[type="checkbox"]'); + if(!target) return; + target.checked = !!value; + target.dataset.state = target.checked ? '1' : '0'; + } + if('preview' in payload) setSwitch('preview', payload.preview); + if('enabled' in payload) setSwitch('render', payload.enabled); + if('visible' in payload){ + setSwitch('show', payload.visible); + row.classList.toggle('shown', !!payload.visible); + } + if('can_show' in payload){ + const showInput = row.querySelector('form[data-switch="show"] input[type="checkbox"]'); + if(showInput){ + showInput.disabled = !payload.can_show; + if(!payload.can_show){ + showInput.checked = false; + showInput.dataset.state = '0'; + row.classList.remove('shown'); + } + } + } +}