This commit is contained in:
Raphaël MANSUY 2025-12-04 19:18:38 +08:00
parent 803315e60c
commit 4629d24a40
6 changed files with 104 additions and 106 deletions

View file

@ -22,7 +22,6 @@ import PaginationControls from '@/components/ui/PaginationControls'
import { import {
scanNewDocuments, scanNewDocuments,
reprocessFailedDocuments,
getDocumentsPaginated, getDocumentsPaginated,
DocsStatusesResponse, DocsStatusesResponse,
DocStatus, DocStatus,
@ -948,42 +947,6 @@ export default function DocumentManager() {
} }
}, [t, startPollingInterval, currentTab, health, statusCounts]) }, [t, startPollingInterval, currentTab, health, statusCounts])
const retryFailedDocuments = useCallback(async () => {
try {
// Check if component is still mounted before starting the request
if (!isMountedRef.current) return;
const { status, message, track_id: _track_id } = await reprocessFailedDocuments(); // eslint-disable-line @typescript-eslint/no-unused-vars
// Check again if component is still mounted after the request completes
if (!isMountedRef.current) return;
// Note: _track_id is available for future use (e.g., progress tracking)
toast.message(message || status);
// Reset health check timer with 1 second delay to avoid race condition
useBackendState.getState().resetHealthCheckTimerDelayed(1000);
// Start fast refresh with 2-second interval immediately after retry
startPollingInterval(2000);
// Set recovery timer to restore normal polling interval after 15 seconds
setTimeout(() => {
if (isMountedRef.current && currentTab === 'documents' && health) {
// Restore intelligent polling interval based on document status
const hasActiveDocuments = hasActiveDocumentsStatus(statusCounts);
const normalInterval = hasActiveDocuments ? 5000 : 30000;
startPollingInterval(normalInterval);
}
}, 15000); // Restore after 15 seconds
} catch (err) {
// Only show error if component is still mounted
if (isMountedRef.current) {
toast.error(errorMessage(err));
}
}
}, [startPollingInterval, currentTab, health, statusCounts])
// Handle page size change - update state and save to store // Handle page size change - update state and save to store
const handlePageSizeChange = useCallback((newPageSize: number) => { const handlePageSizeChange = useCallback((newPageSize: number) => {
if (newPageSize === pagination.page_size) return; if (newPageSize === pagination.page_size) return;
@ -1370,16 +1333,6 @@ export default function DocumentManager() {
> >
<RefreshCwIcon /> {t('documentPanel.documentManager.scanButton')} <RefreshCwIcon /> {t('documentPanel.documentManager.scanButton')}
</Button> </Button>
<Button
variant="outline"
onClick={retryFailedDocuments}
side="bottom"
tooltip={t('documentPanel.documentManager.retryFailedTooltip')}
size="sm"
disabled={pipelineBusy}
>
<RotateCcwIcon /> {t('documentPanel.documentManager.retryFailedButton')}
</Button>
<Button <Button
variant="outline" variant="outline"
onClick={() => setShowPipelineStatus(true)} onClick={() => setShowPipelineStatus(true)}

View file

@ -70,6 +70,7 @@
"confirmButton": "نعم", "confirmButton": "نعم",
"deleteFileOption": "حذف الملفات المرفوعة أيضًا", "deleteFileOption": "حذف الملفات المرفوعة أيضًا",
"deleteFileTooltip": "حدد هذا الخيار لحذف الملفات المرفوعة المقابلة على الخادم أيضًا", "deleteFileTooltip": "حدد هذا الخيار لحذف الملفات المرفوعة المقابلة على الخادم أيضًا",
"deleteLLMCacheOption": "حذف ذاكرة LLM المؤقتة للاستخراج أيضًا",
"success": "تم بدء تشغيل خط معالجة حذف المستندات بنجاح", "success": "تم بدء تشغيل خط معالجة حذف المستندات بنجاح",
"failed": "فشل حذف المستندات:\n{{message}}", "failed": "فشل حذف المستندات:\n{{message}}",
"error": "فشل حذف المستندات:\n{{error}}", "error": "فشل حذف المستندات:\n{{error}}",
@ -97,7 +98,7 @@
"error": "فشل رفع بعض الملفات" "error": "فشل رفع بعض الملفات"
}, },
"generalError": "فشل الرفع\n{{error}}", "generalError": "فشل الرفع\n{{error}}",
"fileTypes": "الأنواع المدعومة: TXT، MD، DOCX، PDF، PPTX، RTF، ODT، EPUB، HTML، HTM، TEX، JSON، XML، YAML، YML، CSV، LOG، CONF، INI، PROPERTIES، SQL، BAT، SH، C، CPP، PY، JAVA، JS، TS، SWIFT، GO، RB، PHP، CSS، SCSS، LESS", "fileTypes": "الأنواع المدعومة: TXT، MD، DOCX، PDF، PPTX، XLSX، RTF، ODT، EPUB، HTML، HTM، TEX، JSON، XML، YAML، YML، CSV، LOG، CONF، INI، PROPERTIES، SQL، BAT، SH، C، CPP، PY، JAVA، JS، TS، SWIFT، GO، RB، PHP، CSS، SCSS، LESS",
"fileUploader": { "fileUploader": {
"singleFileLimit": "لا يمكن رفع أكثر من ملف واحد في المرة الواحدة", "singleFileLimit": "لا يمكن رفع أكثر من ملف واحد في المرة الواحدة",
"maxFilesLimit": "لا يمكن رفع أكثر من {{count}} ملفات", "maxFilesLimit": "لا يمكن رفع أكثر من {{count}} ملفات",
@ -113,13 +114,11 @@
}, },
"documentManager": { "documentManager": {
"title": "إدارة المستندات", "title": "إدارة المستندات",
"scanButton": "مسح ضوئي", "scanButton": "مسح/إعادة محاولة",
"scanTooltip": "مسح المستندات ضوئيًا في مجلد الإدخال", "scanTooltip": "مسح ومعالجة المستندات في مجلد الإدخال، وإعادة معالجة جميع المستندات الفاشلة أيضًا",
"retryFailedButton": "إعادة المحاولة",
"retryFailedTooltip": "إعادة معالجة جميع المستندات الفاشلة",
"refreshTooltip": "إعادة تعيين قائمة المستندات", "refreshTooltip": "إعادة تعيين قائمة المستندات",
"pipelineStatusButton": "حالة خط المعالجة", "pipelineStatusButton": "خط المعالجة",
"pipelineStatusTooltip": "عرض حالة خط المعالجة", "pipelineStatusTooltip": "عرض حالة خط معالجة المستندات",
"uploadedTitle": "المستندات المرفوعة", "uploadedTitle": "المستندات المرفوعة",
"uploadedDescription": "قائمة المستندات المرفوعة وحالاتها.", "uploadedDescription": "قائمة المستندات المرفوعة وحالاتها.",
"emptyTitle": "لا توجد مستندات", "emptyTitle": "لا توجد مستندات",
@ -156,17 +155,27 @@
"hideFileNameTooltip": "إخفاء اسم الملف" "hideFileNameTooltip": "إخفاء اسم الملف"
}, },
"pipelineStatus": { "pipelineStatus": {
"title": "حالة خط المعالجة", "title": "حالة خط الأنابيب",
"busy": "خط المعالجة مشغول", "busy": "خط الأنابيب مشغول",
"requestPending": "الطلب معلق", "requestPending": "طلب معلق",
"cancellationRequested": "طلب الإلغاء",
"jobName": "اسم المهمة", "jobName": "اسم المهمة",
"startTime": "وقت البدء", "startTime": "وقت البدء",
"progress": "التقدم", "progress": "التقدم",
"unit": "دفعة", "unit": "دفعة",
"latestMessage": "آخر رسالة", "pipelineMessages": "رسائل خط الأنابيب",
"historyMessages": "سجل الرسائل", "cancelButton": "إلغاء",
"cancelTooltip": "إلغاء معالجة خط الأنابيب",
"cancelConfirmTitle": "تأكيد إلغاء خط الأنابيب",
"cancelConfirmDescription": "سيؤدي هذا الإجراء إلى إيقاف معالجة خط الأنابيب الجارية. هل أنت متأكد من أنك تريد المتابعة؟",
"cancelConfirmButton": "تأكيد الإلغاء",
"cancelInProgress": "الإلغاء قيد التقدم...",
"pipelineNotRunning": "خط الأنابيب غير قيد التشغيل",
"cancelSuccess": "تم طلب إلغاء خط الأنابيب",
"cancelFailed": "فشل إلغاء خط الأنابيب\n{{error}}",
"cancelNotBusy": "خط الأنابيب غير قيد التشغيل، لا حاجة للإلغاء",
"errors": { "errors": {
"fetchFailed": "فشل في جلب حالة خط المعالجة\n{{error}}" "fetchFailed": "فشل في جلب حالة خط الأنابيب\n{{error}}"
} }
} }
}, },

View file

@ -70,6 +70,7 @@
"confirmButton": "YES", "confirmButton": "YES",
"deleteFileOption": "Also delete uploaded files", "deleteFileOption": "Also delete uploaded files",
"deleteFileTooltip": "Check this option to also delete the corresponding uploaded files on the server", "deleteFileTooltip": "Check this option to also delete the corresponding uploaded files on the server",
"deleteLLMCacheOption": "Also delete extracted LLM cache",
"success": "Document deletion pipeline started successfully", "success": "Document deletion pipeline started successfully",
"failed": "Delete Documents Failed:\n{{message}}", "failed": "Delete Documents Failed:\n{{message}}",
"error": "Delete Documents Failed:\n{{error}}", "error": "Delete Documents Failed:\n{{error}}",
@ -113,13 +114,11 @@
}, },
"documentManager": { "documentManager": {
"title": "Document Management", "title": "Document Management",
"scanButton": "Scan", "scanButton": "Scan/Retry",
"scanTooltip": "Scan documents in input folder", "scanTooltip": "Scan and process documents in input folder, and also reprocess all failed documents",
"retryFailedButton": "Retry",
"retryFailedTooltip": "Retry processing all failed documents",
"refreshTooltip": "Reset document list", "refreshTooltip": "Reset document list",
"pipelineStatusButton": "Pipeline Status", "pipelineStatusButton": "Pipeline",
"pipelineStatusTooltip": "View pipeline status", "pipelineStatusTooltip": "View document processing pipeline status",
"uploadedTitle": "Uploaded Documents", "uploadedTitle": "Uploaded Documents",
"uploadedDescription": "List of uploaded documents and their statuses.", "uploadedDescription": "List of uploaded documents and their statuses.",
"emptyTitle": "No Documents", "emptyTitle": "No Documents",
@ -159,14 +158,24 @@
"title": "Pipeline Status", "title": "Pipeline Status",
"busy": "Pipeline Busy", "busy": "Pipeline Busy",
"requestPending": "Request Pending", "requestPending": "Request Pending",
"cancellationRequested": "Cancellation Requested",
"jobName": "Job Name", "jobName": "Job Name",
"startTime": "Start Time", "startTime": "Start Time",
"progress": "Progress", "progress": "Progress",
"unit": "batch", "unit": "Batch",
"latestMessage": "Latest Message", "pipelineMessages": "Pipeline Messages",
"historyMessages": "History Messages", "cancelButton": "Cancel",
"cancelTooltip": "Cancel pipeline processing",
"cancelConfirmTitle": "Confirm Pipeline Cancellation",
"cancelConfirmDescription": "This will interrupt the ongoing pipeline processing. Are you sure you want to continue?",
"cancelConfirmButton": "Confirm Cancellation",
"cancelInProgress": "Cancellation in progress...",
"pipelineNotRunning": "Pipeline not running",
"cancelSuccess": "Pipeline cancellation requested",
"cancelFailed": "Failed to cancel pipeline\n{{error}}",
"cancelNotBusy": "Pipeline is not running, no need to cancel",
"errors": { "errors": {
"fetchFailed": "Failed to get pipeline status\n{{error}}" "fetchFailed": "Failed to fetch pipeline status\n{{error}}"
} }
} }
}, },

View file

@ -70,6 +70,7 @@
"confirmButton": "OUI", "confirmButton": "OUI",
"deleteFileOption": "Supprimer également les fichiers téléchargés", "deleteFileOption": "Supprimer également les fichiers téléchargés",
"deleteFileTooltip": "Cochez cette option pour supprimer également les fichiers téléchargés correspondants sur le serveur", "deleteFileTooltip": "Cochez cette option pour supprimer également les fichiers téléchargés correspondants sur le serveur",
"deleteLLMCacheOption": "Supprimer également le cache LLM d'extraction",
"success": "Pipeline de suppression de documents démarré avec succès", "success": "Pipeline de suppression de documents démarré avec succès",
"failed": "Échec de la suppression des documents :\n{{message}}", "failed": "Échec de la suppression des documents :\n{{message}}",
"error": "Échec de la suppression des documents :\n{{error}}", "error": "Échec de la suppression des documents :\n{{error}}",
@ -97,7 +98,7 @@
"error": "Certains fichiers n'ont pas pu être téléchargés" "error": "Certains fichiers n'ont pas pu être téléchargés"
}, },
"generalError": "Échec du téléchargement\n{{error}}", "generalError": "Échec du téléchargement\n{{error}}",
"fileTypes": "Types pris en charge : TXT, MD, DOCX, PDF, PPTX, RTF, ODT, EPUB, HTML, HTM, TEX, JSON, XML, YAML, YML, CSV, LOG, CONF, INI, PROPERTIES, SQL, BAT, SH, C, CPP, PY, JAVA, JS, TS, SWIFT, GO, RB, PHP, CSS, SCSS, LESS", "fileTypes": "Types pris en charge : TXT, MD, DOCX, PDF, PPTX, XLSX, RTF, ODT, EPUB, HTML, HTM, TEX, JSON, XML, YAML, YML, CSV, LOG, CONF, INI, PROPERTIES, SQL, BAT, SH, C, CPP, PY, JAVA, JS, TS, SWIFT, GO, RB, PHP, CSS, SCSS, LESS",
"fileUploader": { "fileUploader": {
"singleFileLimit": "Impossible de télécharger plus d'un fichier à la fois", "singleFileLimit": "Impossible de télécharger plus d'un fichier à la fois",
"maxFilesLimit": "Impossible de télécharger plus de {{count}} fichiers", "maxFilesLimit": "Impossible de télécharger plus de {{count}} fichiers",
@ -113,13 +114,11 @@
}, },
"documentManager": { "documentManager": {
"title": "Gestion des documents", "title": "Gestion des documents",
"scanButton": "Scanner", "scanButton": "Scanner/Retraiter",
"scanTooltip": "Scanner les documents dans le dossier d'entrée", "scanTooltip": "Scanner et traiter les documents dans le dossier d'entrée, et retraiter également tous les documents échoués",
"retryFailedButton": "Réessayer",
"retryFailedTooltip": "Réessayer le traitement de tous les documents échoués",
"refreshTooltip": "Réinitialiser la liste des documents", "refreshTooltip": "Réinitialiser la liste des documents",
"pipelineStatusButton": "État du Pipeline", "pipelineStatusButton": "Pipeline",
"pipelineStatusTooltip": "Voir l'état du pipeline", "pipelineStatusTooltip": "Voir l'état du pipeline de traitement des documents",
"uploadedTitle": "Documents téléchargés", "uploadedTitle": "Documents téléchargés",
"uploadedDescription": "Liste des documents téléchargés et leurs statuts.", "uploadedDescription": "Liste des documents téléchargés et leurs statuts.",
"emptyTitle": "Aucun document", "emptyTitle": "Aucun document",
@ -157,14 +156,24 @@
}, },
"pipelineStatus": { "pipelineStatus": {
"title": "État du Pipeline", "title": "État du Pipeline",
"busy": "Pipeline occupé", "busy": "Pipeline Occupé",
"requestPending": "Requête en attente", "requestPending": "Demande en Attente",
"jobName": "Nom du travail", "cancellationRequested": "Annulation Demandée",
"startTime": "Heure de début", "jobName": "Nom du Travail",
"progress": "Progression", "startTime": "Heure de Début",
"unit": "lot", "progress": "Progrès",
"latestMessage": "Dernier message", "unit": "Lot",
"historyMessages": "Historique des messages", "pipelineMessages": "Messages de Pipeline",
"cancelButton": "Annuler",
"cancelTooltip": "Annuler le traitement du pipeline",
"cancelConfirmTitle": "Confirmer l'Annulation du Pipeline",
"cancelConfirmDescription": "Cette action interrompra le traitement du pipeline en cours. Êtes-vous sûr de vouloir continuer ?",
"cancelConfirmButton": "Confirmer l'Annulation",
"cancelInProgress": "Annulation en cours...",
"pipelineNotRunning": "Le pipeline n'est pas en cours d'exécution",
"cancelSuccess": "Annulation du pipeline demandée",
"cancelFailed": "Échec de l'annulation du pipeline\n{{error}}",
"cancelNotBusy": "Le pipeline n'est pas en cours d'exécution, pas besoin d'annuler",
"errors": { "errors": {
"fetchFailed": "Échec de la récupération de l'état du pipeline\n{{error}}" "fetchFailed": "Échec de la récupération de l'état du pipeline\n{{error}}"
} }

View file

@ -70,6 +70,7 @@
"confirmButton": "确定", "confirmButton": "确定",
"deleteFileOption": "同时删除上传文件", "deleteFileOption": "同时删除上传文件",
"deleteFileTooltip": "选中此选项将同时删除服务器上对应的上传文件", "deleteFileTooltip": "选中此选项将同时删除服务器上对应的上传文件",
"deleteLLMCacheOption": "同时删除实体关系抽取 LLM 缓存",
"success": "文档删除流水线启动成功", "success": "文档删除流水线启动成功",
"failed": "删除文档失败:\n{{message}}", "failed": "删除文档失败:\n{{message}}",
"error": "删除文档失败:\n{{error}}", "error": "删除文档失败:\n{{error}}",
@ -113,13 +114,11 @@
}, },
"documentManager": { "documentManager": {
"title": "文档管理", "title": "文档管理",
"scanButton": "扫描", "scanButton": "扫描/重试",
"scanTooltip": "扫描输入目录中的文档", "scanTooltip": "扫描处理输入目录中的文档,同时重新处理所有失败的文档",
"retryFailedButton": "重试",
"retryFailedTooltip": "重新处理所有失败的文档",
"refreshTooltip": "复位文档清单", "refreshTooltip": "复位文档清单",
"pipelineStatusButton": "流水线状态", "pipelineStatusButton": "流水线",
"pipelineStatusTooltip": "查看流水线状态", "pipelineStatusTooltip": "查看文档处理流水线状态",
"uploadedTitle": "已上传文档", "uploadedTitle": "已上传文档",
"uploadedDescription": "已上传文档列表及其状态", "uploadedDescription": "已上传文档列表及其状态",
"emptyTitle": "无文档", "emptyTitle": "无文档",
@ -159,12 +158,22 @@
"title": "流水线状态", "title": "流水线状态",
"busy": "流水线忙碌", "busy": "流水线忙碌",
"requestPending": "待处理请求", "requestPending": "待处理请求",
"cancellationRequested": "取消请求",
"jobName": "作业名称", "jobName": "作业名称",
"startTime": "开始时间", "startTime": "开始时间",
"progress": "进度", "progress": "进度",
"unit": "批", "unit": "批",
"latestMessage": "最新消息", "pipelineMessages": "流水线消息",
"historyMessages": "历史消息", "cancelButton": "中断",
"cancelTooltip": "中断流水线处理",
"cancelConfirmTitle": "确认中断流水线",
"cancelConfirmDescription": "此操作将中断正在进行的流水线处理。确定要继续吗?",
"cancelConfirmButton": "确认中断",
"cancelInProgress": "取消请求进行中...",
"pipelineNotRunning": "流水线未运行",
"cancelSuccess": "流水线中断请求已发送",
"cancelFailed": "中断流水线失败\n{{error}}",
"cancelNotBusy": "流水线未运行,无需中断",
"errors": { "errors": {
"fetchFailed": "获取流水线状态失败\n{{error}}" "fetchFailed": "获取流水线状态失败\n{{error}}"
} }

View file

@ -70,6 +70,7 @@
"confirmButton": "確定", "confirmButton": "確定",
"deleteFileOption": "同時刪除上傳檔案", "deleteFileOption": "同時刪除上傳檔案",
"deleteFileTooltip": "選取此選項將同時刪除伺服器上對應的上傳檔案", "deleteFileTooltip": "選取此選項將同時刪除伺服器上對應的上傳檔案",
"deleteLLMCacheOption": "同時刪除實體關係擷取 LLM 快取",
"success": "文件刪除流水線啟動成功", "success": "文件刪除流水線啟動成功",
"failed": "刪除文件失敗:\n{{message}}", "failed": "刪除文件失敗:\n{{message}}",
"error": "刪除文件失敗:\n{{error}}", "error": "刪除文件失敗:\n{{error}}",
@ -113,13 +114,11 @@
}, },
"documentManager": { "documentManager": {
"title": "文件管理", "title": "文件管理",
"scanButton": "掃描", "scanButton": "掃描/重試",
"scanTooltip": "掃描輸入目錄中的文件", "scanTooltip": "掃描處理輸入目錄中的文件,同時重新處理所有失敗的文件",
"retryFailedButton": "重試",
"retryFailedTooltip": "重新處理所有失敗的文件",
"refreshTooltip": "重設文件清單", "refreshTooltip": "重設文件清單",
"pipelineStatusButton": "pipeline 狀態", "pipelineStatusButton": "管線狀態",
"pipelineStatusTooltip": "查看pipeline 狀態", "pipelineStatusTooltip": "查看文件處理管線狀態",
"uploadedTitle": "已上傳文件", "uploadedTitle": "已上傳文件",
"uploadedDescription": "已上傳文件清單及其狀態", "uploadedDescription": "已上傳文件清單及其狀態",
"emptyTitle": "無文件", "emptyTitle": "無文件",
@ -156,17 +155,27 @@
"hideFileNameTooltip": "隱藏檔案名稱" "hideFileNameTooltip": "隱藏檔案名稱"
}, },
"pipelineStatus": { "pipelineStatus": {
"title": "pipeline 狀態", "title": "流水線狀態",
"busy": "pipeline 忙碌中", "busy": "流水線忙碌",
"requestPending": "待處理請求", "requestPending": "待處理請求",
"jobName": "工作名稱", "cancellationRequested": "取消請求",
"jobName": "作業名稱",
"startTime": "開始時間", "startTime": "開始時間",
"progress": "進度", "progress": "進度",
"unit": "梯次", "unit": "批",
"latestMessage": "最新訊息", "pipelineMessages": "流水線消息",
"historyMessages": "歷史訊息", "cancelButton": "中斷",
"cancelTooltip": "中斷流水線處理",
"cancelConfirmTitle": "確認中斷流水線",
"cancelConfirmDescription": "此操作將中斷正在進行的流水線處理。確定要繼續嗎?",
"cancelConfirmButton": "確認中斷",
"cancelInProgress": "取消請求進行中...",
"pipelineNotRunning": "流水線未運行",
"cancelSuccess": "流水線中斷請求已發送",
"cancelFailed": "中斷流水線失敗\n{{error}}",
"cancelNotBusy": "流水線未運行,無需中斷",
"errors": { "errors": {
"fetchFailed": "取得pipeline 狀態失敗\n{{error}}" "fetchFailed": "獲取流水線狀態失敗\n{{error}}"
} }
} }
}, },