From 67ad68a23faa6114caa2b06dc334063caae22608 Mon Sep 17 00:00:00 2001 From: Will Miao Date: Sat, 18 Apr 2026 06:59:21 +0800 Subject: [PATCH] fix(filters): apply preset base models from full list --- static/js/managers/FilterPresetManager.js | 2 +- .../components/pageControls.filtering.test.js | 93 +++++++++++++++++++ 2 files changed, 94 insertions(+), 1 deletion(-) diff --git a/static/js/managers/FilterPresetManager.js b/static/js/managers/FilterPresetManager.js index 7f922ab8..bd8d89c1 100644 --- a/static/js/managers/FilterPresetManager.js +++ b/static/js/managers/FilterPresetManager.js @@ -232,7 +232,7 @@ export class FilterPresetManager { try { const fetchOptions = signal ? { signal } : {}; - const response = await fetch(`/api/lm/${this.currentPage}/base-models`, fetchOptions); + const response = await fetch(`/api/lm/${this.currentPage}/base-models?limit=0`, fetchOptions); if (!response.ok) throw new Error('Failed to fetch base models'); diff --git a/tests/frontend/components/pageControls.filtering.test.js b/tests/frontend/components/pageControls.filtering.test.js index cebcf791..692b2cf7 100644 --- a/tests/frontend/components/pageControls.filtering.test.js +++ b/tests/frontend/components/pageControls.filtering.test.js @@ -113,6 +113,7 @@ function renderControlsDom(pageKey) {
+
@@ -476,6 +477,98 @@ describe('FilterManager tag and base model filters', () => { eventManager.cleanup(); }); + it('applies all base models from a preset using the full base model list', async () => { + global.fetch = vi.fn((url) => { + if (url.includes('/base-models?limit=0')) { + return Promise.resolve({ + ok: true, + json: async () => ({ + success: true, + base_models: [ + { name: 'SDXL 1.0', count: 5 }, + { name: 'SDXL Lightning', count: 3 }, + { name: 'SDXL Hyper', count: 2 }, + ], + }), + }); + } + + if (url.includes('/base-models')) { + return Promise.resolve({ + ok: true, + json: async () => ({ + success: true, + base_models: [{ name: 'SDXL 1.0', count: 5 }], + }), + }); + } + + if (url.includes('/top-tags')) { + return Promise.resolve({ + ok: true, + json: async () => ({ + success: true, + tags: [], + }), + }); + } + + if (url.includes('/model-types')) { + return Promise.resolve({ + ok: true, + json: async () => ({ + success: true, + model_types: [], + }), + }); + } + + return Promise.resolve({ + ok: true, + json: async () => ({ success: true }), + }); + }); + + renderControlsDom('loras'); + const stateModule = await import('../../../static/js/state/index.js'); + stateModule.initPageState('loras'); + stateModule.state.global.settings.filter_presets = { + loras: [ + { + name: 'SDXL Family', + filters: { + baseModel: ['SDXL 1.0', 'SDXL Lightning', 'SDXL Hyper'], + tags: {}, + license: {}, + modelTypes: [], + tagLogic: 'any', + }, + }, + ], + }; + + const { getCurrentPageState } = stateModule; + const { FilterManager } = await import('../../../static/js/managers/FilterManager.js'); + + const manager = new FilterManager({ page: 'loras' }); + + await vi.waitFor(() => { + expect(document.querySelector('[data-base-model="SDXL Hyper"]')).not.toBeNull(); + }); + + await manager.presetManager.applyPreset('SDXL Family'); + + expect(manager.activePreset).toBe('SDXL Family'); + expect(manager.filters.baseModel).toEqual(['SDXL 1.0', 'SDXL Lightning', 'SDXL Hyper']); + expect(getCurrentPageState().filters.baseModel).toEqual(['SDXL 1.0', 'SDXL Lightning', 'SDXL Hyper']); + expect(loadMoreWithVirtualScrollMock).toHaveBeenCalledWith(true, false); + expect(showToastMock).toHaveBeenCalledWith( + 'Preset "SDXL Family" applied', + {}, + 'success', + ); + }); + }); describe('PageControls favorites, sorting, and duplicates scenarios', () => {