cx 25.2.0 → 25.3.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/dist/manifest.js +606 -606
- package/dist/widgets.js +15 -4
- package/package.json +32 -32
- package/src/charts/Legend.js +167 -167
- package/src/charts/Legend.scss +40 -40
- package/src/charts/LegendEntry.js +128 -128
- package/src/charts/LegendEntry.scss +27 -27
- package/src/charts/PieChart.d.ts +92 -92
- package/src/charts/PieChart.js +529 -529
- package/src/charts/axis/Axis.d.ts +113 -113
- package/src/charts/axis/Axis.js +280 -280
- package/src/charts/axis/CategoryAxis.d.ts +30 -30
- package/src/charts/axis/CategoryAxis.js +241 -241
- package/src/charts/axis/NumericAxis.js +351 -351
- package/src/charts/axis/Stack.js +55 -55
- package/src/charts/axis/TimeAxis.d.ts +28 -28
- package/src/charts/axis/TimeAxis.js +611 -611
- package/src/charts/helpers/PointReducer.js +47 -47
- package/src/charts/helpers/SnapPointFinder.js +69 -69
- package/src/core.d.ts +40 -1
- package/src/data/Binding.spec.js +69 -69
- package/src/data/Expression.js +229 -229
- package/src/data/Expression.spec.js +229 -229
- package/src/data/StringTemplate.js +92 -92
- package/src/data/StringTemplate.spec.js +132 -132
- package/src/data/StructuredSelector.js +132 -132
- package/src/data/View.d.ts +36 -12
- package/src/data/getAccessor.spec.js +11 -11
- package/src/data/getSelector.js +49 -49
- package/src/hooks/createLocalStorageRef.d.ts +3 -3
- package/src/hooks/createLocalStorageRef.js +20 -20
- package/src/index.scss +6 -6
- package/src/ui/Culture.d.ts +57 -57
- package/src/ui/Culture.js +139 -139
- package/src/ui/FocusManager.js +171 -171
- package/src/ui/Format.js +108 -108
- package/src/ui/HoverSync.js +147 -147
- package/src/ui/Instance.d.ts +72 -72
- package/src/ui/Instance.js +614 -614
- package/src/ui/Repeater.d.ts +61 -61
- package/src/ui/ResizeManager.d.ts +4 -3
- package/src/ui/index.d.ts +42 -42
- package/src/ui/layout/ContentPlaceholder.d.ts +19 -19
- package/src/ui/layout/ContentPlaceholder.js +105 -105
- package/src/ui/layout/ContentPlaceholder.spec.js +579 -579
- package/src/ui/layout/LabelsTopLayout.js +134 -134
- package/src/util/date/encodeDate.d.ts +1 -1
- package/src/util/date/encodeDate.js +8 -8
- package/src/util/date/encodeDateWithTimezoneOffset.d.ts +1 -1
- package/src/util/date/index.d.ts +11 -11
- package/src/util/date/index.js +11 -11
- package/src/util/date/parseDateInvariant.d.ts +3 -3
- package/src/util/date/parseDateInvariant.js +20 -20
- package/src/util/debounce.d.ts +3 -4
- package/src/util/getSearchQueryPredicate.js +59 -59
- package/src/util/index.d.ts +51 -51
- package/src/util/index.js +54 -54
- package/src/util/isValidIdentifierName.d.ts +1 -1
- package/src/util/isValidIdentifierName.js +5 -5
- package/src/util/isValidIdentifierName.spec.js +33 -33
- package/src/util/scss/add-rules.scss +38 -38
- package/src/widgets/CxCredit.scss +37 -37
- package/src/widgets/HighlightedSearchText.js +36 -36
- package/src/widgets/HighlightedSearchText.scss +18 -18
- package/src/widgets/HtmlElement.d.ts +4 -0
- package/src/widgets/List.scss +91 -91
- package/src/widgets/drag-drop/DropZone.js +214 -214
- package/src/widgets/form/Calendar.js +618 -618
- package/src/widgets/form/Calendar.scss +196 -196
- package/src/widgets/form/Checkbox.scss +127 -127
- package/src/widgets/form/ColorField.js +397 -397
- package/src/widgets/form/ColorField.scss +96 -96
- package/src/widgets/form/ColorPicker.js +485 -480
- package/src/widgets/form/ColorPicker.scss +283 -283
- package/src/widgets/form/DateTimeField.js +576 -576
- package/src/widgets/form/DateTimePicker.js +392 -392
- package/src/widgets/form/LookupField.d.ts +179 -179
- package/src/widgets/form/LookupField.scss +219 -219
- package/src/widgets/form/MonthField.d.ts +99 -99
- package/src/widgets/form/MonthField.js +523 -523
- package/src/widgets/form/MonthPicker.d.ts +76 -76
- package/src/widgets/form/MonthPicker.js +641 -641
- package/src/widgets/form/MonthPicker.scss +118 -118
- package/src/widgets/form/NumberField.js +459 -459
- package/src/widgets/form/NumberField.scss +61 -61
- package/src/widgets/form/Radio.scss +121 -121
- package/src/widgets/form/Select.scss +99 -99
- package/src/widgets/form/Slider.scss +118 -118
- package/src/widgets/form/Switch.scss +140 -140
- package/src/widgets/form/TextArea.scss +43 -43
- package/src/widgets/form/TextField.js +290 -290
- package/src/widgets/form/TextField.scss +55 -55
- package/src/widgets/form/UploadButton.d.ts +34 -34
- package/src/widgets/form/variables.scss +353 -353
- package/src/widgets/grid/Grid.d.ts +442 -442
- package/src/widgets/grid/Grid.js +3414 -3414
- package/src/widgets/grid/GridRow.js +228 -228
- package/src/widgets/grid/TreeNode.d.ts +23 -23
- package/src/widgets/grid/TreeNode.scss +88 -88
- package/src/widgets/grid/variables.scss +133 -133
- package/src/widgets/nav/LinkButton.js +3 -3
- package/src/widgets/nav/Menu.scss +74 -74
- package/src/widgets/overlay/Dropdown.js +612 -612
- package/src/widgets/overlay/FlyweightTooltipTracker.js +39 -39
- package/src/widgets/overlay/Overlay.d.ts +73 -73
- package/src/widgets/overlay/Tooltip.js +308 -303
- package/src/widgets/overlay/Window.js +202 -202
- package/src/widgets/overlay/captureMouse.js +124 -124
- package/src/widgets/overlay/createHotPromiseWindowFactory.d.ts +18 -18
- package/src/widgets/overlay/createHotPromiseWindowFactory.js +56 -56
- package/src/widgets/overlay/index.d.ts +11 -11
- package/src/widgets/overlay/index.js +11 -11
- package/src/widgets/variables.scss +144 -144
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
import { PureContainer } from "../../ui/PureContainer";
|
|
2
|
-
|
|
3
|
-
export class PointReducer extends PureContainer {
|
|
4
|
-
explore(context, instance) {
|
|
5
|
-
let parentPointReducer = context.pointReducer;
|
|
6
|
-
instance.parentPointTracker = parentPointReducer;
|
|
7
|
-
|
|
8
|
-
if (!instance.pointReducer) {
|
|
9
|
-
let onMap = this.onMap && instance.getCallback("onMap");
|
|
10
|
-
let accumulator = {};
|
|
11
|
-
instance.resetAccumulator = () => {
|
|
12
|
-
accumulator = {};
|
|
13
|
-
if (this.onInitAccumulator) instance.invoke("onInitAccumulator", accumulator, instance);
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
let pointFilter = null;
|
|
17
|
-
if (this.onCreatePointFilter) pointFilter = instance.invoke("onCreatePointFilter", instance);
|
|
18
|
-
|
|
19
|
-
instance.pointReducer = (x, y, name, data, array, index) => {
|
|
20
|
-
if (!pointFilter || pointFilter(x, y, name, data, array, index))
|
|
21
|
-
onMap(accumulator, x, y, name, data, array, index);
|
|
22
|
-
if (parentPointReducer) parentPointReducer(x, y, name, data, array, index);
|
|
23
|
-
};
|
|
24
|
-
instance.write = () => {
|
|
25
|
-
if (this.onReduce) instance.invoke("onReduce", accumulator, instance);
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
instance.resetAccumulator();
|
|
30
|
-
context.push("pointReducer", instance.pointReducer);
|
|
31
|
-
|
|
32
|
-
super.explore(context, instance);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
exploreCleanup(context, instance) {
|
|
36
|
-
context.pop("pointReducer");
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
prepare(context, instance) {
|
|
40
|
-
context.push("pointReducer", instance.pointReducer);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
prepareCleanup(context, instance) {
|
|
44
|
-
context.pop("pointReducer");
|
|
45
|
-
instance.write();
|
|
46
|
-
}
|
|
47
|
-
}
|
|
1
|
+
import { PureContainer } from "../../ui/PureContainer";
|
|
2
|
+
|
|
3
|
+
export class PointReducer extends PureContainer {
|
|
4
|
+
explore(context, instance) {
|
|
5
|
+
let parentPointReducer = context.pointReducer;
|
|
6
|
+
instance.parentPointTracker = parentPointReducer;
|
|
7
|
+
|
|
8
|
+
if (!instance.pointReducer) {
|
|
9
|
+
let onMap = this.onMap && instance.getCallback("onMap");
|
|
10
|
+
let accumulator = {};
|
|
11
|
+
instance.resetAccumulator = () => {
|
|
12
|
+
accumulator = {};
|
|
13
|
+
if (this.onInitAccumulator) instance.invoke("onInitAccumulator", accumulator, instance);
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
let pointFilter = null;
|
|
17
|
+
if (this.onCreatePointFilter) pointFilter = instance.invoke("onCreatePointFilter", instance);
|
|
18
|
+
|
|
19
|
+
instance.pointReducer = (x, y, name, data, array, index) => {
|
|
20
|
+
if (!pointFilter || pointFilter(x, y, name, data, array, index))
|
|
21
|
+
onMap(accumulator, x, y, name, data, array, index);
|
|
22
|
+
if (parentPointReducer) parentPointReducer(x, y, name, data, array, index);
|
|
23
|
+
};
|
|
24
|
+
instance.write = () => {
|
|
25
|
+
if (this.onReduce) instance.invoke("onReduce", accumulator, instance);
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
instance.resetAccumulator();
|
|
30
|
+
context.push("pointReducer", instance.pointReducer);
|
|
31
|
+
|
|
32
|
+
super.explore(context, instance);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
exploreCleanup(context, instance) {
|
|
36
|
+
context.pop("pointReducer");
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
prepare(context, instance) {
|
|
40
|
+
context.push("pointReducer", instance.pointReducer);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
prepareCleanup(context, instance) {
|
|
44
|
+
context.pop("pointReducer");
|
|
45
|
+
instance.write();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -1,69 +1,69 @@
|
|
|
1
|
-
import { PointReducer } from "./PointReducer";
|
|
2
|
-
|
|
3
|
-
export class SnapPointFinder extends PointReducer {
|
|
4
|
-
declareData() {
|
|
5
|
-
return super.declareData(...arguments, {
|
|
6
|
-
cursorX: undefined,
|
|
7
|
-
cursorY: undefined,
|
|
8
|
-
snapX: undefined,
|
|
9
|
-
snapY: undefined,
|
|
10
|
-
snapRecord: undefined,
|
|
11
|
-
maxDistance: undefined,
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
explore(context, instance) {
|
|
16
|
-
instance.xAxis = context.axes[this.xAxis];
|
|
17
|
-
instance.yAxis = context.axes[this.yAxis];
|
|
18
|
-
super.explore(context, instance);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
onInitAccumulator(acc, { data, xAxis, yAxis }) {
|
|
22
|
-
acc.cursor = {
|
|
23
|
-
x: data.cursorX,
|
|
24
|
-
y: data.cursorY,
|
|
25
|
-
mapped: false,
|
|
26
|
-
};
|
|
27
|
-
acc.dist = data.maxDistance > 0 ? Math.pow(data.maxDistance, 2) : Number.POSITIVE_INFINITY;
|
|
28
|
-
acc.snapX = null;
|
|
29
|
-
acc.snapY = null;
|
|
30
|
-
acc.xAxis = xAxis;
|
|
31
|
-
acc.yAxis = yAxis;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
onMap(acc, x, y, name, p) {
|
|
35
|
-
let { xAxis, yAxis, cursor } = acc;
|
|
36
|
-
|
|
37
|
-
if (!cursor.mapped) {
|
|
38
|
-
cursor.mappedX = cursor.x != null ? xAxis?.map(this.convertX(cursor.x)) : null;
|
|
39
|
-
cursor.mappedY = cursor.y != null ? yAxis?.map(this.convertY(cursor.y)) : null;
|
|
40
|
-
cursor.mapped = true;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
let d = null;
|
|
44
|
-
let cx = x != null ? xAxis?.map(this.convertX(x)) : null;
|
|
45
|
-
let cy = y != null ? yAxis?.map(this.convertY(y)) : null;
|
|
46
|
-
|
|
47
|
-
if (cursor.mappedX != null && cx != null) d = (d || 0) + Math.pow(Math.abs(cx - cursor.mappedX), 2);
|
|
48
|
-
if (cursor.mappedY != null && cy != null) d = (d || 0) + Math.pow(Math.abs(cy - cursor.mappedY), 2);
|
|
49
|
-
|
|
50
|
-
if (d != null && d < acc.dist) {
|
|
51
|
-
acc.dist = d;
|
|
52
|
-
acc.snapX = x;
|
|
53
|
-
acc.snapY = y;
|
|
54
|
-
acc.snapRecord = p;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
onReduce(acc, instance) {
|
|
59
|
-
instance.set("snapX", acc.snapX);
|
|
60
|
-
instance.set("snapY", acc.snapY);
|
|
61
|
-
instance.set("snapRecord", acc.snapRecord);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
SnapPointFinder.prototype.maxDistance = 50;
|
|
66
|
-
SnapPointFinder.prototype.convertX = (x) => x;
|
|
67
|
-
SnapPointFinder.prototype.convertY = (y) => y;
|
|
68
|
-
SnapPointFinder.prototype.xAxis = "x";
|
|
69
|
-
SnapPointFinder.prototype.yAxis = "y";
|
|
1
|
+
import { PointReducer } from "./PointReducer";
|
|
2
|
+
|
|
3
|
+
export class SnapPointFinder extends PointReducer {
|
|
4
|
+
declareData() {
|
|
5
|
+
return super.declareData(...arguments, {
|
|
6
|
+
cursorX: undefined,
|
|
7
|
+
cursorY: undefined,
|
|
8
|
+
snapX: undefined,
|
|
9
|
+
snapY: undefined,
|
|
10
|
+
snapRecord: undefined,
|
|
11
|
+
maxDistance: undefined,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
explore(context, instance) {
|
|
16
|
+
instance.xAxis = context.axes[this.xAxis];
|
|
17
|
+
instance.yAxis = context.axes[this.yAxis];
|
|
18
|
+
super.explore(context, instance);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
onInitAccumulator(acc, { data, xAxis, yAxis }) {
|
|
22
|
+
acc.cursor = {
|
|
23
|
+
x: data.cursorX,
|
|
24
|
+
y: data.cursorY,
|
|
25
|
+
mapped: false,
|
|
26
|
+
};
|
|
27
|
+
acc.dist = data.maxDistance > 0 ? Math.pow(data.maxDistance, 2) : Number.POSITIVE_INFINITY;
|
|
28
|
+
acc.snapX = null;
|
|
29
|
+
acc.snapY = null;
|
|
30
|
+
acc.xAxis = xAxis;
|
|
31
|
+
acc.yAxis = yAxis;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
onMap(acc, x, y, name, p) {
|
|
35
|
+
let { xAxis, yAxis, cursor } = acc;
|
|
36
|
+
|
|
37
|
+
if (!cursor.mapped) {
|
|
38
|
+
cursor.mappedX = cursor.x != null ? xAxis?.map(this.convertX(cursor.x)) : null;
|
|
39
|
+
cursor.mappedY = cursor.y != null ? yAxis?.map(this.convertY(cursor.y)) : null;
|
|
40
|
+
cursor.mapped = true;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
let d = null;
|
|
44
|
+
let cx = x != null ? xAxis?.map(this.convertX(x)) : null;
|
|
45
|
+
let cy = y != null ? yAxis?.map(this.convertY(y)) : null;
|
|
46
|
+
|
|
47
|
+
if (cursor.mappedX != null && cx != null) d = (d || 0) + Math.pow(Math.abs(cx - cursor.mappedX), 2);
|
|
48
|
+
if (cursor.mappedY != null && cy != null) d = (d || 0) + Math.pow(Math.abs(cy - cursor.mappedY), 2);
|
|
49
|
+
|
|
50
|
+
if (d != null && d < acc.dist) {
|
|
51
|
+
acc.dist = d;
|
|
52
|
+
acc.snapX = x;
|
|
53
|
+
acc.snapY = y;
|
|
54
|
+
acc.snapRecord = p;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
onReduce(acc, instance) {
|
|
59
|
+
instance.set("snapX", acc.snapX);
|
|
60
|
+
instance.set("snapY", acc.snapY);
|
|
61
|
+
instance.set("snapRecord", acc.snapRecord);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
SnapPointFinder.prototype.maxDistance = 50;
|
|
66
|
+
SnapPointFinder.prototype.convertX = (x) => x;
|
|
67
|
+
SnapPointFinder.prototype.convertY = (y) => y;
|
|
68
|
+
SnapPointFinder.prototype.xAxis = "x";
|
|
69
|
+
SnapPointFinder.prototype.yAxis = "y";
|
package/src/core.d.ts
CHANGED
|
@@ -160,7 +160,7 @@ declare namespace Cx {
|
|
|
160
160
|
|
|
161
161
|
interface HtmlElementProps extends StyledContainerProps {
|
|
162
162
|
/** Id of the element */
|
|
163
|
-
id?:
|
|
163
|
+
id?: Cx.StringProp | Cx.NumberProp;
|
|
164
164
|
|
|
165
165
|
/** Inner text contents. */
|
|
166
166
|
text?: Cx.StringProp | Cx.NumberProp;
|
|
@@ -251,6 +251,39 @@ declare global {
|
|
|
251
251
|
tooltip?: Cx.StringProp | Cx.StructuredProp;
|
|
252
252
|
}
|
|
253
253
|
}
|
|
254
|
+
|
|
255
|
+
interface JSON {
|
|
256
|
+
/* JSON doesn't support symbol keys, and number keys
|
|
257
|
+
* are coerced to strings, even in arrays */
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Converts a JavaScript Object Notation (JSON) string into an object.
|
|
261
|
+
* @param text A valid JSON string.
|
|
262
|
+
* @param reviver A function that transforms the results. This function is called for each member of the object.
|
|
263
|
+
* If a member contains nested objects, the nested objects are transformed before the parent object is.
|
|
264
|
+
*/
|
|
265
|
+
parse(text: string, reviver?: (this: unknown, key: string, value: unknown) => unknown): unknown;
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Converts a JavaScript value to a JavaScript Object Notation (JSON) string.
|
|
269
|
+
* @param value A JavaScript value, usually an object or array, to be converted.
|
|
270
|
+
* @param replacer A function that transforms the results.
|
|
271
|
+
* @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.
|
|
272
|
+
*/
|
|
273
|
+
stringify(
|
|
274
|
+
text: unknown,
|
|
275
|
+
replacer?: (this: unknown, key: string, value: unknown) => unknown,
|
|
276
|
+
space?: string | number,
|
|
277
|
+
): string;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
interface ArrayConstructor {
|
|
281
|
+
isArray(a: unknown): a is unknown[];
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
interface Body {
|
|
285
|
+
json(): Promise<unknown>;
|
|
286
|
+
}
|
|
254
287
|
}
|
|
255
288
|
|
|
256
289
|
declare module "react" {
|
|
@@ -263,6 +296,12 @@ declare module "react" {
|
|
|
263
296
|
innerHtml?: Cx.StringProp;
|
|
264
297
|
tooltip?: Cx.StringProp | Cx.StructuredProp;
|
|
265
298
|
}
|
|
299
|
+
namespace React {
|
|
300
|
+
interface ImgHTMLAttributes<T> extends HTMLAttributes<T> {
|
|
301
|
+
alt?: Cx.StringProp | undefined;
|
|
302
|
+
src?: Cx.StringProp | undefined;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
266
305
|
|
|
267
306
|
//this doesn't work, however, it would be nice if it does
|
|
268
307
|
// interface EventHandler<E extends React.SyntheticEvent<any>> {
|
package/src/data/Binding.spec.js
CHANGED
|
@@ -1,69 +1,69 @@
|
|
|
1
|
-
import { Binding } from "./Binding";
|
|
2
|
-
import assert from "assert";
|
|
3
|
-
import { createAccessorModelProxy } from "./createAccessorModelProxy";
|
|
4
|
-
|
|
5
|
-
describe("Binding", function () {
|
|
6
|
-
describe("#get()", function () {
|
|
7
|
-
it("should get value if value is defined", function () {
|
|
8
|
-
var state = { person: { name: "Joe" } };
|
|
9
|
-
var b = Binding.get("person.name");
|
|
10
|
-
assert.equal(b.value(state), "Joe");
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
it("allows non-standard property identifiers", function () {
|
|
14
|
-
var state = { person: { "@schema": "Person" } };
|
|
15
|
-
var b = Binding.get("person.@schema");
|
|
16
|
-
assert.equal(b.path, "person.@schema");
|
|
17
|
-
assert.equal(b.value(state), "Person");
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
it("properly resolves accessor models", function () {
|
|
21
|
-
var state = { person: { schema: "Person" } };
|
|
22
|
-
var b = Binding.get(createAccessorModelProxy("person.schema"));
|
|
23
|
-
assert.equal(b.value(state), "Person");
|
|
24
|
-
});
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
describe("#set()", function () {
|
|
28
|
-
it("produces new objects along the binding path", function () {
|
|
29
|
-
var state = { person: { name: "Joe" } };
|
|
30
|
-
var b = Binding.get("person.name");
|
|
31
|
-
var ns = b.set(state, "Jack");
|
|
32
|
-
assert.equal(ns.person.name, "Jack");
|
|
33
|
-
assert.notEqual(state, ns);
|
|
34
|
-
assert.notEqual(state.person, ns.person);
|
|
35
|
-
assert.notEqual(state.person.name, ns.person.name);
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it("returns same state object if value does not change", function () {
|
|
39
|
-
var state = { person: { name: "Joe" } };
|
|
40
|
-
var b = Binding.get("person.name");
|
|
41
|
-
var ns = b.set(state, "Joe");
|
|
42
|
-
assert.equal(state, ns);
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it("allows non-standard property identifiers", function () {
|
|
46
|
-
var state = { person: { "@schema": "Person" } };
|
|
47
|
-
var b = Binding.get("person.@schema");
|
|
48
|
-
var ns = b.set(state, "Test");
|
|
49
|
-
assert.equal(ns.person["@schema"], "Test");
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
describe(".delete()", function () {
|
|
54
|
-
it("correctly removes pointed properties", function () {
|
|
55
|
-
var state = { person: { name: "Joe" } };
|
|
56
|
-
var b = Binding.get("person.name");
|
|
57
|
-
var ns = b.delete(state);
|
|
58
|
-
assert("person" in ns);
|
|
59
|
-
assert(!("name" in ns.person));
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
it("does not change state if property is non-existent", function () {
|
|
63
|
-
var state = { person: { name: "Joe" } };
|
|
64
|
-
var b = Binding.get("person.name2");
|
|
65
|
-
var ns = b.delete(state);
|
|
66
|
-
assert(ns == state);
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
});
|
|
1
|
+
import { Binding } from "./Binding";
|
|
2
|
+
import assert from "assert";
|
|
3
|
+
import { createAccessorModelProxy } from "./createAccessorModelProxy";
|
|
4
|
+
|
|
5
|
+
describe("Binding", function () {
|
|
6
|
+
describe("#get()", function () {
|
|
7
|
+
it("should get value if value is defined", function () {
|
|
8
|
+
var state = { person: { name: "Joe" } };
|
|
9
|
+
var b = Binding.get("person.name");
|
|
10
|
+
assert.equal(b.value(state), "Joe");
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it("allows non-standard property identifiers", function () {
|
|
14
|
+
var state = { person: { "@schema": "Person" } };
|
|
15
|
+
var b = Binding.get("person.@schema");
|
|
16
|
+
assert.equal(b.path, "person.@schema");
|
|
17
|
+
assert.equal(b.value(state), "Person");
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it("properly resolves accessor models", function () {
|
|
21
|
+
var state = { person: { schema: "Person" } };
|
|
22
|
+
var b = Binding.get(createAccessorModelProxy("person.schema"));
|
|
23
|
+
assert.equal(b.value(state), "Person");
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
describe("#set()", function () {
|
|
28
|
+
it("produces new objects along the binding path", function () {
|
|
29
|
+
var state = { person: { name: "Joe" } };
|
|
30
|
+
var b = Binding.get("person.name");
|
|
31
|
+
var ns = b.set(state, "Jack");
|
|
32
|
+
assert.equal(ns.person.name, "Jack");
|
|
33
|
+
assert.notEqual(state, ns);
|
|
34
|
+
assert.notEqual(state.person, ns.person);
|
|
35
|
+
assert.notEqual(state.person.name, ns.person.name);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it("returns same state object if value does not change", function () {
|
|
39
|
+
var state = { person: { name: "Joe" } };
|
|
40
|
+
var b = Binding.get("person.name");
|
|
41
|
+
var ns = b.set(state, "Joe");
|
|
42
|
+
assert.equal(state, ns);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("allows non-standard property identifiers", function () {
|
|
46
|
+
var state = { person: { "@schema": "Person" } };
|
|
47
|
+
var b = Binding.get("person.@schema");
|
|
48
|
+
var ns = b.set(state, "Test");
|
|
49
|
+
assert.equal(ns.person["@schema"], "Test");
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
describe(".delete()", function () {
|
|
54
|
+
it("correctly removes pointed properties", function () {
|
|
55
|
+
var state = { person: { name: "Joe" } };
|
|
56
|
+
var b = Binding.get("person.name");
|
|
57
|
+
var ns = b.delete(state);
|
|
58
|
+
assert("person" in ns);
|
|
59
|
+
assert(!("name" in ns.person));
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it("does not change state if property is non-existent", function () {
|
|
63
|
+
var state = { person: { name: "Joe" } };
|
|
64
|
+
var b = Binding.get("person.name2");
|
|
65
|
+
var ns = b.delete(state);
|
|
66
|
+
assert(ns == state);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
});
|