diff --git a/furniture-3d-system/src/app/intake/non-integrated/NonIntegratedDetailClient.tsx b/furniture-3d-system/src/app/intake/non-integrated/NonIntegratedDetailClient.tsx
index 2a5c7424..9a9d4946 100644
--- a/furniture-3d-system/src/app/intake/non-integrated/NonIntegratedDetailClient.tsx
+++ b/furniture-3d-system/src/app/intake/non-integrated/NonIntegratedDetailClient.tsx
@@ -18,7 +18,7 @@ import {
useRef,
useState,
} from "react";
-import { ArrowLeft, Ban, ChevronDown, Plus, X } from "lucide-react";
+import { ArrowLeft, Ban, ChevronDown, Plus } from "lucide-react";
import CameraScannerModal from "@/components/mobile/CameraScannerModal";
import { ModelPreviewPanel } from "@/components/platform/ModelPreviewPanel";
import Button from "@/components/ui/Button";
@@ -57,6 +57,7 @@ import { ProductDataWorkspace } from "./ProductDataWorkspace";
import { QualityInspectionWorkspace } from "./QualityInspectionWorkspace";
import { QualityStandardWorkspace } from "./QualityStandardWorkspace";
import { ReviewIssueImageCell } from "./ReviewIssueImageCell";
+import { ReviewIssueImageManagerDialog } from "./ReviewIssueImageManagerDialog";
import { SampleMeasurementWorkspace } from "./SampleMeasurementWorkspace";
import {
BomBoardMaterialField,
@@ -19145,142 +19146,25 @@ export default function NonIntegratedDetailClient({
{reviewImageManager && managedReviewIssue ? (
-
-
- void handleReviewIssueImagePaste(
- managedReviewIssue.id,
- reviewImageManager.target,
- event,
- )
- }
- className="flex max-h-[86vh] w-full max-w-[720px] flex-col rounded-apple-xl border border-apple-separator bg-apple-bg-primary shadow-apple-lg outline-none focus-visible:ring-2 focus-visible:ring-apple-blue/35"
- >
-
-
-
- 管理{managedReviewImageLabel}
-
-
- 共 {managedReviewImages.length} 张,标记为导出主图的图片会优先显示
-
-
-
-
-
- {managedReviewImages.length > 0 ? (
-
- {managedReviewImages.map((image) => (
-
-
-
-
- {image.fileName || managedReviewImageLabel}
-
- {image.isPrimary ? (
-
- 导出主图
-
- ) : null}
-
- {canEditReviewSheet ? (
-
-
-
-
- ) : null}
-
- ))}
-
- ) : (
-
- 暂无图片
-
- )}
-
- {canEditReviewSheet ? (
-
-
-
- ) : null}
-
-
+ setReviewImageManager(null)}
+ onPaste={handleReviewIssueImagePaste}
+ onPreviewImage={(src, alt) =>
+ setWorkspaceImagePreview({
+ kind: "standalone",
+ src,
+ alt,
+ })
+ }
+ onSetPrimaryImage={handleSetReviewIssuePrimaryImage}
+ onDeleteImage={handleDeleteReviewIssueImage}
+ onImageChange={handleReviewIssueImageChange}
+ />
) : null}
>
);
diff --git a/furniture-3d-system/src/app/intake/non-integrated/ReviewIssueImageManagerDialog.tsx b/furniture-3d-system/src/app/intake/non-integrated/ReviewIssueImageManagerDialog.tsx
new file mode 100644
index 00000000..de225758
--- /dev/null
+++ b/furniture-3d-system/src/app/intake/non-integrated/ReviewIssueImageManagerDialog.tsx
@@ -0,0 +1,159 @@
+"use client";
+
+import type { ChangeEvent, ClipboardEvent } from "react";
+import { X } from "lucide-react";
+import type {
+ NonIntegratedReviewImage,
+ NonIntegratedReviewIssue,
+} from "./nonIntegratedStorage";
+
+type ReviewIssueImageTarget = "issue" | "reference";
+
+type ReviewIssueImageManagerDialogProps = {
+ issue: NonIntegratedReviewIssue;
+ target: ReviewIssueImageTarget;
+ label: string;
+ images: NonIntegratedReviewImage[];
+ canEdit: boolean;
+ onClose: () => void;
+ onPaste: (
+ issueId: string,
+ target: ReviewIssueImageTarget,
+ event: ClipboardEvent,
+ ) => void | Promise;
+ onPreviewImage: (src: string, alt: string) => void;
+ onSetPrimaryImage: (
+ issueId: string,
+ target: ReviewIssueImageTarget,
+ imageId: string,
+ ) => void;
+ onDeleteImage: (
+ issueId: string,
+ target: ReviewIssueImageTarget,
+ imageId: string,
+ ) => void;
+ onImageChange: (
+ issueId: string,
+ target: ReviewIssueImageTarget,
+ event: ChangeEvent,
+ ) => void | Promise;
+};
+
+export function ReviewIssueImageManagerDialog({
+ issue,
+ target,
+ label,
+ images,
+ canEdit,
+ onClose,
+ onPaste,
+ onPreviewImage,
+ onSetPrimaryImage,
+ onDeleteImage,
+ onImageChange,
+}: ReviewIssueImageManagerDialogProps) {
+ return (
+
+
void onPaste(issue.id, target, event)}
+ className="flex max-h-[86vh] w-full max-w-[720px] flex-col rounded-apple-xl border border-apple-separator bg-apple-bg-primary shadow-apple-lg outline-none focus-visible:ring-2 focus-visible:ring-apple-blue/35"
+ >
+
+
+
+ 管理{label}
+
+
+ 共 {images.length} 张,标记为导出主图的图片会优先显示
+
+
+
+
+
+ {images.length > 0 ? (
+
+ {images.map((image) => (
+
+
+
+
+ {image.fileName || label}
+
+ {image.isPrimary ? (
+
+ 导出主图
+
+ ) : null}
+
+ {canEdit ? (
+
+
+
+
+ ) : null}
+
+ ))}
+
+ ) : (
+
+ 暂无图片
+
+ )}
+
+ {canEdit ? (
+
+
+
+ ) : null}
+
+
+ );
+}