cx 26.0.14 → 26.1.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.
Files changed (263) hide show
  1. package/build/ui/VDOM.d.ts +1 -20
  2. package/build/ui/VDOM.js +1 -3
  3. package/build/ui/Widget.d.ts +1 -1
  4. package/build/ui/Widget.js +0 -5
  5. package/build/ui/app/startAppLoop.js +2 -10
  6. package/build/util/Component.js +5 -0
  7. package/build/util/test/createTestRenderer.d.ts +3 -1
  8. package/build/util/test/createTestRenderer.js +8 -2
  9. package/build/widgets/form/Checkbox.d.ts +0 -1
  10. package/build/widgets/form/Checkbox.js +1 -0
  11. package/build/widgets/form/ColorField.d.ts +0 -1
  12. package/build/widgets/form/ColorField.js +2 -2
  13. package/build/widgets/form/DateTimeField.d.ts +0 -2
  14. package/build/widgets/form/DateTimeField.js +1 -0
  15. package/build/widgets/form/DateTimePicker.d.ts +0 -2
  16. package/build/widgets/form/DateTimePicker.js +1 -0
  17. package/build/widgets/form/Radio.d.ts +0 -1
  18. package/build/widgets/form/Slider.js +9 -1
  19. package/build/widgets/form/Switch.d.ts +0 -1
  20. package/build/widgets/form/Switch.js +1 -1
  21. package/build/widgets/form/Wheel.d.ts +0 -1
  22. package/build/widgets/grid/Grid.d.ts +0 -2
  23. package/build/widgets/grid/GridCellEditor.js +3 -1
  24. package/build/widgets/icons/calendar.js +4 -3
  25. package/build/widgets/icons/check.js +2 -2
  26. package/build/widgets/icons/clear.js +2 -2
  27. package/build/widgets/icons/close.js +2 -2
  28. package/build/widgets/icons/cx.js +2 -2
  29. package/build/widgets/icons/drop-down.js +2 -2
  30. package/build/widgets/icons/file.js +2 -2
  31. package/build/widgets/icons/folder-open.js +2 -2
  32. package/build/widgets/icons/folder.js +2 -2
  33. package/build/widgets/icons/forward.js +2 -2
  34. package/build/widgets/icons/loading.js +2 -2
  35. package/build/widgets/icons/menu.js +2 -2
  36. package/build/widgets/icons/pixel-picker.js +2 -2
  37. package/build/widgets/icons/search.js +2 -2
  38. package/build/widgets/icons/sort-asc.js +2 -2
  39. package/build/widgets/icons/square.js +2 -2
  40. package/build/widgets/overlay/Overlay.d.ts +3 -0
  41. package/build/widgets/overlay/Overlay.js +3 -2
  42. package/dist/manifest.js +867 -867
  43. package/dist/ui.js +4 -18
  44. package/dist/util.js +4 -0
  45. package/dist/widgets.js +395 -319
  46. package/package.json +11 -8
  47. package/src/charts/Chart.ts +108 -108
  48. package/src/core.d.ts +182 -182
  49. package/src/data/Expression.spec.ts +229 -229
  50. package/src/data/Expression.ts +233 -233
  51. package/src/data/Grouper.ts +158 -158
  52. package/src/data/Selector.ts +10 -10
  53. package/src/data/StringTemplate.spec.ts +132 -132
  54. package/src/data/StructuredSelector.ts +146 -146
  55. package/src/data/ZoomIntoPropertyView.spec.ts +64 -64
  56. package/src/data/comparer.ts +78 -78
  57. package/src/data/computable.spec.ts +87 -87
  58. package/src/data/createStructuredSelector.ts +62 -62
  59. package/src/data/getAccessor.spec.ts +11 -11
  60. package/src/data/getAccessor.ts +74 -74
  61. package/src/data/getSelector.spec.ts +43 -43
  62. package/src/data/getSelector.ts +66 -66
  63. package/src/data/ops/filter.spec.ts +35 -35
  64. package/src/data/ops/filter.ts +9 -9
  65. package/src/data/ops/merge.ts +13 -13
  66. package/src/data/ops/removeTreeNodes.spec.ts +37 -37
  67. package/src/data/ops/updateArray.spec.ts +69 -69
  68. package/src/data/ops/updateArray.ts +31 -31
  69. package/src/data/test-types.ts +7 -7
  70. package/src/hooks/invokeCallback.spec.tsx +4 -4
  71. package/src/hooks/resolveCallback.spec.tsx +4 -4
  72. package/src/hooks/store.spec.tsx +15 -15
  73. package/src/hooks/useTrigger.spec.tsx +16 -10
  74. package/src/hooks/useTrigger.ts +26 -26
  75. package/src/index.scss +6 -6
  76. package/src/jsx-runtime.ts +79 -79
  77. package/src/svg/BoundedObject.ts +101 -101
  78. package/src/svg/util/Rect.ts +105 -105
  79. package/src/ui/CSS.ts +87 -87
  80. package/src/ui/CSSHelper.ts +17 -17
  81. package/src/ui/ContentResolver.spec.tsx +31 -29
  82. package/src/ui/Controller.spec.tsx +47 -39
  83. package/src/ui/Culture.ts +159 -159
  84. package/src/ui/Cx.spec.tsx +10 -8
  85. package/src/ui/DataProxy.spec.tsx +18 -18
  86. package/src/ui/Instance.ts +866 -866
  87. package/src/ui/IsolatedScope.spec.tsx +16 -9
  88. package/src/ui/Prop.ts +140 -140
  89. package/src/ui/PureContainer.spec.tsx +20 -18
  90. package/src/ui/RenderingContext.ts +99 -99
  91. package/src/ui/Repeater.spec.tsx +8 -6
  92. package/src/ui/Rescope.spec.tsx +13 -13
  93. package/src/ui/Restate.spec.tsx +31 -27
  94. package/src/ui/StructuredInstanceDataAccessor.ts +32 -32
  95. package/src/ui/VDOM.ts +1 -34
  96. package/src/ui/Widget.tsx +0 -7
  97. package/src/ui/adapter/TreeAdapter.spec.ts +76 -76
  98. package/src/ui/adapter/TreeAdapter.ts +185 -185
  99. package/src/ui/app/History.ts +133 -133
  100. package/src/ui/app/Url.spec.ts +50 -50
  101. package/src/ui/app/startAppLoop.tsx +5 -9
  102. package/src/ui/app/startHotAppLoop.ts +41 -41
  103. package/src/ui/createFunctionalComponent.spec.tsx +20 -18
  104. package/src/ui/layout/ContentPlaceholder.spec.tsx +46 -34
  105. package/src/ui/layout/FirstVisibleChildLayout.spec.tsx +31 -19
  106. package/src/ui/layout/FirstVisibleChildLayout.ts +60 -60
  107. package/src/ui/selection/PropertySelection.ts +87 -87
  108. package/src/util/Component.spec.ts +30 -0
  109. package/src/util/Component.ts +301 -296
  110. package/src/util/Console.ts +13 -13
  111. package/src/util/DOM.ts +88 -88
  112. package/src/util/hasKey.ts +18 -18
  113. package/src/util/index.ts +55 -55
  114. package/src/util/isArray.ts +3 -3
  115. package/src/util/isDefined.ts +3 -3
  116. package/src/util/isString.ts +3 -3
  117. package/src/util/test/createTestRenderer.tsx +9 -2
  118. package/src/widgets/AccessorBindings.spec.tsx +4 -4
  119. package/src/widgets/DocumentTitle.ts +95 -95
  120. package/src/widgets/HtmlElement.spec.tsx +6 -6
  121. package/src/widgets/ReactElementWrapper.spec.tsx +37 -37
  122. package/src/widgets/autoFocus.ts +9 -9
  123. package/src/widgets/cx.ts +63 -63
  124. package/src/widgets/form/Checkbox.tsx +0 -1
  125. package/src/widgets/form/ColorField.tsx +15 -12
  126. package/src/widgets/form/DateTimeField.tsx +0 -2
  127. package/src/widgets/form/DateTimePicker.tsx +0 -2
  128. package/src/widgets/form/Radio.tsx +0 -1
  129. package/src/widgets/form/Slider.tsx +12 -4
  130. package/src/widgets/form/Switch.tsx +2 -3
  131. package/src/widgets/form/ValidationGroup.spec.tsx +12 -12
  132. package/src/widgets/form/Wheel.tsx +0 -1
  133. package/src/widgets/grid/Grid.tsx +0 -1
  134. package/src/widgets/grid/GridCellEditor.tsx +7 -1
  135. package/src/widgets/icons/calendar.tsx +20 -15
  136. package/src/widgets/icons/check.tsx +2 -1
  137. package/src/widgets/icons/clear.tsx +2 -1
  138. package/src/widgets/icons/close.tsx +2 -2
  139. package/src/widgets/icons/cx.tsx +2 -1
  140. package/src/widgets/icons/drop-down.tsx +2 -1
  141. package/src/widgets/icons/file.tsx +2 -1
  142. package/src/widgets/icons/folder-open.tsx +2 -1
  143. package/src/widgets/icons/folder.tsx +2 -1
  144. package/src/widgets/icons/forward.tsx +2 -1
  145. package/src/widgets/icons/loading.tsx +2 -1
  146. package/src/widgets/icons/menu.tsx +2 -1
  147. package/src/widgets/icons/pixel-picker.tsx +2 -2
  148. package/src/widgets/icons/search.tsx +2 -1
  149. package/src/widgets/icons/sort-asc.tsx +2 -1
  150. package/src/widgets/icons/square.tsx +2 -1
  151. package/src/widgets/nav/Route.spec.tsx +2 -2
  152. package/src/widgets/overlay/Overlay.tsx +5 -1
  153. package/src/widgets/overlay/captureMouse.ts +195 -195
  154. package/src/widgets/overlay/createHotPromiseWindowFactory.ts +71 -71
  155. package/src/widgets/overlay/index.d.ts +11 -11
  156. package/src/widgets/overlay/tooltip-ops.ts +173 -173
  157. package/build/data/ArrayElementView.spec.d.ts +0 -1
  158. package/build/data/ArrayElementView.spec.js +0 -81
  159. package/build/data/Binding.spec.d.ts +0 -1
  160. package/build/data/Binding.spec.js +0 -61
  161. package/build/data/Expression.spec.d.ts +0 -1
  162. package/build/data/Expression.spec.js +0 -196
  163. package/build/data/Grouper.spec.d.ts +0 -1
  164. package/build/data/Grouper.spec.js +0 -48
  165. package/build/data/Ref.spec.d.ts +0 -1
  166. package/build/data/Ref.spec.js +0 -72
  167. package/build/data/Store.spec.d.ts +0 -1
  168. package/build/data/Store.spec.js +0 -19
  169. package/build/data/StoreRef.spec.d.ts +0 -1
  170. package/build/data/StoreRef.spec.js +0 -22
  171. package/build/data/StringTemplate.spec.d.ts +0 -1
  172. package/build/data/StringTemplate.spec.js +0 -112
  173. package/build/data/StructuredSelector.spec.d.ts +0 -1
  174. package/build/data/StructuredSelector.spec.js +0 -102
  175. package/build/data/View.spec.d.ts +0 -1
  176. package/build/data/View.spec.js +0 -44
  177. package/build/data/ZoomIntoPropertyView.spec.d.ts +0 -1
  178. package/build/data/ZoomIntoPropertyView.spec.js +0 -54
  179. package/build/data/comparer.spec.d.ts +0 -1
  180. package/build/data/comparer.spec.js +0 -50
  181. package/build/data/computable.spec.d.ts +0 -1
  182. package/build/data/computable.spec.js +0 -56
  183. package/build/data/createAccessorModelProxy.spec.d.ts +0 -1
  184. package/build/data/createAccessorModelProxy.spec.js +0 -30
  185. package/build/data/createStructuredSelector.spec.d.ts +0 -1
  186. package/build/data/createStructuredSelector.spec.js +0 -42
  187. package/build/data/diff/diffs.spec.d.ts +0 -1
  188. package/build/data/diff/diffs.spec.js +0 -45
  189. package/build/data/getAccessor.spec.d.ts +0 -1
  190. package/build/data/getAccessor.spec.js +0 -10
  191. package/build/data/getSelector.spec.d.ts +0 -1
  192. package/build/data/getSelector.spec.js +0 -36
  193. package/build/data/ops/append.spec.d.ts +0 -1
  194. package/build/data/ops/append.spec.js +0 -24
  195. package/build/data/ops/filter.spec.d.ts +0 -1
  196. package/build/data/ops/filter.spec.js +0 -25
  197. package/build/data/ops/findTreeNode.spec.d.ts +0 -1
  198. package/build/data/ops/findTreeNode.spec.js +0 -20
  199. package/build/data/ops/merge.spec.d.ts +0 -1
  200. package/build/data/ops/merge.spec.js +0 -23
  201. package/build/data/ops/removeTreeNodes.spec.d.ts +0 -1
  202. package/build/data/ops/removeTreeNodes.spec.js +0 -35
  203. package/build/data/ops/updateArray.spec.d.ts +0 -1
  204. package/build/data/ops/updateArray.spec.js +0 -33
  205. package/build/data/ops/updateTree.spec.d.ts +0 -1
  206. package/build/data/ops/updateTree.spec.js +0 -44
  207. package/build/hooks/invokeCallback.spec.d.ts +0 -1
  208. package/build/hooks/invokeCallback.spec.js +0 -44
  209. package/build/hooks/resolveCallback.spec.d.ts +0 -1
  210. package/build/hooks/resolveCallback.spec.js +0 -35
  211. package/build/hooks/store.spec.d.ts +0 -1
  212. package/build/hooks/store.spec.js +0 -48
  213. package/build/hooks/useTrigger.spec.d.ts +0 -1
  214. package/build/hooks/useTrigger.spec.js +0 -59
  215. package/build/ui/Controller.spec.d.ts +0 -1
  216. package/build/ui/Controller.spec.js +0 -247
  217. package/build/ui/Cx.spec.d.ts +0 -1
  218. package/build/ui/Cx.spec.js +0 -153
  219. package/build/ui/DataProxy.spec.d.ts +0 -1
  220. package/build/ui/DataProxy.spec.js +0 -208
  221. package/build/ui/IsolatedScope.spec.d.ts +0 -1
  222. package/build/ui/IsolatedScope.spec.js +0 -42
  223. package/build/ui/PureContainer.spec.d.ts +0 -1
  224. package/build/ui/PureContainer.spec.js +0 -149
  225. package/build/ui/Repeater.spec.d.ts +0 -1
  226. package/build/ui/Repeater.spec.js +0 -109
  227. package/build/ui/Rescope.spec.d.ts +0 -1
  228. package/build/ui/Rescope.spec.js +0 -134
  229. package/build/ui/Restate.spec.d.ts +0 -1
  230. package/build/ui/Restate.spec.js +0 -257
  231. package/build/ui/adapter/ArrayAdapter.spec.d.ts +0 -1
  232. package/build/ui/adapter/ArrayAdapter.spec.js +0 -44
  233. package/build/ui/adapter/TreeAdapter.spec.d.ts +0 -1
  234. package/build/ui/adapter/TreeAdapter.spec.js +0 -71
  235. package/build/ui/app/Url.spec.d.ts +0 -1
  236. package/build/ui/app/Url.spec.js +0 -43
  237. package/build/ui/createFunctionalComponent.spec.d.ts +0 -1
  238. package/build/ui/createFunctionalComponent.spec.js +0 -272
  239. package/build/ui/layout/ContentPlaceholder.spec.d.ts +0 -1
  240. package/build/ui/layout/ContentPlaceholder.spec.js +0 -333
  241. package/build/ui/layout/FirstVisibleChildLayout.spec.d.ts +0 -1
  242. package/build/ui/layout/FirstVisibleChildLayout.spec.js +0 -101
  243. package/build/util/Format.spec.d.ts +0 -1
  244. package/build/util/Format.spec.js +0 -58
  245. package/build/util/TraversalStack.spec.d.ts +0 -1
  246. package/build/util/TraversalStack.spec.js +0 -43
  247. package/build/util/date/upperBoundCheck.spec.d.ts +0 -1
  248. package/build/util/date/upperBoundCheck.spec.js +0 -22
  249. package/build/util/getSearchQueryPredicate.spec.d.ts +0 -1
  250. package/build/util/getSearchQueryPredicate.spec.js +0 -33
  251. package/build/util/isValidIdentifierName.spec.d.ts +0 -1
  252. package/build/util/isValidIdentifierName.spec.js +0 -28
  253. package/build/util/routeAppend.spec.d.ts +0 -1
  254. package/build/util/routeAppend.spec.js +0 -14
  255. package/build/widgets/AccessorBindings.spec.d.ts +0 -1
  256. package/build/widgets/AccessorBindings.spec.js +0 -40
  257. package/build/widgets/HtmlElement.spec.d.ts +0 -1
  258. package/build/widgets/HtmlElement.spec.js +0 -38
  259. package/build/widgets/form/ValidationGroup.spec.d.ts +0 -1
  260. package/build/widgets/form/ValidationGroup.spec.js +0 -62
  261. package/build/widgets/nav/Route.spec.d.ts +0 -1
  262. package/build/widgets/nav/Route.spec.js +0 -15
  263. package/dist/manifest.d.ts +0 -1443
@@ -1,76 +1,76 @@
1
- import { RenderingContext } from "../RenderingContext";
2
- import { Instance } from "../Instance";
3
- import { TreeAdapter } from "./TreeAdapter";
4
- import assert from "assert";
5
- import { Store } from "../../data";
6
-
7
- describe("TreeAdapter", () => {
8
- it("properly expands records", () => {
9
- let tree = new TreeAdapter({
10
- childrenField: "children",
11
- expandedField: "expanded",
12
- });
13
-
14
- let data = [
15
- {
16
- id: 1,
17
- text: "1",
18
- expanded: false,
19
- children: [
20
- {
21
- id: 4,
22
- text: "4",
23
- },
24
- ],
25
- },
26
- {
27
- id: 2,
28
- text: "2",
29
- expanded: true,
30
- children: [
31
- {
32
- id: 3,
33
- text: "3",
34
- expanded: true,
35
- children: [
36
- {
37
- id: 5,
38
- text: "5",
39
- expanded: true,
40
- children: [
41
- {
42
- id: 6,
43
- text: "6",
44
- },
45
- ],
46
- },
47
- ],
48
- },
49
- ],
50
- },
51
- {
52
- id: 7,
53
- text: "7",
54
- expanded: false,
55
- },
56
- ];
57
-
58
- let store = new Store();
59
-
60
- let records = tree.mapRecords(new RenderingContext(), new Instance(null!, "1", null!, store), data, store);
61
-
62
- assert.equal(records.length, 6);
63
- assert.equal(records[0].data.id, 1);
64
- assert.equal(records[1].data.id, 2);
65
- assert.equal(records[2].data.id, 3);
66
- assert.equal(records[3].data.id, 5);
67
- assert.equal(records[4].data.id, 6);
68
- assert.equal(records[5].data.id, 7);
69
- assert.equal(records[5].store.get("$record.id"), 7);
70
- assert.equal(records[2].store.get("$record.id"), 3);
71
- assert.equal(records[3].store.get("$record.id"), 5);
72
- assert.equal(records[2].store.get("$record.id"), 3);
73
- assert.equal(records[0].store.get("$record.id"), 1);
74
- assert.equal(records[1].store.get("$record.id"), 2);
75
- });
76
- });
1
+ import { RenderingContext } from "../RenderingContext";
2
+ import { Instance } from "../Instance";
3
+ import { TreeAdapter } from "./TreeAdapter";
4
+ import assert from "assert";
5
+ import { Store } from "../../data";
6
+
7
+ describe("TreeAdapter", () => {
8
+ it("properly expands records", () => {
9
+ let tree = new TreeAdapter({
10
+ childrenField: "children",
11
+ expandedField: "expanded",
12
+ });
13
+
14
+ let data = [
15
+ {
16
+ id: 1,
17
+ text: "1",
18
+ expanded: false,
19
+ children: [
20
+ {
21
+ id: 4,
22
+ text: "4",
23
+ },
24
+ ],
25
+ },
26
+ {
27
+ id: 2,
28
+ text: "2",
29
+ expanded: true,
30
+ children: [
31
+ {
32
+ id: 3,
33
+ text: "3",
34
+ expanded: true,
35
+ children: [
36
+ {
37
+ id: 5,
38
+ text: "5",
39
+ expanded: true,
40
+ children: [
41
+ {
42
+ id: 6,
43
+ text: "6",
44
+ },
45
+ ],
46
+ },
47
+ ],
48
+ },
49
+ ],
50
+ },
51
+ {
52
+ id: 7,
53
+ text: "7",
54
+ expanded: false,
55
+ },
56
+ ];
57
+
58
+ let store = new Store();
59
+
60
+ let records = tree.mapRecords(new RenderingContext(), new Instance(null!, "1", null!, store), data, store);
61
+
62
+ assert.equal(records.length, 6);
63
+ assert.equal(records[0].data.id, 1);
64
+ assert.equal(records[1].data.id, 2);
65
+ assert.equal(records[2].data.id, 3);
66
+ assert.equal(records[3].data.id, 5);
67
+ assert.equal(records[4].data.id, 6);
68
+ assert.equal(records[5].data.id, 7);
69
+ assert.equal(records[5].store.get("$record.id"), 7);
70
+ assert.equal(records[2].store.get("$record.id"), 3);
71
+ assert.equal(records[3].store.get("$record.id"), 5);
72
+ assert.equal(records[2].store.get("$record.id"), 3);
73
+ assert.equal(records[0].store.get("$record.id"), 1);
74
+ assert.equal(records[1].store.get("$record.id"), 2);
75
+ });
76
+ });
@@ -1,185 +1,185 @@
1
- import { Accessor, getAccessor } from "../../data/getAccessor";
2
- import { isArray } from "../../util/isArray";
3
- import { ArrayAdapter, ArrayAdapterConfig, RecordStoreCache } from "./ArrayAdapter";
4
- import { DataAdapterRecord } from "./DataAdapter";
5
- import { RenderingContext } from "../RenderingContext";
6
- import { Instance } from "../Instance";
7
- import { View } from "../../data/View";
8
- import { Sorter } from "../Prop";
9
-
10
- export interface TreeNode {
11
- $level?: number;
12
- $expanded?: boolean;
13
- $leaf?: boolean;
14
- $loading?: boolean;
15
- $loaded?: boolean;
16
- [key: string]: any;
17
- }
18
-
19
- export interface ExpandedState {
20
- current?: Set<string | number>;
21
- next: Set<string | number>;
22
- }
23
-
24
- export interface TreeAdapterConfig extends ArrayAdapterConfig {
25
- childrenField?: string;
26
- expandedField?: string;
27
- leafField?: string;
28
- loadingField?: string;
29
- loadedField?: string;
30
- onLoadError?: (response: any) => void;
31
- foldersFirst?: boolean;
32
- hideRootNodes?: boolean;
33
- restoreExpandedNodesOnLoad?: boolean;
34
- load?: (context: RenderingContext, instance: Instance, data: TreeNode) => Promise<any[]> | any[];
35
- }
36
-
37
- export class TreeAdapter<T extends TreeNode = TreeNode> extends ArrayAdapter<T> {
38
- declare public childrenField: string;
39
- declare public expandedField: string;
40
- declare public leafField: string;
41
- declare public loadingField: string;
42
- declare public loadedField: string;
43
- declare public onLoadError?: (response: any) => void;
44
- declare public foldersFirst: boolean;
45
- declare public hideRootNodes: boolean;
46
- declare public restoreExpandedNodesOnLoad?: boolean;
47
- declare public load?: (context: RenderingContext, instance: Instance, data: T) => Promise<any[]> | any[];
48
-
49
- declare protected childrenAccessor?: Accessor;
50
- declare protected expandedState?: ExpandedState;
51
-
52
- constructor(config?: TreeAdapterConfig) {
53
- super(config);
54
- }
55
-
56
- public init(): void {
57
- super.init();
58
- this.childrenAccessor = getAccessor({ bind: `${this.recordName}.${this.childrenField}` });
59
-
60
- if (this.restoreExpandedNodesOnLoad) {
61
- if (!this.keyField) {
62
- throw new Error(
63
- "Stateful tree adapter requires keyField property to be specified on either Grid or data adapter.",
64
- );
65
- }
66
-
67
- this.expandedState = {
68
- next: new Set(),
69
- };
70
- }
71
- }
72
-
73
- public mapRecords(
74
- context: RenderingContext,
75
- instance: Instance & Partial<RecordStoreCache>,
76
- data: T[],
77
- parentStore: View,
78
- recordsAccessor?: Accessor,
79
- ): DataAdapterRecord<T>[] {
80
- const nodes = super.mapRecords(context, instance, data, parentStore, recordsAccessor);
81
- const result: DataAdapterRecord<T>[] = [];
82
-
83
- if (this.restoreExpandedNodesOnLoad) {
84
- this.expandedState = {
85
- current: this.expandedState!.next,
86
- next: new Set(),
87
- };
88
- }
89
-
90
- this.processList(context, instance, 0, "", nodes, result);
91
-
92
- return result;
93
- }
94
-
95
- protected processList(
96
- context: RenderingContext,
97
- instance: Instance & Partial<RecordStoreCache>,
98
- level: number,
99
- parentKey: string,
100
- nodes: DataAdapterRecord<T>[],
101
- result: DataAdapterRecord<T>[],
102
- ): void {
103
- nodes.forEach((record) => {
104
- record.key = parentKey + record.key;
105
- this.processNode(context, instance, level, result, record);
106
- });
107
- }
108
-
109
- protected processNode(
110
- context: RenderingContext,
111
- instance: Instance & Partial<RecordStoreCache>,
112
- level: number,
113
- result: DataAdapterRecord<T>[],
114
- record: DataAdapterRecord<T>,
115
- ): void {
116
- const isHiddenRootNode = level === 0 && this.hideRootNodes;
117
- if (!isHiddenRootNode) {
118
- result.push(record);
119
- }
120
-
121
- const { data, store } = record;
122
- const dataRecord = data as any;
123
- dataRecord.$level = this.hideRootNodes ? level - 1 : level;
124
-
125
- if (!dataRecord[this.leafField]) {
126
- if (this.restoreExpandedNodesOnLoad && dataRecord[this.expandedField] == null) {
127
- dataRecord[this.expandedField] = this.expandedState!.current!.has(dataRecord[this.keyField!]);
128
- }
129
-
130
- if (dataRecord[this.expandedField] || isHiddenRootNode) {
131
- if (this.restoreExpandedNodesOnLoad) {
132
- this.expandedState!.next.add(dataRecord[this.keyField!]);
133
- }
134
-
135
- if (dataRecord[this.childrenField]) {
136
- const childNodes = super.mapRecords(
137
- context,
138
- instance,
139
- dataRecord[this.childrenField],
140
- store,
141
- this.childrenAccessor,
142
- );
143
- this.processList(context, instance, level + 1, record.key + ":", childNodes, result);
144
- } else if (this.load && !dataRecord[this.loadedField] && !dataRecord[this.loadingField]) {
145
- store.set(`${this.recordName}.${this.loadingField}`, true);
146
- const response = this.load(context, instance, data);
147
- Promise.resolve(response)
148
- .then((children) => {
149
- store.set(`${this.recordName}.${this.childrenField}`, children);
150
- store.set(`${this.recordName}.${this.loadedField}`, true);
151
- store.set(`${this.recordName}.${this.loadingField}`, false);
152
- })
153
- .catch((response) => {
154
- store.set(`${this.recordName}.${this.loadingField}`, false);
155
- if (this.onLoadError) {
156
- this.onLoadError(response);
157
- }
158
- });
159
- }
160
- } else {
161
- dataRecord[this.expandedField] = false;
162
- }
163
- }
164
- }
165
-
166
- public sort(sorters?: Sorter[]): void {
167
- if (this.foldersFirst) {
168
- if (!sorters || !isArray(sorters)) {
169
- sorters = [];
170
- }
171
- sorters = [{ field: this.leafField, direction: "ASC" }, ...sorters];
172
- }
173
- super.sort(sorters);
174
- }
175
- }
176
-
177
- TreeAdapter.prototype.childrenField = "$children";
178
- TreeAdapter.prototype.expandedField = "$expanded";
179
- TreeAdapter.prototype.leafField = "$leaf";
180
- TreeAdapter.prototype.loadingField = "$loading";
181
- TreeAdapter.prototype.loadedField = "$loaded";
182
- TreeAdapter.prototype.foldersFirst = true;
183
- TreeAdapter.prototype.isTreeAdapter = true;
184
- TreeAdapter.prototype.hideRootNodes = false;
185
- TreeAdapter.prototype.cacheByKeyField = false;
1
+ import { Accessor, getAccessor } from "../../data/getAccessor";
2
+ import { isArray } from "../../util/isArray";
3
+ import { ArrayAdapter, ArrayAdapterConfig, RecordStoreCache } from "./ArrayAdapter";
4
+ import { DataAdapterRecord } from "./DataAdapter";
5
+ import { RenderingContext } from "../RenderingContext";
6
+ import { Instance } from "../Instance";
7
+ import { View } from "../../data/View";
8
+ import { Sorter } from "../Prop";
9
+
10
+ export interface TreeNode {
11
+ $level?: number;
12
+ $expanded?: boolean;
13
+ $leaf?: boolean;
14
+ $loading?: boolean;
15
+ $loaded?: boolean;
16
+ [key: string]: any;
17
+ }
18
+
19
+ export interface ExpandedState {
20
+ current?: Set<string | number>;
21
+ next: Set<string | number>;
22
+ }
23
+
24
+ export interface TreeAdapterConfig extends ArrayAdapterConfig {
25
+ childrenField?: string;
26
+ expandedField?: string;
27
+ leafField?: string;
28
+ loadingField?: string;
29
+ loadedField?: string;
30
+ onLoadError?: (response: any) => void;
31
+ foldersFirst?: boolean;
32
+ hideRootNodes?: boolean;
33
+ restoreExpandedNodesOnLoad?: boolean;
34
+ load?: (context: RenderingContext, instance: Instance, data: TreeNode) => Promise<any[]> | any[];
35
+ }
36
+
37
+ export class TreeAdapter<T extends TreeNode = TreeNode> extends ArrayAdapter<T> {
38
+ declare public childrenField: string;
39
+ declare public expandedField: string;
40
+ declare public leafField: string;
41
+ declare public loadingField: string;
42
+ declare public loadedField: string;
43
+ declare public onLoadError?: (response: any) => void;
44
+ declare public foldersFirst: boolean;
45
+ declare public hideRootNodes: boolean;
46
+ declare public restoreExpandedNodesOnLoad?: boolean;
47
+ declare public load?: (context: RenderingContext, instance: Instance, data: T) => Promise<any[]> | any[];
48
+
49
+ declare protected childrenAccessor?: Accessor;
50
+ declare protected expandedState?: ExpandedState;
51
+
52
+ constructor(config?: TreeAdapterConfig) {
53
+ super(config);
54
+ }
55
+
56
+ public init(): void {
57
+ super.init();
58
+ this.childrenAccessor = getAccessor({ bind: `${this.recordName}.${this.childrenField}` });
59
+
60
+ if (this.restoreExpandedNodesOnLoad) {
61
+ if (!this.keyField) {
62
+ throw new Error(
63
+ "Stateful tree adapter requires keyField property to be specified on either Grid or data adapter.",
64
+ );
65
+ }
66
+
67
+ this.expandedState = {
68
+ next: new Set(),
69
+ };
70
+ }
71
+ }
72
+
73
+ public mapRecords(
74
+ context: RenderingContext,
75
+ instance: Instance & Partial<RecordStoreCache>,
76
+ data: T[],
77
+ parentStore: View,
78
+ recordsAccessor?: Accessor,
79
+ ): DataAdapterRecord<T>[] {
80
+ const nodes = super.mapRecords(context, instance, data, parentStore, recordsAccessor);
81
+ const result: DataAdapterRecord<T>[] = [];
82
+
83
+ if (this.restoreExpandedNodesOnLoad) {
84
+ this.expandedState = {
85
+ current: this.expandedState!.next,
86
+ next: new Set(),
87
+ };
88
+ }
89
+
90
+ this.processList(context, instance, 0, "", nodes, result);
91
+
92
+ return result;
93
+ }
94
+
95
+ protected processList(
96
+ context: RenderingContext,
97
+ instance: Instance & Partial<RecordStoreCache>,
98
+ level: number,
99
+ parentKey: string,
100
+ nodes: DataAdapterRecord<T>[],
101
+ result: DataAdapterRecord<T>[],
102
+ ): void {
103
+ nodes.forEach((record) => {
104
+ record.key = parentKey + record.key;
105
+ this.processNode(context, instance, level, result, record);
106
+ });
107
+ }
108
+
109
+ protected processNode(
110
+ context: RenderingContext,
111
+ instance: Instance & Partial<RecordStoreCache>,
112
+ level: number,
113
+ result: DataAdapterRecord<T>[],
114
+ record: DataAdapterRecord<T>,
115
+ ): void {
116
+ const isHiddenRootNode = level === 0 && this.hideRootNodes;
117
+ if (!isHiddenRootNode) {
118
+ result.push(record);
119
+ }
120
+
121
+ const { data, store } = record;
122
+ const dataRecord = data as any;
123
+ dataRecord.$level = this.hideRootNodes ? level - 1 : level;
124
+
125
+ if (!dataRecord[this.leafField]) {
126
+ if (this.restoreExpandedNodesOnLoad && dataRecord[this.expandedField] == null) {
127
+ dataRecord[this.expandedField] = this.expandedState!.current!.has(dataRecord[this.keyField!]);
128
+ }
129
+
130
+ if (dataRecord[this.expandedField] || isHiddenRootNode) {
131
+ if (this.restoreExpandedNodesOnLoad) {
132
+ this.expandedState!.next.add(dataRecord[this.keyField!]);
133
+ }
134
+
135
+ if (dataRecord[this.childrenField]) {
136
+ const childNodes = super.mapRecords(
137
+ context,
138
+ instance,
139
+ dataRecord[this.childrenField],
140
+ store,
141
+ this.childrenAccessor,
142
+ );
143
+ this.processList(context, instance, level + 1, record.key + ":", childNodes, result);
144
+ } else if (this.load && !dataRecord[this.loadedField] && !dataRecord[this.loadingField]) {
145
+ store.set(`${this.recordName}.${this.loadingField}`, true);
146
+ const response = this.load(context, instance, data);
147
+ Promise.resolve(response)
148
+ .then((children) => {
149
+ store.set(`${this.recordName}.${this.childrenField}`, children);
150
+ store.set(`${this.recordName}.${this.loadedField}`, true);
151
+ store.set(`${this.recordName}.${this.loadingField}`, false);
152
+ })
153
+ .catch((response) => {
154
+ store.set(`${this.recordName}.${this.loadingField}`, false);
155
+ if (this.onLoadError) {
156
+ this.onLoadError(response);
157
+ }
158
+ });
159
+ }
160
+ } else {
161
+ dataRecord[this.expandedField] = false;
162
+ }
163
+ }
164
+ }
165
+
166
+ public sort(sorters?: Sorter[]): void {
167
+ if (this.foldersFirst) {
168
+ if (!sorters || !isArray(sorters)) {
169
+ sorters = [];
170
+ }
171
+ sorters = [{ field: this.leafField, direction: "ASC" }, ...sorters];
172
+ }
173
+ super.sort(sorters);
174
+ }
175
+ }
176
+
177
+ TreeAdapter.prototype.childrenField = "$children";
178
+ TreeAdapter.prototype.expandedField = "$expanded";
179
+ TreeAdapter.prototype.leafField = "$leaf";
180
+ TreeAdapter.prototype.loadingField = "$loading";
181
+ TreeAdapter.prototype.loadedField = "$loaded";
182
+ TreeAdapter.prototype.foldersFirst = true;
183
+ TreeAdapter.prototype.isTreeAdapter = true;
184
+ TreeAdapter.prototype.hideRootNodes = false;
185
+ TreeAdapter.prototype.cacheByKeyField = false;