cx 26.0.14 → 26.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/Widget.js +0 -5
- package/build/ui/app/startAppLoop.js +2 -10
- package/build/util/Component.js +5 -0
- package/build/util/test/createTestRenderer.d.ts +3 -1
- package/build/util/test/createTestRenderer.js +8 -2
- 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/icons/calendar.js +4 -3
- package/build/widgets/icons/check.js +2 -2
- package/build/widgets/icons/clear.js +2 -2
- package/build/widgets/icons/close.js +2 -2
- package/build/widgets/icons/cx.js +2 -2
- package/build/widgets/icons/drop-down.js +2 -2
- package/build/widgets/icons/file.js +2 -2
- package/build/widgets/icons/folder-open.js +2 -2
- package/build/widgets/icons/folder.js +2 -2
- package/build/widgets/icons/forward.js +2 -2
- package/build/widgets/icons/loading.js +2 -2
- package/build/widgets/icons/menu.js +2 -2
- package/build/widgets/icons/pixel-picker.js +2 -2
- package/build/widgets/icons/search.js +2 -2
- package/build/widgets/icons/sort-asc.js +2 -2
- package/build/widgets/icons/square.js +2 -2
- package/build/widgets/overlay/Overlay.d.ts +3 -0
- package/build/widgets/overlay/Overlay.js +3 -2
- package/dist/manifest.js +867 -867
- package/dist/ui.js +4 -18
- package/dist/util.js +4 -0
- package/dist/widgets.js +395 -319
- package/package.json +11 -8
- package/src/charts/Chart.ts +108 -108
- package/src/core.d.ts +182 -182
- package/src/data/Expression.spec.ts +229 -229
- package/src/data/Expression.ts +233 -233
- package/src/data/Grouper.ts +158 -158
- package/src/data/Selector.ts +10 -10
- package/src/data/StringTemplate.spec.ts +132 -132
- package/src/data/StructuredSelector.ts +146 -146
- package/src/data/ZoomIntoPropertyView.spec.ts +64 -64
- package/src/data/comparer.ts +78 -78
- 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/ops/updateArray.ts +31 -31
- package/src/data/test-types.ts +7 -7
- package/src/hooks/invokeCallback.spec.tsx +4 -4
- package/src/hooks/resolveCallback.spec.tsx +4 -4
- package/src/hooks/store.spec.tsx +15 -15
- package/src/hooks/useTrigger.spec.tsx +16 -10
- package/src/hooks/useTrigger.ts +26 -26
- package/src/index.scss +6 -6
- package/src/jsx-runtime.ts +79 -79
- package/src/svg/BoundedObject.ts +101 -101
- package/src/svg/util/Rect.ts +105 -105
- package/src/ui/CSS.ts +87 -87
- package/src/ui/CSSHelper.ts +17 -17
- package/src/ui/ContentResolver.spec.tsx +31 -29
- package/src/ui/Controller.spec.tsx +47 -39
- package/src/ui/Culture.ts +159 -159
- package/src/ui/Cx.spec.tsx +10 -8
- package/src/ui/DataProxy.spec.tsx +18 -18
- package/src/ui/Instance.ts +866 -866
- package/src/ui/IsolatedScope.spec.tsx +16 -9
- package/src/ui/Prop.ts +140 -140
- package/src/ui/PureContainer.spec.tsx +20 -18
- package/src/ui/RenderingContext.ts +99 -99
- package/src/ui/Repeater.spec.tsx +8 -6
- package/src/ui/Rescope.spec.tsx +13 -13
- package/src/ui/Restate.spec.tsx +31 -27
- package/src/ui/StructuredInstanceDataAccessor.ts +32 -32
- package/src/ui/VDOM.ts +1 -34
- package/src/ui/Widget.tsx +0 -7
- 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/createFunctionalComponent.spec.tsx +20 -18
- package/src/ui/layout/ContentPlaceholder.spec.tsx +46 -34
- package/src/ui/layout/FirstVisibleChildLayout.spec.tsx +31 -19
- package/src/ui/layout/FirstVisibleChildLayout.ts +60 -60
- package/src/ui/selection/PropertySelection.ts +87 -87
- package/src/util/Component.spec.ts +30 -0
- package/src/util/Component.ts +301 -296
- package/src/util/Console.ts +13 -13
- package/src/util/DOM.ts +88 -88
- package/src/util/hasKey.ts +18 -18
- package/src/util/index.ts +55 -55
- package/src/util/isArray.ts +3 -3
- package/src/util/isDefined.ts +3 -3
- package/src/util/isString.ts +3 -3
- package/src/util/test/createTestRenderer.tsx +9 -2
- package/src/widgets/AccessorBindings.spec.tsx +4 -4
- package/src/widgets/DocumentTitle.ts +95 -95
- package/src/widgets/HtmlElement.spec.tsx +6 -6
- package/src/widgets/ReactElementWrapper.spec.tsx +37 -37
- 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/ValidationGroup.spec.tsx +12 -12
- package/src/widgets/form/Wheel.tsx +0 -1
- package/src/widgets/grid/Grid.tsx +0 -1
- package/src/widgets/grid/GridCellEditor.tsx +7 -1
- package/src/widgets/icons/calendar.tsx +20 -15
- package/src/widgets/icons/check.tsx +2 -1
- package/src/widgets/icons/clear.tsx +2 -1
- package/src/widgets/icons/close.tsx +2 -2
- package/src/widgets/icons/cx.tsx +2 -1
- package/src/widgets/icons/drop-down.tsx +2 -1
- package/src/widgets/icons/file.tsx +2 -1
- package/src/widgets/icons/folder-open.tsx +2 -1
- package/src/widgets/icons/folder.tsx +2 -1
- package/src/widgets/icons/forward.tsx +2 -1
- package/src/widgets/icons/loading.tsx +2 -1
- package/src/widgets/icons/menu.tsx +2 -1
- package/src/widgets/icons/pixel-picker.tsx +2 -2
- package/src/widgets/icons/search.tsx +2 -1
- package/src/widgets/icons/sort-asc.tsx +2 -1
- package/src/widgets/icons/square.tsx +2 -1
- package/src/widgets/nav/Route.spec.tsx +2 -2
- package/src/widgets/overlay/Overlay.tsx +5 -1
- package/src/widgets/overlay/captureMouse.ts +195 -195
- package/src/widgets/overlay/createHotPromiseWindowFactory.ts +71 -71
- package/src/widgets/overlay/index.d.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/src/hooks/store.spec.tsx
CHANGED
|
@@ -7,7 +7,7 @@ import { createFunctionalComponent } from "../ui/createFunctionalComponent";
|
|
|
7
7
|
import { ref } from "./store";
|
|
8
8
|
|
|
9
9
|
describe("ref", () => {
|
|
10
|
-
it("allows store references in functional components", () => {
|
|
10
|
+
it("allows store references in functional components", async () => {
|
|
11
11
|
const FComp = createFunctionalComponent(({}) => {
|
|
12
12
|
let testValue = ref({ bind: "x", defaultValue: 10 });
|
|
13
13
|
return (
|
|
@@ -19,7 +19,7 @@ describe("ref", () => {
|
|
|
19
19
|
|
|
20
20
|
let store = new Store();
|
|
21
21
|
|
|
22
|
-
const component = createTestRenderer(store, FComp);
|
|
22
|
+
const component = await createTestRenderer(store, FComp);
|
|
23
23
|
|
|
24
24
|
let tree = component.toJSON();
|
|
25
25
|
assert.deepEqual(tree, {
|
|
@@ -29,7 +29,7 @@ describe("ref", () => {
|
|
|
29
29
|
});
|
|
30
30
|
});
|
|
31
31
|
|
|
32
|
-
it("can be used to adapt any prop passed to a functional component", () => {
|
|
32
|
+
it("can be used to adapt any prop passed to a functional component", async () => {
|
|
33
33
|
const FComp = createFunctionalComponent(({ value }: { value: Prop<any> }) => {
|
|
34
34
|
return (
|
|
35
35
|
<cx>
|
|
@@ -40,8 +40,8 @@ describe("ref", () => {
|
|
|
40
40
|
|
|
41
41
|
let store = new Store({ data: { value: 100 } });
|
|
42
42
|
|
|
43
|
-
function test(value: Prop<any>, expectation: any) {
|
|
44
|
-
const component = createTestRenderer(store, <FComp value={value} />);
|
|
43
|
+
async function test(value: Prop<any>, expectation: any) {
|
|
44
|
+
const component = await createTestRenderer(store, <FComp value={value} />);
|
|
45
45
|
let tree = component.toJSON();
|
|
46
46
|
assert.deepEqual(tree, {
|
|
47
47
|
type: "div",
|
|
@@ -50,18 +50,18 @@ describe("ref", () => {
|
|
|
50
50
|
});
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
test({ bind: "value" }, "x100");
|
|
54
|
-
test({ expr: "{value}" }, "x100");
|
|
55
|
-
test({ tpl: "{value:n;2}" }, "x100.00");
|
|
56
|
-
test(200, "x200");
|
|
57
|
-
test(() => 500, "x500");
|
|
58
|
-
test(
|
|
53
|
+
await test({ bind: "value" }, "x100");
|
|
54
|
+
await test({ expr: "{value}" }, "x100");
|
|
55
|
+
await test({ tpl: "{value:n;2}" }, "x100.00");
|
|
56
|
+
await test(200, "x200");
|
|
57
|
+
await test(() => 500, "x500");
|
|
58
|
+
await test(
|
|
59
59
|
computable("value", (value: string) => value + 100),
|
|
60
60
|
"x200",
|
|
61
61
|
);
|
|
62
|
-
test(null, "xnull");
|
|
63
|
-
test(undefined, "xundefined");
|
|
64
|
-
test(0, "x0");
|
|
65
|
-
test(false, "xfalse");
|
|
62
|
+
await test(null, "xnull");
|
|
63
|
+
await test(undefined, "xundefined");
|
|
64
|
+
await test(0, "x0");
|
|
65
|
+
await test(false, "xfalse");
|
|
66
66
|
});
|
|
67
67
|
});
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import assert from "assert";
|
|
2
|
-
import { createTestRenderer } from "../util/test/createTestRenderer";
|
|
2
|
+
import { createTestRenderer, act } from "../util/test/createTestRenderer";
|
|
3
3
|
import { Store } from "../data/Store";
|
|
4
4
|
import { createFunctionalComponent } from "../ui/createFunctionalComponent";
|
|
5
5
|
import { useTrigger } from "./useTrigger";
|
|
6
6
|
|
|
7
7
|
describe("useTrigger", () => {
|
|
8
|
-
it("works", () => {
|
|
8
|
+
it("works", async () => {
|
|
9
9
|
let last = null;
|
|
10
10
|
|
|
11
11
|
const FComp = createFunctionalComponent(({ ...props }) => {
|
|
@@ -23,17 +23,19 @@ describe("useTrigger", () => {
|
|
|
23
23
|
let store = new Store();
|
|
24
24
|
let test = store.ref("test", 1);
|
|
25
25
|
|
|
26
|
-
const component = createTestRenderer(store, FComp);
|
|
26
|
+
const component = await createTestRenderer(store, FComp);
|
|
27
27
|
|
|
28
28
|
component.toJSON();
|
|
29
29
|
assert.equal(last, null); //trigger did not fire because it didn't receive true as the last argument
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
await act(async () => {
|
|
32
|
+
test.set(2);
|
|
33
|
+
});
|
|
32
34
|
component.toJSON();
|
|
33
35
|
assert.equal(last, 2);
|
|
34
36
|
});
|
|
35
37
|
|
|
36
|
-
it("fires immediately if the last argument is true", () => {
|
|
38
|
+
it("fires immediately if the last argument is true", async () => {
|
|
37
39
|
let last = null;
|
|
38
40
|
|
|
39
41
|
const FComp = createFunctionalComponent(({ ...props }) => {
|
|
@@ -55,17 +57,19 @@ describe("useTrigger", () => {
|
|
|
55
57
|
let store = new Store();
|
|
56
58
|
let test = store.ref("test", 1);
|
|
57
59
|
|
|
58
|
-
const component = createTestRenderer(store, FComp);
|
|
60
|
+
const component = await createTestRenderer(store, FComp);
|
|
59
61
|
|
|
60
62
|
component.toJSON();
|
|
61
63
|
assert.equal(last, 1);
|
|
62
64
|
|
|
63
|
-
|
|
65
|
+
await act(async () => {
|
|
66
|
+
test.set(2);
|
|
67
|
+
});
|
|
64
68
|
component.toJSON();
|
|
65
69
|
assert.equal(last, 2);
|
|
66
70
|
});
|
|
67
71
|
|
|
68
|
-
it("accepts refs as arguments", () => {
|
|
72
|
+
it("accepts refs as arguments", async () => {
|
|
69
73
|
let last = null;
|
|
70
74
|
|
|
71
75
|
let store = new Store();
|
|
@@ -87,12 +91,14 @@ describe("useTrigger", () => {
|
|
|
87
91
|
);
|
|
88
92
|
});
|
|
89
93
|
|
|
90
|
-
const component = createTestRenderer(store, FComp);
|
|
94
|
+
const component = await createTestRenderer(store, FComp);
|
|
91
95
|
|
|
92
96
|
component.toJSON();
|
|
93
97
|
assert.equal(last, 1);
|
|
94
98
|
|
|
95
|
-
|
|
99
|
+
await act(async () => {
|
|
100
|
+
test.set(2);
|
|
101
|
+
});
|
|
96
102
|
component.toJSON();
|
|
97
103
|
assert.equal(last, 2);
|
|
98
104
|
});
|
package/src/hooks/useTrigger.ts
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
import { getCurrentInstance } from "../ui/createFunctionalComponent";
|
|
2
|
-
import { isArray } from "../util/isArray";
|
|
3
|
-
import { computable, ComputableSelector } from "../data/computable";
|
|
4
|
-
import { useStore } from "./store";
|
|
5
|
-
|
|
6
|
-
export function addExploreCallback(callback: (...args: any[]) => any): () => void {
|
|
7
|
-
let instance = getCurrentInstance();
|
|
8
|
-
if (!instance.computables) instance.computables = [];
|
|
9
|
-
instance.computables.push(callback);
|
|
10
|
-
return () => {
|
|
11
|
-
if (instance.computables) {
|
|
12
|
-
instance.computables = instance.computables.filter((cb: unknown) => cb !== callback);
|
|
13
|
-
}
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export function useTrigger(
|
|
18
|
-
args: ComputableSelector[],
|
|
19
|
-
callback: (...args: any[]) => void,
|
|
20
|
-
autoRun?: boolean,
|
|
21
|
-
): () => void {
|
|
22
|
-
if (!isArray(args)) throw new Error("First argument to useTrigger should be an array.");
|
|
23
|
-
let store = useStore();
|
|
24
|
-
let selector = computable(...args, callback).memoize(!autoRun && store.getData());
|
|
25
|
-
return addExploreCallback(selector);
|
|
26
|
-
}
|
|
1
|
+
import { getCurrentInstance } from "../ui/createFunctionalComponent";
|
|
2
|
+
import { isArray } from "../util/isArray";
|
|
3
|
+
import { computable, ComputableSelector } from "../data/computable";
|
|
4
|
+
import { useStore } from "./store";
|
|
5
|
+
|
|
6
|
+
export function addExploreCallback(callback: (...args: any[]) => any): () => void {
|
|
7
|
+
let instance = getCurrentInstance();
|
|
8
|
+
if (!instance.computables) instance.computables = [];
|
|
9
|
+
instance.computables.push(callback);
|
|
10
|
+
return () => {
|
|
11
|
+
if (instance.computables) {
|
|
12
|
+
instance.computables = instance.computables.filter((cb: unknown) => cb !== callback);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function useTrigger(
|
|
18
|
+
args: ComputableSelector[],
|
|
19
|
+
callback: (...args: any[]) => void,
|
|
20
|
+
autoRun?: boolean,
|
|
21
|
+
): () => void {
|
|
22
|
+
if (!isArray(args)) throw new Error("First argument to useTrigger should be an array.");
|
|
23
|
+
let store = useStore();
|
|
24
|
+
let selector = computable(...args, callback).memoize(!autoRun && store.getData());
|
|
25
|
+
return addExploreCallback(selector);
|
|
26
|
+
}
|
package/src/index.scss
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
@import "global";
|
|
2
|
-
@import "util/index";
|
|
3
|
-
@import "ui/index";
|
|
4
|
-
@import "widgets/index";
|
|
5
|
-
@import "svg/index";
|
|
6
|
-
@import "charts/index";
|
|
1
|
+
@import "global";
|
|
2
|
+
@import "util/index";
|
|
3
|
+
@import "ui/index";
|
|
4
|
+
@import "widgets/index";
|
|
5
|
+
@import "svg/index";
|
|
6
|
+
@import "charts/index";
|
package/src/jsx-runtime.ts
CHANGED
|
@@ -1,79 +1,79 @@
|
|
|
1
|
-
import type { ComponentClass, FunctionComponent, JSX as ReactJSX } from "react";
|
|
2
|
-
import type { CxFunctionalComponent } from "./ui/createFunctionalComponent";
|
|
3
|
-
import { Widget } from "./ui/Widget";
|
|
4
|
-
import { isArray } from "./util/isArray";
|
|
5
|
-
import { isString } from "./util/isString";
|
|
6
|
-
import { HtmlElement, HtmlElementConfig } from "./widgets/HtmlElement";
|
|
7
|
-
import { ReactElementWrapper, ReactElementWrapperConfig } from "./widgets/ReactElementWrapper";
|
|
8
|
-
|
|
9
|
-
export function jsx(typeName: any, props: any, key?: string): any {
|
|
10
|
-
if (isArray(typeName)) return typeName;
|
|
11
|
-
|
|
12
|
-
// if (isFunction(typeName) && isUndefined(props))
|
|
13
|
-
// return createFunctionalComponent((config) => typeName(flattenProps(config)));
|
|
14
|
-
|
|
15
|
-
if (typeName.type || typeName.$type) return typeName;
|
|
16
|
-
|
|
17
|
-
if (props.children && isArray(props.children) && props.children.length == 0) props.children = null;
|
|
18
|
-
|
|
19
|
-
if (props.children && props.children.length == 1) props.children = props.children[0];
|
|
20
|
-
|
|
21
|
-
if (typeName == "cx") return props.children;
|
|
22
|
-
|
|
23
|
-
if (isString(typeName) && typeName[0] == typeName[0].toLowerCase()) {
|
|
24
|
-
props.tag = typeName;
|
|
25
|
-
typeName = HtmlElement;
|
|
26
|
-
}
|
|
27
|
-
// React components (functions/classes without isComponentType and not CxJS functional components) should go through ReactElementWrapper
|
|
28
|
-
else if (typeof typeName === "function" && !typeName.isComponentType && !typeName.$isComponentFactory) {
|
|
29
|
-
props.componentType = typeName;
|
|
30
|
-
typeName = ReactElementWrapper;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return {
|
|
34
|
-
$type: typeName,
|
|
35
|
-
...props,
|
|
36
|
-
jsxAttributes: props && Object.keys(props),
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export const jsxs = jsx;
|
|
41
|
-
|
|
42
|
-
type ReactIntrinsicElements = ReactJSX.IntrinsicElements;
|
|
43
|
-
|
|
44
|
-
type CxIntrinsicElements = {
|
|
45
|
-
[K in keyof ReactIntrinsicElements]: HtmlElementConfig<K>;
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
// Helper type to transform props for React components (but not CxJS functional components)
|
|
49
|
-
// Uses a workaround to avoid TypeScript inference issues with conditional types in LibraryManagedAttributes
|
|
50
|
-
// We use Omit to exclude componentType since it's added automatically by the jsx-runtime
|
|
51
|
-
type TransformReactComponentProps<C, P> = [C] extends [CxFunctionalComponent<any>]
|
|
52
|
-
? P // CxJS functional components already have proper types
|
|
53
|
-
: [C] extends [FunctionComponent<any>]
|
|
54
|
-
? ReactElementWrapperConfig<P>
|
|
55
|
-
: [C] extends [ComponentClass<any>]
|
|
56
|
-
? ReactElementWrapperConfig<P>
|
|
57
|
-
: P;
|
|
58
|
-
|
|
59
|
-
export namespace JSX {
|
|
60
|
-
/**
|
|
61
|
-
* Base class for JSX element instances.
|
|
62
|
-
* All widgets must extend from Widget class or React.Component.
|
|
63
|
-
*/
|
|
64
|
-
export type ElementClass = Widget<any> | React.Component<any, any>;
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Intrinsic JSX elements (HTML-like tags).
|
|
68
|
-
* Supports HTML elements that map to HtmlElement widgets.
|
|
69
|
-
*/
|
|
70
|
-
export interface IntrinsicElements extends CxIntrinsicElements {
|
|
71
|
-
cx: any;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Transform props for React function components used in CxJS JSX.
|
|
76
|
-
* Adds standard WidgetConfig properties and transforms React props to Prop<X>.
|
|
77
|
-
*/
|
|
78
|
-
export type LibraryManagedAttributes<C, P> = TransformReactComponentProps<C, P>;
|
|
79
|
-
}
|
|
1
|
+
import type { ComponentClass, FunctionComponent, JSX as ReactJSX } from "react";
|
|
2
|
+
import type { CxFunctionalComponent } from "./ui/createFunctionalComponent";
|
|
3
|
+
import { Widget } from "./ui/Widget";
|
|
4
|
+
import { isArray } from "./util/isArray";
|
|
5
|
+
import { isString } from "./util/isString";
|
|
6
|
+
import { HtmlElement, HtmlElementConfig } from "./widgets/HtmlElement";
|
|
7
|
+
import { ReactElementWrapper, ReactElementWrapperConfig } from "./widgets/ReactElementWrapper";
|
|
8
|
+
|
|
9
|
+
export function jsx(typeName: any, props: any, key?: string): any {
|
|
10
|
+
if (isArray(typeName)) return typeName;
|
|
11
|
+
|
|
12
|
+
// if (isFunction(typeName) && isUndefined(props))
|
|
13
|
+
// return createFunctionalComponent((config) => typeName(flattenProps(config)));
|
|
14
|
+
|
|
15
|
+
if (typeName.type || typeName.$type) return typeName;
|
|
16
|
+
|
|
17
|
+
if (props.children && isArray(props.children) && props.children.length == 0) props.children = null;
|
|
18
|
+
|
|
19
|
+
if (props.children && props.children.length == 1) props.children = props.children[0];
|
|
20
|
+
|
|
21
|
+
if (typeName == "cx") return props.children;
|
|
22
|
+
|
|
23
|
+
if (isString(typeName) && typeName[0] == typeName[0].toLowerCase()) {
|
|
24
|
+
props.tag = typeName;
|
|
25
|
+
typeName = HtmlElement;
|
|
26
|
+
}
|
|
27
|
+
// React components (functions/classes without isComponentType and not CxJS functional components) should go through ReactElementWrapper
|
|
28
|
+
else if (typeof typeName === "function" && !typeName.isComponentType && !typeName.$isComponentFactory) {
|
|
29
|
+
props.componentType = typeName;
|
|
30
|
+
typeName = ReactElementWrapper;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return {
|
|
34
|
+
$type: typeName,
|
|
35
|
+
...props,
|
|
36
|
+
jsxAttributes: props && Object.keys(props),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export const jsxs = jsx;
|
|
41
|
+
|
|
42
|
+
type ReactIntrinsicElements = ReactJSX.IntrinsicElements;
|
|
43
|
+
|
|
44
|
+
type CxIntrinsicElements = {
|
|
45
|
+
[K in keyof ReactIntrinsicElements]: HtmlElementConfig<K>;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// Helper type to transform props for React components (but not CxJS functional components)
|
|
49
|
+
// Uses a workaround to avoid TypeScript inference issues with conditional types in LibraryManagedAttributes
|
|
50
|
+
// We use Omit to exclude componentType since it's added automatically by the jsx-runtime
|
|
51
|
+
type TransformReactComponentProps<C, P> = [C] extends [CxFunctionalComponent<any>]
|
|
52
|
+
? P // CxJS functional components already have proper types
|
|
53
|
+
: [C] extends [FunctionComponent<any>]
|
|
54
|
+
? ReactElementWrapperConfig<P>
|
|
55
|
+
: [C] extends [ComponentClass<any>]
|
|
56
|
+
? ReactElementWrapperConfig<P>
|
|
57
|
+
: P;
|
|
58
|
+
|
|
59
|
+
export namespace JSX {
|
|
60
|
+
/**
|
|
61
|
+
* Base class for JSX element instances.
|
|
62
|
+
* All widgets must extend from Widget class or React.Component.
|
|
63
|
+
*/
|
|
64
|
+
export type ElementClass = Widget<any> | React.Component<any, any>;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Intrinsic JSX elements (HTML-like tags).
|
|
68
|
+
* Supports HTML elements that map to HtmlElement widgets.
|
|
69
|
+
*/
|
|
70
|
+
export interface IntrinsicElements extends CxIntrinsicElements {
|
|
71
|
+
cx: any;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Transform props for React function components used in CxJS JSX.
|
|
76
|
+
* Adds standard WidgetConfig properties and transforms React props to Prop<X>.
|
|
77
|
+
*/
|
|
78
|
+
export type LibraryManagedAttributes<C, P> = TransformReactComponentProps<C, P>;
|
|
79
|
+
}
|
package/src/svg/BoundedObject.ts
CHANGED
|
@@ -1,101 +1,101 @@
|
|
|
1
|
-
import { Instance } from "./../ui/Instance";
|
|
2
|
-
import { StyledContainerConfig, ContainerBase } from "../ui/Container";
|
|
3
|
-
import { RenderingContext } from "../ui/RenderingContext";
|
|
4
|
-
import { Prop } from "../ui/Prop";
|
|
5
|
-
import { IRect, Rect } from "./util/Rect";
|
|
6
|
-
|
|
7
|
-
/** Typed context interface for SVG/layout-related context properties */
|
|
8
|
-
export interface SvgRenderingContext extends RenderingContext {
|
|
9
|
-
parentRect?: Rect;
|
|
10
|
-
inSvg?: boolean;
|
|
11
|
-
addClipRect?: (rect: Rect) => string;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export interface BoundedObjectConfig extends StyledContainerConfig {
|
|
15
|
-
/**
|
|
16
|
-
* Anchor defines how child bounds are tied to the parent. Zero aligns with the top/left edge.
|
|
17
|
-
* One aligns with the bottom/right edge. See Svg for more information.
|
|
18
|
-
*/
|
|
19
|
-
anchors?: Prop<string | number | IRect>;
|
|
20
|
-
|
|
21
|
-
/** Move boundaries specified by the offset. See Svg for more information. */
|
|
22
|
-
offset?: Prop<string | number | IRect>;
|
|
23
|
-
|
|
24
|
-
/** Apply margin to the given boundaries. See Svg for more information. */
|
|
25
|
-
margin?: Prop<string | number | IRect>;
|
|
26
|
-
|
|
27
|
-
/** Padding to be applied to the boundaries rectangle before passing to the children. */
|
|
28
|
-
padding?: Prop<string | number | IRect>;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export interface BoundedObjectInstance extends Instance {
|
|
32
|
-
parentRect?: any;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export class BoundedObject<
|
|
36
|
-
Config extends BoundedObjectConfig = BoundedObjectConfig,
|
|
37
|
-
InstanceType extends BoundedObjectInstance = BoundedObjectInstance,
|
|
38
|
-
> extends ContainerBase<Config, InstanceType> {
|
|
39
|
-
declare anchors: any;
|
|
40
|
-
declare margin: any;
|
|
41
|
-
declare offset: any;
|
|
42
|
-
declare padding: any;
|
|
43
|
-
|
|
44
|
-
declareData(...args: any[]) {
|
|
45
|
-
return super.declareData(
|
|
46
|
-
{
|
|
47
|
-
anchors: undefined,
|
|
48
|
-
offset: undefined,
|
|
49
|
-
margin: undefined,
|
|
50
|
-
padding: undefined,
|
|
51
|
-
},
|
|
52
|
-
...args,
|
|
53
|
-
);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
prepareData(context: RenderingContext, instance: InstanceType) {
|
|
57
|
-
super.prepareData(context, instance);
|
|
58
|
-
var { data } = instance;
|
|
59
|
-
data.anchors = Rect.convert(data.anchors);
|
|
60
|
-
data.offset = Rect.convert(data.offset);
|
|
61
|
-
data.margin = Rect.convertMargin(data.margin);
|
|
62
|
-
data.padding = Rect.convertMargin(data.padding);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
calculateBounds(context: SvgRenderingContext, instance: InstanceType) {
|
|
66
|
-
var { data } = instance;
|
|
67
|
-
return Rect.add(Rect.add(Rect.multiply(instance.parentRect, data.anchors), data.offset), data.margin);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
prepareBounds(context: SvgRenderingContext, instance: InstanceType) {
|
|
71
|
-
var { data } = instance;
|
|
72
|
-
if (
|
|
73
|
-
instance.shouldUpdate ||
|
|
74
|
-
!instance.cached.parentRect ||
|
|
75
|
-
!instance.cached.parentRect.isEqual(context.parentRect) ||
|
|
76
|
-
!data.bounds
|
|
77
|
-
) {
|
|
78
|
-
if (!context.parentRect) throw new Error("Parent bounds were not provided through the context.");
|
|
79
|
-
instance.parentRect = context.parentRect;
|
|
80
|
-
instance.cache("parentRect", context.parentRect);
|
|
81
|
-
instance.markShouldUpdate(context);
|
|
82
|
-
data.bounds = this.calculateBounds(context, instance);
|
|
83
|
-
data.childrenBounds = Rect.add(data.bounds, data.padding);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
prepare(context: SvgRenderingContext, instance: InstanceType) {
|
|
88
|
-
this.prepareBounds(context, instance);
|
|
89
|
-
context.push("parentRect", instance.data.childrenBounds);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
prepareCleanup(context: SvgRenderingContext, instance: InstanceType) {
|
|
93
|
-
context.pop("parentRect");
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
BoundedObject.prototype.anchors = 0;
|
|
98
|
-
BoundedObject.prototype.margin = 0;
|
|
99
|
-
BoundedObject.prototype.offset = 0;
|
|
100
|
-
BoundedObject.prototype.padding = 0;
|
|
101
|
-
BoundedObject.prototype.styled = true;
|
|
1
|
+
import { Instance } from "./../ui/Instance";
|
|
2
|
+
import { StyledContainerConfig, ContainerBase } from "../ui/Container";
|
|
3
|
+
import { RenderingContext } from "../ui/RenderingContext";
|
|
4
|
+
import { Prop } from "../ui/Prop";
|
|
5
|
+
import { IRect, Rect } from "./util/Rect";
|
|
6
|
+
|
|
7
|
+
/** Typed context interface for SVG/layout-related context properties */
|
|
8
|
+
export interface SvgRenderingContext extends RenderingContext {
|
|
9
|
+
parentRect?: Rect;
|
|
10
|
+
inSvg?: boolean;
|
|
11
|
+
addClipRect?: (rect: Rect) => string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface BoundedObjectConfig extends StyledContainerConfig {
|
|
15
|
+
/**
|
|
16
|
+
* Anchor defines how child bounds are tied to the parent. Zero aligns with the top/left edge.
|
|
17
|
+
* One aligns with the bottom/right edge. See Svg for more information.
|
|
18
|
+
*/
|
|
19
|
+
anchors?: Prop<string | number | IRect>;
|
|
20
|
+
|
|
21
|
+
/** Move boundaries specified by the offset. See Svg for more information. */
|
|
22
|
+
offset?: Prop<string | number | IRect>;
|
|
23
|
+
|
|
24
|
+
/** Apply margin to the given boundaries. See Svg for more information. */
|
|
25
|
+
margin?: Prop<string | number | IRect>;
|
|
26
|
+
|
|
27
|
+
/** Padding to be applied to the boundaries rectangle before passing to the children. */
|
|
28
|
+
padding?: Prop<string | number | IRect>;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface BoundedObjectInstance extends Instance {
|
|
32
|
+
parentRect?: any;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export class BoundedObject<
|
|
36
|
+
Config extends BoundedObjectConfig = BoundedObjectConfig,
|
|
37
|
+
InstanceType extends BoundedObjectInstance = BoundedObjectInstance,
|
|
38
|
+
> extends ContainerBase<Config, InstanceType> {
|
|
39
|
+
declare anchors: any;
|
|
40
|
+
declare margin: any;
|
|
41
|
+
declare offset: any;
|
|
42
|
+
declare padding: any;
|
|
43
|
+
|
|
44
|
+
declareData(...args: any[]) {
|
|
45
|
+
return super.declareData(
|
|
46
|
+
{
|
|
47
|
+
anchors: undefined,
|
|
48
|
+
offset: undefined,
|
|
49
|
+
margin: undefined,
|
|
50
|
+
padding: undefined,
|
|
51
|
+
},
|
|
52
|
+
...args,
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
prepareData(context: RenderingContext, instance: InstanceType) {
|
|
57
|
+
super.prepareData(context, instance);
|
|
58
|
+
var { data } = instance;
|
|
59
|
+
data.anchors = Rect.convert(data.anchors);
|
|
60
|
+
data.offset = Rect.convert(data.offset);
|
|
61
|
+
data.margin = Rect.convertMargin(data.margin);
|
|
62
|
+
data.padding = Rect.convertMargin(data.padding);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
calculateBounds(context: SvgRenderingContext, instance: InstanceType) {
|
|
66
|
+
var { data } = instance;
|
|
67
|
+
return Rect.add(Rect.add(Rect.multiply(instance.parentRect, data.anchors), data.offset), data.margin);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
prepareBounds(context: SvgRenderingContext, instance: InstanceType) {
|
|
71
|
+
var { data } = instance;
|
|
72
|
+
if (
|
|
73
|
+
instance.shouldUpdate ||
|
|
74
|
+
!instance.cached.parentRect ||
|
|
75
|
+
!instance.cached.parentRect.isEqual(context.parentRect) ||
|
|
76
|
+
!data.bounds
|
|
77
|
+
) {
|
|
78
|
+
if (!context.parentRect) throw new Error("Parent bounds were not provided through the context.");
|
|
79
|
+
instance.parentRect = context.parentRect;
|
|
80
|
+
instance.cache("parentRect", context.parentRect);
|
|
81
|
+
instance.markShouldUpdate(context);
|
|
82
|
+
data.bounds = this.calculateBounds(context, instance);
|
|
83
|
+
data.childrenBounds = Rect.add(data.bounds, data.padding);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
prepare(context: SvgRenderingContext, instance: InstanceType) {
|
|
88
|
+
this.prepareBounds(context, instance);
|
|
89
|
+
context.push("parentRect", instance.data.childrenBounds);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
prepareCleanup(context: SvgRenderingContext, instance: InstanceType) {
|
|
93
|
+
context.pop("parentRect");
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
BoundedObject.prototype.anchors = 0;
|
|
98
|
+
BoundedObject.prototype.margin = 0;
|
|
99
|
+
BoundedObject.prototype.offset = 0;
|
|
100
|
+
BoundedObject.prototype.padding = 0;
|
|
101
|
+
BoundedObject.prototype.styled = true;
|