@servicetitan/form-state 38.1.0 → 38.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/dropdown-state.js
CHANGED
|
@@ -95,6 +95,7 @@ export class DropdownState {
|
|
|
95
95
|
};
|
|
96
96
|
}
|
|
97
97
|
constructor({ dataSource, searchByGroup, state, lazy } = {}){
|
|
98
|
+
var _ref, _ref1, _ref2;
|
|
98
99
|
_define_property(this, "loading", false);
|
|
99
100
|
_define_property(this, "search", '');
|
|
100
101
|
_define_property(this, "dataSource", void 0);
|
|
@@ -142,8 +143,8 @@ export class DropdownState {
|
|
|
142
143
|
this.loading = true;
|
|
143
144
|
const response = await ((_this_dataSource = this.dataSource) === null || _this_dataSource === void 0 ? void 0 : _this_dataSource.getData(this.state));
|
|
144
145
|
runInAction(()=>{
|
|
145
|
-
var
|
|
146
|
-
this.data = (
|
|
146
|
+
var _ref;
|
|
147
|
+
this.data = (_ref = response === null || response === void 0 ? void 0 : response.data) !== null && _ref !== void 0 ? _ref : [];
|
|
147
148
|
this.loading = false;
|
|
148
149
|
});
|
|
149
150
|
});
|
|
@@ -162,16 +163,13 @@ export class DropdownState {
|
|
|
162
163
|
makeObservable(this);
|
|
163
164
|
this.dataSource = dataSource !== null && dataSource !== void 0 ? dataSource : null;
|
|
164
165
|
this.searchByGroup = searchByGroup !== null && searchByGroup !== void 0 ? searchByGroup : false;
|
|
165
|
-
|
|
166
|
-
this.sort = (_state_sort = state === null || state === void 0 ? void 0 : state.sort) !== null && _state_sort !== void 0 ? _state_sort : [
|
|
166
|
+
this.sort = (_ref = state === null || state === void 0 ? void 0 : state.sort) !== null && _ref !== void 0 ? _ref : [
|
|
167
167
|
{
|
|
168
168
|
field: 'text'
|
|
169
169
|
}
|
|
170
170
|
];
|
|
171
|
-
|
|
172
|
-
this.
|
|
173
|
-
var _state_group;
|
|
174
|
-
this.group = (_state_group = state === null || state === void 0 ? void 0 : state.group) !== null && _state_group !== void 0 ? _state_group : [
|
|
171
|
+
this.filter = (_ref1 = state === null || state === void 0 ? void 0 : state.filter) !== null && _ref1 !== void 0 ? _ref1 : null;
|
|
172
|
+
this.group = (_ref2 = state === null || state === void 0 ? void 0 : state.group) !== null && _ref2 !== void 0 ? _ref2 : [
|
|
175
173
|
{
|
|
176
174
|
field: 'group'
|
|
177
175
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dropdown-state.ts"],"sourcesContent":["import {\n State,\n SortDescriptor,\n CompositeFilterDescriptor,\n GroupDescriptor,\n GroupResult,\n DataSource,\n} from '@servicetitan/data-query';\nimport debounce from 'debounce';\nimport { observable, computed, action, runInAction, makeObservable } from 'mobx';\nimport { ChangeEvent } from 'react';\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], { value: T[keyof T]; text: string; options: T[] }>();\n const flat: T[] = [];\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: { value: string }) => {\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":["debounce","observable","computed","action","runInAction","makeObservable","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":";;;;;;;;;;;;;;;;;;;;;;AAQA,OAAOA,cAAc,WAAW;AAChC,SAASC,UAAU,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,WAAW,EAAEC,cAAc,QAAQ,OAAO;AAGjF,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,OAAY,EAAE;QAEpB,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,
|
|
1
|
+
{"version":3,"sources":["../src/dropdown-state.ts"],"sourcesContent":["import {\n State,\n SortDescriptor,\n CompositeFilterDescriptor,\n GroupDescriptor,\n GroupResult,\n DataSource,\n} from '@servicetitan/data-query';\nimport debounce from 'debounce';\nimport { observable, computed, action, runInAction, makeObservable } from 'mobx';\nimport { ChangeEvent } from 'react';\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], { value: T[keyof T]; text: string; options: T[] }>();\n const flat: T[] = [];\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: { value: string }) => {\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":["debounce","observable","computed","action","runInAction","makeObservable","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"],"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,
|
|
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,eAAM;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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@servicetitan/form-state",
|
|
3
|
-
"version": "38.
|
|
3
|
+
"version": "38.2.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
"src"
|
|
16
16
|
],
|
|
17
17
|
"devDependencies": {
|
|
18
|
-
"@servicetitan/data-query": "^38.
|
|
18
|
+
"@servicetitan/data-query": "^38.2.0",
|
|
19
19
|
"@servicetitan/design-system": "~14.5.1",
|
|
20
|
-
"@servicetitan/hash-browser-router": "^
|
|
20
|
+
"@servicetitan/hash-browser-router": "^34.0.1",
|
|
21
21
|
"@types/debounce": "~1.2.1",
|
|
22
22
|
"@types/react": "~18.2.55",
|
|
23
23
|
"formstate": "^2.1.0",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"react": "^18.2.0"
|
|
27
27
|
},
|
|
28
28
|
"peerDependencies": {
|
|
29
|
-
"@servicetitan/data-query": "^38.
|
|
29
|
+
"@servicetitan/data-query": "^38.2.0",
|
|
30
30
|
"formstate": "^2.1.0",
|
|
31
31
|
"mobx": ">=6.6.0",
|
|
32
32
|
"mobx-react": ">=7.5.1",
|
|
@@ -41,5 +41,5 @@
|
|
|
41
41
|
"cli": {
|
|
42
42
|
"webpack": false
|
|
43
43
|
},
|
|
44
|
-
"gitHead": "
|
|
44
|
+
"gitHead": "b013c9f39c05c44f888a5bca5ff6aadb89cd7a6f"
|
|
45
45
|
}
|