Skip to content

Commit c69338b

Browse files
author
IM.codes
committed
Fix FileBrowser lightweight listings
1 parent 53bc8cf commit c69338b

2 files changed

Lines changed: 22 additions & 12 deletions

File tree

web/src/components/FileBrowser.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -690,7 +690,7 @@ export function FileBrowser({
690690
// Keep the initial directory list lightweight. The tree currently only
691691
// renders names/dir flags, so per-file metadata (size/mime/downloadId)
692692
// just adds avoidable stat work on first open, especially on mobile.
693-
requestId = ws.fsListDir(nodePath, includeFiles, showHidden);
693+
requestId = ws.fsListDir(nodePath, includeFiles, false);
694694
} catch {
695695
setData((prev) => updateNode(prev, nodePath, { isLoading: false }));
696696
return;

web/test/components/FileBrowser.test.tsx

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,11 @@ function makeWsFactory() {
8787
let lastRequestId = 'mock-req-id';
8888
let lastSentPath = '';
8989
let lastSentIncludeFiles = false;
90-
const fsListDir = vi.fn((path: string, includeFiles = false) => {
90+
let lastSentIncludeMetadata = false;
91+
const fsListDir = vi.fn((path: string, includeFiles = false, includeMetadata = false) => {
9192
lastSentPath = path;
9293
lastSentIncludeFiles = includeFiles;
94+
lastSentIncludeMetadata = includeMetadata;
9395
return lastRequestId;
9496
});
9597
const fsMkdir = vi.fn((path: string) => {
@@ -153,7 +155,7 @@ function makeWsFactory() {
153155
for (const messageHandler of messageHandlers) messageHandler(msg);
154156
};
155157

156-
return { ws, fsListDir, fsMkdir, fsWriteFile, fsRename, fsDelete, respond, respondError, sendMsg, getLastPath: () => lastSentPath, getIncludeFiles: () => lastSentIncludeFiles };
158+
return { ws, fsListDir, fsMkdir, fsWriteFile, fsRename, fsDelete, respond, respondError, sendMsg, getLastPath: () => lastSentPath, getIncludeFiles: () => lastSentIncludeFiles, getIncludeMetadata: () => lastSentIncludeMetadata };
157159
}
158160

159161
describe('FileBrowser', () => {
@@ -196,6 +198,14 @@ describe('FileBrowser', () => {
196198

197199
// ── Layout ─────────────────────────────────────────────────────────────
198200

201+
202+
it('requests lightweight directory listings even when hidden files are visible by default', () => {
203+
const { ws, fsListDir } = makeWsFactory();
204+
render(<FileBrowser ws={ws} mode="file-multi" layout="panel" initialPath="/home/user" onConfirm={vi.fn()} />);
205+
206+
expect(fsListDir).toHaveBeenCalledWith('/home/user', true, false);
207+
});
208+
199209
it('renders modal overlay in modal layout', () => {
200210
const { ws } = makeWsFactory();
201211
render(<FileBrowser ws={ws} mode="dir-only" layout="modal" onConfirm={vi.fn()} onClose={vi.fn()} />);
@@ -298,7 +308,7 @@ describe('FileBrowser', () => {
298308
render(
299309
<FileBrowser ws={ws} mode="dir-only" layout="modal" initialPath="~/projects" onConfirm={vi.fn()} onClose={vi.fn()} />,
300310
);
301-
expect(fsListDir).toHaveBeenCalledWith('~/projects', false, true);
311+
expect(fsListDir).toHaveBeenCalledWith('~/projects', false, false);
302312
});
303313

304314
it('does NOT include files for dir-only mode', () => {
@@ -319,7 +329,7 @@ describe('FileBrowser', () => {
319329
<FileBrowser ws={ws} mode="file-single" layout="panel" initialPath="/home/user" onConfirm={vi.fn()} />,
320330
);
321331

322-
expect(fsListDir).toHaveBeenCalledWith('/home/user', true, true);
332+
expect(fsListDir).toHaveBeenCalledWith('/home/user', true, false);
323333
expect(getByTitle('Hidden').querySelector<HTMLInputElement>('input[type="checkbox"]')?.checked).toBe(true);
324334
expect(getByTitle('New file').querySelector('.fb-create-icon-file')).not.toBeNull();
325335
expect(getByTitle('New folder').querySelector('.fb-create-icon-folder')).not.toBeNull();
@@ -365,7 +375,7 @@ describe('FileBrowser', () => {
365375

366376
expect(getByText('projects')).toBeDefined();
367377
expect(getByText('documents')).toBeDefined();
368-
expect(fsListDir).toHaveBeenCalledWith('/home/user', false, true);
378+
expect(fsListDir).toHaveBeenCalledWith('/home/user', false, false);
369379
});
370380

371381
it('keeps the initial list request lightweight even when downloads are enabled', () => {
@@ -381,7 +391,7 @@ describe('FileBrowser', () => {
381391
/>,
382392
);
383393

384-
expect(fsListDir).toHaveBeenCalledWith('/home/user', true, true);
394+
expect(fsListDir).toHaveBeenCalledWith('/home/user', true, false);
385395
});
386396

387397
it('uses entry.path from a Windows drive root listing', async () => {
@@ -544,7 +554,7 @@ describe('FileBrowser', () => {
544554
sendMsg({ type: 'fs.mkdir_response', requestId: 'mock-mkdir-id', path: '/home/user/newdir', resolvedPath: '/home/user/newdir', status: 'ok' } as any);
545555
});
546556

547-
expect(fsListDir).toHaveBeenLastCalledWith('/home/user', false, true);
557+
expect(fsListDir).toHaveBeenLastCalledWith('/home/user', false, false);
548558
expect(onDirectoryCreated).toHaveBeenCalledWith('/home/user/newdir');
549559
});
550560

@@ -575,7 +585,7 @@ describe('FileBrowser', () => {
575585
sendMsg({ type: 'fs.write_response', requestId: 'mock-write-id', path: '/home/user/new-file.ts', resolvedPath: '/home/user/new-file.ts', status: 'ok', mtime: 2000 } as any);
576586
});
577587

578-
expect(fsListDir).toHaveBeenLastCalledWith('/home/user', true, true);
588+
expect(fsListDir).toHaveBeenLastCalledWith('/home/user', true, false);
579589
expect(fsReadFile).toHaveBeenCalledWith('/home/user/new-file.ts');
580590
});
581591

@@ -693,7 +703,7 @@ describe('FileBrowser', () => {
693703
});
694704

695705
expect(factory.fsListDir.mock.calls.length).toBe(callsBefore + 1);
696-
expect(factory.fsListDir).toHaveBeenLastCalledWith(longSegmentPath, true, true);
706+
expect(factory.fsListDir).toHaveBeenLastCalledWith(longSegmentPath, true, false);
697707
});
698708

699709
it('copies the current directory path from the footer next to Select', async () => {
@@ -2217,7 +2227,7 @@ describe('FileBrowser — file-manager preview/folder sync', () => {
22172227
);
22182228
});
22192229
// The left tree navigated to the previewed file's folder (its siblings).
2220-
await waitFor(() => expect(fsListDir).toHaveBeenCalledWith('/home/user/sub', true, true));
2230+
await waitFor(() => expect(fsListDir).toHaveBeenCalledWith('/home/user/sub', true, false));
22212231
});
22222232

22232233
it('previewing a folder opens its listing instead of "preview failed" (bug B)', async () => {
@@ -2239,7 +2249,7 @@ describe('FileBrowser — file-manager preview/folder sync', () => {
22392249
} as unknown as ServerMessage);
22402250
});
22412251
// The folder's listing is opened in the left tree (navigated into it)...
2242-
await waitFor(() => expect(fsListDir).toHaveBeenCalledWith('/home/user/somedir', true, true));
2252+
await waitFor(() => expect(fsListDir).toHaveBeenCalledWith('/home/user/somedir', true, false));
22432253
// ...and no "preview failed" error is rendered.
22442254
expect(screen.queryByText('file_browser.preview_error')).toBeNull();
22452255
});

0 commit comments

Comments
 (0)