fix: 1. 优化collabora的高亮效果,不固定主要页面。
2. 优化评查结果中的下载按钮,如果加载docx文件的话需要先保存再下载。 3. 交叉评查结果中添加返回按钮,并实现打开对应的任务的文档列表。 4. 文档类型的添加,添加绑定合同管理为入口的时候文档类型名称必须是要附带‘合同’字符。
This commit is contained in:
+64
-2
@@ -26,8 +26,9 @@
|
||||
*/
|
||||
|
||||
import { type MetaFunction, type LoaderFunctionArgs, type ActionFunctionArgs } from "@remix-run/node";
|
||||
import { useState, useEffect } from "react";
|
||||
import { useState, useEffect, useRef, useCallback } from "react";
|
||||
import { useNavigate, useLoaderData, useFetcher } from "@remix-run/react";
|
||||
import type { FilePreviewHandle } from "~/components/reviews/FilePreview";
|
||||
import reviewsStyles from "~/styles/reviews.css?url";
|
||||
import { getReviewPoints, getReviewPoints_fromApi, updateReviewResult, confirmReviewResults } from "~/api/evaluation_points/reviews";
|
||||
import { toastService } from "~/components/ui/Toast";
|
||||
@@ -321,6 +322,64 @@ export default function ReviewDetails() {
|
||||
pageNumber: number;
|
||||
} | undefined>(undefined);
|
||||
|
||||
// FilePreview 组件的 ref,用于在下载前保存文档
|
||||
const filePreviewRef = useRef<FilePreviewHandle>(null);
|
||||
|
||||
// CollaboraViewer 组件的 key,用于强制重新加载触发保存
|
||||
const [collaboraKey, setCollaboraKey] = useState<number>(0);
|
||||
|
||||
// 保存文档的回调函数,传递给 ReviewTabs
|
||||
// 通过改变 key 强制重新加载 CollaboraViewer 组件,触发组件卸载时的保存逻辑
|
||||
const handleSaveBeforeDownload = useCallback(async (): Promise<boolean> => {
|
||||
// 检查文件类型是否为 DOCX(需要 Collabora 保存)
|
||||
const fileExtension = document?.path?.split('.').pop()?.toLowerCase();
|
||||
if (fileExtension !== 'docx') {
|
||||
// 非 DOCX 文件不需要保存
|
||||
return true;
|
||||
}
|
||||
|
||||
const collaboraRef = filePreviewRef.current?.collaboraViewerRef?.current;
|
||||
if (!collaboraRef?.isReady) {
|
||||
console.log('[Reviews] Collabora 未就绪,跳过保存');
|
||||
return true;
|
||||
}
|
||||
|
||||
try {
|
||||
console.log('[Reviews] 通过重新加载 CollaboraViewer 保存文档...');
|
||||
|
||||
// 改变 key 触发组件卸载(会执行保存)和重新挂载
|
||||
setCollaboraKey(prev => prev + 1);
|
||||
|
||||
// 等待组件重新加载完成
|
||||
// 先等待组件卸载和重新挂载
|
||||
await new Promise(resolve => setTimeout(resolve, 500));
|
||||
|
||||
// 轮询检查组件是否重新加载完成
|
||||
const maxWaitTime = 30000; // 最大等待30秒
|
||||
const checkInterval = 500; // 每500ms检查一次
|
||||
let waitedTime = 0;
|
||||
|
||||
while (waitedTime < maxWaitTime) {
|
||||
const newCollaboraRef = filePreviewRef.current?.collaboraViewerRef?.current;
|
||||
if (newCollaboraRef?.isReady) {
|
||||
console.log('[Reviews] CollaboraViewer 重新加载完成');
|
||||
// 额外等待一小段时间确保文档完全就绪
|
||||
await new Promise(resolve => setTimeout(resolve, 500));
|
||||
return true;
|
||||
}
|
||||
await new Promise(resolve => setTimeout(resolve, checkInterval));
|
||||
waitedTime += checkInterval;
|
||||
}
|
||||
|
||||
console.warn('[Reviews] 等待 CollaboraViewer 重新加载超时');
|
||||
return true; // 超时也允许下载
|
||||
} catch (error) {
|
||||
console.error('[Reviews] 保存文档失败:', error);
|
||||
toastService.error('保存文档失败,请重试');
|
||||
return false;
|
||||
}
|
||||
}, [document?.path]);
|
||||
|
||||
// 🐛 调试:打印 loader 返回的完整数据到浏览器控制台
|
||||
// useEffect(() => {
|
||||
// if (typeof window !== 'undefined') {
|
||||
@@ -450,7 +509,7 @@ export default function ReviewDetails() {
|
||||
// 短暂延迟后清除参数,以便下次可以重新触发
|
||||
setTimeout(() => {
|
||||
setAiSuggestionReplace(undefined);
|
||||
}, 1000);
|
||||
}, 500);
|
||||
};
|
||||
|
||||
// 刷新评审数据
|
||||
@@ -777,6 +836,7 @@ export default function ReviewDetails() {
|
||||
}}
|
||||
onConfirmResults={handleConfirmResults}
|
||||
jwtToken={frontendJWT}
|
||||
onSaveBeforeDownload={handleSaveBeforeDownload}
|
||||
>
|
||||
{/* 评查结果选项卡内容 */}
|
||||
{activeTab === 'preview' && (
|
||||
@@ -794,6 +854,8 @@ export default function ReviewDetails() {
|
||||
// });
|
||||
return (
|
||||
<FilePreview
|
||||
key={`file-preview-${collaboraKey}`}
|
||||
ref={filePreviewRef}
|
||||
fileContent={document}
|
||||
reviewPoints={reviewData.reviewPoints}
|
||||
activeReviewPointResultId={activeReviewPointResultId}
|
||||
|
||||
Reference in New Issue
Block a user