@servicetitan/form-state 32.3.0 → 32.4.1

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/async-lazy-dropdown-state/async-lazy-dropdown-state.ts"],"sourcesContent":["import { computed, makeObservable } from 'mobx';\nimport { AsyncDataSource } from '@servicetitan/data-query';\nimport { AnvilSelectOptionsProps, AnvilSelectPropsStrict } from '@servicetitan/design-system';\nimport { DropdownOption, DropdownState } from '../dropdown-state';\n\nexport type DataFetcher = (searchQuery: string) => Promise<DropdownOption<any>[]>;\n\nexport class AsyncLazyDropdownState<T extends DropdownOption<any>> extends DropdownState<T> {\n private arrayValue: AnvilSelectOptionsProps[] = [];\n\n constructor(dataFetcher: DataFetcher) {\n super({\n dataSource: new AsyncDataSource({\n get: async () => {\n const result: any[] = await dataFetcher(this.search);\n\n return {\n data: result,\n total: result.length,\n };\n },\n }),\n lazy: true,\n });\n\n makeObservable(this);\n }\n\n @computed\n get optionsWithValue() {\n return this.getOptionsWithValue();\n }\n\n onChange = (value: AnvilSelectPropsStrict['value']) => {\n const isEmptyValue = value === undefined || (Array.isArray(value) && value.length === 0);\n\n this.arrayValue = isEmptyValue ? [] : !Array.isArray(value) ? [value!] : value;\n };\n\n setDataFetcher(dataFetcher: DataFetcher) {\n this.setDataSource(\n new AsyncDataSource({\n get: async () => {\n const result: any[] = await dataFetcher(this.search);\n\n return {\n data: result,\n total: result.length,\n };\n },\n })\n );\n }\n\n private getOptionsWithValue = () => {\n const options = [...this.options];\n\n if (!this.search) {\n const values = this.arrayValue;\n\n const selectedOptions = options.filter(\n option => !!values.find(value => value.value === option.value)\n );\n\n const unselectedOptions = options.filter(\n option => !values.find(value => value.value === option.value)\n );\n\n const missingSelectedOptions = values.filter(\n value => !options.some(option => option.value === value.value)\n );\n return [...missingSelectedOptions, ...selectedOptions, ...unselectedOptions];\n }\n\n return options;\n };\n}\n"],"names":["computed","makeObservable","AsyncDataSource","DropdownState","AsyncLazyDropdownState","optionsWithValue","getOptionsWithValue","setDataFetcher","dataFetcher","setDataSource","get","result","search","data","total","length","constructor","dataSource","lazy","arrayValue","onChange","value","isEmptyValue","undefined","Array","isArray","options","values","selectedOptions","filter","option","find","unselectedOptions","missingSelectedOptions","some"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,SAASA,QAAQ,EAAEC,cAAc,QAAQ,OAAO;AAChD,SAASC,eAAe,QAAQ,2BAA2B;AAE3D,SAAyBC,aAAa,QAAQ,oBAAoB;AAIlE,OAAO,MAAMC,+BAA8DD;IAqBvE,IACIE,mBAAmB;QACnB,OAAO,IAAI,CAACC,mBAAmB;IACnC;IAQAC,eAAeC,WAAwB,EAAE;QACrC,IAAI,CAACC,aAAa,CACd,IAAIP,gBAAgB;YAChBQ,KAAK;gBACD,MAAMC,SAAgB,MAAMH,YAAY,IAAI,CAACI,MAAM;gBAEnD,OAAO;oBACHC,MAAMF;oBACNG,OAAOH,OAAOI,MAAM;gBACxB;YACJ;QACJ;IAER;IA1CAC,YAAYR,WAAwB,CAAE;QAClC,KAAK,CAAC;YACFS,YAAY,IAAIf,gBAAgB;gBAC5BQ,KAAK;oBACD,MAAMC,SAAgB,MAAMH,YAAY,IAAI,CAACI,MAAM;oBAEnD,OAAO;wBACHC,MAAMF;wBACNG,OAAOH,OAAOI,MAAM;oBACxB;gBACJ;YACJ;YACAG,MAAM;QACV,IAfJ,uBAAQC,cAAwC,EAAE,GAyBlDC,uBAAAA,YAAW,CAACC;YACR,MAAMC,eAAeD,UAAUE,aAAcC,MAAMC,OAAO,CAACJ,UAAUA,MAAMN,MAAM,KAAK;YAEtF,IAAI,CAACI,UAAU,GAAGG,eAAe,EAAE,GAAG,CAACE,MAAMC,OAAO,CAACJ,SAAS;gBAACA;aAAO,GAAGA;QAC7E,IAiBA,uBAAQf,uBAAsB;YAC1B,MAAMoB,UAAU;mBAAI,IAAI,CAACA,OAAO;aAAC;YAEjC,IAAI,CAAC,IAAI,CAACd,MAAM,EAAE;gBACd,MAAMe,SAAS,IAAI,CAACR,UAAU;gBAE9B,MAAMS,kBAAkBF,QAAQG,MAAM,CAClCC,CAAAA,SAAU,CAAC,CAACH,OAAOI,IAAI,CAACV,CAAAA,QAASA,MAAMA,KAAK,KAAKS,OAAOT,KAAK;gBAGjE,MAAMW,oBAAoBN,QAAQG,MAAM,CACpCC,CAAAA,SAAU,CAACH,OAAOI,IAAI,CAACV,CAAAA,QAASA,MAAMA,KAAK,KAAKS,OAAOT,KAAK;gBAGhE,MAAMY,yBAAyBN,OAAOE,MAAM,CACxCR,CAAAA,QAAS,CAACK,QAAQQ,IAAI,CAACJ,CAAAA,SAAUA,OAAOT,KAAK,KAAKA,MAAMA,KAAK;gBAEjE,OAAO;uBAAIY;uBAA2BL;uBAAoBI;iBAAkB;YAChF;YAEA,OAAON;QACX;QAlDIzB,eAAe,IAAI;IACvB;AAkDJ"}
1
+ {"version":3,"sources":["../../src/async-lazy-dropdown-state/async-lazy-dropdown-state.ts"],"sourcesContent":["import { computed, makeObservable } from 'mobx';\nimport { AsyncDataSource } from '@servicetitan/data-query';\nimport { AnvilSelectOptionsProps, AnvilSelectPropsStrict } from '@servicetitan/design-system';\nimport { DropdownOption, DropdownState } from '../dropdown-state';\n\nexport type DataFetcher = (searchQuery: string) => Promise<DropdownOption<any>[]>;\n\nexport class AsyncLazyDropdownState<T extends DropdownOption<any>> extends DropdownState<T> {\n private arrayValue: AnvilSelectOptionsProps[] = [];\n\n constructor(dataFetcher: DataFetcher) {\n super({\n dataSource: new AsyncDataSource({\n get: async () => {\n const result: any[] = await dataFetcher(this.search);\n\n return {\n data: result,\n total: result.length,\n };\n },\n }),\n lazy: true,\n });\n\n makeObservable(this);\n }\n\n @computed\n get optionsWithValue() {\n return this.getOptionsWithValue();\n }\n\n onChange = (value: AnvilSelectPropsStrict['value']) => {\n const isEmptyValue = value === undefined || (Array.isArray(value) && value.length === 0);\n\n this.arrayValue = isEmptyValue ? [] : !Array.isArray(value) ? [value!] : value;\n };\n\n setDataFetcher(dataFetcher: DataFetcher) {\n this.setDataSource(\n new AsyncDataSource({\n get: async () => {\n const result: any[] = await dataFetcher(this.search);\n\n return {\n data: result,\n total: result.length,\n };\n },\n })\n );\n }\n\n private getOptionsWithValue = () => {\n const options = [...this.options];\n\n if (!this.search) {\n const values = this.arrayValue;\n\n const selectedOptions = options.filter(\n option => !!values.find(value => value.value === option.value)\n );\n\n const unselectedOptions = options.filter(\n option => !values.find(value => value.value === option.value)\n );\n\n const missingSelectedOptions = values.filter(\n value => !options.some(option => option.value === value.value)\n );\n return [...missingSelectedOptions, ...selectedOptions, ...unselectedOptions];\n }\n\n return options;\n };\n}\n"],"names":["computed","makeObservable","AsyncDataSource","DropdownState","AsyncLazyDropdownState","optionsWithValue","getOptionsWithValue","setDataFetcher","dataFetcher","setDataSource","get","result","search","data","total","length","dataSource","lazy","arrayValue","onChange","value","isEmptyValue","undefined","Array","isArray","options","values","selectedOptions","filter","option","find","unselectedOptions","missingSelectedOptions","some"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,SAASA,QAAQ,EAAEC,cAAc,QAAQ,OAAO;AAChD,SAASC,eAAe,QAAQ,2BAA2B;AAE3D,SAAyBC,aAAa,QAAQ,oBAAoB;AAIlE,OAAO,MAAMC,+BAA8DD;IAqBvE,IACIE,mBAAmB;QACnB,OAAO,IAAI,CAACC,mBAAmB;IACnC;IAQAC,eAAeC,WAAwB,EAAE;QACrC,IAAI,CAACC,aAAa,CACd,IAAIP,gBAAgB;YAChBQ,KAAK;gBACD,MAAMC,SAAgB,MAAMH,YAAY,IAAI,CAACI,MAAM;gBAEnD,OAAO;oBACHC,MAAMF;oBACNG,OAAOH,OAAOI,MAAM;gBACxB;YACJ;QACJ;IAER;IA1CA,YAAYP,WAAwB,CAAE;QAClC,KAAK,CAAC;YACFQ,YAAY,IAAId,gBAAgB;gBAC5BQ,KAAK;oBACD,MAAMC,SAAgB,MAAMH,YAAY,IAAI,CAACI,MAAM;oBAEnD,OAAO;wBACHC,MAAMF;wBACNG,OAAOH,OAAOI,MAAM;oBACxB;gBACJ;YACJ;YACAE,MAAM;QACV,IAfJ,uBAAQC,cAAwC,EAAE,GAyBlDC,uBAAAA,YAAW,CAACC;YACR,MAAMC,eAAeD,UAAUE,aAAcC,MAAMC,OAAO,CAACJ,UAAUA,MAAML,MAAM,KAAK;YAEtF,IAAI,CAACG,UAAU,GAAGG,eAAe,EAAE,GAAG,CAACE,MAAMC,OAAO,CAACJ,SAAS;gBAACA;aAAO,GAAGA;QAC7E,IAiBA,uBAAQd,uBAAsB;YAC1B,MAAMmB,UAAU;mBAAI,IAAI,CAACA,OAAO;aAAC;YAEjC,IAAI,CAAC,IAAI,CAACb,MAAM,EAAE;gBACd,MAAMc,SAAS,IAAI,CAACR,UAAU;gBAE9B,MAAMS,kBAAkBF,QAAQG,MAAM,CAClCC,CAAAA,SAAU,CAAC,CAACH,OAAOI,IAAI,CAACV,CAAAA,QAASA,MAAMA,KAAK,KAAKS,OAAOT,KAAK;gBAGjE,MAAMW,oBAAoBN,QAAQG,MAAM,CACpCC,CAAAA,SAAU,CAACH,OAAOI,IAAI,CAACV,CAAAA,QAASA,MAAMA,KAAK,KAAKS,OAAOT,KAAK;gBAGhE,MAAMY,yBAAyBN,OAAOE,MAAM,CACxCR,CAAAA,QAAS,CAACK,QAAQQ,IAAI,CAACJ,CAAAA,SAAUA,OAAOT,KAAK,KAAKA,MAAMA,KAAK;gBAEjE,OAAO;uBAAIY;uBAA2BL;uBAAoBI;iBAAkB;YAChF;YAEA,OAAON;QACX;QAlDIxB,eAAe,IAAI;IACvB;AAkDJ"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/dropdown-state.ts"],"sourcesContent":["import { ChangeEvent } from 'react';\nimport {\n State,\n SortDescriptor,\n CompositeFilterDescriptor,\n GroupDescriptor,\n GroupResult,\n DataSource,\n} from '@servicetitan/data-query';\n\nimport { InputOnChangeData, AnvilSelectOptionsProps } from '@servicetitan/design-system';\n\nimport { observable, computed, action, runInAction, makeObservable } from 'mobx';\n\nimport debounce from 'debounce';\n\nfunction isGroupItem<T>(item: T | GroupResult<T>, groupedBy: string): item is GroupResult<T> {\n const { items, field } = item as GroupResult<T>;\n return !!items && field === groupedBy;\n}\n\nexport interface DropdownOption<T> {\n value: T;\n text: string;\n}\n\ninterface DropdownStateConstructorParams<T> {\n dataSource?: DataSource<T>;\n searchByGroup?: boolean;\n state?: {\n sort?: SortDescriptor[];\n filter?: CompositeFilterDescriptor;\n group?: [GroupDescriptor];\n };\n lazy?: boolean;\n}\n\nexport class DropdownState<T extends DropdownOption<any>> {\n @observable loading = false;\n @observable search = '';\n\n @computed get options() {\n const result = new Map<T[keyof T], AnvilSelectOptionsProps>();\n const flat: AnvilSelectOptionsProps[] = [];\n\n const groupField = this.group[0].field;\n\n this.traverse(\n this.data,\n item => {\n const group = item[groupField as keyof T];\n\n if (group) {\n if (result.has(group)) {\n result.get(group)?.options?.push(item);\n } else {\n result.set(group, {\n value: group,\n text: String(group),\n options: [item],\n });\n }\n } else {\n flat.push(item);\n }\n },\n groupField\n );\n\n return [...flat, ...Array.from(result.values())];\n }\n\n @computed get state() {\n return {\n sort: this.sort,\n filter:\n this.searchFilter || this.filter\n ? this.searchFilter && this.filter\n ? { logic: 'and', filters: [this.searchFilter, this.filter] }\n : (this.searchFilter ?? this.filter)\n : undefined,\n group: this.group,\n } as State;\n }\n\n @computed private get searchFilter() {\n if (!this.search) {\n return undefined;\n }\n\n const filter = { operator: 'contains', value: this.search, ignoreCase: true };\n\n return {\n logic: 'or',\n filters: [\n { ...filter, field: 'text' },\n ...(this.searchByGroup ? [{ ...filter, field: 'group' }] : []),\n ],\n } as CompositeFilterDescriptor;\n }\n\n @observable private dataSource: DataSource<T> | null;\n @observable private searchByGroup: boolean;\n @observable private sort: SortDescriptor[];\n @observable private filter: CompositeFilterDescriptor | null;\n @observable private group: [GroupDescriptor];\n\n @observable private data: T[] | GroupResult<T>[] = [];\n\n constructor({\n dataSource,\n searchByGroup,\n state,\n lazy,\n }: DropdownStateConstructorParams<T> = {}) {\n makeObservable(this);\n\n this.dataSource = dataSource ?? null;\n this.searchByGroup = searchByGroup ?? false;\n this.sort = state?.sort ?? [{ field: 'text' }];\n this.filter = state?.filter ?? null;\n this.group = state?.group ?? [{ field: 'group' }];\n\n if (!lazy) {\n this.fetch();\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n onSearchChange = (() => {\n const fetch = debounce(() => this.fetch(), 100);\n return (_0: ChangeEvent<HTMLInputElement>, data: InputOnChangeData) => {\n runInAction(() => {\n this.search = data.value;\n });\n fetch();\n };\n })();\n\n @action\n setSearch = async (search: string) => {\n this.search = search;\n await this.fetch();\n };\n\n @action\n setDataSource = async (dataSource: DataSource<T> | null) => {\n this.dataSource = dataSource;\n await this.fetch();\n };\n\n @action\n setSearchByGroup = async (searchByGroup: boolean) => {\n this.searchByGroup = searchByGroup;\n await this.fetch();\n };\n\n @action\n setSort = async (sort: SortDescriptor[]) => {\n this.sort = sort;\n await this.fetch();\n };\n\n @action\n setFilter = async (filter: CompositeFilterDescriptor | null) => {\n this.filter = filter;\n await this.fetch();\n };\n\n @action\n setGroup = async (group: [GroupDescriptor]) => {\n this.group = group;\n await this.fetch();\n };\n\n @action\n fetch = async () => {\n this.loading = true;\n\n const response = await this.dataSource?.getData(this.state);\n\n runInAction(() => {\n this.data = response?.data ?? [];\n this.loading = false;\n });\n };\n\n private traverse = (\n items: T[] | GroupResult<T>[],\n itemCallback: (item: T) => void,\n groupedBy: string\n ) => {\n if (!items) {\n return;\n }\n\n for (const item of items) {\n if (isGroupItem(item, groupedBy)) {\n this.traverse(item.items, itemCallback, groupedBy);\n } else {\n itemCallback(item);\n }\n }\n };\n}\n"],"names":["observable","computed","action","runInAction","makeObservable","debounce","isGroupItem","item","groupedBy","items","field","DropdownState","options","result","Map","flat","groupField","group","traverse","data","has","get","push","set","value","text","String","Array","from","values","state","sort","filter","searchFilter","logic","filters","undefined","search","operator","ignoreCase","searchByGroup","constructor","dataSource","lazy","loading","onSearchChange","fetch","_0","setSearch","setDataSource","setSearchByGroup","setSort","setFilter","setGroup","response","getData","itemCallback"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAYA,SAASA,UAAU,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,WAAW,EAAEC,cAAc,QAAQ,OAAO;AAEjF,OAAOC,cAAc,WAAW;AAEhC,SAASC,YAAeC,IAAwB,EAAEC,SAAiB;IAC/D,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGH;IACzB,OAAO,CAAC,CAACE,SAASC,UAAUF;AAChC;AAkBA,OAAO,MAAMG;IAIT,IAAcC,UAAU;QACpB,MAAMC,SAAS,IAAIC;QACnB,MAAMC,OAAkC,EAAE;QAE1C,MAAMC,aAAa,IAAI,CAACC,KAAK,CAAC,EAAE,CAACP,KAAK;QAEtC,IAAI,CAACQ,QAAQ,CACT,IAAI,CAACC,IAAI,EACTZ,CAAAA;YACI,MAAMU,QAAQV,IAAI,CAACS,WAAsB;YAEzC,IAAIC,OAAO;gBACP,IAAIJ,OAAOO,GAAG,CAACH,QAAQ;wBACnBJ,qBAAAA;qBAAAA,cAAAA,OAAOQ,GAAG,CAACJ,oBAAXJ,mCAAAA,sBAAAA,YAAmBD,OAAO,cAA1BC,0CAAAA,oBAA4BS,IAAI,CAACf;gBACrC,OAAO;oBACHM,OAAOU,GAAG,CAACN,OAAO;wBACdO,OAAOP;wBACPQ,MAAMC,OAAOT;wBACbL,SAAS;4BAACL;yBAAK;oBACnB;gBACJ;YACJ,OAAO;gBACHQ,KAAKO,IAAI,CAACf;YACd;QACJ,GACAS;QAGJ,OAAO;eAAID;eAASY,MAAMC,IAAI,CAACf,OAAOgB,MAAM;SAAI;IACpD;IAEA,IAAcC,QAAQ;YAOC;QANnB,OAAO;YACHC,MAAM,IAAI,CAACA,IAAI;YACfC,QACI,IAAI,CAACC,YAAY,IAAI,IAAI,CAACD,MAAM,GAC1B,IAAI,CAACC,YAAY,IAAI,IAAI,CAACD,MAAM,GAC5B;gBAAEE,OAAO;gBAAOC,SAAS;oBAAC,IAAI,CAACF,YAAY;oBAAE,IAAI,CAACD,MAAM;iBAAC;YAAC,IACzD,CAAA,qBAAA,IAAI,CAACC,YAAY,cAAjB,gCAAA,qBAAqB,IAAI,CAACD,MAAM,GACrCI;YACVnB,OAAO,IAAI,CAACA,KAAK;QACrB;IACJ;IAEA,IAAsBgB,eAAe;QACjC,IAAI,CAAC,IAAI,CAACI,MAAM,EAAE;YACd,OAAOD;QACX;QAEA,MAAMJ,SAAS;YAAEM,UAAU;YAAYd,OAAO,IAAI,CAACa,MAAM;YAAEE,YAAY;QAAK;QAE5E,OAAO;YACHL,OAAO;YACPC,SAAS;gBACL;oBAAE,GAAGH,MAAM;oBAAEtB,OAAO;gBAAO;mBACvB,IAAI,CAAC8B,aAAa,GAAG;oBAAC;wBAAE,GAAGR,MAAM;wBAAEtB,OAAO;oBAAQ;iBAAE,GAAG,EAAE;aAChE;QACL;IACJ;IAUA+B,YAAY,EACRC,UAAU,EACVF,aAAa,EACbV,KAAK,EACLa,IAAI,EAC4B,GAAG,CAAC,CAAC,CAAE;QA5E3C,uBAAYC,WAAU;QACtB,uBAAYP,UAAS;QA8DrB,uBAAoBK,cAApB,KAAA;QACA,uBAAoBF,iBAApB,KAAA;QACA,uBAAoBT,QAApB,KAAA;QACA,uBAAoBC,UAApB,KAAA;QACA,uBAAoBf,SAApB,KAAA;QAEA,uBAAoBE,QAA+B,EAAE;QAqBrD,8DAA8D;QAC9D0B,uBAAAA,kBAAiB,AAAC,CAAA;YACd,MAAMC,QAAQzC,SAAS,IAAM,IAAI,CAACyC,KAAK,IAAI;YAC3C,OAAO,CAACC,IAAmC5B;gBACvChB,YAAY;oBACR,IAAI,CAACkC,MAAM,GAAGlB,KAAKK,KAAK;gBAC5B;gBACAsB;YACJ;QACJ,CAAA;QAEA,uBACAE,aAAY,OAAOX;YACf,IAAI,CAACA,MAAM,GAAGA;YACd,MAAM,IAAI,CAACS,KAAK;QACpB;QAEA,uBACAG,iBAAgB,OAAOP;YACnB,IAAI,CAACA,UAAU,GAAGA;YAClB,MAAM,IAAI,CAACI,KAAK;QACpB;QAEA,uBACAI,oBAAmB,OAAOV;YACtB,IAAI,CAACA,aAAa,GAAGA;YACrB,MAAM,IAAI,CAACM,KAAK;QACpB;QAEA,uBACAK,WAAU,OAAOpB;YACb,IAAI,CAACA,IAAI,GAAGA;YACZ,MAAM,IAAI,CAACe,KAAK;QACpB;QAEA,uBACAM,aAAY,OAAOpB;YACf,IAAI,CAACA,MAAM,GAAGA;YACd,MAAM,IAAI,CAACc,KAAK;QACpB;QAEA,uBACAO,YAAW,OAAOpC;YACd,IAAI,CAACA,KAAK,GAAGA;YACb,MAAM,IAAI,CAAC6B,KAAK;QACpB;QAEA,uBACAA,SAAQ;gBAGmB;YAFvB,IAAI,CAACF,OAAO,GAAG;YAEf,MAAMU,WAAW,QAAM,mBAAA,IAAI,CAACZ,UAAU,cAAf,uCAAA,iBAAiBa,OAAO,CAAC,IAAI,CAACzB,KAAK;YAE1D3B,YAAY;oBACImD;gBAAZ,IAAI,CAACnC,IAAI,GAAGmC,CAAAA,iBAAAA,qBAAAA,+BAAAA,SAAUnC,IAAI,cAAdmC,4BAAAA,iBAAkB,EAAE;gBAChC,IAAI,CAACV,OAAO,GAAG;YACnB;QACJ;QAEA,uBAAQ1B,YAAW,CACfT,OACA+C,cACAhD;YAEA,IAAI,CAACC,OAAO;gBACR;YACJ;YAEA,KAAK,MAAMF,QAAQE,MAAO;gBACtB,IAAIH,YAAYC,MAAMC,YAAY;oBAC9B,IAAI,CAACU,QAAQ,CAACX,KAAKE,KAAK,EAAE+C,cAAchD;gBAC5C,OAAO;oBACHgD,aAAajD;gBACjB;YACJ;QACJ;QAxFIH,eAAe,IAAI;QAEnB,IAAI,CAACsC,UAAU,GAAGA,uBAAAA,wBAAAA,aAAc;QAChC,IAAI,CAACF,aAAa,GAAGA,0BAAAA,2BAAAA,gBAAiB;YAC1BV;QAAZ,IAAI,CAACC,IAAI,GAAGD,CAAAA,cAAAA,kBAAAA,4BAAAA,MAAOC,IAAI,cAAXD,yBAAAA,cAAe;YAAC;gBAAEpB,OAAO;YAAO;SAAE;YAChCoB;QAAd,IAAI,CAACE,MAAM,GAAGF,CAAAA,gBAAAA,kBAAAA,4BAAAA,MAAOE,MAAM,cAAbF,2BAAAA,gBAAiB;YAClBA;QAAb,IAAI,CAACb,KAAK,GAAGa,CAAAA,eAAAA,kBAAAA,4BAAAA,MAAOb,KAAK,cAAZa,0BAAAA,eAAgB;YAAC;gBAAEpB,OAAO;YAAQ;SAAE;QAEjD,IAAI,CAACiC,MAAM;YACP,IAAI,CAACG,KAAK;QACd;IACJ;AA8EJ"}
1
+ {"version":3,"sources":["../src/dropdown-state.ts"],"sourcesContent":["import { ChangeEvent } from 'react';\nimport {\n State,\n SortDescriptor,\n CompositeFilterDescriptor,\n GroupDescriptor,\n GroupResult,\n DataSource,\n} from '@servicetitan/data-query';\n\nimport { InputOnChangeData, AnvilSelectOptionsProps } from '@servicetitan/design-system';\n\nimport { observable, computed, action, runInAction, makeObservable } from 'mobx';\n\nimport debounce from 'debounce';\n\nfunction isGroupItem<T>(item: T | GroupResult<T>, groupedBy: string): item is GroupResult<T> {\n const { items, field } = item as GroupResult<T>;\n return !!items && field === groupedBy;\n}\n\nexport interface DropdownOption<T> {\n value: T;\n text: string;\n}\n\ninterface DropdownStateConstructorParams<T> {\n dataSource?: DataSource<T>;\n searchByGroup?: boolean;\n state?: {\n sort?: SortDescriptor[];\n filter?: CompositeFilterDescriptor;\n group?: [GroupDescriptor];\n };\n lazy?: boolean;\n}\n\nexport class DropdownState<T extends DropdownOption<any>> {\n @observable loading = false;\n @observable search = '';\n\n @computed get options() {\n const result = new Map<T[keyof T], AnvilSelectOptionsProps>();\n const flat: AnvilSelectOptionsProps[] = [];\n\n const groupField = this.group[0].field;\n\n this.traverse(\n this.data,\n item => {\n const group = item[groupField as keyof T];\n\n if (group) {\n if (result.has(group)) {\n result.get(group)?.options?.push(item);\n } else {\n result.set(group, {\n value: group,\n text: String(group),\n options: [item],\n });\n }\n } else {\n flat.push(item);\n }\n },\n groupField\n );\n\n return [...flat, ...Array.from(result.values())];\n }\n\n @computed get state() {\n return {\n sort: this.sort,\n filter:\n this.searchFilter || this.filter\n ? this.searchFilter && this.filter\n ? { logic: 'and', filters: [this.searchFilter, this.filter] }\n : (this.searchFilter ?? this.filter)\n : undefined,\n group: this.group,\n } as State;\n }\n\n @computed private get searchFilter() {\n if (!this.search) {\n return undefined;\n }\n\n const filter = { operator: 'contains', value: this.search, ignoreCase: true };\n\n return {\n logic: 'or',\n filters: [\n { ...filter, field: 'text' },\n ...(this.searchByGroup ? [{ ...filter, field: 'group' }] : []),\n ],\n } as CompositeFilterDescriptor;\n }\n\n @observable private dataSource: DataSource<T> | null;\n @observable private searchByGroup: boolean;\n @observable private sort: SortDescriptor[];\n @observable private filter: CompositeFilterDescriptor | null;\n @observable private group: [GroupDescriptor];\n\n @observable private data: T[] | GroupResult<T>[] = [];\n\n constructor({\n dataSource,\n searchByGroup,\n state,\n lazy,\n }: DropdownStateConstructorParams<T> = {}) {\n makeObservable(this);\n\n this.dataSource = dataSource ?? null;\n this.searchByGroup = searchByGroup ?? false;\n this.sort = state?.sort ?? [{ field: 'text' }];\n this.filter = state?.filter ?? null;\n this.group = state?.group ?? [{ field: 'group' }];\n\n if (!lazy) {\n this.fetch();\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n onSearchChange = (() => {\n const fetch = debounce(() => this.fetch(), 100);\n return (_0: ChangeEvent<HTMLInputElement>, data: InputOnChangeData) => {\n runInAction(() => {\n this.search = data.value;\n });\n fetch();\n };\n })();\n\n @action\n setSearch = async (search: string) => {\n this.search = search;\n await this.fetch();\n };\n\n @action\n setDataSource = async (dataSource: DataSource<T> | null) => {\n this.dataSource = dataSource;\n await this.fetch();\n };\n\n @action\n setSearchByGroup = async (searchByGroup: boolean) => {\n this.searchByGroup = searchByGroup;\n await this.fetch();\n };\n\n @action\n setSort = async (sort: SortDescriptor[]) => {\n this.sort = sort;\n await this.fetch();\n };\n\n @action\n setFilter = async (filter: CompositeFilterDescriptor | null) => {\n this.filter = filter;\n await this.fetch();\n };\n\n @action\n setGroup = async (group: [GroupDescriptor]) => {\n this.group = group;\n await this.fetch();\n };\n\n @action\n fetch = async () => {\n this.loading = true;\n\n const response = await this.dataSource?.getData(this.state);\n\n runInAction(() => {\n this.data = response?.data ?? [];\n this.loading = false;\n });\n };\n\n private traverse = (\n items: T[] | GroupResult<T>[],\n itemCallback: (item: T) => void,\n groupedBy: string\n ) => {\n if (!items) {\n return;\n }\n\n for (const item of items) {\n if (isGroupItem(item, groupedBy)) {\n this.traverse(item.items, itemCallback, groupedBy);\n } else {\n itemCallback(item);\n }\n }\n };\n}\n"],"names":["observable","computed","action","runInAction","makeObservable","debounce","isGroupItem","item","groupedBy","items","field","DropdownState","options","result","Map","flat","groupField","group","traverse","data","has","get","push","set","value","text","String","Array","from","values","state","sort","filter","searchFilter","logic","filters","undefined","search","operator","ignoreCase","searchByGroup","dataSource","lazy","loading","onSearchChange","fetch","_0","setSearch","setDataSource","setSearchByGroup","setSort","setFilter","setGroup","response","getData","itemCallback"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export * from './date-range';
1
+ export type * from './date-range';
2
2
  export * from './persistent-form-state';
3
3
  export * from './dropdown-state';
4
4
  export * from './form-helpers';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,cAAc,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,3 @@
1
- export * from './date-range';
2
1
  export * from './persistent-form-state';
3
2
  export * from './dropdown-state';
4
3
  export * from './form-helpers';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './date-range';\nexport * from './persistent-form-state';\nexport * from './dropdown-state';\nexport * from './form-helpers';\nexport * from './form-validators';\n"],"names":[],"mappings":"AAAA,cAAc,eAAe;AAC7B,cAAc,0BAA0B;AACxC,cAAc,mBAAmB;AACjC,cAAc,iBAAiB;AAC/B,cAAc,oBAAoB"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export type * from './date-range';\nexport * from './persistent-form-state';\nexport * from './dropdown-state';\nexport * from './form-helpers';\nexport * from './form-validators';\n"],"names":[],"mappings":"AACA,cAAc,0BAA0B;AACxC,cAAc,mBAAmB;AACjC,cAAc,iBAAiB;AAC/B,cAAc,oBAAoB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/persistent-form-state/domain-storage.ts"],"sourcesContent":["import { FormStateShape } from '../form-helpers';\nimport { ValidatableMapOrArray } from 'formstate';\n\ninterface FormStateCache<T> {\n version: number;\n value: FormStateShape<T>;\n}\n\nexport class DomainStorage<T extends ValidatableMapOrArray> {\n private readonly version: number;\n private readonly cacheKey: string;\n\n constructor({ cacheKey, version }: { cacheKey: string; version: number }) {\n this.version = version;\n this.cacheKey = cacheKey;\n }\n\n getItem(): FormStateShape<T> | null {\n try {\n const cachedData = localStorage.getItem(this.cacheKey);\n if (cachedData) {\n const formData: FormStateCache<T> = JSON.parse(cachedData);\n if (formData.version === this.version) {\n return formData.value;\n }\n this.removeItem();\n }\n } catch {\n this.removeItem();\n }\n\n return null;\n }\n\n removeItem(): void {\n localStorage.removeItem(this.cacheKey);\n }\n\n setItem(_: string, value: FormStateShape<T>): void {\n const formData = { value, version: this.version };\n localStorage.setItem(this.cacheKey, JSON.stringify(formData));\n }\n}\n"],"names":["DomainStorage","getItem","cachedData","localStorage","cacheKey","formData","JSON","parse","version","value","removeItem","setItem","_","stringify","constructor"],"mappings":";;;;;;;;;;;;;AAQA,OAAO,MAAMA;IASTC,UAAoC;QAChC,IAAI;YACA,MAAMC,aAAaC,aAAaF,OAAO,CAAC,IAAI,CAACG,QAAQ;YACrD,IAAIF,YAAY;gBACZ,MAAMG,WAA8BC,KAAKC,KAAK,CAACL;gBAC/C,IAAIG,SAASG,OAAO,KAAK,IAAI,CAACA,OAAO,EAAE;oBACnC,OAAOH,SAASI,KAAK;gBACzB;gBACA,IAAI,CAACC,UAAU;YACnB;QACJ,EAAE,UAAM;YACJ,IAAI,CAACA,UAAU;QACnB;QAEA,OAAO;IACX;IAEAA,aAAmB;QACfP,aAAaO,UAAU,CAAC,IAAI,CAACN,QAAQ;IACzC;IAEAO,QAAQC,CAAS,EAAEH,KAAwB,EAAQ;QAC/C,MAAMJ,WAAW;YAAEI;YAAOD,SAAS,IAAI,CAACA,OAAO;QAAC;QAChDL,aAAaQ,OAAO,CAAC,IAAI,CAACP,QAAQ,EAAEE,KAAKO,SAAS,CAACR;IACvD;IA7BAS,YAAY,EAAEV,QAAQ,EAAEI,OAAO,EAAyC,CAAE;QAH1E,uBAAiBA,WAAjB,KAAA;QACA,uBAAiBJ,YAAjB,KAAA;QAGI,IAAI,CAACI,OAAO,GAAGA;QACf,IAAI,CAACJ,QAAQ,GAAGA;IACpB;AA2BJ"}
1
+ {"version":3,"sources":["../../src/persistent-form-state/domain-storage.ts"],"sourcesContent":["import { FormStateShape } from '../form-helpers';\nimport { ValidatableMapOrArray } from 'formstate';\n\ninterface FormStateCache<T> {\n version: number;\n value: FormStateShape<T>;\n}\n\nexport class DomainStorage<T extends ValidatableMapOrArray> {\n private readonly version: number;\n private readonly cacheKey: string;\n\n constructor({ cacheKey, version }: { cacheKey: string; version: number }) {\n this.version = version;\n this.cacheKey = cacheKey;\n }\n\n getItem(): FormStateShape<T> | null {\n try {\n const cachedData = localStorage.getItem(this.cacheKey);\n if (cachedData) {\n const formData: FormStateCache<T> = JSON.parse(cachedData);\n if (formData.version === this.version) {\n return formData.value;\n }\n this.removeItem();\n }\n } catch {\n this.removeItem();\n }\n\n return null;\n }\n\n removeItem(): void {\n localStorage.removeItem(this.cacheKey);\n }\n\n setItem(_: string, value: FormStateShape<T>): void {\n const formData = { value, version: this.version };\n localStorage.setItem(this.cacheKey, JSON.stringify(formData));\n }\n}\n"],"names":["DomainStorage","getItem","cachedData","localStorage","cacheKey","formData","JSON","parse","version","value","removeItem","setItem","_","stringify"],"mappings":";;;;;;;;;;;;;AAQA,OAAO,MAAMA;IASTC,UAAoC;QAChC,IAAI;YACA,MAAMC,aAAaC,aAAaF,OAAO,CAAC,IAAI,CAACG,QAAQ;YACrD,IAAIF,YAAY;gBACZ,MAAMG,WAA8BC,KAAKC,KAAK,CAACL;gBAC/C,IAAIG,SAASG,OAAO,KAAK,IAAI,CAACA,OAAO,EAAE;oBACnC,OAAOH,SAASI,KAAK;gBACzB;gBACA,IAAI,CAACC,UAAU;YACnB;QACJ,EAAE,UAAM;YACJ,IAAI,CAACA,UAAU;QACnB;QAEA,OAAO;IACX;IAEAA,aAAmB;QACfP,aAAaO,UAAU,CAAC,IAAI,CAACN,QAAQ;IACzC;IAEAO,QAAQC,CAAS,EAAEH,KAAwB,EAAQ;QAC/C,MAAMJ,WAAW;YAAEI;YAAOD,SAAS,IAAI,CAACA,OAAO;QAAC;QAChDL,aAAaQ,OAAO,CAAC,IAAI,CAACP,QAAQ,EAAEE,KAAKO,SAAS,CAACR;IACvD;IA7BA,YAAY,EAAED,QAAQ,EAAEI,OAAO,EAAyC,CAAE;QAH1E,uBAAiBA,WAAjB,KAAA;QACA,uBAAiBJ,YAAjB,KAAA;QAGI,IAAI,CAACI,OAAO,GAAGA;QACf,IAAI,CAACJ,QAAQ,GAAGA;IACpB;AA2BJ"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/persistent-form-state/persistent-form-state.ts"],"sourcesContent":["import { autorun } from 'mobx';\nimport { FormState, ValidatableMapOrArray } from 'formstate';\nimport { InMemoryStorage, MemoryStorage } from './in-memory-storage';\nimport {\n RecursivePartial,\n FormStateShape,\n setFormStateValues,\n formStateToJS,\n} from '../form-helpers';\nimport { DomainStorage } from './domain-storage';\n\nexport enum PersistenceMode {\n Session,\n Domain,\n InMemory,\n}\n\nexport class PersistentFormState<T extends ValidatableMapOrArray> extends FormState<T> {\n private storageSystem!: InMemoryStorage<T> | DomainStorage<T>;\n private resetFormSuper = this.reset;\n\n constructor(\n $: T,\n private cacheKey: string,\n private persistenceMode: PersistenceMode,\n autoSave?: boolean,\n version?: number\n ) {\n super($);\n\n if (PersistenceMode.Domain === this.persistenceMode) {\n if (!version) {\n throw 'Set a data structure version.';\n }\n this.storageSystem = new DomainStorage<T>({ cacheKey, version });\n } else if (PersistenceMode.Session === this.persistenceMode) {\n throw 'Use of Session storage is currently unsafe';\n } else {\n this.storageSystem = MemoryStorage;\n }\n\n this.getCached();\n if (autoSave) {\n this.trackChange();\n }\n }\n\n save = () => {\n this.storageSystem.setItem(this.cacheKey, formStateToJS(this));\n };\n\n resetForm = () => {\n this.resetFormSuper();\n this.storageSystem.removeItem(this.cacheKey);\n };\n\n private trackChange = () => {\n autorun(() => this.save(), { delay: 500 });\n };\n\n private getCached = () => {\n const data = this.storageSystem.getItem(this.cacheKey);\n\n if (data) {\n setFormStateValues(this, data as unknown as RecursivePartial<FormStateShape<T>>);\n }\n };\n}\n"],"names":["autorun","FormState","MemoryStorage","setFormStateValues","formStateToJS","DomainStorage","PersistenceMode","PersistentFormState","constructor","$","cacheKey","persistenceMode","autoSave","version","storageSystem","resetFormSuper","save","resetForm","trackChange","getCached","reset","setItem","removeItem","delay","data","getItem"],"mappings":";;;;;;;;;;;;;AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SAASC,SAAS,QAA+B,YAAY;AAC7D,SAA0BC,aAAa,QAAQ,sBAAsB;AACrE,SAGIC,kBAAkB,EAClBC,aAAa,QACV,kBAAkB;AACzB,SAASC,aAAa,QAAQ,mBAAmB;AAEjD,OAAO,IAAA,AAAKC,yCAAAA;;;;WAAAA;MAIX;AAED,OAAO,MAAMC,4BAA6DN;IAItEO,YACIC,CAAI,EACJ,AAAQC,QAAgB,EACxB,AAAQC,eAAgC,EACxCC,QAAkB,EAClBC,OAAgB,CAClB;QACE,KAAK,CAACJ,mGAVV,uBAAQK,iBAAR,KAAA,IACA,uBAAQC,kBAAR,KAAA,IA4BAC,uBAAAA,QAAAA,KAAAA,IAIAC,uBAAAA,aAAAA,KAAAA,IAKA,uBAAQC,eAAR,KAAA,IAIA,uBAAQC,aAAR,KAAA,SArCYT,WAAAA,eACAC,kBAAAA,sBALJI,iBAAiB,IAAI,CAACK,KAAK,OA4BnCJ,OAAO;YACH,IAAI,CAACF,aAAa,CAACO,OAAO,CAAC,IAAI,CAACX,QAAQ,EAAEN,cAAc,IAAI;QAChE,QAEAa,YAAY;YACR,IAAI,CAACF,cAAc;YACnB,IAAI,CAACD,aAAa,CAACQ,UAAU,CAAC,IAAI,CAACZ,QAAQ;QAC/C,QAEQQ,cAAc;YAClBlB,QAAQ,IAAM,IAAI,CAACgB,IAAI,IAAI;gBAAEO,OAAO;YAAI;QAC5C,QAEQJ,YAAY;YAChB,MAAMK,OAAO,IAAI,CAACV,aAAa,CAACW,OAAO,CAAC,IAAI,CAACf,QAAQ;YAErD,IAAIc,MAAM;gBACNrB,mBAAmB,IAAI,EAAEqB;YAC7B;QACJ;QApCI,IAAIlB,MAA2B,IAAI,CAACK,eAAe,EAAE;YACjD,IAAI,CAACE,SAAS;gBACV,MAAM;YACV;YACA,IAAI,CAACC,aAAa,GAAG,IAAIT,cAAiB;gBAAEK;gBAAUG;YAAQ;QAClE,OAAO,IAAIP,MAA4B,IAAI,CAACK,eAAe,EAAE;YACzD,MAAM;QACV,OAAO;YACH,IAAI,CAACG,aAAa,GAAGZ;QACzB;QAEA,IAAI,CAACiB,SAAS;QACd,IAAIP,UAAU;YACV,IAAI,CAACM,WAAW;QACpB;IACJ;AAsBJ"}
1
+ {"version":3,"sources":["../../src/persistent-form-state/persistent-form-state.ts"],"sourcesContent":["import { autorun } from 'mobx';\nimport { FormState, ValidatableMapOrArray } from 'formstate';\nimport { InMemoryStorage, MemoryStorage } from './in-memory-storage';\nimport {\n RecursivePartial,\n FormStateShape,\n setFormStateValues,\n formStateToJS,\n} from '../form-helpers';\nimport { DomainStorage } from './domain-storage';\n\nexport enum PersistenceMode {\n Session,\n Domain,\n InMemory,\n}\n\nexport class PersistentFormState<T extends ValidatableMapOrArray> extends FormState<T> {\n private storageSystem!: InMemoryStorage<T> | DomainStorage<T>;\n private resetFormSuper = this.reset;\n\n constructor(\n $: T,\n private cacheKey: string,\n private persistenceMode: PersistenceMode,\n autoSave?: boolean,\n version?: number\n ) {\n super($);\n\n if (PersistenceMode.Domain === this.persistenceMode) {\n if (!version) {\n throw 'Set a data structure version.';\n }\n this.storageSystem = new DomainStorage<T>({ cacheKey, version });\n } else if (PersistenceMode.Session === this.persistenceMode) {\n throw 'Use of Session storage is currently unsafe';\n } else {\n this.storageSystem = MemoryStorage;\n }\n\n this.getCached();\n if (autoSave) {\n this.trackChange();\n }\n }\n\n save = () => {\n this.storageSystem.setItem(this.cacheKey, formStateToJS(this));\n };\n\n resetForm = () => {\n this.resetFormSuper();\n this.storageSystem.removeItem(this.cacheKey);\n };\n\n private trackChange = () => {\n autorun(() => this.save(), { delay: 500 });\n };\n\n private getCached = () => {\n const data = this.storageSystem.getItem(this.cacheKey);\n\n if (data) {\n setFormStateValues(this, data as unknown as RecursivePartial<FormStateShape<T>>);\n }\n };\n}\n"],"names":["autorun","FormState","MemoryStorage","setFormStateValues","formStateToJS","DomainStorage","PersistenceMode","PersistentFormState","$","cacheKey","persistenceMode","autoSave","version","storageSystem","resetFormSuper","save","resetForm","trackChange","getCached","reset","setItem","removeItem","delay","data","getItem"],"mappings":";;;;;;;;;;;;;AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SAASC,SAAS,QAA+B,YAAY;AAC7D,SAA0BC,aAAa,QAAQ,sBAAsB;AACrE,SAGIC,kBAAkB,EAClBC,aAAa,QACV,kBAAkB;AACzB,SAASC,aAAa,QAAQ,mBAAmB;AAEjD,OAAO,IAAA,AAAKC,yCAAAA;;;;WAAAA;MAIX;AAED,OAAO,MAAMC,4BAA6DN;IAItE,YACIO,CAAI,EACJ,AAAQC,QAAgB,EACxB,AAAQC,eAAgC,EACxCC,QAAkB,EAClBC,OAAgB,CAClB;QACE,KAAK,CAACJ,mGAVV,uBAAQK,iBAAR,KAAA,IACA,uBAAQC,kBAAR,KAAA,IA4BAC,uBAAAA,QAAAA,KAAAA,IAIAC,uBAAAA,aAAAA,KAAAA,IAKA,uBAAQC,eAAR,KAAA,IAIA,uBAAQC,aAAR,KAAA,SArCYT,WAAAA,eACAC,kBAAAA,sBALJI,iBAAiB,IAAI,CAACK,KAAK,OA4BnCJ,OAAO;YACH,IAAI,CAACF,aAAa,CAACO,OAAO,CAAC,IAAI,CAACX,QAAQ,EAAEL,cAAc,IAAI;QAChE,QAEAY,YAAY;YACR,IAAI,CAACF,cAAc;YACnB,IAAI,CAACD,aAAa,CAACQ,UAAU,CAAC,IAAI,CAACZ,QAAQ;QAC/C,QAEQQ,cAAc;YAClBjB,QAAQ,IAAM,IAAI,CAACe,IAAI,IAAI;gBAAEO,OAAO;YAAI;QAC5C,QAEQJ,YAAY;YAChB,MAAMK,OAAO,IAAI,CAACV,aAAa,CAACW,OAAO,CAAC,IAAI,CAACf,QAAQ;YAErD,IAAIc,MAAM;gBACNpB,mBAAmB,IAAI,EAAEoB;YAC7B;QACJ;QApCI,IAAIjB,MAA2B,IAAI,CAACI,eAAe,EAAE;YACjD,IAAI,CAACE,SAAS;gBACV,MAAM;YACV;YACA,IAAI,CAACC,aAAa,GAAG,IAAIR,cAAiB;gBAAEI;gBAAUG;YAAQ;QAClE,OAAO,IAAIN,MAA4B,IAAI,CAACI,eAAe,EAAE;YACzD,MAAM;QACV,OAAO;YACH,IAAI,CAACG,aAAa,GAAGX;QACzB;QAEA,IAAI,CAACgB,SAAS;QACd,IAAIP,UAAU;YACV,IAAI,CAACM,WAAW;QACpB;IACJ;AAsBJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/form-state",
3
- "version": "32.3.0",
3
+ "version": "32.4.1",
4
4
  "description": "",
5
5
  "repository": {
6
6
  "type": "git",
@@ -15,7 +15,7 @@
15
15
  "src"
16
16
  ],
17
17
  "devDependencies": {
18
- "@servicetitan/data-query": "^32.3.0",
18
+ "@servicetitan/data-query": "^32.4.1",
19
19
  "@servicetitan/design-system": "~14.5.1",
20
20
  "@types/debounce": "~1.2.1",
21
21
  "@types/react": "~18.2.55",
@@ -25,7 +25,7 @@
25
25
  "react": "^18.2.0"
26
26
  },
27
27
  "peerDependencies": {
28
- "@servicetitan/data-query": "^32.3.0",
28
+ "@servicetitan/data-query": "^32.4.1",
29
29
  "@servicetitan/design-system": ">=13.2.1",
30
30
  "formstate": "^2.1.0",
31
31
  "mobx": ">=6.6.0",
@@ -41,5 +41,5 @@
41
41
  "cli": {
42
42
  "webpack": false
43
43
  },
44
- "gitHead": "948549f6eedb039a353ac4fc3ec1b90eee4d0321"
44
+ "gitHead": "5bc4f3c9c8a181df124fdc614964757e5490ea9b"
45
45
  }
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- export * from './date-range';
1
+ export type * from './date-range';
2
2
  export * from './persistent-form-state';
3
3
  export * from './dropdown-state';
4
4
  export * from './form-helpers';