feat: improve loading feedback UX with enhanced spinner, progress bar and contextual messages
This commit is contained in:
@@ -877,6 +877,58 @@
|
|||||||
padding: 20px;
|
padding: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Improved loading feedback */
|
||||||
|
.loading-container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
padding: 40px 20px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loading-spinner-enhanced {
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
border: 3px solid var(--pf-global--BorderColor--200);
|
||||||
|
border-top: 3px solid var(--pf-global--primary-color--100);
|
||||||
|
border-radius: 50%;
|
||||||
|
animation: spin 1s linear infinite;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loading-text {
|
||||||
|
color: var(--pf-global--Color--200);
|
||||||
|
font-size: 16px;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loading-subtext {
|
||||||
|
color: var(--pf-global--Color--300);
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loading-progress {
|
||||||
|
width: 200px;
|
||||||
|
height: 4px;
|
||||||
|
background-color: var(--pf-global--BackgroundColor--300);
|
||||||
|
border-radius: 2px;
|
||||||
|
margin-top: 12px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loading-progress-bar {
|
||||||
|
height: 100%;
|
||||||
|
background: linear-gradient(90deg, var(--pf-global--primary-color--100), var(--pf-global--info-color--100));
|
||||||
|
border-radius: 2px;
|
||||||
|
transition: width 0.3s ease;
|
||||||
|
animation: pulse 2s ease-in-out infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes pulse {
|
||||||
|
0%, 100% { opacity: 1; }
|
||||||
|
50% { opacity: 0.7; }
|
||||||
|
}
|
||||||
|
|
||||||
.workload-issues-list {
|
.workload-issues-list {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
@@ -2328,16 +2380,48 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If data not available, show loading
|
// If data not available, show enhanced loading with progress
|
||||||
|
showEnhancedLoading(container, namespace);
|
||||||
|
}
|
||||||
|
|
||||||
|
function showEnhancedLoading(container, namespace) {
|
||||||
|
const totalPods = namespace.pods ? namespace.pods.size : 0;
|
||||||
|
const totalIssues = namespace.validations ? namespace.validations.length : 0;
|
||||||
|
|
||||||
container.innerHTML = `
|
container.innerHTML = `
|
||||||
<div class="loading-spinner">
|
<div class="loading-container">
|
||||||
<div class="spinner"></div>
|
<div class="loading-spinner-enhanced"></div>
|
||||||
Loading issues...
|
<div class="loading-text">Loading workload issues...</div>
|
||||||
|
<div class="loading-subtext">Analyzing ${namespace.namespace} namespace (${totalPods} pods, ${totalIssues} issues)</div>
|
||||||
|
<div class="loading-progress">
|
||||||
|
<div class="loading-progress-bar" style="width: 60%"></div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
// Simulate progress update
|
||||||
|
let progress = 60;
|
||||||
|
const progressInterval = setInterval(() => {
|
||||||
|
progress += Math.random() * 10;
|
||||||
|
if (progress > 90) progress = 90;
|
||||||
|
|
||||||
|
const progressBar = container.querySelector('.loading-progress-bar');
|
||||||
|
if (progressBar) {
|
||||||
|
progressBar.style.width = `${progress}%`;
|
||||||
|
}
|
||||||
|
}, 500);
|
||||||
|
|
||||||
|
// Store interval for cleanup
|
||||||
|
container._progressInterval = progressInterval;
|
||||||
}
|
}
|
||||||
|
|
||||||
function displayWorkloadIssues(container, data, namespace) {
|
function displayWorkloadIssues(container, data, namespace) {
|
||||||
|
// Clean up progress interval if exists
|
||||||
|
if (container._progressInterval) {
|
||||||
|
clearInterval(container._progressInterval);
|
||||||
|
container._progressInterval = null;
|
||||||
|
}
|
||||||
|
|
||||||
if (!data.validations || data.validations.length === 0) {
|
if (!data.validations || data.validations.length === 0) {
|
||||||
container.innerHTML = `
|
container.innerHTML = `
|
||||||
<div style="text-align: center; padding: 20px; color: var(--pf-global--Color--300);">
|
<div style="text-align: center; padding: 20px; color: var(--pf-global--Color--300);">
|
||||||
|
|||||||
Reference in New Issue
Block a user