'use client' // React Imports import { useEffect, useMemo, useState } from 'react' // MUI Imports import type { ButtonProps } from '@mui/material/Button' import Button from '@mui/material/Button' import Card from '@mui/material/Card' import CardContent from '@mui/material/CardContent' import Chip from '@mui/material/Chip' import IconButton from '@mui/material/IconButton' import MenuItem from '@mui/material/MenuItem' import type { TextFieldProps } from '@mui/material/TextField' import Typography from '@mui/material/Typography' // Third-party Imports import type { RankingInfo } from '@tanstack/match-sorter-utils' import { rankItem } from '@tanstack/match-sorter-utils' import type { ColumnDef, FilterFn } from '@tanstack/react-table' import { createColumnHelper, flexRender, getCoreRowModel, getFacetedMinMaxValues, getFacetedRowModel, getFacetedUniqueValues, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable } from '@tanstack/react-table' import classnames from 'classnames' // Type Imports import type { PermissionRowType } from '@/types/apps/permissionTypes' import type { ThemeColor } from '@core/types' // Component Imports import OpenDialogOnElementClick from '@components/dialogs/OpenDialogOnElementClick' import PermissionDialog from '@components/dialogs/permission-dialog' import CustomTextField from '@core/components/mui/TextField' // Style Imports import tableStyles from '@core/styles/table.module.css' declare module '@tanstack/table-core' { interface FilterFns { fuzzy: FilterFn } interface FilterMeta { itemRank: RankingInfo } } type PermissionsTypeWithAction = PermissionRowType & { action?: string } type Colors = { [key: string]: ThemeColor } // Vars const colors: Colors = { support: 'info', users: 'success', manager: 'warning', administrator: 'primary', 'restricted-user': 'error' } 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 Permissions = ({ permissionsData }: { permissionsData?: PermissionRowType[] }) => { // States const [open, setOpen] = useState(false) const [rowSelection, setRowSelection] = useState({}) const [editValue, setEditValue] = useState('') // eslint-disable-next-line @typescript-eslint/no-unused-vars const [data, setData] = useState(...[permissionsData]) const [globalFilter, setGlobalFilter] = useState('') // Vars const buttonProps: ButtonProps = { variant: 'contained', children: 'Add Permission', onClick: () => handleAddPermission(), className: 'max-sm:is-full', startIcon: } // Hooks const columns = useMemo[]>( () => [ columnHelper.accessor('name', { header: 'Name', cell: ({ row }) => {row.original.name} }), columnHelper.accessor('assignedTo', { header: 'Assigned To', cell: ({ row }) => typeof row.original.assignedTo === 'string' ? ( ) : ( row.original.assignedTo.map((item, index) => ( )) ) }), columnHelper.accessor('createdDate', { header: 'Created Date', cell: ({ row }) => {row.original.createdDate} }), columnHelper.accessor('action', { header: 'Actions', cell: ({ row }) => (
handleEditPermission(row.original.name)}>
), enableSorting: false }) ], // eslint-disable-next-line react-hooks/exhaustive-deps [] ) const table = useReactTable({ data: data as PermissionRowType[], columns, filterFns: { fuzzy: fuzzyFilter }, state: { rowSelection, globalFilter }, initialState: { pagination: { pageSize: 9 } }, 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 handleEditPermission = (name: string) => { setOpen(true) setEditValue(name) } const handleAddPermission = () => { setEditValue('') } return ( <>
Show table.setPageSize(Number(e.target.value))} className='is-[70px]' > 5 7 9
setGlobalFilter(String(value))} placeholder='Search Permissions' 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) }} /> */}
) } export default Permissions