@servicetitan/table 38.1.0 → 38.2.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.
Files changed (26) hide show
  1. package/dist/demo/master-detail/detail-table.store.js +2 -2
  2. package/dist/demo/master-detail/detail-table.store.js.map +1 -1
  3. package/dist/filters/async-select/async-select-filter.d.ts.map +1 -1
  4. package/dist/filters/async-select/async-select-filter.js +5 -5
  5. package/dist/filters/async-select/async-select-filter.js.map +1 -1
  6. package/dist/filters/datetime-filter/datetime-filter.js +1 -1
  7. package/dist/filters/datetime-filter/datetime-filter.js.map +1 -1
  8. package/dist/filters/multiselect-filter/multiselect-filter.js.map +1 -1
  9. package/dist/filters/select-filter/select-filter.js +6 -6
  10. package/dist/filters/select-filter/select-filter.js.map +1 -1
  11. package/dist/filters/single-select/single-select-filter.d.ts.map +1 -1
  12. package/dist/filters/single-select/single-select-filter.js.map +1 -1
  13. package/dist/filters/standard-filter-with-multiselect/filter-cell-ext.js.map +1 -1
  14. package/dist/filters/standard-filter-with-multiselect/table-column-menu-filter-ext.js +1 -1
  15. package/dist/filters/standard-filter-with-multiselect/table-column-menu-filter-ext.js.map +1 -1
  16. package/dist/filters/time-filter/time-filter.js +1 -1
  17. package/dist/filters/time-filter/time-filter.js.map +1 -1
  18. package/dist/table.d.ts.map +1 -1
  19. package/dist/table.js +1 -1
  20. package/dist/table.js.map +1 -1
  21. package/dist/use-observing-table-state/use-observing-table-state.js +2 -2
  22. package/dist/use-observing-table-state/use-observing-table-state.js.map +1 -1
  23. package/package.json +9 -9
  24. package/src/filters/async-select/async-select-filter.tsx +4 -2
  25. package/src/filters/single-select/single-select-filter.tsx +4 -2
  26. package/src/table.tsx +6 -2
@@ -26,9 +26,9 @@ import { TableState } from '../..';
26
26
  import { MasterTableStore } from './master-table.store';
27
27
  export class DetailTableStore {
28
28
  get selected() {
29
+ var _ref;
29
30
  var _this_tableState;
30
- var _this_tableState_selectedIds_size;
31
- return (_this_tableState_selectedIds_size = (_this_tableState = this.tableState) === null || _this_tableState === void 0 ? void 0 : _this_tableState.selectedIds.size) !== null && _this_tableState_selectedIds_size !== void 0 ? _this_tableState_selectedIds_size : 0;
31
+ return (_ref = (_this_tableState = this.tableState) === null || _this_tableState === void 0 ? void 0 : _this_tableState.selectedIds.size) !== null && _ref !== void 0 ? _ref : 0;
32
32
  }
33
33
  initialize(row) {
34
34
  this.tableState = this.masterTableStore.tableState.getDetailTableState(row);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/demo/master-detail/detail-table.store.ts"],"sourcesContent":["import { injectable, inject } from '@servicetitan/react-ioc';\n\nimport { observable, action, observe, computed, Lambda, makeObservable } from 'mobx';\n\nimport { TableState } from '../..';\n\nimport { MasterTableStore } from './master-table.store';\n\nimport type { Product } from './product';\nimport type { ProductDetail } from './product-detail';\n\n@injectable()\nexport class DetailTableStore {\n @observable tableState?: TableState<ProductDetail, string, Product, number>;\n\n /*\n * Please use constructor injection instead.\n * Injecting without constructor only to make it work in Codesandbox.\n */\n @inject(MasterTableStore)\n private masterTableStore!: MasterTableStore;\n\n @computed get selected() {\n return this.tableState?.selectedIds.size ?? 0;\n }\n\n private disposeSelectedObserve: Lambda;\n\n constructor() {\n makeObservable(this);\n\n this.disposeSelectedObserve = observe(this, 'selected', ({ oldValue, newValue }) => {\n if (!oldValue && newValue) {\n this.setLockedRowsSelection(true);\n }\n });\n }\n\n @action\n initialize(row: Product) {\n this.tableState = this.masterTableStore.tableState.getDetailTableState!(row) as TableState<\n ProductDetail,\n string,\n Product,\n number\n >;\n }\n\n dispose() {\n this.disposeSelectedObserve();\n }\n\n private async setLockedRowsSelection(value: boolean) {\n if (!this.tableState) {\n return;\n }\n\n if (!this.tableState.dataSource) {\n return;\n }\n\n const filteredData = (\n await this.tableState.dataSource.getData({\n filter: this.tableState.filter,\n })\n ).data as ProductDetail[];\n\n const lockedData = filteredData.filter(row => this.tableState!.isRowUnselectable(row));\n\n this.tableState.setRowsSelection(lockedData, value, { ignoreUnselectable: false });\n }\n}\n"],"names":["injectable","inject","observable","action","observe","computed","makeObservable","TableState","MasterTableStore","DetailTableStore","selected","tableState","selectedIds","size","initialize","row","masterTableStore","getDetailTableState","dispose","disposeSelectedObserve","setLockedRowsSelection","value","dataSource","filteredData","getData","filter","data","lockedData","isRowUnselectable","setRowsSelection","ignoreUnselectable","oldValue","newValue"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,SAASA,UAAU,EAAEC,MAAM,QAAQ,0BAA0B;AAE7D,SAASC,UAAU,EAAEC,MAAM,EAAEC,OAAO,EAAEC,QAAQ,EAAUC,cAAc,QAAQ,OAAO;AAErF,SAASC,UAAU,QAAQ,QAAQ;AAEnC,SAASC,gBAAgB,QAAQ,uBAAuB;AAMxD,OAAO,MAAMC;IAUT,IAAcC,WAAW;YACd;YAAA;QAAP,OAAO,CAAA,qCAAA,mBAAA,IAAI,CAACC,UAAU,cAAf,uCAAA,iBAAiBC,WAAW,CAACC,IAAI,cAAjC,+CAAA,oCAAqC;IAChD;IAeAC,WAAWC,GAAY,EAAE;QACrB,IAAI,CAACJ,UAAU,GAAG,IAAI,CAACK,gBAAgB,CAACL,UAAU,CAACM,mBAAmB,CAAEF;IAM5E;IAEAG,UAAU;QACN,IAAI,CAACC,sBAAsB;IAC/B;IAEA,MAAcC,uBAAuBC,KAAc,EAAE;QACjD,IAAI,CAAC,IAAI,CAACV,UAAU,EAAE;YAClB;QACJ;QAEA,IAAI,CAAC,IAAI,CAACA,UAAU,CAACW,UAAU,EAAE;YAC7B;QACJ;QAEA,MAAMC,eAAe,AACjB,CAAA,MAAM,IAAI,CAACZ,UAAU,CAACW,UAAU,CAACE,OAAO,CAAC;YACrCC,QAAQ,IAAI,CAACd,UAAU,CAACc,MAAM;QAClC,EAAC,EACHC,IAAI;QAEN,MAAMC,aAAaJ,aAAaE,MAAM,CAACV,CAAAA,MAAO,IAAI,CAACJ,UAAU,CAAEiB,iBAAiB,CAACb;QAEjF,IAAI,CAACJ,UAAU,CAACkB,gBAAgB,CAACF,YAAYN,OAAO;YAAES,oBAAoB;QAAM;IACpF;IA1CA,aAAc;QAfd,uBAAYnB,cAAZ,KAAA;QAEA;;;KAGC,GACD,uBACQK,oBADR,KAAA;QAOA,uBAAQG,0BAAR,KAAA;QAGIb,eAAe,IAAI;QAEnB,IAAI,CAACa,sBAAsB,GAAGf,QAAQ,IAAI,EAAE,YAAY,CAAC,EAAE2B,QAAQ,EAAEC,QAAQ,EAAE;YAC3E,IAAI,CAACD,YAAYC,UAAU;gBACvB,IAAI,CAACZ,sBAAsB,CAAC;YAChC;QACJ;IACJ;AAmCJ"}
1
+ {"version":3,"sources":["../../../src/demo/master-detail/detail-table.store.ts"],"sourcesContent":["import { injectable, inject } from '@servicetitan/react-ioc';\n\nimport { observable, action, observe, computed, Lambda, makeObservable } from 'mobx';\n\nimport { TableState } from '../..';\n\nimport { MasterTableStore } from './master-table.store';\n\nimport type { Product } from './product';\nimport type { ProductDetail } from './product-detail';\n\n@injectable()\nexport class DetailTableStore {\n @observable tableState?: TableState<ProductDetail, string, Product, number>;\n\n /*\n * Please use constructor injection instead.\n * Injecting without constructor only to make it work in Codesandbox.\n */\n @inject(MasterTableStore)\n private masterTableStore!: MasterTableStore;\n\n @computed get selected() {\n return this.tableState?.selectedIds.size ?? 0;\n }\n\n private disposeSelectedObserve: Lambda;\n\n constructor() {\n makeObservable(this);\n\n this.disposeSelectedObserve = observe(this, 'selected', ({ oldValue, newValue }) => {\n if (!oldValue && newValue) {\n this.setLockedRowsSelection(true);\n }\n });\n }\n\n @action\n initialize(row: Product) {\n this.tableState = this.masterTableStore.tableState.getDetailTableState!(row) as TableState<\n ProductDetail,\n string,\n Product,\n number\n >;\n }\n\n dispose() {\n this.disposeSelectedObserve();\n }\n\n private async setLockedRowsSelection(value: boolean) {\n if (!this.tableState) {\n return;\n }\n\n if (!this.tableState.dataSource) {\n return;\n }\n\n const filteredData = (\n await this.tableState.dataSource.getData({\n filter: this.tableState.filter,\n })\n ).data as ProductDetail[];\n\n const lockedData = filteredData.filter(row => this.tableState!.isRowUnselectable(row));\n\n this.tableState.setRowsSelection(lockedData, value, { ignoreUnselectable: false });\n }\n}\n"],"names":["injectable","inject","observable","action","observe","computed","makeObservable","TableState","MasterTableStore","DetailTableStore","selected","tableState","selectedIds","size","initialize","row","masterTableStore","getDetailTableState","dispose","disposeSelectedObserve","setLockedRowsSelection","value","dataSource","filteredData","getData","filter","data","lockedData","isRowUnselectable","setRowsSelection","ignoreUnselectable","oldValue","newValue"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,SAASA,UAAU,EAAEC,MAAM,QAAQ,0BAA0B;AAE7D,SAASC,UAAU,EAAEC,MAAM,EAAEC,OAAO,EAAEC,QAAQ,EAAUC,cAAc,QAAQ,OAAO;AAErF,SAASC,UAAU,QAAQ,QAAQ;AAEnC,SAASC,gBAAgB,QAAQ,uBAAuB;AAMxD,OAAO,MAAMC;IAUT,IAAcC,WAAW;;YACd;QAAP,gBAAO,mBAAA,IAAI,CAACC,UAAU,cAAf,uCAAA,iBAAiBC,WAAW,CAACC,IAAI,uCAAI;IAChD;IAeAC,WAAWC,GAAY,EAAE;QACrB,IAAI,CAACJ,UAAU,GAAG,IAAI,CAACK,gBAAgB,CAACL,UAAU,CAACM,mBAAmB,CAAEF;IAM5E;IAEAG,UAAU;QACN,IAAI,CAACC,sBAAsB;IAC/B;IAEA,MAAcC,uBAAuBC,KAAc,EAAE;QACjD,IAAI,CAAC,IAAI,CAACV,UAAU,EAAE;YAClB;QACJ;QAEA,IAAI,CAAC,IAAI,CAACA,UAAU,CAACW,UAAU,EAAE;YAC7B;QACJ;QAEA,MAAMC,eAAe,AACjB,CAAA,MAAM,IAAI,CAACZ,UAAU,CAACW,UAAU,CAACE,OAAO,CAAC;YACrCC,QAAQ,IAAI,CAACd,UAAU,CAACc,MAAM;QAClC,EAAC,EACHC,IAAI;QAEN,MAAMC,aAAaJ,aAAaE,MAAM,CAACV,CAAAA,MAAO,IAAI,CAACJ,UAAU,CAAEiB,iBAAiB,CAACb;QAEjF,IAAI,CAACJ,UAAU,CAACkB,gBAAgB,CAACF,YAAYN,OAAO;YAAES,oBAAoB;QAAM;IACpF;IA1CA,aAAc;QAfd,uBAAYnB,cAAZ,KAAA;QAEA;;;KAGC,GACD,uBACQK,oBADR,KAAA;QAOA,uBAAQG,0BAAR,KAAA;QAGIb,eAAe,IAAI;QAEnB,IAAI,CAACa,sBAAsB,GAAGf,QAAQ,IAAI,EAAE,YAAY,CAAC,EAAE2B,QAAQ,EAAEC,QAAQ,EAAE;YAC3E,IAAI,CAACD,YAAYC,UAAU;gBACvB,IAAI,CAACZ,sBAAsB,CAAC;YAChC;QACJ;IACJ;AAmCJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"async-select-filter.d.ts","sourceRoot":"","sources":["../../../src/filters/async-select/async-select-filter.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,SAAS,EAA+B,MAAM,OAAO,CAAC;AAU1F,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAElD,OAAO,EACH,gCAAgC,EAEnC,MAAM,wBAAwB,CAAC;AAIhC,MAAM,MAAM,4BAA4B,CACpC,EAAE,SAAS,MAAM,GAAG,MAAM,EAC1B,EAAE,SAAS,eAAe,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,EAAE,CAAC,IACpD,CAAC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,OAAO,CAAC;IAAE,IAAI,EAAE,EAAE,EAAE,CAAA;CAAE,CAAC,CAAC;AAE3D,MAAM,WAAW,eAAe,CAAC,EAAE,SAAS,MAAM,GAAG,MAAM;IACvD,KAAK,EAAE,EAAE,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;CAChB;AAwJD,MAAM,WAAW,wBAAwB,CAAC,GAAG,SAAS,MAAM,EAAE,EAAE,SAAS,eAAe,CAAC,GAAG,CAAC,CACzF,SAAQ,gCAAgC;IACxC,WAAW,EAAE,4BAA4B,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,SAAS,CAAC;CACxC;AAMD;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,SAAS,MAAM,EAAE,EAAE,SAAS,eAAe,CAAC,GAAG,CAAC,EAAE,EAC7F,WAAW,EACX,WAAW,EACX,QAAQ,EACR,UAAU,EACV,GAAG,IAAI,EACV,EAAE,wBAAwB,CAAC,GAAG,EAAE,EAAE,CAAC,gHA2DnC"}
1
+ {"version":3,"file":"async-select-filter.d.ts","sourceRoot":"","sources":["../../../src/filters/async-select/async-select-filter.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,SAAS,EAA+B,MAAM,OAAO,CAAC;AAU1F,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAElD,OAAO,EACH,gCAAgC,EAEnC,MAAM,wBAAwB,CAAC;AAIhC,MAAM,MAAM,4BAA4B,CACpC,EAAE,SAAS,MAAM,GAAG,MAAM,EAC1B,EAAE,SAAS,eAAe,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,EAAE,CAAC,IACpD,CAAC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,OAAO,CAAC;IAAE,IAAI,EAAE,EAAE,EAAE,CAAA;CAAE,CAAC,CAAC;AAE3D,MAAM,WAAW,eAAe,CAAC,EAAE,SAAS,MAAM,GAAG,MAAM;IACvD,KAAK,EAAE,EAAE,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;CAChB;AAwJD,MAAM,WAAW,wBAAwB,CACrC,GAAG,SAAS,MAAM,EAClB,EAAE,SAAS,eAAe,CAAC,GAAG,CAAC,CACjC,SAAQ,gCAAgC;IACtC,WAAW,EAAE,4BAA4B,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,SAAS,CAAC;CACxC;AAMD;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,SAAS,MAAM,EAAE,EAAE,SAAS,eAAe,CAAC,GAAG,CAAC,EAAE,EAC7F,WAAW,EACX,WAAW,EACX,QAAQ,EACR,UAAU,EACV,GAAG,IAAI,EACV,EAAE,wBAAwB,CAAC,GAAG,EAAE,EAAE,CAAC,gHA2DnC"}
@@ -102,7 +102,7 @@ class SelectorAsync extends Component {
102
102
  this.error = false;
103
103
  this.loading = false;
104
104
  });
105
- } catch (e) {
105
+ } catch (unused) {
106
106
  runInAction(()=>{
107
107
  this.error = true;
108
108
  this.loading = false;
@@ -133,18 +133,18 @@ SelectorAsync = _ts_decorate([
133
133
  ])
134
134
  ], SelectorAsync);
135
135
  const SelectorItemSingle = ({ option, renderer, checked, onChange })=>{
136
- var _renderer;
136
+ var _ref;
137
137
  return /*#__PURE__*/ _jsx(Radio, {
138
- label: (_renderer = renderer === null || renderer === void 0 ? void 0 : renderer(option)) !== null && _renderer !== void 0 ? _renderer : option.text,
138
+ label: (_ref = renderer === null || renderer === void 0 ? void 0 : renderer(option)) !== null && _ref !== void 0 ? _ref : option.text,
139
139
  checked: checked,
140
140
  onChange: (_, event)=>onChange(option, true, event),
141
141
  className: "m-b-1"
142
142
  });
143
143
  };
144
144
  const SelectorItemMultiple = ({ option, renderer, checked, onChange })=>{
145
- var _renderer;
145
+ var _ref;
146
146
  return /*#__PURE__*/ _jsx(Checkbox, {
147
- label: (_renderer = renderer === null || renderer === void 0 ? void 0 : renderer(option)) !== null && _renderer !== void 0 ? _renderer : option.text,
147
+ label: (_ref = renderer === null || renderer === void 0 ? void 0 : renderer(option)) !== null && _ref !== void 0 ? _ref : option.text,
148
148
  checked: checked,
149
149
  onChange: (_, checked, event)=>onChange(option, checked, event),
150
150
  className: "m-b-1"
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/filters/async-select/async-select-filter.tsx"],"sourcesContent":["import { Component, SyntheticEvent, ReactNode, Fragment, KeyboardEvent, FC } from 'react';\n\nimport {\n Checkbox,\n TableFilterCellProps,\n Radio,\n Input,\n Spinner,\n BodyText,\n} from '@servicetitan/design-system';\nimport { IdType } from '@servicetitan/data-query';\n\nimport {\n CustomColumnMenuFilterSingleOpts,\n renderCustomColumnMenuFilter,\n} from '../column-menu-filters';\nimport { makeObservable, observable, runInAction } from 'mobx';\nimport { observer } from 'mobx-react';\n\nexport type AsyncSelectFilterDataFetcher<\n TV extends IdType = IdType,\n TO extends AsyncSelectItem<TV> = AsyncSelectItem<TV>,\n> = (opts: { search?: string }) => Promise<{ data: TO[] }>;\n\nexport interface AsyncSelectItem<TV extends IdType = IdType> {\n value: TV;\n text: string;\n}\n\ninterface SelectorProps<TID extends IdType, TO extends AsyncSelectItem<TID>> {\n placeholder?: string;\n selected: TO[];\n dataFetcher: AsyncSelectFilterDataFetcher<TID, TO>;\n itemComponent: FC<SelectorItemProps>;\n onChange(option: TO, checked: boolean, event: SyntheticEvent<HTMLInputElement>): void;\n renderer?(item: TO): ReactNode;\n}\n\ninterface SelectorItemProps {\n option: AsyncSelectItem;\n checked: boolean;\n onChange(\n option: AsyncSelectItem,\n checked: boolean,\n event: SyntheticEvent<HTMLInputElement>\n ): void;\n renderer?(item: AsyncSelectItem): ReactNode;\n}\n\n@observer\nclass SelectorAsync<TID extends IdType, TO extends AsyncSelectItem<TID>> extends Component<\n SelectorProps<TID, TO>\n> {\n @observable shownOptions: AsyncSelectItem<TID>[] = [];\n @observable search = '';\n @observable error = false;\n @observable loading = false;\n\n constructor(props: SelectorProps<TID, 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 runInAction(() => {\n this.loading = true;\n });\n\n try {\n const { data } = await this.props.dataFetcher({\n search: this.search,\n });\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 => opt.value));\n const ItemComponent = this.props.itemComponent;\n\n return (\n <Fragment>\n <Input\n className=\"m-x-half m-t-half m-b-2\"\n placeholder={this.props.placeholder}\n onChange={this.handleSearch}\n onKeyDown={this.handleKeyDown}\n size=\"xsmall\"\n value={this.search}\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 => (\n <ItemComponent\n key={option.value}\n option={option}\n checked\n renderer={this.props.renderer}\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(opt.value))\n .map(option => (\n <ItemComponent\n key={option.value}\n option={option}\n checked={false}\n renderer={this.props.renderer}\n onChange={this.props.onChange}\n />\n ))\n ) : this.loading ? (\n <BodyText>&nbsp;</BodyText>\n ) : (\n <BodyText>No options found</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\nconst SelectorItemSingle: FC<SelectorItemProps> = ({ option, renderer, checked, onChange }) => (\n <Radio\n label={renderer?.(option) ?? option.text}\n checked={checked}\n onChange={(_, event) => onChange(option, true, event)}\n className=\"m-b-1\"\n />\n);\n\nconst SelectorItemMultiple: FC<SelectorItemProps> = ({ option, renderer, checked, onChange }) => (\n <Checkbox\n label={renderer?.(option) ?? option.text}\n checked={checked}\n onChange={(_, checked, event) => onChange(option, checked, event)}\n className=\"m-b-1\"\n />\n);\n\nexport interface AsyncSelectFilterOptions<TID extends IdType, TO extends AsyncSelectItem<TID>>\n extends CustomColumnMenuFilterSingleOpts {\n dataFetcher: AsyncSelectFilterDataFetcher<TID, TO>;\n placeholder?: string;\n multiple?: boolean;\n renderItem?: (item: TO) => ReactNode;\n}\n\ninterface TableFilterCellPropsTyped<T = any> extends Omit<TableFilterCellProps, 'value'> {\n value?: T;\n}\n\n/**\n * @deprecated use selectColumnMenuFilter instead\n */\nexport function asyncSelectColumnMenuFilter<TID extends IdType, TO extends AsyncSelectItem<TID>>({\n dataFetcher,\n placeholder,\n multiple,\n renderItem,\n ...opts\n}: AsyncSelectFilterOptions<TID, TO>) {\n const contains = (value: TID, options?: TO[]) => options?.some(opt => opt.value === value);\n const equals = (value: TID, option?: TO) => option?.value === value;\n\n const FilterCell = multiple\n ? ({ 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 => opt.value !== option.value);\n\n onChange({\n value: val.length ? val : undefined,\n operator: val.length ? contains : '',\n syntheticEvent: event,\n });\n };\n\n return (\n <SelectorAsync\n selected={value ?? []}\n itemComponent={SelectorItemMultiple}\n onChange={handleChange}\n placeholder={placeholder}\n renderer={renderItem}\n dataFetcher={dataFetcher}\n />\n );\n }\n : ({ value, onChange }: TableFilterCellPropsTyped<TO>) => {\n const handleChange = (\n option: TO,\n checked: boolean,\n event: SyntheticEvent<HTMLInputElement>\n ) => {\n onChange({\n value: option,\n operator: option ? equals : '',\n syntheticEvent: event,\n });\n };\n\n return (\n <SelectorAsync\n selected={value ? [value] : []}\n onChange={handleChange}\n itemComponent={SelectorItemSingle}\n placeholder={placeholder}\n renderer={renderItem}\n dataFetcher={dataFetcher}\n />\n );\n };\n\n return renderCustomColumnMenuFilter(FilterCell, opts);\n}\n"],"names":["Component","Fragment","Checkbox","Radio","Input","Spinner","BodyText","renderCustomColumnMenuFilter","makeObservable","observable","runInAction","observer","SelectorAsync","componentDidMount","searchOptions","catch","render","selectedOptions","props","selected","Set","map","opt","value","ItemComponent","itemComponent","className","placeholder","onChange","handleSearch","onKeyDown","handleKeyDown","size","search","div","length","option","checked","renderer","error","shownOptions","filter","has","loading","event","key","stopPropagation","_0","data","dataFetcher","SelectorItemSingle","label","text","_","SelectorItemMultiple","asyncSelectColumnMenuFilter","multiple","renderItem","opts","contains","options","some","equals","FilterCell","handleChange","val","concat","undefined","operator","syntheticEvent"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/filters/async-select/async-select-filter.tsx"],"sourcesContent":["import { Component, SyntheticEvent, ReactNode, Fragment, KeyboardEvent, FC } from 'react';\n\nimport {\n Checkbox,\n TableFilterCellProps,\n Radio,\n Input,\n Spinner,\n BodyText,\n} from '@servicetitan/design-system';\nimport { IdType } from '@servicetitan/data-query';\n\nimport {\n CustomColumnMenuFilterSingleOpts,\n renderCustomColumnMenuFilter,\n} from '../column-menu-filters';\nimport { makeObservable, observable, runInAction } from 'mobx';\nimport { observer } from 'mobx-react';\n\nexport type AsyncSelectFilterDataFetcher<\n TV extends IdType = IdType,\n TO extends AsyncSelectItem<TV> = AsyncSelectItem<TV>,\n> = (opts: { search?: string }) => Promise<{ data: TO[] }>;\n\nexport interface AsyncSelectItem<TV extends IdType = IdType> {\n value: TV;\n text: string;\n}\n\ninterface SelectorProps<TID extends IdType, TO extends AsyncSelectItem<TID>> {\n placeholder?: string;\n selected: TO[];\n dataFetcher: AsyncSelectFilterDataFetcher<TID, TO>;\n itemComponent: FC<SelectorItemProps>;\n onChange(option: TO, checked: boolean, event: SyntheticEvent<HTMLInputElement>): void;\n renderer?(item: TO): ReactNode;\n}\n\ninterface SelectorItemProps {\n option: AsyncSelectItem;\n checked: boolean;\n onChange(\n option: AsyncSelectItem,\n checked: boolean,\n event: SyntheticEvent<HTMLInputElement>\n ): void;\n renderer?(item: AsyncSelectItem): ReactNode;\n}\n\n@observer\nclass SelectorAsync<TID extends IdType, TO extends AsyncSelectItem<TID>> extends Component<\n SelectorProps<TID, TO>\n> {\n @observable shownOptions: AsyncSelectItem<TID>[] = [];\n @observable search = '';\n @observable error = false;\n @observable loading = false;\n\n constructor(props: SelectorProps<TID, 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 runInAction(() => {\n this.loading = true;\n });\n\n try {\n const { data } = await this.props.dataFetcher({\n search: this.search,\n });\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 => opt.value));\n const ItemComponent = this.props.itemComponent;\n\n return (\n <Fragment>\n <Input\n className=\"m-x-half m-t-half m-b-2\"\n placeholder={this.props.placeholder}\n onChange={this.handleSearch}\n onKeyDown={this.handleKeyDown}\n size=\"xsmall\"\n value={this.search}\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 => (\n <ItemComponent\n key={option.value}\n option={option}\n checked\n renderer={this.props.renderer}\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(opt.value))\n .map(option => (\n <ItemComponent\n key={option.value}\n option={option}\n checked={false}\n renderer={this.props.renderer}\n onChange={this.props.onChange}\n />\n ))\n ) : this.loading ? (\n <BodyText>&nbsp;</BodyText>\n ) : (\n <BodyText>No options found</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\nconst SelectorItemSingle: FC<SelectorItemProps> = ({ option, renderer, checked, onChange }) => (\n <Radio\n label={renderer?.(option) ?? option.text}\n checked={checked}\n onChange={(_, event) => onChange(option, true, event)}\n className=\"m-b-1\"\n />\n);\n\nconst SelectorItemMultiple: FC<SelectorItemProps> = ({ option, renderer, checked, onChange }) => (\n <Checkbox\n label={renderer?.(option) ?? option.text}\n checked={checked}\n onChange={(_, checked, event) => onChange(option, checked, event)}\n className=\"m-b-1\"\n />\n);\n\nexport interface AsyncSelectFilterOptions<\n TID extends IdType,\n TO extends AsyncSelectItem<TID>,\n> extends CustomColumnMenuFilterSingleOpts {\n dataFetcher: AsyncSelectFilterDataFetcher<TID, TO>;\n placeholder?: string;\n multiple?: boolean;\n renderItem?: (item: TO) => ReactNode;\n}\n\ninterface TableFilterCellPropsTyped<T = any> extends Omit<TableFilterCellProps, 'value'> {\n value?: T;\n}\n\n/**\n * @deprecated use selectColumnMenuFilter instead\n */\nexport function asyncSelectColumnMenuFilter<TID extends IdType, TO extends AsyncSelectItem<TID>>({\n dataFetcher,\n placeholder,\n multiple,\n renderItem,\n ...opts\n}: AsyncSelectFilterOptions<TID, TO>) {\n const contains = (value: TID, options?: TO[]) => options?.some(opt => opt.value === value);\n const equals = (value: TID, option?: TO) => option?.value === value;\n\n const FilterCell = multiple\n ? ({ 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 => opt.value !== option.value);\n\n onChange({\n value: val.length ? val : undefined,\n operator: val.length ? contains : '',\n syntheticEvent: event,\n });\n };\n\n return (\n <SelectorAsync\n selected={value ?? []}\n itemComponent={SelectorItemMultiple}\n onChange={handleChange}\n placeholder={placeholder}\n renderer={renderItem}\n dataFetcher={dataFetcher}\n />\n );\n }\n : ({ value, onChange }: TableFilterCellPropsTyped<TO>) => {\n const handleChange = (\n option: TO,\n checked: boolean,\n event: SyntheticEvent<HTMLInputElement>\n ) => {\n onChange({\n value: option,\n operator: option ? equals : '',\n syntheticEvent: event,\n });\n };\n\n return (\n <SelectorAsync\n selected={value ? [value] : []}\n onChange={handleChange}\n itemComponent={SelectorItemSingle}\n placeholder={placeholder}\n renderer={renderItem}\n dataFetcher={dataFetcher}\n />\n );\n };\n\n return renderCustomColumnMenuFilter(FilterCell, opts);\n}\n"],"names":["Component","Fragment","Checkbox","Radio","Input","Spinner","BodyText","renderCustomColumnMenuFilter","makeObservable","observable","runInAction","observer","SelectorAsync","componentDidMount","searchOptions","catch","render","selectedOptions","props","selected","Set","map","opt","value","ItemComponent","itemComponent","className","placeholder","onChange","handleSearch","onKeyDown","handleKeyDown","size","search","div","length","option","checked","renderer","error","shownOptions","filter","has","loading","event","key","stopPropagation","_0","data","dataFetcher","SelectorItemSingle","label","text","_","SelectorItemMultiple","asyncSelectColumnMenuFilter","multiple","renderItem","opts","contains","options","some","equals","FilterCell","handleChange","val","concat","undefined","operator","syntheticEvent"],"mappings":"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"}
@@ -63,8 +63,8 @@ class DateTimeFilterCell extends Component {
63
63
  this.operator = event.target.value;
64
64
  cellOperatorChange(event, this.props.value, this.props.onChange);
65
65
  }), _define_property(this, "handleChange", (event)=>{
66
- const value = event.value;
67
66
  var _this_props_operator;
67
+ const value = event.value;
68
68
  this.props.onChange({
69
69
  value,
70
70
  operator: (_this_props_operator = this.props.operator) !== null && _this_props_operator !== void 0 ? _this_props_operator : '',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/filters/datetime-filter/datetime-filter.tsx"],"sourcesContent":["import { Component, Fragment } from 'react';\n\nimport { observer } from 'mobx-react';\nimport { observable, action, makeObservable } from 'mobx';\n\nimport { DropDownList, DropDownListChangeEvent } from '@progress/kendo-react-dropdowns';\nimport {\n DatePicker,\n DatePickerChangeEvent,\n TimePicker,\n TimePickerChangeEvent,\n} 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 DateTimeFilterCell 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: DatePickerChangeEvent | TimePickerChangeEvent) => {\n const value = event.value;\n\n this.props.onChange({\n value,\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 <Fragment>\n <DatePicker\n value={this.props.value}\n onChange={this.handleChange}\n className=\"m-b-1\"\n />\n <TimePicker\n value={this.props.value}\n onChange={this.handleChange}\n className=\"m-b-1\"\n />\n </Fragment>\n )}\n </Fragment>\n );\n }\n}\n\nexport const DateTimeColumnMenuFilter = renderCustomColumnMenuFilter(DateTimeFilterCell, true);\n"],"names":["Component","Fragment","observer","observable","action","makeObservable","DropDownList","DatePicker","TimePicker","IsUnaryFilter","cellOperatorChange","renderCustomColumnMenuFilter","DateTimeFilterCell","render","value","operator","onChange","handleOperatorChange","data","props","operators","dataItemKey","className","textField","handleChange","find","o","event","target","syntheticEvent","DateTimeColumnMenuFilter"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,SAASA,SAAS,EAAEC,QAAQ,QAAQ,QAAQ;AAE5C,SAASC,QAAQ,QAAQ,aAAa;AACtC,SAASC,UAAU,EAAEC,MAAM,EAAEC,cAAc,QAAQ,OAAO;AAE1D,SAASC,YAAY,QAAiC,kCAAkC;AACxF,SACIC,UAAU,EAEVC,UAAU,QAEP,mCAAmC;AAE1C,SACIC,aAAa,EACbC,kBAAkB,QACf,mDAAmD;AAI1D,SAASC,4BAA4B,QAAQ,yBAAyB;AAEtE,MACMC,2BAA2BZ;IA0B7Ba,SAAS;QACL,qBACI,MAACZ;;8BACG,KAACK;oBACGQ,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,MAACd;;sCACG,KAACM;4BACGO,OAAO,IAAI,CAACK,KAAK,CAACL,KAAK;4BACvBE,UAAU,IAAI,CAACQ,YAAY;4BAC3BF,WAAU;;sCAEd,KAACd;4BACGM,OAAO,IAAI,CAACK,KAAK,CAACL,KAAK;4BACvBE,UAAU,IAAI,CAACQ,YAAY;4BAC3BF,WAAU;;;;;;IAMlC;IAhDA,YAAYH,KAA2B,CAAE;YAHrC;QAIA,KAAK,CAACA,QALV,uBAAYJ,YACR,CAAA,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;YACZ,MAAMb,QAAQa,MAAMb,KAAK;gBAIX;YAFd,IAAI,CAACK,KAAK,CAACH,QAAQ,CAAC;gBAChBF;gBACAC,UAAU,CAAA,uBAAA,IAAI,CAACI,KAAK,CAACJ,QAAQ,cAAnB,kCAAA,uBAAuB;gBACjCc,gBAAgBF,MAAME,cAAc;YACxC;QACJ;QAjBIxB,eAAe,IAAI;IACvB;AA8CJ;;;;;;;;;;;;;;AAEA,OAAO,MAAMyB,2BAA2BnB,6BAA6BC,oBAAoB,MAAM"}
1
+ {"version":3,"sources":["../../../src/filters/datetime-filter/datetime-filter.tsx"],"sourcesContent":["import { Component, Fragment } from 'react';\n\nimport { observer } from 'mobx-react';\nimport { observable, action, makeObservable } from 'mobx';\n\nimport { DropDownList, DropDownListChangeEvent } from '@progress/kendo-react-dropdowns';\nimport {\n DatePicker,\n DatePickerChangeEvent,\n TimePicker,\n TimePickerChangeEvent,\n} 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 DateTimeFilterCell 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: DatePickerChangeEvent | TimePickerChangeEvent) => {\n const value = event.value;\n\n this.props.onChange({\n value,\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 <Fragment>\n <DatePicker\n value={this.props.value}\n onChange={this.handleChange}\n className=\"m-b-1\"\n />\n <TimePicker\n value={this.props.value}\n onChange={this.handleChange}\n className=\"m-b-1\"\n />\n </Fragment>\n )}\n </Fragment>\n );\n }\n}\n\nexport const DateTimeColumnMenuFilter = renderCustomColumnMenuFilter(DateTimeFilterCell, true);\n"],"names":["Component","Fragment","observer","observable","action","makeObservable","DropDownList","DatePicker","TimePicker","IsUnaryFilter","cellOperatorChange","renderCustomColumnMenuFilter","DateTimeFilterCell","render","value","operator","onChange","handleOperatorChange","data","props","operators","dataItemKey","className","textField","handleChange","find","o","event","target","syntheticEvent","DateTimeColumnMenuFilter"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,SAASA,SAAS,EAAEC,QAAQ,QAAQ,QAAQ;AAE5C,SAASC,QAAQ,QAAQ,aAAa;AACtC,SAASC,UAAU,EAAEC,MAAM,EAAEC,cAAc,QAAQ,OAAO;AAE1D,SAASC,YAAY,QAAiC,kCAAkC;AACxF,SACIC,UAAU,EAEVC,UAAU,QAEP,mCAAmC;AAE1C,SACIC,aAAa,EACbC,kBAAkB,QACf,mDAAmD;AAI1D,SAASC,4BAA4B,QAAQ,yBAAyB;AAEtE,MACMC,2BAA2BZ;IA0B7Ba,SAAS;QACL,qBACI,MAACZ;;8BACG,KAACK;oBACGQ,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,MAACd;;sCACG,KAACM;4BACGO,OAAO,IAAI,CAACK,KAAK,CAACL,KAAK;4BACvBE,UAAU,IAAI,CAACQ,YAAY;4BAC3BF,WAAU;;sCAEd,KAACd;4BACGM,OAAO,IAAI,CAACK,KAAK,CAACL,KAAK;4BACvBE,UAAU,IAAI,CAACQ,YAAY;4BAC3BF,WAAU;;;;;;IAMlC;IAhDA,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;gBACAC,QAAQ,GAAE,uBAAA,IAAI,CAACI,KAAK,CAACJ,QAAQ,cAAnB,kCAAA,uBAAuB;gBACjCc,gBAAgBF,MAAME,cAAc;YACxC;QACJ;QAjBIxB,eAAe,IAAI;IACvB;AA8CJ;;;;;;;;;;;;;;AAEA,OAAO,MAAMyB,2BAA2BnB,6BAA6BC,oBAAoB,MAAM"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/filters/multiselect-filter/multiselect-filter.tsx"],"sourcesContent":["import { Component, SyntheticEvent, ReactNode, FC } from 'react';\n\nimport { TableFilterCellProps, Checkbox } from '@servicetitan/design-system';\n\nimport {\n CustomColumnMenuFilterSingleOpts,\n renderCustomColumnMenuFilter,\n} 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
+ {"version":3,"sources":["../../../src/filters/multiselect-filter/multiselect-filter.tsx"],"sourcesContent":["import { Component, SyntheticEvent, ReactNode, FC } from 'react';\n\nimport { TableFilterCellProps, Checkbox } from '@servicetitan/design-system';\n\nimport {\n CustomColumnMenuFilterSingleOpts,\n renderCustomColumnMenuFilter,\n} 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":";;;;;;;;;;;;;;AAAA,SAASA,SAAS,QAAuC,QAAQ;AAEjE,SAA+BC,QAAQ,QAAQ,8BAA8B;AAE7E,SAEIC,4BAA4B,QACzB,yBAAyB;AAShC,MAAMC,iBAAoBH;IAStBI,SAAS;QACL,MAAM,EAAEC,OAAO,EAAEC,KAAK,EAAEC,QAAQ,EAAE,GAAG,IAAI,CAACC,KAAK;QAE/C,OAAOH,QAAQI,GAAG,CAAC,CAACC,QAAQC,QACxB,oDAAoD;0BACpD,KAACC;gBAAiBC,WAAU;0BACxB,cAAA,KAACZ;oBACGK,OAAOI;oBACPI,OAAOP,WAAWA,SAASG,UAAUA;oBACrCK,SAAS,CAACT,kBAAAA,mBAAAA,QAAS,EAAE,EAAEU,QAAQ,CAACN;oBAChCO,UAAU,IAAI,CAACC,YAAY;;eALxBP;IASnB;;QAvBJ,gBACIO,uBAAAA,gBAAe,CAACR,QAAWK,SAAkBI;gBAElC,mBACA;YAFP,MAAMC,WAAWL,UACX,EAAC,oBAAA,IAAI,CAACP,KAAK,CAACF,KAAK,cAAhB,+BAAA,oBAAoB,EAAE,EAAEe,MAAM,CAACX,UAChC,EAAC,qBAAA,IAAI,CAACF,KAAK,CAACF,KAAK,cAAhB,gCAAA,qBAAoB,EAAE,EAAEgB,MAAM,CAACC,CAAAA,IAAKA,MAAMb;YAEjD,IAAI,CAACF,KAAK,CAACS,QAAQ,CAACG,SAASI,MAAM,GAAGJ,WAAWK,WAAWN;QAChE;;AAiBJ;AAEA,OAAO,SAASO,4BACZC,IAAS,EACTC,UAAmC,EACnCC,IAAuC;IAEvC,MAAMC,aAAuC,CAAC,EAAExB,KAAK,EAAEW,QAAQ,EAAE;QAC7D,MAAMC,eAAe,CAACZ,OAAwBa;YAC1CF,SAAS;gBACLX,KAAK,EAAEA,kBAAAA,mBAAAA,QAAS;gBAChByB,UAAUzB,QAAQ,OAAO;gBACzB0B,gBAAgBb;YACpB;QACJ;QAEA,qBACI,KAAChB;YACGE,SAASsB;YACTrB,OAAOA,UAAU,KAAKmB,YAAYnB;YAClCW,UAAUC;YACVX,UAAUqB;;IAGtB;IAEA,OAAO1B,6BAA6B4B,YAAYD;AACpD;AAEA,OAAO,SAASI,uCACZN,IAAS,EACTC,UAAmC,EACnCC,IAAuC;IAEvC,MAAMC,mBAAmB9B;QAerBI,SAAS;YACL,MAAM,EAAEE,KAAK,EAAE,GAAG,IAAI,CAACE,KAAK;YAE5B,qBACI,KAACL;gBACGE,SAASsB;gBACTrB,OAAOA,UAAU,KAAKmB,YAAYnB;gBAClCW,UAAU,IAAI,CAACC,YAAY;gBAC3BX,UAAUqB;;QAGtB;;YA1BJ,gBACIM,uBAAAA,YAAW,CAACC;gBACR,MAAM7B,QAAa,IAAI,CAACE,KAAK,CAACF,KAAK,IAAI,EAAE;gBAEzC,OAAOA,MAAM8B,IAAI,CAAC,CAACb,IAASY,IAAI,CAACZ,EAAE,KAAK;YAC5C,IAEAL,uBAAAA,gBAAe,CAACZ,OAAwBa;gBACpC,IAAI,CAACX,KAAK,CAACS,QAAQ,CAAC;oBAChBX,KAAK,EAAEA,kBAAAA,mBAAAA,QAAS;oBAChByB,UAAUzB,QAAQ,IAAI,CAAC4B,QAAQ,GAAG;oBAClCF,gBAAgBb;gBACpB;YACJ;;IAcJ;IAEA,OAAOjB,6BAA6B4B,YAAYD;AACpD;AAEA,OAAO,SAASQ,qCACZV,IAAS,EACTC,UAAmC,EACnCC,IAAuC;IAEvC,MAAMC,mBAAmB9B;QAerBI,SAAS;YACL,MAAM,EAAEE,KAAK,EAAE,GAAG,IAAI,CAACE,KAAK;YAE5B,qBACI,KAACL;gBACGE,SAASsB;gBACTrB,OAAOA,UAAU,KAAKmB,YAAYnB;gBAClCW,UAAU,IAAI,CAACC,YAAY;gBAC3BX,UAAUqB;;QAGtB;;YA1BJ,gBACIM,uBAAAA,YAAW,CAACC;gBACR,MAAM7B,QAAa,IAAI,CAACE,KAAK,CAACF,KAAK,IAAI,EAAE;gBAEzC,OAAOA,MAAM8B,IAAI,CAAC,CAACb,IAASe,MAAMC,OAAO,CAACJ,SAASA,KAAKnB,QAAQ,CAACO;YACrE,IAEAL,uBAAAA,gBAAe,CAACZ,OAAwBa;gBACpC,IAAI,CAACX,KAAK,CAACS,QAAQ,CAAC;oBAChBX,KAAK,EAAEA,kBAAAA,mBAAAA,QAAS;oBAChByB,UAAUzB,QAAQ,IAAI,CAAC4B,QAAQ,GAAG;oBAClCF,gBAAgBb;gBACpB;YACJ;;IAcJ;IAEA,OAAOjB,6BAA6B4B,YAAYD;AACpD"}
@@ -87,6 +87,7 @@ class SelectorAsync extends Component {
87
87
  });
88
88
  }
89
89
  async getData() {
90
+ var _this_props_data;
90
91
  var _this_props_search;
91
92
  if (this.props.dataFetcher) {
92
93
  const { data } = await this.props.dataFetcher({
@@ -94,7 +95,6 @@ class SelectorAsync extends Component {
94
95
  });
95
96
  return data;
96
97
  }
97
- var _this_props_data;
98
98
  let data = (_this_props_data = this.props.data) !== null && _this_props_data !== void 0 ? _this_props_data : [];
99
99
  if ((_this_props_search = this.props.search) === null || _this_props_search === void 0 ? void 0 : _this_props_search.filter) {
100
100
  data = data.filter(this.props.search.filter(this.search));
@@ -122,7 +122,7 @@ class SelectorAsync extends Component {
122
122
  this.error = false;
123
123
  this.loading = false;
124
124
  });
125
- } catch (e) {
125
+ } catch (unused) {
126
126
  runInAction(()=>{
127
127
  this.error = true;
128
128
  this.loading = false;
@@ -155,18 +155,18 @@ SelectorAsync = _ts_decorate([
155
155
  ])
156
156
  ], SelectorAsync);
157
157
  const SelectorItemSingle = ({ option, renderer, checked, onChange })=>{
158
- var _renderer;
158
+ var _ref;
159
159
  return /*#__PURE__*/ _jsx(Radio, {
160
- label: (_renderer = renderer === null || renderer === void 0 ? void 0 : renderer(option)) !== null && _renderer !== void 0 ? _renderer : `${option}`,
160
+ label: (_ref = renderer === null || renderer === void 0 ? void 0 : renderer(option)) !== null && _ref !== void 0 ? _ref : `${option}`,
161
161
  checked: checked,
162
162
  onChange: (_, event)=>onChange(option, true, event),
163
163
  className: "m-b-1"
164
164
  });
165
165
  };
166
166
  const SelectorItemMultiple = ({ option, renderer, checked, onChange })=>{
167
- var _renderer;
167
+ var _ref;
168
168
  return /*#__PURE__*/ _jsx(Checkbox, {
169
- label: (_renderer = renderer === null || renderer === void 0 ? void 0 : renderer(option)) !== null && _renderer !== void 0 ? _renderer : `${option}`,
169
+ label: (_ref = renderer === null || renderer === void 0 ? void 0 : renderer(option)) !== null && _ref !== void 0 ? _ref : `${option}`,
170
170
  checked: checked,
171
171
  onChange: (_, checked, event)=>onChange(option, checked, event),
172
172
  className: "m-b-1"
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/filters/select-filter/select-filter.tsx"],"sourcesContent":["import { Component, SyntheticEvent, ReactNode, Fragment, KeyboardEvent, FC } from 'react';\n\nimport {\n Checkbox,\n TableFilterCellProps,\n Radio,\n Input,\n Spinner,\n BodyText,\n} from '@servicetitan/design-system';\nimport { IdType } from '@servicetitan/data-query';\n\nimport {\n CustomColumnMenuFilterSingleOpts,\n renderCustomColumnMenuFilter,\n} 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>&nbsp;</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 { Component, SyntheticEvent, ReactNode, Fragment, KeyboardEvent, FC } from 'react';\n\nimport {\n Checkbox,\n TableFilterCellProps,\n Radio,\n Input,\n Spinner,\n BodyText,\n} from '@servicetitan/design-system';\nimport { IdType } from '@servicetitan/data-query';\n\nimport {\n CustomColumnMenuFilterSingleOpts,\n renderCustomColumnMenuFilter,\n} 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>&nbsp;</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 +1 @@
1
- {"version":3,"file":"single-select-filter.d.ts","sourceRoot":"","sources":["../../../src/filters/single-select/single-select-filter.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,SAAS,EAAM,MAAM,OAAO,CAAC;AAEjE,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAGlD,OAAO,EACH,gCAAgC,EAEnC,MAAM,wBAAwB,CAAC;AA8BhC,MAAM,WAAW,6BAA6B,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CACtD,SAAQ,gCAAgC;IACxC,OAAO,EAAE,EAAE,EAAE,CAAC;IACd,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC;IACjC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,SAAS,GAAG,MAAM,CAAC;IAC9C,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,KAAK,OAAO,CAAC;CAC1D;AAED,wBAAgB,4BAA4B,CAAC,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,EACrE,OAAO,EACP,aAAa,EACb,UAAU,EACV,cAAc,EACd,GAAG,IAAI,EACV,EAAE,6BAA6B,CAAC,EAAE,EAAE,EAAE,CAAC,gHA6BvC"}
1
+ {"version":3,"file":"single-select-filter.d.ts","sourceRoot":"","sources":["../../../src/filters/single-select/single-select-filter.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,SAAS,EAAM,MAAM,OAAO,CAAC;AAEjE,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAGlD,OAAO,EACH,gCAAgC,EAEnC,MAAM,wBAAwB,CAAC;AA8BhC,MAAM,WAAW,6BAA6B,CAC1C,EAAE,EACF,EAAE,GAAG,EAAE,CACT,SAAQ,gCAAgC;IACtC,OAAO,EAAE,EAAE,EAAE,CAAC;IACd,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC;IACjC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,SAAS,GAAG,MAAM,CAAC;IAC9C,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,KAAK,OAAO,CAAC;CAC1D;AAED,wBAAgB,4BAA4B,CAAC,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,EACrE,OAAO,EACP,aAAa,EACb,UAAU,EACV,cAAc,EACd,GAAG,IAAI,EACV,EAAE,6BAA6B,CAAC,EAAE,EAAE,EAAE,CAAC,gHA6BvC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/filters/single-select/single-select-filter.tsx"],"sourcesContent":["import { Component, SyntheticEvent, ReactNode, FC } from 'react';\n\nimport { IdType } from '@servicetitan/data-query';\nimport { TableFilterCellProps, Radio } from '@servicetitan/design-system';\n\nimport {\n CustomColumnMenuFilterSingleOpts,\n renderCustomColumnMenuFilter,\n} from '../column-menu-filters';\n\ninterface SelectorProps<TV, TO> {\n options: TO[];\n value?: TV;\n valueSelector(item: TO): TV;\n onChange(value: TV | undefined, event: SyntheticEvent<HTMLInputElement>): void;\n renderer?(item: TO): ReactNode;\n}\n\nclass SelectorRadio<TV, TO> extends Component<SelectorProps<TV, TO>> {\n render() {\n const { options, value, renderer } = this.props;\n\n return options.map((option, index) => {\n const optionValue = this.props.valueSelector(option);\n return (\n // eslint-disable-next-line react/no-array-index-key\n <span key={index} className=\"k-widget m-b-1-i d-b\">\n <Radio\n label={renderer ? renderer(option) : `${option}`}\n checked={value === optionValue}\n onChange={(_, event) => this.props.onChange(optionValue, event)}\n />\n </span>\n );\n });\n }\n}\n\nexport interface SingleSelectColumnMenuOptions<TV, TO = TV>\n extends CustomColumnMenuFilterSingleOpts {\n options: TO[];\n valueSelector?: (item: TO) => TV;\n renderItem?: (item: TO) => ReactNode | string;\n filterOperator?: (listItem: any, value: TV) => boolean;\n}\n\nexport function singleSelectColumnMenuFilter<TV extends IdType, TO = TV>({\n options,\n valueSelector,\n renderItem,\n filterOperator,\n ...opts\n}: SingleSelectColumnMenuOptions<TV, TO>) {\n const FilterCell: FC<TableFilterCellProps> = ({ value, onChange }) => {\n const handleChange = (value: TV | undefined, event: SyntheticEvent<HTMLInputElement>) => {\n const filter =\n value === undefined\n ? { value: '', operator: '' }\n : {\n value,\n operator: filterOperator ?? 'equals',\n };\n\n onChange({\n ...filter,\n syntheticEvent: event,\n });\n };\n\n return (\n <SelectorRadio\n options={options}\n value={value === '' ? undefined : value}\n onChange={handleChange}\n renderer={renderItem}\n valueSelector={valueSelector ?? (option => option)}\n />\n );\n };\n\n return renderCustomColumnMenuFilter(FilterCell, opts);\n}\n"],"names":["Component","Radio","renderCustomColumnMenuFilter","SelectorRadio","render","options","value","renderer","props","map","option","index","optionValue","valueSelector","span","className","label","checked","onChange","_","event","singleSelectColumnMenuFilter","renderItem","filterOperator","opts","FilterCell","handleChange","filter","undefined","operator","syntheticEvent"],"mappings":";AAAA,SAASA,SAAS,QAAuC,QAAQ;AAGjE,SAA+BC,KAAK,QAAQ,8BAA8B;AAE1E,SAEIC,4BAA4B,QACzB,yBAAyB;AAUhC,MAAMC,sBAA8BH;IAChCI,SAAS;QACL,MAAM,EAAEC,OAAO,EAAEC,KAAK,EAAEC,QAAQ,EAAE,GAAG,IAAI,CAACC,KAAK;QAE/C,OAAOH,QAAQI,GAAG,CAAC,CAACC,QAAQC;YACxB,MAAMC,cAAc,IAAI,CAACJ,KAAK,CAACK,aAAa,CAACH;YAC7C,OACI,oDAAoD;0BACpD,KAACI;gBAAiBC,WAAU;0BACxB,cAAA,KAACd;oBACGe,OAAOT,WAAWA,SAASG,UAAU,GAAGA,QAAQ;oBAChDO,SAASX,UAAUM;oBACnBM,UAAU,CAACC,GAAGC,QAAU,IAAI,CAACZ,KAAK,CAACU,QAAQ,CAACN,aAAaQ;;eAJtDT;QAQnB;IACJ;AACJ;AAUA,OAAO,SAASU,6BAAyD,EACrEhB,OAAO,EACPQ,aAAa,EACbS,UAAU,EACVC,cAAc,EACd,GAAGC,MACiC;IACpC,MAAMC,aAAuC,CAAC,EAAEnB,KAAK,EAAEY,QAAQ,EAAE;QAC7D,MAAMQ,eAAe,CAACpB,OAAuBc;YACzC,MAAMO,SACFrB,UAAUsB,YACJ;gBAAEtB,OAAO;gBAAIuB,UAAU;YAAG,IAC1B;gBACIvB;gBACAuB,UAAUN,2BAAAA,4BAAAA,iBAAkB;YAChC;YAEVL,SAAS;gBACL,GAAGS,MAAM;gBACTG,gBAAgBV;YACpB;QACJ;QAEA,qBACI,KAACjB;YACGE,SAASA;YACTC,OAAOA,UAAU,KAAKsB,YAAYtB;YAClCY,UAAUQ;YACVnB,UAAUe;YACVT,eAAeA,0BAAAA,2BAAAA,gBAAkBH,CAAAA,SAAUA;;IAGvD;IAEA,OAAOR,6BAA6BuB,YAAYD;AACpD"}
1
+ {"version":3,"sources":["../../../src/filters/single-select/single-select-filter.tsx"],"sourcesContent":["import { Component, SyntheticEvent, ReactNode, FC } from 'react';\n\nimport { IdType } from '@servicetitan/data-query';\nimport { TableFilterCellProps, Radio } from '@servicetitan/design-system';\n\nimport {\n CustomColumnMenuFilterSingleOpts,\n renderCustomColumnMenuFilter,\n} from '../column-menu-filters';\n\ninterface SelectorProps<TV, TO> {\n options: TO[];\n value?: TV;\n valueSelector(item: TO): TV;\n onChange(value: TV | undefined, event: SyntheticEvent<HTMLInputElement>): void;\n renderer?(item: TO): ReactNode;\n}\n\nclass SelectorRadio<TV, TO> extends Component<SelectorProps<TV, TO>> {\n render() {\n const { options, value, renderer } = this.props;\n\n return options.map((option, index) => {\n const optionValue = this.props.valueSelector(option);\n return (\n // eslint-disable-next-line react/no-array-index-key\n <span key={index} className=\"k-widget m-b-1-i d-b\">\n <Radio\n label={renderer ? renderer(option) : `${option}`}\n checked={value === optionValue}\n onChange={(_, event) => this.props.onChange(optionValue, event)}\n />\n </span>\n );\n });\n }\n}\n\nexport interface SingleSelectColumnMenuOptions<\n TV,\n TO = TV,\n> extends CustomColumnMenuFilterSingleOpts {\n options: TO[];\n valueSelector?: (item: TO) => TV;\n renderItem?: (item: TO) => ReactNode | string;\n filterOperator?: (listItem: any, value: TV) => boolean;\n}\n\nexport function singleSelectColumnMenuFilter<TV extends IdType, TO = TV>({\n options,\n valueSelector,\n renderItem,\n filterOperator,\n ...opts\n}: SingleSelectColumnMenuOptions<TV, TO>) {\n const FilterCell: FC<TableFilterCellProps> = ({ value, onChange }) => {\n const handleChange = (value: TV | undefined, event: SyntheticEvent<HTMLInputElement>) => {\n const filter =\n value === undefined\n ? { value: '', operator: '' }\n : {\n value,\n operator: filterOperator ?? 'equals',\n };\n\n onChange({\n ...filter,\n syntheticEvent: event,\n });\n };\n\n return (\n <SelectorRadio\n options={options}\n value={value === '' ? undefined : value}\n onChange={handleChange}\n renderer={renderItem}\n valueSelector={valueSelector ?? (option => option)}\n />\n );\n };\n\n return renderCustomColumnMenuFilter(FilterCell, opts);\n}\n"],"names":["Component","Radio","renderCustomColumnMenuFilter","SelectorRadio","render","options","value","renderer","props","map","option","index","optionValue","valueSelector","span","className","label","checked","onChange","_","event","singleSelectColumnMenuFilter","renderItem","filterOperator","opts","FilterCell","handleChange","filter","undefined","operator","syntheticEvent"],"mappings":";AAAA,SAASA,SAAS,QAAuC,QAAQ;AAGjE,SAA+BC,KAAK,QAAQ,8BAA8B;AAE1E,SAEIC,4BAA4B,QACzB,yBAAyB;AAUhC,MAAMC,sBAA8BH;IAChCI,SAAS;QACL,MAAM,EAAEC,OAAO,EAAEC,KAAK,EAAEC,QAAQ,EAAE,GAAG,IAAI,CAACC,KAAK;QAE/C,OAAOH,QAAQI,GAAG,CAAC,CAACC,QAAQC;YACxB,MAAMC,cAAc,IAAI,CAACJ,KAAK,CAACK,aAAa,CAACH;YAC7C,OACI,oDAAoD;0BACpD,KAACI;gBAAiBC,WAAU;0BACxB,cAAA,KAACd;oBACGe,OAAOT,WAAWA,SAASG,UAAU,GAAGA,QAAQ;oBAChDO,SAASX,UAAUM;oBACnBM,UAAU,CAACC,GAAGC,QAAU,IAAI,CAACZ,KAAK,CAACU,QAAQ,CAACN,aAAaQ;;eAJtDT;QAQnB;IACJ;AACJ;AAYA,OAAO,SAASU,6BAAyD,EACrEhB,OAAO,EACPQ,aAAa,EACbS,UAAU,EACVC,cAAc,EACd,GAAGC,MACiC;IACpC,MAAMC,aAAuC,CAAC,EAAEnB,KAAK,EAAEY,QAAQ,EAAE;QAC7D,MAAMQ,eAAe,CAACpB,OAAuBc;YACzC,MAAMO,SACFrB,UAAUsB,YACJ;gBAAEtB,OAAO;gBAAIuB,UAAU;YAAG,IAC1B;gBACIvB;gBACAuB,QAAQ,EAAEN,2BAAAA,4BAAAA,iBAAkB;YAChC;YAEVL,SAAS;gBACL,GAAGS,MAAM;gBACTG,gBAAgBV;YACpB;QACJ;QAEA,qBACI,KAACjB;YACGE,SAASA;YACTC,OAAOA,UAAU,KAAKsB,YAAYtB;YAClCY,UAAUQ;YACVnB,UAAUe;YACVT,aAAa,EAAEA,0BAAAA,2BAAAA,gBAAkBH,CAAAA,SAAUA;;IAGvD;IAEA,OAAOR,6BAA6BuB,YAAYD;AACpD"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/filters/standard-filter-with-multiselect/filter-cell-ext.tsx"],"sourcesContent":["import { ReactElement, ReactNode, FC, ChangeEvent } from 'react';\nimport { runInAction } from 'mobx';\nimport { observer, useLocalStore } from 'mobx-react';\nimport { multiselectOperators, isMultiselectOperator } from './multiselect-operators';\n\nimport {\n DropDownList,\n DropDownListChangeEvent,\n MultiSelect,\n MultiSelectChangeEvent,\n MultiSelectFilterChangeEvent,\n ListItemProps,\n MultiSelectTagData,\n} from '@progress/kendo-react-dropdowns';\n\nimport { GridColumnMenuFilterCellProps as TableColumnMenuFilterCellProps } from '@progress/kendo-react-grid/dist/npm/columnMenu/GridColumnMenuFilterCell';\nimport {\n IsUnaryFilter,\n cellOperatorChange,\n} from '@progress/kendo-react-grid/dist/npm/filterCommon';\n\nimport { Icon, Tooltip } from '@servicetitan/design-system';\n\nimport * as Styles from './filter-cell-ext.module.css';\nimport classNames from 'classnames';\n//\n\ninterface ValueWithLowerCase {\n value: any;\n text: string;\n textLC: string;\n}\n\nexport interface FilterCellExtProps extends TableColumnMenuFilterCellProps {\n options: ValueWithLowerCase[];\n maxFoundValues?: number;\n allowCustomValues?: boolean;\n onlyMultiselectAndEmptyOperators?: boolean;\n handleCustomValuesAsNumber?: boolean;\n multiselectItemRender?(li: ReactElement<HTMLLIElement>, itemProps: ListItemProps): ReactNode;\n multiselectTagRender?(\n tagData: MultiSelectTagData,\n li: ReactElement<HTMLLIElement>\n ): ReactElement<HTMLLIElement>;\n multiselectListNoDataRender?(element: ReactElement<HTMLDivElement>): ReactNode;\n}\n\n// like standard filter cell (rendered for string type), but with support of multiselect operators\nexport const FilterCellExt: FC<FilterCellExtProps> = observer(props => {\n const store = useLocalStore(\n oprops => ({\n get operators() {\n return multiselectOperators.concat(\n oprops.onlyMultiselectAndEmptyOperators\n ? oprops.operators.filter(\n o => o.operator === 'isempty' || o.operator === 'isnotempty'\n )\n : oprops.operators\n );\n },\n get operatorValue() {\n return this.operators.find(item => item.operator === oprops.operator);\n },\n searchQuery: '',\n filterChange(event: MultiSelectFilterChangeEvent) {\n runInAction(() => (this.searchQuery = event.filter.value));\n },\n get filteredValuesSet() {\n const queryLC = this.searchQuery.toLowerCase();\n return oprops.options.filter(v => v.textLC.includes(queryLC));\n },\n get onlyFirstValues() {\n return oprops.maxFoundValues &&\n oprops.maxFoundValues < this.filteredValuesSet.length\n ? oprops.maxFoundValues\n : false;\n },\n get filteredVisibleValues() {\n return this.onlyFirstValues\n ? this.filteredValuesSet.slice(0, this.onlyFirstValues)\n : this.filteredValuesSet;\n },\n get valueTextMap() {\n return new Map(oprops.options.map(o => [o.value, o.text]));\n },\n get multiselectValue() {\n return Array.isArray(oprops.value)\n ? oprops.value.map(v => ({\n value: v,\n text: this.valueTextMap.get(v) ?? v.toString(),\n }))\n : [];\n },\n }),\n props\n );\n\n const {\n operator = '',\n onChange,\n allowCustomValues,\n multiselectItemRender,\n multiselectTagRender,\n multiselectListNoDataRender,\n } = props;\n\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) =>\n onChange({\n operator,\n value: e.target.value,\n syntheticEvent: e,\n });\n\n const handleMultiselectChange = (e: MultiSelectChangeEvent) => {\n const newValue = e.value.map(\n (v: any) => v.value ?? (props.handleCustomValuesAsNumber ? +v.text : v.text)\n );\n onChange({\n operator,\n value: newValue.length ? newValue : '', // for Kendo to handle empty array as an empty value TODO: check if there is another way\n syntheticEvent: e.syntheticEvent,\n });\n };\n\n // conversions for better compatibility when switching plain/array operators\n const handleOperatorChange = (event: DropDownListChangeEvent) => {\n const newValue =\n isMultiselectOperator(operator) === isMultiselectOperator(event.target.value.operator)\n ? props.value\n : '';\n cellOperatorChange(event, newValue, onChange);\n };\n\n const allowCustomAdd =\n (allowCustomValues &&\n store.searchQuery &&\n (!props.handleCustomValuesAsNumber || !isNaN(+store.searchQuery))) ||\n false;\n\n return (\n <div>\n <DropDownList\n value={store.operatorValue}\n onChange={handleOperatorChange}\n data={store.operators}\n className=\"m-b-1\"\n textField=\"text\"\n />\n {(typeof operator !== 'string' || !IsUnaryFilter(operator)) &&\n (isMultiselectOperator(operator) ? (\n <MultiSelect\n value={store.multiselectValue}\n onChange={handleMultiselectChange}\n filterable\n onFilterChange={store.filterChange}\n allowCustom={allowCustomAdd}\n data={store.filteredVisibleValues}\n textField=\"text\"\n dataItemKey=\"value\"\n className={classNames('m-b-1', Styles.multiSelect)}\n header={allowCustomAdd && <div className={Styles.customItemAddMarker} />}\n footer={\n allowCustomAdd ? (\n <div className={Styles.returnToUse}>\n <Icon name=\"keyboard_return\" />\n to create filter\n </div>\n ) : (\n store.onlyFirstValues && (\n <div className={Styles.returnToUse}>\n First {store.onlyFirstValues} values are shown. <br />\n Type to search for other values.\n </div>\n )\n )\n }\n itemRender={multiselectItemRender}\n tagRender={multiselectTagRender ?? defaultMultiselectTagRender}\n listNoDataRender={multiselectListNoDataRender}\n />\n ) : (\n <input\n className=\"k-input k-input-md k-rounded-md k-input-solid m-b-1\"\n value={props.value}\n onChange={handleInputChange}\n />\n ))}\n </div>\n );\n});\n\nconst defaultMultiselectTagRender = (\n tagData: MultiSelectTagData,\n li: ReactElement<HTMLLIElement>\n): ReactElement<HTMLLIElement> => {\n return (\n <Tooltip\n portal\n text={tagData.text}\n className={Styles.multiSelectTagTooltipWrapper}\n popperClassName={Styles.multiSelectTagTooltip}\n >\n {li}\n </Tooltip>\n );\n};\n"],"names":["runInAction","observer","useLocalStore","multiselectOperators","isMultiselectOperator","DropDownList","MultiSelect","IsUnaryFilter","cellOperatorChange","Icon","Tooltip","Styles","classNames","FilterCellExt","props","store","oprops","operators","concat","onlyMultiselectAndEmptyOperators","filter","o","operator","operatorValue","find","item","searchQuery","filterChange","event","value","filteredValuesSet","queryLC","toLowerCase","options","v","textLC","includes","onlyFirstValues","maxFoundValues","length","filteredVisibleValues","slice","valueTextMap","Map","map","text","multiselectValue","Array","isArray","get","toString","onChange","allowCustomValues","multiselectItemRender","multiselectTagRender","multiselectListNoDataRender","handleInputChange","e","target","syntheticEvent","handleMultiselectChange","newValue","handleCustomValuesAsNumber","handleOperatorChange","allowCustomAdd","isNaN","div","data","className","textField","filterable","onFilterChange","allowCustom","dataItemKey","multiSelect","header","customItemAddMarker","footer","returnToUse","name","br","itemRender","tagRender","defaultMultiselectTagRender","listNoDataRender","input","tagData","li","portal","multiSelectTagTooltipWrapper","popperClassName","multiSelectTagTooltip"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/filters/standard-filter-with-multiselect/filter-cell-ext.tsx"],"sourcesContent":["import { ReactElement, ReactNode, FC, ChangeEvent } from 'react';\nimport { runInAction } from 'mobx';\nimport { observer, useLocalStore } from 'mobx-react';\nimport { multiselectOperators, isMultiselectOperator } from './multiselect-operators';\n\nimport {\n DropDownList,\n DropDownListChangeEvent,\n MultiSelect,\n MultiSelectChangeEvent,\n MultiSelectFilterChangeEvent,\n ListItemProps,\n MultiSelectTagData,\n} from '@progress/kendo-react-dropdowns';\n\nimport { GridColumnMenuFilterCellProps as TableColumnMenuFilterCellProps } from '@progress/kendo-react-grid/dist/npm/columnMenu/GridColumnMenuFilterCell';\nimport {\n IsUnaryFilter,\n cellOperatorChange,\n} from '@progress/kendo-react-grid/dist/npm/filterCommon';\n\nimport { Icon, Tooltip } from '@servicetitan/design-system';\n\nimport * as Styles from './filter-cell-ext.module.css';\nimport classNames from 'classnames';\n//\n\ninterface ValueWithLowerCase {\n value: any;\n text: string;\n textLC: string;\n}\n\nexport interface FilterCellExtProps extends TableColumnMenuFilterCellProps {\n options: ValueWithLowerCase[];\n maxFoundValues?: number;\n allowCustomValues?: boolean;\n onlyMultiselectAndEmptyOperators?: boolean;\n handleCustomValuesAsNumber?: boolean;\n multiselectItemRender?(li: ReactElement<HTMLLIElement>, itemProps: ListItemProps): ReactNode;\n multiselectTagRender?(\n tagData: MultiSelectTagData,\n li: ReactElement<HTMLLIElement>\n ): ReactElement<HTMLLIElement>;\n multiselectListNoDataRender?(element: ReactElement<HTMLDivElement>): ReactNode;\n}\n\n// like standard filter cell (rendered for string type), but with support of multiselect operators\nexport const FilterCellExt: FC<FilterCellExtProps> = observer(props => {\n const store = useLocalStore(\n oprops => ({\n get operators() {\n return multiselectOperators.concat(\n oprops.onlyMultiselectAndEmptyOperators\n ? oprops.operators.filter(\n o => o.operator === 'isempty' || o.operator === 'isnotempty'\n )\n : oprops.operators\n );\n },\n get operatorValue() {\n return this.operators.find(item => item.operator === oprops.operator);\n },\n searchQuery: '',\n filterChange(event: MultiSelectFilterChangeEvent) {\n runInAction(() => (this.searchQuery = event.filter.value));\n },\n get filteredValuesSet() {\n const queryLC = this.searchQuery.toLowerCase();\n return oprops.options.filter(v => v.textLC.includes(queryLC));\n },\n get onlyFirstValues() {\n return oprops.maxFoundValues &&\n oprops.maxFoundValues < this.filteredValuesSet.length\n ? oprops.maxFoundValues\n : false;\n },\n get filteredVisibleValues() {\n return this.onlyFirstValues\n ? this.filteredValuesSet.slice(0, this.onlyFirstValues)\n : this.filteredValuesSet;\n },\n get valueTextMap() {\n return new Map(oprops.options.map(o => [o.value, o.text]));\n },\n get multiselectValue() {\n return Array.isArray(oprops.value)\n ? oprops.value.map(v => ({\n value: v,\n text: this.valueTextMap.get(v) ?? v.toString(),\n }))\n : [];\n },\n }),\n props\n );\n\n const {\n operator = '',\n onChange,\n allowCustomValues,\n multiselectItemRender,\n multiselectTagRender,\n multiselectListNoDataRender,\n } = props;\n\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) =>\n onChange({\n operator,\n value: e.target.value,\n syntheticEvent: e,\n });\n\n const handleMultiselectChange = (e: MultiSelectChangeEvent) => {\n const newValue = e.value.map(\n (v: any) => v.value ?? (props.handleCustomValuesAsNumber ? +v.text : v.text)\n );\n onChange({\n operator,\n value: newValue.length ? newValue : '', // for Kendo to handle empty array as an empty value TODO: check if there is another way\n syntheticEvent: e.syntheticEvent,\n });\n };\n\n // conversions for better compatibility when switching plain/array operators\n const handleOperatorChange = (event: DropDownListChangeEvent) => {\n const newValue =\n isMultiselectOperator(operator) === isMultiselectOperator(event.target.value.operator)\n ? props.value\n : '';\n cellOperatorChange(event, newValue, onChange);\n };\n\n const allowCustomAdd =\n (allowCustomValues &&\n store.searchQuery &&\n (!props.handleCustomValuesAsNumber || !isNaN(+store.searchQuery))) ||\n false;\n\n return (\n <div>\n <DropDownList\n value={store.operatorValue}\n onChange={handleOperatorChange}\n data={store.operators}\n className=\"m-b-1\"\n textField=\"text\"\n />\n {(typeof operator !== 'string' || !IsUnaryFilter(operator)) &&\n (isMultiselectOperator(operator) ? (\n <MultiSelect\n value={store.multiselectValue}\n onChange={handleMultiselectChange}\n filterable\n onFilterChange={store.filterChange}\n allowCustom={allowCustomAdd}\n data={store.filteredVisibleValues}\n textField=\"text\"\n dataItemKey=\"value\"\n className={classNames('m-b-1', Styles.multiSelect)}\n header={allowCustomAdd && <div className={Styles.customItemAddMarker} />}\n footer={\n allowCustomAdd ? (\n <div className={Styles.returnToUse}>\n <Icon name=\"keyboard_return\" />\n to create filter\n </div>\n ) : (\n store.onlyFirstValues && (\n <div className={Styles.returnToUse}>\n First {store.onlyFirstValues} values are shown. <br />\n Type to search for other values.\n </div>\n )\n )\n }\n itemRender={multiselectItemRender}\n tagRender={multiselectTagRender ?? defaultMultiselectTagRender}\n listNoDataRender={multiselectListNoDataRender}\n />\n ) : (\n <input\n className=\"k-input k-input-md k-rounded-md k-input-solid m-b-1\"\n value={props.value}\n onChange={handleInputChange}\n />\n ))}\n </div>\n );\n});\n\nconst defaultMultiselectTagRender = (\n tagData: MultiSelectTagData,\n li: ReactElement<HTMLLIElement>\n): ReactElement<HTMLLIElement> => {\n return (\n <Tooltip\n portal\n text={tagData.text}\n className={Styles.multiSelectTagTooltipWrapper}\n popperClassName={Styles.multiSelectTagTooltip}\n >\n {li}\n </Tooltip>\n );\n};\n"],"names":["runInAction","observer","useLocalStore","multiselectOperators","isMultiselectOperator","DropDownList","MultiSelect","IsUnaryFilter","cellOperatorChange","Icon","Tooltip","Styles","classNames","FilterCellExt","props","store","oprops","operators","concat","onlyMultiselectAndEmptyOperators","filter","o","operator","operatorValue","find","item","searchQuery","filterChange","event","value","filteredValuesSet","queryLC","toLowerCase","options","v","textLC","includes","onlyFirstValues","maxFoundValues","length","filteredVisibleValues","slice","valueTextMap","Map","map","text","multiselectValue","Array","isArray","get","toString","onChange","allowCustomValues","multiselectItemRender","multiselectTagRender","multiselectListNoDataRender","handleInputChange","e","target","syntheticEvent","handleMultiselectChange","newValue","handleCustomValuesAsNumber","handleOperatorChange","allowCustomAdd","isNaN","div","data","className","textField","filterable","onFilterChange","allowCustom","dataItemKey","multiSelect","header","customItemAddMarker","footer","returnToUse","name","br","itemRender","tagRender","defaultMultiselectTagRender","listNoDataRender","input","tagData","li","portal","multiSelectTagTooltipWrapper","popperClassName","multiSelectTagTooltip"],"mappings":"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"}
@@ -5,8 +5,8 @@ import { multiselectOperators } from './multiselect-operators';
5
5
  // constructor override: if state.filterGroup was filled with default, we override it with new default
6
6
  export class TableColumnMenuFilterExt extends TableColumnMenuFilter {
7
7
  constructor(props){
8
- super(props);
9
8
  var _props_column_filter;
9
+ super(props);
10
10
  const defaultOperator = getDefaultOperator(props.filterOperators, (_props_column_filter = props.column.filter) !== null && _props_column_filter !== void 0 ? _props_column_filter : 'text');
11
11
  // I know the check is a bit hacky, but that's compensated with its low criticality: even if it fails, nothing really bad happens
12
12
  if (comparer.structural(this.state.filterGroup, {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/filters/standard-filter-with-multiselect/table-column-menu-filter-ext.tsx"],"sourcesContent":["import { comparer } from 'mobx';\n\nimport { TableColumnMenuFilter } from '@servicetitan/design-system';\nimport { GridColumnMenuFilterProps as TableColumnMenuFilterProps } from '@progress/kendo-react-grid/dist/npm/columnMenu/GridColumnMenuFilter';\nimport { getDefaultOperator } from '@progress/kendo-react-grid/dist/npm/filterCommon';\n\nimport { multiselectOperators } from './multiselect-operators';\n\n// constructor override: if state.filterGroup was filled with default, we override it with new default\nexport class TableColumnMenuFilterExt extends TableColumnMenuFilter {\n constructor(props: TableColumnMenuFilterProps) {\n super(props);\n\n const defaultOperator = getDefaultOperator(\n props.filterOperators,\n props.column.filter ?? 'text'\n );\n // I know the check is a bit hacky, but that's compensated with its low criticality: even if it fails, nothing really bad happens\n if (\n comparer.structural(this.state.filterGroup, {\n logic: 'and',\n filters: [\n { field: props.column.field, operator: defaultOperator },\n { field: props.column.field, operator: defaultOperator },\n ],\n })\n ) {\n const newDefaultOperator = multiselectOperators[0].operator;\n this.state = {\n ...this.state,\n filterGroup: {\n logic: 'and',\n filters: [\n { field: props.column.field, operator: newDefaultOperator },\n { field: props.column.field, operator: newDefaultOperator },\n ],\n },\n };\n }\n }\n}\n"],"names":["comparer","TableColumnMenuFilter","getDefaultOperator","multiselectOperators","TableColumnMenuFilterExt","props","defaultOperator","filterOperators","column","filter","structural","state","filterGroup","logic","filters","field","operator","newDefaultOperator"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,OAAO;AAEhC,SAASC,qBAAqB,QAAQ,8BAA8B;AAEpE,SAASC,kBAAkB,QAAQ,mDAAmD;AAEtF,SAASC,oBAAoB,QAAQ,0BAA0B;AAE/D,sGAAsG;AACtG,OAAO,MAAMC,iCAAiCH;IAC1C,YAAYI,KAAiC,CAAE;QAC3C,KAAK,CAACA;YAIFA;QAFJ,MAAMC,kBAAkBJ,mBACpBG,MAAME,eAAe,EACrBF,CAAAA,uBAAAA,MAAMG,MAAM,CAACC,MAAM,cAAnBJ,kCAAAA,uBAAuB;QAE3B,iIAAiI;QACjI,IACIL,SAASU,UAAU,CAAC,IAAI,CAACC,KAAK,CAACC,WAAW,EAAE;YACxCC,OAAO;YACPC,SAAS;gBACL;oBAAEC,OAAOV,MAAMG,MAAM,CAACO,KAAK;oBAAEC,UAAUV;gBAAgB;gBACvD;oBAAES,OAAOV,MAAMG,MAAM,CAACO,KAAK;oBAAEC,UAAUV;gBAAgB;aAC1D;QACL,IACF;YACE,MAAMW,qBAAqBd,oBAAoB,CAAC,EAAE,CAACa,QAAQ;YAC3D,IAAI,CAACL,KAAK,GAAG;gBACT,GAAG,IAAI,CAACA,KAAK;gBACbC,aAAa;oBACTC,OAAO;oBACPC,SAAS;wBACL;4BAAEC,OAAOV,MAAMG,MAAM,CAACO,KAAK;4BAAEC,UAAUC;wBAAmB;wBAC1D;4BAAEF,OAAOV,MAAMG,MAAM,CAACO,KAAK;4BAAEC,UAAUC;wBAAmB;qBAC7D;gBACL;YACJ;QACJ;IACJ;AACJ"}
1
+ {"version":3,"sources":["../../../src/filters/standard-filter-with-multiselect/table-column-menu-filter-ext.tsx"],"sourcesContent":["import { comparer } from 'mobx';\n\nimport { TableColumnMenuFilter } from '@servicetitan/design-system';\nimport { GridColumnMenuFilterProps as TableColumnMenuFilterProps } from '@progress/kendo-react-grid/dist/npm/columnMenu/GridColumnMenuFilter';\nimport { getDefaultOperator } from '@progress/kendo-react-grid/dist/npm/filterCommon';\n\nimport { multiselectOperators } from './multiselect-operators';\n\n// constructor override: if state.filterGroup was filled with default, we override it with new default\nexport class TableColumnMenuFilterExt extends TableColumnMenuFilter {\n constructor(props: TableColumnMenuFilterProps) {\n super(props);\n\n const defaultOperator = getDefaultOperator(\n props.filterOperators,\n props.column.filter ?? 'text'\n );\n // I know the check is a bit hacky, but that's compensated with its low criticality: even if it fails, nothing really bad happens\n if (\n comparer.structural(this.state.filterGroup, {\n logic: 'and',\n filters: [\n { field: props.column.field, operator: defaultOperator },\n { field: props.column.field, operator: defaultOperator },\n ],\n })\n ) {\n const newDefaultOperator = multiselectOperators[0].operator;\n this.state = {\n ...this.state,\n filterGroup: {\n logic: 'and',\n filters: [\n { field: props.column.field, operator: newDefaultOperator },\n { field: props.column.field, operator: newDefaultOperator },\n ],\n },\n };\n }\n }\n}\n"],"names":["comparer","TableColumnMenuFilter","getDefaultOperator","multiselectOperators","TableColumnMenuFilterExt","props","defaultOperator","filterOperators","column","filter","structural","state","filterGroup","logic","filters","field","operator","newDefaultOperator"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,OAAO;AAEhC,SAASC,qBAAqB,QAAQ,8BAA8B;AAEpE,SAASC,kBAAkB,QAAQ,mDAAmD;AAEtF,SAASC,oBAAoB,QAAQ,0BAA0B;AAE/D,sGAAsG;AACtG,OAAO,MAAMC,iCAAiCH;IAC1C,YAAYI,KAAiC,CAAE;YAKvCA;QAJJ,KAAK,CAACA;QAEN,MAAMC,kBAAkBJ,mBACpBG,MAAME,eAAe,GACrBF,uBAAAA,MAAMG,MAAM,CAACC,MAAM,cAAnBJ,kCAAAA,uBAAuB;QAE3B,iIAAiI;QACjI,IACIL,SAASU,UAAU,CAAC,IAAI,CAACC,KAAK,CAACC,WAAW,EAAE;YACxCC,OAAO;YACPC,SAAS;gBACL;oBAAEC,OAAOV,MAAMG,MAAM,CAACO,KAAK;oBAAEC,UAAUV;gBAAgB;gBACvD;oBAAES,OAAOV,MAAMG,MAAM,CAACO,KAAK;oBAAEC,UAAUV;gBAAgB;aAC1D;QACL,IACF;YACE,MAAMW,qBAAqBd,oBAAoB,CAAC,EAAE,CAACa,QAAQ;YAC3D,IAAI,CAACL,KAAK,GAAG;gBACT,GAAG,IAAI,CAACA,KAAK;gBACbC,aAAa;oBACTC,OAAO;oBACPC,SAAS;wBACL;4BAAEC,OAAOV,MAAMG,MAAM,CAACO,KAAK;4BAAEC,UAAUC;wBAAmB;wBAC1D;4BAAEF,OAAOV,MAAMG,MAAM,CAACO,KAAK;4BAAEC,UAAUC;wBAAmB;qBAC7D;gBACL;YACJ;QACJ;IACJ;AACJ"}
@@ -54,8 +54,8 @@ class TimeFilterCell extends Component {
54
54
  this.operator = event.target.value;
55
55
  cellOperatorChange(event, this.props.value, this.props.onChange);
56
56
  }), _define_property(this, "handleChange", (event)=>{
57
- const value = event.value;
58
57
  var _this_props_operator;
58
+ const value = event.value;
59
59
  this.props.onChange({
60
60
  value: value ? new Date(2000, 0, 1, value.getHours(), value.getMinutes()) : null,
61
61
  operator: (_this_props_operator = this.props.operator) !== null && _this_props_operator !== void 0 ? _this_props_operator : '',
@@ -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 { DropDownList, DropDownListChangeEvent } from '@progress/kendo-react-dropdowns';\nimport { TimePicker, TimePickerChangeEvent } 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;AAE1D,SAASC,YAAY,QAAiC,kCAAkC;AACxF,SAASC,UAAU,QAA+B,mCAAmC;AAErF,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,YACR,CAAA,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;YACZ,MAAMb,QAAQa,MAAMb,KAAK;gBAIX;YAFd,IAAI,CAACK,KAAK,CAACH,QAAQ,CAAC;gBAChBF,OAAOA,QAAQ,IAAIe,KAAK,MAAM,GAAG,GAAGf,MAAMgB,QAAQ,IAAIhB,MAAMiB,UAAU,MAAM;gBAC5EhB,UAAU,CAAA,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"}
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 { DropDownList, DropDownListChangeEvent } from '@progress/kendo-react-dropdowns';\nimport { TimePicker, TimePickerChangeEvent } 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;AAE1D,SAASC,YAAY,QAAiC,kCAAkC;AACxF,SAASC,UAAU,QAA+B,mCAAmC;AAErF,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"}
@@ -1 +1 @@
1
- {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../src/table.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../src/table.tsx"],"names":[],"mappings":"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"}
package/dist/table.js CHANGED
@@ -93,10 +93,10 @@ export class Table extends Component {
93
93
  });
94
94
  }
95
95
  getPageable() {
96
+ var _this_props_pager;
96
97
  if (this.props.scrollable === 'virtual' || !this.tableState.pageSize) {
97
98
  return false;
98
99
  }
99
- var _this_props_pager;
100
100
  return (_this_props_pager = this.props.pager) !== null && _this_props_pager !== void 0 ? _this_props_pager : true;
101
101
  }
102
102
  constructor(props){
package/dist/table.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/table.tsx"],"sourcesContent":["import {\n isValidElement,\n Component,\n createRef,\n cloneElement,\n Children,\n Fragment,\n ReactNode,\n ReactElement,\n ComponentType,\n FC,\n ComponentProps,\n} from 'react';\nimport {\n Announcement,\n Table as AnvilTable,\n TableProps as AnvilTableProps,\n TableRowProps,\n TableColumn,\n TableColumnProps as AnvilTableColumnProps,\n TableCellProps as AnvilTableCellProps,\n TableHeaderCellProps,\n TableHeaderSelectionChangeEvent,\n TableSelectionChangeEvent,\n TablePagerSettings,\n} from '@servicetitan/design-system';\nimport { operators as kendoOperators } from '@progress/kendo-react-grid/dist/npm/filterCommon';\nimport { GridPDFExport as TablePDFExport } from '@progress/kendo-react-pdf';\nimport { ExcelExport } from '@progress/kendo-react-excel-export';\nimport { observer } from 'mobx-react';\nimport { GRID_COL_INDEX_ATTRIBUTE } from '@progress/kendo-react-grid';\n\nimport { AsyncDataSource, IdType } from '@servicetitan/data-query';\nimport { TableState, Selectable } from './table-state';\nimport {\n SelectionControlType,\n SelectColumnCell,\n SelectHeaderCell,\n} from './select-cell/select-cell';\nimport memoizeOne from 'memoize-one';\n\nimport classNames from 'classnames';\nimport * as Styles from './table.module.css';\nimport { action, makeObservable, observable } from 'mobx';\nimport { useTdProps } from './utils/use-td-props';\n\nconst { text: textOperators, ...operators } = kendoOperators;\noperators.text = [\n ...textOperators.filter(o => o.operator !== 'isnull' && o.operator !== 'isnotnull'),\n];\n\nfunction isColumnElement<\n T = never,\n TId extends IdType = any,\n P = never,\n PId extends IdType = never,\n>(element: ReactNode): element is ReactElement<TableColumnProps<T, TId, P, PId>> {\n if (!isValidElement(element)) {\n return false;\n }\n\n const elementType = (element as ReactElement).type;\n\n return elementType === TableColumn || (elementType as any).originalType === TableColumn;\n}\n\nexport interface TableCellProps<\n T = never,\n TId extends IdType = any,\n P = never,\n PId extends IdType = never,\n> extends AnvilTableCellProps {\n tableState?: TableState<T, TId, P, PId>;\n tdProps?: ComponentProps<'td'> & {\n [GRID_COL_INDEX_ATTRIBUTE]?: number;\n };\n}\n\ninterface TableColumnProps<\n T = never,\n TId extends IdType = any,\n P = never,\n PId extends IdType = never,\n> extends AnvilTableColumnProps {\n cell?: ComponentType<TableCellProps<T, TId, P, PId>>;\n children?: ReactElement<TableColumnProps<T, TId, P, PId>>[];\n}\n\ntype ExcludedTableProps =\n | 'data'\n | 'dataItemKey'\n | 'editField'\n | 'filter'\n | 'onFilterChange'\n | 'group'\n | 'onGroupChange'\n | 'onExpandChange'\n | 'expandField'\n | 'sort'\n | 'onSortChange'\n | 'onHeaderSelectionChange'\n | 'onSelectionChange'\n | 'selectedField'\n | 'pageable'\n | 'pageSize'\n | 'skip'\n | 'onPageChange'\n | 'total'\n | 'selectable'\n | 'pager';\n\nexport interface TableProps<T, TId extends IdType = any, P = never, PId extends IdType = never>\n extends Omit<AnvilTableProps, ExcludedTableProps> {\n selectable?: boolean;\n exportable?: boolean;\n hideSelectAll?: boolean;\n exportFileName?: string;\n tableState: TableState<T, TId, P, PId>;\n selectionControl?: SelectionControlType;\n pager?: TablePagerSettings;\n}\n\n@observer\nexport class Table<\n T,\n TId extends IdType = any,\n P = never,\n PId extends IdType = never,\n> extends Component<TableProps<T, TId, P, PId>> {\n @observable observableScrollable: TableProps<T, TId, P, PId>['scrollable'];\n @observable observableSelectionControl: TableProps<T, TId, P, PId>['selectionControl'];\n @observable observableHideSelectAll: TableProps<T, TId, P, PId>['hideSelectAll'];\n @observable observableSelectable: TableProps<T, TId, P, PId>['selectable'];\n\n private tableState = this.props.tableState;\n\n private ref = createRef<HTMLElement>();\n\n private lastSelection?: Selectable<T>;\n\n private selectColumnCell: FC<AnvilTableCellProps> = observer((props: AnvilTableCellProps) => (\n <SelectColumnCell\n {...props}\n isRowSelectable={this.tableState.isRowSelectable(props.dataItem)}\n control={this.observableSelectionControl}\n />\n ));\n\n private customCellMap = new Map<string, FC<TableCellProps<T, TId, P, PId>>>();\n\n private selectHeaderCell: FC<TableHeaderCellProps> = observer((props: TableHeaderCellProps) => {\n if (this.observableHideSelectAll || this.tableState.selectionLimit !== Infinity) {\n return null;\n }\n\n return (\n <SelectHeaderCell\n {...props}\n isSomeRowsSelected={\n this.observableScrollable !== 'virtual'\n ? this.tableState.isSomePageRowsSelected\n : this.tableState.isSomeRowsSelected\n }\n control={this.observableSelectionControl}\n />\n );\n });\n\n // TODO: rid of \"memoizeOne\" after migration on React.FC\n private withCellTableState = memoizeOne((children: ReactNode) =>\n this.applyToColumns(children, column => {\n const { cell: Cell, field } = column.props;\n\n return cloneElement(column, {\n cell: this.getOrCreateCellComponentWithTableState(Cell, field),\n });\n })\n );\n\n constructor(props: TableProps<T, TId, P, PId>) {\n super(props);\n\n makeObservable(this);\n\n this.observableScrollable = this.props.scrollable;\n this.observableSelectionControl = this.props.selectionControl;\n this.observableHideSelectAll = this.props.hideSelectAll;\n }\n\n @action\n componentDidUpdate() {\n this.observableScrollable = this.props.scrollable;\n this.observableSelectionControl = this.props.selectionControl;\n this.observableHideSelectAll = this.props.hideSelectAll;\n }\n\n rowRender = (row: ReactElement, rowProps: TableRowProps) => {\n const overrides: typeof row.props = {};\n\n if (\n this.props.selectable &&\n rowProps.rowType === 'data' &&\n !this.tableState.isRowSelectable(rowProps.dataItem)\n ) {\n overrides.className = classNames(row.props.className, Styles.disabled);\n }\n\n const result = Object.keys(overrides).length ? cloneElement(row, overrides) : row;\n\n return this.props.rowRender ? this.props.rowRender(result, rowProps) : result;\n };\n\n applyToColumns(\n children: ReactNode,\n transformer: (\n column: ReactElement<TableColumnProps<T, TId, P, PId>>\n ) => ReactElement<TableColumnProps<T, TId, P, PId>>\n ): ReactNode {\n return Children.map(children, child => {\n if (!isColumnElement<T, TId, P, PId>(child)) {\n return child;\n }\n\n return child.props.children\n ? cloneElement(transformer(child), {\n children: this.applyToColumns(\n child.props.children,\n transformer\n ) as typeof child.props.children,\n })\n : transformer(child);\n });\n }\n\n handleHeaderSelectionChange = (ev: TableHeaderSelectionChangeEvent) => {\n const checked = ev.syntheticEvent.currentTarget.checked;\n\n if (this.observableScrollable !== 'virtual') {\n if (checked) {\n this.tableState.selectPage();\n } else {\n this.tableState.deselectPage();\n }\n } else {\n if (checked) {\n this.tableState.selectAll();\n } else {\n this.tableState.deselectAll();\n }\n }\n };\n\n handleSelectionChange = (ev: TableSelectionChangeEvent) => {\n if (!ev.dataItem) {\n return;\n }\n if (ev.nativeEvent.shiftKey && this.lastSelection) {\n const rows = this.tableState\n .getRowsBetween(this.lastSelection, ev.dataItem)\n .filter(row => this.tableState.isRowSelectable(row));\n const isAsc =\n this.tableState.dataSource?.idSelector?.(this.lastSelection) ===\n this.tableState.dataSource?.idSelector?.(rows[0]);\n const selection = !ev.dataItem.selected;\n\n if (selection) {\n const toBeSelected: Selectable<T>[] = [];\n for (const row of isAsc ? rows : rows.reverse()) {\n if (\n this.tableState.selectedCount + toBeSelected.length >=\n this.tableState.selectionLimit\n ) {\n break;\n }\n\n if (row.selected) {\n continue;\n }\n\n toBeSelected.push(row);\n }\n\n this.tableState.setRowsSelection(toBeSelected, selection);\n } else {\n this.tableState.setRowsSelection(rows, selection);\n }\n } else {\n this.tableState.toggleRowSelection(ev.dataItem);\n }\n\n this.lastSelection = ev.dataItem;\n };\n\n scrollToBottom = () => {\n if (this.ref.current) {\n const container = this.ref.current.getElementsByClassName(\n 'k-grid-content'\n )[0] as HTMLDivElement;\n container.scrollTop = container.scrollHeight - container.clientHeight * 2;\n container.scroll({ top: container.scrollHeight, behavior: 'smooth' });\n }\n };\n\n render() {\n if (\n this.tableState.dataSource instanceof AsyncDataSource &&\n this.props.scrollable === 'virtual' &&\n this.props.selectable\n ) {\n return (\n <Announcement\n status=\"critical\"\n title=\"AsyncDataSource doesn't support virtual scroll with selection.\"\n />\n );\n }\n\n const table = this.table();\n return (\n <Fragment>\n {table}\n {this.props.exportable && (\n <Fragment>\n <TablePDFExport\n ref={this.tableState.setTablePdfExportRef}\n fileName={sanitizeExportFileName(this.props.exportFileName)}\n >\n {this.props.children}\n {table}\n </TablePDFExport>\n <ExcelExport\n ref={this.tableState.setTableExcelExportRef}\n fileName={sanitizeExportFileName(this.props.exportFileName)}\n >\n {this.props.children}\n </ExcelExport>\n </Fragment>\n )}\n </Fragment>\n );\n }\n\n private getPageable() {\n if (this.props.scrollable === 'virtual' || !this.tableState.pageSize) {\n return false;\n }\n\n return this.props.pager ?? true;\n }\n\n private table = () => {\n const { className, filterOperators, selectable, pager, ...props } = this.props;\n\n return (\n <AnvilTable\n ref={this.ref}\n {...props}\n dataItemKey={this.tableState.rowIdKey}\n data={[...this.tableState.data]}\n rowRender={this.rowRender}\n editField=\"inEdit\"\n filter={this.tableState.filter}\n filterOperators={filterOperators ?? operators}\n onFilterChange={this.tableState.handleFilterChange}\n group={[...this.tableState.group] as AnvilTableProps['group']}\n onGroupChange={this.tableState.handleGroupChange}\n onExpandChange={this.tableState.handleExpandChange}\n expandField=\"expanded\"\n sort={[...this.tableState.sort]}\n onSortChange={this.tableState.handleSortChange}\n onHeaderSelectionChange={this.handleHeaderSelectionChange}\n onSelectionChange={this.handleSelectionChange}\n selectedField=\"selected\"\n pageable={this.getPageable()}\n pageSize={this.tableState.pageSize}\n skip={this.tableState.skip}\n onPageChange={this.tableState.handlePageChange}\n total={this.tableState.filteredCount}\n className={classNames(Styles.table, className)}\n selectable={{ enabled: selectable, mode: 'multiple' }}\n >\n {selectable && (\n <TableColumn\n locked\n field=\"selected\"\n id=\"selected\"\n width=\"50px\"\n filterable={false}\n resizable={false}\n reorderable={false}\n headerSelectionValue={\n props.scrollable !== 'virtual'\n ? this.tableState.isAllPageRowsSelected\n : this.tableState.isAllRowsSelected\n }\n headerCell={this.selectHeaderCell}\n cell={this.selectColumnCell}\n headerClassName=\"lh-1-i ta-center-i\"\n className={classNames(Styles.unselectable, 'lh-1-i', 'ta-center-i')}\n />\n )}\n {this.withCellTableState(props.children)}\n </AnvilTable>\n );\n };\n\n private getOrCreateCellComponentWithTableState = (\n Cell: any,\n field?: string\n ): FC<TableCellProps<T, TId, P, PId>> | undefined => {\n if (!Cell) {\n return undefined;\n }\n\n const CellWithTableState: FC<TableCellProps<T, TId, P, PId>> = (\n props: TableCellProps<T, TId, P, PId>\n ) => {\n const tdProps = useTdProps(props);\n return <Cell {...props} tableState={this.tableState} tdProps={tdProps} />;\n };\n CellWithTableState.displayName = 'CellWithTableState';\n\n if (field) {\n if (this.customCellMap.has(field)) {\n return this.customCellMap.get(field)!;\n }\n this.customCellMap.set(field, CellWithTableState);\n }\n return CellWithTableState;\n };\n}\n\nconst sanitizeExportFileName = memoizeOne((fileName: string | undefined) =>\n fileName?.replace(/\\.+/g, '_')\n);\n"],"names":["isValidElement","Component","createRef","cloneElement","Children","Fragment","Announcement","Table","AnvilTable","TableColumn","operators","kendoOperators","GridPDFExport","TablePDFExport","ExcelExport","observer","AsyncDataSource","SelectColumnCell","SelectHeaderCell","memoizeOne","classNames","Styles","action","makeObservable","observable","useTdProps","text","textOperators","filter","o","operator","isColumnElement","element","elementType","type","originalType","componentDidUpdate","observableScrollable","props","scrollable","observableSelectionControl","selectionControl","observableHideSelectAll","hideSelectAll","applyToColumns","children","transformer","map","child","render","tableState","dataSource","selectable","status","title","table","exportable","ref","setTablePdfExportRef","fileName","sanitizeExportFileName","exportFileName","setTableExcelExportRef","getPageable","pageSize","pager","observableSelectable","lastSelection","selectColumnCell","isRowSelectable","dataItem","control","customCellMap","Map","selectHeaderCell","selectionLimit","Infinity","isSomeRowsSelected","isSomePageRowsSelected","withCellTableState","column","cell","Cell","field","getOrCreateCellComponentWithTableState","rowRender","row","rowProps","overrides","rowType","className","disabled","result","Object","keys","length","handleHeaderSelectionChange","ev","checked","syntheticEvent","currentTarget","selectPage","deselectPage","selectAll","deselectAll","handleSelectionChange","nativeEvent","shiftKey","rows","getRowsBetween","isAsc","idSelector","selection","selected","toBeSelected","reverse","selectedCount","push","setRowsSelection","toggleRowSelection","scrollToBottom","current","container","getElementsByClassName","scrollTop","scrollHeight","clientHeight","scroll","top","behavior","filterOperators","dataItemKey","rowIdKey","data","editField","onFilterChange","handleFilterChange","group","onGroupChange","handleGroupChange","onExpandChange","handleExpandChange","expandField","sort","onSortChange","handleSortChange","onHeaderSelectionChange","onSelectionChange","selectedField","pageable","skip","onPageChange","handlePageChange","total","filteredCount","enabled","mode","locked","id","width","filterable","resizable","reorderable","headerSelectionValue","isAllPageRowsSelected","isAllRowsSelected","headerCell","headerClassName","unselectable","undefined","CellWithTableState","tdProps","displayName","has","get","set","replace"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/table.tsx"],"sourcesContent":["import {\n isValidElement,\n Component,\n createRef,\n cloneElement,\n Children,\n Fragment,\n ReactNode,\n ReactElement,\n ComponentType,\n FC,\n ComponentProps,\n} from 'react';\nimport {\n Announcement,\n Table as AnvilTable,\n TableProps as AnvilTableProps,\n TableRowProps,\n TableColumn,\n TableColumnProps as AnvilTableColumnProps,\n TableCellProps as AnvilTableCellProps,\n TableHeaderCellProps,\n TableHeaderSelectionChangeEvent,\n TableSelectionChangeEvent,\n TablePagerSettings,\n} from '@servicetitan/design-system';\nimport { operators as kendoOperators } from '@progress/kendo-react-grid/dist/npm/filterCommon';\nimport { GridPDFExport as TablePDFExport } from '@progress/kendo-react-pdf';\nimport { ExcelExport } from '@progress/kendo-react-excel-export';\nimport { observer } from 'mobx-react';\nimport { GRID_COL_INDEX_ATTRIBUTE } from '@progress/kendo-react-grid';\n\nimport { AsyncDataSource, IdType } from '@servicetitan/data-query';\nimport { TableState, Selectable } from './table-state';\nimport {\n SelectionControlType,\n SelectColumnCell,\n SelectHeaderCell,\n} from './select-cell/select-cell';\nimport memoizeOne from 'memoize-one';\n\nimport classNames from 'classnames';\nimport * as Styles from './table.module.css';\nimport { action, makeObservable, observable } from 'mobx';\nimport { useTdProps } from './utils/use-td-props';\n\nconst { text: textOperators, ...operators } = kendoOperators;\noperators.text = [\n ...textOperators.filter(o => o.operator !== 'isnull' && o.operator !== 'isnotnull'),\n];\n\nfunction isColumnElement<\n T = never,\n TId extends IdType = any,\n P = never,\n PId extends IdType = never,\n>(element: ReactNode): element is ReactElement<TableColumnProps<T, TId, P, PId>> {\n if (!isValidElement(element)) {\n return false;\n }\n\n const elementType = (element as ReactElement).type;\n\n return elementType === TableColumn || (elementType as any).originalType === TableColumn;\n}\n\nexport interface TableCellProps<\n T = never,\n TId extends IdType = any,\n P = never,\n PId extends IdType = never,\n> extends AnvilTableCellProps {\n tableState?: TableState<T, TId, P, PId>;\n tdProps?: ComponentProps<'td'> & {\n [GRID_COL_INDEX_ATTRIBUTE]?: number;\n };\n}\n\ninterface TableColumnProps<\n T = never,\n TId extends IdType = any,\n P = never,\n PId extends IdType = never,\n> extends AnvilTableColumnProps {\n cell?: ComponentType<TableCellProps<T, TId, P, PId>>;\n children?: ReactElement<TableColumnProps<T, TId, P, PId>>[];\n}\n\ntype ExcludedTableProps =\n | 'data'\n | 'dataItemKey'\n | 'editField'\n | 'filter'\n | 'onFilterChange'\n | 'group'\n | 'onGroupChange'\n | 'onExpandChange'\n | 'expandField'\n | 'sort'\n | 'onSortChange'\n | 'onHeaderSelectionChange'\n | 'onSelectionChange'\n | 'selectedField'\n | 'pageable'\n | 'pageSize'\n | 'skip'\n | 'onPageChange'\n | 'total'\n | 'selectable'\n | 'pager';\n\nexport interface TableProps<\n T,\n TId extends IdType = any,\n P = never,\n PId extends IdType = never,\n> extends Omit<AnvilTableProps, ExcludedTableProps> {\n selectable?: boolean;\n exportable?: boolean;\n hideSelectAll?: boolean;\n exportFileName?: string;\n tableState: TableState<T, TId, P, PId>;\n selectionControl?: SelectionControlType;\n pager?: TablePagerSettings;\n}\n\n@observer\nexport class Table<\n T,\n TId extends IdType = any,\n P = never,\n PId extends IdType = never,\n> extends Component<TableProps<T, TId, P, PId>> {\n @observable observableScrollable: TableProps<T, TId, P, PId>['scrollable'];\n @observable observableSelectionControl: TableProps<T, TId, P, PId>['selectionControl'];\n @observable observableHideSelectAll: TableProps<T, TId, P, PId>['hideSelectAll'];\n @observable observableSelectable: TableProps<T, TId, P, PId>['selectable'];\n\n private tableState = this.props.tableState;\n\n private ref = createRef<HTMLElement>();\n\n private lastSelection?: Selectable<T>;\n\n private selectColumnCell: FC<AnvilTableCellProps> = observer((props: AnvilTableCellProps) => (\n <SelectColumnCell\n {...props}\n isRowSelectable={this.tableState.isRowSelectable(props.dataItem)}\n control={this.observableSelectionControl}\n />\n ));\n\n private customCellMap = new Map<string, FC<TableCellProps<T, TId, P, PId>>>();\n\n private selectHeaderCell: FC<TableHeaderCellProps> = observer((props: TableHeaderCellProps) => {\n if (this.observableHideSelectAll || this.tableState.selectionLimit !== Infinity) {\n return null;\n }\n\n return (\n <SelectHeaderCell\n {...props}\n isSomeRowsSelected={\n this.observableScrollable !== 'virtual'\n ? this.tableState.isSomePageRowsSelected\n : this.tableState.isSomeRowsSelected\n }\n control={this.observableSelectionControl}\n />\n );\n });\n\n // TODO: rid of \"memoizeOne\" after migration on React.FC\n private withCellTableState = memoizeOne((children: ReactNode) =>\n this.applyToColumns(children, column => {\n const { cell: Cell, field } = column.props;\n\n return cloneElement(column, {\n cell: this.getOrCreateCellComponentWithTableState(Cell, field),\n });\n })\n );\n\n constructor(props: TableProps<T, TId, P, PId>) {\n super(props);\n\n makeObservable(this);\n\n this.observableScrollable = this.props.scrollable;\n this.observableSelectionControl = this.props.selectionControl;\n this.observableHideSelectAll = this.props.hideSelectAll;\n }\n\n @action\n componentDidUpdate() {\n this.observableScrollable = this.props.scrollable;\n this.observableSelectionControl = this.props.selectionControl;\n this.observableHideSelectAll = this.props.hideSelectAll;\n }\n\n rowRender = (row: ReactElement, rowProps: TableRowProps) => {\n const overrides: typeof row.props = {};\n\n if (\n this.props.selectable &&\n rowProps.rowType === 'data' &&\n !this.tableState.isRowSelectable(rowProps.dataItem)\n ) {\n overrides.className = classNames(row.props.className, Styles.disabled);\n }\n\n const result = Object.keys(overrides).length ? cloneElement(row, overrides) : row;\n\n return this.props.rowRender ? this.props.rowRender(result, rowProps) : result;\n };\n\n applyToColumns(\n children: ReactNode,\n transformer: (\n column: ReactElement<TableColumnProps<T, TId, P, PId>>\n ) => ReactElement<TableColumnProps<T, TId, P, PId>>\n ): ReactNode {\n return Children.map(children, child => {\n if (!isColumnElement<T, TId, P, PId>(child)) {\n return child;\n }\n\n return child.props.children\n ? cloneElement(transformer(child), {\n children: this.applyToColumns(\n child.props.children,\n transformer\n ) as typeof child.props.children,\n })\n : transformer(child);\n });\n }\n\n handleHeaderSelectionChange = (ev: TableHeaderSelectionChangeEvent) => {\n const checked = ev.syntheticEvent.currentTarget.checked;\n\n if (this.observableScrollable !== 'virtual') {\n if (checked) {\n this.tableState.selectPage();\n } else {\n this.tableState.deselectPage();\n }\n } else {\n if (checked) {\n this.tableState.selectAll();\n } else {\n this.tableState.deselectAll();\n }\n }\n };\n\n handleSelectionChange = (ev: TableSelectionChangeEvent) => {\n if (!ev.dataItem) {\n return;\n }\n if (ev.nativeEvent.shiftKey && this.lastSelection) {\n const rows = this.tableState\n .getRowsBetween(this.lastSelection, ev.dataItem)\n .filter(row => this.tableState.isRowSelectable(row));\n const isAsc =\n this.tableState.dataSource?.idSelector?.(this.lastSelection) ===\n this.tableState.dataSource?.idSelector?.(rows[0]);\n const selection = !ev.dataItem.selected;\n\n if (selection) {\n const toBeSelected: Selectable<T>[] = [];\n for (const row of isAsc ? rows : rows.reverse()) {\n if (\n this.tableState.selectedCount + toBeSelected.length >=\n this.tableState.selectionLimit\n ) {\n break;\n }\n\n if (row.selected) {\n continue;\n }\n\n toBeSelected.push(row);\n }\n\n this.tableState.setRowsSelection(toBeSelected, selection);\n } else {\n this.tableState.setRowsSelection(rows, selection);\n }\n } else {\n this.tableState.toggleRowSelection(ev.dataItem);\n }\n\n this.lastSelection = ev.dataItem;\n };\n\n scrollToBottom = () => {\n if (this.ref.current) {\n const container = this.ref.current.getElementsByClassName(\n 'k-grid-content'\n )[0] as HTMLDivElement;\n container.scrollTop = container.scrollHeight - container.clientHeight * 2;\n container.scroll({ top: container.scrollHeight, behavior: 'smooth' });\n }\n };\n\n render() {\n if (\n this.tableState.dataSource instanceof AsyncDataSource &&\n this.props.scrollable === 'virtual' &&\n this.props.selectable\n ) {\n return (\n <Announcement\n status=\"critical\"\n title=\"AsyncDataSource doesn't support virtual scroll with selection.\"\n />\n );\n }\n\n const table = this.table();\n return (\n <Fragment>\n {table}\n {this.props.exportable && (\n <Fragment>\n <TablePDFExport\n ref={this.tableState.setTablePdfExportRef}\n fileName={sanitizeExportFileName(this.props.exportFileName)}\n >\n {this.props.children}\n {table}\n </TablePDFExport>\n <ExcelExport\n ref={this.tableState.setTableExcelExportRef}\n fileName={sanitizeExportFileName(this.props.exportFileName)}\n >\n {this.props.children}\n </ExcelExport>\n </Fragment>\n )}\n </Fragment>\n );\n }\n\n private getPageable() {\n if (this.props.scrollable === 'virtual' || !this.tableState.pageSize) {\n return false;\n }\n\n return this.props.pager ?? true;\n }\n\n private table = () => {\n const { className, filterOperators, selectable, pager, ...props } = this.props;\n\n return (\n <AnvilTable\n ref={this.ref}\n {...props}\n dataItemKey={this.tableState.rowIdKey}\n data={[...this.tableState.data]}\n rowRender={this.rowRender}\n editField=\"inEdit\"\n filter={this.tableState.filter}\n filterOperators={filterOperators ?? operators}\n onFilterChange={this.tableState.handleFilterChange}\n group={[...this.tableState.group] as AnvilTableProps['group']}\n onGroupChange={this.tableState.handleGroupChange}\n onExpandChange={this.tableState.handleExpandChange}\n expandField=\"expanded\"\n sort={[...this.tableState.sort]}\n onSortChange={this.tableState.handleSortChange}\n onHeaderSelectionChange={this.handleHeaderSelectionChange}\n onSelectionChange={this.handleSelectionChange}\n selectedField=\"selected\"\n pageable={this.getPageable()}\n pageSize={this.tableState.pageSize}\n skip={this.tableState.skip}\n onPageChange={this.tableState.handlePageChange}\n total={this.tableState.filteredCount}\n className={classNames(Styles.table, className)}\n selectable={{ enabled: selectable, mode: 'multiple' }}\n >\n {selectable && (\n <TableColumn\n locked\n field=\"selected\"\n id=\"selected\"\n width=\"50px\"\n filterable={false}\n resizable={false}\n reorderable={false}\n headerSelectionValue={\n props.scrollable !== 'virtual'\n ? this.tableState.isAllPageRowsSelected\n : this.tableState.isAllRowsSelected\n }\n headerCell={this.selectHeaderCell}\n cell={this.selectColumnCell}\n headerClassName=\"lh-1-i ta-center-i\"\n className={classNames(Styles.unselectable, 'lh-1-i', 'ta-center-i')}\n />\n )}\n {this.withCellTableState(props.children)}\n </AnvilTable>\n );\n };\n\n private getOrCreateCellComponentWithTableState = (\n Cell: any,\n field?: string\n ): FC<TableCellProps<T, TId, P, PId>> | undefined => {\n if (!Cell) {\n return undefined;\n }\n\n const CellWithTableState: FC<TableCellProps<T, TId, P, PId>> = (\n props: TableCellProps<T, TId, P, PId>\n ) => {\n const tdProps = useTdProps(props);\n return <Cell {...props} tableState={this.tableState} tdProps={tdProps} />;\n };\n CellWithTableState.displayName = 'CellWithTableState';\n\n if (field) {\n if (this.customCellMap.has(field)) {\n return this.customCellMap.get(field)!;\n }\n this.customCellMap.set(field, CellWithTableState);\n }\n return CellWithTableState;\n };\n}\n\nconst sanitizeExportFileName = memoizeOne((fileName: string | undefined) =>\n fileName?.replace(/\\.+/g, '_')\n);\n"],"names":["isValidElement","Component","createRef","cloneElement","Children","Fragment","Announcement","Table","AnvilTable","TableColumn","operators","kendoOperators","GridPDFExport","TablePDFExport","ExcelExport","observer","AsyncDataSource","SelectColumnCell","SelectHeaderCell","memoizeOne","classNames","Styles","action","makeObservable","observable","useTdProps","text","textOperators","filter","o","operator","isColumnElement","element","elementType","type","originalType","componentDidUpdate","observableScrollable","props","scrollable","observableSelectionControl","selectionControl","observableHideSelectAll","hideSelectAll","applyToColumns","children","transformer","map","child","render","tableState","dataSource","selectable","status","title","table","exportable","ref","setTablePdfExportRef","fileName","sanitizeExportFileName","exportFileName","setTableExcelExportRef","getPageable","pageSize","pager","observableSelectable","lastSelection","selectColumnCell","isRowSelectable","dataItem","control","customCellMap","Map","selectHeaderCell","selectionLimit","Infinity","isSomeRowsSelected","isSomePageRowsSelected","withCellTableState","column","cell","Cell","field","getOrCreateCellComponentWithTableState","rowRender","row","rowProps","overrides","rowType","className","disabled","result","Object","keys","length","handleHeaderSelectionChange","ev","checked","syntheticEvent","currentTarget","selectPage","deselectPage","selectAll","deselectAll","handleSelectionChange","nativeEvent","shiftKey","rows","getRowsBetween","isAsc","idSelector","selection","selected","toBeSelected","reverse","selectedCount","push","setRowsSelection","toggleRowSelection","scrollToBottom","current","container","getElementsByClassName","scrollTop","scrollHeight","clientHeight","scroll","top","behavior","filterOperators","dataItemKey","rowIdKey","data","editField","onFilterChange","handleFilterChange","group","onGroupChange","handleGroupChange","onExpandChange","handleExpandChange","expandField","sort","onSortChange","handleSortChange","onHeaderSelectionChange","onSelectionChange","selectedField","pageable","skip","onPageChange","handlePageChange","total","filteredCount","enabled","mode","locked","id","width","filterable","resizable","reorderable","headerSelectionValue","isAllPageRowsSelected","isAllRowsSelected","headerCell","headerClassName","unselectable","undefined","CellWithTableState","tdProps","displayName","has","get","set","replace"],"mappings":"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"}
@@ -27,9 +27,9 @@ export const useObservingTableState = (data, tableArgs, datasourceOptions, reset
27
27
  ]);
28
28
  useEffect(()=>{
29
29
  if (dataSource) {
30
+ var _ref;
30
31
  var _datasourceDataRef_current;
31
- var _datasourceDataRef_current_length;
32
- if (tableStateRef.current.skip >= ((_datasourceDataRef_current_length = (_datasourceDataRef_current = datasourceDataRef.current) === null || _datasourceDataRef_current === void 0 ? void 0 : _datasourceDataRef_current.length) !== null && _datasourceDataRef_current_length !== void 0 ? _datasourceDataRef_current_length : 0) || resetPagination === 2 || resetPagination === 1 && tableStateDataRef.current !== datasourceDataRef.current) {
32
+ if (tableStateRef.current.skip >= ((_ref = (_datasourceDataRef_current = datasourceDataRef.current) === null || _datasourceDataRef_current === void 0 ? void 0 : _datasourceDataRef_current.length) !== null && _ref !== void 0 ? _ref : 0) || resetPagination === 2 || resetPagination === 1 && tableStateDataRef.current !== datasourceDataRef.current) {
33
33
  tableStateRef.current.setDataSource(dataSource);
34
34
  } else {
35
35
  const state = tableStateRef.current.exportState();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/use-observing-table-state/use-observing-table-state.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { autorun } from 'mobx';\n\nimport { IdType, InMemoryDataSource, Preprocessors } from '@servicetitan/data-query';\nimport { useInitializedRef } from '@servicetitan/react-hooks';\nimport { TableState, TableStateConstructorParams } from '../table-state';\n//\n\nexport enum ResetPaginationMode {\n Never,\n OnUpdateDataRoot,\n Always,\n}\n\nexport interface DatasourceOptions<T, TID extends IdType = any> {\n idSelector: (row: T) => TID;\n datasourcePreprocessors?: Preprocessors<T>;\n}\n\nexport const useObservingTableState = <\n T,\n TID extends IdType = any,\n P = never,\n PID extends IdType = never,\n>(\n data: T[],\n tableArgs: TableStateConstructorParams<T, TID, P, PID>,\n datasourceOptions: DatasourceOptions<T, TID>,\n resetPagination: ResetPaginationMode = ResetPaginationMode.OnUpdateDataRoot\n): TableState<T, TID, P, PID> => {\n const tableStateRef = useInitializedRef(() => new TableState<T, TID, P, PID>(tableArgs));\n const datasourceDataRef = useRef<T[]>();\n const tableStateDataRef = useRef<T[]>();\n const [dataSource, setDataSource] = useState<InMemoryDataSource<T, TID>>();\n\n useEffect(() => {\n const disposer = autorun(() => {\n setDataSource(\n new InMemoryDataSource(\n data,\n datasourceOptions.idSelector,\n datasourceOptions.datasourcePreprocessors\n )\n );\n datasourceDataRef.current = data;\n });\n return () => disposer();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [data]);\n\n useEffect(() => {\n if (dataSource) {\n if (\n tableStateRef.current.skip >= (datasourceDataRef.current?.length ?? 0) ||\n resetPagination === ResetPaginationMode.Always ||\n (resetPagination === ResetPaginationMode.OnUpdateDataRoot &&\n tableStateDataRef.current !== datasourceDataRef.current)\n ) {\n tableStateRef.current.setDataSource(dataSource);\n } else {\n const state = tableStateRef.current.exportState();\n tableStateRef.current.setDataSource(dataSource, { initialState: state });\n }\n tableStateDataRef.current = datasourceDataRef.current;\n }\n }, [dataSource, resetPagination, tableStateRef]);\n\n return tableStateRef.current;\n};\n"],"names":["useEffect","useRef","useState","autorun","InMemoryDataSource","useInitializedRef","TableState","ResetPaginationMode","useObservingTableState","data","tableArgs","datasourceOptions","resetPagination","tableStateRef","datasourceDataRef","tableStateDataRef","dataSource","setDataSource","disposer","idSelector","datasourcePreprocessors","current","skip","length","state","exportState","initialState"],"mappings":"AAAA,SAASA,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAQ;AACpD,SAASC,OAAO,QAAQ,OAAO;AAE/B,SAAiBC,kBAAkB,QAAuB,2BAA2B;AACrF,SAASC,iBAAiB,QAAQ,4BAA4B;AAC9D,SAASC,UAAU,QAAqC,iBAAiB;AACzE,EAAE;AAEF,OAAO,IAAA,AAAKC,6CAAAA;;;;WAAAA;MAIX;AAOD,OAAO,MAAMC,yBAAyB,CAMlCC,MACAC,WACAC,mBACAC,mBAA2E;IAE3E,MAAMC,gBAAgBR,kBAAkB,IAAM,IAAIC,WAA2BI;IAC7E,MAAMI,oBAAoBb;IAC1B,MAAMc,oBAAoBd;IAC1B,MAAM,CAACe,YAAYC,cAAc,GAAGf;IAEpCF,UAAU;QACN,MAAMkB,WAAWf,QAAQ;YACrBc,cACI,IAAIb,mBACAK,MACAE,kBAAkBQ,UAAU,EAC5BR,kBAAkBS,uBAAuB;YAGjDN,kBAAkBO,OAAO,GAAGZ;QAChC;QACA,OAAO,IAAMS;IACb,uDAAuD;IAC3D,GAAG;QAACT;KAAK;IAETT,UAAU;QACN,IAAIgB,YAAY;gBAEuBF;gBAAAA;YADnC,IACID,cAAcQ,OAAO,CAACC,IAAI,IAAKR,CAAAA,CAAAA,qCAAAA,6BAAAA,kBAAkBO,OAAO,cAAzBP,iDAAAA,2BAA2BS,MAAM,cAAjCT,+CAAAA,oCAAqC,CAAA,KACpEF,yBACCA,yBACGG,kBAAkBM,OAAO,KAAKP,kBAAkBO,OAAO,EAC7D;gBACER,cAAcQ,OAAO,CAACJ,aAAa,CAACD;YACxC,OAAO;gBACH,MAAMQ,QAAQX,cAAcQ,OAAO,CAACI,WAAW;gBAC/CZ,cAAcQ,OAAO,CAACJ,aAAa,CAACD,YAAY;oBAAEU,cAAcF;gBAAM;YAC1E;YACAT,kBAAkBM,OAAO,GAAGP,kBAAkBO,OAAO;QACzD;IACJ,GAAG;QAACL;QAAYJ;QAAiBC;KAAc;IAE/C,OAAOA,cAAcQ,OAAO;AAChC,EAAE"}
1
+ {"version":3,"sources":["../../src/use-observing-table-state/use-observing-table-state.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { autorun } from 'mobx';\n\nimport { IdType, InMemoryDataSource, Preprocessors } from '@servicetitan/data-query';\nimport { useInitializedRef } from '@servicetitan/react-hooks';\nimport { TableState, TableStateConstructorParams } from '../table-state';\n//\n\nexport enum ResetPaginationMode {\n Never,\n OnUpdateDataRoot,\n Always,\n}\n\nexport interface DatasourceOptions<T, TID extends IdType = any> {\n idSelector: (row: T) => TID;\n datasourcePreprocessors?: Preprocessors<T>;\n}\n\nexport const useObservingTableState = <\n T,\n TID extends IdType = any,\n P = never,\n PID extends IdType = never,\n>(\n data: T[],\n tableArgs: TableStateConstructorParams<T, TID, P, PID>,\n datasourceOptions: DatasourceOptions<T, TID>,\n resetPagination: ResetPaginationMode = ResetPaginationMode.OnUpdateDataRoot\n): TableState<T, TID, P, PID> => {\n const tableStateRef = useInitializedRef(() => new TableState<T, TID, P, PID>(tableArgs));\n const datasourceDataRef = useRef<T[]>();\n const tableStateDataRef = useRef<T[]>();\n const [dataSource, setDataSource] = useState<InMemoryDataSource<T, TID>>();\n\n useEffect(() => {\n const disposer = autorun(() => {\n setDataSource(\n new InMemoryDataSource(\n data,\n datasourceOptions.idSelector,\n datasourceOptions.datasourcePreprocessors\n )\n );\n datasourceDataRef.current = data;\n });\n return () => disposer();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [data]);\n\n useEffect(() => {\n if (dataSource) {\n if (\n tableStateRef.current.skip >= (datasourceDataRef.current?.length ?? 0) ||\n resetPagination === ResetPaginationMode.Always ||\n (resetPagination === ResetPaginationMode.OnUpdateDataRoot &&\n tableStateDataRef.current !== datasourceDataRef.current)\n ) {\n tableStateRef.current.setDataSource(dataSource);\n } else {\n const state = tableStateRef.current.exportState();\n tableStateRef.current.setDataSource(dataSource, { initialState: state });\n }\n tableStateDataRef.current = datasourceDataRef.current;\n }\n }, [dataSource, resetPagination, tableStateRef]);\n\n return tableStateRef.current;\n};\n"],"names":["useEffect","useRef","useState","autorun","InMemoryDataSource","useInitializedRef","TableState","ResetPaginationMode","useObservingTableState","data","tableArgs","datasourceOptions","resetPagination","tableStateRef","datasourceDataRef","tableStateDataRef","dataSource","setDataSource","disposer","idSelector","datasourcePreprocessors","current","skip","length","state","exportState","initialState"],"mappings":"AAAA,SAASA,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAQ;AACpD,SAASC,OAAO,QAAQ,OAAO;AAE/B,SAAiBC,kBAAkB,QAAuB,2BAA2B;AACrF,SAASC,iBAAiB,QAAQ,4BAA4B;AAC9D,SAASC,UAAU,QAAqC,iBAAiB;AACzE,EAAE;AAEF,OAAO,IAAA,AAAKC,6CAAAA;;;;WAAAA;MAIX;AAOD,OAAO,MAAMC,yBAAyB,CAMlCC,MACAC,WACAC,mBACAC,mBAA2E;IAE3E,MAAMC,gBAAgBR,kBAAkB,IAAM,IAAIC,WAA2BI;IAC7E,MAAMI,oBAAoBb;IAC1B,MAAMc,oBAAoBd;IAC1B,MAAM,CAACe,YAAYC,cAAc,GAAGf;IAEpCF,UAAU;QACN,MAAMkB,WAAWf,QAAQ;YACrBc,cACI,IAAIb,mBACAK,MACAE,kBAAkBQ,UAAU,EAC5BR,kBAAkBS,uBAAuB;YAGjDN,kBAAkBO,OAAO,GAAGZ;QAChC;QACA,OAAO,IAAMS;IACb,uDAAuD;IAC3D,GAAG;QAACT;KAAK;IAETT,UAAU;QACN,IAAIgB,YAAY;;gBAEuBF;YADnC,IACID,cAAcQ,OAAO,CAACC,IAAI,cAAKR,6BAAAA,kBAAkBO,OAAO,cAAzBP,iDAAAA,2BAA2BS,MAAM,uCAAI,MACpEX,yBACCA,yBACGG,kBAAkBM,OAAO,KAAKP,kBAAkBO,OAAO,EAC7D;gBACER,cAAcQ,OAAO,CAACJ,aAAa,CAACD;YACxC,OAAO;gBACH,MAAMQ,QAAQX,cAAcQ,OAAO,CAACI,WAAW;gBAC/CZ,cAAcQ,OAAO,CAACJ,aAAa,CAACD,YAAY;oBAAEU,cAAcF;gBAAM;YAC1E;YACAT,kBAAkBM,OAAO,GAAGP,kBAAkBO,OAAO;QACzD;IACJ,GAAG;QAACL;QAAYJ;QAAiBC;KAAc;IAE/C,OAAOA,cAAcQ,OAAO;AAChC,EAAE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/table",
3
- "version": "38.1.0",
3
+ "version": "38.2.0",
4
4
  "description": "",
5
5
  "homepage": "https://docs.st.dev/docs/frontend/table",
6
6
  "repository": {
@@ -18,7 +18,7 @@
18
18
  "dependencies": {
19
19
  "@progress/kendo-ooxml": "~1.6.2",
20
20
  "@progress/kendo-react-excel-export": "~5.5.0",
21
- "@servicetitan/react-hooks": "^7.1.0",
21
+ "@servicetitan/react-hooks": "^7.2.0",
22
22
  "classnames": "^2.3.1",
23
23
  "memoize-one": "~6.0.0"
24
24
  },
@@ -29,11 +29,11 @@
29
29
  "@progress/kendo-react-grid": "~5.5.0",
30
30
  "@progress/kendo-react-inputs": "~5.5.0",
31
31
  "@progress/kendo-react-pdf": "~5.5.0",
32
- "@servicetitan/data-query": "^38.1.0",
32
+ "@servicetitan/data-query": "^38.2.0",
33
33
  "@servicetitan/design-system": "~14.5.1",
34
- "@servicetitan/form": "^38.1.0",
35
- "@servicetitan/react-ioc": "^33.1.1",
36
- "@servicetitan/suppress-warnings": "^33.1.1",
34
+ "@servicetitan/form": "^38.2.0",
35
+ "@servicetitan/react-ioc": "^34.0.1",
36
+ "@servicetitan/suppress-warnings": "^34.0.1",
37
37
  "@types/accounting": "~0.4.2",
38
38
  "@types/react": "~18.2.55",
39
39
  "accounting": "~0.4.1",
@@ -51,9 +51,9 @@
51
51
  "@progress/kendo-react-grid": "~5.5.0",
52
52
  "@progress/kendo-react-inputs": "~5.5.0",
53
53
  "@progress/kendo-react-pdf": "~5.5.0",
54
- "@servicetitan/data-query": "^38.1.0",
54
+ "@servicetitan/data-query": "^38.2.0",
55
55
  "@servicetitan/design-system": ">=13.2.1",
56
- "@servicetitan/form": "^38.1.0",
56
+ "@servicetitan/form": "^38.2.0",
57
57
  "@servicetitan/react-ioc": ">21.0.0",
58
58
  "@servicetitan/suppress-warnings": ">21.0.0",
59
59
  "accounting": "~0.4.1",
@@ -70,5 +70,5 @@
70
70
  "cli": {
71
71
  "webpack": false
72
72
  },
73
- "gitHead": "a44925e37020acb2153c7e10215a31cd22d054c1"
73
+ "gitHead": "b013c9f39c05c44f888a5bca5ff6aadb89cd7a6f"
74
74
  }
@@ -177,8 +177,10 @@ const SelectorItemMultiple: FC<SelectorItemProps> = ({ option, renderer, checked
177
177
  />
178
178
  );
179
179
 
180
- export interface AsyncSelectFilterOptions<TID extends IdType, TO extends AsyncSelectItem<TID>>
181
- extends CustomColumnMenuFilterSingleOpts {
180
+ export interface AsyncSelectFilterOptions<
181
+ TID extends IdType,
182
+ TO extends AsyncSelectItem<TID>,
183
+ > extends CustomColumnMenuFilterSingleOpts {
182
184
  dataFetcher: AsyncSelectFilterDataFetcher<TID, TO>;
183
185
  placeholder?: string;
184
186
  multiple?: boolean;
@@ -36,8 +36,10 @@ class SelectorRadio<TV, TO> extends Component<SelectorProps<TV, TO>> {
36
36
  }
37
37
  }
38
38
 
39
- export interface SingleSelectColumnMenuOptions<TV, TO = TV>
40
- extends CustomColumnMenuFilterSingleOpts {
39
+ export interface SingleSelectColumnMenuOptions<
40
+ TV,
41
+ TO = TV,
42
+ > extends CustomColumnMenuFilterSingleOpts {
41
43
  options: TO[];
42
44
  valueSelector?: (item: TO) => TV;
43
45
  renderItem?: (item: TO) => ReactNode | string;
package/src/table.tsx CHANGED
@@ -109,8 +109,12 @@ type ExcludedTableProps =
109
109
  | 'selectable'
110
110
  | 'pager';
111
111
 
112
- export interface TableProps<T, TId extends IdType = any, P = never, PId extends IdType = never>
113
- extends Omit<AnvilTableProps, ExcludedTableProps> {
112
+ export interface TableProps<
113
+ T,
114
+ TId extends IdType = any,
115
+ P = never,
116
+ PId extends IdType = never,
117
+ > extends Omit<AnvilTableProps, ExcludedTableProps> {
114
118
  selectable?: boolean;
115
119
  exportable?: boolean;
116
120
  hideSelectAll?: boolean;