From 831a9da9d798ee1b9a062ef1dc2e567e1c15c7d6 Mon Sep 17 00:00:00 2001 From: Will Miao Date: Tue, 18 Nov 2025 11:18:32 +0800 Subject: [PATCH] feat: update version badge logic for same-base update strategy, see #676 - Remove unused isNewer variable calculation - Use dividerThresholdVersionId instead of latestLibraryVersionId for badge logic - Add test case to verify newer version badge appears with same-base strategy - Ensures correct badge display when filtering by same base model versions --- .../js/components/shared/ModelVersionsTab.js | 5 +- .../components/modelVersionsTab.media.test.js | 66 +++++++++++++++++++ 2 files changed, 67 insertions(+), 4 deletions(-) diff --git a/static/js/components/shared/ModelVersionsTab.js b/static/js/components/shared/ModelVersionsTab.js index 8b04e25c..456c17f5 100644 --- a/static/js/components/shared/ModelVersionsTab.js +++ b/static/js/components/shared/ModelVersionsTab.js @@ -567,9 +567,6 @@ function render(record) { const rowsMarkup = filteredVersions .map(version => { - const isNewer = - typeof latestLibraryVersionId === 'number' && - version.versionId > latestLibraryVersionId; let markup = ''; if ( !dividerInserted && @@ -580,7 +577,7 @@ function render(record) { markup += ''; } markup += renderRow(version, { - latestLibraryVersionId, + latestLibraryVersionId: dividerThresholdVersionId, currentVersionId: normalizedCurrentVersionId, modelId: record?.modelId ?? modelId, }); diff --git a/tests/frontend/components/modelVersionsTab.media.test.js b/tests/frontend/components/modelVersionsTab.media.test.js index a4c6af7c..0e6e26a7 100644 --- a/tests/frontend/components/modelVersionsTab.media.test.js +++ b/tests/frontend/components/modelVersionsTab.media.test.js @@ -283,4 +283,70 @@ describe('ModelVersionsTab media rendering', () => { const toggleTextAfter = document.querySelector('.versions-filter-toggle .sr-only'); expect(toggleTextAfter?.textContent?.trim()).toContain('All versions'); }); + + it('shows a newer version badge when viewing same-base results', async () => { + stateMock.global.settings.update_flag_strategy = 'same_base'; + fetchModelUpdateVersions.mockResolvedValue({ + success: true, + record: { + shouldIgnore: false, + inLibraryVersionIds: [3, 1], + versions: [ + { + versionId: 4, + name: 'V4', + baseModel: 'Base IL', + previewUrl: '/api/lm/previews/v4.png', + sizeBytes: 1024, + isInLibrary: false, + shouldIgnore: false, + }, + { + versionId: 3, + name: 'V3', + baseModel: 'Base IL', + previewUrl: '/api/lm/previews/v3.png', + sizeBytes: 2048, + isInLibrary: true, + shouldIgnore: false, + }, + { + versionId: 2, + name: 'V2', + baseModel: 'Base Flux', + previewUrl: '/api/lm/previews/v2.png', + sizeBytes: 4096, + isInLibrary: false, + shouldIgnore: false, + }, + { + versionId: 1, + name: 'V1', + baseModel: 'Base Flux', + previewUrl: '/api/lm/previews/v1.png', + sizeBytes: 8192, + isInLibrary: true, + shouldIgnore: false, + }, + ], + }, + }); + + const { initVersionsTab } = await import(MODEL_VERSIONS_MODULE); + const controller = initVersionsTab({ + modalId: 'model-versions-modal', + modelType: 'loras', + modelId: 333, + currentVersionId: 1, + }); + + await controller.load(); + + const rows = document.querySelectorAll('.model-version-row'); + expect(rows.length).toBe(2); + const firstBadges = Array.from(rows[0].querySelectorAll('.version-badge')).map( + badge => badge.textContent?.trim() + ); + expect(firstBadges).toContain('Newer Version'); + }); });