Skip to content

Commit 89f6403

Browse files
committed
feat: Add inline editing functionality to ChatHistoryTree and ChatHistoryTreeNode components
1 parent 92b96ce commit 89f6403

2 files changed

Lines changed: 30 additions & 3 deletions

File tree

src/renderer/src/components/layout/sidebar_items/chat/ChatHistoryTree.tsx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ export default function ChatHistoryTree({ onChatClick }: ChatHistoryTreeProps) {
4141
clearCheckedNodes
4242
} = useUIStore()
4343
const { modal } = App.useApp()
44+
45+
// 添加编辑状态管理
46+
const [editingNodeKey, setEditingNodeKey] = useState<string | null>(null)
4447

4548
// 解析节点键,获取节点类型和ID
4649
const parseNodeKey = useCallback(
@@ -345,6 +348,9 @@ export default function ChatHistoryTree({ onChatClick }: ChatHistoryTreeProps) {
345348
onDelete={() => handleDeleteFolder(folder.id)}
346349
onCreate={(type) => handleNodeCreate(folder.id, type)}
347350
onSaveEdit={handleSaveEdit}
351+
isEditing={editingNodeKey === `folder-${folder.id}`}
352+
onStartEdit={() => setEditingNodeKey(`folder-${folder.id}`)}
353+
onEndEdit={() => setEditingNodeKey(null)}
348354
/>
349355
),
350356
checkable: false,
@@ -362,6 +368,9 @@ export default function ChatHistoryTree({ onChatClick }: ChatHistoryTreeProps) {
362368
onDelete={() => handleDeleteChat(chat.id)}
363369
onChatClick={onChatClick}
364370
onSaveEdit={handleSaveEdit}
371+
isEditing={editingNodeKey === `chat-${chat.id}`}
372+
onStartEdit={() => setEditingNodeKey(`chat-${chat.id}`)}
373+
onEndEdit={() => setEditingNodeKey(null)}
365374
/>
366375
),
367376
isLeaf: true
@@ -475,7 +484,7 @@ export default function ChatHistoryTree({ onChatClick }: ChatHistoryTreeProps) {
475484
className="chat-history-tree"
476485
showIcon
477486
blockNode
478-
draggable
487+
draggable={!editingNodeKey}
479488
checkable={false}
480489
multiple
481490
expandedKeys={expandedKeys}

src/renderer/src/components/layout/sidebar_items/chat/ChatHistoryTreeNode.tsx

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ interface ChatHistoryTreeNodeProps {
2424
onCreate?: (type: 'folder' | 'chat') => void
2525
onChatClick?: (chatId: string) => void
2626
onSaveEdit?: (nodeId: string, nodeType: 'folder' | 'chat', newValue: string) => void
27+
onStartEdit?: () => void
28+
onEndEdit?: () => void
2729
}
2830

2931
export default function ChatHistoryTreeNode({
@@ -34,7 +36,9 @@ export default function ChatHistoryTreeNode({
3436
onDelete,
3537
onCreate,
3638
onChatClick,
37-
onSaveEdit
39+
onSaveEdit,
40+
onStartEdit,
41+
onEndEdit
3842
}: ChatHistoryTreeNodeProps) {
3943
const [isHovered, setIsHovered] = useState(false)
4044
const [isInlineEditing, setIsInlineEditing] = useState(false)
@@ -56,18 +60,21 @@ export default function ChatHistoryTreeNode({
5660
const currentName = getName()
5761
setEditValue(currentName)
5862
setIsInlineEditing(true)
63+
onStartEdit?.()
5964
}
6065

6166
const handleSaveEdit = () => {
6267
if (editValue.trim() && onSaveEdit) {
6368
onSaveEdit(data.id, type, editValue.trim())
6469
}
6570
setIsInlineEditing(false)
71+
onEndEdit?.()
6672
}
6773

6874
const handleCancelEdit = () => {
6975
setIsInlineEditing(false)
7076
setEditValue('')
77+
onEndEdit?.()
7178
}
7279

7380
const handleKeyDown = (e: React.KeyboardEvent) => {
@@ -187,6 +194,13 @@ export default function ChatHistoryTreeNode({
187194
onMouseLeave={() => setIsHovered(false)}
188195
onClick={handleClick}
189196
onDoubleClick={handleDoubleClick}
197+
draggable={false}
198+
onMouseDown={(e) => {
199+
// 阻止编辑状态下的拖动
200+
if (isInlineEditing) {
201+
e.stopPropagation()
202+
}
203+
}}
190204
>
191205
<div className="tree-node-content">
192206
<div className="tree-node-icon">{getIcon()}</div>
@@ -201,8 +215,12 @@ export default function ChatHistoryTreeNode({
201215
size="small"
202216
value={editValue}
203217
onChange={(e) => setEditValue(e.target.value)}
204-
onBlur={handleSaveEdit}
218+
onBlur={(e) => {
219+
handleSaveEdit()
220+
}}
205221
onKeyDown={handleKeyDown}
222+
onMouseDown={(e) => e.stopPropagation()}
223+
onClick={(e) => e.stopPropagation()}
206224
autoFocus
207225
style={{ width: '100%' }}
208226
/>

0 commit comments

Comments
 (0)