cx 26.0.13 → 26.1.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.
Files changed (251) 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/app/startAppLoop.js +2 -10
  5. package/build/widgets/form/Checkbox.d.ts +0 -1
  6. package/build/widgets/form/Checkbox.js +1 -0
  7. package/build/widgets/form/ColorField.d.ts +0 -1
  8. package/build/widgets/form/ColorField.js +2 -2
  9. package/build/widgets/form/DateTimeField.d.ts +0 -2
  10. package/build/widgets/form/DateTimeField.js +1 -0
  11. package/build/widgets/form/DateTimePicker.d.ts +0 -2
  12. package/build/widgets/form/DateTimePicker.js +1 -0
  13. package/build/widgets/form/Radio.d.ts +0 -1
  14. package/build/widgets/form/Slider.js +9 -1
  15. package/build/widgets/form/Switch.d.ts +0 -1
  16. package/build/widgets/form/Switch.js +1 -1
  17. package/build/widgets/form/Wheel.d.ts +0 -1
  18. package/build/widgets/grid/Grid.d.ts +0 -2
  19. package/build/widgets/grid/GridCellEditor.js +3 -1
  20. package/build/widgets/overlay/Overlay.d.ts +3 -0
  21. package/build/widgets/overlay/Overlay.js +3 -2
  22. package/build/widgets/overlay/createHotPromiseWindowFactory.js +0 -1
  23. package/dist/manifest.js +810 -810
  24. package/dist/ui.js +3 -10
  25. package/dist/widgets.js +18 -7
  26. package/package.json +9 -8
  27. package/src/charts/Chart.ts +108 -108
  28. package/src/data/ArrayElementView.ts +90 -90
  29. package/src/data/AugmentedViewBase.ts +88 -88
  30. package/src/data/Binding.ts +104 -104
  31. package/src/data/ExposedRecordView.ts +95 -95
  32. package/src/data/ExposedValueView.ts +89 -89
  33. package/src/data/Expression.spec.ts +229 -229
  34. package/src/data/Expression.ts +233 -233
  35. package/src/data/Grouper.spec.ts +57 -57
  36. package/src/data/Grouper.ts +158 -158
  37. package/src/data/NestedDataView.ts +43 -43
  38. package/src/data/ReadOnlyDataView.ts +39 -39
  39. package/src/data/Ref.ts +104 -104
  40. package/src/data/Selector.ts +10 -10
  41. package/src/data/Store.ts +52 -52
  42. package/src/data/StoreProxy.ts +19 -19
  43. package/src/data/StoreRef.ts +66 -66
  44. package/src/data/StringTemplate.spec.ts +132 -132
  45. package/src/data/StringTemplate.ts +93 -93
  46. package/src/data/StructuredSelector.spec.ts +113 -113
  47. package/src/data/StructuredSelector.ts +146 -146
  48. package/src/data/SubscribableView.ts +63 -63
  49. package/src/data/ZoomIntoPropertyView.spec.ts +64 -64
  50. package/src/data/ZoomIntoPropertyView.ts +45 -45
  51. package/src/data/computable.spec.ts +87 -87
  52. package/src/data/createStructuredSelector.ts +62 -62
  53. package/src/data/getAccessor.spec.ts +11 -11
  54. package/src/data/getAccessor.ts +74 -74
  55. package/src/data/getSelector.spec.ts +43 -43
  56. package/src/data/getSelector.ts +66 -66
  57. package/src/data/ops/filter.spec.ts +35 -35
  58. package/src/data/ops/filter.ts +9 -9
  59. package/src/data/ops/merge.ts +13 -13
  60. package/src/data/ops/removeTreeNodes.spec.ts +37 -37
  61. package/src/data/ops/updateArray.spec.ts +69 -69
  62. package/src/data/test-types.ts +7 -7
  63. package/src/hooks/useTrigger.ts +26 -26
  64. package/src/index.scss +6 -6
  65. package/src/jsx-dev-runtime.ts +4 -4
  66. package/src/jsx-runtime.spec.tsx +38 -9
  67. package/src/svg/BoundedObject.ts +101 -101
  68. package/src/svg/util/Rect.ts +105 -105
  69. package/src/ui/CSSHelper.ts +17 -17
  70. package/src/ui/Culture.ts +159 -159
  71. package/src/ui/DataProxy.ts +55 -55
  72. package/src/ui/FocusManager.ts +171 -171
  73. package/src/ui/Instance.ts +866 -866
  74. package/src/ui/Prop.ts +140 -140
  75. package/src/ui/RenderingContext.ts +99 -99
  76. package/src/ui/Rescope.ts +49 -49
  77. package/src/ui/StructuredInstanceDataAccessor.ts +32 -32
  78. package/src/ui/VDOM.ts +1 -34
  79. package/src/ui/adapter/ArrayAdapter.spec.ts +55 -55
  80. package/src/ui/adapter/TreeAdapter.spec.ts +76 -76
  81. package/src/ui/adapter/TreeAdapter.ts +185 -185
  82. package/src/ui/app/History.ts +133 -133
  83. package/src/ui/app/Url.spec.ts +50 -50
  84. package/src/ui/app/startAppLoop.tsx +5 -9
  85. package/src/ui/app/startHotAppLoop.ts +41 -41
  86. package/src/ui/layout/Content.ts +30 -30
  87. package/src/ui/layout/FirstVisibleChildLayout.ts +60 -60
  88. package/src/util/Console.ts +13 -13
  89. package/src/util/Format.spec.ts +69 -69
  90. package/src/util/Format.ts +267 -267
  91. package/src/util/addEventListenerWithOptions.ts +41 -41
  92. package/src/util/browserSupportsPassiveEventHandlers.ts +20 -20
  93. package/src/util/color/rgbToHsl.ts +35 -35
  94. package/src/util/getActiveElement.ts +4 -4
  95. package/src/util/hasKey.ts +18 -18
  96. package/src/util/index.ts +55 -55
  97. package/src/util/innerTextTrim.ts +10 -10
  98. package/src/util/isArray.ts +3 -3
  99. package/src/util/isDataRecord.ts +5 -5
  100. package/src/util/isDefined.ts +3 -3
  101. package/src/util/isString.ts +3 -3
  102. package/src/widgets/DocumentTitle.ts +95 -95
  103. package/src/widgets/Sandbox.ts +103 -103
  104. package/src/widgets/autoFocus.ts +9 -9
  105. package/src/widgets/cx.ts +63 -63
  106. package/src/widgets/form/Checkbox.tsx +0 -1
  107. package/src/widgets/form/ColorField.tsx +15 -12
  108. package/src/widgets/form/DateTimeField.tsx +0 -2
  109. package/src/widgets/form/DateTimePicker.tsx +0 -2
  110. package/src/widgets/form/Radio.tsx +0 -1
  111. package/src/widgets/form/Slider.tsx +12 -4
  112. package/src/widgets/form/Switch.tsx +2 -3
  113. package/src/widgets/form/Wheel.tsx +0 -1
  114. package/src/widgets/grid/Grid.tsx +0 -1
  115. package/src/widgets/grid/GridCell.ts +143 -143
  116. package/src/widgets/grid/GridCellEditor.tsx +7 -1
  117. package/src/widgets/icons/calendar.tsx +17 -17
  118. package/src/widgets/icons/check.tsx +13 -13
  119. package/src/widgets/icons/clear.tsx +15 -15
  120. package/src/widgets/icons/close.tsx +20 -20
  121. package/src/widgets/icons/cx.tsx +38 -38
  122. package/src/widgets/icons/drop-down.tsx +15 -15
  123. package/src/widgets/icons/file.tsx +13 -13
  124. package/src/widgets/icons/folder-open.tsx +15 -15
  125. package/src/widgets/icons/folder.tsx +13 -13
  126. package/src/widgets/icons/forward.tsx +22 -22
  127. package/src/widgets/icons/loading.tsx +24 -24
  128. package/src/widgets/icons/menu.tsx +17 -17
  129. package/src/widgets/icons/pixel-picker.tsx +18 -18
  130. package/src/widgets/icons/search.tsx +13 -13
  131. package/src/widgets/icons/sort-asc.tsx +14 -14
  132. package/src/widgets/icons/square.tsx +18 -18
  133. package/src/widgets/nav/Route.ts +142 -142
  134. package/src/widgets/overlay/Dropdown.tsx +762 -762
  135. package/src/widgets/overlay/MsgBox.tsx +141 -141
  136. package/src/widgets/overlay/Overlay.tsx +5 -1
  137. package/src/widgets/overlay/Toast.ts +111 -111
  138. package/src/widgets/overlay/Window.tsx +299 -299
  139. package/src/widgets/overlay/alerts.ts +46 -46
  140. package/src/widgets/overlay/captureMouse.ts +195 -195
  141. package/src/widgets/overlay/createHotPromiseWindowFactory.ts +0 -1
  142. package/src/widgets/overlay/index.d.ts +11 -11
  143. package/src/widgets/overlay/index.ts +11 -11
  144. package/src/widgets/overlay/tooltip-ops.ts +173 -173
  145. package/build/data/ArrayElementView.spec.d.ts +0 -1
  146. package/build/data/ArrayElementView.spec.js +0 -81
  147. package/build/data/Binding.spec.d.ts +0 -1
  148. package/build/data/Binding.spec.js +0 -61
  149. package/build/data/Expression.spec.d.ts +0 -1
  150. package/build/data/Expression.spec.js +0 -196
  151. package/build/data/Grouper.spec.d.ts +0 -1
  152. package/build/data/Grouper.spec.js +0 -48
  153. package/build/data/Ref.spec.d.ts +0 -1
  154. package/build/data/Ref.spec.js +0 -72
  155. package/build/data/Store.spec.d.ts +0 -1
  156. package/build/data/Store.spec.js +0 -19
  157. package/build/data/StoreRef.spec.d.ts +0 -1
  158. package/build/data/StoreRef.spec.js +0 -22
  159. package/build/data/StringTemplate.spec.d.ts +0 -1
  160. package/build/data/StringTemplate.spec.js +0 -112
  161. package/build/data/StructuredSelector.spec.d.ts +0 -1
  162. package/build/data/StructuredSelector.spec.js +0 -102
  163. package/build/data/View.spec.d.ts +0 -1
  164. package/build/data/View.spec.js +0 -44
  165. package/build/data/ZoomIntoPropertyView.spec.d.ts +0 -1
  166. package/build/data/ZoomIntoPropertyView.spec.js +0 -54
  167. package/build/data/comparer.spec.d.ts +0 -1
  168. package/build/data/comparer.spec.js +0 -50
  169. package/build/data/computable.spec.d.ts +0 -1
  170. package/build/data/computable.spec.js +0 -56
  171. package/build/data/createAccessorModelProxy.spec.d.ts +0 -1
  172. package/build/data/createAccessorModelProxy.spec.js +0 -30
  173. package/build/data/createStructuredSelector.spec.d.ts +0 -1
  174. package/build/data/createStructuredSelector.spec.js +0 -42
  175. package/build/data/diff/diffs.spec.d.ts +0 -1
  176. package/build/data/diff/diffs.spec.js +0 -45
  177. package/build/data/getAccessor.spec.d.ts +0 -1
  178. package/build/data/getAccessor.spec.js +0 -10
  179. package/build/data/getSelector.spec.d.ts +0 -1
  180. package/build/data/getSelector.spec.js +0 -36
  181. package/build/data/ops/append.spec.d.ts +0 -1
  182. package/build/data/ops/append.spec.js +0 -24
  183. package/build/data/ops/filter.spec.d.ts +0 -1
  184. package/build/data/ops/filter.spec.js +0 -25
  185. package/build/data/ops/findTreeNode.spec.d.ts +0 -1
  186. package/build/data/ops/findTreeNode.spec.js +0 -20
  187. package/build/data/ops/merge.spec.d.ts +0 -1
  188. package/build/data/ops/merge.spec.js +0 -23
  189. package/build/data/ops/removeTreeNodes.spec.d.ts +0 -1
  190. package/build/data/ops/removeTreeNodes.spec.js +0 -35
  191. package/build/data/ops/updateArray.spec.d.ts +0 -1
  192. package/build/data/ops/updateArray.spec.js +0 -33
  193. package/build/data/ops/updateTree.spec.d.ts +0 -1
  194. package/build/data/ops/updateTree.spec.js +0 -44
  195. package/build/hooks/invokeCallback.spec.d.ts +0 -1
  196. package/build/hooks/invokeCallback.spec.js +0 -44
  197. package/build/hooks/resolveCallback.spec.d.ts +0 -1
  198. package/build/hooks/resolveCallback.spec.js +0 -35
  199. package/build/hooks/store.spec.d.ts +0 -1
  200. package/build/hooks/store.spec.js +0 -48
  201. package/build/hooks/useTrigger.spec.d.ts +0 -1
  202. package/build/hooks/useTrigger.spec.js +0 -59
  203. package/build/ui/Controller.spec.d.ts +0 -1
  204. package/build/ui/Controller.spec.js +0 -247
  205. package/build/ui/Cx.spec.d.ts +0 -1
  206. package/build/ui/Cx.spec.js +0 -153
  207. package/build/ui/DataProxy.spec.d.ts +0 -1
  208. package/build/ui/DataProxy.spec.js +0 -208
  209. package/build/ui/IsolatedScope.spec.d.ts +0 -1
  210. package/build/ui/IsolatedScope.spec.js +0 -42
  211. package/build/ui/PureContainer.spec.d.ts +0 -1
  212. package/build/ui/PureContainer.spec.js +0 -149
  213. package/build/ui/Repeater.spec.d.ts +0 -1
  214. package/build/ui/Repeater.spec.js +0 -109
  215. package/build/ui/Rescope.spec.d.ts +0 -1
  216. package/build/ui/Rescope.spec.js +0 -134
  217. package/build/ui/Restate.spec.d.ts +0 -1
  218. package/build/ui/Restate.spec.js +0 -257
  219. package/build/ui/adapter/ArrayAdapter.spec.d.ts +0 -1
  220. package/build/ui/adapter/ArrayAdapter.spec.js +0 -44
  221. package/build/ui/adapter/TreeAdapter.spec.d.ts +0 -1
  222. package/build/ui/adapter/TreeAdapter.spec.js +0 -71
  223. package/build/ui/app/Url.spec.d.ts +0 -1
  224. package/build/ui/app/Url.spec.js +0 -43
  225. package/build/ui/createFunctionalComponent.spec.d.ts +0 -1
  226. package/build/ui/createFunctionalComponent.spec.js +0 -272
  227. package/build/ui/layout/ContentPlaceholder.spec.d.ts +0 -1
  228. package/build/ui/layout/ContentPlaceholder.spec.js +0 -333
  229. package/build/ui/layout/FirstVisibleChildLayout.spec.d.ts +0 -1
  230. package/build/ui/layout/FirstVisibleChildLayout.spec.js +0 -101
  231. package/build/util/Format.spec.d.ts +0 -1
  232. package/build/util/Format.spec.js +0 -58
  233. package/build/util/TraversalStack.spec.d.ts +0 -1
  234. package/build/util/TraversalStack.spec.js +0 -43
  235. package/build/util/date/upperBoundCheck.spec.d.ts +0 -1
  236. package/build/util/date/upperBoundCheck.spec.js +0 -22
  237. package/build/util/getSearchQueryPredicate.spec.d.ts +0 -1
  238. package/build/util/getSearchQueryPredicate.spec.js +0 -33
  239. package/build/util/isValidIdentifierName.spec.d.ts +0 -1
  240. package/build/util/isValidIdentifierName.spec.js +0 -28
  241. package/build/util/routeAppend.spec.d.ts +0 -1
  242. package/build/util/routeAppend.spec.js +0 -14
  243. package/build/widgets/AccessorBindings.spec.d.ts +0 -1
  244. package/build/widgets/AccessorBindings.spec.js +0 -40
  245. package/build/widgets/HtmlElement.spec.d.ts +0 -1
  246. package/build/widgets/HtmlElement.spec.js +0 -38
  247. package/build/widgets/form/ValidationGroup.spec.d.ts +0 -1
  248. package/build/widgets/form/ValidationGroup.spec.js +0 -62
  249. package/build/widgets/nav/Route.spec.d.ts +0 -1
  250. package/build/widgets/nav/Route.spec.js +0 -15
  251. package/dist/manifest.d.ts +0 -1443
package/dist/ui.js CHANGED
@@ -69,7 +69,7 @@ import {
69
69
  isNumber,
70
70
  isDataRecord,
71
71
  } from "cx/util";
72
- import { VDOM as VDOM$2 } from "cx-react";
72
+ import { VDOM as VDOM$1 } from "cx-react";
73
73
  import { NumberCulture, DateTimeCulture } from "intl-io";
74
74
  import { jsx, jsxs } from "react/jsx-runtime";
75
75
 
@@ -261,9 +261,6 @@ class CSS {
261
261
  CSS.classPrefix = "cx";
262
262
  CSSHelper.alias("cx", CSS);
263
263
 
264
- // @ts-expect-error
265
- const VDOM$1 = VDOM$2;
266
-
267
264
  const VDOM = VDOM$1;
268
265
  let widgetId = 100;
269
266
  class Widget extends Component {
@@ -3576,11 +3573,8 @@ function startAppLoop(parentDOMElement, storeOrInstance, widget, options = {}) {
3576
3573
  options: options,
3577
3574
  subscribe: true,
3578
3575
  });
3579
- let root = null;
3580
- if (VDOM.DOM.createRoot) {
3581
- root = VDOM.DOM.createRoot(parentDOMElement);
3582
- root.render(content);
3583
- } else VDOM.DOM.render(content, parentDOMElement);
3576
+ let root = VDOM.DOM.createRoot(parentDOMElement);
3577
+ root.render(content);
3584
3578
  let stopped = false;
3585
3579
  return function () {
3586
3580
  if (stopped) return;
@@ -3595,7 +3589,6 @@ function startAppLoop(parentDOMElement, storeOrInstance, widget, options = {}) {
3595
3589
  }
3596
3590
  function destroy(parentDOMElement, options, root) {
3597
3591
  if (root) root.unmount();
3598
- else VDOM.DOM.unmountComponentAtNode(parentDOMElement);
3599
3592
  if (options.removeParentDOMElement && parentDOMElement.parentNode)
3600
3593
  parentDOMElement.parentNode.removeChild(parentDOMElement);
3601
3594
  }
package/dist/widgets.js CHANGED
@@ -3180,6 +3180,7 @@ class OverlayComponent extends VDOM.Component {
3180
3180
  widget.overlayWillUnmount(this.props.instance, this);
3181
3181
  if (this.ownedEl) {
3182
3182
  setTimeout(() => {
3183
+ this.root?.unmount();
3183
3184
  if (this.ownedEl?.parentNode) this.ownedEl.parentNode.removeChild(this.ownedEl);
3184
3185
  this.ownedEl = null;
3185
3186
  }, widget.destroyDelay);
@@ -3243,7 +3244,8 @@ class OverlayComponent extends VDOM.Component {
3243
3244
  }
3244
3245
  componentDidUpdate() {
3245
3246
  if (this.containerEl && !VDOM.DOM.createPortal) {
3246
- VDOM.DOM.render(this.renderOverlay(), this.containerEl);
3247
+ this.root = VDOM.DOM.createRoot(this.containerEl);
3248
+ this.root.render(this.renderOverlay());
3247
3249
  }
3248
3250
  this.overlayDidUpdate();
3249
3251
  }
@@ -4542,7 +4544,6 @@ function createHotPromiseWindowFactoryWithProps(module, factory) {
4542
4544
  let window = Window.create(factory(props)(resolve, reject));
4543
4545
  window.overlayWillDismiss = () => {
4544
4546
  if (!reloading && unsubscribe) unsubscribe();
4545
- return false;
4546
4547
  };
4547
4548
  dismiss = window.open(store);
4548
4549
  }
@@ -11948,7 +11949,9 @@ class SliderComponent extends VDOM.Component {
11948
11949
  style: data.style,
11949
11950
  id: data.id,
11950
11951
  onClick: (e) => this.onClick(e),
11951
- ref: (el) => (this.dom.el = el || undefined),
11952
+ ref: (el) => {
11953
+ this.dom.el = el || undefined;
11954
+ },
11952
11955
  onMouseMove: (e) => tooltipMouseMove$1(e, ...getFieldTooltip(instance)),
11953
11956
  onMouseLeave: (e) => tooltipMouseLeave$1(e, ...getFieldTooltip(instance)),
11954
11957
  children: [
@@ -11970,7 +11973,9 @@ class SliderComponent extends VDOM.Component {
11970
11973
  "div",
11971
11974
  {
11972
11975
  className: CSS.element(baseClass, "space"),
11973
- ref: (c) => (this.dom.range = c || undefined),
11976
+ ref: (c) => {
11977
+ this.dom.range = c || undefined;
11978
+ },
11974
11979
  children: [
11975
11980
  widget.showFrom &&
11976
11981
  jsx(
@@ -11986,7 +11991,9 @@ class SliderComponent extends VDOM.Component {
11986
11991
  }),
11987
11992
  onMouseLeave: (e) => this.onHandleMouseLeave(e, "from"),
11988
11993
  onTouchStart: (e) => this.onHandleMouseDown(e, "from"),
11989
- ref: (c) => (this.dom.from = c || undefined),
11994
+ ref: (c) => {
11995
+ this.dom.from = c || undefined;
11996
+ },
11990
11997
  },
11991
11998
  "from",
11992
11999
  ),
@@ -12004,7 +12011,9 @@ class SliderComponent extends VDOM.Component {
12004
12011
  }),
12005
12012
  onMouseLeave: (e) => this.onHandleMouseLeave(e, "to"),
12006
12013
  onTouchStart: (e) => this.onHandleMouseDown(e, "to"),
12007
- ref: (c) => (this.dom.to = c || undefined),
12014
+ ref: (c) => {
12015
+ this.dom.to = c || undefined;
12016
+ },
12008
12017
  },
12009
12018
  "to",
12010
12019
  ),
@@ -13679,7 +13688,9 @@ class GridCellEditorCmp extends VDOM.Component {
13679
13688
  render() {
13680
13689
  let { className, style, children } = this.props;
13681
13690
  return jsx("div", {
13682
- ref: (el) => (this.el = el),
13691
+ ref: (el) => {
13692
+ this.el = el;
13693
+ },
13683
13694
  className: className,
13684
13695
  style: style,
13685
13696
  children: children,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cx",
3
- "version": "26.0.13",
3
+ "version": "26.1.0",
4
4
  "description": "Advanced JavaScript UI framework for admin and dashboard applications with ready to use grid, form and chart components.",
5
5
  "exports": {
6
6
  "./data": {
@@ -73,9 +73,10 @@
73
73
  "route-parser": "^0.0.5"
74
74
  },
75
75
  "peerDependencies": {
76
- "@types/react": "*",
77
- "react": "*",
78
- "react-dom": "*"
76
+ "@types/react": ">=18",
77
+ "cx-react": ">=26",
78
+ "react": ">=18",
79
+ "react-dom": ">=18"
79
80
  },
80
81
  "repository": {
81
82
  "type": "git",
@@ -84,10 +85,10 @@
84
85
  "devDependencies": {
85
86
  "@types/jest": "^30.0.0",
86
87
  "@types/mocha": "^10.0.10",
87
- "@types/node": "^22.10.2",
88
- "@types/react-dom": "^18.3.1",
89
- "@types/react-test-renderer": "^18.3.1",
90
- "react-test-renderer": "^18.3.1",
88
+ "@types/node": "^25.0.3",
89
+ "@types/react-dom": "^19.2.3",
90
+ "@types/react-test-renderer": "^19.1.0",
91
+ "react-test-renderer": "^19.2.3",
91
92
  "ts-mocha": "^11.1.0",
92
93
  "ts-node": "^10.9.2",
93
94
  "tsconfig-paths": "^4.2.0",
@@ -1,108 +1,108 @@
1
- import { Widget, VDOM, getContent } from "../ui/Widget";
2
- import { BoundedObject, BoundedObjectConfig, BoundedObjectInstance, SvgRenderingContext } from "../svg/BoundedObject";
3
- import { Axis } from "./axis/Axis";
4
- import type { NumericAxis } from "./axis/NumericAxis";
5
- import type { CategoryAxis } from "./axis/CategoryAxis";
6
- import type { TimeAxis } from "./axis/TimeAxis";
7
- import { RenderingContext } from "../ui/RenderingContext";
8
- import { Create } from "../util/Component";
9
-
10
- /** Typed context interface for chart-related context properties */
11
- export interface ChartRenderingContext extends SvgRenderingContext {
12
- axes?: Record<string, any>;
13
- }
14
-
15
- export interface ChartConfig extends BoundedObjectConfig {
16
- /** Axis definition. Each key represent an axis, and each value hold axis configuration. */
17
- axes?: Record<
18
- string,
19
- Create<typeof Axis> | Create<typeof NumericAxis> | Create<typeof CategoryAxis> | Create<typeof TimeAxis>
20
- >;
21
-
22
- /** Put axes over data series. */
23
- axesOnTop?: boolean;
24
- }
25
-
26
- export interface ChartInstance extends BoundedObjectInstance {
27
- calculators: Record<string, any>;
28
- axes: Record<string, any>;
29
- }
30
-
31
- export class Chart extends BoundedObject<ChartConfig, ChartInstance> {
32
- declare axes: Record<string, any>;
33
- declare axesOnTop: boolean;
34
-
35
- constructor(config?: ChartConfig) {
36
- super(config);
37
- }
38
-
39
- init(): void {
40
- super.init();
41
-
42
- if (!this.axes) this.axes = {};
43
-
44
- for (let axis in this.axes) {
45
- this.axes[axis] = Axis.create(this.axes[axis]);
46
- }
47
- }
48
-
49
- explore(context: ChartRenderingContext, instance: ChartInstance): void {
50
- instance.calculators = { ...context.axes };
51
-
52
- context.push("axes", instance.calculators);
53
- instance.axes = {};
54
-
55
- //axes need to be registered before children to be processed first
56
- for (let axis in this.axes) {
57
- let axisInstance = instance.getChild(context, this.axes[axis]);
58
- if (axisInstance.scheduleExploreIfVisible(context)) {
59
- instance.axes[axis] = axisInstance;
60
- instance.calculators[axis] = this.axes[axis].report(context, axisInstance);
61
- }
62
- }
63
-
64
- super.explore(context, instance);
65
- }
66
-
67
- exploreCleanup(context: ChartRenderingContext, instance: ChartInstance): void {
68
- context.pop("axes");
69
-
70
- for (let axis in instance.axes) {
71
- instance.axes[axis].widget.reportData(context, instance.axes[axis]);
72
- }
73
- }
74
-
75
- prepare(context: ChartRenderingContext, instance: ChartInstance): void {
76
- context.push("axes", instance.calculators);
77
- super.prepare(context, instance);
78
- }
79
-
80
- prepareCleanup(context: ChartRenderingContext, instance: ChartInstance): void {
81
- context.pop("axes");
82
- super.prepareCleanup(context, instance);
83
- }
84
-
85
- render(context: ChartRenderingContext, instance: ChartInstance, key: string): any[] {
86
- let axes = [];
87
- for (let k in instance.axes) {
88
- axes.push(getContent(instance.axes[k].render(context, key + "-axis-" + k)));
89
- }
90
-
91
- let result = [];
92
-
93
- if (!this.axesOnTop) result.push(axes);
94
-
95
- result.push(this.renderChildren(context, instance));
96
-
97
- if (this.axesOnTop) result.push(axes);
98
-
99
- return result;
100
- }
101
- }
102
-
103
- Chart.prototype.anchors = "0 1 1 0";
104
- Chart.prototype.styled = true;
105
- Chart.prototype.isPureContainer = true;
106
- Chart.prototype.axesOnTop = false;
107
-
108
- Widget.alias("chart", Chart);
1
+ import { Widget, VDOM, getContent } from "../ui/Widget";
2
+ import { BoundedObject, BoundedObjectConfig, BoundedObjectInstance, SvgRenderingContext } from "../svg/BoundedObject";
3
+ import { Axis } from "./axis/Axis";
4
+ import type { NumericAxis } from "./axis/NumericAxis";
5
+ import type { CategoryAxis } from "./axis/CategoryAxis";
6
+ import type { TimeAxis } from "./axis/TimeAxis";
7
+ import { RenderingContext } from "../ui/RenderingContext";
8
+ import { Create } from "../util/Component";
9
+
10
+ /** Typed context interface for chart-related context properties */
11
+ export interface ChartRenderingContext extends SvgRenderingContext {
12
+ axes?: Record<string, any>;
13
+ }
14
+
15
+ export interface ChartConfig extends BoundedObjectConfig {
16
+ /** Axis definition. Each key represent an axis, and each value hold axis configuration. */
17
+ axes?: Record<
18
+ string,
19
+ Create<typeof Axis> | Create<typeof NumericAxis> | Create<typeof CategoryAxis> | Create<typeof TimeAxis>
20
+ >;
21
+
22
+ /** Put axes over data series. */
23
+ axesOnTop?: boolean;
24
+ }
25
+
26
+ export interface ChartInstance extends BoundedObjectInstance {
27
+ calculators: Record<string, any>;
28
+ axes: Record<string, any>;
29
+ }
30
+
31
+ export class Chart extends BoundedObject<ChartConfig, ChartInstance> {
32
+ declare axes: Record<string, any>;
33
+ declare axesOnTop: boolean;
34
+
35
+ constructor(config?: ChartConfig) {
36
+ super(config);
37
+ }
38
+
39
+ init(): void {
40
+ super.init();
41
+
42
+ if (!this.axes) this.axes = {};
43
+
44
+ for (let axis in this.axes) {
45
+ this.axes[axis] = Axis.create(this.axes[axis]);
46
+ }
47
+ }
48
+
49
+ explore(context: ChartRenderingContext, instance: ChartInstance): void {
50
+ instance.calculators = { ...context.axes };
51
+
52
+ context.push("axes", instance.calculators);
53
+ instance.axes = {};
54
+
55
+ //axes need to be registered before children to be processed first
56
+ for (let axis in this.axes) {
57
+ let axisInstance = instance.getChild(context, this.axes[axis]);
58
+ if (axisInstance.scheduleExploreIfVisible(context)) {
59
+ instance.axes[axis] = axisInstance;
60
+ instance.calculators[axis] = this.axes[axis].report(context, axisInstance);
61
+ }
62
+ }
63
+
64
+ super.explore(context, instance);
65
+ }
66
+
67
+ exploreCleanup(context: ChartRenderingContext, instance: ChartInstance): void {
68
+ context.pop("axes");
69
+
70
+ for (let axis in instance.axes) {
71
+ instance.axes[axis].widget.reportData(context, instance.axes[axis]);
72
+ }
73
+ }
74
+
75
+ prepare(context: ChartRenderingContext, instance: ChartInstance): void {
76
+ context.push("axes", instance.calculators);
77
+ super.prepare(context, instance);
78
+ }
79
+
80
+ prepareCleanup(context: ChartRenderingContext, instance: ChartInstance): void {
81
+ context.pop("axes");
82
+ super.prepareCleanup(context, instance);
83
+ }
84
+
85
+ render(context: ChartRenderingContext, instance: ChartInstance, key: string): any[] {
86
+ let axes = [];
87
+ for (let k in instance.axes) {
88
+ axes.push(getContent(instance.axes[k].render(context, key + "-axis-" + k)));
89
+ }
90
+
91
+ let result = [];
92
+
93
+ if (!this.axesOnTop) result.push(axes);
94
+
95
+ result.push(this.renderChildren(context, instance));
96
+
97
+ if (this.axesOnTop) result.push(axes);
98
+
99
+ return result;
100
+ }
101
+ }
102
+
103
+ Chart.prototype.anchors = "0 1 1 0";
104
+ Chart.prototype.styled = true;
105
+ Chart.prototype.isPureContainer = true;
106
+ Chart.prototype.axesOnTop = false;
107
+
108
+ Widget.alias("chart", Chart);
@@ -1,90 +1,90 @@
1
- import { AugmentedViewBase } from "./AugmentedViewBase";
2
- import { isArray } from "../util/isArray";
3
- import { Binding } from "./Binding";
4
- import { View } from "./View";
5
-
6
- export interface ArrayElementViewConfig {
7
- store: View;
8
- arrayAccessor: any;
9
- immutable?: boolean;
10
- recordAlias?: string;
11
- indexAlias?: string;
12
- lengthAlias?: string;
13
- hasNestedAliases?: boolean;
14
- recordBinding?: any;
15
- indexBinding?: any;
16
- lengthBinding?: any;
17
- itemIndex: number;
18
- sealed?: boolean;
19
- }
20
-
21
- export class ArrayElementView extends AugmentedViewBase {
22
- declare arrayAccessor: any;
23
- declare recordAlias: string;
24
- declare indexAlias: string;
25
- declare lengthAlias: string;
26
- declare hasNestedAliases?: boolean;
27
- declare recordBinding?: any;
28
- declare indexBinding?: any;
29
- declare lengthBinding?: any;
30
- declare itemIndex: number;
31
-
32
- constructor(config: ArrayElementViewConfig) {
33
- super(config);
34
- this.hasNestedAliases =
35
- this.recordAlias.indexOf(".") >= 0 || this.indexAlias.indexOf(".") >= 0 || this.lengthAlias.indexOf(".") >= 0;
36
- this.recordBinding = Binding.get(this.recordAlias);
37
- if (this.hasNestedAliases) {
38
- this.indexBinding = Binding.get(this.indexAlias);
39
- this.lengthBinding = Binding.get(this.lengthAlias);
40
- }
41
- }
42
-
43
- getExtraKeyBinding(key: string): any {
44
- if (!key.startsWith(this.recordAlias)) return null;
45
- if (key.length == this.recordAlias.length || key[this.recordAlias.length] == ".") return this.recordBinding;
46
- return null;
47
- }
48
-
49
- deleteExtraKeyValue(key: string): boolean {
50
- if (key != this.recordAlias) throw new Error(`Field ${key} cannot be deleted.`);
51
- const array = this.arrayAccessor.get(this.store.getData());
52
- if (!array) return false;
53
- const newArray = [...array.slice(0, this.itemIndex), ...array.slice(this.itemIndex + 1)];
54
- return this.arrayAccessor.set(newArray, this.store);
55
- }
56
-
57
- setExtraKeyValue(key: string, value: any): boolean {
58
- if (key != this.recordAlias) throw new Error(`Field ${key} is read-only.`);
59
- const array = this.arrayAccessor.get(this.store.getData());
60
- if (!array || value === array[this.itemIndex]) return false;
61
- const newArray = [...array.slice(0, this.itemIndex), value, ...array.slice(this.itemIndex + 1)];
62
- return this.arrayAccessor.set(newArray, this.store);
63
- }
64
-
65
- embedAugmentData(result: any, parentStoreData: any): void {
66
- let array = this.arrayAccessor.get(parentStoreData);
67
- if (!isArray(array)) return;
68
- if (!this.hasNestedAliases) {
69
- result[this.recordAlias] = array[this.itemIndex];
70
- result[this.indexAlias] = this.itemIndex;
71
- result[this.lengthAlias] = array.length;
72
- } else {
73
- let copy = result;
74
- copy = this.recordBinding.set(copy, array[this.itemIndex]);
75
- copy = this.indexBinding.set(copy, this.itemIndex);
76
- copy = this.lengthBinding.set(copy, array.length);
77
- result[this.recordBinding.parts[0]] = copy[this.recordBinding.parts[0]];
78
- result[this.indexBinding.parts[0]] = copy[this.indexBinding.parts[0]];
79
- result[this.lengthBinding.parts[0]] = copy[this.lengthBinding.parts[0]];
80
- }
81
- }
82
-
83
- setIndex(itemIndex: number): void {
84
- this.itemIndex = itemIndex;
85
- }
86
- }
87
-
88
- ArrayElementView.prototype.recordAlias = "$record";
89
- ArrayElementView.prototype.indexAlias = "$index";
90
- ArrayElementView.prototype.lengthAlias = "$length";
1
+ import { AugmentedViewBase } from "./AugmentedViewBase";
2
+ import { isArray } from "../util/isArray";
3
+ import { Binding } from "./Binding";
4
+ import { View } from "./View";
5
+
6
+ export interface ArrayElementViewConfig {
7
+ store: View;
8
+ arrayAccessor: any;
9
+ immutable?: boolean;
10
+ recordAlias?: string;
11
+ indexAlias?: string;
12
+ lengthAlias?: string;
13
+ hasNestedAliases?: boolean;
14
+ recordBinding?: any;
15
+ indexBinding?: any;
16
+ lengthBinding?: any;
17
+ itemIndex: number;
18
+ sealed?: boolean;
19
+ }
20
+
21
+ export class ArrayElementView extends AugmentedViewBase {
22
+ declare arrayAccessor: any;
23
+ declare recordAlias: string;
24
+ declare indexAlias: string;
25
+ declare lengthAlias: string;
26
+ declare hasNestedAliases?: boolean;
27
+ declare recordBinding?: any;
28
+ declare indexBinding?: any;
29
+ declare lengthBinding?: any;
30
+ declare itemIndex: number;
31
+
32
+ constructor(config: ArrayElementViewConfig) {
33
+ super(config);
34
+ this.hasNestedAliases =
35
+ this.recordAlias.indexOf(".") >= 0 || this.indexAlias.indexOf(".") >= 0 || this.lengthAlias.indexOf(".") >= 0;
36
+ this.recordBinding = Binding.get(this.recordAlias);
37
+ if (this.hasNestedAliases) {
38
+ this.indexBinding = Binding.get(this.indexAlias);
39
+ this.lengthBinding = Binding.get(this.lengthAlias);
40
+ }
41
+ }
42
+
43
+ getExtraKeyBinding(key: string): any {
44
+ if (!key.startsWith(this.recordAlias)) return null;
45
+ if (key.length == this.recordAlias.length || key[this.recordAlias.length] == ".") return this.recordBinding;
46
+ return null;
47
+ }
48
+
49
+ deleteExtraKeyValue(key: string): boolean {
50
+ if (key != this.recordAlias) throw new Error(`Field ${key} cannot be deleted.`);
51
+ const array = this.arrayAccessor.get(this.store.getData());
52
+ if (!array) return false;
53
+ const newArray = [...array.slice(0, this.itemIndex), ...array.slice(this.itemIndex + 1)];
54
+ return this.arrayAccessor.set(newArray, this.store);
55
+ }
56
+
57
+ setExtraKeyValue(key: string, value: any): boolean {
58
+ if (key != this.recordAlias) throw new Error(`Field ${key} is read-only.`);
59
+ const array = this.arrayAccessor.get(this.store.getData());
60
+ if (!array || value === array[this.itemIndex]) return false;
61
+ const newArray = [...array.slice(0, this.itemIndex), value, ...array.slice(this.itemIndex + 1)];
62
+ return this.arrayAccessor.set(newArray, this.store);
63
+ }
64
+
65
+ embedAugmentData(result: any, parentStoreData: any): void {
66
+ let array = this.arrayAccessor.get(parentStoreData);
67
+ if (!isArray(array)) return;
68
+ if (!this.hasNestedAliases) {
69
+ result[this.recordAlias] = array[this.itemIndex];
70
+ result[this.indexAlias] = this.itemIndex;
71
+ result[this.lengthAlias] = array.length;
72
+ } else {
73
+ let copy = result;
74
+ copy = this.recordBinding.set(copy, array[this.itemIndex]);
75
+ copy = this.indexBinding.set(copy, this.itemIndex);
76
+ copy = this.lengthBinding.set(copy, array.length);
77
+ result[this.recordBinding.parts[0]] = copy[this.recordBinding.parts[0]];
78
+ result[this.indexBinding.parts[0]] = copy[this.indexBinding.parts[0]];
79
+ result[this.lengthBinding.parts[0]] = copy[this.lengthBinding.parts[0]];
80
+ }
81
+ }
82
+
83
+ setIndex(itemIndex: number): void {
84
+ this.itemIndex = itemIndex;
85
+ }
86
+ }
87
+
88
+ ArrayElementView.prototype.recordAlias = "$record";
89
+ ArrayElementView.prototype.indexAlias = "$index";
90
+ ArrayElementView.prototype.lengthAlias = "$length";