cx 25.6.3 → 25.9.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 (104) hide show
  1. package/dist/manifest.js +684 -684
  2. package/dist/widgets.js +19 -3
  3. package/package.json +1 -1
  4. package/src/charts/Legend.d.ts +45 -45
  5. package/src/charts/LegendEntry.js +128 -128
  6. package/src/charts/LegendEntry.scss +27 -27
  7. package/src/charts/Marker.d.ts +1 -1
  8. package/src/charts/MarkerLine.d.ts +25 -27
  9. package/src/charts/PieChart.d.ts +92 -92
  10. package/src/charts/RangeMarker.js +159 -159
  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.js +611 -611
  18. package/src/charts/helpers/SnapPointFinder.js +69 -69
  19. package/src/data/Binding.spec.js +69 -69
  20. package/src/data/ExposedValueView.d.ts +19 -19
  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/Repeater.d.ts +61 -61
  37. package/src/ui/index.d.ts +42 -42
  38. package/src/ui/layout/ContentPlaceholder.d.ts +19 -19
  39. package/src/ui/layout/ContentPlaceholder.js +105 -105
  40. package/src/ui/layout/ContentPlaceholder.spec.js +579 -579
  41. package/src/ui/layout/LabelsTopLayout.js +134 -134
  42. package/src/util/Format.js +270 -270
  43. package/src/util/date/encodeDate.d.ts +1 -1
  44. package/src/util/date/encodeDate.js +8 -8
  45. package/src/util/date/encodeDateWithTimezoneOffset.d.ts +1 -1
  46. package/src/util/date/index.d.ts +11 -11
  47. package/src/util/date/index.js +11 -11
  48. package/src/util/date/parseDateInvariant.d.ts +3 -3
  49. package/src/util/date/parseDateInvariant.js +20 -20
  50. package/src/util/getSearchQueryPredicate.js +59 -59
  51. package/src/util/index.d.ts +51 -51
  52. package/src/util/index.js +54 -54
  53. package/src/util/isFunction.d.ts +1 -1
  54. package/src/util/isValidIdentifierName.d.ts +1 -1
  55. package/src/util/isValidIdentifierName.js +5 -5
  56. package/src/util/isValidIdentifierName.spec.js +33 -33
  57. package/src/util/scss/add-rules.scss +38 -38
  58. package/src/widgets/CxCredit.scss +37 -37
  59. package/src/widgets/HighlightedSearchText.js +36 -36
  60. package/src/widgets/HighlightedSearchText.scss +18 -18
  61. package/src/widgets/List.scss +91 -91
  62. package/src/widgets/Sandbox.d.ts +18 -18
  63. package/src/widgets/Sandbox.js +65 -65
  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/NumberField.js +459 -459
  76. package/src/widgets/form/NumberField.scss +61 -61
  77. package/src/widgets/form/Radio.scss +121 -121
  78. package/src/widgets/form/Select.scss +99 -99
  79. package/src/widgets/form/Slider.scss +118 -118
  80. package/src/widgets/form/Switch.scss +140 -140
  81. package/src/widgets/form/TextArea.js +12 -3
  82. package/src/widgets/form/TextArea.scss +43 -43
  83. package/src/widgets/form/TextField.js +290 -290
  84. package/src/widgets/form/TextField.scss +55 -55
  85. package/src/widgets/form/UploadButton.d.ts +34 -34
  86. package/src/widgets/form/variables.scss +353 -353
  87. package/src/widgets/grid/Grid.d.ts +442 -442
  88. package/src/widgets/grid/Grid.js +10 -2
  89. package/src/widgets/grid/GridRow.js +228 -228
  90. package/src/widgets/grid/TreeNode.d.ts +23 -23
  91. package/src/widgets/grid/TreeNode.scss +88 -88
  92. package/src/widgets/grid/variables.scss +133 -133
  93. package/src/widgets/nav/LinkButton.js +128 -128
  94. package/src/widgets/nav/Menu.scss +74 -74
  95. package/src/widgets/overlay/Dropdown.js +612 -612
  96. package/src/widgets/overlay/FlyweightTooltipTracker.js +39 -39
  97. package/src/widgets/overlay/Overlay.d.ts +73 -73
  98. package/src/widgets/overlay/Window.js +202 -202
  99. package/src/widgets/overlay/captureMouse.js +124 -124
  100. package/src/widgets/overlay/createHotPromiseWindowFactory.d.ts +18 -18
  101. package/src/widgets/overlay/createHotPromiseWindowFactory.js +56 -56
  102. package/src/widgets/overlay/index.d.ts +11 -11
  103. package/src/widgets/overlay/index.js +11 -11
  104. 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)
@@ -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",
@@ -852,7 +854,10 @@ export class Grid extends Container {
852
854
  if (data.sorters[0].direction == "ASC" && (!this.clearableSort || direction == "ASC")) direction = "DESC";
853
855
  else if (data.sorters[0].direction == "DESC" && (!this.clearableSort || direction == "DESC"))
854
856
  direction = "ASC";
855
- else direction = null;
857
+ else {
858
+ direction = null;
859
+ instance.state.disableDefaultSort = true;
860
+ }
856
861
  }
857
862
 
858
863
  let sorters = direction
@@ -2454,6 +2459,7 @@ class GridComponent extends VDOM.Component {
2454
2459
  headerHeight = this.dom.fixedHeader.offsetHeight;
2455
2460
  this.dom.scroller.style.marginTop = `${headerHeight}px`;
2456
2461
  if (this.dom.fixedScroller) this.dom.fixedScroller.style.marginTop = `${headerHeight}px`;
2462
+ else if (this.dom.fixedHeader.style.left != null) this.dom.fixedHeader.style.left = null;
2457
2463
  } else {
2458
2464
  this.dom.scroller.style.marginTop = 0;
2459
2465
  if (this.dom.fixedScroller) this.dom.fixedScroller.style.marginTop = 0;
@@ -2506,6 +2512,7 @@ class GridComponent extends VDOM.Component {
2506
2512
  }
2507
2513
 
2508
2514
  if (this.dom.fixedScroller) this.dom.fixedFooter.style.left = `${this.dom.fixedScroller.offsetWidth}px`;
2515
+ else if (this.dom.fixedFooter.style.left != null) this.dom.fixedFooter.style.left = null;
2509
2516
  }
2510
2517
 
2511
2518
  this.dom.scroller.style.marginBottom = `${footerHeight}px`;
@@ -2598,6 +2605,7 @@ class GridComponent extends VDOM.Component {
2598
2605
  instance.buffer.totalRecordCount = 0;
2599
2606
  instance.buffer.page = 1;
2600
2607
  this.prevFetchRecordsState = null;
2608
+ this.loading = false;
2601
2609
  }
2602
2610
  }
2603
2611
 
@@ -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> {}