@servicetitan/table 41.2.0 → 42.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/demo/column-hiding/table.store.js +10 -5
- package/dist/demo/column-hiding/table.store.js.map +1 -1
- package/dist/demo/filters/table.store.js +10 -5
- package/dist/demo/filters/table.store.js.map +1 -1
- package/dist/demo/master-detail/detail-table.store.js +14 -7
- package/dist/demo/master-detail/detail-table.store.js.map +1 -1
- package/dist/demo/master-detail/master-table.store.js +14 -7
- package/dist/demo/master-detail/master-table.store.js.map +1 -1
- package/dist/demo/overview/table.store.js +14 -7
- package/dist/demo/overview/table.store.js.map +1 -1
- package/dist/demo/row-details/row-details-table.store.js +10 -5
- package/dist/demo/row-details/row-details-table.store.js.map +1 -1
- package/dist/demo/state-caching/state-caching-table.store.js +10 -5
- package/dist/demo/state-caching/state-caching-table.store.js.map +1 -1
- package/dist/filters/async-select/async-select-filter.js +14 -7
- package/dist/filters/async-select/async-select-filter.js.map +1 -1
- package/dist/filters/datetime-filter/datetime-filter.js +14 -7
- package/dist/filters/datetime-filter/datetime-filter.js.map +1 -1
- package/dist/filters/field-values-filter.js +14 -7
- package/dist/filters/field-values-filter.js.map +1 -1
- package/dist/filters/multiselect-filter/multiselect-filter.js +1 -3
- package/dist/filters/multiselect-filter/multiselect-filter.js.map +1 -1
- package/dist/filters/range-filter/range-filter.js +1 -3
- package/dist/filters/range-filter/range-filter.js.map +1 -1
- package/dist/filters/select-filter/select-filter.js +14 -7
- package/dist/filters/select-filter/select-filter.js.map +1 -1
- package/dist/filters/time-filter/time-filter.js +14 -7
- package/dist/filters/time-filter/time-filter.js.map +1 -1
- package/dist/table-state.js +14 -7
- package/dist/table-state.js.map +1 -1
- package/dist/table.js +14 -7
- package/dist/table.js.map +1 -1
- package/dist/use-observing-table-state/demo/stores/use-observing-table-state-demo.store.js +14 -7
- package/dist/use-observing-table-state/demo/stores/use-observing-table-state-demo.store.js.map +1 -1
- package/package.json +9 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/filters/field-values-filter.tsx"],"sourcesContent":["import type { TableFilterCellProps } from '@servicetitan/design-system';\nimport { Checkbox } from '@servicetitan/design-system';\nimport type { FormEvent } from 'react';\nimport { Component, Fragment } from 'react';\n\nimport { observer } from 'mobx-react';\nimport { observable, computed, runInAction, action, makeObservable } from 'mobx';\n\nimport type { InputChangeEvent } from '@progress/kendo-react-inputs';\nimport { Input } from '@progress/kendo-react-inputs';\n\nimport type { DataSource, IdType } from '@servicetitan/data-query';\nimport { TableState } from '../table-state';\nimport { renderCustomColumnMenuFilter } from './column-menu-filters';\n\nexport function operator<T>(item: T, value: T[]) {\n return value.includes(item);\n}\n\nexport function fieldValuesColumnMenuFilter<T, TId extends IdType = never>(\n tableState: TableState<T, TId>,\n renderItem: (value: T[keyof T]) => string = defaultRenderItem\n) {\n interface Data {\n value: T[keyof T];\n text: string;\n }\n @observer\n class FieldValuesFilterCell extends Component<TableFilterCellProps> {\n @observable data: Data[] = [];\n\n @observable searchQuery = '';\n\n @computed get processedData() {\n const searchQuery = this.searchQuery.toLowerCase();\n\n const filteredData = !searchQuery\n ? this.data\n : this.data.filter(v => v.text.toLowerCase().includes(searchQuery));\n\n return filteredData.slice().sort((a, b) => {\n if (a.text === b.text) {\n return 0;\n }\n\n return a.text < b.text ? -1 : 1;\n });\n }\n\n get field() {\n const field = this.props.field;\n\n if (field === undefined) {\n throw 'missing field';\n }\n\n return field as keyof T;\n }\n\n get value(): T[keyof T][] {\n return this.props.value || [];\n }\n\n constructor(props: TableFilterCellProps) {\n super(props);\n makeObservable(this);\n }\n\n @action\n handleSearchQueryChange = (ev: InputChangeEvent) => {\n if (typeof ev.target.value === 'string') {\n this.searchQuery = ev.target.value;\n }\n };\n\n componentDidMount() {\n this.fetchData(tableState.dataSource);\n }\n\n handleChange = (value: Data, checked: boolean, ev: FormEvent<HTMLInputElement>) => {\n const newFilterValue = checked\n ? this.value.concat(value.value)\n : this.value.filter((v: T[keyof T]) => v !== value.value);\n\n const hasValue = newFilterValue.length > 0;\n\n this.props.onChange({\n value: hasValue ? newFilterValue : '',\n operator: hasValue ? operator : '',\n syntheticEvent: ev,\n });\n };\n\n render() {\n return (\n <Fragment>\n <Input\n value={this.searchQuery}\n onChange={this.handleSearchQueryChange}\n placeholder=\"Search\"\n className=\"m-b-1\"\n />\n\n {this.processedData.map(item => (\n <span key={JSON.stringify(item)} className=\"k-widget d-b m-b-1\">\n <Checkbox\n label={item.text}\n checked={this.value.includes(item.value)}\n onChange={this.handleChange}\n value={item}\n />\n </span>\n ))}\n </Fragment>\n );\n }\n\n private async fetchData(dataSource: DataSource<T, TId> | null) {\n if (!dataSource) {\n return;\n }\n\n const items = (await dataSource.getData({})).data as T[];\n\n const values = items.map(i => i[this.field]);\n\n const distinctValues = values.filter((v, idx) => values.indexOf(v) === idx);\n\n runInAction(() => {\n this.data = distinctValues.map(value => ({ value, text: renderItem(value) }));\n });\n }\n }\n\n return renderCustomColumnMenuFilter(FieldValuesFilterCell);\n}\n\nfunction defaultRenderItem(v: any): string {\n if (v == null) {\n return '';\n }\n\n // suppose v has toString();\n return v.toString();\n}\n"],"names":["Checkbox","Component","Fragment","observer","observable","computed","runInAction","action","makeObservable","Input","renderCustomColumnMenuFilter","operator","item","value","includes","fieldValuesColumnMenuFilter","tableState","renderItem","defaultRenderItem","FieldValuesFilterCell","processedData","searchQuery","toLowerCase","filteredData","data","filter","v","text","slice","sort","a","b","field","props","undefined","componentDidMount","fetchData","dataSource","render","onChange","handleSearchQueryChange","placeholder","className","map","span","label","checked","handleChange","JSON","stringify","items","getData","values","i","distinctValues","idx","indexOf","ev","target","newFilterValue","concat","hasValue","length","syntheticEvent","toString"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/filters/field-values-filter.tsx"],"sourcesContent":["import type { TableFilterCellProps } from '@servicetitan/design-system';\nimport { Checkbox } from '@servicetitan/design-system';\nimport type { FormEvent } from 'react';\nimport { Component, Fragment } from 'react';\n\nimport { observer } from 'mobx-react';\nimport { observable, computed, runInAction, action, makeObservable } from 'mobx';\n\nimport type { InputChangeEvent } from '@progress/kendo-react-inputs';\nimport { Input } from '@progress/kendo-react-inputs';\n\nimport type { DataSource, IdType } from '@servicetitan/data-query';\nimport { TableState } from '../table-state';\nimport { renderCustomColumnMenuFilter } from './column-menu-filters';\n\nexport function operator<T>(item: T, value: T[]) {\n return value.includes(item);\n}\n\nexport function fieldValuesColumnMenuFilter<T, TId extends IdType = never>(\n tableState: TableState<T, TId>,\n renderItem: (value: T[keyof T]) => string = defaultRenderItem\n) {\n interface Data {\n value: T[keyof T];\n text: string;\n }\n @observer\n class FieldValuesFilterCell extends Component<TableFilterCellProps> {\n @observable data: Data[] = [];\n\n @observable searchQuery = '';\n\n @computed get processedData() {\n const searchQuery = this.searchQuery.toLowerCase();\n\n const filteredData = !searchQuery\n ? this.data\n : this.data.filter(v => v.text.toLowerCase().includes(searchQuery));\n\n return filteredData.slice().sort((a, b) => {\n if (a.text === b.text) {\n return 0;\n }\n\n return a.text < b.text ? -1 : 1;\n });\n }\n\n get field() {\n const field = this.props.field;\n\n if (field === undefined) {\n throw 'missing field';\n }\n\n return field as keyof T;\n }\n\n get value(): T[keyof T][] {\n return this.props.value || [];\n }\n\n constructor(props: TableFilterCellProps) {\n super(props);\n makeObservable(this);\n }\n\n @action\n handleSearchQueryChange = (ev: InputChangeEvent) => {\n if (typeof ev.target.value === 'string') {\n this.searchQuery = ev.target.value;\n }\n };\n\n componentDidMount() {\n this.fetchData(tableState.dataSource);\n }\n\n handleChange = (value: Data, checked: boolean, ev: FormEvent<HTMLInputElement>) => {\n const newFilterValue = checked\n ? this.value.concat(value.value)\n : this.value.filter((v: T[keyof T]) => v !== value.value);\n\n const hasValue = newFilterValue.length > 0;\n\n this.props.onChange({\n value: hasValue ? newFilterValue : '',\n operator: hasValue ? operator : '',\n syntheticEvent: ev,\n });\n };\n\n render() {\n return (\n <Fragment>\n <Input\n value={this.searchQuery}\n onChange={this.handleSearchQueryChange}\n placeholder=\"Search\"\n className=\"m-b-1\"\n />\n\n {this.processedData.map(item => (\n <span key={JSON.stringify(item)} className=\"k-widget d-b m-b-1\">\n <Checkbox\n label={item.text}\n checked={this.value.includes(item.value)}\n onChange={this.handleChange}\n value={item}\n />\n </span>\n ))}\n </Fragment>\n );\n }\n\n private async fetchData(dataSource: DataSource<T, TId> | null) {\n if (!dataSource) {\n return;\n }\n\n const items = (await dataSource.getData({})).data as T[];\n\n const values = items.map(i => i[this.field]);\n\n const distinctValues = values.filter((v, idx) => values.indexOf(v) === idx);\n\n runInAction(() => {\n this.data = distinctValues.map(value => ({ value, text: renderItem(value) }));\n });\n }\n }\n\n return renderCustomColumnMenuFilter(FieldValuesFilterCell);\n}\n\nfunction defaultRenderItem(v: any): string {\n if (v == null) {\n return '';\n }\n\n // suppose v has toString();\n return v.toString();\n}\n"],"names":["Checkbox","Component","Fragment","observer","observable","computed","runInAction","action","makeObservable","Input","renderCustomColumnMenuFilter","operator","item","value","includes","fieldValuesColumnMenuFilter","tableState","renderItem","defaultRenderItem","FieldValuesFilterCell","processedData","searchQuery","toLowerCase","filteredData","data","filter","v","text","slice","sort","a","b","field","props","undefined","componentDidMount","fetchData","dataSource","render","onChange","handleSearchQueryChange","placeholder","className","map","span","label","checked","handleChange","JSON","stringify","items","getData","values","i","distinctValues","idx","indexOf","ev","target","newFilterValue","concat","hasValue","length","syntheticEvent","toString"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/filters/multiselect-filter/multiselect-filter.tsx"],"sourcesContent":["import type { SyntheticEvent, ReactNode, FC } from 'react';\nimport { Component } from 'react';\n\nimport type { TableFilterCellProps } from '@servicetitan/design-system';\nimport { Checkbox } from '@servicetitan/design-system';\n\nimport type { CustomColumnMenuFilterSingleOpts } from '../column-menu-filters';\nimport { renderCustomColumnMenuFilter } from '../column-menu-filters';\n\ninterface SelectorProps<T> {\n options: T[];\n value?: T[];\n onChange(value: T[] | undefined, event: SyntheticEvent<HTMLInputElement>): void;\n renderer?(item: T): ReactNode;\n}\n\nclass Selector<T> extends Component<SelectorProps<T>> {\n handleChange = (option: T, checked: boolean, event: SyntheticEvent<HTMLInputElement>) => {\n const newValue = checked\n ? (this.props.value ?? []).concat(option)\n : (this.props.value ?? []).filter(v => v !== option);\n\n this.props.onChange(newValue.length ? newValue : undefined, event);\n };\n\n render() {\n const { options, value, renderer } = this.props;\n\n return options.map((option, index) => (\n // eslint-disable-next-line react/no-array-index-key\n <span key={index} className=\"k-widget m-b-1-i d-b\">\n <Checkbox\n value={option}\n label={renderer ? renderer(option) : option}\n checked={(value ?? []).includes(option)}\n onChange={this.handleChange}\n />\n </span>\n ));\n }\n}\n\nexport function multiSelectColumnMenuFilter<T>(\n data: T[],\n renderItem?: (item: T) => ReactNode,\n opts?: CustomColumnMenuFilterSingleOpts\n) {\n const FilterCell: FC<TableFilterCellProps> = ({ value, onChange }) => {\n const handleChange = (value: T[] | undefined, event: SyntheticEvent<HTMLInputElement>) => {\n onChange({\n value: value ?? '',\n operator: value ? 'in' : '',\n syntheticEvent: event,\n });\n };\n\n return (\n <Selector\n options={data}\n value={value === '' ? undefined : value}\n onChange={handleChange}\n renderer={renderItem}\n />\n );\n };\n\n return renderCustomColumnMenuFilter(FilterCell, opts);\n}\n\nexport function complexItemMultiSelectColumnMenuFilter<T>(\n data: T[],\n renderItem?: (item: T) => ReactNode,\n opts?: CustomColumnMenuFilterSingleOpts\n) {\n class FilterCell extends Component<TableFilterCellProps> {\n contains = (item: any) => {\n const value: T[] = this.props.value || [];\n\n return value.some((v: T) => item[v] === true);\n };\n\n handleChange = (value: T[] | undefined, event: SyntheticEvent<HTMLInputElement>) => {\n this.props.onChange({\n value: value ?? '',\n operator: value ? this.contains : '',\n syntheticEvent: event,\n });\n };\n\n render() {\n const { value } = this.props;\n\n return (\n <Selector\n options={data}\n value={value === '' ? undefined : value}\n onChange={this.handleChange}\n renderer={renderItem}\n />\n );\n }\n }\n\n return renderCustomColumnMenuFilter(FilterCell, opts);\n}\n\nexport function multiItemMultiSelectColumnMenuFilter<T>(\n data: T[],\n renderItem?: (item: T) => ReactNode,\n opts?: CustomColumnMenuFilterSingleOpts\n) {\n class FilterCell extends Component<TableFilterCellProps> {\n contains = (item: any) => {\n const value: T[] = this.props.value || [];\n\n return value.some((v: T) => Array.isArray(item) && item.includes(v));\n };\n\n handleChange = (value: T[] | undefined, event: SyntheticEvent<HTMLInputElement>) => {\n this.props.onChange({\n value: value ?? '',\n operator: value ? this.contains : '',\n syntheticEvent: event,\n });\n };\n\n render() {\n const { value } = this.props;\n\n return (\n <Selector\n options={data}\n value={value === '' ? undefined : value}\n onChange={this.handleChange}\n renderer={renderItem}\n />\n );\n }\n }\n\n return renderCustomColumnMenuFilter(FilterCell, opts);\n}\n"],"names":["Component","Checkbox","renderCustomColumnMenuFilter","Selector","render","options","value","renderer","props","map","option","index","span","className","label","checked","includes","onChange","handleChange","event","newValue","concat","filter","v","length","undefined","multiSelectColumnMenuFilter","data","renderItem","opts","FilterCell","operator","syntheticEvent","complexItemMultiSelectColumnMenuFilter","contains","item","some","multiItemMultiSelectColumnMenuFilter","Array","isArray"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../src/filters/multiselect-filter/multiselect-filter.tsx"],"sourcesContent":["import type { SyntheticEvent, ReactNode, FC } from 'react';\nimport { Component } from 'react';\n\nimport type { TableFilterCellProps } from '@servicetitan/design-system';\nimport { Checkbox } from '@servicetitan/design-system';\n\nimport type { CustomColumnMenuFilterSingleOpts } from '../column-menu-filters';\nimport { renderCustomColumnMenuFilter } from '../column-menu-filters';\n\ninterface SelectorProps<T> {\n options: T[];\n value?: T[];\n onChange(value: T[] | undefined, event: SyntheticEvent<HTMLInputElement>): void;\n renderer?(item: T): ReactNode;\n}\n\nclass Selector<T> extends Component<SelectorProps<T>> {\n handleChange = (option: T, checked: boolean, event: SyntheticEvent<HTMLInputElement>) => {\n const newValue = checked\n ? (this.props.value ?? []).concat(option)\n : (this.props.value ?? []).filter(v => v !== option);\n\n this.props.onChange(newValue.length ? newValue : undefined, event);\n };\n\n render() {\n const { options, value, renderer } = this.props;\n\n return options.map((option, index) => (\n // eslint-disable-next-line react/no-array-index-key\n <span key={index} className=\"k-widget m-b-1-i d-b\">\n <Checkbox\n value={option}\n label={renderer ? renderer(option) : option}\n checked={(value ?? []).includes(option)}\n onChange={this.handleChange}\n />\n </span>\n ));\n }\n}\n\nexport function multiSelectColumnMenuFilter<T>(\n data: T[],\n renderItem?: (item: T) => ReactNode,\n opts?: CustomColumnMenuFilterSingleOpts\n) {\n const FilterCell: FC<TableFilterCellProps> = ({ value, onChange }) => {\n const handleChange = (value: T[] | undefined, event: SyntheticEvent<HTMLInputElement>) => {\n onChange({\n value: value ?? '',\n operator: value ? 'in' : '',\n syntheticEvent: event,\n });\n };\n\n return (\n <Selector\n options={data}\n value={value === '' ? undefined : value}\n onChange={handleChange}\n renderer={renderItem}\n />\n );\n };\n\n return renderCustomColumnMenuFilter(FilterCell, opts);\n}\n\nexport function complexItemMultiSelectColumnMenuFilter<T>(\n data: T[],\n renderItem?: (item: T) => ReactNode,\n opts?: CustomColumnMenuFilterSingleOpts\n) {\n class FilterCell extends Component<TableFilterCellProps> {\n contains = (item: any) => {\n const value: T[] = this.props.value || [];\n\n return value.some((v: T) => item[v] === true);\n };\n\n handleChange = (value: T[] | undefined, event: SyntheticEvent<HTMLInputElement>) => {\n this.props.onChange({\n value: value ?? '',\n operator: value ? this.contains : '',\n syntheticEvent: event,\n });\n };\n\n render() {\n const { value } = this.props;\n\n return (\n <Selector\n options={data}\n value={value === '' ? undefined : value}\n onChange={this.handleChange}\n renderer={renderItem}\n />\n );\n }\n }\n\n return renderCustomColumnMenuFilter(FilterCell, opts);\n}\n\nexport function multiItemMultiSelectColumnMenuFilter<T>(\n data: T[],\n renderItem?: (item: T) => ReactNode,\n opts?: CustomColumnMenuFilterSingleOpts\n) {\n class FilterCell extends Component<TableFilterCellProps> {\n contains = (item: any) => {\n const value: T[] = this.props.value || [];\n\n return value.some((v: T) => Array.isArray(item) && item.includes(v));\n };\n\n handleChange = (value: T[] | undefined, event: SyntheticEvent<HTMLInputElement>) => {\n this.props.onChange({\n value: value ?? '',\n operator: value ? this.contains : '',\n syntheticEvent: event,\n });\n };\n\n render() {\n const { value } = this.props;\n\n return (\n <Selector\n options={data}\n value={value === '' ? undefined : value}\n onChange={this.handleChange}\n renderer={renderItem}\n />\n );\n }\n }\n\n return renderCustomColumnMenuFilter(FilterCell, opts);\n}\n"],"names":["Component","Checkbox","renderCustomColumnMenuFilter","Selector","render","options","value","renderer","props","map","option","index","span","className","label","checked","includes","onChange","handleChange","event","newValue","concat","filter","v","length","undefined","multiSelectColumnMenuFilter","data","renderItem","opts","FilterCell","operator","syntheticEvent","complexItemMultiSelectColumnMenuFilter","contains","item","some","multiItemMultiSelectColumnMenuFilter","Array","isArray"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/filters/range-filter/range-filter.tsx"],"sourcesContent":["import type { ComponentType, FC } from 'react';\nimport { useState, useEffect, Component, Fragment } from 'react';\nimport { DatePicker, TimePicker } from '@progress/kendo-react-dateinputs';\nimport type { TableFilterCellProps } from '@servicetitan/design-system';\nimport type { NumericTextBoxProps } from '@progress/kendo-react-inputs';\nimport { NumericTextBox } from '@progress/kendo-react-inputs';\nimport moment from 'moment';\n\nimport { renderCustomColumnMenuFilter } from '../column-menu-filters';\n\n// TODO: remove when Kendo fix the propType bug of DatePicker\ntype ComponentClassWithBrokenPropTypes<P> = ComponentType<P> & { defaultProps?: any };\n\ninterface Range<T> {\n min: T;\n max: T;\n}\n\ninterface BaseControlProps<T> {\n value?: T | null;\n width?: number | string;\n onChange?: (ev: any) => void;\n}\n\ntype RangeControlProps<T, TProps> = BaseControlProps<T> & TProps;\n\ntype RangeControl<T, TProps> = Component<RangeControlProps<T, TProps>> & { value: T | null };\n\nconst NoSSR: FC<{ children: JSX.Element }> = ({ children }) => {\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n return isMounted ? children : null;\n};\n\nclass RangeFilterCellBase<T, TProps = void> extends Component<TableFilterCellProps> {\n private minValueBox: RangeControl<T, TProps> | null = null;\n private maxValueBox: RangeControl<T, TProps> | null = null;\n\n constructor(\n props: TableFilterCellProps,\n private controlClass: ComponentClassWithBrokenPropTypes<RangeControlProps<T, TProps>>,\n private controlProps: TProps = {} as any\n ) {\n super(props);\n }\n\n /** override this if additional type support needed */\n inRange(current: T, values: Range<T>) {\n return (\n (values.min === null || values.min === undefined || current >= values.min) &&\n (values.max === null || values.max === undefined || current <= values.max)\n );\n }\n\n onChange = (ev: any) => {\n if (!this.minValueBox || !this.maxValueBox) {\n return;\n }\n this.props.onChange({\n value: { min: this.minValueBox.value, max: this.maxValueBox.value },\n operator: this.inRange,\n syntheticEvent: ev.syntheticEvent,\n });\n };\n\n render() {\n const filterValue = this.props.value;\n const Control = this.controlClass;\n return (\n <Fragment>\n <span className=\"k-widget m-b-1 d-b\">From:</span>\n <span>\n {/* KendoNumericTextBox uses useLayoutEffect which is incompatible with SSR */}\n <NoSSR>\n <Control\n {...this.controlProps}\n value={filterValue?.min}\n ref={this.setMinValueRef}\n onChange={this.onChange}\n />\n </NoSSR>\n </span>\n <span className=\"k-widget m-t-1 m-b-1 d-b\">To:</span>\n <span>\n {/* KendoNumericTextBox uses useLayoutEffect which is incompatible with SSR */}\n <NoSSR>\n <Control\n {...this.controlProps}\n value={filterValue?.max}\n ref={this.setMaxValueRef}\n onChange={this.onChange}\n />\n </NoSSR>\n </span>\n </Fragment>\n );\n }\n\n protected setMinValueRef = (el: RangeControl<T, TProps> | null) => {\n this.minValueBox = el;\n };\n\n protected setMaxValueRef = (el: RangeControl<T, TProps> | null) => {\n this.maxValueBox = el;\n };\n}\n\nclass NumericRangeFilterCell extends RangeFilterCellBase<number> {\n constructor(props: TableFilterCellProps) {\n super(props, NumericTextBox);\n }\n}\n\nclass CurrencyRangeFilterCell extends RangeFilterCellBase<number, NumericTextBoxProps> {\n constructor(props: TableFilterCellProps) {\n super(props, NumericTextBox, {\n format: 'c',\n });\n }\n}\n\nclass DateRangeFilterCell extends RangeFilterCellBase<Date> {\n constructor(props: TableFilterCellProps) {\n super(props, DatePicker);\n }\n}\n\nfunction getTimeString(date: Date) {\n return `${date.getHours()}:${date.getMinutes()}`;\n}\n\nclass TimeRangeFilterCell extends RangeFilterCellBase<Date> {\n constructor(props: TableFilterCellProps) {\n super(props, TimePicker);\n }\n\n inRange(current: Date, values: Range<Date>) {\n return moment(getTimeString(current), 'h:mma').isBetween(\n moment(getTimeString(values.min || current), 'h:mma'),\n moment(getTimeString(values.max || current), 'h:mma'),\n 'minutes',\n '[]'\n );\n }\n}\n\nexport const NumericRangeColumnMenuFilter = renderCustomColumnMenuFilter(NumericRangeFilterCell);\nexport const CurrencyRangeColumnMenuFilter = renderCustomColumnMenuFilter(CurrencyRangeFilterCell);\nexport const DateRangeColumnMenuFilter = renderCustomColumnMenuFilter(DateRangeFilterCell);\nexport const TimeRangeColumnMenuFilter = renderCustomColumnMenuFilter(TimeRangeFilterCell);\n"],"names":["useState","useEffect","Component","Fragment","DatePicker","TimePicker","NumericTextBox","moment","renderCustomColumnMenuFilter","NoSSR","children","isMounted","setIsMounted","RangeFilterCellBase","inRange","current","values","min","undefined","max","render","filterValue","props","value","Control","controlClass","span","className","controlProps","ref","setMinValueRef","onChange","setMaxValueRef","minValueBox","maxValueBox","ev","operator","syntheticEvent","el","NumericRangeFilterCell","CurrencyRangeFilterCell","format","DateRangeFilterCell","getTimeString","date","getHours","getMinutes","TimeRangeFilterCell","isBetween","NumericRangeColumnMenuFilter","CurrencyRangeColumnMenuFilter","DateRangeColumnMenuFilter","TimeRangeColumnMenuFilter"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../src/filters/range-filter/range-filter.tsx"],"sourcesContent":["import type { ComponentType, FC } from 'react';\nimport { useState, useEffect, Component, Fragment } from 'react';\nimport { DatePicker, TimePicker } from '@progress/kendo-react-dateinputs';\nimport type { TableFilterCellProps } from '@servicetitan/design-system';\nimport type { NumericTextBoxProps } from '@progress/kendo-react-inputs';\nimport { NumericTextBox } from '@progress/kendo-react-inputs';\nimport moment from 'moment';\n\nimport { renderCustomColumnMenuFilter } from '../column-menu-filters';\n\n// TODO: remove when Kendo fix the propType bug of DatePicker\ntype ComponentClassWithBrokenPropTypes<P> = ComponentType<P> & { defaultProps?: any };\n\ninterface Range<T> {\n min: T;\n max: T;\n}\n\ninterface BaseControlProps<T> {\n value?: T | null;\n width?: number | string;\n onChange?: (ev: any) => void;\n}\n\ntype RangeControlProps<T, TProps> = BaseControlProps<T> & TProps;\n\ntype RangeControl<T, TProps> = Component<RangeControlProps<T, TProps>> & { value: T | null };\n\nconst NoSSR: FC<{ children: JSX.Element }> = ({ children }) => {\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n return isMounted ? children : null;\n};\n\nclass RangeFilterCellBase<T, TProps = void> extends Component<TableFilterCellProps> {\n private minValueBox: RangeControl<T, TProps> | null = null;\n private maxValueBox: RangeControl<T, TProps> | null = null;\n\n constructor(\n props: TableFilterCellProps,\n private controlClass: ComponentClassWithBrokenPropTypes<RangeControlProps<T, TProps>>,\n private controlProps: TProps = {} as any\n ) {\n super(props);\n }\n\n /** override this if additional type support needed */\n inRange(current: T, values: Range<T>) {\n return (\n (values.min === null || values.min === undefined || current >= values.min) &&\n (values.max === null || values.max === undefined || current <= values.max)\n );\n }\n\n onChange = (ev: any) => {\n if (!this.minValueBox || !this.maxValueBox) {\n return;\n }\n this.props.onChange({\n value: { min: this.minValueBox.value, max: this.maxValueBox.value },\n operator: this.inRange,\n syntheticEvent: ev.syntheticEvent,\n });\n };\n\n render() {\n const filterValue = this.props.value;\n const Control = this.controlClass;\n return (\n <Fragment>\n <span className=\"k-widget m-b-1 d-b\">From:</span>\n <span>\n {/* KendoNumericTextBox uses useLayoutEffect which is incompatible with SSR */}\n <NoSSR>\n <Control\n {...this.controlProps}\n value={filterValue?.min}\n ref={this.setMinValueRef}\n onChange={this.onChange}\n />\n </NoSSR>\n </span>\n <span className=\"k-widget m-t-1 m-b-1 d-b\">To:</span>\n <span>\n {/* KendoNumericTextBox uses useLayoutEffect which is incompatible with SSR */}\n <NoSSR>\n <Control\n {...this.controlProps}\n value={filterValue?.max}\n ref={this.setMaxValueRef}\n onChange={this.onChange}\n />\n </NoSSR>\n </span>\n </Fragment>\n );\n }\n\n protected setMinValueRef = (el: RangeControl<T, TProps> | null) => {\n this.minValueBox = el;\n };\n\n protected setMaxValueRef = (el: RangeControl<T, TProps> | null) => {\n this.maxValueBox = el;\n };\n}\n\nclass NumericRangeFilterCell extends RangeFilterCellBase<number> {\n constructor(props: TableFilterCellProps) {\n super(props, NumericTextBox);\n }\n}\n\nclass CurrencyRangeFilterCell extends RangeFilterCellBase<number, NumericTextBoxProps> {\n constructor(props: TableFilterCellProps) {\n super(props, NumericTextBox, {\n format: 'c',\n });\n }\n}\n\nclass DateRangeFilterCell extends RangeFilterCellBase<Date> {\n constructor(props: TableFilterCellProps) {\n super(props, DatePicker);\n }\n}\n\nfunction getTimeString(date: Date) {\n return `${date.getHours()}:${date.getMinutes()}`;\n}\n\nclass TimeRangeFilterCell extends RangeFilterCellBase<Date> {\n constructor(props: TableFilterCellProps) {\n super(props, TimePicker);\n }\n\n inRange(current: Date, values: Range<Date>) {\n return moment(getTimeString(current), 'h:mma').isBetween(\n moment(getTimeString(values.min || current), 'h:mma'),\n moment(getTimeString(values.max || current), 'h:mma'),\n 'minutes',\n '[]'\n );\n }\n}\n\nexport const NumericRangeColumnMenuFilter = renderCustomColumnMenuFilter(NumericRangeFilterCell);\nexport const CurrencyRangeColumnMenuFilter = renderCustomColumnMenuFilter(CurrencyRangeFilterCell);\nexport const DateRangeColumnMenuFilter = renderCustomColumnMenuFilter(DateRangeFilterCell);\nexport const TimeRangeColumnMenuFilter = renderCustomColumnMenuFilter(TimeRangeFilterCell);\n"],"names":["useState","useEffect","Component","Fragment","DatePicker","TimePicker","NumericTextBox","moment","renderCustomColumnMenuFilter","NoSSR","children","isMounted","setIsMounted","RangeFilterCellBase","inRange","current","values","min","undefined","max","render","filterValue","props","value","Control","controlClass","span","className","controlProps","ref","setMinValueRef","onChange","setMaxValueRef","minValueBox","maxValueBox","ev","operator","syntheticEvent","el","NumericRangeFilterCell","CurrencyRangeFilterCell","format","DateRangeFilterCell","getTimeString","date","getHours","getMinutes","TimeRangeFilterCell","isBetween","NumericRangeColumnMenuFilter","CurrencyRangeColumnMenuFilter","DateRangeColumnMenuFilter","TimeRangeColumnMenuFilter"],"mappings":"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"}
|
|
@@ -6,19 +6,26 @@ function _define_property(obj, key, value) {
|
|
|
6
6
|
configurable: true,
|
|
7
7
|
writable: true
|
|
8
8
|
});
|
|
9
|
-
} else
|
|
10
|
-
obj[key] = value;
|
|
11
|
-
}
|
|
9
|
+
} else obj[key] = value;
|
|
12
10
|
return obj;
|
|
13
11
|
}
|
|
14
12
|
function _ts_decorate(decorators, target, key, desc) {
|
|
15
13
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
16
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
17
|
-
|
|
14
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
|
|
15
|
+
r = Reflect.decorate(decorators, target, key, desc);
|
|
16
|
+
} else {
|
|
17
|
+
for(var i = decorators.length - 1; i >= 0; i--){
|
|
18
|
+
if (d = decorators[i]) {
|
|
19
|
+
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
18
23
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
19
24
|
}
|
|
20
|
-
function _ts_metadata(
|
|
21
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
|
|
25
|
+
function _ts_metadata(metadataKey, metadataValue) {
|
|
26
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
|
|
27
|
+
return Reflect.metadata(metadataKey, metadataValue);
|
|
28
|
+
}
|
|
22
29
|
}
|
|
23
30
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
24
31
|
import { Component, Fragment } from 'react';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/filters/select-filter/select-filter.tsx"],"sourcesContent":["import type { SyntheticEvent, ReactNode, KeyboardEvent, FC } from 'react';\nimport { Component, Fragment } from 'react';\n\nimport type { TableFilterCellProps } from '@servicetitan/design-system';\nimport { Checkbox, Radio, Input, Spinner, BodyText } from '@servicetitan/design-system';\nimport type { IdType } from '@servicetitan/data-query';\n\nimport type { CustomColumnMenuFilterSingleOpts } from '../column-menu-filters';\nimport { renderCustomColumnMenuFilter } from '../column-menu-filters';\nimport { makeObservable, observable, runInAction, toJS } from 'mobx';\nimport { observer } from 'mobx-react';\nimport { getSimpleValue } from './value-getter';\nimport { objectSearch } from './object-search';\nimport { selectColumnMenuFilterOperators } from './operators';\n\nexport type SelectFilterDataFetcher<TO> = (opts: { search?: string }) => Promise<{ data: TO[] }>;\n\nexport interface SelectFilterSearchOptions<TO = any> {\n placeholder?: string;\n filter(search: string): (item: TO) => boolean | undefined;\n}\n\ninterface SelectorProps<TO> {\n search?: SelectFilterSearchOptions<TO>;\n selected: TO[];\n data?: TO[];\n dataFetcher?: SelectFilterDataFetcher<TO>;\n itemComponent: FC<SelectorItemProps<TO>>;\n onChange(option: TO, checked: boolean, event: SyntheticEvent<HTMLInputElement>): void;\n valueSelector(item: TO): IdType;\n renderItem(item: TO): ReactNode;\n}\n\ninterface SelectorItemProps<TO> {\n option: TO;\n checked: boolean;\n onChange(option: TO, checked: boolean, event: SyntheticEvent<HTMLInputElement>): void;\n renderer?(item: TO): ReactNode;\n}\n\n@observer\nclass SelectorAsync<TO> extends Component<SelectorProps<TO>> {\n @observable shownOptions: TO[] = [];\n @observable search = '';\n @observable error = false;\n @observable loading = false;\n\n constructor(props: SelectorProps<TO>) {\n super(props);\n makeObservable(this);\n }\n\n componentDidMount() {\n this.searchOptions().catch();\n }\n\n handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n event.stopPropagation();\n }\n };\n\n handleSearch = (_0: SyntheticEvent<HTMLInputElement>, data: { value: string }) => {\n runInAction(() => (this.search = data.value));\n this.searchOptions().catch();\n };\n\n searchOptions = async () => {\n if (this.props.dataFetcher) {\n runInAction(() => {\n this.loading = true;\n });\n }\n\n try {\n const data = await this.getData();\n\n runInAction(() => {\n this.shownOptions = data;\n this.error = false;\n this.loading = false;\n });\n } catch {\n runInAction(() => {\n this.error = true;\n this.loading = false;\n });\n }\n };\n\n render() {\n const selectedOptions = this.props.selected;\n const selected = new Set(selectedOptions.map(opt => this.props.valueSelector(opt)));\n const ItemComponent = this.props.itemComponent;\n\n return (\n <Fragment>\n {!!this.props.search && (\n <Input\n className=\"m-x-half m-t-half m-b-2\"\n placeholder={this.props.search?.placeholder}\n onChange={this.handleSearch}\n onKeyDown={this.handleKeyDown}\n size=\"xsmall\"\n value={this.search}\n />\n )}\n <div className=\"p-x-half position-relative\" onKeyDown={this.handleKeyDown}>\n {!!selectedOptions.length && (\n <div className=\"border-bottom m-y-half\">\n {selectedOptions.map((option, index) => (\n <ItemComponent\n key={this.getItemKey(option, index)}\n option={option}\n checked\n renderer={this.props.renderItem}\n onChange={this.props.onChange}\n />\n ))}\n </div>\n )}\n {this.error ? (\n <BodyText className=\"c-red-500\">Unable to load options</BodyText>\n ) : this.shownOptions.length ? (\n this.shownOptions\n .filter(opt => !selected.has(this.props.valueSelector(opt)))\n .map((option, index) => (\n <ItemComponent\n key={this.getItemKey(option, index)}\n option={option}\n checked={false}\n renderer={this.props.renderItem}\n onChange={this.props.onChange}\n />\n ))\n ) : this.loading ? (\n <BodyText> </BodyText>\n ) : (\n <BodyText subdued>No options match search criteria</BodyText>\n )}\n\n {this.loading && (\n <div className=\"position-absolute top-0 bottom-0 left-0 right-0 opacity-disabled bg-white d-f justify-content-center\">\n <Spinner size=\"tiny\" />\n </div>\n )}\n </div>\n </Fragment>\n );\n }\n\n private async getData(): Promise<TO[]> {\n if (this.props.dataFetcher) {\n const { data } = await this.props.dataFetcher({\n search: this.search,\n });\n\n return data;\n }\n\n let data = this.props.data ?? [];\n\n if (this.props.search?.filter) {\n data = data.filter(this.props.search.filter(this.search));\n }\n return data;\n }\n\n private getItemKey = (item: TO, index: number) => {\n return `${index}__${this.props.valueSelector(item)}`;\n };\n}\n\nconst SelectorItemSingle: FC<SelectorItemProps<any>> = ({\n option,\n renderer,\n checked,\n onChange,\n}) => (\n <Radio\n label={renderer?.(option) ?? `${option}`}\n checked={checked}\n onChange={(_, event) => onChange(option, true, event)}\n className=\"m-b-1\"\n />\n);\n\nconst SelectorItemMultiple: FC<SelectorItemProps<any>> = ({\n option,\n renderer,\n checked,\n onChange,\n}) => (\n <Checkbox\n label={renderer?.(option) ?? `${option}`}\n checked={checked}\n onChange={(_, checked, event) => onChange(option, checked, event)}\n className=\"m-b-1\"\n />\n);\n\nexport interface SelectFilterOptions<TO> extends CustomColumnMenuFilterSingleOpts {\n /** Can select multiple options in filter */\n multiple?: boolean;\n /** Ability to search options in filter */\n search?: boolean | Partial<SelectFilterSearchOptions>;\n /** Static options to show in filter */\n data?: TO[];\n /** Method to fetch filter options asynchronously */\n dataFetcher?: SelectFilterDataFetcher<TO>;\n /** Search operator passed to table state */\n operator?: ((value: any, options?: TO[]) => boolean) | ((value: any, options?: TO) => boolean);\n /** Select item value (ex id) for complex items */\n valueSelector?(item: TO): IdType;\n /** Select row item value (from table source row field) for complex items */\n rowValueSelector?(item: any): IdType | undefined;\n /** Render option label */\n renderItem?(item: TO): ReactNode;\n}\n\ninterface TableFilterCellPropsTyped<T = any> extends Omit<TableFilterCellProps, 'value'> {\n value?: T;\n}\n\nexport function selectColumnMenuFilter<TO>({\n dataFetcher,\n data,\n search,\n multiple,\n valueSelector = getSimpleValue,\n rowValueSelector = getSimpleValue,\n renderItem,\n operator,\n ...opts\n}: SelectFilterOptions<TO>) {\n const renderer = renderItem ?? (item => valueSelector(item));\n\n const searchOptions = search\n ? {\n filter: objectSearch,\n ...(typeof search === 'boolean' ? {} : search),\n }\n : undefined;\n\n if (multiple) {\n const FilterCell = ({ value, onChange }: TableFilterCellPropsTyped<TO[]>) => {\n const handleChange = (\n option: TO,\n checked: boolean,\n event: SyntheticEvent<HTMLInputElement>\n ) => {\n const val = checked\n ? (value ?? []).concat(option)\n : (value ?? []).filter(opt =>\n valueSelector\n ? valueSelector(opt) !== valueSelector(option)\n : option !== opt\n );\n\n onChange({\n value: val.length ? toJS(val) : undefined,\n operator: val.length\n ? (operator ??\n selectColumnMenuFilterOperators.getContains({\n valueSelector,\n rowValueSelector,\n }))\n : '',\n syntheticEvent: event,\n });\n };\n\n return (\n <SelectorAsync\n selected={value ?? []}\n itemComponent={SelectorItemMultiple}\n onChange={handleChange}\n search={searchOptions}\n renderItem={renderer}\n dataFetcher={dataFetcher}\n data={data}\n valueSelector={valueSelector}\n />\n );\n };\n\n return renderCustomColumnMenuFilter(FilterCell, opts);\n }\n\n const FilterCell = ({ value, onChange }: TableFilterCellPropsTyped<TO>) => {\n const handleChange = (option: TO, _: boolean, event: SyntheticEvent<HTMLInputElement>) => {\n onChange({\n value: toJS(option),\n operator:\n operator ??\n selectColumnMenuFilterOperators.getEquals({ valueSelector, rowValueSelector }),\n syntheticEvent: event,\n });\n };\n\n return (\n <SelectorAsync\n selected={value ? [value] : []}\n onChange={handleChange}\n itemComponent={SelectorItemSingle}\n search={searchOptions}\n renderItem={renderer}\n dataFetcher={dataFetcher}\n data={data}\n valueSelector={valueSelector}\n />\n );\n };\n\n return renderCustomColumnMenuFilter(FilterCell, opts);\n}\n\nexport { selectColumnMenuFilterOperators };\n"],"names":["Component","Fragment","Checkbox","Radio","Input","Spinner","BodyText","renderCustomColumnMenuFilter","makeObservable","observable","runInAction","toJS","observer","getSimpleValue","objectSearch","selectColumnMenuFilterOperators","SelectorAsync","componentDidMount","searchOptions","catch","render","selectedOptions","props","selected","Set","map","opt","valueSelector","ItemComponent","itemComponent","search","className","placeholder","onChange","handleSearch","onKeyDown","handleKeyDown","size","value","div","length","option","index","checked","renderer","renderItem","getItemKey","error","shownOptions","filter","has","loading","subdued","getData","dataFetcher","data","event","key","stopPropagation","_0","item","SelectorItemSingle","label","_","SelectorItemMultiple","selectColumnMenuFilter","multiple","rowValueSelector","operator","opts","undefined","FilterCell","handleChange","val","concat","getContains","syntheticEvent","getEquals"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/filters/select-filter/select-filter.tsx"],"sourcesContent":["import type { SyntheticEvent, ReactNode, KeyboardEvent, FC } from 'react';\nimport { Component, Fragment } from 'react';\n\nimport type { TableFilterCellProps } from '@servicetitan/design-system';\nimport { Checkbox, Radio, Input, Spinner, BodyText } from '@servicetitan/design-system';\nimport type { IdType } from '@servicetitan/data-query';\n\nimport type { CustomColumnMenuFilterSingleOpts } from '../column-menu-filters';\nimport { renderCustomColumnMenuFilter } from '../column-menu-filters';\nimport { makeObservable, observable, runInAction, toJS } from 'mobx';\nimport { observer } from 'mobx-react';\nimport { getSimpleValue } from './value-getter';\nimport { objectSearch } from './object-search';\nimport { selectColumnMenuFilterOperators } from './operators';\n\nexport type SelectFilterDataFetcher<TO> = (opts: { search?: string }) => Promise<{ data: TO[] }>;\n\nexport interface SelectFilterSearchOptions<TO = any> {\n placeholder?: string;\n filter(search: string): (item: TO) => boolean | undefined;\n}\n\ninterface SelectorProps<TO> {\n search?: SelectFilterSearchOptions<TO>;\n selected: TO[];\n data?: TO[];\n dataFetcher?: SelectFilterDataFetcher<TO>;\n itemComponent: FC<SelectorItemProps<TO>>;\n onChange(option: TO, checked: boolean, event: SyntheticEvent<HTMLInputElement>): void;\n valueSelector(item: TO): IdType;\n renderItem(item: TO): ReactNode;\n}\n\ninterface SelectorItemProps<TO> {\n option: TO;\n checked: boolean;\n onChange(option: TO, checked: boolean, event: SyntheticEvent<HTMLInputElement>): void;\n renderer?(item: TO): ReactNode;\n}\n\n@observer\nclass SelectorAsync<TO> extends Component<SelectorProps<TO>> {\n @observable shownOptions: TO[] = [];\n @observable search = '';\n @observable error = false;\n @observable loading = false;\n\n constructor(props: SelectorProps<TO>) {\n super(props);\n makeObservable(this);\n }\n\n componentDidMount() {\n this.searchOptions().catch();\n }\n\n handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n event.stopPropagation();\n }\n };\n\n handleSearch = (_0: SyntheticEvent<HTMLInputElement>, data: { value: string }) => {\n runInAction(() => (this.search = data.value));\n this.searchOptions().catch();\n };\n\n searchOptions = async () => {\n if (this.props.dataFetcher) {\n runInAction(() => {\n this.loading = true;\n });\n }\n\n try {\n const data = await this.getData();\n\n runInAction(() => {\n this.shownOptions = data;\n this.error = false;\n this.loading = false;\n });\n } catch {\n runInAction(() => {\n this.error = true;\n this.loading = false;\n });\n }\n };\n\n render() {\n const selectedOptions = this.props.selected;\n const selected = new Set(selectedOptions.map(opt => this.props.valueSelector(opt)));\n const ItemComponent = this.props.itemComponent;\n\n return (\n <Fragment>\n {!!this.props.search && (\n <Input\n className=\"m-x-half m-t-half m-b-2\"\n placeholder={this.props.search?.placeholder}\n onChange={this.handleSearch}\n onKeyDown={this.handleKeyDown}\n size=\"xsmall\"\n value={this.search}\n />\n )}\n <div className=\"p-x-half position-relative\" onKeyDown={this.handleKeyDown}>\n {!!selectedOptions.length && (\n <div className=\"border-bottom m-y-half\">\n {selectedOptions.map((option, index) => (\n <ItemComponent\n key={this.getItemKey(option, index)}\n option={option}\n checked\n renderer={this.props.renderItem}\n onChange={this.props.onChange}\n />\n ))}\n </div>\n )}\n {this.error ? (\n <BodyText className=\"c-red-500\">Unable to load options</BodyText>\n ) : this.shownOptions.length ? (\n this.shownOptions\n .filter(opt => !selected.has(this.props.valueSelector(opt)))\n .map((option, index) => (\n <ItemComponent\n key={this.getItemKey(option, index)}\n option={option}\n checked={false}\n renderer={this.props.renderItem}\n onChange={this.props.onChange}\n />\n ))\n ) : this.loading ? (\n <BodyText> </BodyText>\n ) : (\n <BodyText subdued>No options match search criteria</BodyText>\n )}\n\n {this.loading && (\n <div className=\"position-absolute top-0 bottom-0 left-0 right-0 opacity-disabled bg-white d-f justify-content-center\">\n <Spinner size=\"tiny\" />\n </div>\n )}\n </div>\n </Fragment>\n );\n }\n\n private async getData(): Promise<TO[]> {\n if (this.props.dataFetcher) {\n const { data } = await this.props.dataFetcher({\n search: this.search,\n });\n\n return data;\n }\n\n let data = this.props.data ?? [];\n\n if (this.props.search?.filter) {\n data = data.filter(this.props.search.filter(this.search));\n }\n return data;\n }\n\n private getItemKey = (item: TO, index: number) => {\n return `${index}__${this.props.valueSelector(item)}`;\n };\n}\n\nconst SelectorItemSingle: FC<SelectorItemProps<any>> = ({\n option,\n renderer,\n checked,\n onChange,\n}) => (\n <Radio\n label={renderer?.(option) ?? `${option}`}\n checked={checked}\n onChange={(_, event) => onChange(option, true, event)}\n className=\"m-b-1\"\n />\n);\n\nconst SelectorItemMultiple: FC<SelectorItemProps<any>> = ({\n option,\n renderer,\n checked,\n onChange,\n}) => (\n <Checkbox\n label={renderer?.(option) ?? `${option}`}\n checked={checked}\n onChange={(_, checked, event) => onChange(option, checked, event)}\n className=\"m-b-1\"\n />\n);\n\nexport interface SelectFilterOptions<TO> extends CustomColumnMenuFilterSingleOpts {\n /** Can select multiple options in filter */\n multiple?: boolean;\n /** Ability to search options in filter */\n search?: boolean | Partial<SelectFilterSearchOptions>;\n /** Static options to show in filter */\n data?: TO[];\n /** Method to fetch filter options asynchronously */\n dataFetcher?: SelectFilterDataFetcher<TO>;\n /** Search operator passed to table state */\n operator?: ((value: any, options?: TO[]) => boolean) | ((value: any, options?: TO) => boolean);\n /** Select item value (ex id) for complex items */\n valueSelector?(item: TO): IdType;\n /** Select row item value (from table source row field) for complex items */\n rowValueSelector?(item: any): IdType | undefined;\n /** Render option label */\n renderItem?(item: TO): ReactNode;\n}\n\ninterface TableFilterCellPropsTyped<T = any> extends Omit<TableFilterCellProps, 'value'> {\n value?: T;\n}\n\nexport function selectColumnMenuFilter<TO>({\n dataFetcher,\n data,\n search,\n multiple,\n valueSelector = getSimpleValue,\n rowValueSelector = getSimpleValue,\n renderItem,\n operator,\n ...opts\n}: SelectFilterOptions<TO>) {\n const renderer = renderItem ?? (item => valueSelector(item));\n\n const searchOptions = search\n ? {\n filter: objectSearch,\n ...(typeof search === 'boolean' ? {} : search),\n }\n : undefined;\n\n if (multiple) {\n const FilterCell = ({ value, onChange }: TableFilterCellPropsTyped<TO[]>) => {\n const handleChange = (\n option: TO,\n checked: boolean,\n event: SyntheticEvent<HTMLInputElement>\n ) => {\n const val = checked\n ? (value ?? []).concat(option)\n : (value ?? []).filter(opt =>\n valueSelector\n ? valueSelector(opt) !== valueSelector(option)\n : option !== opt\n );\n\n onChange({\n value: val.length ? toJS(val) : undefined,\n operator: val.length\n ? (operator ??\n selectColumnMenuFilterOperators.getContains({\n valueSelector,\n rowValueSelector,\n }))\n : '',\n syntheticEvent: event,\n });\n };\n\n return (\n <SelectorAsync\n selected={value ?? []}\n itemComponent={SelectorItemMultiple}\n onChange={handleChange}\n search={searchOptions}\n renderItem={renderer}\n dataFetcher={dataFetcher}\n data={data}\n valueSelector={valueSelector}\n />\n );\n };\n\n return renderCustomColumnMenuFilter(FilterCell, opts);\n }\n\n const FilterCell = ({ value, onChange }: TableFilterCellPropsTyped<TO>) => {\n const handleChange = (option: TO, _: boolean, event: SyntheticEvent<HTMLInputElement>) => {\n onChange({\n value: toJS(option),\n operator:\n operator ??\n selectColumnMenuFilterOperators.getEquals({ valueSelector, rowValueSelector }),\n syntheticEvent: event,\n });\n };\n\n return (\n <SelectorAsync\n selected={value ? [value] : []}\n onChange={handleChange}\n itemComponent={SelectorItemSingle}\n search={searchOptions}\n renderItem={renderer}\n dataFetcher={dataFetcher}\n data={data}\n valueSelector={valueSelector}\n />\n );\n };\n\n return renderCustomColumnMenuFilter(FilterCell, opts);\n}\n\nexport { selectColumnMenuFilterOperators };\n"],"names":["Component","Fragment","Checkbox","Radio","Input","Spinner","BodyText","renderCustomColumnMenuFilter","makeObservable","observable","runInAction","toJS","observer","getSimpleValue","objectSearch","selectColumnMenuFilterOperators","SelectorAsync","componentDidMount","searchOptions","catch","render","selectedOptions","props","selected","Set","map","opt","valueSelector","ItemComponent","itemComponent","search","className","placeholder","onChange","handleSearch","onKeyDown","handleKeyDown","size","value","div","length","option","index","checked","renderer","renderItem","getItemKey","error","shownOptions","filter","has","loading","subdued","getData","dataFetcher","data","event","key","stopPropagation","_0","item","SelectorItemSingle","label","_","SelectorItemMultiple","selectColumnMenuFilter","multiple","rowValueSelector","operator","opts","undefined","FilterCell","handleChange","val","concat","getContains","syntheticEvent","getEquals"],"mappings":"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"}
|
|
@@ -6,19 +6,26 @@ function _define_property(obj, key, value) {
|
|
|
6
6
|
configurable: true,
|
|
7
7
|
writable: true
|
|
8
8
|
});
|
|
9
|
-
} else
|
|
10
|
-
obj[key] = value;
|
|
11
|
-
}
|
|
9
|
+
} else obj[key] = value;
|
|
12
10
|
return obj;
|
|
13
11
|
}
|
|
14
12
|
function _ts_decorate(decorators, target, key, desc) {
|
|
15
13
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
16
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
17
|
-
|
|
14
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
|
|
15
|
+
r = Reflect.decorate(decorators, target, key, desc);
|
|
16
|
+
} else {
|
|
17
|
+
for(var i = decorators.length - 1; i >= 0; i--){
|
|
18
|
+
if (d = decorators[i]) {
|
|
19
|
+
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
18
23
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
19
24
|
}
|
|
20
|
-
function _ts_metadata(
|
|
21
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
|
|
25
|
+
function _ts_metadata(metadataKey, metadataValue) {
|
|
26
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
|
|
27
|
+
return Reflect.metadata(metadataKey, metadataValue);
|
|
28
|
+
}
|
|
22
29
|
}
|
|
23
30
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
24
31
|
import { Component, Fragment } from 'react';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/filters/time-filter/time-filter.tsx"],"sourcesContent":["import { Component, Fragment } from 'react';\n\nimport { observer } from 'mobx-react';\nimport { observable, action, makeObservable } from 'mobx';\n\nimport type { DropDownListChangeEvent } from '@progress/kendo-react-dropdowns';\nimport { DropDownList } from '@progress/kendo-react-dropdowns';\nimport type { TimePickerChangeEvent } from '@progress/kendo-react-dateinputs';\nimport { TimePicker } from '@progress/kendo-react-dateinputs';\n\nimport {\n IsUnaryFilter,\n cellOperatorChange,\n} from '@progress/kendo-react-grid/dist/npm/filterCommon';\n\nimport type { TableFilterCellProps } from '@servicetitan/design-system';\n\nimport { renderCustomColumnMenuFilter } from '../column-menu-filters';\n\n@observer\nclass TimeFilterCell extends Component<TableFilterCellProps> {\n @observable operator =\n this.props.operators.find(o => o.operator === this.props.operator) ??\n this.props.operators[0];\n\n constructor(props: TableFilterCellProps) {\n super(props);\n makeObservable(this);\n }\n\n @action\n handleOperatorChange = (event: DropDownListChangeEvent) => {\n this.operator = event.target.value;\n cellOperatorChange(event, this.props.value, this.props.onChange);\n };\n\n handleChange = (event: TimePickerChangeEvent) => {\n const value = event.value;\n\n this.props.onChange({\n value: value ? new Date(2000, 0, 1, value.getHours(), value.getMinutes()) : null,\n operator: this.props.operator ?? '',\n syntheticEvent: event.syntheticEvent,\n });\n };\n\n render() {\n return (\n <Fragment>\n <DropDownList\n value={this.operator}\n onChange={this.handleOperatorChange}\n data={this.props.operators}\n dataItemKey=\"operator\"\n className=\"m-b-1\"\n textField=\"text\"\n />\n {!IsUnaryFilter(this.operator.operator) && (\n <TimePicker\n value={this.props.value}\n onChange={this.handleChange}\n className=\"m-b-1\"\n />\n )}\n </Fragment>\n );\n }\n}\n\nexport const TimeColumnMenuFilter = renderCustomColumnMenuFilter(TimeFilterCell, true);\n"],"names":["Component","Fragment","observer","observable","action","makeObservable","DropDownList","TimePicker","IsUnaryFilter","cellOperatorChange","renderCustomColumnMenuFilter","TimeFilterCell","render","value","operator","onChange","handleOperatorChange","data","props","operators","dataItemKey","className","textField","handleChange","find","o","event","target","Date","getHours","getMinutes","syntheticEvent","TimeColumnMenuFilter"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../src/filters/time-filter/time-filter.tsx"],"sourcesContent":["import { Component, Fragment } from 'react';\n\nimport { observer } from 'mobx-react';\nimport { observable, action, makeObservable } from 'mobx';\n\nimport type { DropDownListChangeEvent } from '@progress/kendo-react-dropdowns';\nimport { DropDownList } from '@progress/kendo-react-dropdowns';\nimport type { TimePickerChangeEvent } from '@progress/kendo-react-dateinputs';\nimport { TimePicker } from '@progress/kendo-react-dateinputs';\n\nimport {\n IsUnaryFilter,\n cellOperatorChange,\n} from '@progress/kendo-react-grid/dist/npm/filterCommon';\n\nimport type { TableFilterCellProps } from '@servicetitan/design-system';\n\nimport { renderCustomColumnMenuFilter } from '../column-menu-filters';\n\n@observer\nclass TimeFilterCell extends Component<TableFilterCellProps> {\n @observable operator =\n this.props.operators.find(o => o.operator === this.props.operator) ??\n this.props.operators[0];\n\n constructor(props: TableFilterCellProps) {\n super(props);\n makeObservable(this);\n }\n\n @action\n handleOperatorChange = (event: DropDownListChangeEvent) => {\n this.operator = event.target.value;\n cellOperatorChange(event, this.props.value, this.props.onChange);\n };\n\n handleChange = (event: TimePickerChangeEvent) => {\n const value = event.value;\n\n this.props.onChange({\n value: value ? new Date(2000, 0, 1, value.getHours(), value.getMinutes()) : null,\n operator: this.props.operator ?? '',\n syntheticEvent: event.syntheticEvent,\n });\n };\n\n render() {\n return (\n <Fragment>\n <DropDownList\n value={this.operator}\n onChange={this.handleOperatorChange}\n data={this.props.operators}\n dataItemKey=\"operator\"\n className=\"m-b-1\"\n textField=\"text\"\n />\n {!IsUnaryFilter(this.operator.operator) && (\n <TimePicker\n value={this.props.value}\n onChange={this.handleChange}\n className=\"m-b-1\"\n />\n )}\n </Fragment>\n );\n }\n}\n\nexport const TimeColumnMenuFilter = renderCustomColumnMenuFilter(TimeFilterCell, true);\n"],"names":["Component","Fragment","observer","observable","action","makeObservable","DropDownList","TimePicker","IsUnaryFilter","cellOperatorChange","renderCustomColumnMenuFilter","TimeFilterCell","render","value","operator","onChange","handleOperatorChange","data","props","operators","dataItemKey","className","textField","handleChange","find","o","event","target","Date","getHours","getMinutes","syntheticEvent","TimeColumnMenuFilter"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAASA,SAAS,EAAEC,QAAQ,QAAQ,QAAQ;AAE5C,SAASC,QAAQ,QAAQ,aAAa;AACtC,SAASC,UAAU,EAAEC,MAAM,EAAEC,cAAc,QAAQ,OAAO;AAG1D,SAASC,YAAY,QAAQ,kCAAkC;AAE/D,SAASC,UAAU,QAAQ,mCAAmC;AAE9D,SACIC,aAAa,EACbC,kBAAkB,QACf,mDAAmD;AAI1D,SAASC,4BAA4B,QAAQ,yBAAyB;AAEtE,MACMC,uBAAuBX;IA0BzBY,SAAS;QACL,qBACI,MAACX;;8BACG,KAACK;oBACGO,OAAO,IAAI,CAACC,QAAQ;oBACpBC,UAAU,IAAI,CAACC,oBAAoB;oBACnCC,MAAM,IAAI,CAACC,KAAK,CAACC,SAAS;oBAC1BC,aAAY;oBACZC,WAAU;oBACVC,WAAU;;gBAEb,CAACd,cAAc,IAAI,CAACM,QAAQ,CAACA,QAAQ,mBAClC,KAACP;oBACGM,OAAO,IAAI,CAACK,KAAK,CAACL,KAAK;oBACvBE,UAAU,IAAI,CAACQ,YAAY;oBAC3BF,WAAU;;;;IAK9B;IAzCA,YAAYH,KAA2B,CAAE;YAHrC;QAIA,KAAK,CAACA,QALV,uBAAYJ,aACR,6BAAA,IAAI,CAACI,KAAK,CAACC,SAAS,CAACK,IAAI,CAACC,CAAAA,IAAKA,EAAEX,QAAQ,KAAK,IAAI,CAACI,KAAK,CAACJ,QAAQ,eAAjE,wCAAA,6BACA,IAAI,CAACI,KAAK,CAACC,SAAS,CAAC,EAAE,GAO3B,uBACAH,wBAAuB,CAACU;YACpB,IAAI,CAACZ,QAAQ,GAAGY,MAAMC,MAAM,CAACd,KAAK;YAClCJ,mBAAmBiB,OAAO,IAAI,CAACR,KAAK,CAACL,KAAK,EAAE,IAAI,CAACK,KAAK,CAACH,QAAQ;QACnE,IAEAQ,uBAAAA,gBAAe,CAACG;gBAKE;YAJd,MAAMb,QAAQa,MAAMb,KAAK;YAEzB,IAAI,CAACK,KAAK,CAACH,QAAQ,CAAC;gBAChBF,OAAOA,QAAQ,IAAIe,KAAK,MAAM,GAAG,GAAGf,MAAMgB,QAAQ,IAAIhB,MAAMiB,UAAU,MAAM;gBAC5EhB,QAAQ,GAAE,uBAAA,IAAI,CAACI,KAAK,CAACJ,QAAQ,cAAnB,kCAAA,uBAAuB;gBACjCiB,gBAAgBL,MAAMK,cAAc;YACxC;QACJ;QAjBI1B,eAAe,IAAI;IACvB;AAuCJ;;;;;;;;;;;;;;AAEA,OAAO,MAAM2B,uBAAuBtB,6BAA6BC,gBAAgB,MAAM"}
|
package/dist/table-state.js
CHANGED
|
@@ -6,19 +6,26 @@
|
|
|
6
6
|
configurable: true,
|
|
7
7
|
writable: true
|
|
8
8
|
});
|
|
9
|
-
} else
|
|
10
|
-
obj[key] = value;
|
|
11
|
-
}
|
|
9
|
+
} else obj[key] = value;
|
|
12
10
|
return obj;
|
|
13
11
|
}
|
|
14
12
|
function _ts_decorate(decorators, target, key, desc) {
|
|
15
13
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
16
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
17
|
-
|
|
14
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
|
|
15
|
+
r = Reflect.decorate(decorators, target, key, desc);
|
|
16
|
+
} else {
|
|
17
|
+
for(var i = decorators.length - 1; i >= 0; i--){
|
|
18
|
+
if (d = decorators[i]) {
|
|
19
|
+
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
18
23
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
19
24
|
}
|
|
20
|
-
function _ts_metadata(
|
|
21
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
|
|
25
|
+
function _ts_metadata(metadataKey, metadataValue) {
|
|
26
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
|
|
27
|
+
return Reflect.metadata(metadataKey, metadataValue);
|
|
28
|
+
}
|
|
22
29
|
}
|
|
23
30
|
import { action, computed, observable, runInAction, makeObservable } from 'mobx';
|
|
24
31
|
import { fromPromise } from 'mobx-utils';
|