cx 24.8.2 → 24.8.3

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.
@@ -1,295 +1,295 @@
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
- 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
-
193
- if (tooltip.alwaysVisible || tooltip.trackMouse || tooltip.trackMouseX || tooltip.trackMouseY) {
194
- tooltipInstance.init(new RenderingContext());
195
- tooltipInstance.data = tooltipInstance.dataSelector(store);
196
- }
197
- }
198
-
199
- return tooltipInstance;
200
- }
201
-
202
- function tooltipMouseMove(e, parentInstance, tooltip, options = {}) {
203
- let instance = getTooltipInstance(e, parentInstance, tooltip, options);
204
- if (!instance) return;
205
-
206
- if (isTouchEvent() && instance.widget.touchBehavior == "ignore") return false;
207
-
208
- let dirty = !shallowEquals(options.data, instance.store.data);
209
-
210
- instance.store.setData(options.data);
211
- instance.mouseOverTarget = true;
212
-
213
- if (!instance.dismissTooltip) {
214
- let canceled = false;
215
- let dismiss = () => {
216
- canceled = true;
217
- };
218
- let unsubscribeDismiss = instance.parent.subscribeOnDestroy(() => {
219
- dismiss();
220
- });
221
- instance.dismissTooltip = () => {
222
- unsubscribeDismiss();
223
- dismiss();
224
- };
225
- setTimeout(() => {
226
- let { relatedElement } = instance.widget;
227
- if (!canceled && instance.mouseOverTarget && relatedElement.ownerDocument.body.contains(relatedElement)) {
228
- dismiss = instance.widget.open(instance, {
229
- onPipeUpdate: (cb) => {
230
- instance.update = cb;
231
- },
232
- });
233
- }
234
- }, instance.widget.createDelay);
235
- } else {
236
- if (isTouchEvent() && instance.widget.touchBehavior == "toggle") {
237
- instance.dismissTooltip();
238
- instance.dismissTooltip = null;
239
- } else if (dirty && instance.update) instance.update();
240
- }
241
-
242
- if (instance.trackMouse && e && e.target) instance.trackMouse(e);
243
- }
244
-
245
- function tooltipMouseLeave(e, parentInstance, tooltip, options) {
246
- let instance = getTooltipInstance(e, parentInstance, tooltip, options);
247
- if (instance) {
248
- instance.mouseOverTarget = false;
249
- instance.widget.handleMouseLeavesParent(instance);
250
- }
251
- }
252
-
253
- function tooltipParentDidMount(element, parentInstance, tooltip, options) {
254
- if (tooltip && tooltip.alwaysVisible) {
255
- let instance = getTooltipInstance(element, parentInstance, tooltip, options);
256
- if (instance && instance.data.alwaysVisible) tooltipMouseMove(element, parentInstance, tooltip, options);
257
- }
258
- }
259
-
260
- function tooltipParentWillReceiveProps(element, parentInstance, tooltip, options) {
261
- let instance = getTooltipInstance(element, parentInstance, tooltip, options);
262
- if (instance && options) {
263
- instance.store.setData(options.data);
264
- if (instance.update) instance.update();
265
- if (instance.mouseOverTarget || (instance.data && instance.data.alwaysVisible))
266
- tooltipMouseMove(element, parentInstance, tooltip, options);
267
- }
268
- }
269
-
270
- function tooltipParentWillUnmount(parentInstance) {
271
- if (parentInstance.tooltips) {
272
- for (let name in parentInstance.tooltips) {
273
- let instance = parentInstance.tooltips[name];
274
- instance.mouseOverTarget = false;
275
- if (instance.dismissTooltip) parentInstance.tooltips[name].dismissTooltip();
276
- }
277
- }
278
- }
279
-
280
- function tooltipParentDidUpdate(element, parentInstance, tooltip) {
281
- let instance = getTooltipInstance(element, parentInstance, tooltip);
282
- if (instance && instance.tooltipComponent)
283
- instance.widget.updateDropdownPosition(instance, instance.tooltipComponent);
284
- }
285
-
286
- export function enableTooltips() {
287
- wireTooltipOps({
288
- tooltipMouseMove,
289
- tooltipMouseLeave,
290
- tooltipParentDidMount,
291
- tooltipParentWillReceiveProps,
292
- tooltipParentWillUnmount,
293
- tooltipParentDidUpdate,
294
- });
295
- }
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
+ 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
+
193
+ if (tooltip.alwaysVisible || tooltip.trackMouse || tooltip.trackMouseX || tooltip.trackMouseY) {
194
+ tooltipInstance.init(new RenderingContext());
195
+ tooltipInstance.data = tooltipInstance.dataSelector(store);
196
+ }
197
+ }
198
+
199
+ return tooltipInstance;
200
+ }
201
+
202
+ function tooltipMouseMove(e, parentInstance, tooltip, options = {}) {
203
+ let instance = getTooltipInstance(e, parentInstance, tooltip, options);
204
+ if (!instance) return;
205
+
206
+ if (isTouchEvent() && instance.widget.touchBehavior == "ignore") return false;
207
+
208
+ let dirty = !shallowEquals(options.data, instance.store.data);
209
+
210
+ instance.store.setData(options.data);
211
+ instance.mouseOverTarget = true;
212
+
213
+ if (!instance.dismissTooltip) {
214
+ let canceled = false;
215
+ let dismiss = () => {
216
+ canceled = true;
217
+ };
218
+ let unsubscribeDismiss = instance.parent.subscribeOnDestroy(() => {
219
+ dismiss();
220
+ });
221
+ instance.dismissTooltip = () => {
222
+ unsubscribeDismiss();
223
+ dismiss();
224
+ };
225
+ setTimeout(() => {
226
+ let { relatedElement } = instance.widget;
227
+ if (!canceled && instance.mouseOverTarget && relatedElement.ownerDocument.body.contains(relatedElement)) {
228
+ dismiss = instance.widget.open(instance, {
229
+ onPipeUpdate: (cb) => {
230
+ instance.update = cb;
231
+ },
232
+ });
233
+ }
234
+ }, instance.widget.createDelay);
235
+ } else {
236
+ if (isTouchEvent() && instance.widget.touchBehavior == "toggle") {
237
+ instance.dismissTooltip();
238
+ instance.dismissTooltip = null;
239
+ } else if (dirty && instance.update) instance.update();
240
+ }
241
+
242
+ if (instance.trackMouse && e && e.target) instance.trackMouse(e);
243
+ }
244
+
245
+ function tooltipMouseLeave(e, parentInstance, tooltip, options) {
246
+ let instance = getTooltipInstance(e, parentInstance, tooltip, options);
247
+ if (instance) {
248
+ instance.mouseOverTarget = false;
249
+ instance.widget.handleMouseLeavesParent(instance);
250
+ }
251
+ }
252
+
253
+ function tooltipParentDidMount(element, parentInstance, tooltip, options) {
254
+ if (tooltip && tooltip.alwaysVisible) {
255
+ let instance = getTooltipInstance(element, parentInstance, tooltip, options);
256
+ if (instance && instance.data.alwaysVisible) tooltipMouseMove(element, parentInstance, tooltip, options);
257
+ }
258
+ }
259
+
260
+ function tooltipParentWillReceiveProps(element, parentInstance, tooltip, options) {
261
+ let instance = getTooltipInstance(element, parentInstance, tooltip, options);
262
+ if (instance && options) {
263
+ instance.store.setData(options.data);
264
+ if (instance.update) instance.update();
265
+ if (instance.mouseOverTarget || (instance.data && instance.data.alwaysVisible))
266
+ tooltipMouseMove(element, parentInstance, tooltip, options);
267
+ }
268
+ }
269
+
270
+ function tooltipParentWillUnmount(parentInstance) {
271
+ if (parentInstance.tooltips) {
272
+ for (let name in parentInstance.tooltips) {
273
+ let instance = parentInstance.tooltips[name];
274
+ instance.mouseOverTarget = false;
275
+ if (instance.dismissTooltip) parentInstance.tooltips[name].dismissTooltip();
276
+ }
277
+ }
278
+ }
279
+
280
+ function tooltipParentDidUpdate(element, parentInstance, tooltip) {
281
+ let instance = getTooltipInstance(element, parentInstance, tooltip);
282
+ if (instance && instance.visible && instance.data.alwaysVisible && instance.tooltipComponent)
283
+ instance.widget.updateDropdownPosition(instance, instance.tooltipComponent);
284
+ }
285
+
286
+ export function enableTooltips() {
287
+ wireTooltipOps({
288
+ tooltipMouseMove,
289
+ tooltipMouseLeave,
290
+ tooltipParentDidMount,
291
+ tooltipParentWillReceiveProps,
292
+ tooltipParentWillUnmount,
293
+ tooltipParentDidUpdate,
294
+ });
295
+ }