From b2c83cbe59196ddb89759211d9273baf63609ed7 Mon Sep 17 00:00:00 2001 From: kev1n77 Date: Fri, 12 Jun 2026 17:24:14 +0800 Subject: [PATCH] fix(ui): @ file picker supports subdirectory navigation --- .../components/FileMentionPicker.tsx | 30 +++++++++++++++++-- .../src/flow_chat/services/FlowChatManager.ts | 3 +- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/web-ui/src/flow_chat/components/FileMentionPicker.tsx b/src/web-ui/src/flow_chat/components/FileMentionPicker.tsx index b7b213d52..56850c0bc 100644 --- a/src/web-ui/src/flow_chat/components/FileMentionPicker.tsx +++ b/src/web-ui/src/flow_chat/components/FileMentionPicker.tsx @@ -326,6 +326,14 @@ export const FileMentionPicker: React.FC = ({ onClose(); }, [onSelect, onClose]); + const handleItemClick = useCallback((item: FileItem) => { + if (item.isDirectory && !isSearchMode) { + enterDirectory(item); + } else { + handleSelect(item); + } + }, [enterDirectory, handleSelect, isSearchMode]); + const handleKeyDown = useCallback((e: KeyboardEvent) => { if (!isOpen) return; @@ -344,11 +352,25 @@ export const FileMentionPicker: React.FC = ({ setSelectedIndex(prev => (prev < displayItems.length - 1 ? prev + 1 : 0)); } break; + case 'ArrowRight': + e.preventDefault(); + e.stopPropagation(); + if (!isSearchMode && displayItems.length > 0 && displayItems[selectedIndex]?.isDirectory) { + enterDirectory(displayItems[selectedIndex]); + } + break; + case 'ArrowLeft': + e.preventDefault(); + e.stopPropagation(); + if (!isSearchMode && pathHistory.length > 0) { + goBack(); + } + break; case 'Enter': e.preventDefault(); e.stopPropagation(); if (displayItems.length > 0 && displayItems[selectedIndex]) { - handleSelect(displayItems[selectedIndex]); + handleItemClick(displayItems[selectedIndex]); } break; case 'Escape': @@ -364,7 +386,7 @@ export const FileMentionPicker: React.FC = ({ } break; } - }, [displayItems, handleSelect, isOpen, onClose, selectedIndex]); + }, [displayItems, handleSelect, handleItemClick, enterDirectory, goBack, isSearchMode, isOpen, onClose, selectedIndex, pathHistory.length]); useEffect(() => { if (isOpen) { @@ -478,7 +500,7 @@ export const FileMentionPicker: React.FC = ({ key={item.path} data-index={index} className={`file-mention-picker__item ${index === selectedIndex ? 'file-mention-picker__item--selected' : ''}`} - onClick={() => handleSelect(item)} + onClick={() => handleItemClick(item)} onContextMenu={(e) => handleContextMenu(e, item)} onMouseEnter={() => setSelectedIndex(index)} > @@ -495,6 +517,8 @@ export const FileMentionPicker: React.FC = ({
{t('fileMention.navHint')} + {t('fileMention.enterHint')} + {t('fileMention.backHint')} Enter {t('fileMention.selectHint')}
diff --git a/src/web-ui/src/flow_chat/services/FlowChatManager.ts b/src/web-ui/src/flow_chat/services/FlowChatManager.ts index 68fb06068..04dc3849c 100644 --- a/src/web-ui/src/flow_chat/services/FlowChatManager.ts +++ b/src/web-ui/src/flow_chat/services/FlowChatManager.ts @@ -114,8 +114,7 @@ export class FlowChatManager { return existingRequest; } - let request: Promise; - request = this.initializeWorkspace( + const request = this.initializeWorkspace( requestKey, workspacePath, preferredMode,