diff options
Diffstat (limited to 'lib/payment-terms/table/payment-terms-edit-sheet.tsx')
| -rw-r--r-- | lib/payment-terms/table/payment-terms-edit-sheet.tsx | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/lib/payment-terms/table/payment-terms-edit-sheet.tsx b/lib/payment-terms/table/payment-terms-edit-sheet.tsx new file mode 100644 index 00000000..b0d105bc --- /dev/null +++ b/lib/payment-terms/table/payment-terms-edit-sheet.tsx @@ -0,0 +1,147 @@ +"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 { updatePaymentTerm } from "../service" +import { paymentTerms } from "@/db/schema/procurementRFQ" + +const updatePaymentTermSchema = z.object({ + code: z.string().min(1, "코드는 필수입니다."), + description: z.string().min(1, "설명은 필수입니다."), + isActive: z.boolean().default(true), +}) + +type UpdatePaymentTermSchema = z.infer<typeof updatePaymentTermSchema> + +interface PaymentTermsEditSheetProps { + open: boolean + onOpenChange: (open: boolean) => void + data: typeof paymentTerms.$inferSelect + onSuccess: () => void +} + +export function PaymentTermsEditSheet({ + open, + onOpenChange, + data, + onSuccess, +}: PaymentTermsEditSheetProps) { + const form = useForm<UpdatePaymentTermSchema>({ + resolver: zodResolver(updatePaymentTermSchema), + 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: UpdatePaymentTermSchema) { + try { + await updatePaymentTerm(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 |
