From cd626dedab510a0dc1abf54b356ce997dcc377c2 Mon Sep 17 00:00:00 2001 From: Dariusz L Date: Tue, 25 Aug 2026 02:38:42 +0200 Subject: [PATCH] frontend: manual subfolder suggestion respects configured folder rule Pass preferTemplate through forceSuggestedDownloadSubfolder so manual subfolder suggestions use the same configured folder rule as post-search autofill. Added a focused test for the manual path. --- tests/test_downloads_tab_workflow_route.mjs | 57 +++++++++++++++++++ .../search/download_target_methods.js | 10 +++- 2 files changed, 64 insertions(+), 3 deletions(-) diff --git a/tests/test_downloads_tab_workflow_route.mjs b/tests/test_downloads_tab_workflow_route.mjs index 6487689..4635b55 100644 --- a/tests/test_downloads_tab_workflow_route.mjs +++ b/tests/test_downloads_tab_workflow_route.mjs @@ -4540,6 +4540,63 @@ test('post-search subfolder suggestion can prefer path template metadata', () => assert.equal(searchSuggestion.value, 'SDXL\\style'); }); +test('manual subfolder suggestion respects the configured folder rule', async () => { + const forceSuggestedDownloadSubfolder = eval(`(${extractMethod(downloadTargetMethodsSource, 'forceSuggestedDownloadSubfolder')})`); + const calls = []; + const categoryEl = { dataset: { value: 'loras' } }; + const subfolderEl = { value: '', dataset: {} }; + const dialog = { + getSavedDownloadTargetSelection() { + return null; + }, + normalizeDownloadCategory(value) { + return String(value || ''); + }, + getDropdownValue(element) { + return element.dataset.value; + }, + getSuggestedDownloadCategory() { + return 'loras'; + }, + shouldPreserveSavedDownloadCategory() { + return false; + }, + async ensureDownloadSubfoldersLoaded() {}, + getAvailableSubfolders() { + return []; + }, + getSuggestedDownloadSubfolder(...args) { + calls.push(args[3]); + return { + value: 'KREA2/krea 2 turbo', + baseDirectory: '', + suggestionSource: 'template', + template: '{base_model}/{first_tag}' + }; + }, + setDropdownValue(element, value) { + element.dataset.value = value; + }, + getCategoryDisplayName(value) { + return value; + }, + normalizeDownloadPathValue(value) { + return String(value || '').replace(/\\/g, '/'); + }, + saveDownloadTargetSelection() {}, + getSubfolderSuggestionTrackingPatch() { + return {}; + }, + syncDownloadTargetFolderContext() {} + }; + + const result = await forceSuggestedDownloadSubfolder.call(dialog, {}, categoryEl, subfolderEl); + + assert.deepEqual(calls, [{ preferTemplate: true }]); + assert.equal(result.subfolder, 'KREA2/krea 2 turbo'); + assert.equal(subfolderEl.value, 'KREA2/krea 2 turbo'); +}); + test('post-search auto-fill can refresh earlier suggested subfolder', async () => { const applySuggestedDownloadSubfolder = eval(`(${extractMethod(downloadTargetMethodsSource, 'applySuggestedDownloadSubfolder')})`); const getSubfolderSuggestionTrackingPatch = eval(`(${extractMethod(downloadTargetMethodsSource, 'getSubfolderSuggestionTrackingPatch')})`); diff --git a/web/resolver/search/download_target_methods.js b/web/resolver/search/download_target_methods.js index 81fd8ef..aa60f63 100644 --- a/web/resolver/search/download_target_methods.js +++ b/web/resolver/search/download_target_methods.js @@ -2075,7 +2075,7 @@ export const downloadTargetMethods = { } }, - async forceSuggestedDownloadSubfolder(missing, categoryEl, subfolderEl) { + async forceSuggestedDownloadSubfolder(missing, categoryEl, subfolderEl, options = {}) { if (!categoryEl || !subfolderEl) return null; const saved = this.getSavedDownloadTargetSelection(missing); @@ -2088,13 +2088,17 @@ export const downloadTargetMethods = { } await this.ensureDownloadSubfoldersLoaded(category); let folders = this.getAvailableSubfolders(category); - let suggestion = this.getSuggestedDownloadSubfolder(missing, category, folders); + const suggestionOptions = { + // Manual Suggest must use the same configured folder rule as post-search autofill. + preferTemplate: options.preferTemplate !== false + }; + let suggestion = this.getSuggestedDownloadSubfolder(missing, category, folders, suggestionOptions); if (!suggestion && suggestedCategory && suggestedCategory !== category) { category = suggestedCategory; await this.ensureDownloadSubfoldersLoaded(category); folders = this.getAvailableSubfolders(category); - suggestion = this.getSuggestedDownloadSubfolder(missing, category, folders); + suggestion = this.getSuggestedDownloadSubfolder(missing, category, folders, suggestionOptions); } if (!suggestion) {