'use client' // React Imports import { useEffect, useState, useMemo } from 'react' // Next Imports import Link from 'next/link' import { useParams } from 'next/navigation' // MUI Imports import Card from '@mui/material/Card' import CardHeader from '@mui/material/CardHeader' import Button from '@mui/material/Button' import Typography from '@mui/material/Typography' import Chip from '@mui/material/Chip' import Checkbox from '@mui/material/Checkbox' import IconButton from '@mui/material/IconButton' import { styled } from '@mui/material/styles' import TablePagination from '@mui/material/TablePagination' import type { TextFieldProps } from '@mui/material/TextField' import MenuItem from '@mui/material/MenuItem' // Third-party Imports import classnames from 'classnames' import { rankItem } from '@tanstack/match-sorter-utils' import { createColumnHelper, flexRender, getCoreRowModel, useReactTable, getFilteredRowModel, getFacetedRowModel, getFacetedUniqueValues, getFacetedMinMaxValues, getPaginationRowModel, getSortedRowModel } from '@tanstack/react-table' import type { ColumnDef, FilterFn } from '@tanstack/react-table' import type { RankingInfo } from '@tanstack/match-sorter-utils' // Type Imports import type { ThemeColor } from '@core/types' import type { UsersType } from '@/types/apps/userTypes' import type { Locale } from '@configs/i18n' // Component Imports import TableFilters from './TableFilters' import AddUserDrawer from './AddUserDrawer' import OptionMenu from '@core/components/option-menu' import TablePaginationComponent from '@components/TablePaginationComponent' import CustomTextField from '@core/components/mui/TextField' import CustomAvatar from '@core/components/mui/Avatar' // Util Imports import { getInitials } from '@/utils/getInitials' import { getLocalizedUrl } from '@/utils/i18n' // Style Imports import tableStyles from '@core/styles/table.module.css' declare module '@tanstack/table-core' { interface FilterFns { fuzzy: FilterFn } interface FilterMeta { itemRank: RankingInfo } } type UsersTypeWithAction = UsersType & { action?: string } type UserRoleType = { [key: string]: { icon: string; color: string } } type UserStatusType = { [key: string]: ThemeColor } // Styled Components const Icon = styled('i')({}) const fuzzyFilter: FilterFn = (row, columnId, value, addMeta) => { // Rank the item const itemRank = rankItem(row.getValue(columnId), value) // Store the itemRank info addMeta({ itemRank }) // Return if the item should be filtered in/out return itemRank.passed } const DebouncedInput = ({ value: initialValue, onChange, debounce = 500, ...props }: { value: string | number onChange: (value: string | number) => void debounce?: number } & Omit) => { // States const [value, setValue] = useState(initialValue) useEffect(() => { setValue(initialValue) }, [initialValue]) useEffect(() => { const timeout = setTimeout(() => { onChange(value) }, debounce) return () => clearTimeout(timeout) // eslint-disable-next-line react-hooks/exhaustive-deps }, [value]) return setValue(e.target.value)} /> } // Vars const userRoleObj: UserRoleType = { admin: { icon: 'tabler-crown', color: 'error' }, author: { icon: 'tabler-device-desktop', color: 'warning' }, editor: { icon: 'tabler-edit', color: 'info' }, maintainer: { icon: 'tabler-chart-pie', color: 'success' }, subscriber: { icon: 'tabler-user', color: 'primary' } } const userStatusObj: UserStatusType = { active: 'success', pending: 'warning', inactive: 'secondary' } // Column Definitions const columnHelper = createColumnHelper() const UserListTable = ({ tableData }: { tableData?: UsersType[] }) => { // States const [addUserOpen, setAddUserOpen] = useState(false) const [rowSelection, setRowSelection] = useState({}) const [data, setData] = useState(...[tableData]) const [filteredData, setFilteredData] = useState(data) const [globalFilter, setGlobalFilter] = useState('') // Hooks const { lang: locale } = useParams() const columns = useMemo[]>( () => [ { id: 'select', header: ({ table }) => ( ), cell: ({ row }) => ( ) }, columnHelper.accessor('fullName', { header: 'User', cell: ({ row }) => (
{getAvatar({ avatar: row.original.avatar, fullName: row.original.fullName })}
{row.original.fullName} {row.original.username}
) }), columnHelper.accessor('role', { header: 'Role', cell: ({ row }) => (
{row.original.role}
) }), columnHelper.accessor('currentPlan', { header: 'Plan', cell: ({ row }) => ( {row.original.currentPlan} ) }), columnHelper.accessor('billing', { header: 'Billing', cell: ({ row }) => {row.original.billing} }), columnHelper.accessor('status', { header: 'Status', cell: ({ row }) => (
) }), columnHelper.accessor('action', { header: 'Action', cell: ({ row }) => (
setData(data?.filter(product => product.id !== row.original.id))}>
), enableSorting: false }) ], // eslint-disable-next-line react-hooks/exhaustive-deps [data, filteredData] ) const table = useReactTable({ data: filteredData as UsersType[], columns, filterFns: { fuzzy: fuzzyFilter }, state: { rowSelection, globalFilter }, initialState: { pagination: { pageSize: 10 } }, enableRowSelection: true, //enable row selection for all rows // enableRowSelection: row => row.original.age > 18, // or enable row selection conditionally per row globalFilterFn: fuzzyFilter, onRowSelectionChange: setRowSelection, getCoreRowModel: getCoreRowModel(), onGlobalFilterChange: setGlobalFilter, getFilteredRowModel: getFilteredRowModel(), getSortedRowModel: getSortedRowModel(), getPaginationRowModel: getPaginationRowModel(), getFacetedRowModel: getFacetedRowModel(), getFacetedUniqueValues: getFacetedUniqueValues(), getFacetedMinMaxValues: getFacetedMinMaxValues() }) const getAvatar = (params: Pick) => { const { avatar, fullName } = params if (avatar) { return } else { return {getInitials(fullName as string)} } } return ( <>
table.setPageSize(Number(e.target.value))} className='max-sm:is-full sm:is-[70px]' > 10 25 50
setGlobalFilter(String(value))} placeholder='Search User' className='max-sm:is-full' />
{table.getHeaderGroups().map(headerGroup => ( {headerGroup.headers.map(header => ( ))} ))} {table.getFilteredRowModel().rows.length === 0 ? ( ) : ( {table .getRowModel() .rows.slice(0, table.getState().pagination.pageSize) .map(row => { return ( {row.getVisibleCells().map(cell => ( ))} ) })} )}
{header.isPlaceholder ? null : ( <>
{flexRender(header.column.columnDef.header, header.getContext())} {{ asc: , desc: }[header.column.getIsSorted() as 'asc' | 'desc'] ?? null}
)}
No data available
{flexRender(cell.column.columnDef.cell, cell.getContext())}
} count={table.getFilteredRowModel().rows.length} rowsPerPage={table.getState().pagination.pageSize} page={table.getState().pagination.pageIndex} onPageChange={(_, page) => { table.setPageIndex(page) }} />
setAddUserOpen(!addUserOpen)} userData={data} setData={setData} /> ) } export default UserListTable