'use client' // React Imports import { useEffect, useMemo, useState } from 'react' // MUI Imports import AvatarGroup from '@mui/material/AvatarGroup' import Typography from '@mui/material/Typography' import LinearProgress from '@mui/material/LinearProgress' import Card from '@mui/material/Card' import Checkbox from '@mui/material/Checkbox' import CardHeader from '@mui/material/CardHeader' import TablePagination from '@mui/material/TablePagination' import type { TextFieldProps } from '@mui/material/TextField' // 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 { ProjectTableRowType } from '@/types/pages/profileTypes' // Component Imports import OptionMenu from '@core/components/option-menu' import CustomAvatar from '@core/components/mui/Avatar' import CustomTextField from '@core/components/mui/TextField' import TablePaginationComponent from '@/components/TablePaginationComponent' // Style Imports import tableStyles from '@core/styles/table.module.css' declare module '@tanstack/table-core' { interface FilterFns { fuzzy: FilterFn } interface FilterMeta { itemRank: RankingInfo } } 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)} /> } // Column Definitions const columnHelper = createColumnHelper() const ProjectTables = ({ projectTable }: { projectTable?: ProjectTableRowType[] }) => { // States const [rowSelection, setRowSelection] = useState({}) // eslint-disable-next-line @typescript-eslint/no-unused-vars const [data, setData] = useState(...[projectTable]) const [globalFilter, setGlobalFilter] = useState('') // Hooks const columns = useMemo[]>( () => [ { id: 'select', header: ({ table }) => ( ), cell: ({ row }) => ( ) }, columnHelper.accessor('title', { header: 'Project', cell: ({ row }) => (
{row.original.title} {row.original.subtitle}
) }), columnHelper.accessor('leader', { header: 'Leader', cell: ({ row }) => {row.original.leader} }), columnHelper.accessor('avatarGroup', { header: 'Team', cell: ({ row }) => ( {row.original.avatarGroup.map((avatar, index) => ( ))} ), enableSorting: false }), columnHelper.accessor('status', { header: 'Progress', cell: ({ row }) => (
{`${row.original.status}%`}
) }), columnHelper.accessor('actions', { header: 'Actions', cell: () => ( ), enableSorting: false }) ], // eslint-disable-next-line react-hooks/exhaustive-deps [] ) const table = useReactTable({ data: data as ProjectTableRowType[], columns, filterFns: { fuzzy: fuzzyFilter }, state: { rowSelection, globalFilter }, initialState: { pagination: { pageSize: 5 } }, 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() }) return ( setGlobalFilter(String(value))} placeholder='Search Project' /> } />
{table.getHeaderGroups().map(headerGroup => ( {headerGroup.headers.map(header => ( ))} ))} {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}
)}
{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) }} />
) } export default ProjectTables