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('') :
- '
'
+ ((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 = `
+ ${(typeof window.lpLoadingBox === 'function') ? window.lpLoadingBox('Loading logs…') : '
Loading logs…
'}
`;