@servicetitan/form-state 38.3.1 → 38.3.2

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.
@@ -3,11 +3,7 @@ export type DataFetcher = (searchQuery: string) => Promise<DropdownOption<any>[]
3
3
  export declare class AsyncLazyDropdownState<T extends DropdownOption<any>> extends DropdownState<T> {
4
4
  private arrayValue;
5
5
  constructor(dataFetcher: DataFetcher);
6
- get optionsWithValue(): (T | {
7
- value: T[keyof T];
8
- text: string;
9
- options: T[];
10
- })[];
6
+ get optionsWithValue(): DropdownOption<any>[];
11
7
  onChange: (value?: T) => void;
12
8
  setDataFetcher(dataFetcher: DataFetcher): void;
13
9
  private getOptionsWithValue;
@@ -1 +1 @@
1
- {"version":3,"file":"async-lazy-dropdown-state.d.ts","sourceRoot":"","sources":["../../src/async-lazy-dropdown-state/async-lazy-dropdown-state.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElE,MAAM,MAAM,WAAW,GAAG,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAElF,qBAAa,sBAAsB,CAAC,CAAC,SAAS,cAAc,CAAC,GAAG,CAAC,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;IACvF,OAAO,CAAC,UAAU,CAAW;gBAEjB,WAAW,EAAE,WAAW;IAkBpC,IACI,gBAAgB;;;;SAEnB;IAED,QAAQ,GAAI,QAAQ,CAAC,UAInB;IAEF,cAAc,CAAC,WAAW,EAAE,WAAW;IAevC,OAAO,CAAC,mBAAmB,CAqBzB;CACL"}
1
+ {"version":3,"file":"async-lazy-dropdown-state.d.ts","sourceRoot":"","sources":["../../src/async-lazy-dropdown-state/async-lazy-dropdown-state.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElE,MAAM,MAAM,WAAW,GAAG,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAElF,qBAAa,sBAAsB,CAAC,CAAC,SAAS,cAAc,CAAC,GAAG,CAAC,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;IACvF,OAAO,CAAC,UAAU,CAAW;gBAEjB,WAAW,EAAE,WAAW;IAkBpC,IACI,gBAAgB,0BAEnB;IAED,QAAQ,GAAI,QAAQ,CAAC,UAInB;IAEF,cAAc,CAAC,WAAW,EAAE,WAAW;IAevC,OAAO,CAAC,mBAAmB,CAqBzB;CACL"}
@@ -1,8 +1,10 @@
1
1
  import { State, SortDescriptor, CompositeFilterDescriptor, GroupDescriptor, DataSource } from '@servicetitan/data-query';
2
2
  import { ChangeEvent } from 'react';
3
3
  export interface DropdownOption<T> {
4
- value?: T;
5
- text?: string;
4
+ [propName: string]: any;
5
+ value: T;
6
+ text: string;
7
+ options?: DropdownOption<any>[];
6
8
  }
7
9
  interface DropdownStateConstructorParams<T> {
8
10
  dataSource?: DataSource<T>;
@@ -17,11 +19,7 @@ interface DropdownStateConstructorParams<T> {
17
19
  export declare class DropdownState<T extends DropdownOption<any>> {
18
20
  loading: boolean;
19
21
  search: string;
20
- get options(): (T | {
21
- value: T[keyof T];
22
- text: string;
23
- options: T[];
24
- })[];
22
+ get options(): DropdownOption<any>[];
25
23
  get state(): State;
26
24
  private get searchFilter();
27
25
  private dataSource;
@@ -1 +1 @@
1
- {"version":3,"file":"dropdown-state.d.ts","sourceRoot":"","sources":["../src/dropdown-state.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,EACL,cAAc,EACd,yBAAyB,EACzB,eAAe,EAEf,UAAU,EACb,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAOpC,MAAM,WAAW,cAAc,CAAC,CAAC;IAC7B,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,8BAA8B,CAAC,CAAC;IACtC,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE;QACJ,IAAI,CAAC,EAAE,cAAc,EAAE,CAAC;QACxB,MAAM,CAAC,EAAE,yBAAyB,CAAC;QACnC,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC;KAC7B,CAAC;IACF,IAAI,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,aAAa,CAAC,CAAC,SAAS,cAAc,CAAC,GAAG,CAAC;IACxC,OAAO,UAAS;IAChB,MAAM,SAAM;IAExB,IAAc,OAAO;eAC2B,CAAC,CAAC,MAAM,CAAC,CAAC;cAAQ,MAAM;iBAAW,CAAC,EAAE;SA4BrF;IAED,IAAc,KAAK,IAUV,KAAK,CACb;IAES,OAAO,KAAK,YAAY,GAcjC;IAEW,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,IAAI,CAAmB;IAC/B,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,KAAK,CAAoB;IAEjC,OAAO,CAAC,IAAI,CAA8B;gBAE1C,EACR,UAAU,EACV,aAAa,EACb,KAAK,EACL,IAAI,GACP,GAAE,8BAA8B,CAAC,CAAC,CAAM;IAezC,cAAc,OAEE,WAAW,CAAC,gBAAgB,CAAC,QAAQ;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,UAMjE;IAGL,SAAS,GAAU,QAAQ,MAAM,mBAG/B;IAGF,aAAa,GAAU,YAAY,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,mBAGrD;IAGF,gBAAgB,GAAU,eAAe,OAAO,mBAG9C;IAGF,OAAO,GAAU,MAAM,cAAc,EAAE,mBAGrC;IAGF,SAAS,GAAU,QAAQ,yBAAyB,GAAG,IAAI,mBAGzD;IAGF,QAAQ,GAAU,OAAO,CAAC,eAAe,CAAC,mBAGxC;IAGF,KAAK,sBASH;IAEF,OAAO,CAAC,QAAQ,CAgBd;CACL"}
1
+ {"version":3,"file":"dropdown-state.d.ts","sourceRoot":"","sources":["../src/dropdown-state.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,EACL,cAAc,EACd,yBAAyB,EACzB,eAAe,EAEf,UAAU,EACb,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAOpC,MAAM,WAAW,cAAc,CAAC,CAAC;IAC7B,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC;IACxB,KAAK,EAAE,CAAC,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;CACnC;AAED,UAAU,8BAA8B,CAAC,CAAC;IACtC,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE;QACJ,IAAI,CAAC,EAAE,cAAc,EAAE,CAAC;QACxB,MAAM,CAAC,EAAE,yBAAyB,CAAC;QACnC,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC;KAC7B,CAAC;IACF,IAAI,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,aAAa,CAAC,CAAC,SAAS,cAAc,CAAC,GAAG,CAAC;IACxC,OAAO,UAAS;IAChB,MAAM,SAAM;IAExB,IAAc,OAAO,0BA6BpB;IAED,IAAc,KAAK,IAUV,KAAK,CACb;IAES,OAAO,KAAK,YAAY,GAcjC;IAEW,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,IAAI,CAAmB;IAC/B,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,KAAK,CAAoB;IAEjC,OAAO,CAAC,IAAI,CAA8B;gBAE1C,EACR,UAAU,EACV,aAAa,EACb,KAAK,EACL,IAAI,GACP,GAAE,8BAA8B,CAAC,CAAC,CAAM;IAezC,cAAc,OAEE,WAAW,CAAC,gBAAgB,CAAC,QAAQ;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,UAMjE;IAGL,SAAS,GAAU,QAAQ,MAAM,mBAG/B;IAGF,aAAa,GAAU,YAAY,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,mBAGrD;IAGF,gBAAgB,GAAU,eAAe,OAAO,mBAG9C;IAGF,OAAO,GAAU,MAAM,cAAc,EAAE,mBAGrC;IAGF,SAAS,GAAU,QAAQ,yBAAyB,GAAG,IAAI,mBAGzD;IAGF,QAAQ,GAAU,OAAO,CAAC,eAAe,CAAC,mBAGxC;IAGF,KAAK,sBASH;IAEF,OAAO,CAAC,QAAQ,CAgBd;CACL"}
@@ -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":"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"}
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 [propName: string]: any;\n value: T;\n text: string;\n options?: DropdownOption<any>[];\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], DropdownOption<any>>();\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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/form-state",
3
- "version": "38.3.1",
3
+ "version": "38.3.2",
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": "^38.3.1",
18
+ "@servicetitan/data-query": "^38.3.2",
19
19
  "@servicetitan/design-system": "~14.5.1",
20
20
  "@servicetitan/hash-browser-router": "^34.0.1",
21
21
  "@types/debounce": "~1.2.1",
@@ -26,7 +26,7 @@
26
26
  "react": "^18.2.0"
27
27
  },
28
28
  "peerDependencies": {
29
- "@servicetitan/data-query": "^38.3.1",
29
+ "@servicetitan/data-query": "^38.3.2",
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": "c33341b3eafbc8851ad3c1c6a5ed913d8b555234"
44
+ "gitHead": "55b29348ffccb2d6a69359faccaea381073d413f"
45
45
  }
@@ -1,6 +1,6 @@
1
1
  import { FC, useState } from 'react';
2
2
  import { useAsyncLazyDropdownState } from './use-async-lazy-dropdown-state';
3
- import { AnvilSelectOptionsProps, Form } from '@servicetitan/design-system';
3
+ import { Form } from '@servicetitan/design-system';
4
4
  import { observer } from 'mobx-react';
5
5
  import { DropdownOption } from '../dropdown-state';
6
6
 
@@ -39,7 +39,7 @@ const dataFetcher = async (searchString: string) => {
39
39
  };
40
40
 
41
41
  const BasicExample: FC = observer(() => {
42
- const [value, setValue] = useState<AnvilSelectOptionsProps>();
42
+ const [value, setValue] = useState<DropdownOption<number>>();
43
43
  const [state, onOpenChange] = useAsyncLazyDropdownState(value, dataFetcher);
44
44
 
45
45
  return (
@@ -16,8 +16,10 @@ function isGroupItem<T>(item: T | GroupResult<T>, groupedBy: string): item is Gr
16
16
  }
17
17
 
18
18
  export interface DropdownOption<T> {
19
- value?: T;
20
- text?: string;
19
+ [propName: string]: any;
20
+ value: T;
21
+ text: string;
22
+ options?: DropdownOption<any>[];
21
23
  }
22
24
 
23
25
  interface DropdownStateConstructorParams<T> {
@@ -36,7 +38,7 @@ export class DropdownState<T extends DropdownOption<any>> {
36
38
  @observable search = '';
37
39
 
38
40
  @computed get options() {
39
- const result = new Map<T[keyof T], { value: T[keyof T]; text: string; options: T[] }>();
41
+ const result = new Map<T[keyof T], DropdownOption<any>>();
40
42
  const flat: T[] = [];
41
43
 
42
44
  const groupField = this.group[0].field;