diff --git a/src/web/public/panels-ui.js b/src/web/public/panels-ui.js index 0209ba3c..237c09e3 100644 --- a/src/web/public/panels-ui.js +++ b/src/web/public/panels-ui.js @@ -3310,7 +3310,6 @@ Object.assign(CodemanApp.prototype, { ${icon} ${escapeHtml(match.name)} - ${escapeHtml(match.path)} ${sizeStr} ${downloadBtn} diff --git a/test/file-browser-search.test.ts b/test/file-browser-search.test.ts index a179428f..b3ffe5b2 100644 --- a/test/file-browser-search.test.ts +++ b/test/file-browser-search.test.ts @@ -312,7 +312,8 @@ describe('File Viewer server search', () => { expect(elements.fileBrowserTree.innerHTML).toContain('class="file-tree-size">1.5 KB'); expect(elements.fileBrowserTree.innerHTML).toContain('📘'); expect(elements.fileBrowserTree.innerHTML).toContain('📁'); - expect(elements.fileBrowserTree.innerHTML).toContain('src/widget.ts'); + expect(elements.fileBrowserTree.innerHTML).toContain('data-path="src/widget.ts"'); + expect(elements.fileBrowserTree.innerHTML).not.toContain('class="file-tree-path"'); expect(elements.fileBrowserTree.innerHTML).toContain( 'href="/api/sessions/session%2FA/file-raw?path=src%2Fwidget.ts&download=true"' ); @@ -409,6 +410,40 @@ describe('File Viewer server search', () => { } }); + it('keeps query B rendered when its response beats an already-launched query A', async () => { + const { app, elements, pending } = loadPanel(); + app.filterFileBrowser('query A'); + await vi.advanceTimersByTimeAsync(250); + app.filterFileBrowser('query B'); + await vi.advanceTimersByTimeAsync(250); + expect(pending).toHaveLength(2); + + pending[1].reply.resolve( + response( + successfulData({ + matches: [{ name: 'result-B.ts', path: 'result-B.ts', type: 'file' }], + matchCount: 1, + }) + ) + ); + await vi.advanceTimersByTimeAsync(0); + expect(elements.fileBrowserTree.innerHTML).toContain('result-B.ts'); + + pending[0].reply.resolve( + response( + successfulData({ + matches: [{ name: 'result-A.ts', path: 'result-A.ts', type: 'file' }], + matchCount: 1, + }) + ) + ); + await vi.advanceTimersByTimeAsync(0); + + expect(elements.fileBrowserTree.innerHTML).toContain('result-B.ts'); + expect(elements.fileBrowserTree.innerHTML).not.toContain('result-A.ts'); + expect(app._fileBrowserState.matches[0].name).toBe('result-B.ts'); + }); + it('clears a blank query and restores the compatible cached tree immediately without fetching', () => { const { app, elements, pending } = loadPanel(); app.fileBrowserData = {