diff options
Diffstat (limited to 'lib/incoterms/table/incoterms-edit-sheet.tsx')
| -rw-r--r-- | lib/incoterms/table/incoterms-edit-sheet.tsx | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/lib/incoterms/table/incoterms-edit-sheet.tsx b/lib/incoterms/table/incoterms-edit-sheet.tsx new file mode 100644 index 00000000..9cd067c7 --- /dev/null +++ b/lib/incoterms/table/incoterms-edit-sheet.tsx @@ -0,0 +1,146 @@ +"use client" + +import * as React from "react" +import { zodResolver } from "@hookform/resolvers/zod" +import { useForm } from "react-hook-form" +import { toast } from "sonner" +import * as z from "zod" +import { Button } from "@/components/ui/button" +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form" +import { + Sheet, + SheetContent, + SheetDescription, + SheetHeader, + SheetTitle, +} from "@/components/ui/sheet" +import { Input } from "@/components/ui/input" +import { Switch } from "@/components/ui/switch" +import { updateIncoterm } from "../service" +import { incoterms } from "@/db/schema/procurementRFQ" + +const updateIncotermSchema = z.object({ + code: z.string().min(1, "코드는 필수입니다."), + description: z.string().min(1, "설명은 필수입니다."), + isActive: z.boolean().default(true), +}) + +type UpdateIncotermSchema = z.infer<typeof updateIncotermSchema> + +interface IncotermsEditSheetProps { + open: boolean + onOpenChange: (open: boolean) => void + data: typeof incoterms.$inferSelect + onSuccess: () => void +} + +export function IncotermsEditSheet({ + open, + onOpenChange, + data, + onSuccess, +}: IncotermsEditSheetProps) { + const form = useForm<UpdateIncotermSchema>({ + resolver: zodResolver(updateIncotermSchema), + defaultValues: { + code: data.code, + description: data.description, + isActive: data.isActive, + }, + mode: "onChange" + }) + + React.useEffect(() => { + if (data) { + form.reset({ + code: data.code, + description: data.description, + isActive: data.isActive, + }) + } + }, [data, form]) + + async function onSubmit(input: UpdateIncotermSchema) { + try { + await updateIncoterm(data.code, input) + toast.success("수정이 완료되었습니다.") + onSuccess() + onOpenChange(false) + } catch { + toast.error("수정 중 오류가 발생했습니다.") + } + } + + return ( + <Sheet open={open} onOpenChange={onOpenChange}> + <SheetContent className="flex flex-col gap-6 sm:max-w-md"> + <SheetHeader className="text-left"> + <SheetTitle>인코텀즈 수정</SheetTitle> + <SheetDescription> + 인코텀즈 정보를 수정하고 변경사항을 저장하세요 + </SheetDescription> + </SheetHeader> + <Form {...form}> + <form onSubmit={form.handleSubmit(onSubmit)} className="flex flex-col gap-4"> + <FormField + control={form.control} + name="code" + render={({ field }) => ( + <FormItem> + <FormLabel>코드</FormLabel> + <FormControl> + <Input {...field} disabled /> + </FormControl> + <FormMessage /> + </FormItem> + )} + /> + <FormField + control={form.control} + name="description" + render={({ field }) => ( + <FormItem> + <FormLabel>설명</FormLabel> + <FormControl> + <Input {...field} /> + </FormControl> + <FormMessage /> + </FormItem> + )} + /> + <FormField + control={form.control} + name="isActive" + render={({ field }) => ( + <FormItem className="flex flex-row items-center justify-between rounded-lg border p-4"> + <div className="space-y-0.5"> + <FormLabel>활성화</FormLabel> + </div> + <FormControl> + <Switch + checked={field.value} + onCheckedChange={field.onChange} + /> + </FormControl> + </FormItem> + )} + /> + <div className="flex justify-end space-x-2"> + <Button type="button" variant="outline" onClick={() => onOpenChange(false)}> + 취소 + </Button> + <Button type="submit">저장</Button> + </div> + </form> + </Form> + </SheetContent> + </Sheet> + ) +}
\ No newline at end of file |
