cx 26.4.3 → 26.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/build/data/AugmentedViewBase.d.ts.map +1 -1
  2. package/build/data/AugmentedViewBase.js +5 -4
  3. package/build/data/View.d.ts +0 -1
  4. package/build/data/View.d.ts.map +1 -1
  5. package/build/data/View.js +1 -3
  6. package/build/widgets/form/LookupField.js +2 -1
  7. package/dist/data.js +5 -4
  8. package/dist/manifest.js +756 -756
  9. package/dist/widgets.css +9 -3
  10. package/dist/widgets.js +5 -1
  11. package/package.json +1 -1
  12. package/src/charts/BarGraph.scss +31 -31
  13. package/src/charts/Legend.scss +57 -57
  14. package/src/charts/LegendEntry.scss +35 -35
  15. package/src/charts/LineGraph.scss +28 -28
  16. package/src/charts/helpers/SnapPointFinder.ts +136 -136
  17. package/src/charts/helpers/ValueAtFinder.ts +72 -72
  18. package/src/data/AugmentedViewBase.ts +89 -88
  19. package/src/data/View.ts +301 -346
  20. package/src/data/createAccessorModelProxy.ts +66 -66
  21. package/src/ui/DataProxy.ts +55 -55
  22. package/src/ui/Repeater.spec.tsx +181 -181
  23. package/src/ui/Rescope.ts +50 -50
  24. package/src/ui/adapter/ArrayAdapter.ts +229 -229
  25. package/src/ui/exprHelpers.ts +96 -96
  26. package/src/util/scss/include.scss +69 -69
  27. package/src/widgets/Button.maps.scss +103 -103
  28. package/src/widgets/Sandbox.ts +104 -104
  29. package/src/widgets/form/Calendar.tsx +772 -772
  30. package/src/widgets/form/ColorField.scss +112 -112
  31. package/src/widgets/form/DateTimeField.scss +111 -111
  32. package/src/widgets/form/LookupField.maps.scss +26 -26
  33. package/src/widgets/form/LookupField.scss +10 -3
  34. package/src/widgets/form/LookupField.tsx +4 -1
  35. package/src/widgets/form/MonthField.scss +113 -113
  36. package/src/widgets/form/NumberField.scss +72 -72
  37. package/src/widgets/form/Select.scss +104 -104
  38. package/src/widgets/form/TextField.scss +66 -66
  39. package/src/widgets/grid/Grid.scss +657 -657
  40. package/src/widgets/grid/variables.scss +47 -47
  41. package/src/widgets/index.ts +63 -63
  42. package/src/widgets/nav/MenuItem.scss +150 -150
  43. package/src/widgets/nav/MenuItem.tsx +525 -525
  44. package/src/widgets/nav/Tab.ts +122 -122
  45. package/src/widgets/overlay/Overlay.tsx +1029 -1029
  46. package/src/widgets/variables.scss +61 -61
package/dist/widgets.css CHANGED
@@ -1429,9 +1429,6 @@ th.cxe-calendar-display {
1429
1429
  }
1430
1430
 
1431
1431
  .cxs-single > .cxe-lookupfield-input {
1432
- overflow: hidden;
1433
- text-overflow: ellipsis;
1434
- white-space: nowrap;
1435
1432
  flex-basis: 0%;
1436
1433
  flex-grow: 1;
1437
1434
  }
@@ -1440,6 +1437,15 @@ th.cxe-calendar-display {
1440
1437
  padding-left: 26px;
1441
1438
  }
1442
1439
 
1440
+ .cxe-lookupfield-text {
1441
+ overflow: hidden;
1442
+ text-overflow: ellipsis;
1443
+ white-space: nowrap;
1444
+ min-width: 0;
1445
+ flex-basis: 0%;
1446
+ flex-grow: 1;
1447
+ }
1448
+
1443
1449
  .cxe-lookupfield-tags {
1444
1450
  display: flex;
1445
1451
  margin: -2px -2px -2px -2px;
package/dist/widgets.js CHANGED
@@ -9153,7 +9153,11 @@ class LookupComponent extends VDOM.Component {
9153
9153
  text = this.getPlaceholder(data.placeholder);
9154
9154
  }
9155
9155
  } else {
9156
- text = !data.empty ? data.text || this.getPlaceholder() : this.getPlaceholder(data.placeholder);
9156
+ let content = !data.empty ? data.text || this.getPlaceholder() : this.getPlaceholder(data.placeholder);
9157
+ text = jsx("span", {
9158
+ className: CSS.element(baseClass, "text"),
9159
+ children: content,
9160
+ });
9157
9161
  }
9158
9162
  let states = {
9159
9163
  visited: state.visited,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cx",
3
- "version": "26.4.3",
3
+ "version": "26.4.4",
4
4
  "description": "Advanced JavaScript UI framework for admin and dashboard applications with ready to use grid, form and chart components.",
5
5
  "exports": {
6
6
  "./data": {
@@ -1,31 +1,31 @@
1
- @use "sass:math";
2
- @use "sass:map";
3
- @use "../util/scss/besm.scss" as *;
4
- @use "../util/scss/include.scss" as *;
5
- @use "../util/scss/add-rules.scss" as *;
6
- @use "../util/scss/clockwise.scss" as *;
7
- @use "./variables" as *;
8
-
9
- @mixin cx-bargraph($name: "bargraph", $besm: $cx-besm) {
10
- $block: map.get($besm, block);
11
- $element: map.get($besm, element);
12
- $state: map.get($besm, state);
13
-
14
- .#{$element}#{$name}-bar {
15
- stroke-width: $cx-default-chart-shape-stroke-width;
16
- fill: $cx-default-chart-shape-fill-color;
17
- stroke: $cx-default-chart-shape-stroke-color;
18
-
19
- &.#{$state}selectable {
20
- cursor: pointer;
21
- }
22
-
23
- &.#{$state}selected {
24
- stroke-width: $cx-default-chart-selected-stroke-width;
25
- }
26
- }
27
- }
28
-
29
- @if (cx-should-include("cx/charts/BarGraph")) {
30
- @include cx-bargraph();
31
- }
1
+ @use "sass:math";
2
+ @use "sass:map";
3
+ @use "../util/scss/besm.scss" as *;
4
+ @use "../util/scss/include.scss" as *;
5
+ @use "../util/scss/add-rules.scss" as *;
6
+ @use "../util/scss/clockwise.scss" as *;
7
+ @use "./variables" as *;
8
+
9
+ @mixin cx-bargraph($name: "bargraph", $besm: $cx-besm) {
10
+ $block: map.get($besm, block);
11
+ $element: map.get($besm, element);
12
+ $state: map.get($besm, state);
13
+
14
+ .#{$element}#{$name}-bar {
15
+ stroke-width: $cx-default-chart-shape-stroke-width;
16
+ fill: $cx-default-chart-shape-fill-color;
17
+ stroke: $cx-default-chart-shape-stroke-color;
18
+
19
+ &.#{$state}selectable {
20
+ cursor: pointer;
21
+ }
22
+
23
+ &.#{$state}selected {
24
+ stroke-width: $cx-default-chart-selected-stroke-width;
25
+ }
26
+ }
27
+ }
28
+
29
+ @if (cx-should-include("cx/charts/BarGraph")) {
30
+ @include cx-bargraph();
31
+ }
@@ -1,57 +1,57 @@
1
- @use "sass:math";
2
- @use "sass:map";
3
- @use "../util/scss/besm.scss" as *;
4
- @use "../util/scss/include.scss" as *;
5
- @use "../util/scss/add-rules.scss" as *;
6
- @use "../util/scss/clockwise.scss" as *;
7
- @use "./variables" as *;
8
-
9
- @mixin cx-legend($name: "legend", $besm: $cx-besm) {
10
- $block: map.get($besm, block);
11
- $element: map.get($besm, element);
12
- $state: map.get($besm, state);
13
-
14
- .#{$block}#{$name} {
15
- display: flex;
16
- justify-content: center;
17
- align-items: flex-start;
18
- flex-wrap: wrap;
19
- gap: $cx-default-chart-legend-gap;
20
- }
21
-
22
- .#{$block}#{$name}.#{$state}vertical {
23
- flex-direction: column;
24
- }
25
-
26
- .#{$element}#{$name}-entry {
27
- display: flex;
28
- align-items: center;
29
- padding: $cx-default-chart-legend-padding;
30
- gap: $cx-default-chart-legend-entry-gap;
31
- font-size: $cx-default-chart-legend-font-size;
32
- position: relative;
33
- box-sizing: border-box;
34
- cursor: pointer;
35
- }
36
-
37
- .#{$element}#{$name}-svg {
38
- flex-shrink: 0;
39
- }
40
-
41
- .#{$element}#{$name}-shape {
42
- fill: $cx-default-chart-legend-shape-color;
43
- stroke-width: $cx-default-chart-legend-shape-stroke-width;
44
- }
45
-
46
- .#{$element}#{$name}-value {
47
- order: 3;
48
- }
49
-
50
- .#{$element}#{$name}-entry-text {
51
- order: 2;
52
- }
53
- }
54
-
55
- @if (cx-should-include("cx/charts/Legend")) {
56
- @include cx-legend();
57
- }
1
+ @use "sass:math";
2
+ @use "sass:map";
3
+ @use "../util/scss/besm.scss" as *;
4
+ @use "../util/scss/include.scss" as *;
5
+ @use "../util/scss/add-rules.scss" as *;
6
+ @use "../util/scss/clockwise.scss" as *;
7
+ @use "./variables" as *;
8
+
9
+ @mixin cx-legend($name: "legend", $besm: $cx-besm) {
10
+ $block: map.get($besm, block);
11
+ $element: map.get($besm, element);
12
+ $state: map.get($besm, state);
13
+
14
+ .#{$block}#{$name} {
15
+ display: flex;
16
+ justify-content: center;
17
+ align-items: flex-start;
18
+ flex-wrap: wrap;
19
+ gap: $cx-default-chart-legend-gap;
20
+ }
21
+
22
+ .#{$block}#{$name}.#{$state}vertical {
23
+ flex-direction: column;
24
+ }
25
+
26
+ .#{$element}#{$name}-entry {
27
+ display: flex;
28
+ align-items: center;
29
+ padding: $cx-default-chart-legend-padding;
30
+ gap: $cx-default-chart-legend-entry-gap;
31
+ font-size: $cx-default-chart-legend-font-size;
32
+ position: relative;
33
+ box-sizing: border-box;
34
+ cursor: pointer;
35
+ }
36
+
37
+ .#{$element}#{$name}-svg {
38
+ flex-shrink: 0;
39
+ }
40
+
41
+ .#{$element}#{$name}-shape {
42
+ fill: $cx-default-chart-legend-shape-color;
43
+ stroke-width: $cx-default-chart-legend-shape-stroke-width;
44
+ }
45
+
46
+ .#{$element}#{$name}-value {
47
+ order: 3;
48
+ }
49
+
50
+ .#{$element}#{$name}-entry-text {
51
+ order: 2;
52
+ }
53
+ }
54
+
55
+ @if (cx-should-include("cx/charts/Legend")) {
56
+ @include cx-legend();
57
+ }
@@ -1,35 +1,35 @@
1
- @use "sass:math";
2
- @use "sass:map";
3
- @use "../util/scss/besm.scss" as *;
4
- @use "../util/scss/include.scss" as *;
5
- @use "../util/scss/add-rules.scss" as *;
6
- @use "../util/scss/clockwise.scss" as *;
7
- @use "./variables" as *;
8
-
9
- @mixin cx-legendentry($name: "legendentry", $besm: $cx-besm) {
10
- $block: map.get($besm, block);
11
- $element: map.get($besm, element);
12
- $state: map.get($besm, state);
13
-
14
- .#{$block}#{$name} {
15
- display: inline-flex;
16
- align-items: center;
17
- padding: $cx-default-chart-legend-padding;
18
- gap: $cx-default-chart-legend-entry-gap;
19
- position: relative;
20
- box-sizing: border-box;
21
- cursor: pointer;
22
- }
23
-
24
- .#{$element}#{$name}-svg {
25
- flex-shrink: 0;
26
- }
27
-
28
- .#{$element}#{$name}-shape {
29
- fill: $cx-default-chart-shape-fill-color;
30
- }
31
- }
32
-
33
- @if (cx-should-include("cx/charts/LegendEntry")) {
34
- @include cx-legendentry();
35
- }
1
+ @use "sass:math";
2
+ @use "sass:map";
3
+ @use "../util/scss/besm.scss" as *;
4
+ @use "../util/scss/include.scss" as *;
5
+ @use "../util/scss/add-rules.scss" as *;
6
+ @use "../util/scss/clockwise.scss" as *;
7
+ @use "./variables" as *;
8
+
9
+ @mixin cx-legendentry($name: "legendentry", $besm: $cx-besm) {
10
+ $block: map.get($besm, block);
11
+ $element: map.get($besm, element);
12
+ $state: map.get($besm, state);
13
+
14
+ .#{$block}#{$name} {
15
+ display: inline-flex;
16
+ align-items: center;
17
+ padding: $cx-default-chart-legend-padding;
18
+ gap: $cx-default-chart-legend-entry-gap;
19
+ position: relative;
20
+ box-sizing: border-box;
21
+ cursor: pointer;
22
+ }
23
+
24
+ .#{$element}#{$name}-svg {
25
+ flex-shrink: 0;
26
+ }
27
+
28
+ .#{$element}#{$name}-shape {
29
+ fill: $cx-default-chart-shape-fill-color;
30
+ }
31
+ }
32
+
33
+ @if (cx-should-include("cx/charts/LegendEntry")) {
34
+ @include cx-legendentry();
35
+ }
@@ -1,28 +1,28 @@
1
- @use "sass:math";
2
- @use "sass:map";
3
- @use "../util/scss/besm.scss" as *;
4
- @use "../util/scss/include.scss" as *;
5
- @use "../util/scss/add-rules.scss" as *;
6
- @use "../util/scss/clockwise.scss" as *;
7
- @use "./variables" as *;
8
-
9
- @mixin cx-linegraph($name: "linegraph", $besm: $cx-besm) {
10
- $block: map.get($besm, block);
11
- $element: map.get($besm, element);
12
- $state: map.get($besm, state);
13
-
14
- .#{$element}#{$name}-line {
15
- stroke: $cx-default-chart-line-stroke-color;
16
- stroke-width: $cx-default-chart-line-stroke-width;
17
- fill: none !important;
18
- }
19
-
20
- .#{$element}#{$name}-area {
21
- stroke-width: 0;
22
- opacity: $cx-default-chart-area-opacity;
23
- }
24
- }
25
-
26
- @if (cx-should-include("cx/charts/LineGraph")) {
27
- @include cx-linegraph();
28
- }
1
+ @use "sass:math";
2
+ @use "sass:map";
3
+ @use "../util/scss/besm.scss" as *;
4
+ @use "../util/scss/include.scss" as *;
5
+ @use "../util/scss/add-rules.scss" as *;
6
+ @use "../util/scss/clockwise.scss" as *;
7
+ @use "./variables" as *;
8
+
9
+ @mixin cx-linegraph($name: "linegraph", $besm: $cx-besm) {
10
+ $block: map.get($besm, block);
11
+ $element: map.get($besm, element);
12
+ $state: map.get($besm, state);
13
+
14
+ .#{$element}#{$name}-line {
15
+ stroke: $cx-default-chart-line-stroke-color;
16
+ stroke-width: $cx-default-chart-line-stroke-width;
17
+ fill: none !important;
18
+ }
19
+
20
+ .#{$element}#{$name}-area {
21
+ stroke-width: 0;
22
+ opacity: $cx-default-chart-area-opacity;
23
+ }
24
+ }
25
+
26
+ @if (cx-should-include("cx/charts/LineGraph")) {
27
+ @include cx-linegraph();
28
+ }
@@ -1,136 +1,136 @@
1
- import { PointReducer, PointReducerConfig, PointReducerInstance, PointReducerAccumulator } from "./PointReducer";
2
- import { RenderingContext } from "../../ui/RenderingContext";
3
- import { NumberProp, Bind, Prop, DataRecord } from "../../ui/Prop";
4
- import { AccessorChain } from "../../data/createAccessorModelProxy";
5
-
6
- export interface SnapAccumulator extends PointReducerAccumulator {
7
- cursor: {
8
- x: number | null;
9
- y: number | null;
10
- mapped: boolean;
11
- mappedX?: number | null;
12
- mappedY?: number | null;
13
- };
14
- dist: number;
15
- snapX: any;
16
- snapY: any;
17
- snapRecord?: any;
18
- xAxis: any;
19
- yAxis: any;
20
- }
21
-
22
- export interface SnapPointFinderInstance extends PointReducerInstance<SnapAccumulator> {
23
- xAxis?: any;
24
- yAxis?: any;
25
- }
26
-
27
- export interface SnapPointFinderConfig extends PointReducerConfig {
28
- /** Cursor X value. */
29
- cursorX?: NumberProp;
30
-
31
- /** Cursor Y value */
32
- cursorY?: NumberProp;
33
-
34
- /** A binding used to receive the x value of the nearest point.*/
35
- snapX?: Bind | AccessorChain<number | null | undefined> | AccessorChain<string | null | undefined>;
36
-
37
- /** A binding used to receive the y value of the nearest point. */
38
- snapY?: Bind | AccessorChain<number | null | undefined> | AccessorChain<string | null | undefined>;
39
-
40
- /** A binding used to receive the record prop */
41
- snapRecord?: Prop<DataRecord>;
42
-
43
- /** Maximum distance between cursor and the snap point. Default value is 50. Adjust accordingly for large distances, e.g. set to Infinity when using TimeAxis */
44
- maxDistance?: number;
45
-
46
- /** A function used to convert x values into numeric format. Commonly used with dates. */
47
- convertX?: (value: number | string) => number;
48
-
49
- /** A function used to convert y values into numeric format. Commonly used with dates. */
50
- convertY?: (value: number | string) => number;
51
-
52
- /** Name of the x-axis. Default is 'x'. */
53
- xAxis?: string;
54
-
55
- /** Name of the y-axis. Default is 'y'. */
56
- yAxis?: string;
57
- }
58
-
59
- export class SnapPointFinder extends PointReducer<SnapAccumulator> {
60
- declare maxDistance: number;
61
- declare convertX: (value: any) => number;
62
- declare convertY: (value: any) => number;
63
- declare xAxis: string;
64
- declare yAxis: string;
65
-
66
- constructor(config?: SnapPointFinderConfig) {
67
- super(config);
68
- }
69
-
70
- declareData(...args: any[]) {
71
- super.declareData(...args, {
72
- cursorX: undefined,
73
- cursorY: undefined,
74
- snapX: undefined,
75
- snapY: undefined,
76
- snapRecord: undefined,
77
- maxDistance: undefined,
78
- });
79
- }
80
-
81
- explore(context: RenderingContext, instance: SnapPointFinderInstance) {
82
- instance.xAxis = (context.axes as any)?.[this.xAxis];
83
- instance.yAxis = (context.axes as any)?.[this.yAxis];
84
- super.explore(context, instance);
85
- }
86
-
87
- onInitAccumulator = (acc: SnapAccumulator, { data, xAxis, yAxis }: SnapPointFinderInstance) => {
88
- const d = data as any;
89
- acc.cursor = {
90
- x: d.cursorX,
91
- y: d.cursorY,
92
- mapped: false,
93
- };
94
- acc.dist = d.maxDistance > 0 ? Math.pow(d.maxDistance, 2) : Number.POSITIVE_INFINITY;
95
- acc.snapX = null;
96
- acc.snapY = null;
97
- acc.xAxis = xAxis;
98
- acc.yAxis = yAxis;
99
- };
100
-
101
- onMap = (acc: SnapAccumulator, x: any, y: any, name: string, p: any) => {
102
- let { xAxis, yAxis, cursor } = acc;
103
-
104
- if (!cursor.mapped) {
105
- cursor.mappedX = cursor.x != null ? xAxis?.map(this.convertX(cursor.x)) : null;
106
- cursor.mappedY = cursor.y != null ? yAxis?.map(this.convertY(cursor.y)) : null;
107
- cursor.mapped = true;
108
- }
109
-
110
- let d: number | null = null;
111
- let cx = x != null ? xAxis?.map(this.convertX(x)) : null;
112
- let cy = y != null ? yAxis?.map(this.convertY(y)) : null;
113
-
114
- if (cursor.mappedX != null && cx != null) d = (d || 0) + Math.pow(Math.abs(cx - cursor.mappedX), 2);
115
- if (cursor.mappedY != null && cy != null) d = (d || 0) + Math.pow(Math.abs(cy - cursor.mappedY), 2);
116
-
117
- if (d != null && d < acc.dist) {
118
- acc.dist = d;
119
- acc.snapX = x;
120
- acc.snapY = y;
121
- acc.snapRecord = p;
122
- }
123
- };
124
-
125
- onReduce = (acc: SnapAccumulator, instance: PointReducerInstance<SnapAccumulator>) => {
126
- instance.set("snapX", acc.snapX);
127
- instance.set("snapY", acc.snapY);
128
- instance.set("snapRecord", acc.snapRecord);
129
- };
130
- }
131
-
132
- SnapPointFinder.prototype.maxDistance = 50;
133
- SnapPointFinder.prototype.convertX = (x) => x;
134
- SnapPointFinder.prototype.convertY = (y) => y;
135
- SnapPointFinder.prototype.xAxis = "x";
136
- SnapPointFinder.prototype.yAxis = "y";
1
+ import { PointReducer, PointReducerConfig, PointReducerInstance, PointReducerAccumulator } from "./PointReducer";
2
+ import { RenderingContext } from "../../ui/RenderingContext";
3
+ import { NumberProp, Bind, Prop, DataRecord } from "../../ui/Prop";
4
+ import { AccessorChain } from "../../data/createAccessorModelProxy";
5
+
6
+ export interface SnapAccumulator extends PointReducerAccumulator {
7
+ cursor: {
8
+ x: number | null;
9
+ y: number | null;
10
+ mapped: boolean;
11
+ mappedX?: number | null;
12
+ mappedY?: number | null;
13
+ };
14
+ dist: number;
15
+ snapX: any;
16
+ snapY: any;
17
+ snapRecord?: any;
18
+ xAxis: any;
19
+ yAxis: any;
20
+ }
21
+
22
+ export interface SnapPointFinderInstance extends PointReducerInstance<SnapAccumulator> {
23
+ xAxis?: any;
24
+ yAxis?: any;
25
+ }
26
+
27
+ export interface SnapPointFinderConfig extends PointReducerConfig {
28
+ /** Cursor X value. */
29
+ cursorX?: NumberProp;
30
+
31
+ /** Cursor Y value */
32
+ cursorY?: NumberProp;
33
+
34
+ /** A binding used to receive the x value of the nearest point.*/
35
+ snapX?: Bind | AccessorChain<number | null | undefined> | AccessorChain<string | null | undefined>;
36
+
37
+ /** A binding used to receive the y value of the nearest point. */
38
+ snapY?: Bind | AccessorChain<number | null | undefined> | AccessorChain<string | null | undefined>;
39
+
40
+ /** A binding used to receive the record prop */
41
+ snapRecord?: Prop<DataRecord>;
42
+
43
+ /** Maximum distance between cursor and the snap point. Default value is 50. Adjust accordingly for large distances, e.g. set to Infinity when using TimeAxis */
44
+ maxDistance?: number;
45
+
46
+ /** A function used to convert x values into numeric format. Commonly used with dates. */
47
+ convertX?: (value: number | string) => number;
48
+
49
+ /** A function used to convert y values into numeric format. Commonly used with dates. */
50
+ convertY?: (value: number | string) => number;
51
+
52
+ /** Name of the x-axis. Default is 'x'. */
53
+ xAxis?: string;
54
+
55
+ /** Name of the y-axis. Default is 'y'. */
56
+ yAxis?: string;
57
+ }
58
+
59
+ export class SnapPointFinder extends PointReducer<SnapAccumulator> {
60
+ declare maxDistance: number;
61
+ declare convertX: (value: any) => number;
62
+ declare convertY: (value: any) => number;
63
+ declare xAxis: string;
64
+ declare yAxis: string;
65
+
66
+ constructor(config?: SnapPointFinderConfig) {
67
+ super(config);
68
+ }
69
+
70
+ declareData(...args: any[]) {
71
+ super.declareData(...args, {
72
+ cursorX: undefined,
73
+ cursorY: undefined,
74
+ snapX: undefined,
75
+ snapY: undefined,
76
+ snapRecord: undefined,
77
+ maxDistance: undefined,
78
+ });
79
+ }
80
+
81
+ explore(context: RenderingContext, instance: SnapPointFinderInstance) {
82
+ instance.xAxis = (context.axes as any)?.[this.xAxis];
83
+ instance.yAxis = (context.axes as any)?.[this.yAxis];
84
+ super.explore(context, instance);
85
+ }
86
+
87
+ onInitAccumulator = (acc: SnapAccumulator, { data, xAxis, yAxis }: SnapPointFinderInstance) => {
88
+ const d = data as any;
89
+ acc.cursor = {
90
+ x: d.cursorX,
91
+ y: d.cursorY,
92
+ mapped: false,
93
+ };
94
+ acc.dist = d.maxDistance > 0 ? Math.pow(d.maxDistance, 2) : Number.POSITIVE_INFINITY;
95
+ acc.snapX = null;
96
+ acc.snapY = null;
97
+ acc.xAxis = xAxis;
98
+ acc.yAxis = yAxis;
99
+ };
100
+
101
+ onMap = (acc: SnapAccumulator, x: any, y: any, name: string, p: any) => {
102
+ let { xAxis, yAxis, cursor } = acc;
103
+
104
+ if (!cursor.mapped) {
105
+ cursor.mappedX = cursor.x != null ? xAxis?.map(this.convertX(cursor.x)) : null;
106
+ cursor.mappedY = cursor.y != null ? yAxis?.map(this.convertY(cursor.y)) : null;
107
+ cursor.mapped = true;
108
+ }
109
+
110
+ let d: number | null = null;
111
+ let cx = x != null ? xAxis?.map(this.convertX(x)) : null;
112
+ let cy = y != null ? yAxis?.map(this.convertY(y)) : null;
113
+
114
+ if (cursor.mappedX != null && cx != null) d = (d || 0) + Math.pow(Math.abs(cx - cursor.mappedX), 2);
115
+ if (cursor.mappedY != null && cy != null) d = (d || 0) + Math.pow(Math.abs(cy - cursor.mappedY), 2);
116
+
117
+ if (d != null && d < acc.dist) {
118
+ acc.dist = d;
119
+ acc.snapX = x;
120
+ acc.snapY = y;
121
+ acc.snapRecord = p;
122
+ }
123
+ };
124
+
125
+ onReduce = (acc: SnapAccumulator, instance: PointReducerInstance<SnapAccumulator>) => {
126
+ instance.set("snapX", acc.snapX);
127
+ instance.set("snapY", acc.snapY);
128
+ instance.set("snapRecord", acc.snapRecord);
129
+ };
130
+ }
131
+
132
+ SnapPointFinder.prototype.maxDistance = 50;
133
+ SnapPointFinder.prototype.convertX = (x) => x;
134
+ SnapPointFinder.prototype.convertY = (y) => y;
135
+ SnapPointFinder.prototype.xAxis = "x";
136
+ SnapPointFinder.prototype.yAxis = "y";