cx 25.6.3 → 25.7.0

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 (111) hide show
  1. package/dist/charts.css +250 -250
  2. package/dist/charts.js +109 -109
  3. package/dist/data.js +19 -19
  4. package/dist/hooks.js +1 -1
  5. package/dist/manifest.js +744 -744
  6. package/dist/svg.js +25 -25
  7. package/dist/ui.js +84 -84
  8. package/dist/util.js +6 -9
  9. package/dist/widgets.css +6 -6
  10. package/dist/widgets.js +516 -511
  11. package/package.json +1 -1
  12. package/src/charts/Legend.d.ts +45 -45
  13. package/src/charts/LegendEntry.js +128 -128
  14. package/src/charts/LegendEntry.scss +27 -27
  15. package/src/charts/Marker.d.ts +1 -1
  16. package/src/charts/MarkerLine.d.ts +25 -27
  17. package/src/charts/PieChart.d.ts +92 -92
  18. package/src/charts/RangeMarker.js +159 -159
  19. package/src/charts/axis/Axis.d.ts +113 -113
  20. package/src/charts/axis/Axis.js +280 -280
  21. package/src/charts/axis/CategoryAxis.d.ts +30 -30
  22. package/src/charts/axis/CategoryAxis.js +241 -241
  23. package/src/charts/axis/NumericAxis.js +351 -351
  24. package/src/charts/axis/Stack.js +55 -55
  25. package/src/charts/axis/TimeAxis.js +611 -611
  26. package/src/charts/helpers/SnapPointFinder.js +69 -69
  27. package/src/data/Binding.spec.js +69 -69
  28. package/src/data/ExposedValueView.d.ts +19 -19
  29. package/src/data/Expression.js +229 -229
  30. package/src/data/Expression.spec.js +229 -229
  31. package/src/data/StringTemplate.js +92 -92
  32. package/src/data/StringTemplate.spec.js +132 -132
  33. package/src/data/StructuredSelector.js +132 -132
  34. package/src/data/getAccessor.spec.js +11 -11
  35. package/src/data/getSelector.js +49 -49
  36. package/src/hooks/createLocalStorageRef.d.ts +3 -3
  37. package/src/hooks/createLocalStorageRef.js +20 -20
  38. package/src/index.scss +6 -6
  39. package/src/ui/Culture.d.ts +57 -57
  40. package/src/ui/Culture.js +139 -139
  41. package/src/ui/FocusManager.js +171 -171
  42. package/src/ui/Format.js +108 -108
  43. package/src/ui/HoverSync.js +147 -147
  44. package/src/ui/Repeater.d.ts +61 -61
  45. package/src/ui/index.d.ts +42 -42
  46. package/src/ui/layout/ContentPlaceholder.d.ts +19 -19
  47. package/src/ui/layout/ContentPlaceholder.js +105 -105
  48. package/src/ui/layout/ContentPlaceholder.spec.js +579 -579
  49. package/src/ui/layout/LabelsTopLayout.js +134 -134
  50. package/src/util/Format.js +270 -270
  51. package/src/util/date/encodeDate.d.ts +1 -1
  52. package/src/util/date/encodeDate.js +8 -8
  53. package/src/util/date/encodeDateWithTimezoneOffset.d.ts +1 -1
  54. package/src/util/date/index.d.ts +11 -11
  55. package/src/util/date/index.js +11 -11
  56. package/src/util/date/parseDateInvariant.d.ts +3 -3
  57. package/src/util/date/parseDateInvariant.js +20 -20
  58. package/src/util/getSearchQueryPredicate.js +59 -59
  59. package/src/util/index.d.ts +51 -51
  60. package/src/util/index.js +54 -54
  61. package/src/util/isFunction.d.ts +1 -1
  62. package/src/util/isValidIdentifierName.d.ts +1 -1
  63. package/src/util/isValidIdentifierName.js +5 -5
  64. package/src/util/isValidIdentifierName.spec.js +33 -33
  65. package/src/util/scss/add-rules.scss +38 -38
  66. package/src/widgets/CxCredit.scss +37 -37
  67. package/src/widgets/HighlightedSearchText.js +36 -36
  68. package/src/widgets/HighlightedSearchText.scss +18 -18
  69. package/src/widgets/List.scss +91 -91
  70. package/src/widgets/Sandbox.d.ts +18 -18
  71. package/src/widgets/Sandbox.js +65 -65
  72. package/src/widgets/drag-drop/DropZone.js +214 -214
  73. package/src/widgets/form/Calendar.js +618 -618
  74. package/src/widgets/form/Calendar.scss +196 -196
  75. package/src/widgets/form/Checkbox.scss +127 -127
  76. package/src/widgets/form/ColorField.js +397 -397
  77. package/src/widgets/form/ColorField.scss +96 -96
  78. package/src/widgets/form/ColorPicker.scss +283 -283
  79. package/src/widgets/form/DateTimeField.js +576 -576
  80. package/src/widgets/form/DateTimePicker.js +392 -392
  81. package/src/widgets/form/LookupField.d.ts +179 -179
  82. package/src/widgets/form/LookupField.scss +219 -219
  83. package/src/widgets/form/NumberField.js +459 -459
  84. package/src/widgets/form/NumberField.scss +61 -61
  85. package/src/widgets/form/Radio.scss +121 -121
  86. package/src/widgets/form/Select.scss +99 -99
  87. package/src/widgets/form/Slider.scss +118 -118
  88. package/src/widgets/form/Switch.scss +140 -140
  89. package/src/widgets/form/TextArea.scss +43 -43
  90. package/src/widgets/form/TextField.js +290 -290
  91. package/src/widgets/form/TextField.scss +55 -55
  92. package/src/widgets/form/UploadButton.d.ts +34 -34
  93. package/src/widgets/form/variables.scss +353 -353
  94. package/src/widgets/grid/Grid.d.ts +442 -442
  95. package/src/widgets/grid/Grid.js +28 -23
  96. package/src/widgets/grid/GridRow.js +228 -228
  97. package/src/widgets/grid/TreeNode.d.ts +23 -23
  98. package/src/widgets/grid/TreeNode.scss +88 -88
  99. package/src/widgets/grid/variables.scss +133 -133
  100. package/src/widgets/nav/LinkButton.js +128 -128
  101. package/src/widgets/nav/Menu.scss +74 -74
  102. package/src/widgets/overlay/Dropdown.js +612 -612
  103. package/src/widgets/overlay/FlyweightTooltipTracker.js +39 -39
  104. package/src/widgets/overlay/Overlay.d.ts +73 -73
  105. package/src/widgets/overlay/Window.js +202 -202
  106. package/src/widgets/overlay/captureMouse.js +124 -124
  107. package/src/widgets/overlay/createHotPromiseWindowFactory.d.ts +18 -18
  108. package/src/widgets/overlay/createHotPromiseWindowFactory.js +56 -56
  109. package/src/widgets/overlay/index.d.ts +11 -11
  110. package/src/widgets/overlay/index.js +11 -11
  111. package/src/widgets/variables.scss +144 -144
@@ -102,6 +102,7 @@ export class Grid extends Container {
102
102
  colWidth: {},
103
103
  lockedColWidth: {},
104
104
  dimensionsVersion: 0,
105
+ disableDefaultSort: false
105
106
  };
106
107
  instance.v = 0;
107
108
  if (this.infinite)
@@ -182,16 +183,16 @@ export class Grid extends Container {
182
183
  value: isDefined(c.aggregateValue)
183
184
  ? c.aggregateValue
184
185
  : isDefined(c.value)
185
- ? c.value
186
- : c.aggregateField
187
- ? { bind: this.recordName + "." + c.aggregateField }
188
- : null,
186
+ ? c.value
187
+ : c.aggregateField
188
+ ? { bind: this.recordName + "." + c.aggregateField }
189
+ : null,
189
190
  weight:
190
191
  c.weight != null
191
192
  ? c.weight
192
193
  : c.weightField && {
193
- bind: this.recordName + "." + c.weightField,
194
- },
194
+ bind: this.recordName + "." + c.weightField,
195
+ },
195
196
  type: c.aggregate,
196
197
  };
197
198
  } else if (c.footer && !showFooter) {
@@ -295,7 +296,8 @@ export class Grid extends Container {
295
296
  data.sorters = [sorter];
296
297
  }
297
298
 
298
- if (!isNonEmptyArray(data.sorters) && this.defaultSortField) {
299
+ let skipDefaultSorting = this.clearableSort && instance.state.disableDefaultSort;
300
+ if (!skipDefaultSorting && !isNonEmptyArray(data.sorters) && this.defaultSortField) {
299
301
  let sorter = {
300
302
  field: this.defaultSortField,
301
303
  direction: this.defaultSortDirection || "ASC",
@@ -553,9 +555,8 @@ export class Grid extends Container {
553
555
  let initialPosition = getCursorPos(e);
554
556
  resizeOverlayEl.className = CSS.element(baseClass, "resize-overlay");
555
557
  resizeOverlayEl.style.width = `${initialWidth}px`;
556
- resizeOverlayEl.style.left = `${
557
- headerCell.getBoundingClientRect().left - gridEl.getBoundingClientRect().left
558
- }px`;
558
+ resizeOverlayEl.style.left = `${headerCell.getBoundingClientRect().left - gridEl.getBoundingClientRect().left
559
+ }px`;
559
560
  gridEl.appendChild(resizeOverlayEl);
560
561
  captureMouse2(e, {
561
562
  onMouseMove: (e) => {
@@ -817,7 +818,7 @@ export class Grid extends Container {
817
818
  widget: () => <div className={CSS.element(baseClass, "col-header-drag-clone")}>{data.text}</div>,
818
819
  },
819
820
  },
820
- () => {},
821
+ () => { },
821
822
  );
822
823
  }
823
824
  }
@@ -852,19 +853,22 @@ export class Grid extends Container {
852
853
  if (data.sorters[0].direction == "ASC" && (!this.clearableSort || direction == "ASC")) direction = "DESC";
853
854
  else if (data.sorters[0].direction == "DESC" && (!this.clearableSort || direction == "DESC"))
854
855
  direction = "ASC";
855
- else direction = null;
856
+ else {
857
+ direction = null;
858
+ instance.state.disableDefaultSort = true;
859
+ }
856
860
  }
857
861
 
858
862
  let sorters = direction
859
863
  ? [
860
- {
861
- field,
862
- direction,
863
- value,
864
- comparer,
865
- sortOptions,
866
- },
867
- ]
864
+ {
865
+ field,
866
+ direction,
867
+ value,
868
+ comparer,
869
+ sortOptions,
870
+ },
871
+ ]
868
872
  : null;
869
873
 
870
874
  if (sorters == null) field = null;
@@ -1315,8 +1319,8 @@ class GridComponent extends VDOM.Component {
1315
1319
  style={
1316
1320
  this.rowHeight > 0
1317
1321
  ? {
1318
- height: this.rowHeight + 1,
1319
- }
1322
+ height: this.rowHeight + 1,
1323
+ }
1320
1324
  : null
1321
1325
  }
1322
1326
  >
@@ -2598,6 +2602,7 @@ class GridComponent extends VDOM.Component {
2598
2602
  instance.buffer.totalRecordCount = 0;
2599
2603
  instance.buffer.page = 1;
2600
2604
  this.prevFetchRecordsState = null;
2605
+ this.loading = false;
2601
2606
  }
2602
2607
  }
2603
2608
 
@@ -2726,7 +2731,7 @@ class GridComponent extends VDOM.Component {
2726
2731
  hscroll = true;
2727
2732
  item =
2728
2733
  item.firstChild.children[
2729
- this.state.cursorCellIndex - this.props.instance.fixedColumnCount
2734
+ this.state.cursorCellIndex - this.props.instance.fixedColumnCount
2730
2735
  ];
2731
2736
  } else {
2732
2737
  let fixedItem = this.dom.fixedTable.querySelector(`tbody[data-record-key="${record.key}"]`);
@@ -1,228 +1,228 @@
1
- import { preventFocusOnTouch, unfocusElement } from "../../ui/FocusManager";
2
- import { VDOM } from "../../ui/Widget";
3
- import { closest } from "../../util/DOM";
4
- import { isTouchEvent } from "../../util/isTouchEvent";
5
- import { KeyCode } from "../../util/KeyCode";
6
- import { ValidationGroup } from "../../widgets/form/ValidationGroup";
7
- import { ddDetect, ddMouseDown, ddMouseUp, isDragHandleEvent } from "../drag-drop/ops";
8
- import { GridRowLine } from "./GridRowLine";
9
-
10
- export class GridRow extends ValidationGroup {
11
- declareData(...args) {
12
- super.declareData(...args, {
13
- hoverId: undefined,
14
- });
15
- }
16
-
17
- init() {
18
- this.items = [];
19
- for (let i = 0; i < 10; i++) {
20
- if (this["line" + i])
21
- this.items.push(
22
- GridRowLine.create(this["line" + i], {
23
- recordName: this.recordName,
24
- }),
25
- );
26
- }
27
- super.init();
28
- }
29
-
30
- explore(context, instance) {
31
- context.push("dragHandles", (instance.dragHandles = []));
32
- super.explore(context, instance);
33
- }
34
-
35
- exploreCleanup(context, instance) {
36
- super.exploreCleanup(context, instance);
37
- context.pop("dragHandles");
38
- }
39
- }
40
-
41
- GridRow.prototype.styled = true; //styles used on the wrapper component
42
-
43
- export class GridRowComponent extends VDOM.Component {
44
- constructor(props) {
45
- super(props);
46
- this.onMouseMove = this.onMouseMove.bind(this);
47
- this.onMouseDown = this.onMouseDown.bind(this);
48
- this.onMouseLeave = this.onMouseLeave.bind(this);
49
- this.onClick = this.onClick.bind(this);
50
- this.onKeyDown = this.onKeyDown.bind(this);
51
-
52
- let { grid, instance } = props;
53
-
54
- if (grid.widget.onRowDoubleClick)
55
- this.onDoubleClick = (e) => {
56
- grid.invoke("onRowDoubleClick", e, instance);
57
- };
58
-
59
- if (grid.widget.cellEditable)
60
- this.onDoubleClick = (e) => {
61
- this.props.parent.moveCursor(this.props.cursorIndex, {
62
- cellEdit: true,
63
- });
64
- e.preventDefault(); //prevent text selection
65
- };
66
-
67
- if (grid.widget.onRowContextMenu)
68
- this.onRowContextMenu = (e) => {
69
- grid.invoke("onRowContextMenu", e, instance);
70
- };
71
- }
72
-
73
- render() {
74
- let { className, dragSource, instance, record, useTrTag, children } = this.props;
75
- let { data, widget } = instance;
76
- let { CSS } = widget;
77
- let move, up, keyDown, leave;
78
-
79
- if (dragSource || data.hoverId != null) {
80
- move = this.onMouseMove;
81
- up = ddMouseUp;
82
- }
83
-
84
- if (data.hoverId != null) {
85
- leave = this.onMouseLeave;
86
- }
87
-
88
- if (widget.onRowClick) keyDown = this.onKeyDown;
89
-
90
- return VDOM.createElement(
91
- useTrTag ? "tr" : "tbody",
92
- {
93
- className: CSS.expand(data.classNames, className, this.state && this.state.hover && CSS.state("hover")),
94
- style: data.style,
95
- onClick: this.onClick,
96
- onDoubleClick: this.onDoubleClick,
97
- onTouchStart: this.onMouseDown,
98
- onMouseDown: this.onMouseDown,
99
- onTouchMove: move,
100
- onMouseMove: move,
101
- onMouseLeave: leave,
102
- onTouchEnd: up,
103
- onMouseUp: up,
104
- onKeyDown: keyDown,
105
- onContextMenu: this.onRowContextMenu,
106
- "data-record-key": record.key,
107
- },
108
- children,
109
- );
110
- }
111
-
112
- onMouseDown(e) {
113
- let { grid, record, instance, parent, cursorIndex } = this.props;
114
-
115
- if (this.props.dragSource) {
116
- ddMouseDown(e);
117
- if (isDragHandleEvent(e) || instance.dragHandles.length == 0) {
118
- e.preventDefault();
119
- e.stopPropagation();
120
-
121
- //close context menu
122
- unfocusElement(e.target, false);
123
- }
124
- }
125
-
126
- let { store, widget } = grid;
127
-
128
- if (widget.selectable) preventFocusOnTouch(e);
129
-
130
- parent.moveCursor(cursorIndex, {
131
- select:
132
- !isTouchEvent() &&
133
- (e.shiftKey || e.ctrlKey || !widget.selection.isSelected(store, record.data, record.index)),
134
- selectRange: e.shiftKey,
135
- selectOptions: {
136
- toggle: e.ctrlKey && !e.shiftKey,
137
- add: e.ctrlKey && e.shiftKey,
138
- },
139
- cellIndex: this.getCellIndex(e),
140
- });
141
-
142
- if (e.shiftKey && !isTouchEvent()) e.preventDefault();
143
- }
144
-
145
- onMouseMove(e) {
146
- let { grid, instance, parent, record } = this.props;
147
- if (ddDetect(e) && (isDragHandleEvent(e) || instance.dragHandles.length == 0)) parent.beginDragDrop(e, record);
148
- if (grid.hoverSync && instance.data.hoverId != null)
149
- grid.hoverSync.report(grid.widget.hoverChannel, instance.data.hoverId, true);
150
- }
151
-
152
- onMouseLeave(e) {
153
- let { grid, instance } = this.props;
154
- if (grid.hoverSync && instance.data.hoverId != null)
155
- grid.hoverSync.report(grid.widget.hoverChannel, instance.data.hoverId, false);
156
- }
157
-
158
- getCellIndex(e) {
159
- let td = closest(e.target, (node) => node.tagName == "TD");
160
- if (td)
161
- return (
162
- (this.props.fixed ? 0 : this.props.grid.fixedColumnCount) +
163
- Array.from(td.parentElement.children).indexOf(td)
164
- );
165
- return -1;
166
- }
167
-
168
- onKeyDown(e) {
169
- let { grid, instance } = this.props;
170
-
171
- if (e.keyCode == KeyCode.enter && grid.invoke("onRowClick", e, instance) === false) {
172
- e.stopPropagation();
173
- }
174
- }
175
-
176
- onClick(e) {
177
- let { grid, record, instance, parent, cursorIndex } = this.props;
178
- let { store, widget } = grid;
179
-
180
- if (grid.widget.onRowClick) {
181
- if (grid.invoke("onRowClick", e, instance) === false) return;
182
- }
183
-
184
- e.stopPropagation();
185
-
186
- parent.moveCursor(cursorIndex, {
187
- select:
188
- isTouchEvent() ||
189
- (!e.shiftKey && !e.ctrlKey && widget.selection.isSelected(store, record.data, record.index)),
190
- selectRange: e.shiftKey,
191
- selectOptions: {
192
- toggle: e.ctrlKey && !e.shiftKey,
193
- add: e.ctrlKey && e.shiftKey,
194
- },
195
- cellIndex: this.getCellIndex(e),
196
- });
197
- }
198
-
199
- shouldComponentUpdate(props, state) {
200
- return (
201
- props.shouldUpdate !== false ||
202
- props.record != this.props.record ||
203
- props.cursor != this.props.cursor ||
204
- props.selected != this.props.selected ||
205
- props.isBeingDragged != this.props.isBeingDragged ||
206
- props.cursorIndex !== this.props.cursorIndex ||
207
- props.cursorCellIndex !== this.props.cursorCellIndex ||
208
- props.cellEdit !== this.props.cellEdit ||
209
- props.dimensionsVersion !== this.props.dimensionsVersion ||
210
- props.isDraggedOver !== this.props.isDraggedOver ||
211
- state !== this.state
212
- );
213
- }
214
-
215
- compontentWillUnmount() {
216
- this.unsubscribeHoverSync && this.unsubscribeHoverSync();
217
- }
218
-
219
- componentDidMount() {
220
- let { grid } = this.props;
221
- if (grid.hoverSync) {
222
- this.unsubscribeHoverSync = grid.hoverSync.subscribe(grid.widget.hoverChannel, (hoverId) => {
223
- let hover = hoverId === this.props.instance.data.hoverId;
224
- if (!this.state || hover !== this.state.hover) this.setState({ hover });
225
- });
226
- }
227
- }
228
- }
1
+ import { preventFocusOnTouch, unfocusElement } from "../../ui/FocusManager";
2
+ import { VDOM } from "../../ui/Widget";
3
+ import { closest } from "../../util/DOM";
4
+ import { isTouchEvent } from "../../util/isTouchEvent";
5
+ import { KeyCode } from "../../util/KeyCode";
6
+ import { ValidationGroup } from "../../widgets/form/ValidationGroup";
7
+ import { ddDetect, ddMouseDown, ddMouseUp, isDragHandleEvent } from "../drag-drop/ops";
8
+ import { GridRowLine } from "./GridRowLine";
9
+
10
+ export class GridRow extends ValidationGroup {
11
+ declareData(...args) {
12
+ super.declareData(...args, {
13
+ hoverId: undefined,
14
+ });
15
+ }
16
+
17
+ init() {
18
+ this.items = [];
19
+ for (let i = 0; i < 10; i++) {
20
+ if (this["line" + i])
21
+ this.items.push(
22
+ GridRowLine.create(this["line" + i], {
23
+ recordName: this.recordName,
24
+ }),
25
+ );
26
+ }
27
+ super.init();
28
+ }
29
+
30
+ explore(context, instance) {
31
+ context.push("dragHandles", (instance.dragHandles = []));
32
+ super.explore(context, instance);
33
+ }
34
+
35
+ exploreCleanup(context, instance) {
36
+ super.exploreCleanup(context, instance);
37
+ context.pop("dragHandles");
38
+ }
39
+ }
40
+
41
+ GridRow.prototype.styled = true; //styles used on the wrapper component
42
+
43
+ export class GridRowComponent extends VDOM.Component {
44
+ constructor(props) {
45
+ super(props);
46
+ this.onMouseMove = this.onMouseMove.bind(this);
47
+ this.onMouseDown = this.onMouseDown.bind(this);
48
+ this.onMouseLeave = this.onMouseLeave.bind(this);
49
+ this.onClick = this.onClick.bind(this);
50
+ this.onKeyDown = this.onKeyDown.bind(this);
51
+
52
+ let { grid, instance } = props;
53
+
54
+ if (grid.widget.onRowDoubleClick)
55
+ this.onDoubleClick = (e) => {
56
+ grid.invoke("onRowDoubleClick", e, instance);
57
+ };
58
+
59
+ if (grid.widget.cellEditable)
60
+ this.onDoubleClick = (e) => {
61
+ this.props.parent.moveCursor(this.props.cursorIndex, {
62
+ cellEdit: true,
63
+ });
64
+ e.preventDefault(); //prevent text selection
65
+ };
66
+
67
+ if (grid.widget.onRowContextMenu)
68
+ this.onRowContextMenu = (e) => {
69
+ grid.invoke("onRowContextMenu", e, instance);
70
+ };
71
+ }
72
+
73
+ render() {
74
+ let { className, dragSource, instance, record, useTrTag, children } = this.props;
75
+ let { data, widget } = instance;
76
+ let { CSS } = widget;
77
+ let move, up, keyDown, leave;
78
+
79
+ if (dragSource || data.hoverId != null) {
80
+ move = this.onMouseMove;
81
+ up = ddMouseUp;
82
+ }
83
+
84
+ if (data.hoverId != null) {
85
+ leave = this.onMouseLeave;
86
+ }
87
+
88
+ if (widget.onRowClick) keyDown = this.onKeyDown;
89
+
90
+ return VDOM.createElement(
91
+ useTrTag ? "tr" : "tbody",
92
+ {
93
+ className: CSS.expand(data.classNames, className, this.state && this.state.hover && CSS.state("hover")),
94
+ style: data.style,
95
+ onClick: this.onClick,
96
+ onDoubleClick: this.onDoubleClick,
97
+ onTouchStart: this.onMouseDown,
98
+ onMouseDown: this.onMouseDown,
99
+ onTouchMove: move,
100
+ onMouseMove: move,
101
+ onMouseLeave: leave,
102
+ onTouchEnd: up,
103
+ onMouseUp: up,
104
+ onKeyDown: keyDown,
105
+ onContextMenu: this.onRowContextMenu,
106
+ "data-record-key": record.key,
107
+ },
108
+ children,
109
+ );
110
+ }
111
+
112
+ onMouseDown(e) {
113
+ let { grid, record, instance, parent, cursorIndex } = this.props;
114
+
115
+ if (this.props.dragSource) {
116
+ ddMouseDown(e);
117
+ if (isDragHandleEvent(e) || instance.dragHandles.length == 0) {
118
+ e.preventDefault();
119
+ e.stopPropagation();
120
+
121
+ //close context menu
122
+ unfocusElement(e.target, false);
123
+ }
124
+ }
125
+
126
+ let { store, widget } = grid;
127
+
128
+ if (widget.selectable) preventFocusOnTouch(e);
129
+
130
+ parent.moveCursor(cursorIndex, {
131
+ select:
132
+ !isTouchEvent() &&
133
+ (e.shiftKey || e.ctrlKey || !widget.selection.isSelected(store, record.data, record.index)),
134
+ selectRange: e.shiftKey,
135
+ selectOptions: {
136
+ toggle: e.ctrlKey && !e.shiftKey,
137
+ add: e.ctrlKey && e.shiftKey,
138
+ },
139
+ cellIndex: this.getCellIndex(e),
140
+ });
141
+
142
+ if (e.shiftKey && !isTouchEvent()) e.preventDefault();
143
+ }
144
+
145
+ onMouseMove(e) {
146
+ let { grid, instance, parent, record } = this.props;
147
+ if (ddDetect(e) && (isDragHandleEvent(e) || instance.dragHandles.length == 0)) parent.beginDragDrop(e, record);
148
+ if (grid.hoverSync && instance.data.hoverId != null)
149
+ grid.hoverSync.report(grid.widget.hoverChannel, instance.data.hoverId, true);
150
+ }
151
+
152
+ onMouseLeave(e) {
153
+ let { grid, instance } = this.props;
154
+ if (grid.hoverSync && instance.data.hoverId != null)
155
+ grid.hoverSync.report(grid.widget.hoverChannel, instance.data.hoverId, false);
156
+ }
157
+
158
+ getCellIndex(e) {
159
+ let td = closest(e.target, (node) => node.tagName == "TD");
160
+ if (td)
161
+ return (
162
+ (this.props.fixed ? 0 : this.props.grid.fixedColumnCount) +
163
+ Array.from(td.parentElement.children).indexOf(td)
164
+ );
165
+ return -1;
166
+ }
167
+
168
+ onKeyDown(e) {
169
+ let { grid, instance } = this.props;
170
+
171
+ if (e.keyCode == KeyCode.enter && grid.invoke("onRowClick", e, instance) === false) {
172
+ e.stopPropagation();
173
+ }
174
+ }
175
+
176
+ onClick(e) {
177
+ let { grid, record, instance, parent, cursorIndex } = this.props;
178
+ let { store, widget } = grid;
179
+
180
+ if (grid.widget.onRowClick) {
181
+ if (grid.invoke("onRowClick", e, instance) === false) return;
182
+ }
183
+
184
+ e.stopPropagation();
185
+
186
+ parent.moveCursor(cursorIndex, {
187
+ select:
188
+ isTouchEvent() ||
189
+ (!e.shiftKey && !e.ctrlKey && widget.selection.isSelected(store, record.data, record.index)),
190
+ selectRange: e.shiftKey,
191
+ selectOptions: {
192
+ toggle: e.ctrlKey && !e.shiftKey,
193
+ add: e.ctrlKey && e.shiftKey,
194
+ },
195
+ cellIndex: this.getCellIndex(e),
196
+ });
197
+ }
198
+
199
+ shouldComponentUpdate(props, state) {
200
+ return (
201
+ props.shouldUpdate !== false ||
202
+ props.record != this.props.record ||
203
+ props.cursor != this.props.cursor ||
204
+ props.selected != this.props.selected ||
205
+ props.isBeingDragged != this.props.isBeingDragged ||
206
+ props.cursorIndex !== this.props.cursorIndex ||
207
+ props.cursorCellIndex !== this.props.cursorCellIndex ||
208
+ props.cellEdit !== this.props.cellEdit ||
209
+ props.dimensionsVersion !== this.props.dimensionsVersion ||
210
+ props.isDraggedOver !== this.props.isDraggedOver ||
211
+ state !== this.state
212
+ );
213
+ }
214
+
215
+ compontentWillUnmount() {
216
+ this.unsubscribeHoverSync && this.unsubscribeHoverSync();
217
+ }
218
+
219
+ componentDidMount() {
220
+ let { grid } = this.props;
221
+ if (grid.hoverSync) {
222
+ this.unsubscribeHoverSync = grid.hoverSync.subscribe(grid.widget.hoverChannel, (hoverId) => {
223
+ let hover = hoverId === this.props.instance.data.hoverId;
224
+ if (!this.state || hover !== this.state.hover) this.setState({ hover });
225
+ });
226
+ }
227
+ }
228
+ }
@@ -1,23 +1,23 @@
1
- import * as Cx from "../../core";
2
-
3
- interface TreeNodeProps extends Cx.WidgetProps {
4
- level?: Cx.NumberProp;
5
- expanded?: Cx.BooleanProp;
6
- leaf?: Cx.BooleanProp;
7
- text?: Cx.StringProp;
8
- loading?: Cx.BooleanProp;
9
- icon?: Cx.StringProp;
10
-
11
- itemIcon?: Cx.StringProp;
12
- leafIcon?: Cx.StringProp;
13
- loadingIcon?: string;
14
- folderIcon?: Cx.StringProp;
15
- openFolderIcon?: Cx.StringProp;
16
-
17
- /** Base CSS class to be applied to the element. Defaults to 'treenode'. */
18
- baseClass?: string;
19
- hideIcon?: boolean;
20
- hideArrow?: Cx.BooleanProp;
21
- }
22
-
23
- export class TreeNode extends Cx.Widget<TreeNodeProps> {}
1
+ import * as Cx from "../../core";
2
+
3
+ interface TreeNodeProps extends Cx.WidgetProps {
4
+ level?: Cx.NumberProp;
5
+ expanded?: Cx.BooleanProp;
6
+ leaf?: Cx.BooleanProp;
7
+ text?: Cx.StringProp;
8
+ loading?: Cx.BooleanProp;
9
+ icon?: Cx.StringProp;
10
+
11
+ itemIcon?: Cx.StringProp;
12
+ leafIcon?: Cx.StringProp;
13
+ loadingIcon?: string;
14
+ folderIcon?: Cx.StringProp;
15
+ openFolderIcon?: Cx.StringProp;
16
+
17
+ /** Base CSS class to be applied to the element. Defaults to 'treenode'. */
18
+ baseClass?: string;
19
+ hideIcon?: boolean;
20
+ hideArrow?: Cx.BooleanProp;
21
+ }
22
+
23
+ export class TreeNode extends Cx.Widget<TreeNodeProps> {}