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.
- package/build/ui/VDOM.d.ts +1 -20
- package/build/ui/VDOM.js +1 -3
- package/build/ui/Widget.d.ts +1 -1
- package/build/ui/app/startAppLoop.js +2 -10
- package/build/widgets/form/Checkbox.d.ts +0 -1
- package/build/widgets/form/Checkbox.js +1 -0
- package/build/widgets/form/ColorField.d.ts +0 -1
- package/build/widgets/form/ColorField.js +2 -2
- package/build/widgets/form/DateTimeField.d.ts +0 -2
- package/build/widgets/form/DateTimeField.js +1 -0
- package/build/widgets/form/DateTimePicker.d.ts +0 -2
- package/build/widgets/form/DateTimePicker.js +1 -0
- package/build/widgets/form/Radio.d.ts +0 -1
- package/build/widgets/form/Slider.js +9 -1
- package/build/widgets/form/Switch.d.ts +0 -1
- package/build/widgets/form/Switch.js +1 -1
- package/build/widgets/form/Wheel.d.ts +0 -1
- package/build/widgets/grid/Grid.d.ts +0 -2
- package/build/widgets/grid/GridCellEditor.js +3 -1
- package/build/widgets/overlay/Overlay.d.ts +3 -0
- package/build/widgets/overlay/Overlay.js +3 -2
- package/build/widgets/overlay/createHotPromiseWindowFactory.js +0 -1
- package/dist/manifest.js +810 -810
- package/dist/ui.js +3 -10
- package/dist/widgets.js +18 -7
- package/package.json +9 -8
- package/src/charts/Chart.ts +108 -108
- package/src/data/ArrayElementView.ts +90 -90
- package/src/data/AugmentedViewBase.ts +88 -88
- package/src/data/Binding.ts +104 -104
- package/src/data/ExposedRecordView.ts +95 -95
- package/src/data/ExposedValueView.ts +89 -89
- package/src/data/Expression.spec.ts +229 -229
- package/src/data/Expression.ts +233 -233
- package/src/data/Grouper.spec.ts +57 -57
- package/src/data/Grouper.ts +158 -158
- package/src/data/NestedDataView.ts +43 -43
- package/src/data/ReadOnlyDataView.ts +39 -39
- package/src/data/Ref.ts +104 -104
- package/src/data/Selector.ts +10 -10
- package/src/data/Store.ts +52 -52
- package/src/data/StoreProxy.ts +19 -19
- package/src/data/StoreRef.ts +66 -66
- package/src/data/StringTemplate.spec.ts +132 -132
- package/src/data/StringTemplate.ts +93 -93
- package/src/data/StructuredSelector.spec.ts +113 -113
- package/src/data/StructuredSelector.ts +146 -146
- package/src/data/SubscribableView.ts +63 -63
- package/src/data/ZoomIntoPropertyView.spec.ts +64 -64
- package/src/data/ZoomIntoPropertyView.ts +45 -45
- package/src/data/computable.spec.ts +87 -87
- package/src/data/createStructuredSelector.ts +62 -62
- package/src/data/getAccessor.spec.ts +11 -11
- package/src/data/getAccessor.ts +74 -74
- package/src/data/getSelector.spec.ts +43 -43
- package/src/data/getSelector.ts +66 -66
- package/src/data/ops/filter.spec.ts +35 -35
- package/src/data/ops/filter.ts +9 -9
- package/src/data/ops/merge.ts +13 -13
- package/src/data/ops/removeTreeNodes.spec.ts +37 -37
- package/src/data/ops/updateArray.spec.ts +69 -69
- package/src/data/test-types.ts +7 -7
- package/src/hooks/useTrigger.ts +26 -26
- package/src/index.scss +6 -6
- package/src/jsx-dev-runtime.ts +4 -4
- package/src/jsx-runtime.spec.tsx +38 -9
- package/src/svg/BoundedObject.ts +101 -101
- package/src/svg/util/Rect.ts +105 -105
- package/src/ui/CSSHelper.ts +17 -17
- package/src/ui/Culture.ts +159 -159
- package/src/ui/DataProxy.ts +55 -55
- package/src/ui/FocusManager.ts +171 -171
- package/src/ui/Instance.ts +866 -866
- package/src/ui/Prop.ts +140 -140
- package/src/ui/RenderingContext.ts +99 -99
- package/src/ui/Rescope.ts +49 -49
- package/src/ui/StructuredInstanceDataAccessor.ts +32 -32
- package/src/ui/VDOM.ts +1 -34
- package/src/ui/adapter/ArrayAdapter.spec.ts +55 -55
- package/src/ui/adapter/TreeAdapter.spec.ts +76 -76
- package/src/ui/adapter/TreeAdapter.ts +185 -185
- package/src/ui/app/History.ts +133 -133
- package/src/ui/app/Url.spec.ts +50 -50
- package/src/ui/app/startAppLoop.tsx +5 -9
- package/src/ui/app/startHotAppLoop.ts +41 -41
- package/src/ui/layout/Content.ts +30 -30
- package/src/ui/layout/FirstVisibleChildLayout.ts +60 -60
- package/src/util/Console.ts +13 -13
- package/src/util/Format.spec.ts +69 -69
- package/src/util/Format.ts +267 -267
- package/src/util/addEventListenerWithOptions.ts +41 -41
- package/src/util/browserSupportsPassiveEventHandlers.ts +20 -20
- package/src/util/color/rgbToHsl.ts +35 -35
- package/src/util/getActiveElement.ts +4 -4
- package/src/util/hasKey.ts +18 -18
- package/src/util/index.ts +55 -55
- package/src/util/innerTextTrim.ts +10 -10
- package/src/util/isArray.ts +3 -3
- package/src/util/isDataRecord.ts +5 -5
- package/src/util/isDefined.ts +3 -3
- package/src/util/isString.ts +3 -3
- package/src/widgets/DocumentTitle.ts +95 -95
- package/src/widgets/Sandbox.ts +103 -103
- package/src/widgets/autoFocus.ts +9 -9
- package/src/widgets/cx.ts +63 -63
- package/src/widgets/form/Checkbox.tsx +0 -1
- package/src/widgets/form/ColorField.tsx +15 -12
- package/src/widgets/form/DateTimeField.tsx +0 -2
- package/src/widgets/form/DateTimePicker.tsx +0 -2
- package/src/widgets/form/Radio.tsx +0 -1
- package/src/widgets/form/Slider.tsx +12 -4
- package/src/widgets/form/Switch.tsx +2 -3
- package/src/widgets/form/Wheel.tsx +0 -1
- package/src/widgets/grid/Grid.tsx +0 -1
- package/src/widgets/grid/GridCell.ts +143 -143
- package/src/widgets/grid/GridCellEditor.tsx +7 -1
- package/src/widgets/icons/calendar.tsx +17 -17
- package/src/widgets/icons/check.tsx +13 -13
- package/src/widgets/icons/clear.tsx +15 -15
- package/src/widgets/icons/close.tsx +20 -20
- package/src/widgets/icons/cx.tsx +38 -38
- package/src/widgets/icons/drop-down.tsx +15 -15
- package/src/widgets/icons/file.tsx +13 -13
- package/src/widgets/icons/folder-open.tsx +15 -15
- package/src/widgets/icons/folder.tsx +13 -13
- package/src/widgets/icons/forward.tsx +22 -22
- package/src/widgets/icons/loading.tsx +24 -24
- package/src/widgets/icons/menu.tsx +17 -17
- package/src/widgets/icons/pixel-picker.tsx +18 -18
- package/src/widgets/icons/search.tsx +13 -13
- package/src/widgets/icons/sort-asc.tsx +14 -14
- package/src/widgets/icons/square.tsx +18 -18
- package/src/widgets/nav/Route.ts +142 -142
- package/src/widgets/overlay/Dropdown.tsx +762 -762
- package/src/widgets/overlay/MsgBox.tsx +141 -141
- package/src/widgets/overlay/Overlay.tsx +5 -1
- package/src/widgets/overlay/Toast.ts +111 -111
- package/src/widgets/overlay/Window.tsx +299 -299
- package/src/widgets/overlay/alerts.ts +46 -46
- package/src/widgets/overlay/captureMouse.ts +195 -195
- package/src/widgets/overlay/createHotPromiseWindowFactory.ts +0 -1
- package/src/widgets/overlay/index.d.ts +11 -11
- package/src/widgets/overlay/index.ts +11 -11
- package/src/widgets/overlay/tooltip-ops.ts +173 -173
- package/build/data/ArrayElementView.spec.d.ts +0 -1
- package/build/data/ArrayElementView.spec.js +0 -81
- package/build/data/Binding.spec.d.ts +0 -1
- package/build/data/Binding.spec.js +0 -61
- package/build/data/Expression.spec.d.ts +0 -1
- package/build/data/Expression.spec.js +0 -196
- package/build/data/Grouper.spec.d.ts +0 -1
- package/build/data/Grouper.spec.js +0 -48
- package/build/data/Ref.spec.d.ts +0 -1
- package/build/data/Ref.spec.js +0 -72
- package/build/data/Store.spec.d.ts +0 -1
- package/build/data/Store.spec.js +0 -19
- package/build/data/StoreRef.spec.d.ts +0 -1
- package/build/data/StoreRef.spec.js +0 -22
- package/build/data/StringTemplate.spec.d.ts +0 -1
- package/build/data/StringTemplate.spec.js +0 -112
- package/build/data/StructuredSelector.spec.d.ts +0 -1
- package/build/data/StructuredSelector.spec.js +0 -102
- package/build/data/View.spec.d.ts +0 -1
- package/build/data/View.spec.js +0 -44
- package/build/data/ZoomIntoPropertyView.spec.d.ts +0 -1
- package/build/data/ZoomIntoPropertyView.spec.js +0 -54
- package/build/data/comparer.spec.d.ts +0 -1
- package/build/data/comparer.spec.js +0 -50
- package/build/data/computable.spec.d.ts +0 -1
- package/build/data/computable.spec.js +0 -56
- package/build/data/createAccessorModelProxy.spec.d.ts +0 -1
- package/build/data/createAccessorModelProxy.spec.js +0 -30
- package/build/data/createStructuredSelector.spec.d.ts +0 -1
- package/build/data/createStructuredSelector.spec.js +0 -42
- package/build/data/diff/diffs.spec.d.ts +0 -1
- package/build/data/diff/diffs.spec.js +0 -45
- package/build/data/getAccessor.spec.d.ts +0 -1
- package/build/data/getAccessor.spec.js +0 -10
- package/build/data/getSelector.spec.d.ts +0 -1
- package/build/data/getSelector.spec.js +0 -36
- package/build/data/ops/append.spec.d.ts +0 -1
- package/build/data/ops/append.spec.js +0 -24
- package/build/data/ops/filter.spec.d.ts +0 -1
- package/build/data/ops/filter.spec.js +0 -25
- package/build/data/ops/findTreeNode.spec.d.ts +0 -1
- package/build/data/ops/findTreeNode.spec.js +0 -20
- package/build/data/ops/merge.spec.d.ts +0 -1
- package/build/data/ops/merge.spec.js +0 -23
- package/build/data/ops/removeTreeNodes.spec.d.ts +0 -1
- package/build/data/ops/removeTreeNodes.spec.js +0 -35
- package/build/data/ops/updateArray.spec.d.ts +0 -1
- package/build/data/ops/updateArray.spec.js +0 -33
- package/build/data/ops/updateTree.spec.d.ts +0 -1
- package/build/data/ops/updateTree.spec.js +0 -44
- package/build/hooks/invokeCallback.spec.d.ts +0 -1
- package/build/hooks/invokeCallback.spec.js +0 -44
- package/build/hooks/resolveCallback.spec.d.ts +0 -1
- package/build/hooks/resolveCallback.spec.js +0 -35
- package/build/hooks/store.spec.d.ts +0 -1
- package/build/hooks/store.spec.js +0 -48
- package/build/hooks/useTrigger.spec.d.ts +0 -1
- package/build/hooks/useTrigger.spec.js +0 -59
- package/build/ui/Controller.spec.d.ts +0 -1
- package/build/ui/Controller.spec.js +0 -247
- package/build/ui/Cx.spec.d.ts +0 -1
- package/build/ui/Cx.spec.js +0 -153
- package/build/ui/DataProxy.spec.d.ts +0 -1
- package/build/ui/DataProxy.spec.js +0 -208
- package/build/ui/IsolatedScope.spec.d.ts +0 -1
- package/build/ui/IsolatedScope.spec.js +0 -42
- package/build/ui/PureContainer.spec.d.ts +0 -1
- package/build/ui/PureContainer.spec.js +0 -149
- package/build/ui/Repeater.spec.d.ts +0 -1
- package/build/ui/Repeater.spec.js +0 -109
- package/build/ui/Rescope.spec.d.ts +0 -1
- package/build/ui/Rescope.spec.js +0 -134
- package/build/ui/Restate.spec.d.ts +0 -1
- package/build/ui/Restate.spec.js +0 -257
- package/build/ui/adapter/ArrayAdapter.spec.d.ts +0 -1
- package/build/ui/adapter/ArrayAdapter.spec.js +0 -44
- package/build/ui/adapter/TreeAdapter.spec.d.ts +0 -1
- package/build/ui/adapter/TreeAdapter.spec.js +0 -71
- package/build/ui/app/Url.spec.d.ts +0 -1
- package/build/ui/app/Url.spec.js +0 -43
- package/build/ui/createFunctionalComponent.spec.d.ts +0 -1
- package/build/ui/createFunctionalComponent.spec.js +0 -272
- package/build/ui/layout/ContentPlaceholder.spec.d.ts +0 -1
- package/build/ui/layout/ContentPlaceholder.spec.js +0 -333
- package/build/ui/layout/FirstVisibleChildLayout.spec.d.ts +0 -1
- package/build/ui/layout/FirstVisibleChildLayout.spec.js +0 -101
- package/build/util/Format.spec.d.ts +0 -1
- package/build/util/Format.spec.js +0 -58
- package/build/util/TraversalStack.spec.d.ts +0 -1
- package/build/util/TraversalStack.spec.js +0 -43
- package/build/util/date/upperBoundCheck.spec.d.ts +0 -1
- package/build/util/date/upperBoundCheck.spec.js +0 -22
- package/build/util/getSearchQueryPredicate.spec.d.ts +0 -1
- package/build/util/getSearchQueryPredicate.spec.js +0 -33
- package/build/util/isValidIdentifierName.spec.d.ts +0 -1
- package/build/util/isValidIdentifierName.spec.js +0 -28
- package/build/util/routeAppend.spec.d.ts +0 -1
- package/build/util/routeAppend.spec.js +0 -14
- package/build/widgets/AccessorBindings.spec.d.ts +0 -1
- package/build/widgets/AccessorBindings.spec.js +0 -40
- package/build/widgets/HtmlElement.spec.d.ts +0 -1
- package/build/widgets/HtmlElement.spec.js +0 -38
- package/build/widgets/form/ValidationGroup.spec.d.ts +0 -1
- package/build/widgets/form/ValidationGroup.spec.js +0 -62
- package/build/widgets/nav/Route.spec.d.ts +0 -1
- package/build/widgets/nav/Route.spec.js +0 -15
- 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$
|
|
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 =
|
|
3580
|
-
|
|
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.
|
|
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) =>
|
|
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) =>
|
|
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) =>
|
|
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) =>
|
|
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) =>
|
|
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
|
|
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
|
|
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": "^
|
|
88
|
-
"@types/react-dom": "^
|
|
89
|
-
"@types/react-test-renderer": "^
|
|
90
|
-
"react-test-renderer": "^
|
|
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",
|
package/src/charts/Chart.ts
CHANGED
|
@@ -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";
|