summaryrefslogtreecommitdiff
path: root/lib/payment-terms/table/payment-terms-edit-sheet.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'lib/payment-terms/table/payment-terms-edit-sheet.tsx')
-rw-r--r--lib/payment-terms/table/payment-terms-edit-sheet.tsx59
1 files changed, 41 insertions, 18 deletions
diff --git a/lib/payment-terms/table/payment-terms-edit-sheet.tsx b/lib/payment-terms/table/payment-terms-edit-sheet.tsx
index b0d105bc..48d79c21 100644
--- a/lib/payment-terms/table/payment-terms-edit-sheet.tsx
+++ b/lib/payment-terms/table/payment-terms-edit-sheet.tsx
@@ -5,6 +5,7 @@ import { zodResolver } from "@hookform/resolvers/zod"
import { useForm } from "react-hook-form"
import { toast } from "sonner"
import * as z from "zod"
+import { Loader } from "lucide-react"
import { Button } from "@/components/ui/button"
import {
@@ -17,8 +18,10 @@ import {
} from "@/components/ui/form"
import {
Sheet,
+ SheetClose,
SheetContent,
SheetDescription,
+ SheetFooter,
SheetHeader,
SheetTitle,
} from "@/components/ui/sheet"
@@ -38,7 +41,7 @@ type UpdatePaymentTermSchema = z.infer<typeof updatePaymentTermSchema>
interface PaymentTermsEditSheetProps {
open: boolean
onOpenChange: (open: boolean) => void
- data: typeof paymentTerms.$inferSelect
+ data: typeof paymentTerms.$inferSelect | null
onSuccess: () => void
}
@@ -48,12 +51,14 @@ export function PaymentTermsEditSheet({
data,
onSuccess,
}: PaymentTermsEditSheetProps) {
+ const [isUpdatePending, startUpdateTransition] = React.useTransition()
+
const form = useForm<UpdatePaymentTermSchema>({
resolver: zodResolver(updatePaymentTermSchema),
defaultValues: {
- code: data.code,
- description: data.description,
- isActive: data.isActive,
+ code: data?.code ?? "",
+ description: data?.description ?? "",
+ isActive: data?.isActive ?? true,
},
mode: "onChange"
})
@@ -69,14 +74,19 @@ export function PaymentTermsEditSheet({
}, [data, form])
async function onSubmit(input: UpdatePaymentTermSchema) {
- try {
- await updatePaymentTerm(data.code, input)
- toast.success("수정이 완료되었습니다.")
- onSuccess()
- onOpenChange(false)
- } catch {
- toast.error("수정 중 오류가 발생했습니다.")
- }
+ if (!data) return
+
+ startUpdateTransition(async () => {
+ try {
+ await updatePaymentTerm(data.code, input)
+ toast.success("결제 조건이 성공적으로 수정되었습니다.")
+ onSuccess()
+ onOpenChange(false)
+ } catch (error) {
+ console.error("Update error:", error)
+ toast.error("결제 조건 수정 중 오류가 발생했습니다.")
+ }
+ })
}
return (
@@ -97,7 +107,7 @@ export function PaymentTermsEditSheet({
<FormItem>
<FormLabel>코드</FormLabel>
<FormControl>
- <Input {...field} disabled />
+ <Input {...field} />
</FormControl>
<FormMessage />
</FormItem>
@@ -133,12 +143,25 @@ export function PaymentTermsEditSheet({
</FormItem>
)}
/>
- <div className="flex justify-end space-x-2">
- <Button type="button" variant="outline" onClick={() => onOpenChange(false)}>
- 취소
+ <SheetFooter className="gap-2 pt-2 sm:space-x-0">
+ <SheetClose asChild>
+ <Button type="button" variant="outline">
+ 취소
+ </Button>
+ </SheetClose>
+ <Button
+ type="submit"
+ disabled={isUpdatePending || !form.formState.isValid}
+ >
+ {isUpdatePending && (
+ <Loader
+ className="mr-2 size-4 animate-spin"
+ aria-hidden="true"
+ />
+ )}
+ 저장
</Button>
- <Button type="submit">저장</Button>
- </div>
+ </SheetFooter>
</form>
</Form>
</SheetContent>