cx 25.1.2 → 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 (109) hide show
  1. package/dist/data.js +3 -3
  2. package/dist/manifest.js +747 -747
  3. package/dist/widgets.js +8 -2
  4. package/package.json +32 -32
  5. package/src/charts/Legend.js +167 -167
  6. package/src/charts/Legend.scss +40 -40
  7. package/src/charts/LegendEntry.js +128 -128
  8. package/src/charts/LegendEntry.scss +27 -27
  9. package/src/charts/PieChart.d.ts +92 -92
  10. package/src/charts/PieChart.js +529 -529
  11. package/src/charts/axis/Axis.d.ts +113 -113
  12. package/src/charts/axis/Axis.js +280 -280
  13. package/src/charts/axis/CategoryAxis.d.ts +30 -30
  14. package/src/charts/axis/CategoryAxis.js +241 -241
  15. package/src/charts/axis/NumericAxis.js +351 -351
  16. package/src/charts/axis/Stack.js +55 -55
  17. package/src/charts/axis/TimeAxis.d.ts +28 -28
  18. package/src/charts/axis/TimeAxis.js +611 -611
  19. package/src/charts/helpers/PointReducer.js +47 -47
  20. package/src/charts/helpers/SnapPointFinder.js +69 -69
  21. package/src/data/Binding.spec.js +69 -69
  22. package/src/data/Expression.js +229 -229
  23. package/src/data/Expression.spec.js +229 -229
  24. package/src/data/StringTemplate.js +92 -92
  25. package/src/data/StringTemplate.spec.js +132 -127
  26. package/src/data/StructuredSelector.js +2 -1
  27. package/src/data/getAccessor.spec.js +11 -11
  28. package/src/data/getSelector.js +2 -1
  29. package/src/hooks/createLocalStorageRef.d.ts +3 -3
  30. package/src/hooks/createLocalStorageRef.js +20 -20
  31. package/src/index.scss +6 -6
  32. package/src/ui/Culture.d.ts +57 -57
  33. package/src/ui/Culture.js +139 -139
  34. package/src/ui/FocusManager.js +171 -171
  35. package/src/ui/Format.js +108 -108
  36. package/src/ui/HoverSync.js +147 -147
  37. package/src/ui/Instance.d.ts +72 -72
  38. package/src/ui/Instance.js +614 -614
  39. package/src/ui/Repeater.d.ts +61 -61
  40. package/src/ui/index.d.ts +42 -42
  41. package/src/ui/layout/ContentPlaceholder.d.ts +19 -19
  42. package/src/ui/layout/ContentPlaceholder.js +105 -105
  43. package/src/ui/layout/ContentPlaceholder.spec.js +579 -579
  44. package/src/ui/layout/LabelsTopLayout.js +134 -134
  45. package/src/util/Format.js +270 -270
  46. package/src/util/date/encodeDate.d.ts +1 -1
  47. package/src/util/date/encodeDate.js +8 -8
  48. package/src/util/date/encodeDateWithTimezoneOffset.d.ts +1 -1
  49. package/src/util/date/index.d.ts +11 -11
  50. package/src/util/date/index.js +11 -11
  51. package/src/util/date/parseDateInvariant.d.ts +3 -3
  52. package/src/util/date/parseDateInvariant.js +20 -20
  53. package/src/util/getSearchQueryPredicate.js +59 -59
  54. package/src/util/index.d.ts +51 -51
  55. package/src/util/index.js +54 -54
  56. package/src/util/isValidIdentifierName.d.ts +1 -1
  57. package/src/util/isValidIdentifierName.js +5 -5
  58. package/src/util/isValidIdentifierName.spec.js +33 -33
  59. package/src/util/scss/add-rules.scss +38 -38
  60. package/src/widgets/CxCredit.scss +37 -37
  61. package/src/widgets/HighlightedSearchText.js +36 -36
  62. package/src/widgets/HighlightedSearchText.scss +18 -18
  63. package/src/widgets/List.scss +91 -91
  64. package/src/widgets/drag-drop/DropZone.js +214 -214
  65. package/src/widgets/form/Calendar.js +618 -618
  66. package/src/widgets/form/Calendar.scss +196 -196
  67. package/src/widgets/form/Checkbox.scss +127 -127
  68. package/src/widgets/form/ColorField.js +397 -397
  69. package/src/widgets/form/ColorField.scss +96 -96
  70. package/src/widgets/form/ColorPicker.scss +283 -283
  71. package/src/widgets/form/DateTimeField.js +576 -576
  72. package/src/widgets/form/DateTimePicker.js +392 -392
  73. package/src/widgets/form/LookupField.d.ts +179 -179
  74. package/src/widgets/form/LookupField.scss +219 -219
  75. package/src/widgets/form/MonthField.d.ts +99 -99
  76. package/src/widgets/form/MonthField.js +523 -523
  77. package/src/widgets/form/MonthPicker.d.ts +76 -76
  78. package/src/widgets/form/MonthPicker.js +641 -641
  79. package/src/widgets/form/MonthPicker.scss +118 -118
  80. package/src/widgets/form/NumberField.js +459 -459
  81. package/src/widgets/form/NumberField.scss +61 -61
  82. package/src/widgets/form/Radio.scss +121 -121
  83. package/src/widgets/form/Select.scss +99 -99
  84. package/src/widgets/form/Slider.scss +118 -118
  85. package/src/widgets/form/Switch.scss +140 -140
  86. package/src/widgets/form/TextArea.scss +43 -43
  87. package/src/widgets/form/TextField.js +290 -290
  88. package/src/widgets/form/TextField.scss +55 -55
  89. package/src/widgets/form/UploadButton.d.ts +34 -34
  90. package/src/widgets/form/variables.scss +353 -353
  91. package/src/widgets/grid/Grid.d.ts +442 -442
  92. package/src/widgets/grid/Grid.js +3414 -3414
  93. package/src/widgets/grid/Grid.scss +638 -637
  94. package/src/widgets/grid/GridRow.js +228 -228
  95. package/src/widgets/grid/TreeNode.d.ts +23 -23
  96. package/src/widgets/grid/TreeNode.scss +88 -88
  97. package/src/widgets/grid/variables.scss +133 -133
  98. package/src/widgets/nav/Menu.scss +74 -74
  99. package/src/widgets/overlay/Dropdown.js +612 -612
  100. package/src/widgets/overlay/FlyweightTooltipTracker.js +39 -39
  101. package/src/widgets/overlay/Overlay.d.ts +73 -73
  102. package/src/widgets/overlay/Tooltip.js +308 -303
  103. package/src/widgets/overlay/Window.js +202 -202
  104. package/src/widgets/overlay/captureMouse.js +124 -124
  105. package/src/widgets/overlay/createHotPromiseWindowFactory.d.ts +18 -18
  106. package/src/widgets/overlay/createHotPromiseWindowFactory.js +56 -56
  107. package/src/widgets/overlay/index.d.ts +11 -11
  108. package/src/widgets/overlay/index.js +11 -11
  109. package/src/widgets/variables.scss +144 -144
@@ -1,202 +1,202 @@
1
- import { Widget, VDOM, getContent } from "../../ui/Widget";
2
- import { Overlay, OverlayComponent } from "./Overlay";
3
- import { ContentPlaceholder } from "../../ui/layout/ContentPlaceholder";
4
- import { ZIndexManager } from "../../ui/ZIndexManager";
5
- import { Button } from "../Button";
6
- import { parseStyle } from "../../util/parseStyle";
7
- import { Localization } from "../../ui/Localization";
8
- import { stopPropagation } from "../../util/eventCallbacks";
9
- import { ddMouseDown, ddDetect, ddMouseUp } from "../drag-drop/ops";
10
- import { isDefined } from "../../util/isDefined";
11
- import { isString } from "../../util/isString";
12
-
13
- export class Window extends Overlay {
14
- init() {
15
- if (isDefined(this.closeable)) this.closable = this.closeable;
16
-
17
- if (isString(this.headerStyle)) this.headerStyle = parseStyle(this.headerStyle);
18
-
19
- if (isString(this.footerStyle)) this.footerStyle = parseStyle(this.footerStyle);
20
-
21
- if (isString(this.bodyStyle)) this.bodyStyle = parseStyle(this.bodyStyle);
22
-
23
- super.init();
24
- }
25
-
26
- declareData() {
27
- return super.declareData(...arguments, {
28
- title: undefined,
29
- closable: undefined,
30
- bodyStyle: { structured: true },
31
- bodyClass: { structured: true },
32
- headerStyle: { structured: true },
33
- footerStyle: { structured: true },
34
- });
35
- }
36
-
37
- initHelpers() {
38
- return super.initHelpers(...arguments, {
39
- header: Widget.create(this.header || { type: ContentPlaceholder, name: "header", scoped: true }),
40
- footer: Widget.create(this.footer || { type: ContentPlaceholder, name: "footer", scoped: true }),
41
- close:
42
- this.closable &&
43
- Button.create({
44
- mod: "hollow",
45
- dismiss: true,
46
- icon: "close",
47
- style: "margin-left: auto",
48
- onTouchStart: stopPropagation,
49
- onMouseDown: stopPropagation,
50
- }),
51
- });
52
- }
53
-
54
- exploreCleanup(context, instance) {
55
- super.exploreCleanup(context, instance);
56
-
57
- let { helpers } = instance;
58
- let unregisterHeader = helpers.header && helpers.header.unregisterContentPlaceholder;
59
- if (unregisterHeader) unregisterHeader();
60
-
61
- let unregisterFooter = helpers.footer && helpers.footer.unregisterContentPlaceholder;
62
- if (unregisterFooter) unregisterFooter();
63
- }
64
-
65
- renderHeader(context, instance, key) {
66
- let { data } = instance;
67
- let result = [];
68
- if (data.title) result.push(data.title);
69
- if (instance.helpers) {
70
- let header = getContent(instance.helpers.header && instance.helpers.header.render(context, key));
71
- if (header) result.push(header);
72
- if (data.closable && instance.helpers.close) result.push(getContent(instance.helpers.close.render(context)));
73
- }
74
- return result;
75
- }
76
-
77
- renderFooter(context, instance, key) {
78
- return getContent(instance.helpers && instance.helpers.footer && instance.helpers.footer.render(context, key));
79
- }
80
-
81
- render(context, instance, key) {
82
- var header = this.renderHeader(context, instance, "header");
83
- var footer = this.renderFooter(context, instance, "footer");
84
- return (
85
- <WindowComponent
86
- key={key}
87
- instance={instance}
88
- header={header}
89
- footer={footer}
90
- subscribeToBeforeDismiss={context.options.subscribeToBeforeDismiss}
91
- >
92
- {this.renderContents(context, instance)}
93
- </WindowComponent>
94
- );
95
- }
96
- }
97
-
98
- Window.prototype.baseClass = "window";
99
- Window.prototype.closable = true;
100
- Window.prototype.resizable = false;
101
- Window.prototype.fixed = false;
102
- Window.prototype.autoFocus = true;
103
- Window.prototype.focusable = true;
104
- Window.prototype.pad = true;
105
-
106
- Widget.alias("window", Window);
107
- Localization.registerPrototype("cx/widgets/Window", Window);
108
-
109
- class WindowComponent extends OverlayComponent {
110
- renderOverlayBody() {
111
- var { widget, data } = this.props.instance;
112
- var { CSS, baseClass } = widget;
113
-
114
- let header, footer;
115
-
116
- if (this.props.header.length > 0) {
117
- header = (
118
- <header
119
- key="header"
120
- ref={(c) => {
121
- this.headerEl = c;
122
- }}
123
- className={CSS.element(baseClass, "header")}
124
- style={data.headerStyle}
125
- onMouseDown={this.onHeaderMouseDown.bind(this)}
126
- onMouseUp={ddMouseUp}
127
- onMouseMove={this.onHeaderMouseMove.bind(this)}
128
- onTouchStart={this.onHeaderMouseDown.bind(this)}
129
- onTouchEnd={ddMouseUp}
130
- onTouchMove={this.onHeaderMouseMove.bind(this)}
131
- >
132
- {this.props.header}
133
- </header>
134
- );
135
- }
136
-
137
- if (this.props.footer) {
138
- footer = (
139
- <footer
140
- key="footer"
141
- ref={(c) => {
142
- this.footerEl = c;
143
- }}
144
- className={CSS.element(baseClass, "footer")}
145
- style={data.footerStyle}
146
- >
147
- {this.props.footer}
148
- </footer>
149
- );
150
- }
151
-
152
- var body = (
153
- <div
154
- key="body"
155
- ref={(c) => {
156
- this.bodyEl = c;
157
- }}
158
- className={CSS.expand(CSS.element(widget.baseClass, "body", { pad: widget.pad }), data.bodyClass)}
159
- style={data.bodyStyle}
160
- >
161
- {this.props.children}
162
- </div>
163
- );
164
-
165
- return [header, body, footer];
166
- }
167
-
168
- getOverlayCssClass() {
169
- var cls = super.getOverlayCssClass();
170
- if (this.state.active) cls += " cxs-active";
171
- return cls;
172
- }
173
-
174
- onFocusIn() {
175
- super.onFocusIn();
176
- if (!this.state.active) {
177
- if (this.containerEl.contains(document.activeElement)) this.setZIndex(ZIndexManager.next());
178
- this.setState({ active: true });
179
- }
180
- }
181
-
182
- onFocusOut() {
183
- super.onFocusOut();
184
- if (this.state.active) {
185
- this.setState({
186
- active: false,
187
- });
188
- }
189
- }
190
-
191
- onHeaderMouseDown(e) {
192
- e.stopPropagation();
193
- ddMouseDown(e);
194
- }
195
-
196
- onHeaderMouseMove(e) {
197
- e.stopPropagation();
198
- if (!this.props.instance.widget.fixed && ddDetect(e)) {
199
- this.startMoveOperation(e);
200
- }
201
- }
202
- }
1
+ import { Widget, VDOM, getContent } from "../../ui/Widget";
2
+ import { Overlay, OverlayComponent } from "./Overlay";
3
+ import { ContentPlaceholder } from "../../ui/layout/ContentPlaceholder";
4
+ import { ZIndexManager } from "../../ui/ZIndexManager";
5
+ import { Button } from "../Button";
6
+ import { parseStyle } from "../../util/parseStyle";
7
+ import { Localization } from "../../ui/Localization";
8
+ import { stopPropagation } from "../../util/eventCallbacks";
9
+ import { ddMouseDown, ddDetect, ddMouseUp } from "../drag-drop/ops";
10
+ import { isDefined } from "../../util/isDefined";
11
+ import { isString } from "../../util/isString";
12
+
13
+ export class Window extends Overlay {
14
+ init() {
15
+ if (isDefined(this.closeable)) this.closable = this.closeable;
16
+
17
+ if (isString(this.headerStyle)) this.headerStyle = parseStyle(this.headerStyle);
18
+
19
+ if (isString(this.footerStyle)) this.footerStyle = parseStyle(this.footerStyle);
20
+
21
+ if (isString(this.bodyStyle)) this.bodyStyle = parseStyle(this.bodyStyle);
22
+
23
+ super.init();
24
+ }
25
+
26
+ declareData() {
27
+ return super.declareData(...arguments, {
28
+ title: undefined,
29
+ closable: undefined,
30
+ bodyStyle: { structured: true },
31
+ bodyClass: { structured: true },
32
+ headerStyle: { structured: true },
33
+ footerStyle: { structured: true },
34
+ });
35
+ }
36
+
37
+ initHelpers() {
38
+ return super.initHelpers(...arguments, {
39
+ header: Widget.create(this.header || { type: ContentPlaceholder, name: "header", scoped: true }),
40
+ footer: Widget.create(this.footer || { type: ContentPlaceholder, name: "footer", scoped: true }),
41
+ close:
42
+ this.closable &&
43
+ Button.create({
44
+ mod: "hollow",
45
+ dismiss: true,
46
+ icon: "close",
47
+ style: "margin-left: auto",
48
+ onTouchStart: stopPropagation,
49
+ onMouseDown: stopPropagation,
50
+ }),
51
+ });
52
+ }
53
+
54
+ exploreCleanup(context, instance) {
55
+ super.exploreCleanup(context, instance);
56
+
57
+ let { helpers } = instance;
58
+ let unregisterHeader = helpers.header && helpers.header.unregisterContentPlaceholder;
59
+ if (unregisterHeader) unregisterHeader();
60
+
61
+ let unregisterFooter = helpers.footer && helpers.footer.unregisterContentPlaceholder;
62
+ if (unregisterFooter) unregisterFooter();
63
+ }
64
+
65
+ renderHeader(context, instance, key) {
66
+ let { data } = instance;
67
+ let result = [];
68
+ if (data.title) result.push(data.title);
69
+ if (instance.helpers) {
70
+ let header = getContent(instance.helpers.header && instance.helpers.header.render(context, key));
71
+ if (header) result.push(header);
72
+ if (data.closable && instance.helpers.close) result.push(getContent(instance.helpers.close.render(context)));
73
+ }
74
+ return result;
75
+ }
76
+
77
+ renderFooter(context, instance, key) {
78
+ return getContent(instance.helpers && instance.helpers.footer && instance.helpers.footer.render(context, key));
79
+ }
80
+
81
+ render(context, instance, key) {
82
+ var header = this.renderHeader(context, instance, "header");
83
+ var footer = this.renderFooter(context, instance, "footer");
84
+ return (
85
+ <WindowComponent
86
+ key={key}
87
+ instance={instance}
88
+ header={header}
89
+ footer={footer}
90
+ subscribeToBeforeDismiss={context.options.subscribeToBeforeDismiss}
91
+ >
92
+ {this.renderContents(context, instance)}
93
+ </WindowComponent>
94
+ );
95
+ }
96
+ }
97
+
98
+ Window.prototype.baseClass = "window";
99
+ Window.prototype.closable = true;
100
+ Window.prototype.resizable = false;
101
+ Window.prototype.fixed = false;
102
+ Window.prototype.autoFocus = true;
103
+ Window.prototype.focusable = true;
104
+ Window.prototype.pad = true;
105
+
106
+ Widget.alias("window", Window);
107
+ Localization.registerPrototype("cx/widgets/Window", Window);
108
+
109
+ class WindowComponent extends OverlayComponent {
110
+ renderOverlayBody() {
111
+ var { widget, data } = this.props.instance;
112
+ var { CSS, baseClass } = widget;
113
+
114
+ let header, footer;
115
+
116
+ if (this.props.header.length > 0) {
117
+ header = (
118
+ <header
119
+ key="header"
120
+ ref={(c) => {
121
+ this.headerEl = c;
122
+ }}
123
+ className={CSS.element(baseClass, "header")}
124
+ style={data.headerStyle}
125
+ onMouseDown={this.onHeaderMouseDown.bind(this)}
126
+ onMouseUp={ddMouseUp}
127
+ onMouseMove={this.onHeaderMouseMove.bind(this)}
128
+ onTouchStart={this.onHeaderMouseDown.bind(this)}
129
+ onTouchEnd={ddMouseUp}
130
+ onTouchMove={this.onHeaderMouseMove.bind(this)}
131
+ >
132
+ {this.props.header}
133
+ </header>
134
+ );
135
+ }
136
+
137
+ if (this.props.footer) {
138
+ footer = (
139
+ <footer
140
+ key="footer"
141
+ ref={(c) => {
142
+ this.footerEl = c;
143
+ }}
144
+ className={CSS.element(baseClass, "footer")}
145
+ style={data.footerStyle}
146
+ >
147
+ {this.props.footer}
148
+ </footer>
149
+ );
150
+ }
151
+
152
+ var body = (
153
+ <div
154
+ key="body"
155
+ ref={(c) => {
156
+ this.bodyEl = c;
157
+ }}
158
+ className={CSS.expand(CSS.element(widget.baseClass, "body", { pad: widget.pad }), data.bodyClass)}
159
+ style={data.bodyStyle}
160
+ >
161
+ {this.props.children}
162
+ </div>
163
+ );
164
+
165
+ return [header, body, footer];
166
+ }
167
+
168
+ getOverlayCssClass() {
169
+ var cls = super.getOverlayCssClass();
170
+ if (this.state.active) cls += " cxs-active";
171
+ return cls;
172
+ }
173
+
174
+ onFocusIn() {
175
+ super.onFocusIn();
176
+ if (!this.state.active) {
177
+ if (this.containerEl.contains(document.activeElement)) this.setZIndex(ZIndexManager.next());
178
+ this.setState({ active: true });
179
+ }
180
+ }
181
+
182
+ onFocusOut() {
183
+ super.onFocusOut();
184
+ if (this.state.active) {
185
+ this.setState({
186
+ active: false,
187
+ });
188
+ }
189
+ }
190
+
191
+ onHeaderMouseDown(e) {
192
+ e.stopPropagation();
193
+ ddMouseDown(e);
194
+ }
195
+
196
+ onHeaderMouseMove(e) {
197
+ e.stopPropagation();
198
+ if (!this.props.instance.widget.fixed && ddDetect(e)) {
199
+ this.startMoveOperation(e);
200
+ }
201
+ }
202
+ }
@@ -1,124 +1,124 @@
1
- import { batchUpdates } from "../../ui/batchUpdates";
2
- import { getParentFrameBoundingClientRect } from "../../util/getParentFrameBoundingClientRect";
3
-
4
- export function captureMouse2(e, { onMouseMove, onMouseUp, onDblClick, captureData, cursor }) {
5
- let surface = document.createElement("div");
6
- surface.className = "cxb-mousecapture";
7
- surface.style.cursor = cursor || getComputedStyle(e.currentTarget).cursor;
8
-
9
- document.body.appendChild(surface);
10
-
11
- // In case when the event originates from an iframe,
12
- // we use that document as events do not bubble up. //
13
- let parentDocument = e.target.ownerDocument;
14
- let options = { capture: true };
15
-
16
- let active = true;
17
- parentDocument.addEventListener("mousemove", move, options);
18
- parentDocument.addEventListener("mouseup", end, options);
19
- if (onDblClick) parentDocument.addEventListener("dblclick", doubleClick), options;
20
-
21
- function tear() {
22
- if (surface == null) return;
23
- parentDocument.removeEventListener("mousemove", move, options);
24
- parentDocument.removeEventListener("mouseup", end, options);
25
- if (onDblClick) parentDocument.removeEventListener("dblclick", onDblClick, options);
26
- document.body.removeChild(surface);
27
- surface = null;
28
- }
29
-
30
- function doubleClick(e) {
31
- try {
32
- onDblClick && onDblClick(e);
33
- } finally {
34
- tear();
35
- }
36
- }
37
-
38
- e.stopPropagation();
39
-
40
- function move(e) {
41
- if (!active) {
42
- tear();
43
- return;
44
- }
45
-
46
- //if mouse moves double clicking is off
47
- onDblClick = null;
48
-
49
- batchUpdates(() => {
50
- if (onMouseMove) onMouseMove(e, captureData);
51
- e.stopPropagation();
52
- e.preventDefault(); //disable text selection
53
- });
54
- }
55
-
56
- function end(e) {
57
- active = false;
58
- batchUpdates(() => {
59
- // if (surface.releaseCapture)
60
- // surface.releaseCapture();
61
-
62
- if (!onDblClick) surface.style.display = "none";
63
- try {
64
- if (onMouseUp) onMouseUp(e, captureData);
65
- } finally {
66
- if (onDblClick) {
67
- //keep the surface a little longer to detect double clicks
68
- setTimeout(tear, 1500);
69
- } else tear();
70
- }
71
- });
72
- }
73
- }
74
-
75
- export function captureMouseOrTouch2(e, { onMouseMove, onMouseUp, onDblClick, captureData, cursor }) {
76
- if (e.type.indexOf("touch") == 0) {
77
- let el = e.currentTarget;
78
-
79
- let move = (e) => {
80
- batchUpdates(() => {
81
- if (onMouseMove) onMouseMove(e, captureData);
82
- e.preventDefault();
83
- });
84
- };
85
-
86
- let end = (e) => {
87
- batchUpdates(() => {
88
- el.removeEventListener("touchmove", move);
89
- el.removeEventListener("touchend", end);
90
-
91
- if (onMouseUp) onMouseUp(e);
92
-
93
- e.preventDefault();
94
- });
95
- };
96
-
97
- el.addEventListener("touchmove", move);
98
- el.addEventListener("touchend", end);
99
-
100
- e.stopPropagation();
101
- } else captureMouse2(e, { onMouseMove, onMouseUp, captureData, onDblClick, cursor });
102
- }
103
-
104
- export function captureMouse(e, onMouseMove, onMouseUp, captureData, cursor) {
105
- captureMouse2(e, {
106
- onMouseMove,
107
- onMouseUp,
108
- captureData,
109
- cursor,
110
- });
111
- }
112
-
113
- export function captureMouseOrTouch(e, onMouseMove, onMouseUp, captureData, cursor) {
114
- captureMouseOrTouch2(e, { onMouseMove, onMouseUp, captureData, cursor });
115
- }
116
-
117
- export function getCursorPos(e) {
118
- let p = (e.touches && e.touches[0]) || e;
119
- let offset = getParentFrameBoundingClientRect(e.target);
120
- return {
121
- clientX: p.clientX + offset.left,
122
- clientY: p.clientY + offset.top,
123
- };
124
- }
1
+ import { batchUpdates } from "../../ui/batchUpdates";
2
+ import { getParentFrameBoundingClientRect } from "../../util/getParentFrameBoundingClientRect";
3
+
4
+ export function captureMouse2(e, { onMouseMove, onMouseUp, onDblClick, captureData, cursor }) {
5
+ let surface = document.createElement("div");
6
+ surface.className = "cxb-mousecapture";
7
+ surface.style.cursor = cursor || getComputedStyle(e.currentTarget).cursor;
8
+
9
+ document.body.appendChild(surface);
10
+
11
+ // In case when the event originates from an iframe,
12
+ // we use that document as events do not bubble up. //
13
+ let parentDocument = e.target.ownerDocument;
14
+ let options = { capture: true };
15
+
16
+ let active = true;
17
+ parentDocument.addEventListener("mousemove", move, options);
18
+ parentDocument.addEventListener("mouseup", end, options);
19
+ if (onDblClick) parentDocument.addEventListener("dblclick", doubleClick), options;
20
+
21
+ function tear() {
22
+ if (surface == null) return;
23
+ parentDocument.removeEventListener("mousemove", move, options);
24
+ parentDocument.removeEventListener("mouseup", end, options);
25
+ if (onDblClick) parentDocument.removeEventListener("dblclick", onDblClick, options);
26
+ document.body.removeChild(surface);
27
+ surface = null;
28
+ }
29
+
30
+ function doubleClick(e) {
31
+ try {
32
+ onDblClick && onDblClick(e);
33
+ } finally {
34
+ tear();
35
+ }
36
+ }
37
+
38
+ e.stopPropagation();
39
+
40
+ function move(e) {
41
+ if (!active) {
42
+ tear();
43
+ return;
44
+ }
45
+
46
+ //if mouse moves double clicking is off
47
+ onDblClick = null;
48
+
49
+ batchUpdates(() => {
50
+ if (onMouseMove) onMouseMove(e, captureData);
51
+ e.stopPropagation();
52
+ e.preventDefault(); //disable text selection
53
+ });
54
+ }
55
+
56
+ function end(e) {
57
+ active = false;
58
+ batchUpdates(() => {
59
+ // if (surface.releaseCapture)
60
+ // surface.releaseCapture();
61
+
62
+ if (!onDblClick) surface.style.display = "none";
63
+ try {
64
+ if (onMouseUp) onMouseUp(e, captureData);
65
+ } finally {
66
+ if (onDblClick) {
67
+ //keep the surface a little longer to detect double clicks
68
+ setTimeout(tear, 1500);
69
+ } else tear();
70
+ }
71
+ });
72
+ }
73
+ }
74
+
75
+ export function captureMouseOrTouch2(e, { onMouseMove, onMouseUp, onDblClick, captureData, cursor }) {
76
+ if (e.type.indexOf("touch") == 0) {
77
+ let el = e.currentTarget;
78
+
79
+ let move = (e) => {
80
+ batchUpdates(() => {
81
+ if (onMouseMove) onMouseMove(e, captureData);
82
+ e.preventDefault();
83
+ });
84
+ };
85
+
86
+ let end = (e) => {
87
+ batchUpdates(() => {
88
+ el.removeEventListener("touchmove", move);
89
+ el.removeEventListener("touchend", end);
90
+
91
+ if (onMouseUp) onMouseUp(e);
92
+
93
+ e.preventDefault();
94
+ });
95
+ };
96
+
97
+ el.addEventListener("touchmove", move);
98
+ el.addEventListener("touchend", end);
99
+
100
+ e.stopPropagation();
101
+ } else captureMouse2(e, { onMouseMove, onMouseUp, captureData, onDblClick, cursor });
102
+ }
103
+
104
+ export function captureMouse(e, onMouseMove, onMouseUp, captureData, cursor) {
105
+ captureMouse2(e, {
106
+ onMouseMove,
107
+ onMouseUp,
108
+ captureData,
109
+ cursor,
110
+ });
111
+ }
112
+
113
+ export function captureMouseOrTouch(e, onMouseMove, onMouseUp, captureData, cursor) {
114
+ captureMouseOrTouch2(e, { onMouseMove, onMouseUp, captureData, cursor });
115
+ }
116
+
117
+ export function getCursorPos(e) {
118
+ let p = (e.touches && e.touches[0]) || e;
119
+ let offset = getParentFrameBoundingClientRect(e.target);
120
+ return {
121
+ clientX: p.clientX + offset.left,
122
+ clientY: p.clientY + offset.top,
123
+ };
124
+ }