@refinitiv-ui/efx-grid 6.0.18 → 6.0.20

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. package/lib/column-format-dialog/themes/elemental/dark/column-format-dialog.js +1 -1
  2. package/lib/column-format-dialog/themes/elemental/dark/es5/all-elements.js +1 -1
  3. package/lib/column-format-dialog/themes/elemental/light/column-format-dialog.js +1 -1
  4. package/lib/column-format-dialog/themes/elemental/light/es5/all-elements.js +1 -1
  5. package/lib/column-format-dialog/themes/halo/dark/column-format-dialog.js +1 -1
  6. package/lib/column-format-dialog/themes/halo/dark/es5/all-elements.js +1 -1
  7. package/lib/column-format-dialog/themes/halo/light/column-format-dialog.js +1 -1
  8. package/lib/column-format-dialog/themes/halo/light/es5/all-elements.js +1 -1
  9. package/lib/column-format-dialog/themes/luna/default/column-format-dialog.js +1 -1
  10. package/lib/column-format-dialog/themes/luna/default/es5/all-elements.js +1 -1
  11. package/lib/column-format-dialog/themes/solar/charcoal/column-format-dialog.js +1 -1
  12. package/lib/column-format-dialog/themes/solar/charcoal/es5/all-elements.js +1 -1
  13. package/lib/column-format-dialog/themes/solar/pearl/column-format-dialog.js +1 -1
  14. package/lib/column-format-dialog/themes/solar/pearl/es5/all-elements.js +1 -1
  15. package/lib/column-selection-dialog/lib/column-selection-dialog.d.ts +2 -1
  16. package/lib/column-selection-dialog/lib/column-selection-dialog.js +89 -8
  17. package/lib/column-selection-dialog/themes/elemental/dark/column-selection-dialog.js +1 -1
  18. package/lib/column-selection-dialog/themes/elemental/dark/es5/all-elements.js +1 -1
  19. package/lib/column-selection-dialog/themes/elemental/light/column-selection-dialog.js +1 -1
  20. package/lib/column-selection-dialog/themes/elemental/light/es5/all-elements.js +1 -1
  21. package/lib/column-selection-dialog/themes/halo/dark/column-selection-dialog.js +1 -1
  22. package/lib/column-selection-dialog/themes/halo/dark/es5/all-elements.js +1 -1
  23. package/lib/column-selection-dialog/themes/halo/light/column-selection-dialog.js +1 -1
  24. package/lib/column-selection-dialog/themes/halo/light/es5/all-elements.js +1 -1
  25. package/lib/column-selection-dialog/themes/solar/charcoal/column-selection-dialog.js +1 -1
  26. package/lib/column-selection-dialog/themes/solar/charcoal/es5/all-elements.js +1 -1
  27. package/lib/column-selection-dialog/themes/solar/pearl/column-selection-dialog.js +1 -1
  28. package/lib/column-selection-dialog/themes/solar/pearl/es5/all-elements.js +1 -1
  29. package/lib/core/dist/core.js +40 -23
  30. package/lib/core/dist/core.min.js +1 -1
  31. package/lib/core/es6/data/DataView.d.ts +4 -0
  32. package/lib/core/es6/data/DataView.js +19 -1
  33. package/lib/core/es6/data/SegmentCollection.js +20 -8
  34. package/lib/core/es6/grid/Core.js +1 -1
  35. package/lib/core/es6/grid/components/Cell.js +0 -13
  36. package/lib/filter-dialog/lib/checkbox-list.js +148 -81
  37. package/lib/filter-dialog/lib/filter-dialog.js +170 -139
  38. package/lib/filter-dialog/themes/elemental/dark/checkbox-list.js +1 -1
  39. package/lib/filter-dialog/themes/elemental/dark/es5/all-elements.js +2 -2
  40. package/lib/filter-dialog/themes/elemental/dark/filter-dialog.js +1 -1
  41. package/lib/filter-dialog/themes/elemental/light/checkbox-list.js +1 -1
  42. package/lib/filter-dialog/themes/elemental/light/es5/all-elements.js +2 -2
  43. package/lib/filter-dialog/themes/elemental/light/filter-dialog.js +1 -1
  44. package/lib/filter-dialog/themes/halo/dark/checkbox-list.js +1 -1
  45. package/lib/filter-dialog/themes/halo/dark/es5/all-elements.js +2 -2
  46. package/lib/filter-dialog/themes/halo/dark/filter-dialog.js +1 -1
  47. package/lib/filter-dialog/themes/halo/light/checkbox-list.js +1 -1
  48. package/lib/filter-dialog/themes/halo/light/es5/all-elements.js +2 -2
  49. package/lib/filter-dialog/themes/halo/light/filter-dialog.js +1 -1
  50. package/lib/filter-dialog/themes/solar/charcoal/checkbox-list.js +1 -1
  51. package/lib/filter-dialog/themes/solar/charcoal/es5/all-elements.js +2 -2
  52. package/lib/filter-dialog/themes/solar/charcoal/filter-dialog.js +1 -1
  53. package/lib/filter-dialog/themes/solar/pearl/checkbox-list.js +1 -1
  54. package/lib/filter-dialog/themes/solar/pearl/es5/all-elements.js +2 -2
  55. package/lib/filter-dialog/themes/solar/pearl/filter-dialog.js +1 -1
  56. package/lib/grid/index.js +1 -1
  57. package/lib/rt-grid/dist/rt-grid.js +22 -23
  58. package/lib/rt-grid/dist/rt-grid.min.js +1 -1
  59. package/lib/tr-grid-checkbox/es6/Checkbox.js +63 -12
  60. package/lib/tr-grid-column-grouping/es6/ColumnGrouping.js +70 -110
  61. package/lib/tr-grid-filter-input/es6/FilterInput.d.ts +1 -1
  62. package/lib/tr-grid-filter-input/es6/FilterInput.js +10 -9
  63. package/lib/tr-grid-pagination/es6/Pagination.d.ts +1 -0
  64. package/lib/tr-grid-pagination/es6/Pagination.js +35 -29
  65. package/lib/tr-grid-row-dragging/es6/RowDragging.d.ts +15 -14
  66. package/lib/tr-grid-row-dragging/es6/RowDragging.js +44 -6
  67. package/lib/tr-grid-row-grouping/es6/RowGrouping.d.ts +5 -0
  68. package/lib/tr-grid-row-grouping/es6/RowGrouping.js +30 -0
  69. package/lib/tr-grid-util/es6/Popup.js +5 -1
  70. package/lib/types/es6/Core/data/DataView.d.ts +4 -0
  71. package/lib/types/es6/FilterInput.d.ts +1 -0
  72. package/lib/types/es6/Pagination.d.ts +1 -0
  73. package/lib/types/es6/RealtimeGrid/Grid.d.ts +1 -1
  74. package/lib/types/es6/RowDragging.d.ts +15 -14
  75. package/lib/types/es6/RowGrouping.d.ts +5 -0
  76. package/lib/versions.json +10 -10
  77. package/package.json +1 -1
@@ -188,6 +188,10 @@ declare class DataView extends EventDispatcher {
188
188
 
189
189
  public enableContentAsHeader(bool?: boolean|null): void;
190
190
 
191
+ public setDefaultCollapse(collapse?: boolean|null): void;
192
+
193
+ public getDefaultCollapse(): boolean;
194
+
191
195
  public getVisibleRowCount(): number;
192
196
 
193
197
  public isRowDataInGroup(rowData: any, groupID?: string|null): boolean;
@@ -1054,7 +1054,7 @@ DataView.prototype.prevPage = DataView.prototype.previousPage;
1054
1054
  * @fires DataView#dataChanged
1055
1055
  */
1056
1056
  DataView.prototype.lastPage = function () {
1057
- return this.gotoPage(this._lastPageIndex - 1);
1057
+ return this.gotoPage(this._lastPageIndex);
1058
1058
  };
1059
1059
  /** Goes to the first page
1060
1060
  * @public
@@ -1760,6 +1760,20 @@ DataView.prototype.isCollapsed = function() {
1760
1760
  DataView.prototype.enableContentAsHeader = function(bool) {
1761
1761
  this._shared.contentAsHeader = bool !== false;
1762
1762
  };
1763
+ /** set default collapse when new groups added
1764
+ * @public
1765
+ * @param {boolean=} collapse=false, if enable it, it will be set collapsing by default
1766
+ */
1767
+ DataView.prototype.setDefaultCollapse = function(collapse) {
1768
+ this._shared.defaultCollapse = !!collapse;
1769
+ };
1770
+ /** get default collapse when new groups added
1771
+ * @public
1772
+ * @return {boolean}
1773
+ */
1774
+ DataView.prototype.getDefaultCollapse = function() {
1775
+ return !!this._shared.defaultCollapse; // it can be null, convert to boolean
1776
+ };
1763
1777
  /** @private
1764
1778
  * @return {?Array.<string>}
1765
1779
  */
@@ -3678,6 +3692,10 @@ DataView.prototype._addGroup = function (value) {
3678
3692
  }
3679
3693
  }
3680
3694
  member = new DataView();
3695
+ var collapsed = this._shared.defaultCollapse;
3696
+ if(collapsed != null) {
3697
+ member._collapsed = collapsed;
3698
+ }
3681
3699
  member._groupId = groupId;
3682
3700
  if(typeof value == "string") { // TODO: Raw value should not always be a string
3683
3701
  if(value == "null") {
@@ -440,26 +440,38 @@ SegmentCollection.prototype.getSegmentValues = function(rids) {
440
440
  var prevSegment = null;
441
441
  var segmentValues = new Array(rowCount);
442
442
  var segmentVal = 0;
443
+ var highestVal = -10;
443
444
  var offset = 0;
444
445
  for(var r = 0; r < rowCount; ++r) {
445
446
  var rid = rids[r];
446
447
  curSegment = segmentSeparators[rid];
447
- if(curSegment) {
448
+ if(curSegment) { // segment separator
449
+ if(prevSegment !== curSegment) {
450
+ prevSegment = curSegment;
451
+ segmentVal = curSegment.getOrder() * 100;
452
+ if(segmentVal > highestVal) {
453
+ highestVal = segmentVal;
454
+ }
455
+ }
448
456
  offset = 0;
449
457
  } else {
450
458
  var parentId = childToSegmentId[rid];
451
- if(parentId) {
459
+ if(parentId) { // segment member
452
460
  curSegment = segmentSeparators[parentId];
461
+ if(prevSegment !== curSegment) {
462
+ prevSegment = curSegment;
463
+ segmentVal = curSegment.getOrder() * 100;
464
+ if(segmentVal > highestVal) {
465
+ highestVal = segmentVal;
466
+ }
467
+ }
453
468
  offset = 1;
454
- } else {
455
- offset = prevSegment ? 10 : 0;
469
+ } else { // row outside of segments
470
+ segmentVal = highestVal;
471
+ offset = 10;
456
472
  }
457
473
  }
458
474
 
459
- if(curSegment && prevSegment !== curSegment) {
460
- prevSegment = curSegment;
461
- segmentVal = curSegment.getOrder() * 100;
462
- }
463
475
  segmentValues[r] = segmentVal + offset;
464
476
  }
465
477
 
@@ -528,7 +528,7 @@ Core.prototype._rowHeightTimerId = 0;
528
528
  * @return {string}
529
529
  */
530
530
  Core.getVersion = function () {
531
- return "5.1.27";
531
+ return "5.1.31";
532
532
  };
533
533
  /** {@link ElementWrapper#dispose}
534
534
  * @override
@@ -13,8 +13,6 @@ import CellFloatingPanel from "../components/CellFloatingPanel.js";
13
13
  * @param {ILayoutGrid=} opt_section Parent section
14
14
  */
15
15
  var Cell = function (opt_element, opt_section) {
16
- this._onFocus = this._onFocus.bind(this);
17
-
18
16
  this._id = Cell._runningId++;
19
17
  this._element = document.createElement("div");
20
18
  this._element.className = "cell";
@@ -358,7 +356,6 @@ Cell.prototype.initialize = function () {
358
356
  this._aligner = document.createElement("div");
359
357
  } else {
360
358
  this._aligner = document.createElement("button");
361
- this._aligner.addEventListener('focus', this._onFocus);
362
359
  }
363
360
  this._aligner.className = "valigner";
364
361
  if(this._frontIcon) {
@@ -724,16 +721,6 @@ Cell.prototype._updateDisplay = function () {
724
721
  this._element.style.display = "none";
725
722
  }
726
723
  };
727
-
728
- /** @private
729
- * @param {Event} e
730
- */
731
- Cell.prototype._onFocus = function (e) {
732
- if (!this._section) return;
733
-
734
- var core = this._section._getContext();
735
- core.getElement().focus({ preventScroll: true });
736
- };
737
724
  //#endregion Private Methods
738
725
 
739
726
 
@@ -5,59 +5,72 @@ import "@refinitiv-ui/elements/item";
5
5
  import "@refinitiv-ui/elements/checkbox";
6
6
  import translation from "./locale/translation.js";
7
7
 
8
- /**
8
+ /** @type {number}
9
9
  * @private
10
- * @param {Object=} states
10
+ * @constant
11
+ */
12
+ const ITEM_LIMIT = 500;
13
+
14
+ /** @private
15
+ * @function
16
+ * @param {*=} val
11
17
  * @return {string}
12
18
  */
13
- const _getStateText = function(states) {
14
- if(typeof states === "string") {
15
- return states;
16
- } else if(states) {
17
- return states.title || states.label || "";
19
+ const _toLabelText = function(val) {
20
+ if(typeof val === "string") {
21
+ return val;
22
+ } else if(val) {
23
+ return val.title || val.label || "";
18
24
  }
19
25
  return "";
20
26
  };
21
- /**
22
- * @private
23
- * @param {Element} item
24
- * @param {Object=} states
27
+ /** @private
28
+ * @function
29
+ * @param {*} val
30
+ * @param {number} idx
31
+ * @return {!Object}
25
32
  */
26
- const _updateItemStates = function(item, states) {
27
- item._label.textContent = _getStateText(states);
28
- item._checkbox.checked = (states && states.checked) ? true : false;
33
+ const _toItemStates = function(val, idx) {
34
+ return {
35
+ label: _toLabelText(val),
36
+ checked: (val && val.checked) ? true : false,
37
+ index: idx,
38
+ elem: null
39
+ };
29
40
  };
30
- /**
31
- * @private
32
- * @param {Array.<Element>} ary Array of Items
33
- * @param {(string|Function)=} inputFilter
34
- * @return {!Array} Array containing filtered data objects
41
+ /** @private
42
+ * @function
43
+ * @param {!Object} state
44
+ * @param {*} val
35
45
  */
36
- const _filter = function(ary, inputFilter) {
37
- var len = ary ? ary.length : 0;
38
- if(!len || !inputFilter) {
39
- return ary; // No new copy is generated
46
+ const _assignItemState = function(state, val) {
47
+ state.label = _toLabelText(val);
48
+ state.checked = (val && val.checked) ? true : false;
49
+ if(state.elem) {
50
+ _updateElement(state.elem, state.label, state.checked);
40
51
  }
41
-
42
- var filterMethod, ctx;
43
- if(typeof inputFilter === "function") {
44
- filterMethod = inputFilter;
45
- ctx = ary;
46
- } else {
47
- filterMethod = _caseInsensitiveFilter;
48
- ctx = (inputFilter + "").toLowerCase(); // Convert to lowercased string for case insensitive comparison
52
+ };
53
+ /** @private
54
+ * @function
55
+ * @param {!Object} state
56
+ * @return {boolean}
57
+ */
58
+ const _getCheckedState = function(state) {
59
+ return state.elem ? state.elem._checkbox.checked : state.checked;
60
+ };
61
+ /** @private
62
+ * @function
63
+ * @param {!Element} elem
64
+ * @param {string} txt
65
+ * @param {boolean} checked
66
+ */
67
+ const _updateElement = function(elem, txt, checked) {
68
+ if(elem._label.textContent !== txt) {
69
+ elem._label.textContent = txt;
49
70
  }
50
-
51
- var filteredList = [];
52
- for(var i = 0; i < len; ++i) {
53
- var elem = ary[i];
54
- var str = elem._label.textContent;
55
- if(filterMethod(str, i, ctx)) {
56
- filteredList.push(elem);
57
- }
71
+ if(elem._checkbox.checked !== checked) {
72
+ elem._checkbox.checked = checked;
58
73
  }
59
-
60
- return filteredList;
61
74
  };
62
75
  /** @private
63
76
  * @param {string} str
@@ -81,16 +94,19 @@ class CheckboxList extends BasicElement {
81
94
  constructor() {
82
95
  super();
83
96
 
84
- this.lang = "en";
85
- this._translation = translation;
86
97
  this.selectAll = this.selectAll.bind(this);
87
98
  this.deselectAll = this.deselectAll.bind(this);
88
99
  this._onItemClicked = this._onItemClicked.bind(this);
100
+ this._toItemElement = this._toItemElement.bind(this);
101
+ this._byLabelText = this._byLabelText.bind(this);
102
+
103
+ this.lang = "en";
104
+ this._translation = translation;
89
105
 
90
106
  this._config = {};
107
+ this._states = []; // Item states before filtering
91
108
  this._cachedItems = []; // To avoid repeatedly creating the same item element
92
109
  this._items = []; // Actual existing elements (filtered items)
93
- this._origItems = this._items; // Original items before being filtered
94
110
  this._inputFilter = null;
95
111
  }
96
112
 
@@ -152,38 +168,40 @@ class CheckboxList extends BasicElement {
152
168
 
153
169
  updated(changedProps) {
154
170
  if (changedProps.has("data")) {
155
- var list = this.data;
156
- var len = list ? list.length : 0;
157
-
171
+ var dataList = this.data;
172
+ var len = dataList ? dataList.length : 0;
158
173
  if (this._cachedItems.length < len) {
159
174
  this._cachedItems.length = len;
160
175
  }
161
- this._items = new Array(len);
162
-
163
- for (var i = 0; i < len; i++) {
164
- var item = this._cachedItems[i]; // ef-item
165
- if (!item) {
166
- item = this._cachedItems[i] = this._templateItemEl.cloneNode(true);
167
- item.addEventListener("click", this._onItemClicked);
168
-
169
- var itemContainer = item.firstChild; // div.item-container
170
- item._checkbox = itemContainer.firstChild; // ef-checkbox
171
- item._label = itemContainer.lastChild; // label
172
- }
173
- this._items[i] = item;
174
176
 
175
- _updateItemStates(item, list[i]);
176
- }
177
+ this._states = dataList.map(_toItemStates);
178
+ this._filterItems();
179
+ this._renderItems();
180
+ }
181
+ }
177
182
 
178
- if (this._inputFilter) {
179
- this._origItems = this._items;
180
- this._items = _filter(this._origItems, this._inputFilter);
181
- } else {
182
- this._origItems = this._items;
183
+ /** @private
184
+ * @param {!Object} state
185
+ * @return {!Element}
186
+ */
187
+ _toItemElement(state) {
188
+ var elem = state.elem;
189
+ if(!elem) {
190
+ var idx = state.index;
191
+ elem = this._cachedItems[idx];
192
+ if(!elem) {
193
+ elem = this._cachedItems[idx] = this._templateItemEl.cloneNode(true);
194
+ elem.addEventListener("click", this._onItemClicked);
195
+
196
+ var itemContainer = elem.firstChild; // div.item-container
197
+ elem._checkbox = itemContainer.firstChild; // ef-checkbox
198
+ elem._label = itemContainer.lastChild; // label
183
199
  }
184
200
 
185
- this._renderItems();
201
+ _updateElement(elem, state.label, state.checked);
202
+ state.elem = elem;
186
203
  }
204
+ return elem;
187
205
  }
188
206
  /**
189
207
  * @private
@@ -198,9 +216,11 @@ class CheckboxList extends BasicElement {
198
216
  while(container.lastChild) {
199
217
  container.removeChild(container.lastChild);
200
218
  }
201
- var len = this._items.length;
219
+
220
+ var ary = this._items;
221
+ var len = ary.length;
202
222
  for(var i = 0; i < len; ++i) {
203
- container.appendChild(this._items[i]);
223
+ container.appendChild(ary[i]);
204
224
  }
205
225
  this._updateSelectAllState();
206
226
  }
@@ -228,9 +248,10 @@ class CheckboxList extends BasicElement {
228
248
  return;
229
249
  }
230
250
 
231
- var len = this._items.length;
251
+ var states = this._states;
252
+ var len = states.length;
232
253
  for(var i = 0; i < len; ++i) {
233
- _updateItemStates(this._items[i], this.data[i]);
254
+ _assignItemState(states[i], this.data[i]);
234
255
  }
235
256
 
236
257
  this._updateSelectAllState();
@@ -242,11 +263,13 @@ class CheckboxList extends BasicElement {
242
263
  */
243
264
  getSelectedItems() {
244
265
  var items = [];
245
- var len = this._items.length;
266
+ var states = this._states;
267
+ var len = states.length;
246
268
  for(var i = 0; i < len; ++i) {
247
- if(this._items[i]._checkbox.checked) {
269
+ var state = states[i];
270
+ if(_getCheckedState(state)) {
248
271
  items.push({
249
- title: this._items[i]._label.textContent,
272
+ title: state.label,
250
273
  index: i
251
274
  });
252
275
  }
@@ -260,9 +283,10 @@ class CheckboxList extends BasicElement {
260
283
  */
261
284
  selectAll(selected) {
262
285
  selected = selected !== false;
263
- var len = this._items.length;
286
+ var ary = this._items;
287
+ var len = ary.length;
264
288
  for(var i = 0; i < len; ++i) {
265
- this._items[i]._checkbox.checked = selected;
289
+ ary[i]._checkbox.checked = selected;
266
290
  }
267
291
  this._updateSelectAllState(selected);
268
292
  }
@@ -288,18 +312,60 @@ class CheckboxList extends BasicElement {
288
312
  dirty = true;
289
313
  }
290
314
  if(dirty) {
291
- this._items = _filter(this._origItems, this._inputFilter);
315
+ this._filterItems();
292
316
  this._renderItems();
293
317
  }
294
318
  }
295
319
 
320
+ /**
321
+ * @private
322
+ */
323
+ _filterItems() {
324
+ var states = this._states;
325
+ var len = states ? states.length : 0;
326
+ if(!len) {
327
+ this._items.length = 0;
328
+ return; // No new copy is generated
329
+ }
330
+
331
+ var inputFilter = this._inputFilter;
332
+ if(inputFilter) {
333
+ if(typeof inputFilter === "function") {
334
+ this._filterMethod = inputFilter;
335
+ this._filterCtx = states;
336
+ } else {
337
+ this._filterMethod = _caseInsensitiveFilter;
338
+ this._filterCtx = (inputFilter + "").toLowerCase(); // Convert to lowercased string for case insensitive comparison
339
+ }
340
+ states = states.filter(this._byLabelText);
341
+
342
+ this._filterMethod = null;
343
+ this._filterCtx = null;
344
+ }
345
+
346
+ if(states.length > ITEM_LIMIT) {
347
+ states = states.slice(0, ITEM_LIMIT);
348
+ }
349
+
350
+ this._items = states.map(this._toItemElement);
351
+ }
352
+ /**
353
+ * @private
354
+ * @param {Object} state
355
+ * @param {number} idx
356
+ * @return {boolean}
357
+ */
358
+ _byLabelText(state, idx) {
359
+ return this._filterMethod(state.label, idx, this._filterCtx);
360
+ }
361
+
296
362
  /**
297
363
  * @private
298
364
  * @param {Event} e
299
365
  */
300
366
  _onItemClicked(e) {
301
- var itemEl = e.currentTarget;
302
367
  if(e.target.tagName !== "EF-CHECKBOX") { // checkbox may already toggle its state
368
+ var itemEl = e.currentTarget;
303
369
  itemEl._checkbox.checked = !itemEl._checkbox.checked;
304
370
  }
305
371
  this._updateSelectAllState();
@@ -315,10 +381,11 @@ class CheckboxList extends BasicElement {
315
381
  }
316
382
 
317
383
  if(selected == null) {
318
- var len = this._items.length;
384
+ var ary = this._items;
385
+ var len = ary.length;
319
386
  selected = len ? false : true;
320
387
  for (var i = 0; i < len; i++) {
321
- if (this._items[i]._checkbox.checked) {
388
+ if (ary[i]._checkbox.checked) {
322
389
  selected = true;
323
390
  break;
324
391
  }