import { Badge, Button, Flex, Input, Modal, ScrollAreaAutosize, Select, Stack, Table, TextInput } from '@mantine/core'; import { Cell, ColumnDef, flexRender, getCoreRowModel, useReactTable } from '@tanstack/react-table'; import { useEffect, useMemo, useState } from 'react'; import styles from './CustomTable.module.scss' import { useRoles } from '../hooks/swrHooks'; import { IRole } from '../interfaces/role'; import { IconPlus } from '@tabler/icons-react'; import { CreateField } from '../interfaces/create'; import { AxiosResponse } from 'axios'; import FormFields from './FormFields'; import { useDisclosure } from '@mantine/hooks'; type CustomTableProps = { data: T[]; columns: ColumnDef[]; createFields?: CreateField[]; submitHandler?: (data: T) => Promise } const CustomTable = ({ data: initialData, columns, createFields, submitHandler }: CustomTableProps) => { const [data, setData] = useState(initialData); const [searchText, setSearchText] = useState(''); const [editingCell, setEditingCell] = useState<{ rowIndex: string | number | null, columnId: string | number | null }>({ rowIndex: null, columnId: null }); const tableColumns = useMemo(() => columns, [columns]); // Function to handle cell edit const handleEditCell = ( rowIndex: number, columnId: keyof T, value: T[keyof T] ) => { const updatedData = [...data]; updatedData[rowIndex][columnId] = value; setData(updatedData); //setEditingCell({ rowIndex: null, columnId: null }); }; const filteredData = useMemo(() => { if (!searchText) return data; return data.filter((row) => Object.values(row).some((value) => value?.toString().toLowerCase().includes(searchText.toLowerCase()) ) ); }, [data, searchText]) const table = useReactTable({ data: filteredData, columns: tableColumns, getCoreRowModel: getCoreRowModel(), columnResizeMode: "onChange", }); const [opened, { open, close }] = useDisclosure(false); return ( {createFields && submitHandler && } setSearchText(e.target.value)} w='100%' /> {createFields && submitHandler && } {table.getHeaderGroups().map(headerGroup => ( {headerGroup.headers.map((header) => ( {flexRender(header.column.columnDef.header, header.getContext())}
))}
))}
{table.getRowModel().rows.map((row, rowIndex) => ( {row.getVisibleCells().map(cell => { const isEditing = editingCell.rowIndex === rowIndex && editingCell.columnId === cell.column.id; return ( setEditingCell({ rowIndex, columnId: cell.column.id })} style={{ width: cell.column.getSize() }} className={styles.td} > {isEditing ? ( handleEditCell(rowIndex, (cell.column.id as keyof T), e.target.value as T[keyof T])} onBlur={() => setEditingCell({ rowIndex: null, columnId: null })} autoFocus /> ) : ( )} ); })} ))}
); }; type CellDisplayProps = { cell: Cell; } const CellDisplay = ({ cell }: CellDisplayProps) => { const { roles } = useRoles() const [roleOptions, setRoleOptions] = useState<{ label: string, value: string }[]>() useEffect(() => { if (Array.isArray(roles)) { setRoleOptions(roles.map((role: IRole) => ({ label: role.name, value: role.id.toString() }))) } }, [roles]) switch (cell.column.id) { case 'activity': return ( cell.getValue() ? ( Активен ) : ( Отключен ) ) case 'is_active': return ( cell.getValue() ? ( Активен ) : ( Отключен ) ) case 'role_id': return (