import { useMemo, cloneElement, Fragment, FC, ReactElement } from 'react'; import { provide, useDependencies } from '@servicetitan/react-ioc'; import { observer } from 'mobx-react'; import { Stack, ButtonGroup, Button, Tag, DatePicker } from '@servicetitan/design-system'; import { Table, TableColumn, TableCell, TableCellProps, TextEditableCell, BooleanEditableCell, getSelectEditableCell, DateRangeColumnMenuFilter, StandardColumnMenuFilter, standardFilterWithMultiselect, multiSelectColumnMenuFilter, CurrencyRangeColumnMenuFilter, getEditableCell, EditorProps, } from '../..'; import { Export } from '../../export'; import { TableStore } from './table.store'; import { ActionsCell } from './actions-cell'; import { NumberInput, enumToOptions, getEnumKeys } from '@servicetitan/form'; import { Product, UserRole, Supplier } from './product'; const UserRoleColumnMenuFilter = multiSelectColumnMenuFilter(getEnumKeys(UserRole), userRole => ( {userRole} )); const AvailableForEditableCell = getSelectEditableCell({ options: enumToOptions(UserRole), viewer: ({ dataItem, field, tdProps }) => { const value = dataItem[field!]; return {value && UserRole[value]}; }, }); const SupplierCell: FC = props => { const { field, dataItem, rowType, tdProps } = props; if (rowType !== 'data') { return ; } return {Supplier[dataItem[field!]]}; }; // Implementation of a date editable cell utilizing getEditableCell const DateEditor = observer>>( ({ fieldState: { value, onChange, hasError }, className, tdProps }) => { return ( ); } ); export const DateEditableCell = getEditableCell({ editor: DateEditor, }); // Implementation of a numeric editable cell utilizing getEditableCell const NumberCellEditor: FC> = observer( ({ fieldState: { value, hasError, onChange }, tdProps }) => ( ) ); const NumericEditableCell = getEditableCell({ editor: getEditableCell({ editor: NumberCellEditor }), }); export const TableExample: FC = provide({ singletons: [TableStore], })( observer(() => { const [{ tableState, inEdit, editAll, cancelAll, saveAll }] = useDependencies(TableStore); const madeInColumnMenu = useMemo( () => standardFilterWithMultiselect({ tableState }), [tableState] ); const cellRender = (td: ReactElement | null, { dataItem, field }: TableCellProps) => { if (!td) { return null; } return cloneElement(td, { onClick: () => { tableState.edit(dataItem, field as keyof Product); }, }); }; return ( {inEdit ? ( ) : ( )}
); }) );