import { Component, SyntheticEvent, ReactNode, FC } from 'react'; import { IdType } from '@servicetitan/data-query'; import { TableFilterCellProps, Radio } from '@servicetitan/design-system'; import { CustomColumnMenuFilterSingleOpts, renderCustomColumnMenuFilter, } from '../column-menu-filters'; interface SelectorProps { options: TO[]; value?: TV; valueSelector(item: TO): TV; onChange(value: TV | undefined, event: SyntheticEvent): void; renderer?(item: TO): ReactNode; } class SelectorRadio extends Component> { render() { const { options, value, renderer } = this.props; return options.map((option, index) => { const optionValue = this.props.valueSelector(option); return ( // eslint-disable-next-line react/no-array-index-key this.props.onChange(optionValue, event)} /> ); }); } } export interface SingleSelectColumnMenuOptions< TV, TO = TV, > extends CustomColumnMenuFilterSingleOpts { options: TO[]; valueSelector?: (item: TO) => TV; renderItem?: (item: TO) => ReactNode | string; filterOperator?: (listItem: any, value: TV) => boolean; } export function singleSelectColumnMenuFilter({ options, valueSelector, renderItem, filterOperator, ...opts }: SingleSelectColumnMenuOptions) { const FilterCell: FC = ({ value, onChange }) => { const handleChange = (value: TV | undefined, event: SyntheticEvent) => { const filter = value === undefined ? { value: '', operator: '' } : { value, operator: filterOperator ?? 'equals', }; onChange({ ...filter, syntheticEvent: event, }); }; return ( option)} /> ); }; return renderCustomColumnMenuFilter(FilterCell, opts); }