From d86ee948456a23df2c221217cfef6cb817e2de36 Mon Sep 17 00:00:00 2001 From: bergware Date: Sat, 29 Mar 2025 04:15:04 +0100 Subject: [PATCH] Revised nchan control --- emhttp/plugins/dynamix/DisplaySettings.page | 6 - emhttp/plugins/dynamix/default.cfg | 1 - .../dynamix/include/DefaultPageLayout.php | 193 +++++++++--------- 3 files changed, 92 insertions(+), 108 deletions(-) diff --git a/emhttp/plugins/dynamix/DisplaySettings.page b/emhttp/plugins/dynamix/DisplaySettings.page index 10d6a86ea..4ee14acb2 100644 --- a/emhttp/plugins/dynamix/DisplaySettings.page +++ b/emhttp/plugins/dynamix/DisplaySettings.page @@ -323,12 +323,6 @@ _(Favorites enabled)_: :display_favorites_enabled_help: -_(Allow realtime updates on inactive browsers)_: -: - : diff --git a/emhttp/plugins/dynamix/default.cfg b/emhttp/plugins/dynamix/default.cfg index 46a20fb8e..9096beced 100644 --- a/emhttp/plugins/dynamix/default.cfg +++ b/emhttp/plugins/dynamix/default.cfg @@ -35,7 +35,6 @@ headermetacolor="" headerdescription="yes" showBannerGradient="yes" favorites="yes" -liveUpdate="no" [parity] mode="0" hour="0 0" diff --git a/emhttp/plugins/dynamix/include/DefaultPageLayout.php b/emhttp/plugins/dynamix/include/DefaultPageLayout.php index b342c9b4c..1df49c7f1 100644 --- a/emhttp/plugins/dynamix/include/DefaultPageLayout.php +++ b/emhttp/plugins/dynamix/include/DefaultPageLayout.php @@ -1,6 +1,6 @@ String.prototype.actionName = function(){return this.split(/[\\/]/g).pop();} String.prototype.channel = function(){return this.split(':')[1].split(',').findIndex((e)=>/\[\d\]/.test(e));} -NchanSubscriber.prototype.monitor = function(){subscribers.push(this);} - +NchanSubscriber.prototype.monitor = function(){nchanSubs.push(this);} + Shadowbox.init({skipSetup:true}); context.init(); -// list of nchan subscribers to start/stop at focus change -var subscribers = []; - // server uptime var uptime = ; var expiretime = ; @@ -137,6 +134,10 @@ var csrf_token = ""; // form has unsaved changes indicator var formHasUnsavedChanges = false; +// list of nchan subscribers to start/stop after inactivity +var nchanSubs = []; +var nchanPaused = false; + // docker progess indicators var progress_dots = [], progress_span = []; function pauseEvents(id) { @@ -144,16 +145,45 @@ function pauseEvents(id) { if (!id || i==id) clearTimeout(timer); }); } -function resumeEvents(id,delay) { + +function resumeEvents(id, delay) { var startDelay = delay||50; - $.each(timers, function(i,timer) { + $.each(timers, function(i, timer) { if (!id || i==id) timers[i] = setTimeout(i+'()', startDelay); startDelay += 50; }); } -function plus(value,single,plural,last) { - return value>0 ? (value+' '+(value==1?single:plural)+(last?'':', ')) : ''; + + 0):?> +function nchanStart() { + if (nchanPaused !== false) { + removeBannerWarning(nchanPaused); + nchanSubs.forEach(function(nchan) {nchan.start();}); + timers.reload = setTimeout(nchanStop,); + nchanPaused = false; + } } + +function nchanStop() { + if (nchanPaused === false && nchanSubs.length > 0) { + nchanSubs.forEach(function(nchan) {nchan.stop();}); + nchanPaused = addBannerWarning("",false,true); + } +} + +$(window).click(function() {nchanStart();}); + +document.addEventListener('visibilitychange',function(e) { + if (document.hidden) nchanStop(); else nchanStart(); +}); + +timers.reload = setTimeout(nchanStop,); + + +function plus(value, single, plural, last) { + return value > 0 ? (value+' '+(value==1?single:plural)+(last?'':', ')) : ''; +} + function updateTime() { var now = new Date(); var days = parseInt(uptime/86400); @@ -183,6 +213,7 @@ function updateTime() { } setTimeout(updateTime,1000); } + function refresh(top) { if (typeof top === 'undefined') { for (var i=0,element; element=document.querySelectorAll('input,button,select')[i]; i++) {element.disabled = true;} @@ -193,11 +224,13 @@ function refresh(top) { location.reload(); } } + function initab(page) { $.removeCookie('one'); $.removeCookie('tab'); if (page != null) location.replace(page); } + function settab(tab) { @@ -213,6 +246,7 @@ function settab(tab) { $.cookie('one',tab); } + function done(key) { var url = location.pathname.split('/'); var path = '/'+url[1]; @@ -220,18 +254,21 @@ function done(key) { $.removeCookie('one'); location.replace(path); } + function chkDelete(form, button) { button.value = form.confirmDelete.checked ? "" : ""; button.disabled = false; } -function makeWindow(name,height,width) { - var top = (screen.height-height)/2; + +function makeWindow(name, height, width) { + var top = (screen.height - height)/2; if (top < 0) {top = 0; height = screen.availHeight;} - var left = (screen.width-width)/2; + var left = (screen.width - width)/2; if (left < 0) {left = 0; width = screen.availWidth;} return window.open('',name,'resizeable=yes,scrollbars=yes,height='+height+',width='+width+',top='+top+',left='+left); } -function openBox(cmd,title,height,width,load,func,id) { + +function openBox(cmd, title, height, width, load, func, id) { // open shadowbox window (run in foreground) // included for legacy purposes, replaced by openPlugin var uri = cmd.split('?'); @@ -239,7 +276,8 @@ function openBox(cmd,title,height,width,load,func,id) { var options = load ? (func ? {modal:true,onClose:function(){setTimeout(func+'('+'"'+(id||'')+'")');}} : {modal:true,onClose:function(){location.reload();}}) : {modal:false}; Shadowbox.open({content:run, player:'iframe', title:title, height:Math.min(screen.availHeight,800), width:Math.min(screen.availWidth,1200), options:options}); } -function openWindow(cmd,title,height,width) { + +function openWindow(cmd, title, height, width) { // open regular window (run in background) // included for legacy purposes, replaced by openTerminal var window_name = title.replace(/ /g,"_"); @@ -253,10 +291,11 @@ function openWindow(cmd,title,height,width) { form_html += ''; var form = $(form_html); $('body').append(form); - makeWindow(window_name,height,width); + makeWindow(window_name, height, width); form.submit(); } -function openTerminal(tag,name,more) { + +function openTerminal(tag, name, more) { if (/MSIE|Edge/.test(navigator.userAgent)) { swal({title:"_(Unsupported Feature)_",text:"_(Sorry, this feature is not supported by MSIE/Edge)_.
_(Please try a different browser)_",type:'error',html:true,animation:'none',confirmButtonText:"_(Ok)_"}); return; @@ -267,8 +306,9 @@ function openTerminal(tag,name,more) { var socket = ['ttyd','syslog'].includes(tag) ? '/webterminal/'+tag+'/' : '/logterminal/'+name+(more=='.log'?more:'')+'/'; $.get('/webGui/include/OpenTerminal.php',{tag:tag,name:name,more:more},function(){setTimeout(function(){tty_window.location=socket; tty_window.focus();},200);}); } -function bannerAlert(text,cmd,plg,func,start) { - $.post('/webGui/include/StartCommand.php',{cmd:cmd,pid:1},function(pid) { + +function bannerAlert(text, cmd, plg, func, start) { + $.post('/webGui/include/StartCommand.php',{cmd:cmd, pid:1},function(pid) { if (pid == 0) { if ($(".upgrade_notice").hasClass('done') || timers.bannerAlert == null) { forcedBanner = false; @@ -303,7 +343,8 @@ function bannerAlert(text,cmd,plg,func,start) { } }); } -function openPlugin(cmd,title,plg,func,start=0,button=0) { + +function openPlugin(cmd, title, plg, func, start=0, button=0) { // start = 0 : run command only when not already running (default) // start = 1 : run command unconditionally // button = 0 : show CLOSE button (default) @@ -326,7 +367,8 @@ function openPlugin(cmd,title,plg,func,start=0,button=0) { $('button.confirm').prop('disabled',button!=0); }); } -function openDocker(cmd,title,plg,func,start=0,button=0) { + +function openDocker(cmd, title, plg, func, start=0, button=0) { // start = 0 : run command only when not already running (default) // start = 1 : run command unconditionally // button = 0 : hide CLOSE button (default) @@ -349,7 +391,8 @@ function openDocker(cmd,title,plg,func,start=0,button=0) { $('button.confirm').prop('disabled',button==0); }); } -function openVMAction(cmd,title,plg,func,start=0,button=0) { + +function openVMAction(cmd, title, plg, func, start=0, button=0) { // start = 0 : run command only when not already running (default) // start = 1 : run command unconditionally // button = 0 : hide CLOSE button (default) @@ -372,6 +415,7 @@ function openVMAction(cmd,title,plg,func,start=0,button=0) { $('button.confirm').prop('disabled',button==0); }); } + function abortOperation(pid) { swal({title:"",text:"",html:true,animation:'none',type:'warning',showCancelButton:true,confirmButtonText:"",cancelButtonText:""},function(){ $.post('/webGui/include/StartCommand.php',{kill:pid},function() { @@ -385,7 +429,8 @@ function abortOperation(pid) { }); }); } -function openChanges(cmd,title,nchan,button=0) { + +function openChanges(cmd, title, nchan, button=0) { $('div.spinner.fixed').show(); // button = 0 : hide CLOSE button (default) // button = 1 : show CLOSE button @@ -401,7 +446,8 @@ function openChanges(cmd,title,nchan,button=0) { $('button.confirm').text("").prop('disabled',false).show(); }); } -function openAlert(cmd,title,func) { + +function openAlert(cmd, title, func) { $.post('/webGui/include/StartCommand.php',{cmd:cmd,start:2},function(data) { $('div.spinner.fixed').hide(); swal({title:title,text:"

",html:true,animation:'none',showCancelButton:true,closeOnConfirm:false,confirmButtonText:"",cancelButtonText:""},function(proceed){ @@ -411,6 +457,7 @@ function openAlert(cmd,title,func) { $('pre#swalbody').html(data); }); } + function openDone(data) { if (data == '_DONE_') { $('div.spinner.fixed').hide(); @@ -425,6 +472,7 @@ function openDone(data) { } return false; } + function openError(data) { if (data == '_ERROR_') { $('div.spinner.fixed').hide(); @@ -433,16 +481,20 @@ function openError(data) { } return false; } -function showStatus(name,plugin,job) { + +function showStatus(name, plugin, job) { $.post('/webGui/include/ProcessStatus.php',{name:name,plugin:plugin,job:job},function(status){$(".tabs").append(status);}); } + function showFooter(data, id) { if (id !== undefined) $('#'+id).remove(); $('#copyright').prepend(data); } + function showNotice(data) { $('#user-notice').html(data.replace(/(.*)<\/a>/,"$1")); } + function escapeQuotes(form) { $(form).find('input[type=text]').each(function(){$(this).val($(this).val().replace(/"/g,'\\"'));}); } @@ -472,7 +524,7 @@ function addBannerWarning(text, warning=true, noDismiss=false, forced=false) { return arrayEntry; } -function dismissBannerWarning(entry,cookieText) { +function dismissBannerWarning(entry, cookieText) { $.cookie(cookieText,"true",{expires:30}); // reset after 1 month removeBannerWarning(entry); } @@ -520,12 +572,14 @@ function removeRebootNotice(message=""); } -function showUpgrade(text,noDismiss=false) { /** @note can likely be removed, not used in webgui or api repos */ + +function showUpgrade(text, noDismiss=false) { /** @note can likely be removed, not used in webgui or api repos */ if ($.cookie('os_upgrade')==null) { if (osUpgradeWarning) removeBannerWarning(osUpgradeWarning); osUpgradeWarning = addBannerWarning(text.replace(/(.+?)<\/a>/,"$1").replace(/(.*)<\/b>/,"$1"),false,noDismiss); } } + function hideUpgrade(set) { /** @note can likely be removed, not used in webgui or api repos */ removeBannerWarning(osUpgradeWarning); if (set) @@ -533,6 +587,7 @@ function hideUpgrade(set) { /** @note can likely be removed, not used in webgui else $.removeCookie('os_upgrade'); } + function confirmUpgrade(confirm) { if (confirm) { swal({title:" Unraid OS",text:"?",type:'warning',html:true,animation:'none',showCancelButton:true,closeOnConfirm:false,confirmButtonText:"",cancelButtonText:""},function(){ @@ -542,6 +597,7 @@ function confirmUpgrade(confirm) { openPlugin("plugin update unRAIDServer.plg"," Unraid OS"); } } + function openUpgrade() { hideUpgrade(); $.get('/plugins/dynamix.plugin.manager/include/ShowPlugins.php',{cmd:'alert'},function(data) { @@ -554,11 +610,13 @@ function openUpgrade() { } }); } + function digits(number) { if (number < 10) return 'one'; if (number < 100) return 'two'; return 'three'; } + function openNotifier() { $.post('/webGui/include/Notify.php',{cmd:'get',csrf_token:csrf_token},function(msg) { $.each($.parseJSON(msg), function(i, notify){ @@ -575,6 +633,7 @@ function openNotifier() { }); }); } + function closeNotifier() { $.post('/webGui/include/Notify.php',{cmd:'get',csrf_token:csrf_token},function(msg) { $.each($.parseJSON(msg), function(i, notify){ @@ -583,14 +642,17 @@ function closeNotifier() { $('div.jGrowl').find('div.jGrowl-close').trigger('click'); }); } + function viewHistory() { location.replace('/Tools/NotificationsArchive'); } + function flashReport() { $.post('/webGui/include/Report.php',{cmd:'config'},function(check){ if (check>0) addBannerWarning(" "); }); } + $(function() { let tab; @@ -722,8 +784,7 @@ foreach ($buttons as $button) { unset($buttons,$button); // Build page content -// Reload page every X minutes during extended viewing? -if (isset($myPage['Load']) && $myPage['Load']>0) echo "\n\n";echo "
"; +echo "
"; $tab = 1; $pages = []; if (!empty($myPage['text'])) $pages[$myPage['name']] = $myPage; @@ -908,7 +969,7 @@ defaultPage.on('message', function(msg,meta) { case 'warning': bell2++; break; case 'normal' : bell3++; break; } - + if (notify.show) { $.jGrowl(notify.subject+'
'+notify.description,{ group: notify.importance, @@ -1235,76 +1296,6 @@ $('body').on('click','a,.ca_href', function(e) { } } }); - -// Start & stop live updates when window loses focus -var nchanPaused = false; -var blurTimer = false; - -$(window).focus(function() { - nchanFocusStart(); -}); - -// Stop nchan on loss of focus - -$(window).blur(function() { - blurTimer = setTimeout(function(){ - nchanFocusStop(); - },30000); -}); - - -document.addEventListener("visibilitychange", (event) => { - - if (document.hidden) { - nchanFocusStop(); - } - - if (document.hidden) { - nchanFocusStop(); - } else { - nchanFocusStart(); - } - -}); - -function nchanFocusStart() { - if ( blurTimer !== false ) { - clearTimeout(blurTimer); - blurTimer = false; - } - - if (nchanPaused !== false ) { - removeBannerWarning(nchanPaused); - nchanPaused = false; - - try { - pageFocusFunction(); - } catch(error) {} - - subscribers.forEach(function(e) { - e.start(); - }); - } -} - -function nchanFocusStop(banner=true) { - if ( subscribers.length ) { - if ( nchanPaused === false ) { - var newsub = subscribers; - subscribers.forEach(function(e) { - try { - e.stop(); - } catch(err) { - newsub.splice(newsub.indexOf(e,1)); - } - }); - subscribers = newsub; - if ( banner && subscribers.length ) { - nchanPaused = addBannerWarning("",false,true ); - } - } - } -}