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.
This commit is contained in:
Dariusz L
2026-08-25 02:38:42 +02:00
parent ddde0ac3ce
commit cd626dedab
2 changed files with 64 additions and 3 deletions
@@ -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')})`);
@@ -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) {