diff --git a/containers/libreportal/frontend/components/tasks/css/tasks.css b/containers/libreportal/frontend/components/tasks/css/tasks.css index 4267e87..47af0ca 100644 --- a/containers/libreportal/frontend/components/tasks/css/tasks.css +++ b/containers/libreportal/frontend/components/tasks/css/tasks.css @@ -640,6 +640,19 @@ border: 1px solid rgba(var(--text-rgb), 0.10); } +/* Canonical section loader (window.lpLoadingBox) inside a task-log + terminal box: fill the whole container and centre the spinner over the + terminal surface, dropping the loader's own card chrome so it reads as + one panel rather than a box-in-a-box. */ +.task-logs .log-container .lp-loading { + height: 100%; + min-height: 0; + margin: 0; + padding: 0; + background: none; + border: 0; +} + .meta-item { display: flex; align-items: baseline; diff --git a/containers/libreportal/frontend/components/tasks/js/tasks-list-render.js b/containers/libreportal/frontend/components/tasks/js/tasks-list-render.js index 8fe6bda..7980263 100644 --- a/containers/libreportal/frontend/components/tasks/js/tasks-list-render.js +++ b/containers/libreportal/frontend/components/tasks/js/tasks-list-render.js @@ -259,7 +259,7 @@ Object.assign(TasksManager.prototype, {
${hasLogs ? task.log.map(log => `
${this.taskManager.parseAnsiColors(log)}
`).join('') : - '
Loading logs...
' + ((typeof window.lpLoadingBox === 'function') ? window.lpLoadingBox('Loading logs…') : '
Loading logs…
') } diff --git a/containers/libreportal/frontend/components/tasks/js/tasks-log-stream.js b/containers/libreportal/frontend/components/tasks/js/tasks-log-stream.js index b5064e9..27db66c 100644 --- a/containers/libreportal/frontend/components/tasks/js/tasks-log-stream.js +++ b/containers/libreportal/frontend/components/tasks/js/tasks-log-stream.js @@ -22,7 +22,7 @@ Object.assign(TasksManager.prototype, { const render = () => { const logsContainer = document.getElementById(`logs-${taskId}`); if (!logsContainer) return; - const overlay = logsContainer.querySelector('div[style*="position: absolute"]'); + const overlay = logsContainer.querySelector('.lp-loading, div[style*="position: absolute"]'); if (overlay) overlay.remove(); let preElement = logsContainer.querySelector('pre.output-content'); if (!preElement) { @@ -114,7 +114,9 @@ Object.assign(TasksManager.prototype, { return true; }; - logsContainer.innerHTML = '
🔄 Loading logs...
'; + logsContainer.innerHTML = (typeof window.lpLoadingBox === 'function') + ? window.lpLoadingBox('Loading logs…') + : '
Loading logs…
'; const isScrolledToBottom = logsContainer.scrollHeight - logsContainer.scrollTop <= logsContainer.clientHeight + 10; const logResponse = await fetch(`/read-file?path=tasks/${taskId}.log`); @@ -276,7 +278,7 @@ Object.assign(TasksManager.prototype, { const logsHtml = `
-
Loading logs...
+ ${(typeof window.lpLoadingBox === 'function') ? window.lpLoadingBox('Loading logs…') : '
Loading logs…
'}
`;