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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Store } from "../data/Store";
|
|
2
2
|
import { Controller, ControllerConfig } from "./Controller";
|
|
3
|
-
import { createTestRenderer } from "../util/test/createTestRenderer";
|
|
3
|
+
import { createTestRenderer, act } from "../util/test/createTestRenderer";
|
|
4
4
|
import { VDOM, Widget, WidgetConfig } from "./Widget";
|
|
5
5
|
import { Instance } from "./Instance";
|
|
6
6
|
import { bind } from "./bind";
|
|
@@ -8,7 +8,7 @@ import assert from "assert";
|
|
|
8
8
|
import { RenderingContext } from "./RenderingContext";
|
|
9
9
|
|
|
10
10
|
describe("Controller", () => {
|
|
11
|
-
it("invokes lifetime methods", () => {
|
|
11
|
+
it("invokes lifetime methods", async () => {
|
|
12
12
|
let init = 0,
|
|
13
13
|
prepare = 0,
|
|
14
14
|
explore = 0,
|
|
@@ -34,7 +34,7 @@ describe("Controller", () => {
|
|
|
34
34
|
|
|
35
35
|
let store = new Store();
|
|
36
36
|
|
|
37
|
-
const component = createTestRenderer(
|
|
37
|
+
const component = await createTestRenderer(
|
|
38
38
|
store,
|
|
39
39
|
<cx>
|
|
40
40
|
<div controller={TestController} />
|
|
@@ -48,7 +48,7 @@ describe("Controller", () => {
|
|
|
48
48
|
assert.equal(cleanup, 1);
|
|
49
49
|
});
|
|
50
50
|
|
|
51
|
-
it("widgets invoke controller methods specified as strings", () => {
|
|
51
|
+
it("widgets invoke controller methods specified as strings", async () => {
|
|
52
52
|
let callback = 0;
|
|
53
53
|
|
|
54
54
|
class TestController extends Controller {
|
|
@@ -70,7 +70,7 @@ describe("Controller", () => {
|
|
|
70
70
|
|
|
71
71
|
let store = new Store();
|
|
72
72
|
|
|
73
|
-
const component = createTestRenderer(
|
|
73
|
+
const component = await createTestRenderer(
|
|
74
74
|
store,
|
|
75
75
|
<cx>
|
|
76
76
|
<Cmp controller={TestController} onTest="callback" />
|
|
@@ -81,7 +81,7 @@ describe("Controller", () => {
|
|
|
81
81
|
assert.equal(callback, 1);
|
|
82
82
|
});
|
|
83
83
|
|
|
84
|
-
it("widgets can access controller methods specified in ancestor controllers", () => {
|
|
84
|
+
it("widgets can access controller methods specified in ancestor controllers", async () => {
|
|
85
85
|
let callback1 = 0;
|
|
86
86
|
let callback2 = 0;
|
|
87
87
|
|
|
@@ -110,7 +110,7 @@ describe("Controller", () => {
|
|
|
110
110
|
|
|
111
111
|
let store = new Store();
|
|
112
112
|
|
|
113
|
-
const component = createTestRenderer(
|
|
113
|
+
const component = await createTestRenderer(
|
|
114
114
|
store,
|
|
115
115
|
<cx>
|
|
116
116
|
<div controller={TestController1}>
|
|
@@ -124,7 +124,7 @@ describe("Controller", () => {
|
|
|
124
124
|
assert.equal(callback2, 0);
|
|
125
125
|
});
|
|
126
126
|
|
|
127
|
-
it("ancestor controllers are initialized first", () => {
|
|
127
|
+
it("ancestor controllers are initialized first", async () => {
|
|
128
128
|
let order: string[] = [];
|
|
129
129
|
|
|
130
130
|
class TestController1 extends Controller {
|
|
@@ -141,7 +141,7 @@ describe("Controller", () => {
|
|
|
141
141
|
|
|
142
142
|
let store = new Store();
|
|
143
143
|
|
|
144
|
-
const component = createTestRenderer(
|
|
144
|
+
const component = await createTestRenderer(
|
|
145
145
|
store,
|
|
146
146
|
<cx>
|
|
147
147
|
<div controller={TestController1}>
|
|
@@ -154,7 +154,7 @@ describe("Controller", () => {
|
|
|
154
154
|
assert.deepEqual(order, ["1", "2"]);
|
|
155
155
|
});
|
|
156
156
|
|
|
157
|
-
it("controllers on invisible elements are not initialized", () => {
|
|
157
|
+
it("controllers on invisible elements are not initialized", async () => {
|
|
158
158
|
let order: string[] = [];
|
|
159
159
|
|
|
160
160
|
class TestController1 extends Controller {
|
|
@@ -171,7 +171,7 @@ describe("Controller", () => {
|
|
|
171
171
|
|
|
172
172
|
let store = new Store();
|
|
173
173
|
|
|
174
|
-
const component = createTestRenderer(
|
|
174
|
+
const component = await createTestRenderer(
|
|
175
175
|
store,
|
|
176
176
|
<cx>
|
|
177
177
|
<div controller={TestController1}>
|
|
@@ -184,7 +184,7 @@ describe("Controller", () => {
|
|
|
184
184
|
assert.deepEqual(order, ["1"]);
|
|
185
185
|
});
|
|
186
186
|
|
|
187
|
-
it("invokes triggers and computables in order of definition", () => {
|
|
187
|
+
it("invokes triggers and computables in order of definition", async () => {
|
|
188
188
|
let log: string[] = [];
|
|
189
189
|
|
|
190
190
|
class TestController extends Controller {
|
|
@@ -216,7 +216,7 @@ describe("Controller", () => {
|
|
|
216
216
|
|
|
217
217
|
let store = new Store();
|
|
218
218
|
|
|
219
|
-
const component = createTestRenderer(
|
|
219
|
+
const component = await createTestRenderer(
|
|
220
220
|
store,
|
|
221
221
|
<cx>
|
|
222
222
|
<div controller={TestController} />
|
|
@@ -227,7 +227,7 @@ describe("Controller", () => {
|
|
|
227
227
|
assert.deepEqual(log, ["t1", "c1", "t2"]);
|
|
228
228
|
});
|
|
229
229
|
|
|
230
|
-
it("is recreated if a component is hidden and shown", () => {
|
|
230
|
+
it("is recreated if a component is hidden and shown", async () => {
|
|
231
231
|
let initCount = 0;
|
|
232
232
|
|
|
233
233
|
class TestController extends Controller {
|
|
@@ -239,7 +239,7 @@ describe("Controller", () => {
|
|
|
239
239
|
let store = new Store();
|
|
240
240
|
store.set("visible", true);
|
|
241
241
|
|
|
242
|
-
const component = createTestRenderer(
|
|
242
|
+
const component = await createTestRenderer(
|
|
243
243
|
store,
|
|
244
244
|
<cx>
|
|
245
245
|
<div visible={bind("visible")} controller={TestController} />
|
|
@@ -249,11 +249,15 @@ describe("Controller", () => {
|
|
|
249
249
|
let tree1 = component.toJSON();
|
|
250
250
|
assert.equal(initCount, 1);
|
|
251
251
|
|
|
252
|
-
|
|
252
|
+
await act(async () => {
|
|
253
|
+
store.set("visible", false);
|
|
254
|
+
});
|
|
253
255
|
let tree2 = component.toJSON();
|
|
254
256
|
assert.equal(tree2, null);
|
|
255
257
|
|
|
256
|
-
|
|
258
|
+
await act(async () => {
|
|
259
|
+
store.set("visible", true);
|
|
260
|
+
});
|
|
257
261
|
let tree3 = component.toJSON();
|
|
258
262
|
assert.equal(initCount, 2);
|
|
259
263
|
});
|
|
@@ -275,7 +279,7 @@ describe("Controller", () => {
|
|
|
275
279
|
assert.equal(store.get("x"), 1);
|
|
276
280
|
});
|
|
277
281
|
|
|
278
|
-
it("lifetime methods of a functional controller are properly invoked", () => {
|
|
282
|
+
it("lifetime methods of a functional controller are properly invoked", async () => {
|
|
279
283
|
let initCount = 0,
|
|
280
284
|
destroyCount = 0;
|
|
281
285
|
|
|
@@ -292,7 +296,7 @@ describe("Controller", () => {
|
|
|
292
296
|
let store = new Store();
|
|
293
297
|
store.set("visible", true);
|
|
294
298
|
|
|
295
|
-
const component = createTestRenderer(
|
|
299
|
+
const component = await createTestRenderer(
|
|
296
300
|
store,
|
|
297
301
|
<cx>
|
|
298
302
|
<div visible={bind("visible")} controller={testController} />
|
|
@@ -302,19 +306,23 @@ describe("Controller", () => {
|
|
|
302
306
|
let tree1 = component.toJSON();
|
|
303
307
|
assert.equal(initCount, 1);
|
|
304
308
|
|
|
305
|
-
|
|
309
|
+
await act(async () => {
|
|
310
|
+
store.set("visible", false);
|
|
311
|
+
});
|
|
306
312
|
let tree2 = component.toJSON();
|
|
307
313
|
assert.equal(destroyCount, 1);
|
|
308
314
|
|
|
309
|
-
|
|
315
|
+
await act(async () => {
|
|
316
|
+
store.set("visible", true);
|
|
317
|
+
});
|
|
310
318
|
let tree3 = component.toJSON();
|
|
311
319
|
assert.equal(initCount, 2);
|
|
312
320
|
});
|
|
313
321
|
|
|
314
|
-
it("widgets can easily define controller methods", () => {
|
|
322
|
+
it("widgets can easily define controller methods", async () => {
|
|
315
323
|
let store = new Store({ data: { x: 0 } });
|
|
316
324
|
|
|
317
|
-
const component = createTestRenderer(
|
|
325
|
+
const component = await createTestRenderer(
|
|
318
326
|
store,
|
|
319
327
|
<cx>
|
|
320
328
|
<div
|
|
@@ -339,10 +347,10 @@ describe("Controller", () => {
|
|
|
339
347
|
assert.equal(store.get("x"), 1);
|
|
340
348
|
});
|
|
341
349
|
|
|
342
|
-
it("functional controllers get store methods through configuration", () => {
|
|
350
|
+
it("functional controllers get store methods through configuration", async () => {
|
|
343
351
|
let store = new Store({ data: { x: 0 } });
|
|
344
352
|
|
|
345
|
-
const component = createTestRenderer(
|
|
353
|
+
const component = await createTestRenderer(
|
|
346
354
|
store,
|
|
347
355
|
<cx>
|
|
348
356
|
<div
|
|
@@ -367,10 +375,10 @@ describe("Controller", () => {
|
|
|
367
375
|
assert.equal(store.get("x"), 1);
|
|
368
376
|
});
|
|
369
377
|
|
|
370
|
-
it("addComputable accepts refs", () => {
|
|
378
|
+
it("addComputable accepts refs", async () => {
|
|
371
379
|
let store = new Store({ data: { x: 0 } });
|
|
372
380
|
|
|
373
|
-
const component = createTestRenderer(
|
|
381
|
+
const component = await createTestRenderer(
|
|
374
382
|
store,
|
|
375
383
|
<cx>
|
|
376
384
|
<div
|
|
@@ -390,7 +398,7 @@ describe("Controller", () => {
|
|
|
390
398
|
assert.equal(store.get("y"), 1);
|
|
391
399
|
});
|
|
392
400
|
|
|
393
|
-
it("invokeParentMethod is invoked on parent instance", () => {
|
|
401
|
+
it("invokeParentMethod is invoked on parent instance", async () => {
|
|
394
402
|
let testValid: number[] = [];
|
|
395
403
|
|
|
396
404
|
class TestController1 extends Controller {
|
|
@@ -411,7 +419,7 @@ describe("Controller", () => {
|
|
|
411
419
|
|
|
412
420
|
let store = new Store();
|
|
413
421
|
|
|
414
|
-
const component = createTestRenderer(
|
|
422
|
+
const component = await createTestRenderer(
|
|
415
423
|
store,
|
|
416
424
|
<cx>
|
|
417
425
|
<div controller={TestController2}>
|
|
@@ -446,10 +454,10 @@ describe("Controller types", () => {
|
|
|
446
454
|
}
|
|
447
455
|
}
|
|
448
456
|
|
|
449
|
-
it("accepts Controller class directly", () => {
|
|
457
|
+
it("accepts Controller class directly", async () => {
|
|
450
458
|
let store = new Store();
|
|
451
459
|
|
|
452
|
-
const component = createTestRenderer(
|
|
460
|
+
const component = await createTestRenderer(
|
|
453
461
|
store,
|
|
454
462
|
<cx>
|
|
455
463
|
<div controller={MyController} />
|
|
@@ -460,7 +468,7 @@ describe("Controller types", () => {
|
|
|
460
468
|
assert.ok(tree);
|
|
461
469
|
});
|
|
462
470
|
|
|
463
|
-
it("accepts config with type property", () => {
|
|
471
|
+
it("accepts config with type property", async () => {
|
|
464
472
|
let store = new Store();
|
|
465
473
|
let initCalled = false;
|
|
466
474
|
|
|
@@ -477,7 +485,7 @@ describe("Controller types", () => {
|
|
|
477
485
|
}
|
|
478
486
|
}
|
|
479
487
|
|
|
480
|
-
const component = createTestRenderer(
|
|
488
|
+
const component = await createTestRenderer(
|
|
481
489
|
store,
|
|
482
490
|
<cx>
|
|
483
491
|
<div controller={{ type: TypedController, customValue: 42 }} />
|
|
@@ -489,10 +497,10 @@ describe("Controller types", () => {
|
|
|
489
497
|
assert.equal(initCalled, true);
|
|
490
498
|
});
|
|
491
499
|
|
|
492
|
-
it("accepts inline config object with ThisType", () => {
|
|
500
|
+
it("accepts inline config object with ThisType", async () => {
|
|
493
501
|
let store = new Store({ data: { count: 0 } });
|
|
494
502
|
|
|
495
|
-
const component = createTestRenderer(
|
|
503
|
+
const component = await createTestRenderer(
|
|
496
504
|
store,
|
|
497
505
|
<cx>
|
|
498
506
|
<div
|
|
@@ -510,10 +518,10 @@ describe("Controller types", () => {
|
|
|
510
518
|
assert.equal(store.get("count"), 1);
|
|
511
519
|
});
|
|
512
520
|
|
|
513
|
-
it("accepts factory function", () => {
|
|
521
|
+
it("accepts factory function", async () => {
|
|
514
522
|
let store = new Store({ data: { count: 0 } });
|
|
515
523
|
|
|
516
|
-
const component = createTestRenderer(
|
|
524
|
+
const component = await createTestRenderer(
|
|
517
525
|
store,
|
|
518
526
|
<cx>
|
|
519
527
|
<div
|
|
@@ -530,7 +538,7 @@ describe("Controller types", () => {
|
|
|
530
538
|
assert.equal(store.get("count"), 5);
|
|
531
539
|
});
|
|
532
540
|
|
|
533
|
-
it("accepts CreateConfig with type and required properties", () => {
|
|
541
|
+
it("accepts CreateConfig with type and required properties", async () => {
|
|
534
542
|
let store = new Store({ data: { result: 0 } });
|
|
535
543
|
|
|
536
544
|
interface RequiredPropControllerConfig extends ControllerConfig {
|
|
@@ -549,7 +557,7 @@ describe("Controller types", () => {
|
|
|
549
557
|
}
|
|
550
558
|
}
|
|
551
559
|
|
|
552
|
-
const component = createTestRenderer(
|
|
560
|
+
const component = await createTestRenderer(
|
|
553
561
|
store,
|
|
554
562
|
<cx>
|
|
555
563
|
<div
|
package/src/ui/Culture.ts
CHANGED
|
@@ -1,159 +1,159 @@
|
|
|
1
|
-
// @ts-expect-error
|
|
2
|
-
import { NumberCulture, DateTimeCulture } from "intl-io";
|
|
3
|
-
import { Localization } from "./Localization";
|
|
4
|
-
import { GlobalCacheIdentifier } from "../util/GlobalCacheIdentifier";
|
|
5
|
-
import { invalidateExpressionCache } from "../data/Expression";
|
|
6
|
-
import { invalidateStringTemplateCache } from "../data/StringTemplate";
|
|
7
|
-
import { defaultCompare } from "../data/defaultCompare";
|
|
8
|
-
import { Console } from "../util/Console";
|
|
9
|
-
|
|
10
|
-
export interface CultureInfo {
|
|
11
|
-
culture?: string;
|
|
12
|
-
numberCulture?: string | null;
|
|
13
|
-
dateTimeCulture?: string | null;
|
|
14
|
-
defaultCurrency?: string;
|
|
15
|
-
dateEncoding?: (date: Date) => string;
|
|
16
|
-
timezone?: string | null;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface ResolvedCultureInfo {
|
|
20
|
-
culture: string;
|
|
21
|
-
numberCulture?: string | null;
|
|
22
|
-
dateTimeCulture?: string | null;
|
|
23
|
-
cache: any;
|
|
24
|
-
defaultCurrency: string;
|
|
25
|
-
dateEncoding: (date: Date) => string;
|
|
26
|
-
timezone?: string | null;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
let stack: ResolvedCultureInfo[] = [
|
|
30
|
-
{
|
|
31
|
-
culture: "en",
|
|
32
|
-
numberCulture: null,
|
|
33
|
-
dateTimeCulture: null,
|
|
34
|
-
cache: {},
|
|
35
|
-
defaultCurrency: "USD",
|
|
36
|
-
dateEncoding: (date: Date) => date.toISOString(),
|
|
37
|
-
timezone: null,
|
|
38
|
-
},
|
|
39
|
-
];
|
|
40
|
-
|
|
41
|
-
export function getDefaultCulture(): ResolvedCultureInfo {
|
|
42
|
-
return stack[0];
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export function getCurrentCulture(): ResolvedCultureInfo {
|
|
46
|
-
return stack[stack.length - 1];
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export function getCurrentCultureCache(): any {
|
|
50
|
-
return getCurrentCulture().cache;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export function pushCulture(cultureInfo: ResolvedCultureInfo): void {
|
|
54
|
-
stack.push(cultureInfo);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export function createCulture(cultureSpecs: Partial<CultureInfo>): ResolvedCultureInfo {
|
|
58
|
-
let current = getCurrentCulture();
|
|
59
|
-
let info: ResolvedCultureInfo = {
|
|
60
|
-
culture: current.culture,
|
|
61
|
-
dateEncoding: current.dateEncoding,
|
|
62
|
-
defaultCurrency: current.defaultCurrency,
|
|
63
|
-
cache: {},
|
|
64
|
-
};
|
|
65
|
-
for (let key in cultureSpecs) {
|
|
66
|
-
if (!(cultureSpecs as any)[key]) continue;
|
|
67
|
-
(info as any)[key] = (cultureSpecs as any)[key];
|
|
68
|
-
}
|
|
69
|
-
return info;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export function popCulture(cultureSpecs?: CultureInfo): CultureInfo | undefined {
|
|
73
|
-
if (stack.length == 1) throw new Error("Cannot pop the last culture object.");
|
|
74
|
-
if (cultureSpecs && stack[stack.length - 1] !== cultureSpecs) {
|
|
75
|
-
Console.warn("Popped culture object does not match the current one.");
|
|
76
|
-
}
|
|
77
|
-
return stack.pop();
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
export class Culture {
|
|
81
|
-
static setCulture(cultureCode: string): void {
|
|
82
|
-
let cultureSpecs = getDefaultCulture();
|
|
83
|
-
cultureSpecs.culture = cultureCode;
|
|
84
|
-
cultureSpecs.cache = {};
|
|
85
|
-
Localization.setCulture(cultureCode);
|
|
86
|
-
this.invalidateCache();
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
static setNumberCulture(cultureCode: string): void {
|
|
90
|
-
let cultureSpecs = getDefaultCulture();
|
|
91
|
-
cultureSpecs.numberCulture = cultureCode;
|
|
92
|
-
delete cultureSpecs.cache.numberCulture;
|
|
93
|
-
this.invalidateCache();
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
static setDateTimeCulture(cultureCode: string): void {
|
|
97
|
-
let cultureSpecs = getDefaultCulture();
|
|
98
|
-
cultureSpecs.dateTimeCulture = cultureCode;
|
|
99
|
-
delete cultureSpecs.cache.dateTimeCulture;
|
|
100
|
-
this.invalidateCache();
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
static setDefaultCurrency(currencyCode: string): void {
|
|
104
|
-
let cultureSpecs = getDefaultCulture();
|
|
105
|
-
cultureSpecs.defaultCurrency = currencyCode;
|
|
106
|
-
this.invalidateCache();
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
static setDefaultTimezone(timezone: string): void {
|
|
110
|
-
let cultureSpecs = getDefaultCulture();
|
|
111
|
-
cultureSpecs.timezone = timezone;
|
|
112
|
-
this.invalidateCache();
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
static setDefaultDateEncoding(encoding: (date: Date) => string): void {
|
|
116
|
-
let cultureSpecs = getDefaultCulture();
|
|
117
|
-
cultureSpecs.dateEncoding = encoding;
|
|
118
|
-
this.invalidateCache();
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
static invalidateCache(): void {
|
|
122
|
-
GlobalCacheIdentifier.change();
|
|
123
|
-
invalidateExpressionCache();
|
|
124
|
-
invalidateStringTemplateCache();
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
static get defaultCurrency(): string | undefined {
|
|
128
|
-
return getCurrentCulture().defaultCurrency;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
static get culture(): string | undefined {
|
|
132
|
-
return getCurrentCulture().culture;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
static getNumberCulture(): NumberCulture {
|
|
136
|
-
let { cache, numberCulture, culture } = getCurrentCulture();
|
|
137
|
-
if (!cache!.numberCulture) cache!.numberCulture = new NumberCulture(numberCulture ?? culture);
|
|
138
|
-
return cache!.numberCulture;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
static getDateTimeCulture(): DateTimeCulture {
|
|
142
|
-
let { cache, dateTimeCulture, culture, timezone } = getCurrentCulture();
|
|
143
|
-
if (!cache!.dateTimeCulture)
|
|
144
|
-
cache!.dateTimeCulture = new DateTimeCulture(dateTimeCulture ?? culture, {
|
|
145
|
-
defaultTimezone: timezone,
|
|
146
|
-
});
|
|
147
|
-
return cache!.dateTimeCulture;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
static getDefaultDateEncoding(): (date: Date) => string {
|
|
151
|
-
return getCurrentCulture().dateEncoding;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
static getComparer(options?: Intl.CollatorOptions): (a: any, b: any) => number {
|
|
155
|
-
let { culture } = getCurrentCulture();
|
|
156
|
-
if (typeof Intl.Collator != "undefined") return new Intl.Collator(culture, options).compare;
|
|
157
|
-
return defaultCompare;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
1
|
+
// @ts-expect-error
|
|
2
|
+
import { NumberCulture, DateTimeCulture } from "intl-io";
|
|
3
|
+
import { Localization } from "./Localization";
|
|
4
|
+
import { GlobalCacheIdentifier } from "../util/GlobalCacheIdentifier";
|
|
5
|
+
import { invalidateExpressionCache } from "../data/Expression";
|
|
6
|
+
import { invalidateStringTemplateCache } from "../data/StringTemplate";
|
|
7
|
+
import { defaultCompare } from "../data/defaultCompare";
|
|
8
|
+
import { Console } from "../util/Console";
|
|
9
|
+
|
|
10
|
+
export interface CultureInfo {
|
|
11
|
+
culture?: string;
|
|
12
|
+
numberCulture?: string | null;
|
|
13
|
+
dateTimeCulture?: string | null;
|
|
14
|
+
defaultCurrency?: string;
|
|
15
|
+
dateEncoding?: (date: Date) => string;
|
|
16
|
+
timezone?: string | null;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface ResolvedCultureInfo {
|
|
20
|
+
culture: string;
|
|
21
|
+
numberCulture?: string | null;
|
|
22
|
+
dateTimeCulture?: string | null;
|
|
23
|
+
cache: any;
|
|
24
|
+
defaultCurrency: string;
|
|
25
|
+
dateEncoding: (date: Date) => string;
|
|
26
|
+
timezone?: string | null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
let stack: ResolvedCultureInfo[] = [
|
|
30
|
+
{
|
|
31
|
+
culture: "en",
|
|
32
|
+
numberCulture: null,
|
|
33
|
+
dateTimeCulture: null,
|
|
34
|
+
cache: {},
|
|
35
|
+
defaultCurrency: "USD",
|
|
36
|
+
dateEncoding: (date: Date) => date.toISOString(),
|
|
37
|
+
timezone: null,
|
|
38
|
+
},
|
|
39
|
+
];
|
|
40
|
+
|
|
41
|
+
export function getDefaultCulture(): ResolvedCultureInfo {
|
|
42
|
+
return stack[0];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function getCurrentCulture(): ResolvedCultureInfo {
|
|
46
|
+
return stack[stack.length - 1];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function getCurrentCultureCache(): any {
|
|
50
|
+
return getCurrentCulture().cache;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function pushCulture(cultureInfo: ResolvedCultureInfo): void {
|
|
54
|
+
stack.push(cultureInfo);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function createCulture(cultureSpecs: Partial<CultureInfo>): ResolvedCultureInfo {
|
|
58
|
+
let current = getCurrentCulture();
|
|
59
|
+
let info: ResolvedCultureInfo = {
|
|
60
|
+
culture: current.culture,
|
|
61
|
+
dateEncoding: current.dateEncoding,
|
|
62
|
+
defaultCurrency: current.defaultCurrency,
|
|
63
|
+
cache: {},
|
|
64
|
+
};
|
|
65
|
+
for (let key in cultureSpecs) {
|
|
66
|
+
if (!(cultureSpecs as any)[key]) continue;
|
|
67
|
+
(info as any)[key] = (cultureSpecs as any)[key];
|
|
68
|
+
}
|
|
69
|
+
return info;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function popCulture(cultureSpecs?: CultureInfo): CultureInfo | undefined {
|
|
73
|
+
if (stack.length == 1) throw new Error("Cannot pop the last culture object.");
|
|
74
|
+
if (cultureSpecs && stack[stack.length - 1] !== cultureSpecs) {
|
|
75
|
+
Console.warn("Popped culture object does not match the current one.");
|
|
76
|
+
}
|
|
77
|
+
return stack.pop();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export class Culture {
|
|
81
|
+
static setCulture(cultureCode: string): void {
|
|
82
|
+
let cultureSpecs = getDefaultCulture();
|
|
83
|
+
cultureSpecs.culture = cultureCode;
|
|
84
|
+
cultureSpecs.cache = {};
|
|
85
|
+
Localization.setCulture(cultureCode);
|
|
86
|
+
this.invalidateCache();
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
static setNumberCulture(cultureCode: string): void {
|
|
90
|
+
let cultureSpecs = getDefaultCulture();
|
|
91
|
+
cultureSpecs.numberCulture = cultureCode;
|
|
92
|
+
delete cultureSpecs.cache.numberCulture;
|
|
93
|
+
this.invalidateCache();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
static setDateTimeCulture(cultureCode: string): void {
|
|
97
|
+
let cultureSpecs = getDefaultCulture();
|
|
98
|
+
cultureSpecs.dateTimeCulture = cultureCode;
|
|
99
|
+
delete cultureSpecs.cache.dateTimeCulture;
|
|
100
|
+
this.invalidateCache();
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
static setDefaultCurrency(currencyCode: string): void {
|
|
104
|
+
let cultureSpecs = getDefaultCulture();
|
|
105
|
+
cultureSpecs.defaultCurrency = currencyCode;
|
|
106
|
+
this.invalidateCache();
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
static setDefaultTimezone(timezone: string): void {
|
|
110
|
+
let cultureSpecs = getDefaultCulture();
|
|
111
|
+
cultureSpecs.timezone = timezone;
|
|
112
|
+
this.invalidateCache();
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
static setDefaultDateEncoding(encoding: (date: Date) => string): void {
|
|
116
|
+
let cultureSpecs = getDefaultCulture();
|
|
117
|
+
cultureSpecs.dateEncoding = encoding;
|
|
118
|
+
this.invalidateCache();
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
static invalidateCache(): void {
|
|
122
|
+
GlobalCacheIdentifier.change();
|
|
123
|
+
invalidateExpressionCache();
|
|
124
|
+
invalidateStringTemplateCache();
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
static get defaultCurrency(): string | undefined {
|
|
128
|
+
return getCurrentCulture().defaultCurrency;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
static get culture(): string | undefined {
|
|
132
|
+
return getCurrentCulture().culture;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
static getNumberCulture(): NumberCulture {
|
|
136
|
+
let { cache, numberCulture, culture } = getCurrentCulture();
|
|
137
|
+
if (!cache!.numberCulture) cache!.numberCulture = new NumberCulture(numberCulture ?? culture);
|
|
138
|
+
return cache!.numberCulture;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
static getDateTimeCulture(): DateTimeCulture {
|
|
142
|
+
let { cache, dateTimeCulture, culture, timezone } = getCurrentCulture();
|
|
143
|
+
if (!cache!.dateTimeCulture)
|
|
144
|
+
cache!.dateTimeCulture = new DateTimeCulture(dateTimeCulture ?? culture, {
|
|
145
|
+
defaultTimezone: timezone,
|
|
146
|
+
});
|
|
147
|
+
return cache!.dateTimeCulture;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
static getDefaultDateEncoding(): (date: Date) => string {
|
|
151
|
+
return getCurrentCulture().dateEncoding;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
static getComparer(options?: Intl.CollatorOptions): (a: any, b: any) => number {
|
|
155
|
+
let { culture } = getCurrentCulture();
|
|
156
|
+
if (typeof Intl.Collator != "undefined") return new Intl.Collator(culture, options).compare;
|
|
157
|
+
return defaultCompare;
|
|
158
|
+
}
|
|
159
|
+
}
|