summaryrefslogtreecommitdiff
path: root/lib/pq/table/add-pq-dialog.tsx
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-08-04 09:39:21 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-08-04 09:39:21 +0000
commit53ad72732f781e6c6d5ddb3776ea47aec010af8e (patch)
treee676287827f8634be767a674b8ad08b6ed7eb3e6 /lib/pq/table/add-pq-dialog.tsx
parent3e4d15271322397764601dee09441af8a5b3adf5 (diff)
(최겸) PQ/실사 수정 및 개발
Diffstat (limited to 'lib/pq/table/add-pq-dialog.tsx')
-rw-r--r--lib/pq/table/add-pq-dialog.tsx454
1 files changed, 0 insertions, 454 deletions
diff --git a/lib/pq/table/add-pq-dialog.tsx b/lib/pq/table/add-pq-dialog.tsx
deleted file mode 100644
index 2fac9e43..00000000
--- a/lib/pq/table/add-pq-dialog.tsx
+++ /dev/null
@@ -1,454 +0,0 @@
-"use client"
-
-import * as React from "react"
-import { useForm } from "react-hook-form"
-import { zodResolver } from "@hookform/resolvers/zod"
-import { z } from "zod"
-import { Plus } from "lucide-react"
-import { useRouter } from "next/navigation"
-
-import { Dialog, DialogTrigger, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter } from "@/components/ui/dialog"
-import { Button } from "@/components/ui/button"
-import { Input } from "@/components/ui/input"
-import { Textarea } from "@/components/ui/textarea"
-import {
- Form,
- FormControl,
- FormDescription,
- FormField,
- FormItem,
- FormLabel,
- FormMessage,
-} from "@/components/ui/form"
-import {
- Select,
- SelectContent,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from "@/components/ui/select"
-import { Checkbox } from "@/components/ui/checkbox"
-import { useToast } from "@/hooks/use-toast"
-import { createPq, invalidatePqCache } from "../service"
-import { ProjectSelector } from "@/components/ProjectSelector"
-import { type Project } from "@/lib/rfqs/service"
-import { ScrollArea } from "@/components/ui/scroll-area"
-
-// PQ 생성을 위한 Zod 스키마 정의
-const createPqSchema = z.object({
- code: z.string().min(1, "Code is required"),
- checkPoint: z.string().min(1, "Check point is required"),
- groupName: z.string().min(1, "Group is required"),
- description: z.string().optional(),
- remarks: z.string().optional(),
- // 프로젝트별 PQ 여부 체크박스
- isProjectSpecific: z.boolean().default(false),
- // 프로젝트 관련 추가 필드는 isProjectSpecific가 true일 때만 필수
- contractInfo: z.string().optional(),
- additionalRequirement: z.string().optional(),
-});
-
-type CreatePqFormType = z.infer<typeof createPqSchema>;
-
-// 그룹 이름 옵션
-export const groupOptions = [
- "GENERAL",
- "Quality Management System",
- "Workshop & Environment",
- "Warranty",
-];
-
-// 설명 예시 텍스트
-const descriptionExample = `Address :
-Tel. / Fax :
-e-mail :`;
-
-interface AddPqDialogProps {
- currentProjectId?: number | null; // 현재 선택된 프로젝트 ID (옵션)
-}
-
-export function AddPqDialog({ currentProjectId }: AddPqDialogProps) {
- const [open, setOpen] = React.useState(false)
- const [isSubmitting, setIsSubmitting] = React.useState(false)
- const [selectedProject, setSelectedProject] = React.useState<Project | null>(null)
- const router = useRouter()
- const { toast } = useToast()
-
- // react-hook-form 설정
- const form = useForm<CreatePqFormType>({
- resolver: zodResolver(createPqSchema),
- defaultValues: {
- code: "",
- checkPoint: "",
- groupName: groupOptions[0],
- description: "",
- remarks: "",
- isProjectSpecific: !!currentProjectId, // 현재 프로젝트 ID가 있으면 기본값 true
- contractInfo: "",
- additionalRequirement: "",
- },
- })
-
- // 프로젝트별 PQ 여부 상태 감시
- const isProjectSpecific = form.watch("isProjectSpecific")
-
- // 현재 프로젝트 ID가 있으면 선택된 프로젝트 설정
- React.useEffect(() => {
- if (currentProjectId) {
- form.setValue("isProjectSpecific", true)
- }
- }, [currentProjectId, form])
-
- // 예시 텍스트를 description 필드에 채우는 함수
- const fillExampleText = () => {
- form.setValue("description", descriptionExample);
- };
-
- async function onSubmit(data: CreatePqFormType) {
- try {
- setIsSubmitting(true)
-
- // 서버 액션 호출용 데이터 준비
- const submitData = {
- ...data,
- projectId: data.isProjectSpecific ? selectedProject?.id || currentProjectId : null,
- }
-
- // 프로젝트별 PQ인데 프로젝트가 선택되지 않은 경우 검증
- if (data.isProjectSpecific && !submitData.projectId) {
- toast({
- title: "Error",
- description: "Please select a project",
- variant: "destructive",
- })
- setIsSubmitting(false)
- return
- }
-
- // 서버 액션 호출
- const result = await createPq(submitData)
-
- if (!result.success) {
- toast({
- title: "Error",
- description: result.message || "Failed to create PQ criteria",
- variant: "destructive",
- })
- return
- }
-
- await invalidatePqCache();
-
- // 성공 시 처리
- toast({
- title: "Success",
- description: result.message || "PQ criteria created successfully",
- })
-
- // 모달 닫고 폼 리셋
- form.reset()
- setSelectedProject(null)
- setOpen(false)
-
- // 페이지 새로고침
- router.refresh()
-
- } catch (error) {
- console.error('Error creating PQ criteria:', error)
- toast({
- title: "Error",
- description: "An unexpected error occurred",
- variant: "destructive",
- })
- } finally {
- setIsSubmitting(false)
- }
- }
-
- function handleDialogOpenChange(nextOpen: boolean) {
- if (!nextOpen) {
- form.reset()
- setSelectedProject(null)
- }
- setOpen(nextOpen)
- }
-
- // 프로젝트 선택 핸들러
- const handleProjectSelect = (project: Project | null) => {
- // project가 null인 경우 선택 해제를 의미
- if (project === null) {
- setSelectedProject(null);
- // 필요한 경우 추가 처리
- return;
- }
-
- // 기존 처리 - 프로젝트가 선택된 경우
- setSelectedProject(project);
- }
-
- return (
- <Dialog open={open} onOpenChange={handleDialogOpenChange}>
- {/* 모달을 열기 위한 버튼 */}
- <DialogTrigger asChild>
- <Button variant="default" size="sm">
- <Plus className="size-4" />
- Add PQ
- </Button>
- </DialogTrigger>
-
- <DialogContent className="sm:max-w-[600px]">
- <DialogHeader>
- <DialogTitle>Create New PQ Criteria</DialogTitle>
- <DialogDescription>
- 새 PQ 기준 정보를 입력하고 <b>Create</b> 버튼을 누르세요.
- </DialogDescription>
- </DialogHeader>
-
- {/* shadcn/ui Form을 이용해 react-hook-form과 연결 */}
- <Form {...form}>
- <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4 py-2 flex flex-col">
- {/* 프로젝트별 PQ 여부 체크박스 */}
-
- <div className="flex-1 overflow-auto px-4 space-y-4">
- <FormField
- control={form.control}
- name="isProjectSpecific"
- render={({ field }) => (
- <FormItem className="flex flex-row items-start space-x-3 space-y-0 rounded-md border p-4">
- <FormControl>
- <Checkbox
- checked={field.value}
- onCheckedChange={field.onChange}
- />
- </FormControl>
- <div className="space-y-1 leading-none">
- <FormLabel>프로젝트별 PQ 생성</FormLabel>
- <FormDescription>
- 특정 프로젝트에만 적용되는 PQ 항목을 생성합니다
- </FormDescription>
- </div>
- </FormItem>
- )}
- />
-
- {/* 프로젝트 선택 필드 (프로젝트별 PQ 선택 시에만 표시) */}
- {isProjectSpecific && (
- <div className="space-y-2">
- <FormLabel>Project <span className="text-destructive">*</span></FormLabel>
- <ProjectSelector
- selectedProjectId={currentProjectId || selectedProject?.id}
- onProjectSelect={handleProjectSelect}
- placeholder="프로젝트를 선택하세요"
- />
- <FormDescription>
- PQ 항목을 적용할 프로젝트를 선택하세요
- </FormDescription>
- </div>
- )}
-
- <div className="flex-1 overflow-auto px-2 py-2 space-y-4" style={{maxHeight:420}}>
-
-
- {/* Code 필드 */}
- <FormField
- control={form.control}
- name="code"
- render={({ field }) => (
- <FormItem>
- <FormLabel>Code <span className="text-destructive">*</span></FormLabel>
- <FormControl>
- <Input
- placeholder="예: 1-1, A.2.3"
- {...field}
- />
- </FormControl>
- <FormDescription>
- PQ 항목의 고유 코드를 입력하세요 (예: "1-1", "A.2.3")
- </FormDescription>
- <FormMessage />
- </FormItem>
- )}
- />
-
- {/* Check Point 필드 */}
- <FormField
- control={form.control}
- name="checkPoint"
- render={({ field }) => (
- <FormItem>
- <FormLabel>Check Point <span className="text-destructive">*</span></FormLabel>
- <FormControl>
- <Input
- placeholder="검증 항목을 입력하세요"
- {...field}
- />
- </FormControl>
- <FormMessage />
- </FormItem>
- )}
- />
-
- {/* Group Name 필드 (Select) */}
- <FormField
- control={form.control}
- name="groupName"
- render={({ field }) => (
- <FormItem>
- <FormLabel>Group <span className="text-destructive">*</span></FormLabel>
- <Select
- onValueChange={field.onChange}
- defaultValue={field.value}
- value={field.value}
- >
- <FormControl>
- <SelectTrigger>
- <SelectValue placeholder="그룹을 선택하세요" />
- </SelectTrigger>
- </FormControl>
- <SelectContent>
- {groupOptions.map((group) => (
- <SelectItem key={group} value={group}>
- {group}
- </SelectItem>
- ))}
- </SelectContent>
- </Select>
- <FormDescription>
- PQ 항목의 분류 그룹을 선택하세요
- </FormDescription>
- <FormMessage />
- </FormItem>
- )}
- />
-
- {/* Description 필드 - 예시 템플릿 버튼 추가 */}
- <FormField
- control={form.control}
- name="description"
- render={({ field }) => (
- <FormItem>
- <div className="flex items-center justify-between">
- <FormLabel>Description</FormLabel>
- <Button
- type="button"
- variant="outline"
- size="sm"
- onClick={fillExampleText}
- >
- 예시 채우기
- </Button>
- </div>
- <FormControl>
- <Textarea
- placeholder={`줄바꿈을 포함한 상세 설명을 입력하세요\n예:\n${descriptionExample}`}
- className="min-h-[120px] font-mono"
- {...field}
- value={field.value || ""}
- />
- </FormControl>
- <FormDescription>
- 줄바꿈이 필요한 경우 Enter 키를 누르세요. 입력한 대로 저장됩니다.
- </FormDescription>
- <FormMessage />
- </FormItem>
- )}
- />
-
- {/* Remarks 필드 */}
- <FormField
- control={form.control}
- name="remarks"
- render={({ field }) => (
- <FormItem>
- <FormLabel>Remarks</FormLabel>
- <FormControl>
- <Textarea
- placeholder="비고 사항을 입력하세요"
- className="min-h-[80px]"
- {...field}
- value={field.value || ""}
- />
- </FormControl>
- <FormMessage />
- </FormItem>
- )}
- />
-
- {/* 프로젝트별 PQ일 경우 추가 필드 */}
- {isProjectSpecific && (
- <>
- {/* 계약 정보 필드 */}
- <FormField
- control={form.control}
- name="contractInfo"
- render={({ field }) => (
- <FormItem>
- <FormLabel>Contract Info</FormLabel>
- <FormControl>
- <Textarea
- placeholder="계약 관련 정보를 입력하세요"
- className="min-h-[80px]"
- {...field}
- value={field.value || ""}
- />
- </FormControl>
- <FormDescription>
- 해당 프로젝트의 계약 관련 특이사항
- </FormDescription>
- <FormMessage />
- </FormItem>
- )}
- />
-
- {/* 추가 요구사항 필드 */}
- <FormField
- control={form.control}
- name="additionalRequirement"
- render={({ field }) => (
- <FormItem>
- <FormLabel>Additional Requirements</FormLabel>
- <FormControl>
- <Textarea
- placeholder="추가 요구사항을 입력하세요"
- className="min-h-[80px]"
- {...field}
- value={field.value || ""}
- />
- </FormControl>
- <FormDescription>
- 프로젝트별 추가 요구사항
- </FormDescription>
- <FormMessage />
- </FormItem>
- )}
- />
- </>
- )}
- </div>
-
- </div>
- <DialogFooter>
- <Button
- type="button"
- variant="outline"
- onClick={() => {
- form.reset();
- setSelectedProject(null);
- setOpen(false);
- }}
- >
- Cancel
- </Button>
- <Button
- type="submit"
- disabled={isSubmitting}
- >
- {isSubmitting ? "Creating..." : "Create"}
- </Button>
- </DialogFooter>
- </form>
- </Form>
- </DialogContent>
- </Dialog>
- )
-} \ No newline at end of file