fix: log/tasks rendering
This commit is contained in:
Binary file not shown.
@@ -246,6 +246,8 @@ class UiSmokeGoldenTest(unittest.TestCase):
|
|||||||
self.assertIn('async function loadTasksForSettings()', app_js)
|
self.assertIn('async function loadTasksForSettings()', app_js)
|
||||||
self.assertIn('async function loadLogsAndTasksForSettings()', app_js)
|
self.assertIn('async function loadLogsAndTasksForSettings()', app_js)
|
||||||
self.assertIn('function scheduleSettingsLogsPolling()', app_js)
|
self.assertIn('function scheduleSettingsLogsPolling()', app_js)
|
||||||
|
self.assertIn('lastHistoryRenderKey: ""', app_js)
|
||||||
|
self.assertIn('lastTasksRenderKey: ""', app_js)
|
||||||
self.assertIn('function openZipDownloadModal(selectedItems)', app_js)
|
self.assertIn('function openZipDownloadModal(selectedItems)', app_js)
|
||||||
self.assertIn('function openSingleFileDownloadModal(selectedItem)', app_js)
|
self.assertIn('function openSingleFileDownloadModal(selectedItem)', app_js)
|
||||||
self.assertIn('function markZipDownloadReady(fileName)', app_js)
|
self.assertIn('function markZipDownloadReady(fileName)', app_js)
|
||||||
@@ -300,6 +302,14 @@ class UiSmokeGoldenTest(unittest.TestCase):
|
|||||||
self.assertIn('return "Multi-item ZIP";', app_js)
|
self.assertIn('return "Multi-item ZIP";', app_js)
|
||||||
self.assertIn('details.push(`Current: ${task.current_item}`);', app_js)
|
self.assertIn('details.push(`Current: ${task.current_item}`);', app_js)
|
||||||
self.assertIn('details.push(`${task.done_items}/${task.total_items} items`);', app_js)
|
self.assertIn('details.push(`${task.done_items}/${task.total_items} items`);', app_js)
|
||||||
|
self.assertIn('if (settingsState.lastHistoryRenderKey === renderKey) {', app_js)
|
||||||
|
self.assertIn('if (settingsState.lastTasksRenderKey === renderKey) {', app_js)
|
||||||
|
self.assertIn('const scrollTop = elements.logsList.scrollTop;', app_js)
|
||||||
|
self.assertIn('const scrollTop = elements.tasksList.scrollTop;', app_js)
|
||||||
|
self.assertIn('elements.logsList.scrollTop = scrollTop;', app_js)
|
||||||
|
self.assertIn('elements.tasksList.scrollTop = scrollTop;', app_js)
|
||||||
|
self.assertIn('if (!settingsState.tasksLoaded) {', app_js)
|
||||||
|
self.assertIn('if (!settingsState.logsLoaded) {', app_js)
|
||||||
self.assertIn('downloadModal.logsButton.onclick = () => {', app_js)
|
self.assertIn('downloadModal.logsButton.onclick = () => {', app_js)
|
||||||
self.assertIn('openSettings("logs");', app_js)
|
self.assertIn('openSettings("logs");', app_js)
|
||||||
self.assertIn('function applyContextMenuSelection()', app_js)
|
self.assertIn('function applyContextMenuSelection()', app_js)
|
||||||
|
|||||||
@@ -103,6 +103,8 @@ let settingsState = {
|
|||||||
logsLoaded: false,
|
logsLoaded: false,
|
||||||
tasksLoaded: false,
|
tasksLoaded: false,
|
||||||
logsPollTimer: null,
|
logsPollTimer: null,
|
||||||
|
lastHistoryRenderKey: "",
|
||||||
|
lastTasksRenderKey: "",
|
||||||
showThumbnails: false,
|
showThumbnails: false,
|
||||||
preferredStartupPathLeft: null,
|
preferredStartupPathLeft: null,
|
||||||
preferredStartupPathRight: null,
|
preferredStartupPathRight: null,
|
||||||
@@ -3804,12 +3806,18 @@ function formatTaskLine(task) {
|
|||||||
|
|
||||||
function renderHistoryItems(items) {
|
function renderHistoryItems(items) {
|
||||||
const elements = settingsElements();
|
const elements = settingsElements();
|
||||||
|
const renderKey = JSON.stringify(Array.isArray(items) ? items : []);
|
||||||
|
if (settingsState.lastHistoryRenderKey === renderKey) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const scrollTop = elements.logsList.scrollTop;
|
||||||
elements.logsList.innerHTML = "";
|
elements.logsList.innerHTML = "";
|
||||||
if (!Array.isArray(items) || items.length === 0) {
|
if (!Array.isArray(items) || items.length === 0) {
|
||||||
const empty = document.createElement("div");
|
const empty = document.createElement("div");
|
||||||
empty.className = "popup-meta";
|
empty.className = "popup-meta";
|
||||||
empty.textContent = "No history entries yet.";
|
empty.textContent = "No history entries yet.";
|
||||||
elements.logsList.append(empty);
|
elements.logsList.append(empty);
|
||||||
|
settingsState.lastHistoryRenderKey = renderKey;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (const item of items) {
|
for (const item of items) {
|
||||||
@@ -3834,16 +3842,24 @@ function renderHistoryItems(items) {
|
|||||||
}
|
}
|
||||||
elements.logsList.append(row);
|
elements.logsList.append(row);
|
||||||
}
|
}
|
||||||
|
settingsState.lastHistoryRenderKey = renderKey;
|
||||||
|
elements.logsList.scrollTop = scrollTop;
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderTaskItems(items) {
|
function renderTaskItems(items) {
|
||||||
const elements = settingsElements();
|
const elements = settingsElements();
|
||||||
|
const renderKey = JSON.stringify(Array.isArray(items) ? items : []);
|
||||||
|
if (settingsState.lastTasksRenderKey === renderKey) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const scrollTop = elements.tasksList.scrollTop;
|
||||||
elements.tasksList.innerHTML = "";
|
elements.tasksList.innerHTML = "";
|
||||||
if (!Array.isArray(items) || items.length === 0) {
|
if (!Array.isArray(items) || items.length === 0) {
|
||||||
const empty = document.createElement("div");
|
const empty = document.createElement("div");
|
||||||
empty.className = "popup-meta";
|
empty.className = "popup-meta";
|
||||||
empty.textContent = "No tasks yet.";
|
empty.textContent = "No tasks yet.";
|
||||||
elements.tasksList.append(empty);
|
elements.tasksList.append(empty);
|
||||||
|
settingsState.lastTasksRenderKey = renderKey;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (const task of items) {
|
for (const task of items) {
|
||||||
@@ -3868,6 +3884,8 @@ function renderTaskItems(items) {
|
|||||||
}
|
}
|
||||||
elements.tasksList.append(row);
|
elements.tasksList.append(row);
|
||||||
}
|
}
|
||||||
|
settingsState.lastTasksRenderKey = renderKey;
|
||||||
|
elements.tasksList.scrollTop = scrollTop;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function loadHistoryForSettings() {
|
async function loadHistoryForSettings() {
|
||||||
@@ -3885,8 +3903,12 @@ async function loadTasksForSettings() {
|
|||||||
async function loadLogsAndTasksForSettings() {
|
async function loadLogsAndTasksForSettings() {
|
||||||
const elements = settingsElements();
|
const elements = settingsElements();
|
||||||
elements.logsError.textContent = "";
|
elements.logsError.textContent = "";
|
||||||
|
if (!settingsState.tasksLoaded) {
|
||||||
elements.tasksList.innerHTML = '<div class="popup-meta">Loading...</div>';
|
elements.tasksList.innerHTML = '<div class="popup-meta">Loading...</div>';
|
||||||
|
}
|
||||||
|
if (!settingsState.logsLoaded) {
|
||||||
elements.logsList.innerHTML = '<div class="popup-meta">Loading...</div>';
|
elements.logsList.innerHTML = '<div class="popup-meta">Loading...</div>';
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
await Promise.all([loadTasksForSettings(), loadHistoryForSettings()]);
|
await Promise.all([loadTasksForSettings(), loadHistoryForSettings()]);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|||||||
Reference in New Issue
Block a user