"use client" import * as React from "react" import { userRoles , type UserView} from "@/db/schema/users" import type { DataTableAdvancedFilterField, DataTableFilterField, DataTableRowAction, } from "@/types/table" import { toSentenceCase } from "@/lib/utils" 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 { DataTableToolbar } from "@/components/data-table/data-table-toolbar" import type { getUserCountGroupByCompany, getUserCountGroupByRole, getUsers, getAllCompanies, getAllRoles } from "@/lib//admin-users/service" import { getColumns } from "./ausers-table-columns" import { AdmUserTableToolbarActions } from "./ausers-table-toolbar-actions" import { DeleteUsersDialog } from "./delete-ausers-dialog" import { AusersTableFloatingBar } from "./ausers-table-floating-bar" import { UpdateAuserSheet } from "./update-auser-sheet" interface UsersTableProps { promises: Promise< [ Awaited>, Record, Record, Awaited>, Awaited> ] > } type RoleCounts = Record export function AdmUserTable({ promises }: UsersTableProps) { const [{ data, pageCount }, companyCounts,roleCountsRaw, companies, roles] = React.use(promises) console.log(roles,"roles") const [rowAction, setRowAction] = React.useState | null>(null) const columns = React.useMemo( () => getColumns({ setRowAction }), [setRowAction] ) const roleCounts = roleCountsRaw as RoleCounts /** * This component can render either a faceted filter or a search filter based on the `options` prop. * * @prop options - An array of objects, each representing a filter option. If provided, a faceted filter is rendered. If not, a search filter is rendered. * * Each `option` object has the following properties: * @prop {string} label - The label for the filter option. * @prop {string} value - The value for the filter option. * @prop {React.ReactNode} [icon] - An optional icon to display next to the label. * @prop {boolean} [withCount] - An optional boolean to display the count of the filter option. */ const filterFields: DataTableFilterField[] = [ { id: "user_email", label: "Email", placeholder: "Filter email...", }, ] /** * Advanced filter fields for the data table. * These fields provide more complex filtering options compared to the regular filterFields. * * Key differences from regular filterFields: * 1. More field types: Includes 'text', 'multi-select', 'date', and 'boolean'. * 2. Enhanced flexibility: Allows for more precise and varied filtering options. * 3. Used with DataTableAdvancedToolbar: Enables a more sophisticated filtering UI. * 4. Date and boolean types: Adds support for filtering by date ranges and boolean values. */ const advancedFilterFields: DataTableAdvancedFilterField[] = [ { id: "user_name", label: "User Name", type: "text", }, { id: "user_email", label: "Email", type: "text", }, { id: "company_name", label: "Company", type: "multi-select", options: companies.map((comp) => ({ label: comp.vendorName, value: comp.vendorName, count: companyCounts[comp.id] })), }, { id: "roles", label: "Roles", type: "multi-select", options: roles.map((role) => { return { label: toSentenceCase(role.name), value: role.id, count: roleCounts[role.id], // 이 값이 undefined인지 확인 }; }), }, { id: "created_at", label: "Created at", type: "date", }, ] const { table } = useDataTable({ data, columns, pageCount, filterFields, enablePinning: true, enableAdvancedFilter: true, initialState: { sorting: [{ id: "created_at", desc: true }], columnPinning: { right: ["actions"] }, }, getRowId: (originalRow) => `${originalRow.user_id}`, shallow: false, clearOnDefault: true, }) return ( <> } > setRowAction(null)} users={rowAction?.row.original ? [rowAction?.row.original] : []} showTrigger={false} onSuccess={() => rowAction?.row.toggleSelected(false)} /> setRowAction(null)} user={rowAction?.row.original ?? null} /> ) }