@servicetitan/form-state 32.2.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/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","
|
|
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","
|
|
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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"}
|
|
@@ -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"
|
|
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","
|
|
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
|
+
"version": "32.4.0",
|
|
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.
|
|
18
|
+
"@servicetitan/data-query": "^32.4.0",
|
|
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.
|
|
28
|
+
"@servicetitan/data-query": "^32.4.0",
|
|
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": "
|
|
44
|
+
"gitHead": "3dab3310534a39aaacb0069e1d377579fe0a7fab"
|
|
45
45
|
}
|