diff --git a/new.php b/new.php
index 0a68a2b..c3b10c5 100644
--- a/new.php
+++ b/new.php
@@ -407,7 +407,7 @@ if ($editName !== '') { try { $editDir = safe_input_dir($config['uploads_dir'],
=h($msg)?>
=h($err)?>
Videos without input dir
No orphan videos.
=page_links('videos',$videoPage,$videoPages)?>
-Existing input dirs
No input directories yet.
No video yet=h(ucfirst($runStatus))?>Edit =h($meta['title'] ?: ($info['title'] ?? basename($d)))?>
=h($meta['date'])?>=h($meta['location'])?>No videoPreview video
=nl2br(h($meta['description']), false)?>
=h(basename($d))?> · =h($info['file_count'] ?? count(list_files($d)))?> files · = $enabled ? 'Rendering enabled' : 'Rendering disabled' ?> · = $preview ? 'Preview enabled' : 'Preview disabled' ?> · = $visible ? 'Shown' : 'Hidden' ?>= $running ? ' · '.h(ucfirst($runStatus)) : '' ?>
=page_links('edit',$editPage,$editPages)?>
+Existing input dirs
No input directories yet.
No video yet=h($meta['title'] ?: ($info['title'] ?? basename($d)))?>
=h($meta['date'])?>=h($meta['location'])?>No videoPreview video
=nl2br(h($meta['description']), false)?>
=h(basename($d))?> · =h($info['file_count'] ?? count(list_files($d)))?> files · = $enabled ? 'Rendering enabled' : 'Rendering disabled' ?> · = $preview ? 'Preview enabled' : 'Preview disabled' ?> · = $visible ? 'Shown' : 'Hidden' ?>= $running ? ' · '.h(ucfirst($runStatus)) : '' ?>
=page_links('edit',$editPage,$editPages)?>
Edit input dir
in-dir/=h(basename($editDir))?>
This input directory is =h($editStatus)?>. Editing is disabled until the job completes.
@@ -467,12 +467,40 @@ document.querySelectorAll('.admin-switches input[type="checkbox"]').forEach(func
const name=(job.name||'job').replace(/_/g,' ');
return ''+name+'';
}
+ function syncEditButtons(runningJobs){
+ document.querySelectorAll('.admin-video-row[data-job]').forEach(function(row){
+ const job=row.dataset.job || '';
+ const edit=row.querySelector('[data-edit-action="1"]');
+ if(!edit) return;
+ const running=runningJobs.has(job);
+ if(edit.tagName === 'A'){
+ if(running){
+ if(!edit.dataset.editHref) edit.dataset.editHref = edit.getAttribute('href') || '';
+ edit.removeAttribute('href');
+ edit.classList.add('disabled');
+ edit.setAttribute('aria-disabled', 'true');
+ edit.title='Rendering now';
+ }else{
+ const href=edit.dataset.editHref || ('?edit=' + encodeURIComponent(job));
+ edit.setAttribute('href', href);
+ edit.classList.remove('disabled');
+ edit.removeAttribute('aria-disabled');
+ edit.title='Edit';
+ }
+ }else{
+ edit.classList.toggle('disabled', running);
+ edit.title=running ? 'Rendering now' : '';
+ }
+ });
+ }
async function updateJobs(){
try{
const r=await fetch('job_status.php',{cache:'no-store'});
if(!r.ok) throw new Error('status failed');
const data=await r.json();
const jobs=data.jobs||[];
+ const runningJobs=new Set(jobs.map(function(job){ return job && job.name ? String(job.name) : ''; }).filter(Boolean));
+ syncEditButtons(runningJobs);
if(!jobs.length){box.hidden=true;box.innerHTML='';return;}
box.hidden=false;
box.innerHTML='Running'+jobs.map(fmt).join('');