@servicetitan/table 32.3.0 → 32.4.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.
@@ -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 { Product } from './product';\nimport { 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","Product","DetailTableStore","selected","tableState","selectedIds","size","initialize","row","masterTableStore","getDetailTableState","dispose","disposeSelectedObserve","setLockedRowsSelection","value","dataSource","filteredData","getData","filter","data","lockedData","isRowUnselectable","setRowsSelection","ignoreUnselectable","constructor","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;AAExD,SAASC,OAAO,QAAQ,YAAY;AAIpC,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;IA1CAC,aAAc;QAfd,uBAAYpB,cAAZ,KAAA;QAEA;;;KAGC,GACD,uBACQK,oBADR,KAAA;QAOA,uBAAQG,0BAAR,KAAA;QAGId,eAAe,IAAI;QAEnB,IAAI,CAACc,sBAAsB,GAAGhB,QAAQ,IAAI,EAAE,YAAY,CAAC,EAAE6B,QAAQ,EAAEC,QAAQ,EAAE;YAC3E,IAAI,CAACD,YAAYC,UAAU;gBACvB,IAAI,CAACb,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 { Product } from './product';\nimport { 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","Product","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;AAExD,SAASC,OAAO,QAAQ,YAAY;AAIpC,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;QAGId,eAAe,IAAI;QAEnB,IAAI,CAACc,sBAAsB,GAAGhB,QAAQ,IAAI,EAAE,YAAY,CAAC,EAAE4B,QAAQ,EAAEC,QAAQ,EAAE;YAC3E,IAAI,CAACD,YAAYC,UAAU;gBACvB,IAAI,CAACZ,sBAAsB,CAAC;YAChC;QACJ;IACJ;AAmCJ"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/demo/master-detail/master-table.store.ts"],"sourcesContent":["import { injectable } from '@servicetitan/react-ioc';\n\nimport { computed, observe, Lambda, makeObservable } from 'mobx';\n\nimport { InMemoryDataSource, TableState } from '../..';\n\nimport { Product } from './product';\nimport { products } from './products';\n\nimport { ProductDetail } from './product-detail';\nimport { productDetails } from './product-details';\n\n@injectable()\nexport class MasterTableStore {\n tableState: TableState<Product, number> = new TableState({\n dataSource: new InMemoryDataSource(products, row => row.ProductID),\n getDetailTableState: row => this.getDetailTableState(row),\n });\n\n details = new Map<number, TableState<ProductDetail, string, Product, number>>();\n\n @computed get selectedIds() {\n return Array.from(this.tableState.selectedIds);\n }\n\n private disposeSelectedIdsObserve: Lambda;\n\n constructor() {\n makeObservable(this);\n\n this.disposeSelectedIdsObserve = observe(this, 'selectedIds', change => {\n const { oldValue = [], newValue } = change as {\n oldValue: number[];\n newValue: number[];\n };\n\n const before = new Set(oldValue);\n const after = new Set(newValue);\n\n for (const id of oldValue) {\n if (!after.has(id)) {\n this.setDetailSelection(id, false);\n }\n }\n\n for (const id of newValue) {\n if (!before.has(id)) {\n this.setDetailSelection(id, true);\n }\n }\n });\n }\n\n dispose() {\n this.disposeSelectedIdsObserve();\n }\n\n private getDetailTableState(row: Product) {\n const id = this.tableState.dataSource!.idSelector!(row);\n\n if (this.details.has(id)) {\n return this.details.get(id)!;\n }\n\n const detailTableState = new TableState({\n dataSource: new InMemoryDataSource(\n productDetails.filter(x => x.ProductID === id),\n row => row.Field\n ),\n isRowUnselectable: row => !!row.IsLocked,\n parent: {\n row,\n tableState: this.tableState,\n },\n });\n\n if (this.tableState.selectedIds.has(id)) {\n detailTableState.selectAll();\n }\n\n this.details.set(id, detailTableState);\n\n return detailTableState;\n }\n\n private setDetailSelection(id: number, value: boolean) {\n const detail = this.tableState.getDetailTableState!({ ProductID: id } as Product);\n\n if (!detail?.totalCount) {\n return;\n }\n\n if (value) {\n detail.selectAll({ ignoreUnselectable: false });\n } else if (!detail.isSomePageRowsSelected) {\n detail.deselectAll({ ignoreUnselectable: false });\n }\n }\n}\n"],"names":["injectable","computed","observe","makeObservable","InMemoryDataSource","TableState","products","productDetails","MasterTableStore","selectedIds","Array","from","tableState","dispose","disposeSelectedIdsObserve","getDetailTableState","row","id","dataSource","idSelector","details","has","get","detailTableState","filter","x","ProductID","Field","isRowUnselectable","IsLocked","parent","selectAll","set","setDetailSelection","value","detail","totalCount","ignoreUnselectable","isSomePageRowsSelected","deselectAll","constructor","Map","change","oldValue","newValue","before","Set","after"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,SAASA,UAAU,QAAQ,0BAA0B;AAErD,SAASC,QAAQ,EAAEC,OAAO,EAAUC,cAAc,QAAQ,OAAO;AAEjE,SAASC,kBAAkB,EAAEC,UAAU,QAAQ,QAAQ;AAGvD,SAASC,QAAQ,QAAQ,aAAa;AAGtC,SAASC,cAAc,QAAQ,oBAAoB;AAGnD,OAAO,MAAMC;IAQT,IAAcC,cAAc;QACxB,OAAOC,MAAMC,IAAI,CAAC,IAAI,CAACC,UAAU,CAACH,WAAW;IACjD;IA8BAI,UAAU;QACN,IAAI,CAACC,yBAAyB;IAClC;IAEQC,oBAAoBC,GAAY,EAAE;QACtC,MAAMC,KAAK,IAAI,CAACL,UAAU,CAACM,UAAU,CAAEC,UAAU,CAAEH;QAEnD,IAAI,IAAI,CAACI,OAAO,CAACC,GAAG,CAACJ,KAAK;YACtB,OAAO,IAAI,CAACG,OAAO,CAACE,GAAG,CAACL;QAC5B;QAEA,MAAMM,mBAAmB,IAAIlB,WAAW;YACpCa,YAAY,IAAId,mBACZG,eAAeiB,MAAM,CAACC,CAAAA,IAAKA,EAAEC,SAAS,KAAKT,KAC3CD,CAAAA,MAAOA,IAAIW,KAAK;YAEpBC,mBAAmBZ,CAAAA,MAAO,CAAC,CAACA,IAAIa,QAAQ;YACxCC,QAAQ;gBACJd;gBACAJ,YAAY,IAAI,CAACA,UAAU;YAC/B;QACJ;QAEA,IAAI,IAAI,CAACA,UAAU,CAACH,WAAW,CAACY,GAAG,CAACJ,KAAK;YACrCM,iBAAiBQ,SAAS;QAC9B;QAEA,IAAI,CAACX,OAAO,CAACY,GAAG,CAACf,IAAIM;QAErB,OAAOA;IACX;IAEQU,mBAAmBhB,EAAU,EAAEiB,KAAc,EAAE;QACnD,MAAMC,SAAS,IAAI,CAACvB,UAAU,CAACG,mBAAmB,CAAE;YAAEW,WAAWT;QAAG;QAEpE,IAAI,EAACkB,mBAAAA,6BAAAA,OAAQC,UAAU,GAAE;YACrB;QACJ;QAEA,IAAIF,OAAO;YACPC,OAAOJ,SAAS,CAAC;gBAAEM,oBAAoB;YAAM;QACjD,OAAO,IAAI,CAACF,OAAOG,sBAAsB,EAAE;YACvCH,OAAOI,WAAW,CAAC;gBAAEF,oBAAoB;YAAM;QACnD;IACJ;IAtEAG,aAAc;QAbd5B,uBAAAA,cAA0C,IAAIP,WAAW;YACrDa,YAAY,IAAId,mBAAmBE,UAAUU,CAAAA,MAAOA,IAAIU,SAAS;YACjEX,qBAAqBC,CAAAA,MAAO,IAAI,CAACD,mBAAmB,CAACC;QACzD;QAEAI,uBAAAA,WAAU,IAAIqB;QAMd,uBAAQ3B,6BAAR,KAAA;QAGIX,eAAe,IAAI;QAEnB,IAAI,CAACW,yBAAyB,GAAGZ,QAAQ,IAAI,EAAE,eAAewC,CAAAA;YAC1D,MAAM,EAAEC,WAAW,EAAE,EAAEC,QAAQ,EAAE,GAAGF;YAKpC,MAAMG,SAAS,IAAIC,IAAIH;YACvB,MAAMI,QAAQ,IAAID,IAAIF;YAEtB,KAAK,MAAM3B,MAAM0B,SAAU;gBACvB,IAAI,CAACI,MAAM1B,GAAG,CAACJ,KAAK;oBAChB,IAAI,CAACgB,kBAAkB,CAAChB,IAAI;gBAChC;YACJ;YAEA,KAAK,MAAMA,MAAM2B,SAAU;gBACvB,IAAI,CAACC,OAAOxB,GAAG,CAACJ,KAAK;oBACjB,IAAI,CAACgB,kBAAkB,CAAChB,IAAI;gBAChC;YACJ;QACJ;IACJ;AA+CJ"}
1
+ {"version":3,"sources":["../../../src/demo/master-detail/master-table.store.ts"],"sourcesContent":["import { injectable } from '@servicetitan/react-ioc';\n\nimport { computed, observe, Lambda, makeObservable } from 'mobx';\n\nimport { InMemoryDataSource, TableState } from '../..';\n\nimport { Product } from './product';\nimport { products } from './products';\n\nimport { ProductDetail } from './product-detail';\nimport { productDetails } from './product-details';\n\n@injectable()\nexport class MasterTableStore {\n tableState: TableState<Product, number> = new TableState({\n dataSource: new InMemoryDataSource(products, row => row.ProductID),\n getDetailTableState: row => this.getDetailTableState(row),\n });\n\n details = new Map<number, TableState<ProductDetail, string, Product, number>>();\n\n @computed get selectedIds() {\n return Array.from(this.tableState.selectedIds);\n }\n\n private disposeSelectedIdsObserve: Lambda;\n\n constructor() {\n makeObservable(this);\n\n this.disposeSelectedIdsObserve = observe(this, 'selectedIds', change => {\n const { oldValue = [], newValue } = change as {\n oldValue: number[];\n newValue: number[];\n };\n\n const before = new Set(oldValue);\n const after = new Set(newValue);\n\n for (const id of oldValue) {\n if (!after.has(id)) {\n this.setDetailSelection(id, false);\n }\n }\n\n for (const id of newValue) {\n if (!before.has(id)) {\n this.setDetailSelection(id, true);\n }\n }\n });\n }\n\n dispose() {\n this.disposeSelectedIdsObserve();\n }\n\n private getDetailTableState(row: Product) {\n const id = this.tableState.dataSource!.idSelector!(row);\n\n if (this.details.has(id)) {\n return this.details.get(id)!;\n }\n\n const detailTableState = new TableState({\n dataSource: new InMemoryDataSource(\n productDetails.filter(x => x.ProductID === id),\n row => row.Field\n ),\n isRowUnselectable: row => !!row.IsLocked,\n parent: {\n row,\n tableState: this.tableState,\n },\n });\n\n if (this.tableState.selectedIds.has(id)) {\n detailTableState.selectAll();\n }\n\n this.details.set(id, detailTableState);\n\n return detailTableState;\n }\n\n private setDetailSelection(id: number, value: boolean) {\n const detail = this.tableState.getDetailTableState!({ ProductID: id } as Product);\n\n if (!detail?.totalCount) {\n return;\n }\n\n if (value) {\n detail.selectAll({ ignoreUnselectable: false });\n } else if (!detail.isSomePageRowsSelected) {\n detail.deselectAll({ ignoreUnselectable: false });\n }\n }\n}\n"],"names":["injectable","computed","observe","makeObservable","InMemoryDataSource","TableState","products","productDetails","MasterTableStore","selectedIds","Array","from","tableState","dispose","disposeSelectedIdsObserve","getDetailTableState","row","id","dataSource","idSelector","details","has","get","detailTableState","filter","x","ProductID","Field","isRowUnselectable","IsLocked","parent","selectAll","set","setDetailSelection","value","detail","totalCount","ignoreUnselectable","isSomePageRowsSelected","deselectAll","Map","change","oldValue","newValue","before","Set","after"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,SAASA,UAAU,QAAQ,0BAA0B;AAErD,SAASC,QAAQ,EAAEC,OAAO,EAAUC,cAAc,QAAQ,OAAO;AAEjE,SAASC,kBAAkB,EAAEC,UAAU,QAAQ,QAAQ;AAGvD,SAASC,QAAQ,QAAQ,aAAa;AAGtC,SAASC,cAAc,QAAQ,oBAAoB;AAGnD,OAAO,MAAMC;IAQT,IAAcC,cAAc;QACxB,OAAOC,MAAMC,IAAI,CAAC,IAAI,CAACC,UAAU,CAACH,WAAW;IACjD;IA8BAI,UAAU;QACN,IAAI,CAACC,yBAAyB;IAClC;IAEQC,oBAAoBC,GAAY,EAAE;QACtC,MAAMC,KAAK,IAAI,CAACL,UAAU,CAACM,UAAU,CAAEC,UAAU,CAAEH;QAEnD,IAAI,IAAI,CAACI,OAAO,CAACC,GAAG,CAACJ,KAAK;YACtB,OAAO,IAAI,CAACG,OAAO,CAACE,GAAG,CAACL;QAC5B;QAEA,MAAMM,mBAAmB,IAAIlB,WAAW;YACpCa,YAAY,IAAId,mBACZG,eAAeiB,MAAM,CAACC,CAAAA,IAAKA,EAAEC,SAAS,KAAKT,KAC3CD,CAAAA,MAAOA,IAAIW,KAAK;YAEpBC,mBAAmBZ,CAAAA,MAAO,CAAC,CAACA,IAAIa,QAAQ;YACxCC,QAAQ;gBACJd;gBACAJ,YAAY,IAAI,CAACA,UAAU;YAC/B;QACJ;QAEA,IAAI,IAAI,CAACA,UAAU,CAACH,WAAW,CAACY,GAAG,CAACJ,KAAK;YACrCM,iBAAiBQ,SAAS;QAC9B;QAEA,IAAI,CAACX,OAAO,CAACY,GAAG,CAACf,IAAIM;QAErB,OAAOA;IACX;IAEQU,mBAAmBhB,EAAU,EAAEiB,KAAc,EAAE;QACnD,MAAMC,SAAS,IAAI,CAACvB,UAAU,CAACG,mBAAmB,CAAE;YAAEW,WAAWT;QAAG;QAEpE,IAAI,EAACkB,mBAAAA,6BAAAA,OAAQC,UAAU,GAAE;YACrB;QACJ;QAEA,IAAIF,OAAO;YACPC,OAAOJ,SAAS,CAAC;gBAAEM,oBAAoB;YAAM;QACjD,OAAO,IAAI,CAACF,OAAOG,sBAAsB,EAAE;YACvCH,OAAOI,WAAW,CAAC;gBAAEF,oBAAoB;YAAM;QACnD;IACJ;IAtEA,aAAc;QAbdzB,uBAAAA,cAA0C,IAAIP,WAAW;YACrDa,YAAY,IAAId,mBAAmBE,UAAUU,CAAAA,MAAOA,IAAIU,SAAS;YACjEX,qBAAqBC,CAAAA,MAAO,IAAI,CAACD,mBAAmB,CAACC;QACzD;QAEAI,uBAAAA,WAAU,IAAIoB;QAMd,uBAAQ1B,6BAAR,KAAA;QAGIX,eAAe,IAAI;QAEnB,IAAI,CAACW,yBAAyB,GAAGZ,QAAQ,IAAI,EAAE,eAAeuC,CAAAA;YAC1D,MAAM,EAAEC,WAAW,EAAE,EAAEC,QAAQ,EAAE,GAAGF;YAKpC,MAAMG,SAAS,IAAIC,IAAIH;YACvB,MAAMI,QAAQ,IAAID,IAAIF;YAEtB,KAAK,MAAM1B,MAAMyB,SAAU;gBACvB,IAAI,CAACI,MAAMzB,GAAG,CAACJ,KAAK;oBAChB,IAAI,CAACgB,kBAAkB,CAAChB,IAAI;gBAChC;YACJ;YAEA,KAAK,MAAMA,MAAM0B,SAAU;gBACvB,IAAI,CAACC,OAAOvB,GAAG,CAACJ,KAAK;oBACjB,IAAI,CAACgB,kBAAkB,CAAChB,IAAI;gBAChC;YACJ;QACJ;IACJ;AA+CJ"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/demo/overview/table.store.ts"],"sourcesContent":["import { injectable } from '@servicetitan/react-ioc';\n\nimport { computed, makeObservable } from 'mobx';\n\nimport { InMemoryDataSource, TableState } from '../..';\n\nimport { setFormStateValues, FormValidators } from '@servicetitan/form';\nimport { FormState, FieldState } from 'formstate';\n\nimport { Product, UserRole, Supplier } from './product';\nimport { products } from './products';\n\n@injectable()\nexport class TableStore {\n tableState = new TableState({\n dataSource: this.getDataSource(),\n isRowUnselectable: this.isRowUnselectable,\n selectionLimit: 3,\n getFormState: this.getFormState,\n pageSize: 5,\n });\n\n constructor() {\n makeObservable(this);\n }\n\n @computed get inEdit() {\n return this.tableState.inEdit.size > 0;\n }\n\n editAll = () => this.tableState.editAll();\n saveAll = () => this.tableState.saveEditAll();\n cancelAll = () => this.tableState.cancelEditAll();\n\n private getDataSource() {\n return new InMemoryDataSource(products, this.idSelector, {\n Supplier: (value: Supplier) => Supplier[value],\n AvailableFor: (value: UserRole | undefined) => value && UserRole[value],\n });\n }\n\n private idSelector(row: Product) {\n return row.ProductID;\n }\n\n private isRowUnselectable(row: Product) {\n return row.Discontinued;\n }\n\n private getFormState(row: Product) {\n return setFormStateValues(\n new FormState({\n ProductID: new FieldState(0),\n ProductName: new FieldState('').validators(FormValidators.required),\n Supplier: new FieldState<Supplier>(Supplier.Adam),\n CategoryID: new FieldState(0),\n MadeIn: new FieldState(''),\n QuantityPerUnit: new FieldState(''),\n UnitPrice: new FieldState(0).validators(\n value => value <= 0 && 'Price must be positive'\n ),\n UnitsInStock: new FieldState(0),\n UnitsOnOrder: new FieldState(new Date()).validators(\n value => value > new Date() && 'Invalid date'\n ),\n Discontinued: new FieldState(false),\n AvailableFor: new FieldState<UserRole | undefined>(undefined),\n Package: new FieldState<Product['Package'] | undefined>(undefined),\n }),\n row\n );\n }\n}\n"],"names":["injectable","computed","makeObservable","InMemoryDataSource","TableState","setFormStateValues","FormValidators","FormState","FieldState","UserRole","Supplier","products","TableStore","inEdit","tableState","size","getDataSource","idSelector","value","AvailableFor","row","ProductID","isRowUnselectable","Discontinued","getFormState","ProductName","validators","required","Adam","CategoryID","MadeIn","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","Date","undefined","Package","constructor","dataSource","selectionLimit","pageSize","editAll","saveAll","saveEditAll","cancelAll","cancelEditAll"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,SAASA,UAAU,QAAQ,0BAA0B;AAErD,SAASC,QAAQ,EAAEC,cAAc,QAAQ,OAAO;AAEhD,SAASC,kBAAkB,EAAEC,UAAU,QAAQ,QAAQ;AAEvD,SAASC,kBAAkB,EAAEC,cAAc,QAAQ,qBAAqB;AACxE,SAASC,SAAS,EAAEC,UAAU,QAAQ,YAAY;AAElD,SAAkBC,QAAQ,EAAEC,QAAQ,QAAQ,YAAY;AACxD,SAASC,QAAQ,QAAQ,aAAa;AAGtC,OAAO,MAAMC;IAaT,IAAcC,SAAS;QACnB,OAAO,IAAI,CAACC,UAAU,CAACD,MAAM,CAACE,IAAI,GAAG;IACzC;IAMQC,gBAAgB;QACpB,OAAO,IAAIb,mBAAmBQ,UAAU,IAAI,CAACM,UAAU,EAAE;YACrDP,UAAU,CAACQ,QAAoBR,QAAQ,CAACQ,MAAM;YAC9CC,cAAc,CAACD,QAAgCA,SAAST,QAAQ,CAACS,MAAM;QAC3E;IACJ;IAEQD,WAAWG,GAAY,EAAE;QAC7B,OAAOA,IAAIC,SAAS;IACxB;IAEQC,kBAAkBF,GAAY,EAAE;QACpC,OAAOA,IAAIG,YAAY;IAC3B;IAEQC,aAAaJ,GAAY,EAAE;QAC/B,OAAOf,mBACH,IAAIE,UAAU;YACVc,WAAW,IAAIb,WAAW;YAC1BiB,aAAa,IAAIjB,WAAW,IAAIkB,UAAU,CAACpB,eAAeqB,QAAQ;YAClEjB,UAAU,IAAIF,WAAqBE,SAASkB,IAAI;YAChDC,YAAY,IAAIrB,WAAW;YAC3BsB,QAAQ,IAAItB,WAAW;YACvBuB,iBAAiB,IAAIvB,WAAW;YAChCwB,WAAW,IAAIxB,WAAW,GAAGkB,UAAU,CACnCR,CAAAA,QAASA,SAAS,KAAK;YAE3Be,cAAc,IAAIzB,WAAW;YAC7B0B,cAAc,IAAI1B,WAAW,IAAI2B,QAAQT,UAAU,CAC/CR,CAAAA,QAASA,QAAQ,IAAIiB,UAAU;YAEnCZ,cAAc,IAAIf,WAAW;YAC7BW,cAAc,IAAIX,WAAiC4B;YACnDC,SAAS,IAAI7B,WAA2C4B;QAC5D,IACAhB;IAER;IAjDAkB,aAAc;QARdxB,uBAAAA,cAAa,IAAIV,WAAW;YACxBmC,YAAY,IAAI,CAACvB,aAAa;YAC9BM,mBAAmB,IAAI,CAACA,iBAAiB;YACzCkB,gBAAgB;YAChBhB,cAAc,IAAI,CAACA,YAAY;YAC/BiB,UAAU;QACd;QAUAC,uBAAAA,WAAU,IAAM,IAAI,CAAC5B,UAAU,CAAC4B,OAAO;QACvCC,uBAAAA,WAAU,IAAM,IAAI,CAAC7B,UAAU,CAAC8B,WAAW;QAC3CC,uBAAAA,aAAY,IAAM,IAAI,CAAC/B,UAAU,CAACgC,aAAa;QAT3C5C,eAAe,IAAI;IACvB;AAgDJ"}
1
+ {"version":3,"sources":["../../../src/demo/overview/table.store.ts"],"sourcesContent":["import { injectable } from '@servicetitan/react-ioc';\n\nimport { computed, makeObservable } from 'mobx';\n\nimport { InMemoryDataSource, TableState } from '../..';\n\nimport { setFormStateValues, FormValidators } from '@servicetitan/form';\nimport { FormState, FieldState } from 'formstate';\n\nimport { Product, UserRole, Supplier } from './product';\nimport { products } from './products';\n\n@injectable()\nexport class TableStore {\n tableState = new TableState({\n dataSource: this.getDataSource(),\n isRowUnselectable: this.isRowUnselectable,\n selectionLimit: 3,\n getFormState: this.getFormState,\n pageSize: 5,\n });\n\n constructor() {\n makeObservable(this);\n }\n\n @computed get inEdit() {\n return this.tableState.inEdit.size > 0;\n }\n\n editAll = () => this.tableState.editAll();\n saveAll = () => this.tableState.saveEditAll();\n cancelAll = () => this.tableState.cancelEditAll();\n\n private getDataSource() {\n return new InMemoryDataSource(products, this.idSelector, {\n Supplier: (value: Supplier) => Supplier[value],\n AvailableFor: (value: UserRole | undefined) => value && UserRole[value],\n });\n }\n\n private idSelector(row: Product) {\n return row.ProductID;\n }\n\n private isRowUnselectable(row: Product) {\n return row.Discontinued;\n }\n\n private getFormState(row: Product) {\n return setFormStateValues(\n new FormState({\n ProductID: new FieldState(0),\n ProductName: new FieldState('').validators(FormValidators.required),\n Supplier: new FieldState<Supplier>(Supplier.Adam),\n CategoryID: new FieldState(0),\n MadeIn: new FieldState(''),\n QuantityPerUnit: new FieldState(''),\n UnitPrice: new FieldState(0).validators(\n value => value <= 0 && 'Price must be positive'\n ),\n UnitsInStock: new FieldState(0),\n UnitsOnOrder: new FieldState(new Date()).validators(\n value => value > new Date() && 'Invalid date'\n ),\n Discontinued: new FieldState(false),\n AvailableFor: new FieldState<UserRole | undefined>(undefined),\n Package: new FieldState<Product['Package'] | undefined>(undefined),\n }),\n row\n );\n }\n}\n"],"names":["injectable","computed","makeObservable","InMemoryDataSource","TableState","setFormStateValues","FormValidators","FormState","FieldState","UserRole","Supplier","products","TableStore","inEdit","tableState","size","getDataSource","idSelector","value","AvailableFor","row","ProductID","isRowUnselectable","Discontinued","getFormState","ProductName","validators","required","Adam","CategoryID","MadeIn","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","Date","undefined","Package","dataSource","selectionLimit","pageSize","editAll","saveAll","saveEditAll","cancelAll","cancelEditAll"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,SAASA,UAAU,QAAQ,0BAA0B;AAErD,SAASC,QAAQ,EAAEC,cAAc,QAAQ,OAAO;AAEhD,SAASC,kBAAkB,EAAEC,UAAU,QAAQ,QAAQ;AAEvD,SAASC,kBAAkB,EAAEC,cAAc,QAAQ,qBAAqB;AACxE,SAASC,SAAS,EAAEC,UAAU,QAAQ,YAAY;AAElD,SAAkBC,QAAQ,EAAEC,QAAQ,QAAQ,YAAY;AACxD,SAASC,QAAQ,QAAQ,aAAa;AAGtC,OAAO,MAAMC;IAaT,IAAcC,SAAS;QACnB,OAAO,IAAI,CAACC,UAAU,CAACD,MAAM,CAACE,IAAI,GAAG;IACzC;IAMQC,gBAAgB;QACpB,OAAO,IAAIb,mBAAmBQ,UAAU,IAAI,CAACM,UAAU,EAAE;YACrDP,UAAU,CAACQ,QAAoBR,QAAQ,CAACQ,MAAM;YAC9CC,cAAc,CAACD,QAAgCA,SAAST,QAAQ,CAACS,MAAM;QAC3E;IACJ;IAEQD,WAAWG,GAAY,EAAE;QAC7B,OAAOA,IAAIC,SAAS;IACxB;IAEQC,kBAAkBF,GAAY,EAAE;QACpC,OAAOA,IAAIG,YAAY;IAC3B;IAEQC,aAAaJ,GAAY,EAAE;QAC/B,OAAOf,mBACH,IAAIE,UAAU;YACVc,WAAW,IAAIb,WAAW;YAC1BiB,aAAa,IAAIjB,WAAW,IAAIkB,UAAU,CAACpB,eAAeqB,QAAQ;YAClEjB,UAAU,IAAIF,WAAqBE,SAASkB,IAAI;YAChDC,YAAY,IAAIrB,WAAW;YAC3BsB,QAAQ,IAAItB,WAAW;YACvBuB,iBAAiB,IAAIvB,WAAW;YAChCwB,WAAW,IAAIxB,WAAW,GAAGkB,UAAU,CACnCR,CAAAA,QAASA,SAAS,KAAK;YAE3Be,cAAc,IAAIzB,WAAW;YAC7B0B,cAAc,IAAI1B,WAAW,IAAI2B,QAAQT,UAAU,CAC/CR,CAAAA,QAASA,QAAQ,IAAIiB,UAAU;YAEnCZ,cAAc,IAAIf,WAAW;YAC7BW,cAAc,IAAIX,WAAiC4B;YACnDC,SAAS,IAAI7B,WAA2C4B;QAC5D,IACAhB;IAER;IAjDA,aAAc;QARdN,uBAAAA,cAAa,IAAIV,WAAW;YACxBkC,YAAY,IAAI,CAACtB,aAAa;YAC9BM,mBAAmB,IAAI,CAACA,iBAAiB;YACzCiB,gBAAgB;YAChBf,cAAc,IAAI,CAACA,YAAY;YAC/BgB,UAAU;QACd;QAUAC,uBAAAA,WAAU,IAAM,IAAI,CAAC3B,UAAU,CAAC2B,OAAO;QACvCC,uBAAAA,WAAU,IAAM,IAAI,CAAC5B,UAAU,CAAC6B,WAAW;QAC3CC,uBAAAA,aAAY,IAAM,IAAI,CAAC9B,UAAU,CAAC+B,aAAa;QAT3C3C,eAAe,IAAI;IACvB;AAgDJ"}
@@ -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","constructor","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<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 +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 { 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","TableFilterCellProps","renderCustomColumnMenuFilter","DateTimeFilterCell","render","value","operator","onChange","handleOperatorChange","data","props","operators","dataItemKey","className","textField","handleChange","constructor","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;AAE1D,SAASC,oBAAoB,QAAQ,8BAA8B;AAEnE,SAASC,4BAA4B,QAAQ,yBAAyB;AAEtE,MACMC,2BAA2Bb;IA0B7Bc,SAAS;QACL,qBACI,MAACb;;8BACG,KAACK;oBACGS,OAAO,IAAI,CAACC,QAAQ;oBACpBC,UAAU,IAAI,CAACC,oBAAoB;oBACnCC,MAAM,IAAI,CAACC,KAAK,CAACC,SAAS;oBAC1BC,aAAY;oBACZC,WAAU;oBACVC,WAAU;;gBAEb,CAACf,cAAc,IAAI,CAACO,QAAQ,CAACA,QAAQ,mBAClC,MAACf;;sCACG,KAACM;4BACGQ,OAAO,IAAI,CAACK,KAAK,CAACL,KAAK;4BACvBE,UAAU,IAAI,CAACQ,YAAY;4BAC3BF,WAAU;;sCAEd,KAACf;4BACGO,OAAO,IAAI,CAACK,KAAK,CAACL,KAAK;4BACvBE,UAAU,IAAI,CAACQ,YAAY;4BAC3BF,WAAU;;;;;;IAMlC;IAhDAG,YAAYN,KAA2B,CAAE;YAHrC;QAIA,KAAK,CAACA,QALV,uBAAYJ,YACR,CAAA,6BAAA,IAAI,CAACI,KAAK,CAACC,SAAS,CAACM,IAAI,CAACC,CAAAA,IAAKA,EAAEZ,QAAQ,KAAK,IAAI,CAACI,KAAK,CAACJ,QAAQ,eAAjE,wCAAA,6BACA,IAAI,CAACI,KAAK,CAACC,SAAS,CAAC,EAAE,GAO3B,uBACAH,wBAAuB,CAACW;YACpB,IAAI,CAACb,QAAQ,GAAGa,MAAMC,MAAM,CAACf,KAAK;YAClCL,mBAAmBmB,OAAO,IAAI,CAACT,KAAK,CAACL,KAAK,EAAE,IAAI,CAACK,KAAK,CAACH,QAAQ;QACnE,IAEAQ,uBAAAA,gBAAe,CAACI;YACZ,MAAMd,QAAQc,MAAMd,KAAK;gBAIX;YAFd,IAAI,CAACK,KAAK,CAACH,QAAQ,CAAC;gBAChBF;gBACAC,UAAU,CAAA,uBAAA,IAAI,CAACI,KAAK,CAACJ,QAAQ,cAAnB,kCAAA,uBAAuB;gBACjCe,gBAAgBF,MAAME,cAAc;YACxC;QACJ;QAjBI1B,eAAe,IAAI;IACvB;AA8CJ;;;;;;;;;;;;;;AAEA,OAAO,MAAM2B,2BAA2BpB,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 { 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","TableFilterCellProps","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;AAE1D,SAASC,oBAAoB,QAAQ,8BAA8B;AAEnE,SAASC,4BAA4B,QAAQ,yBAAyB;AAEtE,MACMC,2BAA2Bb;IA0B7Bc,SAAS;QACL,qBACI,MAACb;;8BACG,KAACK;oBACGS,OAAO,IAAI,CAACC,QAAQ;oBACpBC,UAAU,IAAI,CAACC,oBAAoB;oBACnCC,MAAM,IAAI,CAACC,KAAK,CAACC,SAAS;oBAC1BC,aAAY;oBACZC,WAAU;oBACVC,WAAU;;gBAEb,CAACf,cAAc,IAAI,CAACO,QAAQ,CAACA,QAAQ,mBAClC,MAACf;;sCACG,KAACM;4BACGQ,OAAO,IAAI,CAACK,KAAK,CAACL,KAAK;4BACvBE,UAAU,IAAI,CAACQ,YAAY;4BAC3BF,WAAU;;sCAEd,KAACf;4BACGO,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;YAClCL,mBAAmBkB,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;QAjBIzB,eAAe,IAAI;IACvB;AA8CJ;;;;;;;;;;;;;;AAEA,OAAO,MAAM0B,2BAA2BnB,6BAA6BC,oBAAoB,MAAM"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/filters/field-values-filter.tsx"],"sourcesContent":["import { TableFilterCellProps, Checkbox } from '@servicetitan/design-system';\nimport { Component, Fragment, FormEvent } from 'react';\n\nimport { observer } from 'mobx-react';\nimport { observable, computed, runInAction, action, makeObservable } from 'mobx';\n\nimport { Input, InputChangeEvent } from '@progress/kendo-react-inputs';\n\nimport { DataSource, IdType } from '@servicetitan/data-query';\nimport { TableState } from '../table-state';\nimport { renderCustomColumnMenuFilter } from './column-menu-filters';\n\nexport function operator<T>(item: T, value: T[]) {\n return value.includes(item);\n}\n\nexport function fieldValuesColumnMenuFilter<T, TId extends IdType = never>(\n tableState: TableState<T, TId>,\n renderItem: (value: T[keyof T]) => string = defaultRenderItem\n) {\n interface Data {\n value: T[keyof T];\n text: string;\n }\n @observer\n class FieldValuesFilterCell extends Component<TableFilterCellProps> {\n @observable data: Data[] = [];\n\n @observable searchQuery = '';\n\n @computed get processedData() {\n const searchQuery = this.searchQuery.toLowerCase();\n\n const filteredData = !searchQuery\n ? this.data\n : this.data.filter(v => v.text.toLowerCase().includes(searchQuery));\n\n return filteredData.slice().sort((a, b) => {\n if (a.text === b.text) {\n return 0;\n }\n\n return a.text < b.text ? -1 : 1;\n });\n }\n\n get field() {\n const field = this.props.field;\n\n if (field === undefined) {\n throw 'missing field';\n }\n\n return field as keyof T;\n }\n\n get value(): T[keyof T][] {\n return this.props.value || [];\n }\n\n constructor(props: TableFilterCellProps) {\n super(props);\n makeObservable(this);\n }\n\n @action\n handleSearchQueryChange = (ev: InputChangeEvent) => {\n if (typeof ev.target.value === 'string') {\n this.searchQuery = ev.target.value;\n }\n };\n\n componentDidMount() {\n this.fetchData(tableState.dataSource);\n }\n\n handleChange = (value: Data, checked: boolean, ev: FormEvent<HTMLInputElement>) => {\n const newFilterValue = checked\n ? this.value.concat(value.value)\n : this.value.filter((v: T[keyof T]) => v !== value.value);\n\n const hasValue = newFilterValue.length > 0;\n\n this.props.onChange({\n value: hasValue ? newFilterValue : '',\n operator: hasValue ? operator : '',\n syntheticEvent: ev,\n });\n };\n\n render() {\n return (\n <Fragment>\n <Input\n value={this.searchQuery}\n onChange={this.handleSearchQueryChange}\n placeholder=\"Search\"\n className=\"m-b-1\"\n />\n\n {this.processedData.map(item => (\n <span key={JSON.stringify(item)} className=\"k-widget d-b m-b-1\">\n <Checkbox\n label={item.text}\n checked={this.value.includes(item.value)}\n onChange={this.handleChange}\n value={item}\n />\n </span>\n ))}\n </Fragment>\n );\n }\n\n private async fetchData(dataSource: DataSource<T, TId> | null) {\n if (!dataSource) {\n return;\n }\n\n const items = (await dataSource.getData({})).data as T[];\n\n const values = items.map(i => i[this.field]);\n\n const distinctValues = values.filter((v, idx) => values.indexOf(v) === idx);\n\n runInAction(() => {\n this.data = distinctValues.map(value => ({ value, text: renderItem(value) }));\n });\n }\n }\n\n return renderCustomColumnMenuFilter(FieldValuesFilterCell);\n}\n\nfunction defaultRenderItem(v: any): string {\n if (v == null) {\n return '';\n }\n\n // suppose v has toString();\n return v.toString();\n}\n"],"names":["TableFilterCellProps","Checkbox","Component","Fragment","observer","observable","computed","runInAction","action","makeObservable","Input","renderCustomColumnMenuFilter","operator","item","value","includes","fieldValuesColumnMenuFilter","tableState","renderItem","defaultRenderItem","FieldValuesFilterCell","processedData","searchQuery","toLowerCase","filteredData","data","filter","v","text","slice","sort","a","b","field","props","undefined","componentDidMount","fetchData","dataSource","render","onChange","handleSearchQueryChange","placeholder","className","map","span","label","checked","handleChange","JSON","stringify","items","getData","values","i","distinctValues","idx","indexOf","constructor","ev","target","newFilterValue","concat","hasValue","length","syntheticEvent","toString"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/filters/field-values-filter.tsx"],"sourcesContent":["import { TableFilterCellProps, Checkbox } from '@servicetitan/design-system';\nimport { Component, Fragment, FormEvent } from 'react';\n\nimport { observer } from 'mobx-react';\nimport { observable, computed, runInAction, action, makeObservable } from 'mobx';\n\nimport { Input, InputChangeEvent } from '@progress/kendo-react-inputs';\n\nimport { DataSource, IdType } from '@servicetitan/data-query';\nimport { TableState } from '../table-state';\nimport { renderCustomColumnMenuFilter } from './column-menu-filters';\n\nexport function operator<T>(item: T, value: T[]) {\n return value.includes(item);\n}\n\nexport function fieldValuesColumnMenuFilter<T, TId extends IdType = never>(\n tableState: TableState<T, TId>,\n renderItem: (value: T[keyof T]) => string = defaultRenderItem\n) {\n interface Data {\n value: T[keyof T];\n text: string;\n }\n @observer\n class FieldValuesFilterCell extends Component<TableFilterCellProps> {\n @observable data: Data[] = [];\n\n @observable searchQuery = '';\n\n @computed get processedData() {\n const searchQuery = this.searchQuery.toLowerCase();\n\n const filteredData = !searchQuery\n ? this.data\n : this.data.filter(v => v.text.toLowerCase().includes(searchQuery));\n\n return filteredData.slice().sort((a, b) => {\n if (a.text === b.text) {\n return 0;\n }\n\n return a.text < b.text ? -1 : 1;\n });\n }\n\n get field() {\n const field = this.props.field;\n\n if (field === undefined) {\n throw 'missing field';\n }\n\n return field as keyof T;\n }\n\n get value(): T[keyof T][] {\n return this.props.value || [];\n }\n\n constructor(props: TableFilterCellProps) {\n super(props);\n makeObservable(this);\n }\n\n @action\n handleSearchQueryChange = (ev: InputChangeEvent) => {\n if (typeof ev.target.value === 'string') {\n this.searchQuery = ev.target.value;\n }\n };\n\n componentDidMount() {\n this.fetchData(tableState.dataSource);\n }\n\n handleChange = (value: Data, checked: boolean, ev: FormEvent<HTMLInputElement>) => {\n const newFilterValue = checked\n ? this.value.concat(value.value)\n : this.value.filter((v: T[keyof T]) => v !== value.value);\n\n const hasValue = newFilterValue.length > 0;\n\n this.props.onChange({\n value: hasValue ? newFilterValue : '',\n operator: hasValue ? operator : '',\n syntheticEvent: ev,\n });\n };\n\n render() {\n return (\n <Fragment>\n <Input\n value={this.searchQuery}\n onChange={this.handleSearchQueryChange}\n placeholder=\"Search\"\n className=\"m-b-1\"\n />\n\n {this.processedData.map(item => (\n <span key={JSON.stringify(item)} className=\"k-widget d-b m-b-1\">\n <Checkbox\n label={item.text}\n checked={this.value.includes(item.value)}\n onChange={this.handleChange}\n value={item}\n />\n </span>\n ))}\n </Fragment>\n );\n }\n\n private async fetchData(dataSource: DataSource<T, TId> | null) {\n if (!dataSource) {\n return;\n }\n\n const items = (await dataSource.getData({})).data as T[];\n\n const values = items.map(i => i[this.field]);\n\n const distinctValues = values.filter((v, idx) => values.indexOf(v) === idx);\n\n runInAction(() => {\n this.data = distinctValues.map(value => ({ value, text: renderItem(value) }));\n });\n }\n }\n\n return renderCustomColumnMenuFilter(FieldValuesFilterCell);\n}\n\nfunction defaultRenderItem(v: any): string {\n if (v == null) {\n return '';\n }\n\n // suppose v has toString();\n return v.toString();\n}\n"],"names":["TableFilterCellProps","Checkbox","Component","Fragment","observer","observable","computed","runInAction","action","makeObservable","Input","renderCustomColumnMenuFilter","operator","item","value","includes","fieldValuesColumnMenuFilter","tableState","renderItem","defaultRenderItem","FieldValuesFilterCell","processedData","searchQuery","toLowerCase","filteredData","data","filter","v","text","slice","sort","a","b","field","props","undefined","componentDidMount","fetchData","dataSource","render","onChange","handleSearchQueryChange","placeholder","className","map","span","label","checked","handleChange","JSON","stringify","items","getData","values","i","distinctValues","idx","indexOf","ev","target","newFilterValue","concat","hasValue","length","syntheticEvent","toString"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/filters/range-filter/range-filter.tsx"],"sourcesContent":["import { useState, useEffect, Component, Fragment, ComponentType, FC } from 'react';\nimport { DatePicker, TimePicker } from '@progress/kendo-react-dateinputs';\nimport { TableFilterCellProps } from '@servicetitan/design-system';\nimport { NumericTextBox, NumericTextBoxProps } from '@progress/kendo-react-inputs';\nimport moment from 'moment';\n\nimport { renderCustomColumnMenuFilter } from '../column-menu-filters';\n\n// TODO: remove when Kendo fix the propType bug of DatePicker\ntype ComponentClassWithBrokenPropTypes<P> = ComponentType<P> & { defaultProps?: any };\n\ninterface Range<T> {\n min: T;\n max: T;\n}\n\ninterface BaseControlProps<T> {\n value?: T | null;\n width?: number | string;\n onChange?: (ev: any) => void;\n}\n\ntype RangeControlProps<T, TProps> = BaseControlProps<T> & TProps;\n\ntype RangeControl<T, TProps> = Component<RangeControlProps<T, TProps>> & { value: T | null };\n\nconst NoSSR: FC<{ children: JSX.Element }> = ({ children }) => {\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n return isMounted ? children : null;\n};\n\nclass RangeFilterCellBase<T, TProps = void> extends Component<TableFilterCellProps> {\n private minValueBox: RangeControl<T, TProps> | null = null;\n private maxValueBox: RangeControl<T, TProps> | null = null;\n\n constructor(\n props: TableFilterCellProps,\n private controlClass: ComponentClassWithBrokenPropTypes<RangeControlProps<T, TProps>>,\n private controlProps: TProps = {} as any\n ) {\n super(props);\n }\n\n /** override this if additional type support needed */\n inRange(current: T, values: Range<T>) {\n return (\n (values.min === null || values.min === undefined || current >= values.min) &&\n (values.max === null || values.max === undefined || current <= values.max)\n );\n }\n\n onChange = (ev: any) => {\n if (!this.minValueBox || !this.maxValueBox) {\n return;\n }\n this.props.onChange({\n value: { min: this.minValueBox.value, max: this.maxValueBox.value },\n operator: this.inRange,\n syntheticEvent: ev.syntheticEvent,\n });\n };\n\n render() {\n const filterValue = this.props.value;\n const Control = this.controlClass;\n return (\n <Fragment>\n <span className=\"k-widget m-b-1 d-b\">From:</span>\n <span>\n {/* KendoNumericTextBox uses useLayoutEffect which is incompatible with SSR */}\n <NoSSR>\n <Control\n {...this.controlProps}\n value={filterValue?.min}\n ref={this.setMinValueRef}\n onChange={this.onChange}\n />\n </NoSSR>\n </span>\n <span className=\"k-widget m-t-1 m-b-1 d-b\">To:</span>\n <span>\n {/* KendoNumericTextBox uses useLayoutEffect which is incompatible with SSR */}\n <NoSSR>\n <Control\n {...this.controlProps}\n value={filterValue?.max}\n ref={this.setMaxValueRef}\n onChange={this.onChange}\n />\n </NoSSR>\n </span>\n </Fragment>\n );\n }\n\n protected setMinValueRef = (el: RangeControl<T, TProps> | null) => {\n this.minValueBox = el;\n };\n\n protected setMaxValueRef = (el: RangeControl<T, TProps> | null) => {\n this.maxValueBox = el;\n };\n}\n\nclass NumericRangeFilterCell extends RangeFilterCellBase<number> {\n constructor(props: TableFilterCellProps) {\n super(props, NumericTextBox);\n }\n}\n\nclass CurrencyRangeFilterCell extends RangeFilterCellBase<number, NumericTextBoxProps> {\n constructor(props: TableFilterCellProps) {\n super(props, NumericTextBox, {\n format: 'c',\n });\n }\n}\n\nclass DateRangeFilterCell extends RangeFilterCellBase<Date> {\n constructor(props: TableFilterCellProps) {\n super(props, DatePicker);\n }\n}\n\nfunction getTimeString(date: Date) {\n return `${date.getHours()}:${date.getMinutes()}`;\n}\n\nclass TimeRangeFilterCell extends RangeFilterCellBase<Date> {\n constructor(props: TableFilterCellProps) {\n super(props, TimePicker);\n }\n\n inRange(current: Date, values: Range<Date>) {\n return moment(getTimeString(current), 'h:mma').isBetween(\n moment(getTimeString(values.min || current), 'h:mma'),\n moment(getTimeString(values.max || current), 'h:mma'),\n 'minutes',\n '[]'\n );\n }\n}\n\nexport const NumericRangeColumnMenuFilter = renderCustomColumnMenuFilter(NumericRangeFilterCell);\nexport const CurrencyRangeColumnMenuFilter = renderCustomColumnMenuFilter(CurrencyRangeFilterCell);\nexport const DateRangeColumnMenuFilter = renderCustomColumnMenuFilter(DateRangeFilterCell);\nexport const TimeRangeColumnMenuFilter = renderCustomColumnMenuFilter(TimeRangeFilterCell);\n"],"names":["useState","useEffect","Component","Fragment","DatePicker","TimePicker","NumericTextBox","moment","renderCustomColumnMenuFilter","NoSSR","children","isMounted","setIsMounted","RangeFilterCellBase","inRange","current","values","min","undefined","max","render","filterValue","props","value","Control","controlClass","span","className","controlProps","ref","setMinValueRef","onChange","setMaxValueRef","constructor","minValueBox","maxValueBox","ev","operator","syntheticEvent","el","NumericRangeFilterCell","CurrencyRangeFilterCell","format","DateRangeFilterCell","getTimeString","date","getHours","getMinutes","TimeRangeFilterCell","isBetween","NumericRangeColumnMenuFilter","CurrencyRangeColumnMenuFilter","DateRangeColumnMenuFilter","TimeRangeColumnMenuFilter"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/filters/range-filter/range-filter.tsx"],"sourcesContent":["import { useState, useEffect, Component, Fragment, ComponentType, FC } from 'react';\nimport { DatePicker, TimePicker } from '@progress/kendo-react-dateinputs';\nimport { TableFilterCellProps } from '@servicetitan/design-system';\nimport { NumericTextBox, NumericTextBoxProps } from '@progress/kendo-react-inputs';\nimport moment from 'moment';\n\nimport { renderCustomColumnMenuFilter } from '../column-menu-filters';\n\n// TODO: remove when Kendo fix the propType bug of DatePicker\ntype ComponentClassWithBrokenPropTypes<P> = ComponentType<P> & { defaultProps?: any };\n\ninterface Range<T> {\n min: T;\n max: T;\n}\n\ninterface BaseControlProps<T> {\n value?: T | null;\n width?: number | string;\n onChange?: (ev: any) => void;\n}\n\ntype RangeControlProps<T, TProps> = BaseControlProps<T> & TProps;\n\ntype RangeControl<T, TProps> = Component<RangeControlProps<T, TProps>> & { value: T | null };\n\nconst NoSSR: FC<{ children: JSX.Element }> = ({ children }) => {\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n return isMounted ? children : null;\n};\n\nclass RangeFilterCellBase<T, TProps = void> extends Component<TableFilterCellProps> {\n private minValueBox: RangeControl<T, TProps> | null = null;\n private maxValueBox: RangeControl<T, TProps> | null = null;\n\n constructor(\n props: TableFilterCellProps,\n private controlClass: ComponentClassWithBrokenPropTypes<RangeControlProps<T, TProps>>,\n private controlProps: TProps = {} as any\n ) {\n super(props);\n }\n\n /** override this if additional type support needed */\n inRange(current: T, values: Range<T>) {\n return (\n (values.min === null || values.min === undefined || current >= values.min) &&\n (values.max === null || values.max === undefined || current <= values.max)\n );\n }\n\n onChange = (ev: any) => {\n if (!this.minValueBox || !this.maxValueBox) {\n return;\n }\n this.props.onChange({\n value: { min: this.minValueBox.value, max: this.maxValueBox.value },\n operator: this.inRange,\n syntheticEvent: ev.syntheticEvent,\n });\n };\n\n render() {\n const filterValue = this.props.value;\n const Control = this.controlClass;\n return (\n <Fragment>\n <span className=\"k-widget m-b-1 d-b\">From:</span>\n <span>\n {/* KendoNumericTextBox uses useLayoutEffect which is incompatible with SSR */}\n <NoSSR>\n <Control\n {...this.controlProps}\n value={filterValue?.min}\n ref={this.setMinValueRef}\n onChange={this.onChange}\n />\n </NoSSR>\n </span>\n <span className=\"k-widget m-t-1 m-b-1 d-b\">To:</span>\n <span>\n {/* KendoNumericTextBox uses useLayoutEffect which is incompatible with SSR */}\n <NoSSR>\n <Control\n {...this.controlProps}\n value={filterValue?.max}\n ref={this.setMaxValueRef}\n onChange={this.onChange}\n />\n </NoSSR>\n </span>\n </Fragment>\n );\n }\n\n protected setMinValueRef = (el: RangeControl<T, TProps> | null) => {\n this.minValueBox = el;\n };\n\n protected setMaxValueRef = (el: RangeControl<T, TProps> | null) => {\n this.maxValueBox = el;\n };\n}\n\nclass NumericRangeFilterCell extends RangeFilterCellBase<number> {\n constructor(props: TableFilterCellProps) {\n super(props, NumericTextBox);\n }\n}\n\nclass CurrencyRangeFilterCell extends RangeFilterCellBase<number, NumericTextBoxProps> {\n constructor(props: TableFilterCellProps) {\n super(props, NumericTextBox, {\n format: 'c',\n });\n }\n}\n\nclass DateRangeFilterCell extends RangeFilterCellBase<Date> {\n constructor(props: TableFilterCellProps) {\n super(props, DatePicker);\n }\n}\n\nfunction getTimeString(date: Date) {\n return `${date.getHours()}:${date.getMinutes()}`;\n}\n\nclass TimeRangeFilterCell extends RangeFilterCellBase<Date> {\n constructor(props: TableFilterCellProps) {\n super(props, TimePicker);\n }\n\n inRange(current: Date, values: Range<Date>) {\n return moment(getTimeString(current), 'h:mma').isBetween(\n moment(getTimeString(values.min || current), 'h:mma'),\n moment(getTimeString(values.max || current), 'h:mma'),\n 'minutes',\n '[]'\n );\n }\n}\n\nexport const NumericRangeColumnMenuFilter = renderCustomColumnMenuFilter(NumericRangeFilterCell);\nexport const CurrencyRangeColumnMenuFilter = renderCustomColumnMenuFilter(CurrencyRangeFilterCell);\nexport const DateRangeColumnMenuFilter = renderCustomColumnMenuFilter(DateRangeFilterCell);\nexport const TimeRangeColumnMenuFilter = renderCustomColumnMenuFilter(TimeRangeFilterCell);\n"],"names":["useState","useEffect","Component","Fragment","DatePicker","TimePicker","NumericTextBox","moment","renderCustomColumnMenuFilter","NoSSR","children","isMounted","setIsMounted","RangeFilterCellBase","inRange","current","values","min","undefined","max","render","filterValue","props","value","Control","controlClass","span","className","controlProps","ref","setMinValueRef","onChange","setMaxValueRef","minValueBox","maxValueBox","ev","operator","syntheticEvent","el","NumericRangeFilterCell","CurrencyRangeFilterCell","format","DateRangeFilterCell","getTimeString","date","getHours","getMinutes","TimeRangeFilterCell","isBetween","NumericRangeColumnMenuFilter","CurrencyRangeColumnMenuFilter","DateRangeColumnMenuFilter","TimeRangeColumnMenuFilter"],"mappings":"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"}
@@ -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","constructor","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,"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","constructor","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;IAC1CI,YAAYC,KAAiC,CAAE;QAC3C,KAAK,CAACA;YAIFA;QAFJ,MAAMC,kBAAkBL,mBACpBI,MAAME,eAAe,EACrBF,CAAAA,uBAAAA,MAAMG,MAAM,CAACC,MAAM,cAAnBJ,kCAAAA,uBAAuB;QAE3B,iIAAiI;QACjI,IACIN,SAASW,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,qBAAqBf,oBAAoB,CAAC,EAAE,CAACc,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;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 +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 { 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","TableFilterCellProps","renderCustomColumnMenuFilter","TimeFilterCell","render","value","operator","onChange","handleOperatorChange","data","props","operators","dataItemKey","className","textField","handleChange","constructor","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;AAE1D,SAASC,oBAAoB,QAAQ,8BAA8B;AAEnE,SAASC,4BAA4B,QAAQ,yBAAyB;AAEtE,MACMC,uBAAuBZ;IA0BzBa,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,CAACf,cAAc,IAAI,CAACO,QAAQ,CAACA,QAAQ,mBAClC,KAACR;oBACGO,OAAO,IAAI,CAACK,KAAK,CAACL,KAAK;oBACvBE,UAAU,IAAI,CAACQ,YAAY;oBAC3BF,WAAU;;;;IAK9B;IAzCAG,YAAYN,KAA2B,CAAE;YAHrC;QAIA,KAAK,CAACA,QALV,uBAAYJ,YACR,CAAA,6BAAA,IAAI,CAACI,KAAK,CAACC,SAAS,CAACM,IAAI,CAACC,CAAAA,IAAKA,EAAEZ,QAAQ,KAAK,IAAI,CAACI,KAAK,CAACJ,QAAQ,eAAjE,wCAAA,6BACA,IAAI,CAACI,KAAK,CAACC,SAAS,CAAC,EAAE,GAO3B,uBACAH,wBAAuB,CAACW;YACpB,IAAI,CAACb,QAAQ,GAAGa,MAAMC,MAAM,CAACf,KAAK;YAClCL,mBAAmBmB,OAAO,IAAI,CAACT,KAAK,CAACL,KAAK,EAAE,IAAI,CAACK,KAAK,CAACH,QAAQ;QACnE,IAEAQ,uBAAAA,gBAAe,CAACI;YACZ,MAAMd,QAAQc,MAAMd,KAAK;gBAIX;YAFd,IAAI,CAACK,KAAK,CAACH,QAAQ,CAAC;gBAChBF,OAAOA,QAAQ,IAAIgB,KAAK,MAAM,GAAG,GAAGhB,MAAMiB,QAAQ,IAAIjB,MAAMkB,UAAU,MAAM;gBAC5EjB,UAAU,CAAA,uBAAA,IAAI,CAACI,KAAK,CAACJ,QAAQ,cAAnB,kCAAA,uBAAuB;gBACjCkB,gBAAgBL,MAAMK,cAAc;YACxC;QACJ;QAjBI5B,eAAe,IAAI;IACvB;AAuCJ;;;;;;;;;;;;;;AAEA,OAAO,MAAM6B,uBAAuBvB,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 { 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","TableFilterCellProps","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;AAE1D,SAASC,oBAAoB,QAAQ,8BAA8B;AAEnE,SAASC,4BAA4B,QAAQ,yBAAyB;AAEtE,MACMC,uBAAuBZ;IA0BzBa,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,CAACf,cAAc,IAAI,CAACO,QAAQ,CAACA,QAAQ,mBAClC,KAACR;oBACGO,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;YAClCL,mBAAmBkB,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;QAjBI3B,eAAe,IAAI;IACvB;AAuCJ;;;;;;;;;;;;;;AAEA,OAAO,MAAM4B,uBAAuBtB,6BAA6BC,gBAAgB,MAAM"}
@@ -489,8 +489,7 @@ export class TableState {
489
489
  _define_property(this, "expandedIds", new Set());
490
490
  _define_property(this, "collapsedIds", new Set());
491
491
  _define_property(this, "collapsedGroups", new Set());
492
- _define_property(this, "isRowUnselectable", void 0 // TODO: think about a better name
493
- );
492
+ _define_property(this, "isRowUnselectable", void 0); // TODO: think about a better name
494
493
  _define_property(this, "selectionLimit", void 0);
495
494
  _define_property(this, "data", []);
496
495
  _define_property(this, "totalCount", 0);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/table-state.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/member-ordering */\nimport { ReactElement } from 'react';\nimport { action, computed, observable, runInAction, makeObservable } from 'mobx';\nimport { fromPromise } from 'mobx-utils';\nimport {\n AggregateDescriptor,\n CompositeFilterDescriptor,\n GroupDescriptor,\n SortDescriptor,\n DataResult,\n GroupResult,\n DataSource,\n IdType,\n} from '@servicetitan/data-query';\nimport {\n ExcelExport,\n ExcelExportData,\n ExcelExportColumnProps,\n} from '@progress/kendo-react-excel-export';\nimport {\n TableExpandChangeEvent,\n TableFilterChangeEvent,\n TableGroupChangeEvent,\n TablePageChangeEvent,\n TableSortChangeEvent,\n} from '@servicetitan/design-system';\nimport { GridPDFExport as TablePDFExport } from '@progress/kendo-react-pdf';\nimport { WorkbookOptions } from '@progress/kendo-ooxml';\nimport { FormState, FieldState } from 'formstate';\nimport { formStateToJS } from '@servicetitan/form';\n\nexport type Selectable<T> = { readonly selected: boolean | undefined } & T;\nexport type Editable<T> = { readonly inEdit: boolean | undefined } & T;\nexport type Expandable<T> = { readonly expanded: boolean | undefined } & T;\nexport type Materialized<T> = { readonly materializedPath: string } & T;\n\ntype Data<T> = DataResult<T>['data'];\n\nexport function isGroupItem<T>(\n item: T | GroupResult<T>,\n groups: GroupDescriptor[]\n): item is GroupResult<T> {\n const field: string | undefined = (item as GroupResult<T>).field;\n\n return !!field && groups.some(g => g.field === field);\n}\n\nfunction addAggregatesToGroups(groups: GroupDescriptor[], aggregates: AggregateDescriptor[]) {\n return groups.map(group => ({\n ...group,\n aggregates,\n }));\n}\n\nexport type PossibleFormState<T> = FormState<{\n [P in keyof T]-?: FieldState<T[P]>;\n}>;\n\nexport interface TableStateModel<TId extends IdType = never> {\n skip: number;\n selectedIds: TId[];\n expandedIds: TId[];\n collapsedGroups: string[];\n sort: SortDescriptor[];\n filter?: CompositeFilterDescriptor;\n aggregates: AggregateDescriptor[];\n group: GroupDescriptor[];\n}\n\nexport interface TableStateConstructorParams<\n T,\n TId extends IdType = never,\n P = never,\n PId extends IdType = never,\n> {\n dataSource?: DataSource<T, TId> | null;\n pageSize?: number;\n /** For use with tables that enable selection only. Specifies if the item is selectable in the checkbox */\n isRowUnselectable?: (row: T) => boolean;\n\n /**\n * Initial expand state for row details\n * collapsed - row details are collapsed by default\n * expanded - row details are expanded until it will be collapsed\n */\n rowDetailsExpandState?: 'collapsed' | 'expanded';\n selectionLimit?: number;\n getFormState?(row: T): PossibleFormState<T>;\n parent?: {\n row: P;\n tableState: TableState<P, PId>;\n };\n getDetailTableState?: (row: T) => TableState<any, any, any, any> | undefined;\n initialState?: TableStateModel<TId>;\n alwaysEditable?: boolean;\n rowIdKey?: string;\n}\n\ninterface FetchDataParams {\n newSkip?: number;\n newSort?: SortDescriptor[];\n newFilter?: CompositeFilterDescriptor | null;\n newAggregates?: AggregateDescriptor[];\n newGroup?: GroupDescriptor[];\n}\n\ninterface SelectionOptions {\n ignoreUnselectable?: boolean;\n recursive?: boolean;\n}\n\ninterface SetDataSourceParams<TId extends IdType = never> {\n reset?: boolean;\n initialState?: TableStateModel<TId>;\n}\n\ninterface EditingForm<T> {\n form: PossibleFormState<T>;\n field?: keyof T;\n}\n\n/** Interface for unit testing purposes.*/\nexport interface ITableState<T, TId extends IdType = never> {\n totalCount?: number;\n selectedCount?: number;\n addToDataSource?: (row: T, select?: boolean) => Promise<void>;\n removeFromDataSource?: (id: TId) => Promise<T | undefined>;\n selectAll?: () => Promise<void>;\n deselectAll?: () => void;\n setDataSource?: (\n dataSource: DataSource<T, TId> | null,\n setDataSourceParams?: boolean | SetDataSourceParams<TId>\n ) => Promise<void>;\n isRowUnselectable?: (row: T) => boolean;\n}\n\nexport class TableState<T, TId extends IdType = never, P = never, PId extends IdType = never> {\n @observable private innerDataSource: DataSource<T, TId> | null;\n\n @computed get dataSource() {\n return this.innerDataSource;\n }\n\n private traverse(\n items: Data<Selectable<T>>,\n itemCallback: (item: Selectable<T>) => void,\n groupCallback?: (group: GroupResult<T>, materializedPath: string) => void,\n materializedPath = ''\n ) {\n if (!items) {\n return;\n }\n\n for (const item of items) {\n if (isGroupItem(item, this.group)) {\n const groupMaterializedPath = materializedPath + `/${item.value}`;\n\n if (groupCallback) {\n groupCallback(item, groupMaterializedPath);\n }\n\n this.traverse(item.items, itemCallback, groupCallback, groupMaterializedPath);\n } else {\n itemCallback(item);\n }\n }\n }\n\n @computed\n private get originalData() {\n const result: Selectable<T>[] = [];\n\n this.traverse(this.data, item => {\n result.push(item);\n });\n\n return result;\n }\n\n parent?: {\n row: P;\n tableState: TableState<P, PId>;\n };\n getDetailTableState?: (row: T) => TableState<any, any, any, any> | undefined;\n\n @observable selectedIds = new Set<TId>();\n @observable inEdit = new Map<TId, EditingForm<T>>();\n @observable expandedIds = new Set<TId>();\n @observable collapsedIds = new Set<TId>();\n @observable collapsedGroups = new Set<string>();\n\n isRowUnselectable: (row: T) => boolean; // TODO: think about a better name\n selectionLimit: number;\n\n getFormState?(row: T): PossibleFormState<T>;\n\n @observable data: Data<Selectable<T>> = [];\n @observable totalCount = 0;\n @observable filteredCount = 0;\n @observable selectedCount = 0;\n @observable unselectableCount = 0;\n\n @computed get unselectedCount() {\n return this.totalCount - this.selectedCount;\n }\n\n @computed get selectableCount() {\n return this.totalCount - this.unselectableCount;\n }\n\n @computed get filteredUnselectableCount() {\n return this.originalData.filter(this.isRowUnselectable).length;\n }\n\n @computed get filteredSelectableCount() {\n return this.originalData.length - this.filteredUnselectableCount;\n }\n\n @computed\n private get totalFilteredSelectableCountPromise() {\n return fromPromise(\n new Promise<number>((resolve, reject) => {\n if (!this.dataSource) {\n return reject();\n }\n\n this.dataSource\n .getData({\n filter: this.filter,\n })\n .then(filteredData => {\n resolve(\n (filteredData.data as T[]).filter(row => !this.isRowUnselectable(row))\n .length\n );\n })\n .catch(reject);\n })\n );\n }\n\n @computed get totalFilteredSelectableCount(): number {\n return (this.totalFilteredSelectableCountPromise.value as number) || 0;\n }\n\n @observable sort: SortDescriptor[] = [];\n @observable filter: CompositeFilterDescriptor | undefined;\n\n @observable aggregates: AggregateDescriptor[] = [];\n\n @observable innerGroup: GroupDescriptor[] = [];\n\n @computed\n get group(): GroupDescriptor[] {\n return addAggregatesToGroups(this.innerGroup, this.aggregates);\n }\n\n set group(value: GroupDescriptor[]) {\n this.innerGroup = value;\n }\n\n @observable skip = 0;\n @observable pageSize?: number;\n\n private tablePdfExport: TablePDFExport | null = null;\n private tableExcelExport: ExcelExport | null = null;\n private readonly rowDetailsExpandState: 'collapsed' | 'expanded';\n\n rowIdKey?: string;\n alwaysEditable: boolean;\n\n constructor({\n dataSource = null,\n rowIdKey,\n pageSize,\n isRowUnselectable = () => false,\n rowDetailsExpandState = 'collapsed',\n selectionLimit = Infinity,\n getFormState,\n parent,\n getDetailTableState,\n initialState,\n alwaysEditable = false,\n }: TableStateConstructorParams<T, TId, P, PId> = {}) {\n makeObservable(this);\n\n this.innerDataSource = dataSource;\n this.pageSize = pageSize;\n this.isRowUnselectable = isRowUnselectable;\n this.rowDetailsExpandState = rowDetailsExpandState;\n this.selectionLimit = selectionLimit;\n this.rowIdKey = rowIdKey;\n\n this.getFormState = getFormState;\n\n this.parent = parent;\n this.getDetailTableState = getDetailTableState;\n\n if (initialState) {\n this.importState(initialState);\n }\n\n this.alwaysEditable = alwaysEditable;\n\n this.fetchInitialData();\n\n if (this.alwaysEditable) {\n this.editAll();\n }\n }\n\n async addToDataSource(row: T, select?: boolean, index?: number) {\n if (!this.dataSource) {\n return;\n }\n\n if (!this.dataSource.addData) {\n throw 'missing addData in the data source';\n }\n\n await this.dataSource.addData(row, index);\n runInAction(() => {\n this.totalCount += 1;\n\n if (select) {\n if (!this.dataSource!.idSelector) {\n throw 'missing idSelector in the data source';\n }\n\n this.selectedIds.add(this.dataSource!.idSelector(row));\n this.selectedCount += 1;\n }\n\n if (this.alwaysEditable) {\n this.edit(row);\n }\n });\n\n await this.fetchData();\n }\n\n async removeFromDataSource(id: TId): Promise<T | undefined> {\n if (!this.dataSource) {\n return;\n }\n\n if (!this.dataSource.removeData) {\n throw 'missing removeData in the data source';\n }\n\n const row = (await this.dataSource.removeData(id)) as Selectable<T> | undefined;\n if (!row) {\n return;\n }\n\n runInAction(() => {\n this.totalCount -= 1;\n // Updating filteredCount here to force Table rerender after this action\n this.filteredCount -= 1;\n\n if (this.selectedIds.has(id)) {\n this.selectedIds.delete(id);\n this.selectedCount -= 1;\n }\n\n if (this.inEdit.has(id)) {\n this.inEdit.delete(id);\n }\n\n if (this.expandedIds.has(id)) {\n this.expandedIds.delete(id);\n }\n });\n\n // If the current page has only one row and it's removed, fetch the previous page if it exists\n if (this.data.length === 1 && this.pageSize && this.skip >= this.pageSize) {\n await this.fetchData({ newSkip: this.skip - this.pageSize });\n } else {\n await this.fetchData();\n }\n\n return row;\n }\n\n @action\n async setRowsSelection(\n rows: T[],\n value: boolean,\n { ignoreUnselectable = true, recursive = true }: SelectionOptions = {}\n ) {\n if (!this.dataSource) {\n return;\n }\n\n if (!this.dataSource.idSelector) {\n throw 'missing idSelector in the data source';\n }\n\n for (const row of rows) {\n if (ignoreUnselectable && this.isRowUnselectable(row)) {\n continue;\n }\n\n runInAction(() => {\n if (!value) {\n this.selectedIds.delete(this.dataSource!.idSelector!(row));\n } else if (this.selectedCount < this.selectionLimit) {\n this.selectedIds.add(this.dataSource!.idSelector!(row));\n }\n });\n\n // update children selection\n if (recursive && this.getDetailTableState) {\n const detail = this.getDetailTableState(row);\n\n if (detail?.selectableCount) {\n // eslint-disable-next-line no-await-in-loop\n await detail.setAllSelection(value);\n }\n }\n }\n\n // update parent selection\n if (this.parent) {\n if (this.isAllPageRowsSelected) {\n await this.parent.tableState.setRowsSelection([this.parent.row], true, {\n recursive: false,\n });\n } else {\n await this.parent.tableState.setRowsSelection([this.parent.row], false, {\n recursive: false,\n });\n }\n }\n\n runInAction(() => {\n this.selectedCount = this.selectedIds.size;\n this.data = this.data.slice();\n });\n }\n\n async selectPage(options?: SelectionOptions) {\n await this.setRowsSelection(this.originalData, true, options);\n }\n\n async deselectPage(options?: SelectionOptions) {\n await this.setRowsSelection(this.originalData, false, options);\n }\n\n private async setAllSelection(value: boolean, options?: SelectionOptions) {\n if (!this.dataSource) {\n return;\n }\n\n const filteredData = await this.dataSource.getData({\n filter: this.filter,\n });\n\n await this.setRowsSelection(filteredData.data as T[], value, options);\n }\n\n async selectAll(options?: SelectionOptions) {\n if (this.selectionLimit !== Infinity) {\n throw \"selectAll isn't supported for limited selection\";\n }\n\n await this.setAllSelection(true, options);\n }\n\n async deselectAll(options?: SelectionOptions) {\n await this.setAllSelection(false, options);\n }\n\n @action\n edit(row: T, field?: keyof T) {\n if (!this.dataSource) {\n return;\n }\n\n if (!this.dataSource.idSelector) {\n throw 'missing idSelector in the data source';\n }\n\n if (!this.getFormState) {\n throw 'missing getFormState';\n }\n\n this.inEdit.set(this.dataSource.idSelector(row), {\n form: this.getFormState(row),\n field,\n });\n\n this.data = this.data.slice();\n }\n\n @action\n async saveEdit(row: T, beforeSave?: (changed: T, field?: keyof T) => Promise<void>) {\n if (!this.dataSource) {\n return;\n }\n\n if (!this.dataSource.idSelector) {\n throw 'missing idSelector in the data source';\n }\n\n if (!this.dataSource.updateData) {\n throw 'missing updateData in the data source';\n }\n\n const id = this.dataSource.idSelector(row);\n const editingForm = this.inEdit.get(id);\n\n if (!editingForm) {\n return;\n }\n\n const { form, field } = editingForm;\n const changed = formStateToJS(form) as unknown as T; // FIXME: incompatible types\n if (beforeSave) {\n await beforeSave(changed, field);\n }\n\n await this.dataSource.updateData(id, changed);\n\n if (!this.alwaysEditable) {\n runInAction(() => {\n this.inEdit.delete(id);\n });\n }\n\n await this.fetchData();\n }\n\n @action\n cancelEdit(row: T) {\n if (!this.dataSource) {\n return;\n }\n\n if (!this.dataSource.idSelector) {\n throw 'missing idSelector in the data source';\n }\n\n if (this.alwaysEditable) {\n return;\n }\n\n this.inEdit.delete(this.dataSource.idSelector(row));\n\n this.data = this.data.slice();\n }\n\n async editAll() {\n if (!this.dataSource) {\n return;\n }\n\n if (!this.dataSource.idSelector) {\n throw 'missing idSelector in the data source';\n }\n\n if (!this.getFormState) {\n throw 'missing getFormState';\n }\n\n const rows = (\n await this.dataSource.getData({\n filter: this.filter,\n })\n ).data as T[];\n\n runInAction(() => {\n this.inEdit = new Map(\n rows.map<[TId, EditingForm<T>]>(row => [\n this.dataSource!.idSelector!(row),\n { form: this.getFormState!(row) },\n ])\n );\n\n this.data = this.data.slice();\n });\n }\n\n async saveEditAll(beforeSave?: (changed: T[]) => Promise<void>) {\n if (!this.dataSource) {\n return;\n }\n\n if (!this.dataSource.updateData) {\n throw 'missing updateData in the data source';\n }\n\n const changes = Array.from(this.inEdit).map(([id, { form }]) => ({\n id,\n changed: formStateToJS(form) as unknown as T, // FIXME: incompatible types\n }));\n\n if (beforeSave) {\n await beforeSave(changes.map(change => change.changed));\n }\n\n for (const { id, changed } of changes) {\n // eslint-disable-next-line no-await-in-loop\n await this.dataSource.updateData(id, changed);\n }\n\n if (!this.alwaysEditable) {\n runInAction(() => {\n this.inEdit = new Map();\n });\n }\n\n await this.fetchData();\n }\n\n @action\n cancelEditAll() {\n if (!this.dataSource) {\n return;\n }\n\n if (this.alwaysEditable) {\n return;\n }\n\n this.inEdit = new Map();\n\n this.data = this.data.slice();\n }\n\n @action reset() {\n this.totalCount = 0;\n this.filteredCount = 0;\n this.data = [];\n this.selectedCount = 0;\n this.selectedIds = new Set();\n this.inEdit = new Map();\n this.expandedIds = new Set();\n this.collapsedIds = new Set();\n this.collapsedGroups = new Set();\n this.sort = [];\n this.filter = undefined;\n this.aggregates = [];\n this.innerGroup = [];\n }\n\n @action\n async setDataSource(\n dataSource: DataSource<T, TId> | null,\n setDataSourceParams?: SetDataSourceParams<TId> | boolean\n ) {\n this.innerDataSource = dataSource;\n this.skip = 0;\n\n const reset =\n typeof setDataSourceParams === 'boolean'\n ? setDataSourceParams\n : setDataSourceParams?.reset;\n const config = setDataSourceParams as SetDataSourceParams<TId>;\n\n if (reset) {\n this.reset();\n }\n if (config?.initialState) {\n this.importState(config.initialState);\n }\n await this.fetchInitialData();\n\n if (this.alwaysEditable) {\n await this.editAll();\n }\n }\n\n @action\n private fetchInitialData = async () => {\n if (!this.dataSource) {\n return;\n }\n\n const initial = (await this.dataSource.getData({\n skip: this.skip,\n take: this.pageSize,\n filter: this.filter,\n sort: [...this.sort],\n group: [...this.group],\n })) as DataResult<Selectable<T>>;\n\n runInAction(() => {\n this.totalCount = initial.total;\n this.filteredCount = initial.total;\n this.updateExpandState(initial.data);\n this.data = initial.data;\n this.unselectableCount = this.originalData.filter(this.isRowUnselectable).length;\n\n this.addPropertiesToRows(this.data);\n });\n };\n\n private addPropertiesToRows(data: Data<Selectable<T>>) {\n this.traverse(\n data,\n item => {\n if (!this.dataSource) {\n return;\n }\n\n if (!this.dataSource.idSelector) {\n return;\n }\n\n if (!('selected' in item)) {\n Object.defineProperty(item, 'selected', {\n get: () => this.selectedIds.has(this.dataSource!.idSelector!(item)),\n });\n }\n\n if (!('indeterminate' in item)) {\n Object.defineProperty(item, 'indeterminate', {\n get: () => {\n const detail = this.getDetailTableState?.(item);\n\n if (!detail) {\n return false;\n }\n\n return detail.isSomePageRowsSelected;\n },\n });\n }\n\n if (!('inEdit' in item)) {\n Object.defineProperty(item, 'inEdit', {\n get: () => this.inEdit.has(this.dataSource!.idSelector!(item)),\n });\n }\n\n if (!('expanded' in item)) {\n Object.defineProperty(item, 'expanded', {\n get: () => this.expandedIds.has(this.dataSource!.idSelector!(item)),\n });\n }\n },\n (group, materializedPath) => {\n if (!('materializedPath' in group)) {\n Object.defineProperty(group, 'materializedPath', {\n get: () => materializedPath,\n });\n }\n\n if (!('expanded' in group)) {\n Object.defineProperty(group, 'expanded', {\n get: () =>\n !this.collapsedGroups.has(\n (group as Materialized<GroupResult<T>>).materializedPath\n ),\n });\n }\n }\n );\n }\n\n @action\n handleFilterChange = (ev: TableFilterChangeEvent) => {\n this.fetchData({\n newFilter: ev.filter,\n });\n };\n\n @action\n handleGroupChange = (ev: TableGroupChangeEvent) => {\n this.collapsedGroups = new Set();\n\n this.fetchData({\n newGroup: ev.group,\n });\n };\n\n @action\n handleExpandChange = ({ dataItem, value }: TableExpandChangeEvent) => {\n if (isGroupItem(dataItem, this.group)) {\n const { materializedPath } = dataItem as Materialized<GroupResult<T>>;\n if (value) {\n this.collapsedGroups.delete(materializedPath);\n } else {\n this.collapsedGroups.add(materializedPath);\n }\n } else {\n if (!this.dataSource) {\n return;\n }\n\n if (!this.dataSource.idSelector) {\n throw 'missing idSelector in the data source';\n }\n\n const id = this.dataSource.idSelector(dataItem);\n if (value) {\n this.expandedIds.add(id);\n this.collapsedIds.delete(id);\n } else {\n this.expandedIds.delete(id);\n this.collapsedIds.add(id);\n }\n }\n\n this.data = this.data.slice();\n };\n\n @action\n handleSortChange = (ev: TableSortChangeEvent) => {\n this.fetchData({\n newSort: ev.sort,\n });\n };\n\n @action\n handlePageChange = (ev: TablePageChangeEvent) => {\n if (this.pageSize !== ev.page.take) {\n this.pageSize = ev.page.take;\n this.skip = 0;\n } else if (this.skip === ev.page.skip) {\n return;\n }\n\n this.fetchData({\n newSkip: ev.page.skip,\n });\n };\n\n /** Call without params if unchanged */\n fetchData = async ({\n newSkip,\n newSort,\n newFilter,\n newAggregates,\n newGroup,\n }: FetchDataParams = {}) => {\n const sort = newSort ?? [...this.sort];\n const filter = newFilter === null ? undefined : (newFilter ?? this.filter);\n const aggregates = newAggregates ?? this.aggregates;\n const group = addAggregatesToGroups(newGroup ?? this.group, aggregates);\n const skip =\n newSort || newFilter !== undefined || newGroup\n ? 0\n : newSkip !== undefined\n ? newSkip\n : this.skip;\n\n if (!this.dataSource) {\n runInAction(() => {\n this.sort = sort;\n this.filter = filter;\n this.aggregates = aggregates;\n this.innerGroup = group;\n });\n\n return;\n }\n\n const newData = (await this.dataSource.getData({\n skip,\n sort,\n filter,\n group: [...group],\n take: this.pageSize,\n })) as DataResult<Selectable<T>>;\n\n runInAction(() => {\n if (!this.dataSource) {\n return;\n }\n\n if (newFilter !== undefined) {\n // When a new filter is applied, deselect items that don't match the filter\n if (this.dataSource.getFilteredPersistentItems) {\n // For persistent items, deselect everything in the persistent array that's been filtered out\n if (newFilter !== null && this.dataSource.idSelector) {\n let delta = 0;\n const filteredData = this.dataSource.getFilteredPersistentItems(\n newFilter\n ) as Expandable<Editable<Selectable<T>>>[];\n filteredData.forEach(dataItem => {\n const id = this.dataSource!.idSelector!(dataItem);\n if (this.selectedIds.delete(id)) {\n delta += 1;\n }\n\n if (!this.alwaysEditable) {\n this.inEdit.delete(id);\n }\n\n this.expandedIds.delete(id);\n });\n this.selectedCount -= delta;\n }\n } else {\n // For non-peristent items, everything is deselected by default\n this.selectedCount = 0;\n }\n }\n\n this.updateExpandState(newData.data);\n this.data = newData.data;\n this.filteredCount = newData.total;\n this.sort = sort;\n this.filter = filter;\n this.aggregates = aggregates;\n this.innerGroup = group;\n this.skip = skip;\n\n this.addPropertiesToRows(this.data);\n });\n };\n\n isRowSelectable = (row: Selectable<T>) =>\n !this.isRowUnselectable(row) &&\n (this.selectionLimit === Infinity ||\n row.selected ||\n this.selectedCount < this.selectionLimit);\n\n @action\n async toggleRowSelection(row: T, options?: SelectionOptions) {\n if (!this.dataSource) {\n return;\n }\n\n if (!this.dataSource.idSelector) {\n throw 'missing idSelector in the data source';\n }\n\n await this.setRowsSelection(\n [row],\n !this.selectedIds.has(this.dataSource.idSelector(row)),\n options\n );\n }\n\n @computed get isAllPageRowsSelected() {\n return (\n this.originalData.some(row => row.selected) &&\n this.originalData.every(row => this.isRowUnselectable(row) || row.selected)\n );\n }\n\n @computed get isSomePageRowsSelected() {\n return this.originalData.some(row => row.selected) && !this.isAllPageRowsSelected;\n }\n\n @computed get isAllRowsSelected() {\n if (!this.selectedIds.size) {\n return false;\n }\n\n return this.selectedIds.size === this.totalFilteredSelectableCount;\n }\n\n @computed get isSomeRowsSelected() {\n if (!this.selectedIds.size) {\n return false;\n }\n\n return !this.isAllRowsSelected;\n }\n\n setTablePdfExportRef = (el: TablePDFExport | null) => (this.tablePdfExport = el);\n setTableExcelExportRef = (el: ExcelExport | null) => (this.tableExcelExport = el);\n\n exportPdf = async () => {\n if (this.dataSource && this.tablePdfExport) {\n const { data } = await this.dataSource.getData({}); // fetch all data\n this.tablePdfExport.save(data);\n }\n };\n\n exportExcel = async (\n data?: any[] | ExcelExportData | WorkbookOptions,\n columns?: ExcelExportColumnProps[] | ReactElement<ExcelExportColumnProps>[]\n ) => {\n if (this.tableExcelExport) {\n this.tableExcelExport.save(\n data ?? (await this.filteredSortedUnpaginatedData()).data,\n columns\n );\n }\n };\n\n filteredSortedUnpaginatedData = () => {\n if (!this.dataSource) {\n throw 'missing dataSource';\n }\n return this.dataSource.getData({\n filter: this.filter,\n sort: [...this.sort],\n group: [...this.group],\n });\n };\n\n getRowsBetween = (start: Selectable<T>, end: Selectable<T>) => {\n const idSelector = this.dataSource?.idSelector;\n\n if (!idSelector) {\n return [];\n }\n\n let from: number | undefined, to: number | undefined;\n\n const startId = idSelector(start);\n const endId = idSelector(end);\n\n for (const [index, row] of this.originalData.entries()) {\n const id = idSelector(row);\n\n if (startId === id) {\n from = index;\n }\n\n if (endId === id) {\n to = index;\n }\n }\n\n if (from === undefined || to === undefined) {\n return [];\n }\n\n return this.originalData.slice(Math.min(from, to), Math.max(from, to) + 1);\n };\n\n exportState(): TableStateModel<TId> {\n return {\n skip: this.skip,\n selectedIds: Array.from(this.selectedIds),\n expandedIds: Array.from(this.expandedIds),\n collapsedGroups: Array.from(this.collapsedGroups),\n sort: this.sort,\n filter: this.filter,\n aggregates: this.aggregates,\n group: this.innerGroup,\n };\n }\n\n @action\n importState(data: TableStateModel<TId>) {\n this.skip = data.skip;\n this.selectedIds = new Set(data.selectedIds);\n this.expandedIds = new Set(data.expandedIds);\n this.collapsedGroups = new Set(data.collapsedGroups);\n this.sort = data.sort;\n this.filter = data.filter;\n this.aggregates = data.aggregates;\n this.innerGroup = data.group;\n }\n\n @action private updateExpandState(data: TableState<T, TId>['data']) {\n if (this.rowDetailsExpandState === 'expanded') {\n this.traverse(data, item => {\n const id = this.dataSource?.idSelector?.(item);\n\n if (id !== undefined && !this.collapsedIds.has(id)) {\n this.expandedIds.add(id);\n }\n });\n }\n }\n}\n"],"names":["action","computed","observable","runInAction","makeObservable","fromPromise","formStateToJS","isGroupItem","item","groups","field","some","g","addAggregatesToGroups","aggregates","map","group","TableState","dataSource","innerDataSource","traverse","items","itemCallback","groupCallback","materializedPath","groupMaterializedPath","value","originalData","result","data","push","unselectedCount","totalCount","selectedCount","selectableCount","unselectableCount","filteredUnselectableCount","filter","isRowUnselectable","length","filteredSelectableCount","totalFilteredSelectableCountPromise","Promise","resolve","reject","getData","then","filteredData","row","catch","totalFilteredSelectableCount","innerGroup","addToDataSource","select","index","addData","idSelector","selectedIds","add","alwaysEditable","edit","fetchData","removeFromDataSource","id","removeData","filteredCount","has","delete","inEdit","expandedIds","pageSize","skip","newSkip","setRowsSelection","rows","ignoreUnselectable","recursive","selectionLimit","getDetailTableState","detail","setAllSelection","parent","isAllPageRowsSelected","tableState","size","slice","selectPage","options","deselectPage","selectAll","Infinity","deselectAll","getFormState","set","form","saveEdit","beforeSave","updateData","editingForm","get","changed","cancelEdit","editAll","Map","saveEditAll","changes","Array","from","change","cancelEditAll","reset","Set","collapsedIds","collapsedGroups","sort","undefined","setDataSource","setDataSourceParams","config","initialState","importState","fetchInitialData","addPropertiesToRows","Object","defineProperty","isSomePageRowsSelected","toggleRowSelection","selected","every","isAllRowsSelected","isSomeRowsSelected","exportState","updateExpandState","rowDetailsExpandState","constructor","rowIdKey","tablePdfExport","tableExcelExport","initial","take","total","handleFilterChange","ev","newFilter","handleGroupChange","newGroup","handleExpandChange","dataItem","handleSortChange","newSort","handlePageChange","page","newAggregates","newData","getFilteredPersistentItems","delta","forEach","isRowSelectable","setTablePdfExportRef","el","setTableExcelExportRef","exportPdf","save","exportExcel","columns","filteredSortedUnpaginatedData","getRowsBetween","start","end","to","startId","endId","entries","Math","min","max"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/table-state.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/member-ordering */\nimport { ReactElement } from 'react';\nimport { action, computed, observable, runInAction, makeObservable } from 'mobx';\nimport { fromPromise } from 'mobx-utils';\nimport {\n AggregateDescriptor,\n CompositeFilterDescriptor,\n GroupDescriptor,\n SortDescriptor,\n DataResult,\n GroupResult,\n DataSource,\n IdType,\n} from '@servicetitan/data-query';\nimport {\n ExcelExport,\n ExcelExportData,\n ExcelExportColumnProps,\n} from '@progress/kendo-react-excel-export';\nimport {\n TableExpandChangeEvent,\n TableFilterChangeEvent,\n TableGroupChangeEvent,\n TablePageChangeEvent,\n TableSortChangeEvent,\n} from '@servicetitan/design-system';\nimport { GridPDFExport as TablePDFExport } from '@progress/kendo-react-pdf';\nimport { WorkbookOptions } from '@progress/kendo-ooxml';\nimport { FormState, FieldState } from 'formstate';\nimport { formStateToJS } from '@servicetitan/form';\n\nexport type Selectable<T> = { readonly selected: boolean | undefined } & T;\nexport type Editable<T> = { readonly inEdit: boolean | undefined } & T;\nexport type Expandable<T> = { readonly expanded: boolean | undefined } & T;\nexport type Materialized<T> = { readonly materializedPath: string } & T;\n\ntype Data<T> = DataResult<T>['data'];\n\nexport function isGroupItem<T>(\n item: T | GroupResult<T>,\n groups: GroupDescriptor[]\n): item is GroupResult<T> {\n const field: string | undefined = (item as GroupResult<T>).field;\n\n return !!field && groups.some(g => g.field === field);\n}\n\nfunction addAggregatesToGroups(groups: GroupDescriptor[], aggregates: AggregateDescriptor[]) {\n return groups.map(group => ({\n ...group,\n aggregates,\n }));\n}\n\nexport type PossibleFormState<T> = FormState<{\n [P in keyof T]-?: FieldState<T[P]>;\n}>;\n\nexport interface TableStateModel<TId extends IdType = never> {\n skip: number;\n selectedIds: TId[];\n expandedIds: TId[];\n collapsedGroups: string[];\n sort: SortDescriptor[];\n filter?: CompositeFilterDescriptor;\n aggregates: AggregateDescriptor[];\n group: GroupDescriptor[];\n}\n\nexport interface TableStateConstructorParams<\n T,\n TId extends IdType = never,\n P = never,\n PId extends IdType = never,\n> {\n dataSource?: DataSource<T, TId> | null;\n pageSize?: number;\n /** For use with tables that enable selection only. Specifies if the item is selectable in the checkbox */\n isRowUnselectable?: (row: T) => boolean;\n\n /**\n * Initial expand state for row details\n * collapsed - row details are collapsed by default\n * expanded - row details are expanded until it will be collapsed\n */\n rowDetailsExpandState?: 'collapsed' | 'expanded';\n selectionLimit?: number;\n getFormState?(row: T): PossibleFormState<T>;\n parent?: {\n row: P;\n tableState: TableState<P, PId>;\n };\n getDetailTableState?: (row: T) => TableState<any, any, any, any> | undefined;\n initialState?: TableStateModel<TId>;\n alwaysEditable?: boolean;\n rowIdKey?: string;\n}\n\ninterface FetchDataParams {\n newSkip?: number;\n newSort?: SortDescriptor[];\n newFilter?: CompositeFilterDescriptor | null;\n newAggregates?: AggregateDescriptor[];\n newGroup?: GroupDescriptor[];\n}\n\ninterface SelectionOptions {\n ignoreUnselectable?: boolean;\n recursive?: boolean;\n}\n\ninterface SetDataSourceParams<TId extends IdType = never> {\n reset?: boolean;\n initialState?: TableStateModel<TId>;\n}\n\ninterface EditingForm<T> {\n form: PossibleFormState<T>;\n field?: keyof T;\n}\n\n/** Interface for unit testing purposes.*/\nexport interface ITableState<T, TId extends IdType = never> {\n totalCount?: number;\n selectedCount?: number;\n addToDataSource?: (row: T, select?: boolean) => Promise<void>;\n removeFromDataSource?: (id: TId) => Promise<T | undefined>;\n selectAll?: () => Promise<void>;\n deselectAll?: () => void;\n setDataSource?: (\n dataSource: DataSource<T, TId> | null,\n setDataSourceParams?: boolean | SetDataSourceParams<TId>\n ) => Promise<void>;\n isRowUnselectable?: (row: T) => boolean;\n}\n\nexport class TableState<T, TId extends IdType = never, P = never, PId extends IdType = never> {\n @observable private innerDataSource: DataSource<T, TId> | null;\n\n @computed get dataSource() {\n return this.innerDataSource;\n }\n\n private traverse(\n items: Data<Selectable<T>>,\n itemCallback: (item: Selectable<T>) => void,\n groupCallback?: (group: GroupResult<T>, materializedPath: string) => void,\n materializedPath = ''\n ) {\n if (!items) {\n return;\n }\n\n for (const item of items) {\n if (isGroupItem(item, this.group)) {\n const groupMaterializedPath = materializedPath + `/${item.value}`;\n\n if (groupCallback) {\n groupCallback(item, groupMaterializedPath);\n }\n\n this.traverse(item.items, itemCallback, groupCallback, groupMaterializedPath);\n } else {\n itemCallback(item);\n }\n }\n }\n\n @computed\n private get originalData() {\n const result: Selectable<T>[] = [];\n\n this.traverse(this.data, item => {\n result.push(item);\n });\n\n return result;\n }\n\n parent?: {\n row: P;\n tableState: TableState<P, PId>;\n };\n getDetailTableState?: (row: T) => TableState<any, any, any, any> | undefined;\n\n @observable selectedIds = new Set<TId>();\n @observable inEdit = new Map<TId, EditingForm<T>>();\n @observable expandedIds = new Set<TId>();\n @observable collapsedIds = new Set<TId>();\n @observable collapsedGroups = new Set<string>();\n\n isRowUnselectable: (row: T) => boolean; // TODO: think about a better name\n selectionLimit: number;\n\n getFormState?(row: T): PossibleFormState<T>;\n\n @observable data: Data<Selectable<T>> = [];\n @observable totalCount = 0;\n @observable filteredCount = 0;\n @observable selectedCount = 0;\n @observable unselectableCount = 0;\n\n @computed get unselectedCount() {\n return this.totalCount - this.selectedCount;\n }\n\n @computed get selectableCount() {\n return this.totalCount - this.unselectableCount;\n }\n\n @computed get filteredUnselectableCount() {\n return this.originalData.filter(this.isRowUnselectable).length;\n }\n\n @computed get filteredSelectableCount() {\n return this.originalData.length - this.filteredUnselectableCount;\n }\n\n @computed\n private get totalFilteredSelectableCountPromise() {\n return fromPromise(\n new Promise<number>((resolve, reject) => {\n if (!this.dataSource) {\n return reject();\n }\n\n this.dataSource\n .getData({\n filter: this.filter,\n })\n .then(filteredData => {\n resolve(\n (filteredData.data as T[]).filter(row => !this.isRowUnselectable(row))\n .length\n );\n })\n .catch(reject);\n })\n );\n }\n\n @computed get totalFilteredSelectableCount(): number {\n return (this.totalFilteredSelectableCountPromise.value as number) || 0;\n }\n\n @observable sort: SortDescriptor[] = [];\n @observable filter: CompositeFilterDescriptor | undefined;\n\n @observable aggregates: AggregateDescriptor[] = [];\n\n @observable innerGroup: GroupDescriptor[] = [];\n\n @computed\n get group(): GroupDescriptor[] {\n return addAggregatesToGroups(this.innerGroup, this.aggregates);\n }\n\n set group(value: GroupDescriptor[]) {\n this.innerGroup = value;\n }\n\n @observable skip = 0;\n @observable pageSize?: number;\n\n private tablePdfExport: TablePDFExport | null = null;\n private tableExcelExport: ExcelExport | null = null;\n private readonly rowDetailsExpandState: 'collapsed' | 'expanded';\n\n rowIdKey?: string;\n alwaysEditable: boolean;\n\n constructor({\n dataSource = null,\n rowIdKey,\n pageSize,\n isRowUnselectable = () => false,\n rowDetailsExpandState = 'collapsed',\n selectionLimit = Infinity,\n getFormState,\n parent,\n getDetailTableState,\n initialState,\n alwaysEditable = false,\n }: TableStateConstructorParams<T, TId, P, PId> = {}) {\n makeObservable(this);\n\n this.innerDataSource = dataSource;\n this.pageSize = pageSize;\n this.isRowUnselectable = isRowUnselectable;\n this.rowDetailsExpandState = rowDetailsExpandState;\n this.selectionLimit = selectionLimit;\n this.rowIdKey = rowIdKey;\n\n this.getFormState = getFormState;\n\n this.parent = parent;\n this.getDetailTableState = getDetailTableState;\n\n if (initialState) {\n this.importState(initialState);\n }\n\n this.alwaysEditable = alwaysEditable;\n\n this.fetchInitialData();\n\n if (this.alwaysEditable) {\n this.editAll();\n }\n }\n\n async addToDataSource(row: T, select?: boolean, index?: number) {\n if (!this.dataSource) {\n return;\n }\n\n if (!this.dataSource.addData) {\n throw 'missing addData in the data source';\n }\n\n await this.dataSource.addData(row, index);\n runInAction(() => {\n this.totalCount += 1;\n\n if (select) {\n if (!this.dataSource!.idSelector) {\n throw 'missing idSelector in the data source';\n }\n\n this.selectedIds.add(this.dataSource!.idSelector(row));\n this.selectedCount += 1;\n }\n\n if (this.alwaysEditable) {\n this.edit(row);\n }\n });\n\n await this.fetchData();\n }\n\n async removeFromDataSource(id: TId): Promise<T | undefined> {\n if (!this.dataSource) {\n return;\n }\n\n if (!this.dataSource.removeData) {\n throw 'missing removeData in the data source';\n }\n\n const row = (await this.dataSource.removeData(id)) as Selectable<T> | undefined;\n if (!row) {\n return;\n }\n\n runInAction(() => {\n this.totalCount -= 1;\n // Updating filteredCount here to force Table rerender after this action\n this.filteredCount -= 1;\n\n if (this.selectedIds.has(id)) {\n this.selectedIds.delete(id);\n this.selectedCount -= 1;\n }\n\n if (this.inEdit.has(id)) {\n this.inEdit.delete(id);\n }\n\n if (this.expandedIds.has(id)) {\n this.expandedIds.delete(id);\n }\n });\n\n // If the current page has only one row and it's removed, fetch the previous page if it exists\n if (this.data.length === 1 && this.pageSize && this.skip >= this.pageSize) {\n await this.fetchData({ newSkip: this.skip - this.pageSize });\n } else {\n await this.fetchData();\n }\n\n return row;\n }\n\n @action\n async setRowsSelection(\n rows: T[],\n value: boolean,\n { ignoreUnselectable = true, recursive = true }: SelectionOptions = {}\n ) {\n if (!this.dataSource) {\n return;\n }\n\n if (!this.dataSource.idSelector) {\n throw 'missing idSelector in the data source';\n }\n\n for (const row of rows) {\n if (ignoreUnselectable && this.isRowUnselectable(row)) {\n continue;\n }\n\n runInAction(() => {\n if (!value) {\n this.selectedIds.delete(this.dataSource!.idSelector!(row));\n } else if (this.selectedCount < this.selectionLimit) {\n this.selectedIds.add(this.dataSource!.idSelector!(row));\n }\n });\n\n // update children selection\n if (recursive && this.getDetailTableState) {\n const detail = this.getDetailTableState(row);\n\n if (detail?.selectableCount) {\n // eslint-disable-next-line no-await-in-loop\n await detail.setAllSelection(value);\n }\n }\n }\n\n // update parent selection\n if (this.parent) {\n if (this.isAllPageRowsSelected) {\n await this.parent.tableState.setRowsSelection([this.parent.row], true, {\n recursive: false,\n });\n } else {\n await this.parent.tableState.setRowsSelection([this.parent.row], false, {\n recursive: false,\n });\n }\n }\n\n runInAction(() => {\n this.selectedCount = this.selectedIds.size;\n this.data = this.data.slice();\n });\n }\n\n async selectPage(options?: SelectionOptions) {\n await this.setRowsSelection(this.originalData, true, options);\n }\n\n async deselectPage(options?: SelectionOptions) {\n await this.setRowsSelection(this.originalData, false, options);\n }\n\n private async setAllSelection(value: boolean, options?: SelectionOptions) {\n if (!this.dataSource) {\n return;\n }\n\n const filteredData = await this.dataSource.getData({\n filter: this.filter,\n });\n\n await this.setRowsSelection(filteredData.data as T[], value, options);\n }\n\n async selectAll(options?: SelectionOptions) {\n if (this.selectionLimit !== Infinity) {\n throw \"selectAll isn't supported for limited selection\";\n }\n\n await this.setAllSelection(true, options);\n }\n\n async deselectAll(options?: SelectionOptions) {\n await this.setAllSelection(false, options);\n }\n\n @action\n edit(row: T, field?: keyof T) {\n if (!this.dataSource) {\n return;\n }\n\n if (!this.dataSource.idSelector) {\n throw 'missing idSelector in the data source';\n }\n\n if (!this.getFormState) {\n throw 'missing getFormState';\n }\n\n this.inEdit.set(this.dataSource.idSelector(row), {\n form: this.getFormState(row),\n field,\n });\n\n this.data = this.data.slice();\n }\n\n @action\n async saveEdit(row: T, beforeSave?: (changed: T, field?: keyof T) => Promise<void>) {\n if (!this.dataSource) {\n return;\n }\n\n if (!this.dataSource.idSelector) {\n throw 'missing idSelector in the data source';\n }\n\n if (!this.dataSource.updateData) {\n throw 'missing updateData in the data source';\n }\n\n const id = this.dataSource.idSelector(row);\n const editingForm = this.inEdit.get(id);\n\n if (!editingForm) {\n return;\n }\n\n const { form, field } = editingForm;\n const changed = formStateToJS(form) as unknown as T; // FIXME: incompatible types\n if (beforeSave) {\n await beforeSave(changed, field);\n }\n\n await this.dataSource.updateData(id, changed);\n\n if (!this.alwaysEditable) {\n runInAction(() => {\n this.inEdit.delete(id);\n });\n }\n\n await this.fetchData();\n }\n\n @action\n cancelEdit(row: T) {\n if (!this.dataSource) {\n return;\n }\n\n if (!this.dataSource.idSelector) {\n throw 'missing idSelector in the data source';\n }\n\n if (this.alwaysEditable) {\n return;\n }\n\n this.inEdit.delete(this.dataSource.idSelector(row));\n\n this.data = this.data.slice();\n }\n\n async editAll() {\n if (!this.dataSource) {\n return;\n }\n\n if (!this.dataSource.idSelector) {\n throw 'missing idSelector in the data source';\n }\n\n if (!this.getFormState) {\n throw 'missing getFormState';\n }\n\n const rows = (\n await this.dataSource.getData({\n filter: this.filter,\n })\n ).data as T[];\n\n runInAction(() => {\n this.inEdit = new Map(\n rows.map<[TId, EditingForm<T>]>(row => [\n this.dataSource!.idSelector!(row),\n { form: this.getFormState!(row) },\n ])\n );\n\n this.data = this.data.slice();\n });\n }\n\n async saveEditAll(beforeSave?: (changed: T[]) => Promise<void>) {\n if (!this.dataSource) {\n return;\n }\n\n if (!this.dataSource.updateData) {\n throw 'missing updateData in the data source';\n }\n\n const changes = Array.from(this.inEdit).map(([id, { form }]) => ({\n id,\n changed: formStateToJS(form) as unknown as T, // FIXME: incompatible types\n }));\n\n if (beforeSave) {\n await beforeSave(changes.map(change => change.changed));\n }\n\n for (const { id, changed } of changes) {\n // eslint-disable-next-line no-await-in-loop\n await this.dataSource.updateData(id, changed);\n }\n\n if (!this.alwaysEditable) {\n runInAction(() => {\n this.inEdit = new Map();\n });\n }\n\n await this.fetchData();\n }\n\n @action\n cancelEditAll() {\n if (!this.dataSource) {\n return;\n }\n\n if (this.alwaysEditable) {\n return;\n }\n\n this.inEdit = new Map();\n\n this.data = this.data.slice();\n }\n\n @action reset() {\n this.totalCount = 0;\n this.filteredCount = 0;\n this.data = [];\n this.selectedCount = 0;\n this.selectedIds = new Set();\n this.inEdit = new Map();\n this.expandedIds = new Set();\n this.collapsedIds = new Set();\n this.collapsedGroups = new Set();\n this.sort = [];\n this.filter = undefined;\n this.aggregates = [];\n this.innerGroup = [];\n }\n\n @action\n async setDataSource(\n dataSource: DataSource<T, TId> | null,\n setDataSourceParams?: SetDataSourceParams<TId> | boolean\n ) {\n this.innerDataSource = dataSource;\n this.skip = 0;\n\n const reset =\n typeof setDataSourceParams === 'boolean'\n ? setDataSourceParams\n : setDataSourceParams?.reset;\n const config = setDataSourceParams as SetDataSourceParams<TId>;\n\n if (reset) {\n this.reset();\n }\n if (config?.initialState) {\n this.importState(config.initialState);\n }\n await this.fetchInitialData();\n\n if (this.alwaysEditable) {\n await this.editAll();\n }\n }\n\n @action\n private fetchInitialData = async () => {\n if (!this.dataSource) {\n return;\n }\n\n const initial = (await this.dataSource.getData({\n skip: this.skip,\n take: this.pageSize,\n filter: this.filter,\n sort: [...this.sort],\n group: [...this.group],\n })) as DataResult<Selectable<T>>;\n\n runInAction(() => {\n this.totalCount = initial.total;\n this.filteredCount = initial.total;\n this.updateExpandState(initial.data);\n this.data = initial.data;\n this.unselectableCount = this.originalData.filter(this.isRowUnselectable).length;\n\n this.addPropertiesToRows(this.data);\n });\n };\n\n private addPropertiesToRows(data: Data<Selectable<T>>) {\n this.traverse(\n data,\n item => {\n if (!this.dataSource) {\n return;\n }\n\n if (!this.dataSource.idSelector) {\n return;\n }\n\n if (!('selected' in item)) {\n Object.defineProperty(item, 'selected', {\n get: () => this.selectedIds.has(this.dataSource!.idSelector!(item)),\n });\n }\n\n if (!('indeterminate' in item)) {\n Object.defineProperty(item, 'indeterminate', {\n get: () => {\n const detail = this.getDetailTableState?.(item);\n\n if (!detail) {\n return false;\n }\n\n return detail.isSomePageRowsSelected;\n },\n });\n }\n\n if (!('inEdit' in item)) {\n Object.defineProperty(item, 'inEdit', {\n get: () => this.inEdit.has(this.dataSource!.idSelector!(item)),\n });\n }\n\n if (!('expanded' in item)) {\n Object.defineProperty(item, 'expanded', {\n get: () => this.expandedIds.has(this.dataSource!.idSelector!(item)),\n });\n }\n },\n (group, materializedPath) => {\n if (!('materializedPath' in group)) {\n Object.defineProperty(group, 'materializedPath', {\n get: () => materializedPath,\n });\n }\n\n if (!('expanded' in group)) {\n Object.defineProperty(group, 'expanded', {\n get: () =>\n !this.collapsedGroups.has(\n (group as Materialized<GroupResult<T>>).materializedPath\n ),\n });\n }\n }\n );\n }\n\n @action\n handleFilterChange = (ev: TableFilterChangeEvent) => {\n this.fetchData({\n newFilter: ev.filter,\n });\n };\n\n @action\n handleGroupChange = (ev: TableGroupChangeEvent) => {\n this.collapsedGroups = new Set();\n\n this.fetchData({\n newGroup: ev.group,\n });\n };\n\n @action\n handleExpandChange = ({ dataItem, value }: TableExpandChangeEvent) => {\n if (isGroupItem(dataItem, this.group)) {\n const { materializedPath } = dataItem as Materialized<GroupResult<T>>;\n if (value) {\n this.collapsedGroups.delete(materializedPath);\n } else {\n this.collapsedGroups.add(materializedPath);\n }\n } else {\n if (!this.dataSource) {\n return;\n }\n\n if (!this.dataSource.idSelector) {\n throw 'missing idSelector in the data source';\n }\n\n const id = this.dataSource.idSelector(dataItem);\n if (value) {\n this.expandedIds.add(id);\n this.collapsedIds.delete(id);\n } else {\n this.expandedIds.delete(id);\n this.collapsedIds.add(id);\n }\n }\n\n this.data = this.data.slice();\n };\n\n @action\n handleSortChange = (ev: TableSortChangeEvent) => {\n this.fetchData({\n newSort: ev.sort,\n });\n };\n\n @action\n handlePageChange = (ev: TablePageChangeEvent) => {\n if (this.pageSize !== ev.page.take) {\n this.pageSize = ev.page.take;\n this.skip = 0;\n } else if (this.skip === ev.page.skip) {\n return;\n }\n\n this.fetchData({\n newSkip: ev.page.skip,\n });\n };\n\n /** Call without params if unchanged */\n fetchData = async ({\n newSkip,\n newSort,\n newFilter,\n newAggregates,\n newGroup,\n }: FetchDataParams = {}) => {\n const sort = newSort ?? [...this.sort];\n const filter = newFilter === null ? undefined : (newFilter ?? this.filter);\n const aggregates = newAggregates ?? this.aggregates;\n const group = addAggregatesToGroups(newGroup ?? this.group, aggregates);\n const skip =\n newSort || newFilter !== undefined || newGroup\n ? 0\n : newSkip !== undefined\n ? newSkip\n : this.skip;\n\n if (!this.dataSource) {\n runInAction(() => {\n this.sort = sort;\n this.filter = filter;\n this.aggregates = aggregates;\n this.innerGroup = group;\n });\n\n return;\n }\n\n const newData = (await this.dataSource.getData({\n skip,\n sort,\n filter,\n group: [...group],\n take: this.pageSize,\n })) as DataResult<Selectable<T>>;\n\n runInAction(() => {\n if (!this.dataSource) {\n return;\n }\n\n if (newFilter !== undefined) {\n // When a new filter is applied, deselect items that don't match the filter\n if (this.dataSource.getFilteredPersistentItems) {\n // For persistent items, deselect everything in the persistent array that's been filtered out\n if (newFilter !== null && this.dataSource.idSelector) {\n let delta = 0;\n const filteredData = this.dataSource.getFilteredPersistentItems(\n newFilter\n ) as Expandable<Editable<Selectable<T>>>[];\n filteredData.forEach(dataItem => {\n const id = this.dataSource!.idSelector!(dataItem);\n if (this.selectedIds.delete(id)) {\n delta += 1;\n }\n\n if (!this.alwaysEditable) {\n this.inEdit.delete(id);\n }\n\n this.expandedIds.delete(id);\n });\n this.selectedCount -= delta;\n }\n } else {\n // For non-peristent items, everything is deselected by default\n this.selectedCount = 0;\n }\n }\n\n this.updateExpandState(newData.data);\n this.data = newData.data;\n this.filteredCount = newData.total;\n this.sort = sort;\n this.filter = filter;\n this.aggregates = aggregates;\n this.innerGroup = group;\n this.skip = skip;\n\n this.addPropertiesToRows(this.data);\n });\n };\n\n isRowSelectable = (row: Selectable<T>) =>\n !this.isRowUnselectable(row) &&\n (this.selectionLimit === Infinity ||\n row.selected ||\n this.selectedCount < this.selectionLimit);\n\n @action\n async toggleRowSelection(row: T, options?: SelectionOptions) {\n if (!this.dataSource) {\n return;\n }\n\n if (!this.dataSource.idSelector) {\n throw 'missing idSelector in the data source';\n }\n\n await this.setRowsSelection(\n [row],\n !this.selectedIds.has(this.dataSource.idSelector(row)),\n options\n );\n }\n\n @computed get isAllPageRowsSelected() {\n return (\n this.originalData.some(row => row.selected) &&\n this.originalData.every(row => this.isRowUnselectable(row) || row.selected)\n );\n }\n\n @computed get isSomePageRowsSelected() {\n return this.originalData.some(row => row.selected) && !this.isAllPageRowsSelected;\n }\n\n @computed get isAllRowsSelected() {\n if (!this.selectedIds.size) {\n return false;\n }\n\n return this.selectedIds.size === this.totalFilteredSelectableCount;\n }\n\n @computed get isSomeRowsSelected() {\n if (!this.selectedIds.size) {\n return false;\n }\n\n return !this.isAllRowsSelected;\n }\n\n setTablePdfExportRef = (el: TablePDFExport | null) => (this.tablePdfExport = el);\n setTableExcelExportRef = (el: ExcelExport | null) => (this.tableExcelExport = el);\n\n exportPdf = async () => {\n if (this.dataSource && this.tablePdfExport) {\n const { data } = await this.dataSource.getData({}); // fetch all data\n this.tablePdfExport.save(data);\n }\n };\n\n exportExcel = async (\n data?: any[] | ExcelExportData | WorkbookOptions,\n columns?: ExcelExportColumnProps[] | ReactElement<ExcelExportColumnProps>[]\n ) => {\n if (this.tableExcelExport) {\n this.tableExcelExport.save(\n data ?? (await this.filteredSortedUnpaginatedData()).data,\n columns\n );\n }\n };\n\n filteredSortedUnpaginatedData = () => {\n if (!this.dataSource) {\n throw 'missing dataSource';\n }\n return this.dataSource.getData({\n filter: this.filter,\n sort: [...this.sort],\n group: [...this.group],\n });\n };\n\n getRowsBetween = (start: Selectable<T>, end: Selectable<T>) => {\n const idSelector = this.dataSource?.idSelector;\n\n if (!idSelector) {\n return [];\n }\n\n let from: number | undefined, to: number | undefined;\n\n const startId = idSelector(start);\n const endId = idSelector(end);\n\n for (const [index, row] of this.originalData.entries()) {\n const id = idSelector(row);\n\n if (startId === id) {\n from = index;\n }\n\n if (endId === id) {\n to = index;\n }\n }\n\n if (from === undefined || to === undefined) {\n return [];\n }\n\n return this.originalData.slice(Math.min(from, to), Math.max(from, to) + 1);\n };\n\n exportState(): TableStateModel<TId> {\n return {\n skip: this.skip,\n selectedIds: Array.from(this.selectedIds),\n expandedIds: Array.from(this.expandedIds),\n collapsedGroups: Array.from(this.collapsedGroups),\n sort: this.sort,\n filter: this.filter,\n aggregates: this.aggregates,\n group: this.innerGroup,\n };\n }\n\n @action\n importState(data: TableStateModel<TId>) {\n this.skip = data.skip;\n this.selectedIds = new Set(data.selectedIds);\n this.expandedIds = new Set(data.expandedIds);\n this.collapsedGroups = new Set(data.collapsedGroups);\n this.sort = data.sort;\n this.filter = data.filter;\n this.aggregates = data.aggregates;\n this.innerGroup = data.group;\n }\n\n @action private updateExpandState(data: TableState<T, TId>['data']) {\n if (this.rowDetailsExpandState === 'expanded') {\n this.traverse(data, item => {\n const id = this.dataSource?.idSelector?.(item);\n\n if (id !== undefined && !this.collapsedIds.has(id)) {\n this.expandedIds.add(id);\n }\n });\n }\n }\n}\n"],"names":["action","computed","observable","runInAction","makeObservable","fromPromise","formStateToJS","isGroupItem","item","groups","field","some","g","addAggregatesToGroups","aggregates","map","group","TableState","dataSource","innerDataSource","traverse","items","itemCallback","groupCallback","materializedPath","groupMaterializedPath","value","originalData","result","data","push","unselectedCount","totalCount","selectedCount","selectableCount","unselectableCount","filteredUnselectableCount","filter","isRowUnselectable","length","filteredSelectableCount","totalFilteredSelectableCountPromise","Promise","resolve","reject","getData","then","filteredData","row","catch","totalFilteredSelectableCount","innerGroup","addToDataSource","select","index","addData","idSelector","selectedIds","add","alwaysEditable","edit","fetchData","removeFromDataSource","id","removeData","filteredCount","has","delete","inEdit","expandedIds","pageSize","skip","newSkip","setRowsSelection","rows","ignoreUnselectable","recursive","selectionLimit","getDetailTableState","detail","setAllSelection","parent","isAllPageRowsSelected","tableState","size","slice","selectPage","options","deselectPage","selectAll","Infinity","deselectAll","getFormState","set","form","saveEdit","beforeSave","updateData","editingForm","get","changed","cancelEdit","editAll","Map","saveEditAll","changes","Array","from","change","cancelEditAll","reset","Set","collapsedIds","collapsedGroups","sort","undefined","setDataSource","setDataSourceParams","config","initialState","importState","fetchInitialData","addPropertiesToRows","Object","defineProperty","isSomePageRowsSelected","toggleRowSelection","selected","every","isAllRowsSelected","isSomeRowsSelected","exportState","updateExpandState","rowDetailsExpandState","rowIdKey","tablePdfExport","tableExcelExport","initial","take","total","handleFilterChange","ev","newFilter","handleGroupChange","newGroup","handleExpandChange","dataItem","handleSortChange","newSort","handlePageChange","page","newAggregates","newData","getFilteredPersistentItems","delta","forEach","isRowSelectable","setTablePdfExportRef","el","setTableExcelExportRef","exportPdf","save","exportExcel","columns","filteredSortedUnpaginatedData","getRowsBetween","start","end","to","startId","endId","entries","Math","min","max"],"mappings":"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"}
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","constructor","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<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":";;;;;;;;;;;;;;;;;;;;;;;AAAA,SACIA,cAAc,EACdC,SAAS,EACTC,SAAS,EACTC,YAAY,EACZC,QAAQ,EACRC,QAAQ,QAML,QAAQ;AACf,SACIC,YAAY,EACZC,SAASC,UAAU,EAGnBC,WAAW,QAOR,8BAA8B;AACrC,SAASC,aAAaC,cAAc,QAAQ,mDAAmD;AAC/F,SAASC,iBAAiBC,cAAc,QAAQ,4BAA4B;AAC5E,SAASC,WAAW,QAAQ,qCAAqC;AACjE,SAASC,QAAQ,QAAQ,aAAa;AAGtC,SAASC,eAAe,QAAgB,2BAA2B;AAEnE,SAEIC,gBAAgB,EAChBC,gBAAgB,QACb,4BAA4B;AACnC,OAAOC,gBAAgB,cAAc;AAErC,OAAOC,gBAAgB,aAAa;AACpC,YAAYC,YAAY,qBAAqB;AAC7C,SAASC,MAAM,EAAEC,cAAc,EAAEC,UAAU,QAAQ,OAAO;AAC1D,SAASC,UAAU,QAAQ,uBAAuB;AAElD,MAAM,EAAEC,MAAMC,aAAa,EAAE,GAAGjB,WAAW,GAAGC;AAC9CD,UAAUgB,IAAI,GAAG;OACVC,cAAcC,MAAM,CAACC,CAAAA,IAAKA,EAAEC,QAAQ,KAAK,YAAYD,EAAEC,QAAQ,KAAK;CAC1E;AAED,SAASC,gBAKPC,OAAkB;IAChB,IAAI,eAAChC,eAAegC,UAAU;QAC1B,OAAO;IACX;IAEA,MAAMC,cAAc,AAACD,QAAyBE,IAAI;IAElD,OAAOD,gBAAgBxB,eAAe,AAACwB,YAAoBE,YAAY,KAAK1B;AAChF;AA2DA,OAAO,MAAMF,cAKHN;IA8DNmC,qBAAqB;QACjB,IAAI,CAACC,oBAAoB,GAAG,IAAI,CAACC,KAAK,CAACC,UAAU;QACjD,IAAI,CAACC,0BAA0B,GAAG,IAAI,CAACF,KAAK,CAACG,gBAAgB;QAC7D,IAAI,CAACC,uBAAuB,GAAG,IAAI,CAACJ,KAAK,CAACK,aAAa;IAC3D;IAkBAC,eACIC,QAAmB,EACnBC,WAEmD,EAC1C;QACT,OAAO1C,SAAS2C,GAAG,CAACF,UAAUG,CAAAA;YAC1B,IAAI,CAACjB,gBAAgCiB,QAAQ;gBACzC,OAAOA;YACX;YAEA,OAAOA,MAAMV,KAAK,CAACO,QAAQ,iBACrB1C,aAAa2C,YAAYE,QAAQ;gBAC7BH,UAAU,IAAI,CAACD,cAAc,CACzBI,MAAMV,KAAK,CAACO,QAAQ,EACpBC;YAER,KACAA,YAAYE;QACtB;IACJ;IAuEAC,SAAS;QACL,IACI,IAAI,CAACC,UAAU,CAACC,UAAU,YAAYnC,mBACtC,IAAI,CAACsB,KAAK,CAACC,UAAU,KAAK,aAC1B,IAAI,CAACD,KAAK,CAACc,UAAU,EACvB;YACE,qBACI,KAAC9C;gBACG+C,QAAO;gBACPC,OAAM;;QAGlB;QAEA,MAAMC,QAAQ,IAAI,CAACA,KAAK;QACxB,qBACI,MAAClD;;gBACIkD;gBACA,IAAI,CAACjB,KAAK,CAACkB,UAAU,kBAClB,MAACnD;;sCACG,MAACQ;4BACG4C,KAAK,IAAI,CAACP,UAAU,CAACQ,oBAAoB;4BACzCC,UAAUC,uBAAuB,IAAI,CAACtB,KAAK,CAACuB,cAAc;;gCAEzD,IAAI,CAACvB,KAAK,CAACO,QAAQ;gCACnBU;;;sCAEL,KAACzC;4BACG2C,KAAK,IAAI,CAACP,UAAU,CAACY,sBAAsB;4BAC3CH,UAAUC,uBAAuB,IAAI,CAACtB,KAAK,CAACuB,cAAc;sCAEzD,IAAI,CAACvB,KAAK,CAACO,QAAQ;;;;;;IAM5C;IAEQkB,cAAc;QAClB,IAAI,IAAI,CAACzB,KAAK,CAACC,UAAU,KAAK,aAAa,CAAC,IAAI,CAACW,UAAU,CAACc,QAAQ,EAAE;YAClE,OAAO;QACX;YAEO;QAAP,OAAO,CAAA,oBAAA,IAAI,CAAC1B,KAAK,CAAC2B,KAAK,cAAhB,+BAAA,oBAAoB;IAC/B;IAzKA,YAAY3B,KAAiC,CAAE;QAC3C,KAAK,CAACA,QAnDV,uBAAYD,wBAAZ,KAAA,IACA,uBAAYG,8BAAZ,KAAA,IACA,uBAAYE,2BAAZ,KAAA,IACA,uBAAYwB,wBAAZ,KAAA,IAEA,uBAAQhB,cAAa,IAAI,CAACZ,KAAK,CAACY,UAAU,GAE1C,uBAAQO,qBAAMvD,cAEd,uBAAQiE,iBAAR,KAAA,IAEA,uBAAQC,oBAA4CrD,SAAS,CAACuB,sBAC1D,KAACrB;gBACI,GAAGqB,KAAK;gBACT+B,iBAAiB,IAAI,CAACnB,UAAU,CAACmB,eAAe,CAAC/B,MAAMgC,QAAQ;gBAC/DC,SAAS,IAAI,CAAC/B,0BAA0B;kBAIhD,uBAAQgC,iBAAgB,IAAIC,QAE5B,uBAAQC,oBAA6C3D,SAAS,CAACuB;YAC3D,IAAI,IAAI,CAACI,uBAAuB,IAAI,IAAI,CAACQ,UAAU,CAACyB,cAAc,KAAKC,UAAU;gBAC7E,OAAO;YACX;YAEA,qBACI,KAAC1D;gBACI,GAAGoB,KAAK;gBACTuC,oBACI,IAAI,CAACxC,oBAAoB,KAAK,YACxB,IAAI,CAACa,UAAU,CAAC4B,sBAAsB,GACtC,IAAI,CAAC5B,UAAU,CAAC2B,kBAAkB;gBAE5CN,SAAS,IAAI,CAAC/B,0BAA0B;;QAGpD,KAEA,wDAAwD;QACxD,uBAAQuC,sBAAqB5D,WAAW,CAAC0B,WACrC,IAAI,CAACD,cAAc,CAACC,UAAUmC,CAAAA;gBAC1B,MAAM,EAAEC,MAAMC,IAAI,EAAEC,KAAK,EAAE,GAAGH,OAAO1C,KAAK;gBAE1C,qBAAOnC,aAAa6E,QAAQ;oBACxBC,MAAM,IAAI,CAACG,sCAAsC,CAACF,MAAMC;gBAC5D;YACJ,MAoBJE,uBAAAA,aAAY,CAACC,KAAmBC;YAC5B,MAAMC,YAA8B,CAAC;YAErC,IACI,IAAI,CAAClD,KAAK,CAACc,UAAU,IACrBmC,SAASE,OAAO,KAAK,UACrB,CAAC,IAAI,CAACvC,UAAU,CAACmB,eAAe,CAACkB,SAASjB,QAAQ,GACpD;gBACEkB,UAAUE,SAAS,GAAGtE,WAAWkE,IAAIhD,KAAK,CAACoD,SAAS,EAAErE,OAAOsE,QAAQ;YACzE;YAEA,MAAMC,SAASC,OAAOC,IAAI,CAACN,WAAWO,MAAM,iBAAG5F,aAAamF,KAAKE,aAAaF;YAE9E,OAAO,IAAI,CAAChD,KAAK,CAAC+C,SAAS,GAAG,IAAI,CAAC/C,KAAK,CAAC+C,SAAS,CAACO,QAAQL,YAAYK;QAC3E,IAwBAI,uBAAAA,+BAA8B,CAACC;YAC3B,MAAMC,UAAUD,GAAGE,cAAc,CAACC,aAAa,CAACF,OAAO;YAEvD,IAAI,IAAI,CAAC7D,oBAAoB,KAAK,WAAW;gBACzC,IAAI6D,SAAS;oBACT,IAAI,CAAChD,UAAU,CAACmD,UAAU;gBAC9B,OAAO;oBACH,IAAI,CAACnD,UAAU,CAACoD,YAAY;gBAChC;YACJ,OAAO;gBACH,IAAIJ,SAAS;oBACT,IAAI,CAAChD,UAAU,CAACqD,SAAS;gBAC7B,OAAO;oBACH,IAAI,CAACrD,UAAU,CAACsD,WAAW;gBAC/B;YACJ;QACJ,IAEAC,uBAAAA,yBAAwB,CAACR;YACrB,IAAI,CAACA,GAAG3B,QAAQ,EAAE;gBACd;YACJ;YACA,IAAI2B,GAAGS,WAAW,CAACC,QAAQ,IAAI,IAAI,CAACxC,aAAa,EAAE;oBAK3C,wCAAA,6BACA,yCAAA;gBALJ,MAAMyC,OAAO,IAAI,CAAC1D,UAAU,CACvB2D,cAAc,CAAC,IAAI,CAAC1C,aAAa,EAAE8B,GAAG3B,QAAQ,EAC9C1C,MAAM,CAAC0D,CAAAA,MAAO,IAAI,CAACpC,UAAU,CAACmB,eAAe,CAACiB;gBACnD,MAAMwB,QACF,EAAA,8BAAA,IAAI,CAAC5D,UAAU,CAACC,UAAU,cAA1B,mDAAA,yCAAA,4BAA4B4D,UAAU,cAAtC,6DAAA,4CAAA,6BAAyC,IAAI,CAAC5C,aAAa,SAC3D,+BAAA,IAAI,CAACjB,UAAU,CAACC,UAAU,cAA1B,oDAAA,0CAAA,6BAA4B4D,UAAU,cAAtC,8DAAA,6CAAA,8BAAyCH,IAAI,CAAC,EAAE;gBACpD,MAAMI,YAAY,CAACf,GAAG3B,QAAQ,CAAC2C,QAAQ;gBAEvC,IAAID,WAAW;oBACX,MAAME,eAAgC,EAAE;oBACxC,KAAK,MAAM5B,OAAOwB,QAAQF,OAAOA,KAAKO,OAAO,GAAI;wBAC7C,IACI,IAAI,CAACjE,UAAU,CAACkE,aAAa,GAAGF,aAAanB,MAAM,IACnD,IAAI,CAAC7C,UAAU,CAACyB,cAAc,EAChC;4BACE;wBACJ;wBAEA,IAAIW,IAAI2B,QAAQ,EAAE;4BACd;wBACJ;wBAEAC,aAAaG,IAAI,CAAC/B;oBACtB;oBAEA,IAAI,CAACpC,UAAU,CAACoE,gBAAgB,CAACJ,cAAcF;gBACnD,OAAO;oBACH,IAAI,CAAC9D,UAAU,CAACoE,gBAAgB,CAACV,MAAMI;gBAC3C;YACJ,OAAO;gBACH,IAAI,CAAC9D,UAAU,CAACqE,kBAAkB,CAACtB,GAAG3B,QAAQ;YAClD;YAEA,IAAI,CAACH,aAAa,GAAG8B,GAAG3B,QAAQ;QACpC,IAEAkD,uBAAAA,kBAAiB;YACb,IAAI,IAAI,CAAC/D,GAAG,CAACgE,OAAO,EAAE;gBAClB,MAAMC,YAAY,IAAI,CAACjE,GAAG,CAACgE,OAAO,CAACE,sBAAsB,CACrD,iBACH,CAAC,EAAE;gBACJD,UAAUE,SAAS,GAAGF,UAAUG,YAAY,GAAGH,UAAUI,YAAY,GAAG;gBACxEJ,UAAUK,MAAM,CAAC;oBAAEC,KAAKN,UAAUG,YAAY;oBAAEI,UAAU;gBAAS;YACvE;QACJ,IAiDA,uBAAQ1E,SAAQ;YACZ,MAAM,EAAEmC,SAAS,EAAEwC,eAAe,EAAE9E,UAAU,EAAEa,KAAK,EAAE,GAAG3B,OAAO,GAAG,IAAI,CAACA,KAAK;YAE9E,qBACI,MAAC9B;gBACGiD,KAAK,IAAI,CAACA,GAAG;gBACZ,GAAGnB,KAAK;gBACT6F,aAAa,IAAI,CAACjF,UAAU,CAACkF,QAAQ;gBACrCC,MAAM;uBAAI,IAAI,CAACnF,UAAU,CAACmF,IAAI;iBAAC;gBAC/BhD,WAAW,IAAI,CAACA,SAAS;gBACzBiD,WAAU;gBACV1G,QAAQ,IAAI,CAACsB,UAAU,CAACtB,MAAM;gBAC9BsG,iBAAiBA,4BAAAA,6BAAAA,kBAAmBxH;gBACpC6H,gBAAgB,IAAI,CAACrF,UAAU,CAACsF,kBAAkB;gBAClDC,OAAO;uBAAI,IAAI,CAACvF,UAAU,CAACuF,KAAK;iBAAC;gBACjCC,eAAe,IAAI,CAACxF,UAAU,CAACyF,iBAAiB;gBAChDC,gBAAgB,IAAI,CAAC1F,UAAU,CAAC2F,kBAAkB;gBAClDC,aAAY;gBACZC,MAAM;uBAAI,IAAI,CAAC7F,UAAU,CAAC6F,IAAI;iBAAC;gBAC/BC,cAAc,IAAI,CAAC9F,UAAU,CAAC+F,gBAAgB;gBAC9CC,yBAAyB,IAAI,CAAClD,2BAA2B;gBACzDmD,mBAAmB,IAAI,CAAC1C,qBAAqB;gBAC7C2C,eAAc;gBACdC,UAAU,IAAI,CAACtF,WAAW;gBAC1BC,UAAU,IAAI,CAACd,UAAU,CAACc,QAAQ;gBAClCsF,MAAM,IAAI,CAACpG,UAAU,CAACoG,IAAI;gBAC1BC,cAAc,IAAI,CAACrG,UAAU,CAACsG,gBAAgB;gBAC9CC,OAAO,IAAI,CAACvG,UAAU,CAACwG,aAAa;gBACpChE,WAAWtE,WAAWC,OAAOkC,KAAK,EAAEmC;gBACpCtC,YAAY;oBAAEuG,SAASvG;oBAAYwG,MAAM;gBAAW;;oBAEnDxG,4BACG,KAAC3C;wBACGoJ,MAAM;wBACN1E,OAAM;wBACN2E,IAAG;wBACHC,OAAM;wBACNC,YAAY;wBACZC,WAAW;wBACXC,aAAa;wBACbC,sBACI7H,MAAMC,UAAU,KAAK,YACf,IAAI,CAACW,UAAU,CAACkH,qBAAqB,GACrC,IAAI,CAAClH,UAAU,CAACmH,iBAAiB;wBAE3CC,YAAY,IAAI,CAAC5F,gBAAgB;wBACjCO,MAAM,IAAI,CAACb,gBAAgB;wBAC3BmG,iBAAgB;wBAChB7E,WAAWtE,WAAWC,OAAOmJ,YAAY,EAAE,UAAU;;oBAG5D,IAAI,CAACzF,kBAAkB,CAACzC,MAAMO,QAAQ;;;QAGnD,IAEA,uBAAQuC,0CAAyC,CAC7CF,MACAC;YAEA,IAAI,CAACD,MAAM;gBACP,OAAOuF;YACX;YAEA,MAAMC,qBAAyD,CAC3DpI;gBAEA,MAAMqI,UAAUlJ,WAAWa;gBAC3B,qBAAO,KAAC4C;oBAAM,GAAG5C,KAAK;oBAAEY,YAAY,IAAI,CAACA,UAAU;oBAAEyH,SAASA;;YAClE;YACAD,mBAAmBE,WAAW,GAAG;YAEjC,IAAIzF,OAAO;gBACP,IAAI,IAAI,CAACX,aAAa,CAACqG,GAAG,CAAC1F,QAAQ;oBAC/B,OAAO,IAAI,CAACX,aAAa,CAACsG,GAAG,CAAC3F;gBAClC;gBACA,IAAI,CAACX,aAAa,CAACuG,GAAG,CAAC5F,OAAOuF;YAClC;YACA,OAAOA;QACX;QAvPInJ,eAAe,IAAI;QAEnB,IAAI,CAACc,oBAAoB,GAAG,IAAI,CAACC,KAAK,CAACC,UAAU;QACjD,IAAI,CAACC,0BAA0B,GAAG,IAAI,CAACF,KAAK,CAACG,gBAAgB;QAC7D,IAAI,CAACC,uBAAuB,GAAG,IAAI,CAACJ,KAAK,CAACK,aAAa;IAC3D;AAmPJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,MAAMiB,yBAAyBzC,WAAW,CAACwC,WACvCA,qBAAAA,+BAAAA,SAAUqH,OAAO,CAAC,QAAQ"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/use-observing-table-state/demo/stores/use-observing-table-state-demo.store.ts"],"sourcesContent":["import { injectable } from '@servicetitan/react-ioc';\nimport { action, makeObservable, observable } from 'mobx';\n\nimport { products } from '../../../demo/overview/products';\n\nconst getRandomPrice = () => Math.round(Math.random() * 10000) / 100;\n\n@injectable()\nexport class UseObservingTableStateDemoStore {\n @observable data = products.map(p => ({\n ProductID: p.ProductID,\n ProductName: p.ProductName,\n UnitPrice: p.UnitPrice,\n }));\n\n constructor() {\n makeObservable(this);\n }\n\n @action\n updateDataKeepRoot = () => {\n this.data.forEach(p => (p.UnitPrice = getRandomPrice()));\n };\n\n @action\n updateDataChangeRoot = () => {\n this.data = this.data.map(p => ({\n ...p,\n UnitPrice: getRandomPrice(),\n }));\n };\n\n @action\n add5RowsWithUpdateDataRoot = () => {\n this.data = [\n ...this.data,\n ...Array.from({ length: 5 }).map((v, i) => ({\n ProductID: this.data.length + i + 1,\n ProductName: `Product ${this.data.length + i + 1}`,\n UnitPrice: getRandomPrice(),\n })),\n ];\n };\n @action\n remove5RowsWithUpdateDataRoot = () => {\n if (this.data.length >= 5) {\n this.data = this.data.slice(0, this.data.length - 5);\n }\n };\n\n @action\n add5RowsWithKeepDataRoot = () => {\n const length = this.data.length;\n for (let i = this.data.length; i < length + 5; ++i) {\n this.data.push({\n ProductID: i,\n ProductName: `Product ${i}`,\n UnitPrice: getRandomPrice(),\n });\n }\n };\n\n @action\n remove5RowsWithKeepDataRoot = () => {\n if (this.data.length >= 5) {\n this.data.splice(this.data.length - 5, 5);\n }\n };\n}\n"],"names":["injectable","action","makeObservable","observable","products","getRandomPrice","Math","round","random","UseObservingTableStateDemoStore","constructor","data","map","p","ProductID","ProductName","UnitPrice","updateDataKeepRoot","forEach","updateDataChangeRoot","add5RowsWithUpdateDataRoot","Array","from","length","v","i","remove5RowsWithUpdateDataRoot","slice","add5RowsWithKeepDataRoot","push","remove5RowsWithKeepDataRoot","splice"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,SAASA,UAAU,QAAQ,0BAA0B;AACrD,SAASC,MAAM,EAAEC,cAAc,EAAEC,UAAU,QAAQ,OAAO;AAE1D,SAASC,QAAQ,QAAQ,kCAAkC;AAE3D,MAAMC,iBAAiB,IAAMC,KAAKC,KAAK,CAACD,KAAKE,MAAM,KAAK,SAAS;AAGjE,OAAO,MAAMC;IAOTC,aAAc;QANd,uBAAYC,QAAOP,SAASQ,GAAG,CAACC,CAAAA,IAAM,CAAA;gBAClCC,WAAWD,EAAEC,SAAS;gBACtBC,aAAaF,EAAEE,WAAW;gBAC1BC,WAAWH,EAAEG,SAAS;YAC1B,CAAA;QAMA,uBACAC,sBAAqB;YACjB,IAAI,CAACN,IAAI,CAACO,OAAO,CAACL,CAAAA,IAAMA,EAAEG,SAAS,GAAGX;QAC1C;QAEA,uBACAc,wBAAuB;YACnB,IAAI,CAACR,IAAI,GAAG,IAAI,CAACA,IAAI,CAACC,GAAG,CAACC,CAAAA,IAAM,CAAA;oBAC5B,GAAGA,CAAC;oBACJG,WAAWX;gBACf,CAAA;QACJ;QAEA,uBACAe,8BAA6B;YACzB,IAAI,CAACT,IAAI,GAAG;mBACL,IAAI,CAACA,IAAI;mBACTU,MAAMC,IAAI,CAAC;oBAAEC,QAAQ;gBAAE,GAAGX,GAAG,CAAC,CAACY,GAAGC,IAAO,CAAA;wBACxCX,WAAW,IAAI,CAACH,IAAI,CAACY,MAAM,GAAGE,IAAI;wBAClCV,aAAa,CAAC,QAAQ,EAAE,IAAI,CAACJ,IAAI,CAACY,MAAM,GAAGE,IAAI,GAAG;wBAClDT,WAAWX;oBACf,CAAA;aACH;QACL;QACA,uBACAqB,iCAAgC;YAC5B,IAAI,IAAI,CAACf,IAAI,CAACY,MAAM,IAAI,GAAG;gBACvB,IAAI,CAACZ,IAAI,GAAG,IAAI,CAACA,IAAI,CAACgB,KAAK,CAAC,GAAG,IAAI,CAAChB,IAAI,CAACY,MAAM,GAAG;YACtD;QACJ;QAEA,uBACAK,4BAA2B;YACvB,MAAML,SAAS,IAAI,CAACZ,IAAI,CAACY,MAAM;YAC/B,IAAK,IAAIE,IAAI,IAAI,CAACd,IAAI,CAACY,MAAM,EAAEE,IAAIF,SAAS,GAAG,EAAEE,EAAG;gBAChD,IAAI,CAACd,IAAI,CAACkB,IAAI,CAAC;oBACXf,WAAWW;oBACXV,aAAa,CAAC,QAAQ,EAAEU,GAAG;oBAC3BT,WAAWX;gBACf;YACJ;QACJ;QAEA,uBACAyB,+BAA8B;YAC1B,IAAI,IAAI,CAACnB,IAAI,CAACY,MAAM,IAAI,GAAG;gBACvB,IAAI,CAACZ,IAAI,CAACoB,MAAM,CAAC,IAAI,CAACpB,IAAI,CAACY,MAAM,GAAG,GAAG;YAC3C;QACJ;QAnDIrB,eAAe,IAAI;IACvB;AAmDJ"}
1
+ {"version":3,"sources":["../../../../src/use-observing-table-state/demo/stores/use-observing-table-state-demo.store.ts"],"sourcesContent":["import { injectable } from '@servicetitan/react-ioc';\nimport { action, makeObservable, observable } from 'mobx';\n\nimport { products } from '../../../demo/overview/products';\n\nconst getRandomPrice = () => Math.round(Math.random() * 10000) / 100;\n\n@injectable()\nexport class UseObservingTableStateDemoStore {\n @observable data = products.map(p => ({\n ProductID: p.ProductID,\n ProductName: p.ProductName,\n UnitPrice: p.UnitPrice,\n }));\n\n constructor() {\n makeObservable(this);\n }\n\n @action\n updateDataKeepRoot = () => {\n this.data.forEach(p => (p.UnitPrice = getRandomPrice()));\n };\n\n @action\n updateDataChangeRoot = () => {\n this.data = this.data.map(p => ({\n ...p,\n UnitPrice: getRandomPrice(),\n }));\n };\n\n @action\n add5RowsWithUpdateDataRoot = () => {\n this.data = [\n ...this.data,\n ...Array.from({ length: 5 }).map((v, i) => ({\n ProductID: this.data.length + i + 1,\n ProductName: `Product ${this.data.length + i + 1}`,\n UnitPrice: getRandomPrice(),\n })),\n ];\n };\n @action\n remove5RowsWithUpdateDataRoot = () => {\n if (this.data.length >= 5) {\n this.data = this.data.slice(0, this.data.length - 5);\n }\n };\n\n @action\n add5RowsWithKeepDataRoot = () => {\n const length = this.data.length;\n for (let i = this.data.length; i < length + 5; ++i) {\n this.data.push({\n ProductID: i,\n ProductName: `Product ${i}`,\n UnitPrice: getRandomPrice(),\n });\n }\n };\n\n @action\n remove5RowsWithKeepDataRoot = () => {\n if (this.data.length >= 5) {\n this.data.splice(this.data.length - 5, 5);\n }\n };\n}\n"],"names":["injectable","action","makeObservable","observable","products","getRandomPrice","Math","round","random","UseObservingTableStateDemoStore","data","map","p","ProductID","ProductName","UnitPrice","updateDataKeepRoot","forEach","updateDataChangeRoot","add5RowsWithUpdateDataRoot","Array","from","length","v","i","remove5RowsWithUpdateDataRoot","slice","add5RowsWithKeepDataRoot","push","remove5RowsWithKeepDataRoot","splice"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,SAASA,UAAU,QAAQ,0BAA0B;AACrD,SAASC,MAAM,EAAEC,cAAc,EAAEC,UAAU,QAAQ,OAAO;AAE1D,SAASC,QAAQ,QAAQ,kCAAkC;AAE3D,MAAMC,iBAAiB,IAAMC,KAAKC,KAAK,CAACD,KAAKE,MAAM,KAAK,SAAS;AAGjE,OAAO,MAAMC;IAOT,aAAc;QANd,uBAAYC,QAAON,SAASO,GAAG,CAACC,CAAAA,IAAM,CAAA;gBAClCC,WAAWD,EAAEC,SAAS;gBACtBC,aAAaF,EAAEE,WAAW;gBAC1BC,WAAWH,EAAEG,SAAS;YAC1B,CAAA;QAMA,uBACAC,sBAAqB;YACjB,IAAI,CAACN,IAAI,CAACO,OAAO,CAACL,CAAAA,IAAMA,EAAEG,SAAS,GAAGV;QAC1C;QAEA,uBACAa,wBAAuB;YACnB,IAAI,CAACR,IAAI,GAAG,IAAI,CAACA,IAAI,CAACC,GAAG,CAACC,CAAAA,IAAM,CAAA;oBAC5B,GAAGA,CAAC;oBACJG,WAAWV;gBACf,CAAA;QACJ;QAEA,uBACAc,8BAA6B;YACzB,IAAI,CAACT,IAAI,GAAG;mBACL,IAAI,CAACA,IAAI;mBACTU,MAAMC,IAAI,CAAC;oBAAEC,QAAQ;gBAAE,GAAGX,GAAG,CAAC,CAACY,GAAGC,IAAO,CAAA;wBACxCX,WAAW,IAAI,CAACH,IAAI,CAACY,MAAM,GAAGE,IAAI;wBAClCV,aAAa,CAAC,QAAQ,EAAE,IAAI,CAACJ,IAAI,CAACY,MAAM,GAAGE,IAAI,GAAG;wBAClDT,WAAWV;oBACf,CAAA;aACH;QACL;QACA,uBACAoB,iCAAgC;YAC5B,IAAI,IAAI,CAACf,IAAI,CAACY,MAAM,IAAI,GAAG;gBACvB,IAAI,CAACZ,IAAI,GAAG,IAAI,CAACA,IAAI,CAACgB,KAAK,CAAC,GAAG,IAAI,CAAChB,IAAI,CAACY,MAAM,GAAG;YACtD;QACJ;QAEA,uBACAK,4BAA2B;YACvB,MAAML,SAAS,IAAI,CAACZ,IAAI,CAACY,MAAM;YAC/B,IAAK,IAAIE,IAAI,IAAI,CAACd,IAAI,CAACY,MAAM,EAAEE,IAAIF,SAAS,GAAG,EAAEE,EAAG;gBAChD,IAAI,CAACd,IAAI,CAACkB,IAAI,CAAC;oBACXf,WAAWW;oBACXV,aAAa,CAAC,QAAQ,EAAEU,GAAG;oBAC3BT,WAAWV;gBACf;YACJ;QACJ;QAEA,uBACAwB,+BAA8B;YAC1B,IAAI,IAAI,CAACnB,IAAI,CAACY,MAAM,IAAI,GAAG;gBACvB,IAAI,CAACZ,IAAI,CAACoB,MAAM,CAAC,IAAI,CAACpB,IAAI,CAACY,MAAM,GAAG,GAAG;YAC3C;QACJ;QAnDIpB,eAAe,IAAI;IACvB;AAmDJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/table",
3
- "version": "32.3.0",
3
+ "version": "32.4.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": "^5.0.1",
21
+ "@servicetitan/react-hooks": "^5.1.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": "^32.3.0",
32
+ "@servicetitan/data-query": "^32.4.0",
33
33
  "@servicetitan/design-system": "~14.5.1",
34
- "@servicetitan/form": "^32.3.0",
35
- "@servicetitan/react-ioc": "^31.3.2",
36
- "@servicetitan/suppress-warnings": "^31.3.2",
34
+ "@servicetitan/form": "^32.4.0",
35
+ "@servicetitan/react-ioc": "^31.6.0",
36
+ "@servicetitan/suppress-warnings": "^31.6.0",
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": "^32.3.0",
54
+ "@servicetitan/data-query": "^32.4.0",
55
55
  "@servicetitan/design-system": ">=13.2.1",
56
- "@servicetitan/form": "^32.3.0",
56
+ "@servicetitan/form": "^32.4.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": "948549f6eedb039a353ac4fc3ec1b90eee4d0321"
73
+ "gitHead": "3dab3310534a39aaacb0069e1d377579fe0a7fab"
74
74
  }