summaryrefslogtreecommitdiff
path: root/lib/payment-terms/table/payment-terms-table.tsx
blob: 589acb52dbdfcab543177ffdc8b9d906036db0ea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
"use client";
import * as React from "react";
import { useDataTable } from "@/hooks/use-data-table";
import { DataTable } from "@/components/data-table/data-table";
import { DataTableAdvancedToolbar } from "@/components/data-table/data-table-advanced-toolbar";
import { getColumns } from "./payment-terms-table-columns";
import { paymentTerms } from "@/db/schema/procurementRFQ";
import { PaymentTermsTableToolbar } from "./payment-terms-table-toolbar";
import { toast } from "sonner";
import { PaymentTermsEditSheet } from "./payment-terms-edit-sheet";
import { Row } from "@tanstack/react-table";
import { getPaymentTerms } from "../service";
import { GetPaymentTermsSchema } from "../validations";

interface PaymentTermsTableProps {
  promises?: Promise<[{ data: typeof paymentTerms.$inferSelect[]; pageCount: number }] >;
}

export function PaymentTermsTable({ promises }: PaymentTermsTableProps) {
  const [rawData, setRawData] = React.useState<{ data: typeof paymentTerms.$inferSelect[]; pageCount: number }>({ data: [], pageCount: 0 });
  const [isEditDialogOpen, setIsEditDialogOpen] = React.useState(false);
  const [selectedRow, setSelectedRow] = React.useState<typeof paymentTerms.$inferSelect | null>(null);

  React.useEffect(() => {
    if (promises) {
      promises.then(([result]) => {
        setRawData(result);
      });
    } else {
      // fallback: 클라이언트에서 직접 fetch (CSR)
      (async () => {
        try {
          const result = await getPaymentTerms({
            page: 1,
            perPage: 10,
            search: "",
            sort: [{ id: "createdAt", desc: true }],
            filters: [],
            joinOperator: "and",
            flags: ["advancedTable"],
            code: "",
            description: "",
            isActive: ""
          });
          setRawData(result);
        } catch (error) {
          console.error("Error refreshing data:", error);
          toast.error("데이터를 불러오는 중 오류가 발생했습니다.");
        }
      })();
    }
  }, [promises]);

  const fetchPaymentTerms = React.useCallback(async (params: Record<string, unknown>) => {
    try {
      const result = await getPaymentTerms(params as GetPaymentTermsSchema);
      return result;
    } catch (error) {
      console.error("Error fetching payment terms:", error);
      throw error;
    }
  }, []);

  const refreshData = React.useCallback(async () => {
    try {
      const result = await fetchPaymentTerms({
        page: 1,
        perPage: 10,
        search: "",
        sort: [{ id: "createdAt", desc: true }],
        filters: [],
        joinOperator: "and",
        flags: ["advancedTable"],
        code: "",
        description: "",
        isActive: ""
      });
      setRawData(result);
    } catch (error) {
      console.error("Error refreshing data:", error);
      toast.error("데이터를 불러오는 중 오류가 발생했습니다.");
    }
  }, [fetchPaymentTerms]);

  const handleRowAction = async (action: { type: string; row: Row<typeof paymentTerms.$inferSelect> }) => {
    if (action.type === "edit") {
      setSelectedRow(action.row.original);
      setIsEditDialogOpen(true);
    }
  };

  const columns = React.useMemo(() => getColumns({ setRowAction: handleRowAction, onSuccess: refreshData }), [refreshData]);

  const { table } = useDataTable({
    data: rawData.data,
    columns,
    pageCount: rawData.pageCount,
    filterFields: [],
    enablePinning: true,
    enableAdvancedFilter: true,
    initialState: {
      sorting: [{ id: "createdAt", desc: true }],
      columnPinning: { right: ["actions"] },
    },
    getRowId: (originalRow) => String(originalRow.code),
    shallow: false,
    clearOnDefault: true,
  });

  return (
    <>
      <DataTable table={table}>
        <DataTableAdvancedToolbar table={table} filterFields={[]} shallow={false}>
          <PaymentTermsTableToolbar onSuccess={refreshData} />
        </DataTableAdvancedToolbar>
      </DataTable>
      {isEditDialogOpen && selectedRow && (
        <PaymentTermsEditSheet
          open={isEditDialogOpen}
          onOpenChange={setIsEditDialogOpen}
          data={selectedRow}
          onSuccess={refreshData}
        />
      )}
    </>
  );
}