@@ -702,10 +702,37 @@ func (r *Router) serveAdminHTML(c *gin.Context) {
702702 }
703703 }
704704
705+ let isRefreshing = false;
706+ let lastRefreshTime = 0;
707+
705708 async function refreshJobs() {
706- const result = await apiCall('GET', '/jobs');
707- if (result && result.jobs) {
708- displayJobs(result.jobs);
709+ // Prevent concurrent requests
710+ if (isRefreshing) {
711+ console.log('[refreshJobs] Already refreshing, skipping request');
712+ return;
713+ }
714+
715+ // Debounce: prevent refreshing more than once per second
716+ const now = Date.now();
717+ if (now - lastRefreshTime < 1000) {
718+ console.log('[refreshJobs] Debounced, last refresh was ' + (now - lastRefreshTime) + 'ms ago');
719+ return;
720+ }
721+
722+ isRefreshing = true;
723+ lastRefreshTime = now;
724+ console.log('[refreshJobs] Starting refresh');
725+
726+ try {
727+ const result = await apiCall('GET', '/jobs');
728+ if (result && result.jobs) {
729+ displayJobs(result.jobs);
730+ console.log('[refreshJobs] Successfully refreshed ' + result.jobs.length + ' jobs');
731+ }
732+ } catch (error) {
733+ console.error('[refreshJobs] Error:', error);
734+ } finally {
735+ isRefreshing = false;
709736 }
710737 }
711738
@@ -796,9 +823,23 @@ func (r *Router) serveAdminHTML(c *gin.Context) {
796823 }
797824 }
798825
799- // Auto-refresh jobs every 1 minute
800- setInterval(refreshJobs, 60000);
801-
826+ // Auto-refresh jobs every 1 minute, but only when tab is visible
827+ let refreshInterval = setInterval(() => {
828+ if (!document.hidden) {
829+ refreshJobs();
830+ } else {
831+ console.log('[Auto-refresh] Tab hidden, skipping refresh');
832+ }
833+ }, 60000);
834+
835+ // Refresh when tab becomes visible after being hidden
836+ document.addEventListener('visibilitychange', () => {
837+ if (!document.hidden) {
838+ console.log('[Visibility] Tab visible, refreshing');
839+ refreshJobs();
840+ }
841+ });
842+
802843 // Initial load
803844 refreshJobs();
804845 </script>
0 commit comments