import { Component, SyntheticEvent, ReactNode, FC } from 'react'; import { TableFilterCellProps, Checkbox } from '@servicetitan/design-system'; import { CustomColumnMenuFilterSingleOpts, renderCustomColumnMenuFilter, } from '../column-menu-filters'; interface SelectorProps { options: T[]; value?: T[]; onChange(value: T[] | undefined, event: SyntheticEvent): void; renderer?(item: T): ReactNode; } class Selector extends Component> { handleChange = (option: T, checked: boolean, event: SyntheticEvent) => { const newValue = checked ? (this.props.value ?? []).concat(option) : (this.props.value ?? []).filter(v => v !== option); this.props.onChange(newValue.length ? newValue : undefined, event); }; render() { const { options, value, renderer } = this.props; return options.map((option, index) => ( // eslint-disable-next-line react/no-array-index-key )); } } export function multiSelectColumnMenuFilter( data: T[], renderItem?: (item: T) => ReactNode, opts?: CustomColumnMenuFilterSingleOpts ) { const FilterCell: FC = ({ value, onChange }) => { const handleChange = (value: T[] | undefined, event: SyntheticEvent) => { onChange({ value: value ?? '', operator: value ? 'in' : '', syntheticEvent: event, }); }; return ( ); }; return renderCustomColumnMenuFilter(FilterCell, opts); } export function complexItemMultiSelectColumnMenuFilter( data: T[], renderItem?: (item: T) => ReactNode, opts?: CustomColumnMenuFilterSingleOpts ) { class FilterCell extends Component { contains = (item: any) => { const value: T[] = this.props.value || []; return value.some((v: T) => item[v] === true); }; handleChange = (value: T[] | undefined, event: SyntheticEvent) => { this.props.onChange({ value: value ?? '', operator: value ? this.contains : '', syntheticEvent: event, }); }; render() { const { value } = this.props; return ( ); } } return renderCustomColumnMenuFilter(FilterCell, opts); } export function multiItemMultiSelectColumnMenuFilter( data: T[], renderItem?: (item: T) => ReactNode, opts?: CustomColumnMenuFilterSingleOpts ) { class FilterCell extends Component { contains = (item: any) => { const value: T[] = this.props.value || []; return value.some((v: T) => Array.isArray(item) && item.includes(v)); }; handleChange = (value: T[] | undefined, event: SyntheticEvent) => { this.props.onChange({ value: value ?? '', operator: value ? this.contains : '', syntheticEvent: event, }); }; render() { const { value } = this.props; return ( ); } } return renderCustomColumnMenuFilter(FilterCell, opts); }