diff --git a/tests/test_downloads_tab_workflow_route.mjs b/tests/test_downloads_tab_workflow_route.mjs index 98be796..f64fc42 100644 --- a/tests/test_downloads_tab_workflow_route.mjs +++ b/tests/test_downloads_tab_workflow_route.mjs @@ -1634,6 +1634,53 @@ test('background Apply validation uses the Missing Models workflow signature', a ]); }); +test('Apply selected model preserves Missing Models browser geometry during both refresh stages', async () => { + const applyOptimisticAnalysisData = eval( + `(${extractMethod(queueMethodsSource, 'applyOptimisticAnalysisData')})` + ); + const refreshAnalysisInBackground = eval( + `(${extractMethod(queueMethodsSource, 'refreshAnalysisInBackground')})` + ); + const contentElement = {}; + const workflow = { nodes: [{ id: 7, widgets_values: ['linked.safetensors'] }] }; + const optimisticData = { missing_models: [], resolved_models: [{ node_id: 7, optimistic: true }] }; + const analyzedData = { missing_models: [], resolved_models: [{ node_id: 7, optimistic: false }] }; + const renderCalls = []; + const dialog = { + activeTab: 'missing', + contentElement, + activeMissingWorkflowSignature: 'linked-missing-signature', + cachedWorkflowSignature: null, + cachedAnalysisData: null, + applyResolvedSelectionAliasesToAnalysisData() {}, + getMissingWorkflowSignature() { + return 'linked-missing-signature'; + }, + getCurrentWorkflow() { + return workflow; + }, + cloneAnalysisData(data) { + return data; + }, + saveAnalysisCacheForActiveWorkflow() {}, + displayMissingModels(...args) { + renderCalls.push(args); + }, + reconnectActiveDownloads() {}, + async fetchJson() { + return analyzedData; + }, + }; + + applyOptimisticAnalysisData.call(dialog, optimisticData, workflow); + await refreshAnalysisInBackground.call(dialog, workflow); + + assert.deepEqual(renderCalls, [ + [contentElement, optimisticData, { preserveBrowser: true }], + [contentElement, analyzedData, { preserveBrowser: true }], + ]); +}); + test('background Loaded Models refresh keeps the current view until new data is ready', async () => { const loadLoadedModels = eval(`(${extractMethod(tabsLoadedMethodsSource, 'loadLoadedModels')})`); const workflow = { diff --git a/web/resolver/actions/queue_methods.js b/web/resolver/actions/queue_methods.js index 9b92e00..5ea9e2c 100644 --- a/web/resolver/actions/queue_methods.js +++ b/web/resolver/actions/queue_methods.js @@ -2633,7 +2633,11 @@ export const queueMethods = { this.saveAnalysisCacheForActiveWorkflow?.(); if (this.activeTab === 'missing' && this.contentElement) { - this.displayMissingModels(this.contentElement, data); + this.displayMissingModels( + this.contentElement, + data, + { preserveBrowser: true } + ); this.reconnectActiveDownloads?.(); } else { this.missingModels = Array.isArray(data.missing_models) ? data.missing_models : []; @@ -2661,7 +2665,11 @@ export const queueMethods = { this.saveAnalysisCacheForActiveWorkflow?.(); if (this.activeTab === 'missing' && this.contentElement && !this._analysisProgressToken) { - this.displayMissingModels(this.contentElement, data); + this.displayMissingModels( + this.contentElement, + data, + { preserveBrowser: true } + ); this.reconnectActiveDownloads?.(); } } catch (error) {