import { Fragment, FC, memo, useCallback, useState, ChangeEvent } from 'react'; import { provide, useDependencies } from '@servicetitan/react-ioc'; import { observer } from 'mobx-react'; import { Table, TableColumn, TableCellProps } from '../..'; import { TableStore } from './table.store'; import { Supplier } from './product'; import { TableCell } from '@servicetitan/design-system'; const SupplierCell: FC = ({ field, dataItem, tdProps }) => ( {Supplier[dataItem[field!]]} ); const columns = [ { field: 'ProductID', title: 'ID', minWidth: 50 }, { field: 'ProductName', title: 'Name', minWidth: 200 }, { field: 'Supplier', title: 'Supplier', minWidth: 200 }, { field: 'MadeIn', title: 'Made In', minWidth: 200 }, { field: 'QuantityPerUnit', title: 'Quantity Per Unit', minWidth: 200 }, { field: 'UnitPrice', title: 'Price', minWidth: 100 }, { field: 'UnitsInStock', title: 'In stock', minWidth: 100 }, { field: 'UnitsOnOrder', title: 'On Order', minWidth: 100 }, { field: 'Discontinued', title: 'Discontinued', minWidth: 100 }, ]; interface CheckboxRowProps { field: string; label: string; checked: boolean; onChange: (field: string, checked: boolean) => void; } const CheckboxRow = memo(({ field, label, checked, onChange }: CheckboxRowProps) => { const handleChange = useCallback( (event: ChangeEvent) => { onChange(field, event.target.checked); }, [field, onChange] ); return (
); }); interface HiddenColumnsProps { onChange: (columns: Set) => void; checkedColumns: Set; } const HiddenColumns = ({ onChange, checkedColumns }: HiddenColumnsProps) => { const handleChange = useCallback( (field: string, checked: boolean) => { const newState = new Set(Array.from(checkedColumns)); if (checked) { newState.add(field); } else { newState.delete(field); } onChange(newState); }, [checkedColumns, onChange] ); return (
Select columns to hide
{columns.map(col => ( ))}
); }; const CellProvider = (props: TableCellProps) => { if (props.field === 'Supplier') { return ; } return ; }; export const TableColumnHidingExample: FC = provide({ singletons: [TableStore], })( observer(() => { const [{ tableState }] = useDependencies(TableStore); const [hiddenColumns, setHiddenColumns] = useState(new Set()); const handleHiddenColumnsChange = useCallback((columns: Set) => { setHiddenColumns(new Set([...columns])); }, []); return ( {columns .filter(col => !hiddenColumns.has(col.field)) .map(column => { return ( ); })}
); }) );