cx 25.2.0 → 25.2.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.
Files changed (107) hide show
  1. package/dist/manifest.js +616 -616
  2. package/dist/widgets.js +8 -2
  3. package/package.json +32 -32
  4. package/src/charts/Legend.js +167 -167
  5. package/src/charts/Legend.scss +40 -40
  6. package/src/charts/LegendEntry.js +128 -128
  7. package/src/charts/LegendEntry.scss +27 -27
  8. package/src/charts/PieChart.d.ts +92 -92
  9. package/src/charts/PieChart.js +529 -529
  10. package/src/charts/axis/Axis.d.ts +113 -113
  11. package/src/charts/axis/Axis.js +280 -280
  12. package/src/charts/axis/CategoryAxis.d.ts +30 -30
  13. package/src/charts/axis/CategoryAxis.js +241 -241
  14. package/src/charts/axis/NumericAxis.js +351 -351
  15. package/src/charts/axis/Stack.js +55 -55
  16. package/src/charts/axis/TimeAxis.d.ts +28 -28
  17. package/src/charts/axis/TimeAxis.js +611 -611
  18. package/src/charts/helpers/PointReducer.js +47 -47
  19. package/src/charts/helpers/SnapPointFinder.js +69 -69
  20. package/src/data/Binding.spec.js +69 -69
  21. package/src/data/Expression.js +229 -229
  22. package/src/data/Expression.spec.js +229 -229
  23. package/src/data/StringTemplate.js +92 -92
  24. package/src/data/StringTemplate.spec.js +132 -132
  25. package/src/data/StructuredSelector.js +132 -132
  26. package/src/data/getAccessor.spec.js +11 -11
  27. package/src/data/getSelector.js +49 -49
  28. package/src/hooks/createLocalStorageRef.d.ts +3 -3
  29. package/src/hooks/createLocalStorageRef.js +20 -20
  30. package/src/index.scss +6 -6
  31. package/src/ui/Culture.d.ts +57 -57
  32. package/src/ui/Culture.js +139 -139
  33. package/src/ui/FocusManager.js +171 -171
  34. package/src/ui/Format.js +108 -108
  35. package/src/ui/HoverSync.js +147 -147
  36. package/src/ui/Instance.d.ts +72 -72
  37. package/src/ui/Instance.js +614 -614
  38. package/src/ui/Repeater.d.ts +61 -61
  39. package/src/ui/index.d.ts +42 -42
  40. package/src/ui/layout/ContentPlaceholder.d.ts +19 -19
  41. package/src/ui/layout/ContentPlaceholder.js +105 -105
  42. package/src/ui/layout/ContentPlaceholder.spec.js +579 -579
  43. package/src/ui/layout/LabelsTopLayout.js +134 -134
  44. package/src/util/Format.js +270 -270
  45. package/src/util/date/encodeDate.d.ts +1 -1
  46. package/src/util/date/encodeDate.js +8 -8
  47. package/src/util/date/encodeDateWithTimezoneOffset.d.ts +1 -1
  48. package/src/util/date/index.d.ts +11 -11
  49. package/src/util/date/index.js +11 -11
  50. package/src/util/date/parseDateInvariant.d.ts +3 -3
  51. package/src/util/date/parseDateInvariant.js +20 -20
  52. package/src/util/getSearchQueryPredicate.js +59 -59
  53. package/src/util/index.d.ts +51 -51
  54. package/src/util/index.js +54 -54
  55. package/src/util/isValidIdentifierName.d.ts +1 -1
  56. package/src/util/isValidIdentifierName.js +5 -5
  57. package/src/util/isValidIdentifierName.spec.js +33 -33
  58. package/src/util/scss/add-rules.scss +38 -38
  59. package/src/widgets/CxCredit.scss +37 -37
  60. package/src/widgets/HighlightedSearchText.js +36 -36
  61. package/src/widgets/HighlightedSearchText.scss +18 -18
  62. package/src/widgets/List.scss +91 -91
  63. package/src/widgets/drag-drop/DropZone.js +214 -214
  64. package/src/widgets/form/Calendar.js +618 -618
  65. package/src/widgets/form/Calendar.scss +196 -196
  66. package/src/widgets/form/Checkbox.scss +127 -127
  67. package/src/widgets/form/ColorField.js +397 -397
  68. package/src/widgets/form/ColorField.scss +96 -96
  69. package/src/widgets/form/ColorPicker.scss +283 -283
  70. package/src/widgets/form/DateTimeField.js +576 -576
  71. package/src/widgets/form/DateTimePicker.js +392 -392
  72. package/src/widgets/form/LookupField.d.ts +179 -179
  73. package/src/widgets/form/LookupField.scss +219 -219
  74. package/src/widgets/form/MonthField.d.ts +99 -99
  75. package/src/widgets/form/MonthField.js +523 -523
  76. package/src/widgets/form/MonthPicker.d.ts +76 -76
  77. package/src/widgets/form/MonthPicker.js +641 -641
  78. package/src/widgets/form/MonthPicker.scss +118 -118
  79. package/src/widgets/form/NumberField.js +459 -459
  80. package/src/widgets/form/NumberField.scss +61 -61
  81. package/src/widgets/form/Radio.scss +121 -121
  82. package/src/widgets/form/Select.scss +99 -99
  83. package/src/widgets/form/Slider.scss +118 -118
  84. package/src/widgets/form/Switch.scss +140 -140
  85. package/src/widgets/form/TextArea.scss +43 -43
  86. package/src/widgets/form/TextField.js +290 -290
  87. package/src/widgets/form/TextField.scss +55 -55
  88. package/src/widgets/form/UploadButton.d.ts +34 -34
  89. package/src/widgets/form/variables.scss +353 -353
  90. package/src/widgets/grid/Grid.d.ts +442 -442
  91. package/src/widgets/grid/Grid.js +3414 -3414
  92. package/src/widgets/grid/GridRow.js +228 -228
  93. package/src/widgets/grid/TreeNode.d.ts +23 -23
  94. package/src/widgets/grid/TreeNode.scss +88 -88
  95. package/src/widgets/grid/variables.scss +133 -133
  96. package/src/widgets/nav/Menu.scss +74 -74
  97. package/src/widgets/overlay/Dropdown.js +612 -612
  98. package/src/widgets/overlay/FlyweightTooltipTracker.js +39 -39
  99. package/src/widgets/overlay/Overlay.d.ts +73 -73
  100. package/src/widgets/overlay/Tooltip.js +308 -303
  101. package/src/widgets/overlay/Window.js +202 -202
  102. package/src/widgets/overlay/captureMouse.js +124 -124
  103. package/src/widgets/overlay/createHotPromiseWindowFactory.d.ts +18 -18
  104. package/src/widgets/overlay/createHotPromiseWindowFactory.js +56 -56
  105. package/src/widgets/overlay/index.d.ts +11 -11
  106. package/src/widgets/overlay/index.js +11 -11
  107. package/src/widgets/variables.scss +144 -144
@@ -1,303 +1,308 @@
1
- import { Widget, VDOM } from "../../ui/Widget";
2
- import { Dropdown } from "./Dropdown";
3
- import { debug, tooltipsFlag } from "../../util/Debug";
4
- import { isNonEmptyArray } from "../../util/isNonEmptyArray";
5
- import { ReadOnlyDataView } from "../../data/ReadOnlyDataView";
6
- import { isTouchEvent } from "../../util/isTouchEvent";
7
- import { shallowEquals } from "../../util/shallowEquals";
8
- import { isSelector } from "../../data/isSelector";
9
- import { wireTooltipOps } from "./tooltip-ops";
10
- import { getCursorPos } from "./captureMouse";
11
- import { RenderingContext } from "../../ui/RenderingContext";
12
-
13
- export class Tooltip extends Dropdown {
14
- declareData() {
15
- super.declareData(...arguments, {
16
- text: undefined,
17
- title: undefined,
18
- alwaysVisible: undefined,
19
- });
20
- }
21
-
22
- prepareData(context, instance) {
23
- let { data } = instance;
24
- data.stateMods = {
25
- ...data.stateMods,
26
- "mouse-trap": this.mouseTrap,
27
- };
28
- super.prepareData(context, instance);
29
- }
30
-
31
- renderContents(context, instance) {
32
- let { data } = instance;
33
- let { CSS, baseClass } = this;
34
- return [
35
- data.title && (
36
- <div key="title" className={CSS.element(baseClass, "title")}>
37
- {data.title}
38
- </div>
39
- ),
40
- data.text,
41
- ...super.renderContents(context, instance),
42
- ];
43
- }
44
-
45
- initInstance(context, instance) {
46
- super.initInstance(context, instance);
47
-
48
- if (this.trackMouseX || this.trackMouseY) {
49
- instance.trackMouse = (e) => {
50
- let pos = getCursorPos(e);
51
- instance.mousePosition = {
52
- x: pos.clientX,
53
- y: pos.clientY,
54
- };
55
- if (instance.tooltipComponent) this.updateDropdownPosition(instance, instance.tooltipComponent);
56
- };
57
- }
58
- }
59
-
60
- overlayDidMount(instance, component) {
61
- instance.tooltipComponent = component;
62
-
63
- super.overlayDidMount(instance, component);
64
-
65
- instance.parentValidityCheckTimer = setInterval(() => {
66
- if (!this.relatedElement.ownerDocument.body.contains(this.relatedElement)) {
67
- if (instance.dismissTooltip) {
68
- instance.dismissTooltip();
69
- instance.dismissTooltip = null;
70
- }
71
- } else {
72
- if (instance.tooltipComponent) this.updateDropdownPosition(instance, instance.tooltipComponent);
73
- }
74
- }, 500);
75
-
76
- if (instance.widget.globalMouseTracking && instance.trackMouse) {
77
- document.addEventListener("mousemove", instance.trackMouse);
78
- }
79
- }
80
-
81
- overlayWillUnmount(instance, component) {
82
- clearInterval(instance.parentValidityCheckTimer);
83
- super.overlayWillUnmount(instance, component);
84
- instance.tooltipComponent = null;
85
-
86
- if (instance.widget.globalMouseTracking && instance.trackMouse) {
87
- document.removeEventListener("mousemove", instance.trackMouse);
88
- }
89
- }
90
-
91
- handleMouseEnter(instance, component) {
92
- instance.mouseOverTooltip = true;
93
- super.handleMouseEnter(instance, component);
94
- }
95
-
96
- handleMouseLeave(instance, component) {
97
- instance.mouseOverTooltip = false;
98
- if (this.mouseTrap) this.handleMouseLeavesParent(instance);
99
- super.handleMouseLeave(instance, component);
100
- }
101
-
102
- handleMouseLeavesParent(instance) {
103
- let timeout = this.mouseTrap ? 200 : 0;
104
- setTimeout(() => {
105
- if (!instance.mouseOverTarget && !(this.mouseTrap && instance.mouseOverTooltip)) this.dismissTooltip(instance);
106
- }, timeout);
107
- }
108
-
109
- dismissTooltip(instance) {
110
- if (!instance || !instance.dismissTooltip) return;
111
- if (
112
- instance.data &&
113
- instance.data.alwaysVisible &&
114
- this.relatedElement.ownerDocument.body.contains(this.relatedElement)
115
- )
116
- return;
117
- instance.dismissTooltip();
118
- instance.dismissTooltip = null;
119
- }
120
-
121
- dismissAfterScroll(data, instance) {
122
- this.dismissTooltip(instance);
123
- }
124
-
125
- checkVisible(context, instance, data) {
126
- if (!isNonEmptyArray(this.items) && !data.title && !data.text) return false;
127
- return super.checkVisible(context, instance, data);
128
- }
129
- }
130
-
131
- Widget.alias("tooltip", Tooltip);
132
-
133
- Tooltip.prototype.baseClass = "tooltip";
134
- Tooltip.prototype.offset = 8;
135
- Tooltip.prototype.placementOrder =
136
- "right up down left up-right up-left right-up right-down down-right down-left left-up left-down";
137
- Tooltip.prototype.animate = true;
138
- Tooltip.prototype.destroyDelay = 300;
139
- Tooltip.prototype.createDelay = 200;
140
- Tooltip.prototype.matchWidth = false;
141
- Tooltip.prototype.trackMouse = false;
142
- Tooltip.prototype.trackMouseX = false;
143
- Tooltip.prototype.trackMouseY = false;
144
- Tooltip.prototype.touchFriendly = false; //rename to positioningMode
145
- Tooltip.prototype.touchBehavior = "toggle";
146
- Tooltip.prototype.arrow = true;
147
- Tooltip.prototype.alwaysVisible = false;
148
- Tooltip.prototype.globalMouseTracking = false;
149
-
150
- export function getTooltipInstance(e, parentInstance, tooltip, options = {}) {
151
- let target = options.target || (e && e.currentTarget) || e;
152
-
153
- debug(tooltipsFlag, "mouse-move", target, parentInstance);
154
-
155
- let name = options.tooltipName || "tooltip";
156
-
157
- if (!parentInstance.tooltips) parentInstance.tooltips = {};
158
- let tooltipInstance = parentInstance.tooltips[name];
159
-
160
- //no tooltips on disabled elements
161
- if (parentInstance?.data.disabled) {
162
- if (tooltipInstance && tooltipInstance.dismissTooltip) tooltipInstance.dismissTooltip();
163
- return;
164
- }
165
-
166
- if (
167
- tooltipInstance &&
168
- (tooltipInstance.widget.relatedElement != target ||
169
- !shallowEquals(tooltipInstance.config, tooltip) ||
170
- tooltipInstance.store.store != parentInstance.store)
171
- ) {
172
- if (tooltipInstance.dismissTooltip) tooltipInstance.dismissTooltip();
173
- delete parentInstance.tooltips[name];
174
- tooltipInstance = null;
175
- }
176
-
177
- if (!tooltip || !target) return;
178
-
179
- if (!tooltipInstance) {
180
- let config = tooltip;
181
- if (isSelector(tooltip)) {
182
- config = {
183
- text: tooltip,
184
- };
185
- }
186
- let tooltipWidget = Tooltip.create({ relatedElement: target }, config);
187
- let store = new ReadOnlyDataView({
188
- store: parentInstance.store,
189
- });
190
- tooltipInstance = parentInstance.tooltips[name] = parentInstance.getDetachedChild(tooltipWidget, name, store);
191
- tooltipInstance.config = tooltip;
192
- tooltipInstance.tooltipName = name;
193
-
194
- if (tooltip.alwaysVisible || tooltip.trackMouse || tooltip.trackMouseX || tooltip.trackMouseY) {
195
- tooltipInstance.init(new RenderingContext());
196
- tooltipInstance.data = tooltipInstance.dataSelector(store);
197
- }
198
- }
199
-
200
- return tooltipInstance;
201
- }
202
-
203
- function tooltipMouseMove(e, parentInstance, tooltip, options = {}) {
204
- let instance = getTooltipInstance(e, parentInstance, tooltip, options);
205
- if (!instance) return;
206
-
207
- if (isTouchEvent() && instance.widget.touchBehavior == "ignore") return false;
208
-
209
- let dirty = !shallowEquals(options.data, instance.store.data);
210
-
211
- instance.store.setData(options.data);
212
- instance.mouseOverTarget = true;
213
-
214
- if (!instance.dismissTooltip) {
215
- let canceled = false;
216
- let dismiss = () => {
217
- canceled = true;
218
- };
219
- let unsubscribeDismiss = instance.parent.subscribeOnDestroy(() => {
220
- dismiss();
221
- });
222
- instance.dismissTooltip = () => {
223
- if (instance.parent.tooltips[instance.tooltipName] === instance)
224
- delete instance.parent.tooltips[instance.tooltipName];
225
- unsubscribeDismiss();
226
- dismiss();
227
- instance.dismissTooltip = null;
228
- };
229
- setTimeout(() => {
230
- let { relatedElement } = instance.widget;
231
- if (!canceled && instance.mouseOverTarget && relatedElement.ownerDocument.body.contains(relatedElement)) {
232
- dismiss = instance.widget.open(instance, {
233
- onPipeUpdate: (cb) => {
234
- instance.update = cb;
235
- },
236
- });
237
- } else {
238
- instance.dismissTooltip = null;
239
- }
240
- }, instance.widget.createDelay);
241
- } else {
242
- if (isTouchEvent() && instance.widget.touchBehavior == "toggle") {
243
- instance.dismissTooltip();
244
- instance.dismissTooltip = null;
245
- } else if (dirty && instance.update) instance.update();
246
- }
247
-
248
- if (instance.trackMouse && e && e.target) instance.trackMouse(e);
249
- }
250
-
251
- function tooltipMouseLeave(e, parentInstance, tooltip, options) {
252
- let instance = getTooltipInstance(e, parentInstance, tooltip, options);
253
-
254
- // do not process leave events twice even if called multiple times
255
- if (instance && instance.mouseOverTarget) {
256
- instance.mouseOverTarget = false;
257
- instance.widget.handleMouseLeavesParent(instance);
258
- }
259
- }
260
-
261
- function tooltipParentDidMount(element, parentInstance, tooltip, options) {
262
- if (tooltip && tooltip.alwaysVisible) {
263
- let instance = getTooltipInstance(element, parentInstance, tooltip, options);
264
- if (instance && instance.data.alwaysVisible) tooltipMouseMove(element, parentInstance, tooltip, options);
265
- }
266
- }
267
-
268
- function tooltipParentWillReceiveProps(element, parentInstance, tooltip, options) {
269
- let instance = getTooltipInstance(element, parentInstance, tooltip, options);
270
- if (instance && options) {
271
- instance.store.setData(options.data);
272
- if (instance.update) instance.update();
273
- if (instance.mouseOverTarget || (instance.data && instance.data.alwaysVisible))
274
- tooltipMouseMove(element, parentInstance, tooltip, options);
275
- }
276
- }
277
-
278
- function tooltipParentWillUnmount(parentInstance) {
279
- if (parentInstance.tooltips) {
280
- for (let name in parentInstance.tooltips) {
281
- let instance = parentInstance.tooltips[name];
282
- instance.mouseOverTarget = false;
283
- if (instance.dismissTooltip) parentInstance.tooltips[name].dismissTooltip();
284
- }
285
- }
286
- }
287
-
288
- function tooltipParentDidUpdate(element, parentInstance, tooltip) {
289
- let instance = getTooltipInstance(element, parentInstance, tooltip);
290
- if (instance && instance.visible && instance.data?.alwaysVisible && instance.tooltipComponent)
291
- instance.widget.updateDropdownPosition(instance, instance.tooltipComponent);
292
- }
293
-
294
- export function enableTooltips() {
295
- wireTooltipOps({
296
- tooltipMouseMove,
297
- tooltipMouseLeave,
298
- tooltipParentDidMount,
299
- tooltipParentWillReceiveProps,
300
- tooltipParentWillUnmount,
301
- tooltipParentDidUpdate,
302
- });
303
- }
1
+ import { Widget, VDOM } from "../../ui/Widget";
2
+ import { Dropdown } from "./Dropdown";
3
+ import { debug, tooltipsFlag } from "../../util/Debug";
4
+ import { isNonEmptyArray } from "../../util/isNonEmptyArray";
5
+ import { ReadOnlyDataView } from "../../data/ReadOnlyDataView";
6
+ import { isTouchEvent } from "../../util/isTouchEvent";
7
+ import { shallowEquals } from "../../util/shallowEquals";
8
+ import { isSelector } from "../../data/isSelector";
9
+ import { wireTooltipOps } from "./tooltip-ops";
10
+ import { getCursorPos } from "./captureMouse";
11
+ import { RenderingContext } from "../../ui/RenderingContext";
12
+
13
+ export class Tooltip extends Dropdown {
14
+ declareData() {
15
+ super.declareData(...arguments, {
16
+ text: undefined,
17
+ title: undefined,
18
+ alwaysVisible: undefined,
19
+ });
20
+ }
21
+
22
+ prepareData(context, instance) {
23
+ let { data } = instance;
24
+ data.stateMods = {
25
+ ...data.stateMods,
26
+ "mouse-trap": this.mouseTrap,
27
+ };
28
+ super.prepareData(context, instance);
29
+ }
30
+
31
+ renderContents(context, instance) {
32
+ let { data } = instance;
33
+ let { CSS, baseClass } = this;
34
+ return [
35
+ data.title && (
36
+ <div key="title" className={CSS.element(baseClass, "title")}>
37
+ {data.title}
38
+ </div>
39
+ ),
40
+ data.text,
41
+ ...super.renderContents(context, instance),
42
+ ];
43
+ }
44
+
45
+ initInstance(context, instance) {
46
+ super.initInstance(context, instance);
47
+
48
+ if (this.trackMouseX || this.trackMouseY) {
49
+ instance.trackMouse = (e) => {
50
+ let pos = getCursorPos(e);
51
+ instance.mousePosition = {
52
+ x: pos.clientX,
53
+ y: pos.clientY,
54
+ };
55
+ if (instance.tooltipComponent) this.updateDropdownPosition(instance, instance.tooltipComponent);
56
+ };
57
+ }
58
+ }
59
+
60
+ overlayDidMount(instance, component) {
61
+ instance.tooltipComponent = component;
62
+
63
+ super.overlayDidMount(instance, component);
64
+
65
+ instance.parentValidityCheckTimer = setInterval(() => {
66
+ if (!this.relatedElement.ownerDocument.body.contains(this.relatedElement)) {
67
+ if (instance.dismissTooltip) {
68
+ instance.dismissTooltip();
69
+ instance.dismissTooltip = null;
70
+ }
71
+ } else {
72
+ if (instance.tooltipComponent) this.updateDropdownPosition(instance, instance.tooltipComponent);
73
+ }
74
+ }, 500);
75
+
76
+ if (instance.widget.globalMouseTracking && instance.trackMouse) {
77
+ document.addEventListener("mousemove", instance.trackMouse);
78
+ }
79
+ }
80
+
81
+ overlayWillUnmount(instance, component) {
82
+ clearInterval(instance.parentValidityCheckTimer);
83
+ super.overlayWillUnmount(instance, component);
84
+ instance.tooltipComponent = null;
85
+
86
+ if (instance.widget.globalMouseTracking && instance.trackMouse) {
87
+ document.removeEventListener("mousemove", instance.trackMouse);
88
+ }
89
+ }
90
+
91
+ handleMouseEnter(instance, component) {
92
+ instance.mouseOverTooltip = true;
93
+ super.handleMouseEnter(instance, component);
94
+ }
95
+
96
+ handleMouseLeave(instance, component) {
97
+ instance.mouseOverTooltip = false;
98
+ if (this.mouseTrap) this.handleMouseLeavesParent(instance);
99
+ super.handleMouseLeave(instance, component);
100
+ }
101
+
102
+ handleMouseLeavesParent(instance) {
103
+ let timeout = this.mouseTrap ? 200 : 0;
104
+ setTimeout(() => {
105
+ if (!instance.mouseOverTarget && !(this.mouseTrap && instance.mouseOverTooltip)) this.dismissTooltip(instance);
106
+ }, timeout);
107
+ }
108
+
109
+ dismissTooltip(instance) {
110
+ if (!instance || !instance.dismissTooltip) return;
111
+ if (
112
+ instance.data &&
113
+ instance.data.alwaysVisible &&
114
+ this.relatedElement.ownerDocument.body.contains(this.relatedElement)
115
+ )
116
+ return;
117
+ instance.dismissTooltip();
118
+ instance.dismissTooltip = null;
119
+ }
120
+
121
+ dismissAfterScroll(data, instance) {
122
+ this.dismissTooltip(instance);
123
+ }
124
+
125
+ checkVisible(context, instance, data) {
126
+ if (!isNonEmptyArray(this.items) && !data.title && !data.text) return false;
127
+ return super.checkVisible(context, instance, data);
128
+ }
129
+ }
130
+
131
+ Widget.alias("tooltip", Tooltip);
132
+
133
+ Tooltip.prototype.baseClass = "tooltip";
134
+ Tooltip.prototype.offset = 8;
135
+ Tooltip.prototype.placementOrder =
136
+ "right up down left up-right up-left right-up right-down down-right down-left left-up left-down";
137
+ Tooltip.prototype.animate = true;
138
+ Tooltip.prototype.destroyDelay = 300;
139
+ Tooltip.prototype.createDelay = 200;
140
+ Tooltip.prototype.matchWidth = false;
141
+ Tooltip.prototype.trackMouse = false;
142
+ Tooltip.prototype.trackMouseX = false;
143
+ Tooltip.prototype.trackMouseY = false;
144
+ Tooltip.prototype.touchFriendly = false; //rename to positioningMode
145
+ Tooltip.prototype.touchBehavior = "toggle";
146
+ Tooltip.prototype.arrow = true;
147
+ Tooltip.prototype.alwaysVisible = false;
148
+ Tooltip.prototype.globalMouseTracking = false;
149
+
150
+ export function getTooltipInstance(e, parentInstance, tooltip, options = {}) {
151
+ let target = options.target || (e && e.currentTarget) || e;
152
+
153
+ debug(tooltipsFlag, "mouse-move", target, parentInstance);
154
+
155
+ let name = options.tooltipName || "tooltip";
156
+
157
+ if (!parentInstance.tooltips) parentInstance.tooltips = {};
158
+ let tooltipInstance = parentInstance.tooltips[name];
159
+
160
+ //no tooltips on disabled elements
161
+ if (parentInstance?.data.disabled) {
162
+ if (tooltipInstance && tooltipInstance.dismissTooltip) tooltipInstance.dismissTooltip();
163
+ return;
164
+ }
165
+
166
+ if (
167
+ tooltipInstance &&
168
+ (tooltipInstance.widget.relatedElement != target ||
169
+ !shallowEquals(tooltipInstance.config, tooltip) ||
170
+ tooltipInstance.store.store != parentInstance.store)
171
+ ) {
172
+ if (tooltipInstance.dismissTooltip) tooltipInstance.dismissTooltip();
173
+ delete parentInstance.tooltips[name];
174
+ tooltipInstance = null;
175
+ }
176
+
177
+ if (!tooltip || !target) return;
178
+
179
+ if (!tooltipInstance) {
180
+ let config = tooltip;
181
+ if (isSelector(tooltip)) {
182
+ config = {
183
+ text: tooltip,
184
+ };
185
+ }
186
+ let tooltipWidget = Tooltip.create({ relatedElement: target }, config);
187
+ let store = new ReadOnlyDataView({
188
+ store: parentInstance.store,
189
+ });
190
+ tooltipInstance = parentInstance.tooltips[name] = parentInstance.getDetachedChild(tooltipWidget, name, store);
191
+ tooltipInstance.config = tooltip;
192
+ tooltipInstance.tooltipName = name;
193
+
194
+ if (tooltip.alwaysVisible || tooltip.trackMouse || tooltip.trackMouseX || tooltip.trackMouseY) {
195
+ tooltipInstance.init(new RenderingContext());
196
+ tooltipInstance.data = tooltipInstance.dataSelector(store);
197
+ }
198
+ }
199
+
200
+ return tooltipInstance;
201
+ }
202
+
203
+ function tooltipMouseMove(e, parentInstance, tooltip, options = {}) {
204
+ let instance = getTooltipInstance(e, parentInstance, tooltip, options);
205
+ if (!instance) return;
206
+
207
+ if (isTouchEvent() && instance.widget.touchBehavior == "ignore") return false;
208
+
209
+ let dirty = !shallowEquals(options.data, instance.store.data);
210
+
211
+ instance.store.setData(options.data);
212
+ instance.mouseOverTarget = true;
213
+
214
+ if (!instance.dismissTooltip) {
215
+ let canceled = false;
216
+ let dismiss = () => {
217
+ canceled = true;
218
+ };
219
+ let unsubscribeDismiss = instance.parent.subscribeOnDestroy(() => {
220
+ dismiss();
221
+ });
222
+ instance.dismissTooltip = () => {
223
+ if (instance.parent.tooltips[instance.tooltipName] === instance)
224
+ delete instance.parent.tooltips[instance.tooltipName];
225
+ unsubscribeDismiss();
226
+ dismiss();
227
+ instance.dismissTooltip = null;
228
+ };
229
+ instance.lastClickTime = Date.now();
230
+ setTimeout(() => {
231
+ let { relatedElement } = instance.widget;
232
+ if (!canceled && instance.mouseOverTarget && relatedElement.ownerDocument.body.contains(relatedElement)) {
233
+ dismiss = instance.widget.open(instance, {
234
+ onPipeUpdate: (cb) => {
235
+ instance.update = cb;
236
+ },
237
+ });
238
+ } else {
239
+ instance.dismissTooltip = null;
240
+ }
241
+ }, instance.widget.createDelay);
242
+ } else {
243
+ if (isTouchEvent() && instance.widget.touchBehavior == "toggle") {
244
+ // ios fires mousemove events after touchend
245
+ if (Date.now() - (instance.lastClickTime ?? 0) > 50) {
246
+ instance.lastClickTime = Date.now();
247
+ instance.dismissTooltip();
248
+ instance.dismissTooltip = null;
249
+ }
250
+ } else if (dirty && instance.update) instance.update();
251
+ }
252
+
253
+ if (instance.trackMouse && e && e.target) instance.trackMouse(e);
254
+ }
255
+
256
+ function tooltipMouseLeave(e, parentInstance, tooltip, options) {
257
+ let instance = getTooltipInstance(e, parentInstance, tooltip, options);
258
+
259
+ // do not process leave events twice even if called multiple times
260
+ if (instance && instance.mouseOverTarget) {
261
+ instance.mouseOverTarget = false;
262
+ instance.widget.handleMouseLeavesParent(instance);
263
+ }
264
+ }
265
+
266
+ function tooltipParentDidMount(element, parentInstance, tooltip, options) {
267
+ if (tooltip && tooltip.alwaysVisible) {
268
+ let instance = getTooltipInstance(element, parentInstance, tooltip, options);
269
+ if (instance && instance.data.alwaysVisible) tooltipMouseMove(element, parentInstance, tooltip, options);
270
+ }
271
+ }
272
+
273
+ function tooltipParentWillReceiveProps(element, parentInstance, tooltip, options) {
274
+ let instance = getTooltipInstance(element, parentInstance, tooltip, options);
275
+ if (instance && options) {
276
+ instance.store.setData(options.data);
277
+ if (instance.update) instance.update();
278
+ if (instance.mouseOverTarget || (instance.data && instance.data.alwaysVisible))
279
+ tooltipMouseMove(element, parentInstance, tooltip, options);
280
+ }
281
+ }
282
+
283
+ function tooltipParentWillUnmount(parentInstance) {
284
+ if (parentInstance.tooltips) {
285
+ for (let name in parentInstance.tooltips) {
286
+ let instance = parentInstance.tooltips[name];
287
+ instance.mouseOverTarget = false;
288
+ if (instance.dismissTooltip) parentInstance.tooltips[name].dismissTooltip();
289
+ }
290
+ }
291
+ }
292
+
293
+ function tooltipParentDidUpdate(element, parentInstance, tooltip) {
294
+ let instance = getTooltipInstance(element, parentInstance, tooltip);
295
+ if (instance && instance.visible && instance.data?.alwaysVisible && instance.tooltipComponent)
296
+ instance.widget.updateDropdownPosition(instance, instance.tooltipComponent);
297
+ }
298
+
299
+ export function enableTooltips() {
300
+ wireTooltipOps({
301
+ tooltipMouseMove,
302
+ tooltipMouseLeave,
303
+ tooltipParentDidMount,
304
+ tooltipParentWillReceiveProps,
305
+ tooltipParentWillUnmount,
306
+ tooltipParentDidUpdate,
307
+ });
308
+ }