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} +
+
+ ); +}