summaryrefslogtreecommitdiff
path: root/lib/material/vendor-material
diff options
context:
space:
mode:
Diffstat (limited to 'lib/material/vendor-material')
-rw-r--r--lib/material/vendor-material/add-confirmed-material.tsx123
1 files changed, 21 insertions, 102 deletions
diff --git a/lib/material/vendor-material/add-confirmed-material.tsx b/lib/material/vendor-material/add-confirmed-material.tsx
index 5e9415f4..78940c00 100644
--- a/lib/material/vendor-material/add-confirmed-material.tsx
+++ b/lib/material/vendor-material/add-confirmed-material.tsx
@@ -3,20 +3,8 @@
import * as React from "react";
import { useState } from "react";
import { useSession } from "next-auth/react";
-import { Button } from "@/components/ui/button";
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogFooter,
- DialogHeader,
- DialogTitle,
- DialogTrigger,
-} from "@/components/ui/dialog";
-import { Label } from "@/components/ui/label";
import { toast } from "sonner";
-import { Plus, Loader2 } from "lucide-react";
-import { MaterialGroupSelector } from "@/components/common/material/material-group-selector";
+import { MaterialGroupSelectorDialogMulti } from "@/components/common/material/material-group-selector-dialog-multi";
import { MaterialSearchItem } from "@/lib/material/material-group-service";
import { addConfirmedMaterial, VendorPossibleMaterial } from "../vendor-possible-material-service";
@@ -32,43 +20,22 @@ export function AddConfirmedMaterial({
onMaterialAdded,
}: AddConfirmedMaterialProps) {
const { data: session } = useSession();
- const [open, setOpen] = useState(false);
const [isLoading, setIsLoading] = useState(false);
const [selectedMaterials, setSelectedMaterials] = useState<MaterialSearchItem[]>([]);
// 이미 등록된 자재그룹코드들의 Set
const existingMaterialCodes = new Set(
- existingConfirmedMaterials.map(material => material.itemCode).filter(Boolean)
+ existingConfirmedMaterials.map(material => material.itemCode).filter((code): code is string => Boolean(code))
);
- // 자재 선택 시 중복 체크
- const handleMaterialsChange = (materials: MaterialSearchItem[]) => {
- // 이미 등록된 자재가 있는지 확인
- const duplicatedMaterials = materials.filter(material =>
- existingMaterialCodes.has(material.materialGroupCode)
- );
-
- if (duplicatedMaterials.length > 0) {
- const duplicatedCodes = duplicatedMaterials.map(m => m.materialGroupCode).join(', ');
- toast.error(`이미 등록된 자재그룹코드입니다: ${duplicatedCodes}`);
-
- // 중복되지 않은 자재만 선택
- const validMaterials = materials.filter(material =>
- !existingMaterialCodes.has(material.materialGroupCode)
- );
- setSelectedMaterials(validMaterials);
- } else {
- setSelectedMaterials(materials);
- }
- };
-
- const handleSubmit = async () => {
+ // 자재 선택 완료 시 처리
+ const handleMaterialsSelect = async (materials: MaterialSearchItem[]) => {
if (!session?.user) {
toast.error("로그인이 필요합니다.");
return;
}
- if (selectedMaterials.length === 0) {
+ if (materials.length === 0) {
toast.error("추가할 자재를 선택해주세요.");
return;
}
@@ -77,10 +44,10 @@ export function AddConfirmedMaterial({
try {
// 선택된 자재들을 각각 추가
- for (const material of selectedMaterials) {
+ for (const material of materials) {
const materialData = {
itemCode: material.materialGroupCode,
- itemName: material.materialName,
+ itemName: material.materialGroupDescription,
};
await addConfirmedMaterial(
@@ -91,11 +58,10 @@ export function AddConfirmedMaterial({
);
}
- toast.success(`${selectedMaterials.length}개의 자재가 확정정보에 추가되었습니다.`);
+ toast.success(`${materials.length}개의 자재가 확정정보에 추가되었습니다.`);
// 폼 리셋
setSelectedMaterials([]);
- setOpen(false);
// 부모 컴포넌트에 추가 완료 알림
onMaterialAdded?.();
@@ -119,65 +85,18 @@ export function AddConfirmedMaterial({
};
return (
- <Dialog open={open} onOpenChange={setOpen}>
- <DialogTrigger asChild>
- <Button size="sm" className="gap-2">
- <Plus className="h-4 w-4" />
- 추가 등록
- </Button>
- </DialogTrigger>
- <DialogContent className="max-w-2xl max-h-[90vh] overflow-y-auto">
- <DialogHeader>
- <DialogTitle>확정정보 자재 추가</DialogTitle>
- <DialogDescription>
- 구매담당자 권한으로 확정 공급품목을 추가합니다. 상세 정보는 I/F를 통해 업데이트됩니다.
- </DialogDescription>
- </DialogHeader>
-
- <div className="space-y-4">
- {/* 자재 선택 */}
- <div className="space-y-2">
- <Label>자재 선택 *</Label>
- <MaterialGroupSelector
- selectedMaterials={selectedMaterials}
- onMaterialsChange={handleMaterialsChange}
- singleSelect={false}
- placeholder="자재그룹코드 또는 자재명으로 검색..."
- noValuePlaceHolder="자재를 선택해주세요"
- maxSelections={10}
- closeOnSelect={false}
- excludeMaterialCodes={existingMaterialCodes}
- />
- {existingMaterialCodes.size > 0 && (
- <p className="text-xs text-muted-foreground">
- 💡 이미 등록된 자재그룹코드는 자동으로 제외됩니다.
- </p>
- )}
- <p className="text-sm text-muted-foreground">
- 최대 10개까지 선택 가능합니다. 등록자는 현재 로그인한 사용자로 자동 설정됩니다.
- </p>
- </div>
- </div>
-
- <DialogFooter>
- <Button
- type="button"
- variant="outline"
- onClick={() => setOpen(false)}
- disabled={isLoading}
- >
- 취소
- </Button>
- <Button
- type="button"
- onClick={handleSubmit}
- disabled={isLoading || selectedMaterials.length === 0}
- >
- {isLoading && <Loader2 className="mr-2 h-4 w-4 animate-spin" />}
- {isLoading ? "추가 중..." : "추가"}
- </Button>
- </DialogFooter>
- </DialogContent>
- </Dialog>
+ <MaterialGroupSelectorDialogMulti
+ triggerLabel={isLoading ? "추가 중..." : "➕ 추가 등록"}
+ selectedMaterials={selectedMaterials}
+ onMaterialsSelect={handleMaterialsSelect}
+ placeholder="자재그룹코드 또는 자재명으로 검색..."
+ title="확정정보 자재 추가"
+ description="구매담당자 권한으로 확정 공급품목을 추가합니다. 상세 정보는 I/F를 통해 업데이트됩니다."
+ disabled={isLoading}
+ triggerVariant="default"
+ excludeMaterialCodes={existingMaterialCodes}
+ showInitialData={true}
+ showSelectedInTrigger={false}
+ />
);
}