summaryrefslogtreecommitdiff
path: root/lib/bidding/list/biddings-table.tsx
blob: ce4aade904ef32fa1f59f7a5dc9b3ddb6be4174f (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
128
129
130
131
132
133
134
135
"use client"

import * as React from "react"
import { useRouter } from "next/navigation"
import type {
    DataTableAdvancedFilterField,
    DataTableFilterField,
    DataTableRowAction,
} from "@/types/table"

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 { getBiddingsColumns } from "./biddings-table-columns"
import { getBiddings, getBiddingStatusCounts } from "@/lib/bidding/service"
import { BiddingListItem } from "@/db/schema"
import { BiddingsTableToolbarActions } from "./biddings-table-toolbar-actions"
import {
    biddingStatusLabels,
    contractTypeLabels,
    biddingTypeLabels
} from "@/db/schema"
import { EditBiddingSheet } from "./edit-bidding-sheet"

interface BiddingsTableProps {
    promises: Promise<
        [
            Awaited<ReturnType<typeof getBiddings>>,
            Awaited<ReturnType<typeof getBiddingStatusCounts>>
        ]
    >
}

export function BiddingsTable({ promises }: BiddingsTableProps) {
    const [{ data, pageCount }, statusCounts] = React.use(promises)
    const [isCompact, setIsCompact] = React.useState<boolean>(false)

    const [rowAction, setRowAction] = React.useState<DataTableRowAction<BiddingListItem> | null>(null)

    const router = useRouter()

    const columns = React.useMemo(
        () => getBiddingsColumns({ setRowAction }),
        [setRowAction]
    )

    const filterFields: DataTableFilterField<BiddingListItem>[] = []

    const advancedFilterFields: DataTableAdvancedFilterField<BiddingListItem>[] = [
        { id: "title", label: "입찰명", type: "text" },
        { id: "biddingNumber", label: "입찰번호", type: "text" },
        { id: "projectName", label: "프로젝트명", type: "text" },
        { id: "managerName", label: "담당자", type: "text" },
        {
            id: "status",
            label: "입찰상태",
            type: "multi-select",
            options: Object.entries(biddingStatusLabels).map(([value, label]) => ({
                label,
                value,
                count: statusCounts[value] || 0,
            })),
        },
        {
            id: "contractType",
            label: "계약구분",
            type: "select",
            options: Object.entries(contractTypeLabels).map(([value, label]) => ({
                label,
                value,
            })),
        },
        {
            id: "biddingType",
            label: "입찰유형",
            type: "select",
            options: Object.entries(biddingTypeLabels).map(([value, label]) => ({
                label,
                value,
            })),
        },
        { id: "createdAt", label: "등록일", type: "date" },
        { id: "updatedAt", label: "수정일", type: "date" },
    ]

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

    const handleCompactChange = React.useCallback((compact: boolean) => {
        setIsCompact(compact)
    }, [])



    return (
        <>
            <DataTable
                table={table}
                compact={isCompact}
            >
                <DataTableAdvancedToolbar
                    table={table}
                    filterFields={advancedFilterFields}
                    shallow={false}
                    enableCompactToggle={true}
                    compactStorageKey="biddingsTableCompact"
                    onCompactChange={handleCompactChange}
                >
                    <BiddingsTableToolbarActions table={table} />
                </DataTableAdvancedToolbar>
            </DataTable>

            <EditBiddingSheet
                open={rowAction?.type === "update"}
                onOpenChange={() => setRowAction(null)}
                bidding={rowAction?.row.original}
                onSuccess={() => router.refresh()}
            />
        </>

    )
}