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 ? (
) : (
)}
);
})
);