| 816 | let progressHideTimeout: number | null = null; // Global timeout reference |
| 817 | |
| 818 | function updateHeaderProgress(progress: any): void { |
| 819 | const progressNav = document.getElementById("processing-status-nav") as HTMLElement; |
| 820 | if (!progressNav) return; |
| 821 | |
| 822 | // Only hide progress bar if we explicitly get a progress update with 0 percentage |
| 823 | // and isProcessing is false, or if no progress data is provided |
| 824 | if (progress && progress.percentage === 0 && !progress.isProcessing) { |
| 825 | // This is an explicit "clear progress" signal |
| 826 | console.log("Progress: Clearing progress bar"); |
| 827 | progressNav.style.display = "none"; |
| 828 | // Reset progress bar classes for next use |
| 829 | const progressBar = progressNav.querySelector('.progress-bar') as HTMLElement; |
| 830 | if (progressBar) { |
| 831 | progressBar.classList.remove('bg-success'); |
| 832 | progressBar.classList.add('progress-bar-striped', 'progress-bar-animated'); |
| 833 | } |
| 834 | // Clear any existing timeout |
| 835 | if (progressHideTimeout) { |
| 836 | clearTimeout(progressHideTimeout); |
| 837 | progressHideTimeout = null; |
| 838 | } |
| 839 | return; |
| 840 | } |
| 841 | |
| 842 | if (progress && progress.percentage > 0) { |
| 843 | console.log("Progress: Showing progress bar with percentage:", progress.percentage); |
| 844 | // Show processing status for any percentage > 0 |
| 845 | progressNav.style.display = "block"; |
| 846 | |
| 847 | // Update progress bar |
| 848 | const progressBar = progressNav.querySelector('.progress-bar') as HTMLElement; |
| 849 | if (progressBar) { |
| 850 | progressBar.style.width = `${progress.percentage}%`; |
| 851 | progressBar.setAttribute('aria-valuenow', progress.percentage.toString()); |
| 852 | |
| 853 | // Change to green when reaching 100% |
| 854 | if (progress.percentage >= 100) { |
| 855 | progressBar.classList.remove('progress-bar-striped', 'progress-bar-animated'); |
| 856 | progressBar.classList.add('bg-success'); |
| 857 | } else { |
| 858 | progressBar.classList.add('progress-bar-striped', 'progress-bar-animated'); |
| 859 | progressBar.classList.remove('bg-success'); |
| 860 | } |
| 861 | } |
| 862 | |
| 863 | // Update percentage text |
| 864 | const percentageText = progressNav.querySelector('.text-light'); |
| 865 | if (percentageText) { |
| 866 | percentageText.textContent = `${progress.percentage}%`; |
| 867 | } |
| 868 | |
| 869 | // Update operation text |
| 870 | const operationText = progressNav.querySelector('span'); |
| 871 | if (operationText && progress.operation) { |
| 872 | operationText.textContent = progress.operation; |
| 873 | } |
| 874 | |
| 875 | // Show spinner for progress < 100% |