cx 26.0.11 → 26.0.13

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 (366) hide show
  1. package/build/charts/ScatterGraph.d.ts +4 -4
  2. package/build/charts/ScatterGraph.js +2 -2
  3. package/build/data/ArrayElementView.spec.d.ts +1 -0
  4. package/build/data/ArrayElementView.spec.js +81 -0
  5. package/build/data/Binding.spec.d.ts +1 -0
  6. package/build/data/Binding.spec.js +61 -0
  7. package/build/data/Expression.spec.d.ts +1 -0
  8. package/build/data/Expression.spec.js +196 -0
  9. package/build/data/Grouper.spec.d.ts +1 -0
  10. package/build/data/Grouper.spec.js +48 -0
  11. package/build/data/Ref.spec.d.ts +1 -0
  12. package/build/data/Ref.spec.js +72 -0
  13. package/build/data/Selector.d.ts +1 -1
  14. package/build/data/Store.spec.d.ts +1 -0
  15. package/build/data/Store.spec.js +19 -0
  16. package/build/data/StoreRef.spec.d.ts +1 -0
  17. package/build/data/StoreRef.spec.js +22 -0
  18. package/build/data/StringTemplate.spec.d.ts +1 -0
  19. package/build/data/StringTemplate.spec.js +112 -0
  20. package/build/data/StructuredSelector.spec.d.ts +1 -0
  21. package/build/data/StructuredSelector.spec.js +102 -0
  22. package/build/data/View.spec.d.ts +1 -0
  23. package/build/data/View.spec.js +44 -0
  24. package/build/data/ZoomIntoPropertyView.spec.d.ts +1 -0
  25. package/build/data/ZoomIntoPropertyView.spec.js +54 -0
  26. package/build/data/comparer.spec.d.ts +1 -0
  27. package/build/data/comparer.spec.js +50 -0
  28. package/build/data/computable.d.ts +3 -6
  29. package/build/data/computable.spec.d.ts +1 -0
  30. package/build/data/computable.spec.js +56 -0
  31. package/build/data/createAccessorModelProxy.d.ts +5 -3
  32. package/build/data/createAccessorModelProxy.spec.d.ts +1 -0
  33. package/build/data/createAccessorModelProxy.spec.js +30 -0
  34. package/build/data/createStructuredSelector.spec.d.ts +1 -0
  35. package/build/data/createStructuredSelector.spec.js +42 -0
  36. package/build/data/diff/diffs.spec.d.ts +1 -0
  37. package/build/data/diff/diffs.spec.js +45 -0
  38. package/build/data/getAccessor.spec.d.ts +1 -0
  39. package/build/data/getAccessor.spec.js +10 -0
  40. package/build/data/getSelector.spec.d.ts +1 -0
  41. package/build/data/getSelector.spec.js +36 -0
  42. package/build/data/ops/append.spec.d.ts +1 -0
  43. package/build/data/ops/append.spec.js +24 -0
  44. package/build/data/ops/filter.spec.d.ts +1 -0
  45. package/build/data/ops/filter.spec.js +25 -0
  46. package/build/data/ops/findTreeNode.d.ts +1 -1
  47. package/build/data/ops/findTreeNode.js +1 -1
  48. package/build/data/ops/findTreeNode.spec.d.ts +1 -0
  49. package/build/data/ops/findTreeNode.spec.js +20 -0
  50. package/build/data/ops/findTreePath.d.ts +1 -1
  51. package/build/data/ops/merge.spec.d.ts +1 -0
  52. package/build/data/ops/merge.spec.js +23 -0
  53. package/build/data/ops/removeTreeNodes.d.ts +1 -1
  54. package/build/data/ops/removeTreeNodes.js +1 -1
  55. package/build/data/ops/removeTreeNodes.spec.d.ts +1 -0
  56. package/build/data/ops/removeTreeNodes.spec.js +35 -0
  57. package/build/data/ops/updateArray.spec.d.ts +1 -0
  58. package/build/data/ops/updateArray.spec.js +33 -0
  59. package/build/data/ops/updateTree.d.ts +1 -1
  60. package/build/data/ops/updateTree.spec.d.ts +1 -0
  61. package/build/data/ops/updateTree.spec.js +44 -0
  62. package/build/hooks/invokeCallback.spec.d.ts +1 -0
  63. package/build/hooks/invokeCallback.spec.js +44 -0
  64. package/build/hooks/resolveCallback.spec.d.ts +1 -0
  65. package/build/hooks/resolveCallback.spec.js +35 -0
  66. package/build/hooks/store.spec.d.ts +1 -0
  67. package/build/hooks/store.spec.js +48 -0
  68. package/build/hooks/useTrigger.spec.d.ts +1 -0
  69. package/build/hooks/useTrigger.spec.js +59 -0
  70. package/build/jsx-runtime.d.ts +10 -10
  71. package/build/jsx-runtime.js +6 -0
  72. package/build/svg/util/Rect.d.ts +1 -1
  73. package/build/ui/ContentResolver.d.ts +16 -6
  74. package/build/ui/Controller.d.ts +7 -0
  75. package/build/ui/Controller.js +2 -1
  76. package/build/ui/Controller.spec.d.ts +1 -0
  77. package/build/ui/Controller.spec.js +247 -0
  78. package/build/ui/Cx.spec.d.ts +1 -0
  79. package/build/ui/Cx.spec.js +153 -0
  80. package/build/ui/DataProxy.spec.d.ts +1 -0
  81. package/build/ui/DataProxy.spec.js +208 -0
  82. package/build/ui/Instance.d.ts +1 -1
  83. package/build/ui/Instance.js +10 -10
  84. package/build/ui/IsolatedScope.spec.d.ts +1 -0
  85. package/build/ui/IsolatedScope.spec.js +42 -0
  86. package/build/ui/Prop.d.ts +12 -1
  87. package/build/ui/PureContainer.spec.d.ts +1 -0
  88. package/build/ui/PureContainer.spec.js +149 -0
  89. package/build/ui/Repeater.d.ts +3 -3
  90. package/build/ui/Repeater.spec.d.ts +1 -0
  91. package/build/ui/Repeater.spec.js +109 -0
  92. package/build/ui/Rescope.spec.d.ts +1 -0
  93. package/build/ui/Rescope.spec.js +134 -0
  94. package/build/ui/Restate.spec.d.ts +1 -0
  95. package/build/ui/Restate.spec.js +257 -0
  96. package/build/ui/Text.d.ts +14 -2
  97. package/build/ui/Text.js +3 -0
  98. package/build/ui/adapter/ArrayAdapter.js +4 -1
  99. package/build/ui/adapter/ArrayAdapter.spec.d.ts +1 -0
  100. package/build/ui/adapter/ArrayAdapter.spec.js +44 -0
  101. package/build/ui/adapter/TreeAdapter.spec.d.ts +1 -0
  102. package/build/ui/adapter/TreeAdapter.spec.js +71 -0
  103. package/build/ui/app/Url.spec.d.ts +1 -0
  104. package/build/ui/app/Url.spec.js +43 -0
  105. package/build/ui/app/startHotAppLoop.js +1 -1
  106. package/build/ui/createFunctionalComponent.d.ts +14 -1
  107. package/build/ui/createFunctionalComponent.js +7 -4
  108. package/build/ui/createFunctionalComponent.spec.d.ts +1 -0
  109. package/build/ui/createFunctionalComponent.spec.js +272 -0
  110. package/build/ui/expr.d.ts +3 -1
  111. package/build/ui/exprHelpers.d.ts +32 -0
  112. package/build/ui/exprHelpers.js +61 -0
  113. package/build/ui/index.d.ts +1 -0
  114. package/build/ui/index.js +1 -0
  115. package/build/ui/layout/ContentPlaceholder.spec.d.ts +1 -0
  116. package/build/ui/layout/ContentPlaceholder.spec.js +333 -0
  117. package/build/ui/layout/FirstVisibleChildLayout.spec.d.ts +1 -0
  118. package/build/ui/layout/FirstVisibleChildLayout.spec.js +101 -0
  119. package/build/ui/selection/KeySelection.d.ts +0 -8
  120. package/build/ui/selection/Selection.d.ts +9 -3
  121. package/build/util/Console.d.ts +1 -0
  122. package/build/util/Console.js +7 -3
  123. package/build/util/Format.spec.d.ts +1 -0
  124. package/build/util/Format.spec.js +58 -0
  125. package/build/util/TraversalStack.spec.d.ts +1 -0
  126. package/build/util/TraversalStack.spec.js +43 -0
  127. package/build/util/date/upperBoundCheck.spec.d.ts +1 -0
  128. package/build/util/date/upperBoundCheck.spec.js +22 -0
  129. package/build/util/getSearchQueryPredicate.spec.d.ts +1 -0
  130. package/build/util/getSearchQueryPredicate.spec.js +33 -0
  131. package/build/util/isValidIdentifierName.spec.d.ts +1 -0
  132. package/build/util/isValidIdentifierName.spec.js +28 -0
  133. package/build/util/routeAppend.spec.d.ts +1 -0
  134. package/build/util/routeAppend.spec.js +14 -0
  135. package/build/widgets/AccessorBindings.spec.d.ts +1 -0
  136. package/build/widgets/AccessorBindings.spec.js +40 -0
  137. package/build/widgets/Button.d.ts +3 -6
  138. package/build/widgets/Button.js +1 -1
  139. package/build/widgets/DocumentTitle.d.ts +2 -0
  140. package/build/widgets/Heading.d.ts +2 -2
  141. package/build/widgets/HtmlElement.d.ts +33 -8
  142. package/build/widgets/HtmlElement.js +7 -9
  143. package/build/widgets/HtmlElement.spec.d.ts +1 -0
  144. package/build/widgets/HtmlElement.spec.js +38 -0
  145. package/build/widgets/Icon.d.ts +3 -13
  146. package/build/widgets/List.d.ts +4 -0
  147. package/build/widgets/ReactElementWrapper.d.ts +29 -0
  148. package/build/widgets/ReactElementWrapper.js +59 -0
  149. package/build/widgets/drag-drop/DragSource.d.ts +3 -3
  150. package/build/widgets/drag-drop/DragSource.js +2 -3
  151. package/build/widgets/drag-drop/DropZone.d.ts +3 -3
  152. package/build/widgets/drag-drop/DropZone.js +2 -3
  153. package/build/widgets/form/Checkbox.d.ts +2 -0
  154. package/build/widgets/form/ColorField.d.ts +2 -0
  155. package/build/widgets/form/DateTimeField.d.ts +2 -0
  156. package/build/widgets/form/Field.d.ts +0 -2
  157. package/build/widgets/form/LabeledContainer.d.ts +9 -8
  158. package/build/widgets/form/LabeledContainer.js +9 -9
  159. package/build/widgets/form/LookupField.d.ts +57 -9
  160. package/build/widgets/form/MonthField.d.ts +2 -0
  161. package/build/widgets/form/NumberField.d.ts +2 -0
  162. package/build/widgets/form/Radio.d.ts +2 -0
  163. package/build/widgets/form/Select.d.ts +2 -0
  164. package/build/widgets/form/Slider.d.ts +3 -0
  165. package/build/widgets/form/Switch.d.ts +2 -0
  166. package/build/widgets/form/TextField.d.ts +34 -0
  167. package/build/widgets/form/TimeList.d.ts +16 -1
  168. package/build/widgets/form/TimeList.js +34 -62
  169. package/build/widgets/form/UploadButton.d.ts +34 -2
  170. package/build/widgets/form/UploadButton.js +3 -1
  171. package/build/widgets/form/ValidationGroup.spec.d.ts +1 -0
  172. package/build/widgets/form/ValidationGroup.spec.js +62 -0
  173. package/build/widgets/form/Validator.d.ts +33 -2
  174. package/build/widgets/form/Validator.js +3 -0
  175. package/build/widgets/grid/Grid.d.ts +9 -9
  176. package/build/widgets/grid/TreeNode.d.ts +6 -0
  177. package/build/widgets/index.d.ts +1 -0
  178. package/build/widgets/index.js +1 -0
  179. package/build/widgets/nav/MenuItem.d.ts +3 -2
  180. package/build/widgets/nav/Route.spec.d.ts +1 -0
  181. package/build/widgets/nav/Route.spec.js +15 -0
  182. package/build/widgets/nav/Scroller.d.ts +4 -6
  183. package/build/widgets/nav/Scroller.js +6 -3
  184. package/build/widgets/nav/Tab.d.ts +2 -2
  185. package/build/widgets/overlay/ContextMenu.d.ts +3 -3
  186. package/build/widgets/overlay/Overlay.d.ts +2 -1
  187. package/build/widgets/overlay/Overlay.js +1 -1
  188. package/build.js +133 -133
  189. package/dist/data.js +2 -2
  190. package/dist/jsx-runtime.js +6 -1
  191. package/dist/manifest.d.ts +1443 -0
  192. package/dist/manifest.js +852 -804
  193. package/dist/ui.js +91 -5
  194. package/dist/util.js +3 -0
  195. package/dist/widgets.js +520 -161
  196. package/package.json +46 -20
  197. package/src/charts/Chart.ts +108 -108
  198. package/src/charts/ScatterGraph.tsx +6 -6
  199. package/src/data/ArrayElementView.ts +90 -90
  200. package/src/data/AugmentedViewBase.ts +88 -88
  201. package/src/data/Binding.ts +104 -104
  202. package/src/data/ExposedRecordView.ts +95 -95
  203. package/src/data/ExposedValueView.ts +89 -89
  204. package/src/data/Expression.spec.ts +229 -229
  205. package/src/data/Expression.ts +233 -233
  206. package/src/data/Grouper.spec.ts +57 -57
  207. package/src/data/Grouper.ts +158 -158
  208. package/src/data/NestedDataView.ts +43 -43
  209. package/src/data/ReadOnlyDataView.ts +39 -39
  210. package/src/data/Ref.ts +104 -104
  211. package/src/data/Selector.ts +10 -10
  212. package/src/data/Store.ts +52 -52
  213. package/src/data/StoreProxy.ts +19 -19
  214. package/src/data/StoreRef.ts +66 -66
  215. package/src/data/StringTemplate.spec.ts +132 -132
  216. package/src/data/StringTemplate.ts +93 -93
  217. package/src/data/StructuredSelector.spec.ts +113 -113
  218. package/src/data/StructuredSelector.ts +146 -146
  219. package/src/data/SubscribableView.ts +63 -63
  220. package/src/data/ZoomIntoPropertyView.spec.ts +64 -64
  221. package/src/data/ZoomIntoPropertyView.ts +45 -45
  222. package/src/data/computable.spec.ts +87 -62
  223. package/src/data/computable.ts +3 -6
  224. package/src/data/createAccessorModelProxy.spec.tsx +102 -1
  225. package/src/data/createAccessorModelProxy.ts +9 -3
  226. package/src/data/createStructuredSelector.ts +62 -62
  227. package/src/data/getAccessor.spec.ts +11 -11
  228. package/src/data/getAccessor.ts +74 -74
  229. package/src/data/getSelector.spec.ts +43 -43
  230. package/src/data/getSelector.ts +66 -66
  231. package/src/data/ops/filter.spec.ts +35 -35
  232. package/src/data/ops/filter.ts +9 -9
  233. package/src/data/ops/findTreeNode.ts +1 -5
  234. package/src/data/ops/findTreePath.ts +1 -1
  235. package/src/data/ops/merge.ts +13 -13
  236. package/src/data/ops/removeTreeNodes.spec.ts +37 -37
  237. package/src/data/ops/removeTreeNodes.ts +2 -2
  238. package/src/data/ops/updateArray.spec.ts +69 -69
  239. package/src/data/ops/updateArray.ts +31 -31
  240. package/src/data/ops/updateTree.ts +1 -1
  241. package/src/data/test-types.ts +7 -7
  242. package/src/hooks/resolveCallback.spec.tsx +30 -7
  243. package/src/hooks/useTrigger.ts +26 -26
  244. package/src/index.scss +6 -6
  245. package/src/jsx-dev-runtime.ts +4 -4
  246. package/src/jsx-runtime.spec.tsx +402 -0
  247. package/src/jsx-runtime.ts +26 -22
  248. package/src/svg/BoundedObject.ts +101 -101
  249. package/src/svg/util/Rect.ts +105 -105
  250. package/src/ui/CSSHelper.ts +17 -17
  251. package/src/ui/ContentResolver.spec.tsx +172 -19
  252. package/src/ui/ContentResolver.ts +16 -8
  253. package/src/ui/Controller.ts +15 -2
  254. package/src/ui/Culture.ts +159 -159
  255. package/src/ui/DataProxy.ts +55 -55
  256. package/src/ui/FocusManager.ts +171 -171
  257. package/src/ui/Instance.ts +866 -868
  258. package/src/ui/Prop.ts +140 -112
  259. package/src/ui/RenderingContext.ts +99 -99
  260. package/src/ui/Repeater.ts +3 -12
  261. package/src/ui/Rescope.ts +49 -49
  262. package/src/ui/StructuredInstanceDataAccessor.ts +32 -32
  263. package/src/ui/Text.ts +21 -2
  264. package/src/ui/VDOM.ts +34 -34
  265. package/src/ui/adapter/ArrayAdapter.spec.ts +55 -55
  266. package/src/ui/adapter/ArrayAdapter.ts +4 -1
  267. package/src/ui/adapter/TreeAdapter.spec.ts +76 -76
  268. package/src/ui/adapter/TreeAdapter.ts +185 -185
  269. package/src/ui/app/History.ts +133 -133
  270. package/src/ui/app/Url.spec.ts +50 -50
  271. package/src/ui/app/startHotAppLoop.ts +41 -41
  272. package/src/ui/createFunctionalComponent.spec.tsx +53 -0
  273. package/src/ui/createFunctionalComponent.ts +86 -65
  274. package/src/ui/expr.ts +4 -1
  275. package/src/ui/exprHelpers.spec.ts +379 -0
  276. package/src/ui/exprHelpers.ts +78 -0
  277. package/src/ui/index.ts +47 -46
  278. package/src/ui/layout/Content.ts +30 -30
  279. package/src/ui/layout/FirstVisibleChildLayout.spec.tsx +1 -1
  280. package/src/ui/layout/FirstVisibleChildLayout.ts +60 -60
  281. package/src/ui/selection/KeySelection.ts +0 -12
  282. package/src/ui/selection/PropertySelection.ts +87 -87
  283. package/src/ui/selection/Selection.ts +13 -3
  284. package/src/util/Console.ts +13 -11
  285. package/src/util/Format.ts +267 -267
  286. package/src/util/addEventListenerWithOptions.ts +41 -41
  287. package/src/util/browserSupportsPassiveEventHandlers.ts +20 -20
  288. package/src/util/color/rgbToHsl.ts +35 -35
  289. package/src/util/getActiveElement.ts +4 -4
  290. package/src/util/hasKey.ts +18 -18
  291. package/src/util/index.ts +55 -55
  292. package/src/util/innerTextTrim.ts +10 -10
  293. package/src/util/isArray.ts +3 -3
  294. package/src/util/isDataRecord.ts +5 -5
  295. package/src/util/isDefined.ts +3 -3
  296. package/src/util/isString.ts +3 -3
  297. package/src/widgets/AccessorBindings.spec.tsx +26 -0
  298. package/src/widgets/Button.tsx +5 -17
  299. package/src/widgets/DocumentTitle.ts +95 -92
  300. package/src/widgets/Heading.ts +2 -2
  301. package/src/widgets/HtmlElement.spec.helpers.tsx +108 -0
  302. package/src/widgets/HtmlElement.spec.tsx +20 -12
  303. package/src/widgets/HtmlElement.tsx +82 -24
  304. package/src/widgets/Icon.ts +3 -17
  305. package/src/widgets/List.tsx +6 -0
  306. package/src/widgets/ReactElementWrapper.spec.tsx +452 -0
  307. package/src/widgets/ReactElementWrapper.tsx +108 -0
  308. package/src/widgets/Sandbox.ts +103 -103
  309. package/src/widgets/autoFocus.ts +9 -9
  310. package/src/widgets/cx.ts +63 -63
  311. package/src/widgets/drag-drop/DragSource.tsx +3 -4
  312. package/src/widgets/drag-drop/DropZone.tsx +3 -4
  313. package/src/widgets/form/Checkbox.tsx +3 -0
  314. package/src/widgets/form/ColorField.tsx +3 -0
  315. package/src/widgets/form/DateTimeField.tsx +5 -0
  316. package/src/widgets/form/Field.tsx +0 -3
  317. package/src/widgets/form/Label.tsx +1 -0
  318. package/src/widgets/form/LabeledContainer.ts +22 -26
  319. package/src/widgets/form/LookupField.spec.tsx +93 -0
  320. package/src/widgets/form/LookupField.tsx +104 -9
  321. package/src/widgets/form/MonthField.tsx +5 -0
  322. package/src/widgets/form/NumberField.tsx +3 -0
  323. package/src/widgets/form/Radio.tsx +5 -0
  324. package/src/widgets/form/Select.tsx +5 -0
  325. package/src/widgets/form/Slider.tsx +4 -0
  326. package/src/widgets/form/Switch.tsx +3 -0
  327. package/src/widgets/form/TextField.tsx +62 -0
  328. package/src/widgets/form/TimeList.tsx +84 -73
  329. package/src/widgets/form/UploadButton.tsx +53 -2
  330. package/src/widgets/form/Validator.ts +40 -3
  331. package/src/widgets/grid/Grid.tsx +9 -12
  332. package/src/widgets/grid/GridCell.ts +143 -143
  333. package/src/widgets/grid/TreeNode.tsx +9 -0
  334. package/src/widgets/icons/calendar.tsx +17 -17
  335. package/src/widgets/icons/check.tsx +13 -13
  336. package/src/widgets/icons/clear.tsx +15 -15
  337. package/src/widgets/icons/close.tsx +20 -20
  338. package/src/widgets/icons/cx.tsx +38 -38
  339. package/src/widgets/icons/drop-down.tsx +15 -15
  340. package/src/widgets/icons/file.tsx +13 -13
  341. package/src/widgets/icons/folder-open.tsx +15 -15
  342. package/src/widgets/icons/folder.tsx +13 -13
  343. package/src/widgets/icons/forward.tsx +22 -22
  344. package/src/widgets/icons/loading.tsx +24 -24
  345. package/src/widgets/icons/menu.tsx +17 -17
  346. package/src/widgets/icons/pixel-picker.tsx +18 -18
  347. package/src/widgets/icons/search.tsx +13 -13
  348. package/src/widgets/icons/sort-asc.tsx +14 -14
  349. package/src/widgets/icons/square.tsx +18 -18
  350. package/src/widgets/index.ts +1 -0
  351. package/src/widgets/nav/MenuItem.tsx +3 -2
  352. package/src/widgets/nav/Route.ts +142 -142
  353. package/src/widgets/nav/Scroller.tsx +8 -9
  354. package/src/widgets/nav/Tab.ts +2 -2
  355. package/src/widgets/overlay/ContextMenu.ts +42 -42
  356. package/src/widgets/overlay/Dropdown.tsx +762 -762
  357. package/src/widgets/overlay/MsgBox.tsx +141 -141
  358. package/src/widgets/overlay/Overlay.tsx +5 -4
  359. package/src/widgets/overlay/Toast.ts +111 -111
  360. package/src/widgets/overlay/Window.tsx +299 -299
  361. package/src/widgets/overlay/alerts.ts +46 -46
  362. package/src/widgets/overlay/captureMouse.ts +195 -195
  363. package/src/widgets/overlay/createHotPromiseWindowFactory.ts +72 -72
  364. package/src/widgets/overlay/index.d.ts +11 -11
  365. package/src/widgets/overlay/index.ts +11 -11
  366. package/src/widgets/overlay/tooltip-ops.ts +173 -173
@@ -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;
@@ -1,133 +1,133 @@
1
- import { Url } from "./Url";
2
- import { batchUpdatesAndNotify } from "../batchUpdates";
3
- import { SubscriberList } from "../../util/SubscriberList";
4
- import { View } from "../../data/View";
5
-
6
- interface Transition {
7
- url: string;
8
- state: any;
9
- title: string | null;
10
- replace: boolean;
11
- completed?: boolean;
12
- }
13
-
14
- type NavigateConfirmationCallback = (state: any) => boolean | Promise<boolean>;
15
-
16
- let last = 0;
17
- let next = 1;
18
- let transitions: Record<number, Transition> = {};
19
- let subscribers: SubscriberList | null = null;
20
- let reload = false;
21
- let navigateConfirmationCallback: NavigateConfirmationCallback | null = null;
22
- let permanentNavigateConfirmation = false;
23
-
24
- export class History {
25
- static store: View;
26
- static urlBinding: string;
27
- static hashBinding?: string;
28
-
29
- static connect(store: View, urlBinding: string, hashBinding?: string): void {
30
- this.store = store;
31
- this.urlBinding = urlBinding;
32
- this.hashBinding = hashBinding;
33
- this.updateStore();
34
- window.onpopstate = () => {
35
- this.updateStore();
36
- };
37
- }
38
-
39
- static pushState(state: any, title: string | null, url: string): boolean {
40
- return this.confirmAndNavigate(state, title, url);
41
- }
42
-
43
- static replaceState(state: any, title: string | null, url: string): boolean {
44
- return this.navigate(state, title, url, true);
45
- }
46
-
47
- static reloadOnNextChange(): void {
48
- reload = true;
49
- }
50
-
51
- static addNavigateConfirmation(callback: NavigateConfirmationCallback, permanent = false): void {
52
- navigateConfirmationCallback = callback;
53
- permanentNavigateConfirmation = permanent;
54
- }
55
-
56
- static confirm(continueCallback: () => boolean, state: any): boolean {
57
- if (!navigateConfirmationCallback) return continueCallback();
58
-
59
- let result = navigateConfirmationCallback(state);
60
- Promise.resolve(result).then((value) => {
61
- if (value) {
62
- if (!permanentNavigateConfirmation) navigateConfirmationCallback = null;
63
- continueCallback();
64
- }
65
- });
66
-
67
- return false;
68
- }
69
-
70
- static confirmAndNavigate(state: any, title: string | null, url: string, replace?: boolean): boolean {
71
- return this.confirm(() => this.navigate(state, title, url, replace), url);
72
- }
73
-
74
- static navigate(state: any, title: string | null, url: string, replace = false): boolean {
75
- url = Url.resolve(url);
76
-
77
- if (!window.history.pushState || reload) {
78
- window.location[replace ? "replace" : "assign"](url);
79
- return true;
80
- }
81
-
82
- let transition: Transition | undefined;
83
- let changed = false;
84
- batchUpdatesAndNotify(
85
- () => {
86
- changed = this.updateStore(url);
87
- if (changed)
88
- transitions[++last] = transition = {
89
- url,
90
- state,
91
- title,
92
- replace,
93
- };
94
- },
95
- () => {
96
- if (transition) transition.completed = true;
97
-
98
- //update history once the page is rendered and the title is set
99
- while (transitions[next] && transitions[next].completed) {
100
- let tr = transitions[next];
101
- delete transitions[next];
102
- next++;
103
- if (tr.replace) {
104
- window.history.replaceState(tr.state, tr.title ?? "", tr.url);
105
- if (subscribers) subscribers.notify(tr.url, "replaceState");
106
- } else {
107
- window.history.pushState(tr.state, tr.title ?? "", tr.url);
108
- if (subscribers) subscribers.notify(tr.url, "pushState");
109
- }
110
- }
111
- },
112
- );
113
-
114
- return changed;
115
- }
116
-
117
- static updateStore(href?: string): boolean {
118
- let url = Url.unresolve(href || document.location.href);
119
- let hash: string | null = null;
120
- let hashIndex = url.indexOf("#");
121
- if (hashIndex !== -1) {
122
- hash = url.substring(hashIndex);
123
- url = url.substring(0, hashIndex);
124
- }
125
- if (this.hashBinding) this.store.set(this.hashBinding, hash);
126
- return this.store.set(this.urlBinding, url);
127
- }
128
-
129
- static subscribe(callback: (url: string, op: string) => void): () => void {
130
- if (!subscribers) subscribers = new SubscriberList();
131
- return subscribers.subscribe(callback);
132
- }
133
- }
1
+ import { Url } from "./Url";
2
+ import { batchUpdatesAndNotify } from "../batchUpdates";
3
+ import { SubscriberList } from "../../util/SubscriberList";
4
+ import { View } from "../../data/View";
5
+
6
+ interface Transition {
7
+ url: string;
8
+ state: any;
9
+ title: string | null;
10
+ replace: boolean;
11
+ completed?: boolean;
12
+ }
13
+
14
+ type NavigateConfirmationCallback = (state: any) => boolean | Promise<boolean>;
15
+
16
+ let last = 0;
17
+ let next = 1;
18
+ let transitions: Record<number, Transition> = {};
19
+ let subscribers: SubscriberList | null = null;
20
+ let reload = false;
21
+ let navigateConfirmationCallback: NavigateConfirmationCallback | null = null;
22
+ let permanentNavigateConfirmation = false;
23
+
24
+ export class History {
25
+ static store: View;
26
+ static urlBinding: string;
27
+ static hashBinding?: string;
28
+
29
+ static connect(store: View, urlBinding: string, hashBinding?: string): void {
30
+ this.store = store;
31
+ this.urlBinding = urlBinding;
32
+ this.hashBinding = hashBinding;
33
+ this.updateStore();
34
+ window.onpopstate = () => {
35
+ this.updateStore();
36
+ };
37
+ }
38
+
39
+ static pushState(state: any, title: string | null, url: string): boolean {
40
+ return this.confirmAndNavigate(state, title, url);
41
+ }
42
+
43
+ static replaceState(state: any, title: string | null, url: string): boolean {
44
+ return this.navigate(state, title, url, true);
45
+ }
46
+
47
+ static reloadOnNextChange(): void {
48
+ reload = true;
49
+ }
50
+
51
+ static addNavigateConfirmation(callback: NavigateConfirmationCallback, permanent = false): void {
52
+ navigateConfirmationCallback = callback;
53
+ permanentNavigateConfirmation = permanent;
54
+ }
55
+
56
+ static confirm(continueCallback: () => boolean, state: any): boolean {
57
+ if (!navigateConfirmationCallback) return continueCallback();
58
+
59
+ let result = navigateConfirmationCallback(state);
60
+ Promise.resolve(result).then((value) => {
61
+ if (value) {
62
+ if (!permanentNavigateConfirmation) navigateConfirmationCallback = null;
63
+ continueCallback();
64
+ }
65
+ });
66
+
67
+ return false;
68
+ }
69
+
70
+ static confirmAndNavigate(state: any, title: string | null, url: string, replace?: boolean): boolean {
71
+ return this.confirm(() => this.navigate(state, title, url, replace), url);
72
+ }
73
+
74
+ static navigate(state: any, title: string | null, url: string, replace = false): boolean {
75
+ url = Url.resolve(url);
76
+
77
+ if (!window.history.pushState || reload) {
78
+ window.location[replace ? "replace" : "assign"](url);
79
+ return true;
80
+ }
81
+
82
+ let transition: Transition | undefined;
83
+ let changed = false;
84
+ batchUpdatesAndNotify(
85
+ () => {
86
+ changed = this.updateStore(url);
87
+ if (changed)
88
+ transitions[++last] = transition = {
89
+ url,
90
+ state,
91
+ title,
92
+ replace,
93
+ };
94
+ },
95
+ () => {
96
+ if (transition) transition.completed = true;
97
+
98
+ //update history once the page is rendered and the title is set
99
+ while (transitions[next] && transitions[next].completed) {
100
+ let tr = transitions[next];
101
+ delete transitions[next];
102
+ next++;
103
+ if (tr.replace) {
104
+ window.history.replaceState(tr.state, tr.title ?? "", tr.url);
105
+ if (subscribers) subscribers.notify(tr.url, "replaceState");
106
+ } else {
107
+ window.history.pushState(tr.state, tr.title ?? "", tr.url);
108
+ if (subscribers) subscribers.notify(tr.url, "pushState");
109
+ }
110
+ }
111
+ },
112
+ );
113
+
114
+ return changed;
115
+ }
116
+
117
+ static updateStore(href?: string): boolean {
118
+ let url = Url.unresolve(href || document.location.href);
119
+ let hash: string | null = null;
120
+ let hashIndex = url.indexOf("#");
121
+ if (hashIndex !== -1) {
122
+ hash = url.substring(hashIndex);
123
+ url = url.substring(0, hashIndex);
124
+ }
125
+ if (this.hashBinding) this.store.set(this.hashBinding, hash);
126
+ return this.store.set(this.urlBinding, url);
127
+ }
128
+
129
+ static subscribe(callback: (url: string, op: string) => void): () => void {
130
+ if (!subscribers) subscribers = new SubscriberList();
131
+ return subscribers.subscribe(callback);
132
+ }
133
+ }