diff options
Diffstat (limited to 'app')
| -rw-r--r-- | app/[lng]/evcp/(evcp)/vendor-pool/page.tsx | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/app/[lng]/evcp/(evcp)/vendor-pool/page.tsx b/app/[lng]/evcp/(evcp)/vendor-pool/page.tsx new file mode 100644 index 00000000..6708e674 --- /dev/null +++ b/app/[lng]/evcp/(evcp)/vendor-pool/page.tsx @@ -0,0 +1,79 @@ +import * as React from "react" +import { type SearchParams } from "@/types/table" + +import { getValidFilters } from "@/lib/data-table" +import { Skeleton } from "@/components/ui/skeleton" +import { DataTableSkeleton } from "@/components/data-table/data-table-skeleton" +import { Shell } from "@/components/shell" +import { getVendorPools } from "@/lib/vendor-pool/service" +import { vendorPoolSearchParamsCache } from "@/lib/vendor-pool/validations" +import { VendorPoolTable } from "@/lib/vendor-pool/table/vendor-pool-table" +import { InformationButton } from "@/components/information/information-button" + +interface VendorPoolPageProps { + searchParams: Promise<SearchParams> +} + +export default async function VendorPoolPage(props: VendorPoolPageProps) { + const searchParams = await props.searchParams + const search = vendorPoolSearchParamsCache.parse(searchParams) + + const validFilters = getValidFilters(search.filters) + + const promises = Promise.all([ + getVendorPools({ + ...search, + filters: validFilters, + }), + ]) + + return ( + <Shell className="gap-2"> + <div className="flex items-center justify-between space-y-2"> + <div className="flex items-center justify-between space-y-2"> + <div> + <div className="flex items-center gap-2"> + <h2 className="text-2xl font-bold tracking-tight"> + Vendor Pool + </h2> + <InformationButton pagePath="evcp/vendor-pool" /> + </div> + </div> + </div> + </div> + + <React.Suspense fallback={<Skeleton className="h-7 w-52" />}> + </React.Suspense> + <React.Suspense + fallback={ + <DataTableSkeleton + columnCount={30} + searchableColumnCount={1} + filterableColumnCount={5} + cellWidths={[ + "50px", "60px", "100px", "80px", "120px", "120px", "120px", "120px", + "120px", "100px", "140px", "140px", "130px", "120px", "80px", "100px", + "120px", "80px", "100px", "120px", "100px", "110px", "140px", "130px", + "60px", "100px", "80px", "120px", "80px", "80px" + ]} + shrinkZero + /> + } + > + <VendorPoolTableWrapper promises={promises} /> + </React.Suspense> + </Shell> + ) +} + +// 실제 데이터를 받아서 VendorPoolTable에 전달하는 컴포넌트 +function VendorPoolTableWrapper({ promises }: { promises: Promise<any> }) { + const [{ data, pageCount }] = React.use(promises) + + return ( + <VendorPoolTable + data={data} + pageCount={pageCount} + /> + ) +} |
