cx 26.0.14 → 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 (249) 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/dist/manifest.js +816 -816
  23. package/dist/ui.js +3 -10
  24. package/dist/widgets.js +18 -6
  25. package/package.json +9 -8
  26. package/src/charts/Chart.ts +108 -108
  27. package/src/data/ArrayElementView.ts +90 -90
  28. package/src/data/AugmentedViewBase.ts +88 -88
  29. package/src/data/Binding.ts +104 -104
  30. package/src/data/ExposedRecordView.ts +95 -95
  31. package/src/data/ExposedValueView.ts +89 -89
  32. package/src/data/Expression.spec.ts +229 -229
  33. package/src/data/Expression.ts +233 -233
  34. package/src/data/Grouper.spec.ts +57 -57
  35. package/src/data/Grouper.ts +158 -158
  36. package/src/data/NestedDataView.ts +43 -43
  37. package/src/data/ReadOnlyDataView.ts +39 -39
  38. package/src/data/Ref.ts +104 -104
  39. package/src/data/Selector.ts +10 -10
  40. package/src/data/Store.ts +52 -52
  41. package/src/data/StoreProxy.ts +19 -19
  42. package/src/data/StoreRef.ts +66 -66
  43. package/src/data/StringTemplate.spec.ts +132 -132
  44. package/src/data/StringTemplate.ts +93 -93
  45. package/src/data/StructuredSelector.spec.ts +113 -113
  46. package/src/data/StructuredSelector.ts +146 -146
  47. package/src/data/SubscribableView.ts +63 -63
  48. package/src/data/ZoomIntoPropertyView.spec.ts +64 -64
  49. package/src/data/ZoomIntoPropertyView.ts +45 -45
  50. package/src/data/computable.spec.ts +87 -87
  51. package/src/data/createStructuredSelector.ts +62 -62
  52. package/src/data/getAccessor.spec.ts +11 -11
  53. package/src/data/getAccessor.ts +74 -74
  54. package/src/data/getSelector.spec.ts +43 -43
  55. package/src/data/getSelector.ts +66 -66
  56. package/src/data/ops/filter.spec.ts +35 -35
  57. package/src/data/ops/filter.ts +9 -9
  58. package/src/data/ops/merge.ts +13 -13
  59. package/src/data/ops/removeTreeNodes.spec.ts +37 -37
  60. package/src/data/ops/updateArray.spec.ts +69 -69
  61. package/src/data/test-types.ts +7 -7
  62. package/src/hooks/useTrigger.ts +26 -26
  63. package/src/index.scss +6 -6
  64. package/src/jsx-dev-runtime.ts +4 -4
  65. package/src/svg/BoundedObject.ts +101 -101
  66. package/src/svg/util/Rect.ts +105 -105
  67. package/src/ui/CSSHelper.ts +17 -17
  68. package/src/ui/Culture.ts +159 -159
  69. package/src/ui/DataProxy.ts +55 -55
  70. package/src/ui/FocusManager.ts +171 -171
  71. package/src/ui/Instance.ts +866 -866
  72. package/src/ui/Prop.ts +140 -140
  73. package/src/ui/RenderingContext.ts +99 -99
  74. package/src/ui/Rescope.ts +49 -49
  75. package/src/ui/StructuredInstanceDataAccessor.ts +32 -32
  76. package/src/ui/VDOM.ts +1 -34
  77. package/src/ui/adapter/ArrayAdapter.spec.ts +55 -55
  78. package/src/ui/adapter/TreeAdapter.spec.ts +76 -76
  79. package/src/ui/adapter/TreeAdapter.ts +185 -185
  80. package/src/ui/app/History.ts +133 -133
  81. package/src/ui/app/Url.spec.ts +50 -50
  82. package/src/ui/app/startAppLoop.tsx +5 -9
  83. package/src/ui/app/startHotAppLoop.ts +41 -41
  84. package/src/ui/layout/Content.ts +30 -30
  85. package/src/ui/layout/FirstVisibleChildLayout.ts +60 -60
  86. package/src/util/Console.ts +13 -13
  87. package/src/util/Format.spec.ts +69 -69
  88. package/src/util/Format.ts +267 -267
  89. package/src/util/addEventListenerWithOptions.ts +41 -41
  90. package/src/util/browserSupportsPassiveEventHandlers.ts +20 -20
  91. package/src/util/color/rgbToHsl.ts +35 -35
  92. package/src/util/getActiveElement.ts +4 -4
  93. package/src/util/hasKey.ts +18 -18
  94. package/src/util/index.ts +55 -55
  95. package/src/util/innerTextTrim.ts +10 -10
  96. package/src/util/isArray.ts +3 -3
  97. package/src/util/isDataRecord.ts +5 -5
  98. package/src/util/isDefined.ts +3 -3
  99. package/src/util/isString.ts +3 -3
  100. package/src/widgets/DocumentTitle.ts +95 -95
  101. package/src/widgets/Sandbox.ts +103 -103
  102. package/src/widgets/autoFocus.ts +9 -9
  103. package/src/widgets/cx.ts +63 -63
  104. package/src/widgets/form/Checkbox.tsx +0 -1
  105. package/src/widgets/form/ColorField.tsx +15 -12
  106. package/src/widgets/form/DateTimeField.tsx +0 -2
  107. package/src/widgets/form/DateTimePicker.tsx +0 -2
  108. package/src/widgets/form/Radio.tsx +0 -1
  109. package/src/widgets/form/Slider.tsx +12 -4
  110. package/src/widgets/form/Switch.tsx +2 -3
  111. package/src/widgets/form/Wheel.tsx +0 -1
  112. package/src/widgets/grid/Grid.tsx +0 -1
  113. package/src/widgets/grid/GridCell.ts +143 -143
  114. package/src/widgets/grid/GridCellEditor.tsx +7 -1
  115. package/src/widgets/icons/calendar.tsx +17 -17
  116. package/src/widgets/icons/check.tsx +13 -13
  117. package/src/widgets/icons/clear.tsx +15 -15
  118. package/src/widgets/icons/close.tsx +20 -20
  119. package/src/widgets/icons/cx.tsx +38 -38
  120. package/src/widgets/icons/drop-down.tsx +15 -15
  121. package/src/widgets/icons/file.tsx +13 -13
  122. package/src/widgets/icons/folder-open.tsx +15 -15
  123. package/src/widgets/icons/folder.tsx +13 -13
  124. package/src/widgets/icons/forward.tsx +22 -22
  125. package/src/widgets/icons/loading.tsx +24 -24
  126. package/src/widgets/icons/menu.tsx +17 -17
  127. package/src/widgets/icons/pixel-picker.tsx +18 -18
  128. package/src/widgets/icons/search.tsx +13 -13
  129. package/src/widgets/icons/sort-asc.tsx +14 -14
  130. package/src/widgets/icons/square.tsx +18 -18
  131. package/src/widgets/nav/Route.ts +142 -142
  132. package/src/widgets/overlay/Dropdown.tsx +762 -762
  133. package/src/widgets/overlay/MsgBox.tsx +141 -141
  134. package/src/widgets/overlay/Overlay.tsx +5 -1
  135. package/src/widgets/overlay/Toast.ts +111 -111
  136. package/src/widgets/overlay/Window.tsx +299 -299
  137. package/src/widgets/overlay/alerts.ts +46 -46
  138. package/src/widgets/overlay/captureMouse.ts +195 -195
  139. package/src/widgets/overlay/createHotPromiseWindowFactory.ts +71 -71
  140. package/src/widgets/overlay/index.d.ts +11 -11
  141. package/src/widgets/overlay/index.ts +11 -11
  142. package/src/widgets/overlay/tooltip-ops.ts +173 -173
  143. package/build/data/ArrayElementView.spec.d.ts +0 -1
  144. package/build/data/ArrayElementView.spec.js +0 -81
  145. package/build/data/Binding.spec.d.ts +0 -1
  146. package/build/data/Binding.spec.js +0 -61
  147. package/build/data/Expression.spec.d.ts +0 -1
  148. package/build/data/Expression.spec.js +0 -196
  149. package/build/data/Grouper.spec.d.ts +0 -1
  150. package/build/data/Grouper.spec.js +0 -48
  151. package/build/data/Ref.spec.d.ts +0 -1
  152. package/build/data/Ref.spec.js +0 -72
  153. package/build/data/Store.spec.d.ts +0 -1
  154. package/build/data/Store.spec.js +0 -19
  155. package/build/data/StoreRef.spec.d.ts +0 -1
  156. package/build/data/StoreRef.spec.js +0 -22
  157. package/build/data/StringTemplate.spec.d.ts +0 -1
  158. package/build/data/StringTemplate.spec.js +0 -112
  159. package/build/data/StructuredSelector.spec.d.ts +0 -1
  160. package/build/data/StructuredSelector.spec.js +0 -102
  161. package/build/data/View.spec.d.ts +0 -1
  162. package/build/data/View.spec.js +0 -44
  163. package/build/data/ZoomIntoPropertyView.spec.d.ts +0 -1
  164. package/build/data/ZoomIntoPropertyView.spec.js +0 -54
  165. package/build/data/comparer.spec.d.ts +0 -1
  166. package/build/data/comparer.spec.js +0 -50
  167. package/build/data/computable.spec.d.ts +0 -1
  168. package/build/data/computable.spec.js +0 -56
  169. package/build/data/createAccessorModelProxy.spec.d.ts +0 -1
  170. package/build/data/createAccessorModelProxy.spec.js +0 -30
  171. package/build/data/createStructuredSelector.spec.d.ts +0 -1
  172. package/build/data/createStructuredSelector.spec.js +0 -42
  173. package/build/data/diff/diffs.spec.d.ts +0 -1
  174. package/build/data/diff/diffs.spec.js +0 -45
  175. package/build/data/getAccessor.spec.d.ts +0 -1
  176. package/build/data/getAccessor.spec.js +0 -10
  177. package/build/data/getSelector.spec.d.ts +0 -1
  178. package/build/data/getSelector.spec.js +0 -36
  179. package/build/data/ops/append.spec.d.ts +0 -1
  180. package/build/data/ops/append.spec.js +0 -24
  181. package/build/data/ops/filter.spec.d.ts +0 -1
  182. package/build/data/ops/filter.spec.js +0 -25
  183. package/build/data/ops/findTreeNode.spec.d.ts +0 -1
  184. package/build/data/ops/findTreeNode.spec.js +0 -20
  185. package/build/data/ops/merge.spec.d.ts +0 -1
  186. package/build/data/ops/merge.spec.js +0 -23
  187. package/build/data/ops/removeTreeNodes.spec.d.ts +0 -1
  188. package/build/data/ops/removeTreeNodes.spec.js +0 -35
  189. package/build/data/ops/updateArray.spec.d.ts +0 -1
  190. package/build/data/ops/updateArray.spec.js +0 -33
  191. package/build/data/ops/updateTree.spec.d.ts +0 -1
  192. package/build/data/ops/updateTree.spec.js +0 -44
  193. package/build/hooks/invokeCallback.spec.d.ts +0 -1
  194. package/build/hooks/invokeCallback.spec.js +0 -44
  195. package/build/hooks/resolveCallback.spec.d.ts +0 -1
  196. package/build/hooks/resolveCallback.spec.js +0 -35
  197. package/build/hooks/store.spec.d.ts +0 -1
  198. package/build/hooks/store.spec.js +0 -48
  199. package/build/hooks/useTrigger.spec.d.ts +0 -1
  200. package/build/hooks/useTrigger.spec.js +0 -59
  201. package/build/ui/Controller.spec.d.ts +0 -1
  202. package/build/ui/Controller.spec.js +0 -247
  203. package/build/ui/Cx.spec.d.ts +0 -1
  204. package/build/ui/Cx.spec.js +0 -153
  205. package/build/ui/DataProxy.spec.d.ts +0 -1
  206. package/build/ui/DataProxy.spec.js +0 -208
  207. package/build/ui/IsolatedScope.spec.d.ts +0 -1
  208. package/build/ui/IsolatedScope.spec.js +0 -42
  209. package/build/ui/PureContainer.spec.d.ts +0 -1
  210. package/build/ui/PureContainer.spec.js +0 -149
  211. package/build/ui/Repeater.spec.d.ts +0 -1
  212. package/build/ui/Repeater.spec.js +0 -109
  213. package/build/ui/Rescope.spec.d.ts +0 -1
  214. package/build/ui/Rescope.spec.js +0 -134
  215. package/build/ui/Restate.spec.d.ts +0 -1
  216. package/build/ui/Restate.spec.js +0 -257
  217. package/build/ui/adapter/ArrayAdapter.spec.d.ts +0 -1
  218. package/build/ui/adapter/ArrayAdapter.spec.js +0 -44
  219. package/build/ui/adapter/TreeAdapter.spec.d.ts +0 -1
  220. package/build/ui/adapter/TreeAdapter.spec.js +0 -71
  221. package/build/ui/app/Url.spec.d.ts +0 -1
  222. package/build/ui/app/Url.spec.js +0 -43
  223. package/build/ui/createFunctionalComponent.spec.d.ts +0 -1
  224. package/build/ui/createFunctionalComponent.spec.js +0 -272
  225. package/build/ui/layout/ContentPlaceholder.spec.d.ts +0 -1
  226. package/build/ui/layout/ContentPlaceholder.spec.js +0 -333
  227. package/build/ui/layout/FirstVisibleChildLayout.spec.d.ts +0 -1
  228. package/build/ui/layout/FirstVisibleChildLayout.spec.js +0 -101
  229. package/build/util/Format.spec.d.ts +0 -1
  230. package/build/util/Format.spec.js +0 -58
  231. package/build/util/TraversalStack.spec.d.ts +0 -1
  232. package/build/util/TraversalStack.spec.js +0 -43
  233. package/build/util/date/upperBoundCheck.spec.d.ts +0 -1
  234. package/build/util/date/upperBoundCheck.spec.js +0 -22
  235. package/build/util/getSearchQueryPredicate.spec.d.ts +0 -1
  236. package/build/util/getSearchQueryPredicate.spec.js +0 -33
  237. package/build/util/isValidIdentifierName.spec.d.ts +0 -1
  238. package/build/util/isValidIdentifierName.spec.js +0 -28
  239. package/build/util/routeAppend.spec.d.ts +0 -1
  240. package/build/util/routeAppend.spec.js +0 -14
  241. package/build/widgets/AccessorBindings.spec.d.ts +0 -1
  242. package/build/widgets/AccessorBindings.spec.js +0 -40
  243. package/build/widgets/HtmlElement.spec.d.ts +0 -1
  244. package/build/widgets/HtmlElement.spec.js +0 -38
  245. package/build/widgets/form/ValidationGroup.spec.d.ts +0 -1
  246. package/build/widgets/form/ValidationGroup.spec.js +0 -62
  247. package/build/widgets/nav/Route.spec.d.ts +0 -1
  248. package/build/widgets/nav/Route.spec.js +0 -15
  249. 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
  }
@@ -11947,7 +11949,9 @@ class SliderComponent extends VDOM.Component {
11947
11949
  style: data.style,
11948
11950
  id: data.id,
11949
11951
  onClick: (e) => this.onClick(e),
11950
- ref: (el) => (this.dom.el = el || undefined),
11952
+ ref: (el) => {
11953
+ this.dom.el = el || undefined;
11954
+ },
11951
11955
  onMouseMove: (e) => tooltipMouseMove$1(e, ...getFieldTooltip(instance)),
11952
11956
  onMouseLeave: (e) => tooltipMouseLeave$1(e, ...getFieldTooltip(instance)),
11953
11957
  children: [
@@ -11969,7 +11973,9 @@ class SliderComponent extends VDOM.Component {
11969
11973
  "div",
11970
11974
  {
11971
11975
  className: CSS.element(baseClass, "space"),
11972
- ref: (c) => (this.dom.range = c || undefined),
11976
+ ref: (c) => {
11977
+ this.dom.range = c || undefined;
11978
+ },
11973
11979
  children: [
11974
11980
  widget.showFrom &&
11975
11981
  jsx(
@@ -11985,7 +11991,9 @@ class SliderComponent extends VDOM.Component {
11985
11991
  }),
11986
11992
  onMouseLeave: (e) => this.onHandleMouseLeave(e, "from"),
11987
11993
  onTouchStart: (e) => this.onHandleMouseDown(e, "from"),
11988
- ref: (c) => (this.dom.from = c || undefined),
11994
+ ref: (c) => {
11995
+ this.dom.from = c || undefined;
11996
+ },
11989
11997
  },
11990
11998
  "from",
11991
11999
  ),
@@ -12003,7 +12011,9 @@ class SliderComponent extends VDOM.Component {
12003
12011
  }),
12004
12012
  onMouseLeave: (e) => this.onHandleMouseLeave(e, "to"),
12005
12013
  onTouchStart: (e) => this.onHandleMouseDown(e, "to"),
12006
- ref: (c) => (this.dom.to = c || undefined),
12014
+ ref: (c) => {
12015
+ this.dom.to = c || undefined;
12016
+ },
12007
12017
  },
12008
12018
  "to",
12009
12019
  ),
@@ -13678,7 +13688,9 @@ class GridCellEditorCmp extends VDOM.Component {
13678
13688
  render() {
13679
13689
  let { className, style, children } = this.props;
13680
13690
  return jsx("div", {
13681
- ref: (el) => (this.el = el),
13691
+ ref: (el) => {
13692
+ this.el = el;
13693
+ },
13682
13694
  className: className,
13683
13695
  style: style,
13684
13696
  children: children,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cx",
3
- "version": "26.0.14",
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";