@@ -4445,15 +4445,26 @@ function renderFolderEntries(entries: LocalFolderFile[], depth: number, isRemote
44454445 if (entry.isDirectory) {
44464446 const hasChildren = entry.children && entry.children.length > 0;
44474447 const isLoading = (entry as any)._loading;
4448+ const loadError = (entry as any)._loadError as string | undefined;
4449+ let innerHtml = '';
4450+ if (hasChildren) {
4451+ innerHtml = renderFolderEntries(entry.children!, depth + 1, isRemote);
4452+ } else if (!entry.collapsed && isRemote) {
4453+ if (isLoading) {
4454+ innerHtml = `<div class="folder-loading" style="padding-left:${8 + (depth+1) * 14}px">Loading…</div>`;
4455+ } else if (loadError) {
4456+ innerHtml = `<div class="folder-loading" style="padding-left:${8 + (depth+1) * 14}px;color:var(--error-color,#e88080);" title="${escapeHtml(loadError)}">Failed to load</div>`;
4457+ } else if ((entry as any)._loaded) {
4458+ innerHtml = `<div class="folder-loading" style="padding-left:${8 + (depth+1) * 14}px">Empty</div>`;
4459+ }
4460+ }
44484461 return `
44494462 <div class="folder-subdir ${entry.collapsed ? 'collapsed' : ''}" data-subdir-path="${escapeHtml(entry.path)}" ${isRemote ? 'data-remote-dir="true"' : ''}>
44504463 <div class="folder-subdir-header" style="padding-left: ${8 + depth * 14}px">
44514464 <span class="folder-toggle">${isLoading ? '⌛' : '▼'}</span>
44524465 <span class="folder-subdir-name" title="${escapeHtml(entry.path)}">${escapeHtml(entry.name)}</span>
44534466 </div>
4454- <div class="folder-subdir-files">
4455- ${hasChildren ? renderFolderEntries(entry.children!, depth + 1, isRemote) : (!entry.collapsed && isRemote && !isLoading ? '<div class="folder-loading" style="padding-left:' + (8 + (depth+1) * 14) + 'px;font-size:11px;color:var(--text-muted);">Loading...</div>' : '')}
4456- </div>
4467+ <div class="folder-subdir-files">${innerHtml}</div>
44574468 </div>`;
44584469 }
44594470 const icon = entry.fileType === 'image' ? '\uD83D\uDDBC' : entry.fileType === 'video' ? '\u25B6' : '';
@@ -4491,7 +4502,7 @@ function renderFolderTree(): void {
44914502 elements.foldersList.innerHTML = state.folders
44924503 .map(
44934504 (folder) => `
4494- <div class="folder-group ${folder.collapsed ? 'collapsed' : ''}${folder.isRemote ? ' remote' : ''}" data-path="${escapeHtml(folder.path)}" ${folder.isRemote ? 'data-remote="true"' : ''}>
4505+ <div class="folder-group ${folder.collapsed ? 'collapsed' : ''}${folder.isRemote ? ' remote' : ''}" data-path="${escapeHtml(folder.path)}" ${folder.isRemote ? 'data-remote="true"' : ''} ${folder.connectionId ? `data-connection-id="${escapeHtml(folder.connectionId)}"` : ''} >
44954506 <div class="folder-header">
44964507 <span class="folder-toggle">▼</span>
44974508 <span class="folder-name" title="${escapeHtml(folder.path)}">${folder.isRemote ? '<span class="ssh-badge">SSH</span> ' : ''}${escapeHtml(folder.name)}</span>
@@ -4552,7 +4563,9 @@ function renderFolderTree(): void {
45524563 const subdirEl = header.closest('.folder-subdir') as HTMLElement;
45534564 const subdirPath = subdirEl?.dataset.subdirPath;
45544565 const isRemoteDir = subdirEl?.dataset.remoteDir === 'true';
4555- const folderGroupPath = (subdirEl?.closest('.folder-group') as HTMLElement)?.dataset.path;
4566+ const folderGroupEl = subdirEl?.closest('.folder-group') as HTMLElement;
4567+ const folderGroupPath = folderGroupEl?.dataset.path;
4568+ const connectionId = folderGroupEl?.dataset.connectionId;
45564569 if (!subdirPath || !folderGroupPath) return;
45574570 const folder = state.folders.find(f => f.path === folderGroupPath);
45584571 if (!folder) return;
@@ -4562,16 +4575,24 @@ function renderFolderTree(): void {
45624575 // Toggle collapse
45634576 node.collapsed = !node.collapsed;
45644577
4565- // Lazy-load remote subdirectory contents if expanding and no children yet
4566- if (!node.collapsed && isRemoteDir && (!node.children || node.children.length === 0)) {
4578+ // Lazy-load remote subdirectory contents if expanding and not yet loaded
4579+ if (!node.collapsed && isRemoteDir && !(node as any)._loaded && (!node.children || node.children.length === 0)) {
45674580 (node as any)._loading = true;
4581+ (node as any)._loadError = undefined;
45684582 renderFolderTree();
45694583 try {
4570- const result = await window.api.sshListRemoteDir(subdirPath);
4571- if (result.success && result.files) {
4572- node.children = mapFolderEntries(result.files);
4584+ const result = await window.api.sshListRemoteDir(subdirPath, connectionId);
4585+ if (result.success) {
4586+ node.children = mapFolderEntries(result.files || []);
4587+ (node as any)._loaded = true;
4588+ } else {
4589+ (node as any)._loadError = result.error || 'Failed to list directory';
4590+ console.error('sshListRemoteDir failed:', result.error);
45734591 }
4574- } catch { /* ignore */ }
4592+ } catch (err) {
4593+ (node as any)._loadError = String(err);
4594+ console.error('sshListRemoteDir error:', err);
4595+ }
45754596 (node as any)._loading = false;
45764597 }
45774598
0 commit comments