From ae62f7eccef81d357acc8deb357fc46b080f0487 Mon Sep 17 00:00:00 2001 From: mlogclub Date: Tue, 2 Jun 2026 16:21:05 +0800 Subject: [PATCH] feat: add move functionality to DocumentList and FAQList for improved document management --- .../knowledge/_components/document-list.tsx | 41 ++++++++++++++++--- .../knowledge/_components/faq-list.tsx | 33 ++++++++++++--- 2 files changed, 62 insertions(+), 12 deletions(-) diff --git a/web/app/dashboard/knowledge/_components/document-list.tsx b/web/app/dashboard/knowledge/_components/document-list.tsx index 20d3374..c740a28 100644 --- a/web/app/dashboard/knowledge/_components/document-list.tsx +++ b/web/app/dashboard/knowledge/_components/document-list.tsx @@ -152,6 +152,7 @@ export function DocumentList({ knowledgeBaseId, onActionStateChange }: DocumentL const [moving, setMoving] = useState(false); const [bulkMoveOpen, setBulkMoveOpen] = useState(false); const [selectedIds, setSelectedIds] = useState([]); + const [moveTargetIds, setMoveTargetIds] = useState([]); const [contextMenuDocumentId, setContextMenuDocumentId] = useState(null); const [selectedDirectoryId, setSelectedDirectoryId] = useState(null); const [actionLoadingMap, setActionLoadingMap] = useState>({}); @@ -272,6 +273,11 @@ export function DocumentList({ knowledgeBaseId, onActionStateChange }: DocumentL setSelectedIds(checked ? currentPageIds : []); } + function openMoveDialog(ids: number[]) { + setMoveTargetIds(ids); + setBulkMoveOpen(true); + } + const openCreateDialog = useCallback(() => { setEditingItem(null); setDialogOpen(true); @@ -373,7 +379,8 @@ export function DocumentList({ knowledgeBaseId, onActionStateChange }: DocumentL } async function handleBatchMove(directoryId: number) { - if (!knowledgeBaseId || selectedIds.length === 0) { + const ids = moveTargetIds.length > 0 ? moveTargetIds : selectedIds; + if (!knowledgeBaseId || ids.length === 0) { return; } setMoving(true); @@ -381,10 +388,11 @@ export function DocumentList({ knowledgeBaseId, onActionStateChange }: DocumentL await batchMoveKnowledgeDocuments({ knowledgeBaseId, directoryId, - ids: selectedIds, + ids, }); - toast.success(t("knowledge.batchMoved", { count: selectedIds.length })); + toast.success(t("knowledge.batchMoved", { count: ids.length })); setBulkMoveOpen(false); + setMoveTargetIds([]); setSelectedIds([]); await loadData(); } catch (error) { @@ -540,6 +548,10 @@ export function DocumentList({ knowledgeBaseId, onActionStateChange }: DocumentL {t("knowledge.edit")} + openMoveDialog([item.id])}> + + {t("knowledge.move")} + void handleBuildIndex(item)}> {actionLoadingMap[item.id]?.rebuildIndex ? t("knowledge.running") : t("knowledge.rebuildIndex")} @@ -561,6 +573,10 @@ export function DocumentList({ knowledgeBaseId, onActionStateChange }: DocumentL {t("knowledge.edit")} + openMoveDialog([item.id])}> + + {t("knowledge.move")} + void handleBuildIndex(item)} disabled={actionLoadingMap[item.id]?.rebuildIndex}> {actionLoadingMap[item.id]?.rebuildIndex ? t("knowledge.running") : t("knowledge.rebuildIndex")} @@ -626,6 +642,10 @@ export function DocumentList({ knowledgeBaseId, onActionStateChange }: DocumentL {t("knowledge.edit")} + openMoveDialog([item.id])}> + + {t("knowledge.move")} + void handleBuildIndex(item)}> {actionLoadingMap[item.id]?.rebuildIndex ? t("knowledge.running") : t("knowledge.rebuildIndex")} @@ -646,6 +666,10 @@ export function DocumentList({ knowledgeBaseId, onActionStateChange }: DocumentL {t("knowledge.edit")} + openMoveDialog([item.id])}> + + {t("knowledge.move")} + void handleBuildIndex(item)} disabled={actionLoadingMap[item.id]?.rebuildIndex}> {actionLoadingMap[item.id]?.rebuildIndex ? t("knowledge.running") : t("knowledge.rebuildIndex")} @@ -680,7 +704,7 @@ export function DocumentList({ knowledgeBaseId, onActionStateChange }: DocumentL variant="outline" size="sm" className="h-7" - onClick={() => setBulkMoveOpen(true)} + onClick={() => openMoveDialog(selectedIds)} disabled={saving || moving} > @@ -737,8 +761,13 @@ export function DocumentList({ knowledgeBaseId, onActionStateChange }: DocumentL open={bulkMoveOpen} knowledgeBaseId={knowledgeBaseId} moving={moving} - selectedCount={selectedIds.length} - onOpenChange={setBulkMoveOpen} + selectedCount={moveTargetIds.length || selectedIds.length} + onOpenChange={(open) => { + setBulkMoveOpen(open); + if (!open) { + setMoveTargetIds([]); + } + }} onSubmit={(directoryId) => void handleBatchMove(directoryId)} /> diff --git a/web/app/dashboard/knowledge/_components/faq-list.tsx b/web/app/dashboard/knowledge/_components/faq-list.tsx index 190892c..05e93d3 100644 --- a/web/app/dashboard/knowledge/_components/faq-list.tsx +++ b/web/app/dashboard/knowledge/_components/faq-list.tsx @@ -141,6 +141,7 @@ export function FAQList({ const [moving, setMoving] = useState(false); const [bulkMoveOpen, setBulkMoveOpen] = useState(false); const [selectedIds, setSelectedIds] = useState([]); + const [moveTargetIds, setMoveTargetIds] = useState([]); const [contextMenuFAQId, setContextMenuFAQId] = useState(null); const [importing, setImporting] = useState(false); const [importDialogOpen, setImportDialogOpen] = useState(false); @@ -252,6 +253,11 @@ export function FAQList({ setSelectedIds(checked ? currentPageIds : []); } + function openMoveDialog(ids: number[]) { + setMoveTargetIds(ids); + setBulkMoveOpen(true); + } + function openEditDialog(item: KnowledgeFAQ) { setEditingItem(item); setDialogOpen(true); @@ -330,7 +336,8 @@ export function FAQList({ } async function handleBatchMove(directoryId: number) { - if (!knowledgeBaseId || selectedIds.length === 0) { + const ids = moveTargetIds.length > 0 ? moveTargetIds : selectedIds; + if (!knowledgeBaseId || ids.length === 0) { return; } setMoving(true); @@ -338,10 +345,11 @@ export function FAQList({ await batchMoveKnowledgeFAQs({ knowledgeBaseId, directoryId, - ids: selectedIds, + ids, }); - toast.success(t("knowledge.batchMoved", { count: selectedIds.length })); + toast.success(t("knowledge.batchMoved", { count: ids.length })); setBulkMoveOpen(false); + setMoveTargetIds([]); setSelectedIds([]); await loadData(); } catch (error) { @@ -471,6 +479,10 @@ export function FAQList({ {t("knowledge.edit")} + openMoveDialog([item.id])}> + + {t("knowledge.move")} + void handleBuildIndex(item)}> {actionLoadingMap[item.id]?.rebuildIndex ? t("knowledge.running") : t("knowledge.rebuildIndex")} @@ -491,6 +503,10 @@ export function FAQList({ {t("knowledge.edit")} + openMoveDialog([item.id])}> + + {t("knowledge.move")} + void handleBuildIndex(item)} disabled={actionLoadingMap[item.id]?.rebuildIndex}> {actionLoadingMap[item.id]?.rebuildIndex ? t("knowledge.running") : t("knowledge.rebuildIndex")} @@ -524,7 +540,7 @@ export function FAQList({ variant="outline" size="sm" className="h-7" - onClick={() => setBulkMoveOpen(true)} + onClick={() => openMoveDialog(selectedIds)} disabled={saving || moving} > @@ -593,8 +609,13 @@ export function FAQList({ open={bulkMoveOpen} knowledgeBaseId={knowledgeBaseId} moving={moving} - selectedCount={selectedIds.length} - onOpenChange={setBulkMoveOpen} + selectedCount={moveTargetIds.length || selectedIds.length} + onOpenChange={(open) => { + setBulkMoveOpen(open); + if (!open) { + setMoveTargetIds([]); + } + }} onSubmit={(directoryId) => void handleBatchMove(directoryId)} />