@refinitiv-ui/efx-grid 6.0.39 → 6.0.41

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. package/lib/column-selection-dialog/lib/column-selection-dialog.d.ts +2 -1
  2. package/lib/column-selection-dialog/lib/column-selection-dialog.js +23 -7
  3. package/lib/core/dist/core.js +39 -28
  4. package/lib/core/dist/core.min.js +1 -1
  5. package/lib/core/es6/grid/Core.js +34 -26
  6. package/lib/core/es6/grid/plugins/SortableTitlePlugin.js +5 -2
  7. package/lib/grid/index.js +1 -1
  8. package/lib/row-segmenting/es6/RowSegmenting.js +4 -4
  9. package/lib/rt-grid/dist/rt-grid.js +2191 -1780
  10. package/lib/rt-grid/dist/rt-grid.min.js +1 -1
  11. package/lib/rt-grid/es6/ColumnDefinition.d.ts +1 -0
  12. package/lib/rt-grid/es6/ColumnDefinition.js +7 -8
  13. package/lib/rt-grid/es6/Grid.d.ts +2 -0
  14. package/lib/rt-grid/es6/Grid.js +91 -30
  15. package/lib/rt-grid/es6/RowDefinition.d.ts +4 -5
  16. package/lib/rt-grid/es6/RowDefinition.js +103 -52
  17. package/lib/tr-grid-column-grouping/es6/ColumnGrouping.js +26 -40
  18. package/lib/tr-grid-contextmenu/es6/ContextMenu.d.ts +27 -27
  19. package/lib/tr-grid-contextmenu/es6/ContextMenu.js +97 -93
  20. package/lib/tr-grid-contextmenu/es6/MenuEventAPI.d.ts +3 -3
  21. package/lib/tr-grid-contextmenu/es6/MenuItem.d.ts +2 -2
  22. package/lib/tr-grid-contextmenu/es6/PopupMenu.d.ts +5 -5
  23. package/lib/tr-grid-in-cell-editing/es6/InCellEditing.js +30 -12
  24. package/lib/tr-grid-row-dragging/es6/RowDragging.js +2 -1
  25. package/lib/tr-grid-rowcoloring/es6/RowColoring.js +50 -18
  26. package/lib/tr-grid-util/es6/CellPainter.d.ts +2 -1
  27. package/lib/tr-grid-util/es6/CellPainter.js +6 -4
  28. package/lib/tr-grid-util/es6/ExpressionParser.d.ts +10 -0
  29. package/lib/tr-grid-util/es6/ExpressionParser.js +366 -0
  30. package/lib/tr-grid-util/es6/FilterBuilder.d.ts +10 -6
  31. package/lib/tr-grid-util/es6/FilterBuilder.js +264 -234
  32. package/lib/tr-grid-util/es6/FilterOperators.d.ts +3 -1
  33. package/lib/tr-grid-util/es6/FilterOperators.js +51 -2
  34. package/lib/tr-grid-util/es6/Util.d.ts +0 -3
  35. package/lib/tr-grid-util/es6/Util.js +0 -53
  36. package/lib/tr-grid-util/es6/formula/Formula.js +3 -3
  37. package/lib/types/es6/ColumnDragging.d.ts +51 -0
  38. package/lib/types/es6/ContextMenu.d.ts +27 -27
  39. package/lib/types/es6/Core/grid/plugins/SortableTitlePlugin.d.ts +3 -0
  40. package/lib/types/es6/ExtensionOptions.d.ts +2 -0
  41. package/lib/types/es6/Extensions.d.ts +3 -1
  42. package/lib/types/es6/MenuEventAPI.d.ts +3 -3
  43. package/lib/types/es6/MenuItem.d.ts +2 -2
  44. package/lib/types/es6/PopupMenu.d.ts +5 -5
  45. package/lib/types/es6/RealtimeGrid/ColumnDefinition.d.ts +1 -0
  46. package/lib/types/es6/RealtimeGrid/Grid.d.ts +2 -0
  47. package/lib/types/es6/RealtimeGrid/RowDefinition.d.ts +4 -5
  48. package/lib/types/es6/index.d.ts +1 -0
  49. package/lib/versions.json +10 -10
  50. package/package.json +1 -1
@@ -25,6 +25,7 @@ declare namespace ColumnDefinition {
25
25
  rowSorting?: boolean|null,
26
26
  sortable?: boolean|null,
27
27
  sort?: string|null,
28
+ sortOrder?: string|null,
28
29
  styles?: any,
29
30
  width?: number|null,
30
31
  minWidth?: number|null,
@@ -30,7 +30,8 @@ import Engine from "../../tr-grid-util/es6/formula/Engine.js";
30
30
  * @property {ColumnDefinition~SortLogic=} sorter=null Alias to `sortLogic`
31
31
  * @property {boolean=} rowSorting=null If set to true, RowDefinition object will be used for sorting comparison. If set to false, data from the given `field` will be used for sorting comparison.
32
32
  * @property {boolean=} sortable=true If disabled, the column cannot be sorted by user click
33
- * @property {string=} sort="" This column will be sorted at the initialization in the specified order (e.g. "asc", "desc")
33
+ * @property {string=} sort="" Deprecated Alias to `sortOrder`
34
+ * @property {string=} sortOrder="" The column can be sorted in ascending and descending order by specifying the order "a", "d". This option will sort the column when it is initialized or inserted at runtime.
34
35
  * @property {Object=} styles=null Key/value pair Object specifying CSS styles
35
36
  * @property {number=} width=NaN If specified, column will have a fixed width in pixel
36
37
  * @property {number=} minWidth=NaN If specified, column will have a minimum width in pixel
@@ -408,7 +409,7 @@ ColumnDefinition.prototype.initialize = function(columnOption) {
408
409
  }
409
410
 
410
411
  // Deprecate
411
- val = columnOption["sort"];
412
+ val = columnOption["sortOrder"] || columnOption["sort"];
412
413
  if(val) {
413
414
  this._initialOrder = val;
414
415
  }
@@ -658,11 +659,13 @@ ColumnDefinition.prototype.isScalable = function() {
658
659
  var colIndex = grid.getColumnIndex(this);
659
660
  return core.getColumnScalability(colIndex);
660
661
  };
661
- /** @public
662
- * @deprecated
662
+ /** Deprecated, this function will be return initial sort order of this column, The current sort state may be different from initial sort state.
663
+ * @public
664
+ * @deprecated
663
665
  * @return {string}
664
666
  */
665
667
  ColumnDefinition.prototype.getInitialSortOrder = function() {
668
+ // WARNING: This state is different from `sortOrder`, it is the state when grid is initialized.
666
669
  return this._initialOrder;
667
670
  };
668
671
  /** @public
@@ -766,10 +769,6 @@ ColumnDefinition.prototype.getConfigObject = function(colOptions) {
766
769
  obj["sortable"] = false;
767
770
  }
768
771
 
769
- if(this._initialOrder) {
770
- obj["sort"] = this._initialOrder;
771
- }
772
-
773
772
  var classes = this._classes;
774
773
  if(classes && classes.length > 0) {
775
774
  obj["className"] = classes.join(" ");
@@ -318,6 +318,8 @@ declare class Grid extends EventDispatcher {
318
318
 
319
319
  public logDV(opt_options?: any): void;
320
320
 
321
+ public replaceRow(rowRef: Grid.RowReference|null, rowOption?: any): any;
322
+
321
323
  }
322
324
 
323
325
  declare function borders(gridOptions?: any): any;
@@ -230,6 +230,45 @@ var compareNumber = function(rowDefA, rowDefB, sortOrder, fieldName) { // edit n
230
230
  return (rowDefA.getData(fieldName) - rowDefB.getData(fieldName)) * sortOrder; // for numeric comparison
231
231
  };
232
232
 
233
+ /**
234
+ * @private
235
+ * @param {string} rowDefA
236
+ * @param {string} rowDefB
237
+ * @param {string} sortOrder
238
+ * @return {number} The outcome of the value comparison
239
+ */
240
+ var _sortChildrenOfChain = function (rowDefA, rowDefB, sortOrder) {
241
+ var parentA = rowDefA.getParent();
242
+
243
+ if (!parentA) {
244
+ return 0;
245
+ }
246
+
247
+ var parentB = rowDefB.getParent();
248
+
249
+ if (!parentB) {
250
+ return 0;
251
+ }
252
+
253
+ if (parentA !== parentB) {
254
+ return 0;
255
+ }
256
+
257
+ var a = rowDefA.getData('CHILD_ORDER');
258
+
259
+ if (a == null) {
260
+ return 0;
261
+ }
262
+
263
+ var b = rowDefB.getData('CHILD_ORDER');
264
+
265
+ if (b == null) {
266
+ return 0;
267
+ }
268
+
269
+ return ( a - b ) * sortOrder;
270
+ };
271
+
233
272
  /** @private
234
273
  * @param {ColumnDefinition} colDef
235
274
  * @return {string}
@@ -258,6 +297,7 @@ var Grid = function(placeholder, config) {
258
297
  var t = this; // This is to primarily reduce file size
259
298
 
260
299
  t._onDataChanged = t._onDataChanged.bind(t);
300
+ t._onQuote2PostUpdate = t._onQuote2PostUpdate.bind(t);
261
301
  t._onDataComposed = t._onDataComposed.bind(t);
262
302
  t._onSubSegmentChanged = t._onSubSegmentChanged.bind(t);
263
303
  t._recalculateFormulas = t._recalculateFormulas.bind(t);
@@ -616,6 +656,7 @@ Grid.prototype.initSubscription = function() {
616
656
  this._subs = s;
617
657
  this._subs["start"]();
618
658
  this._dc.setSubscriptions(s);
659
+ this._subs.addEventListener("postUpdate", this._onQuote2PostUpdate);
619
660
 
620
661
  // TODO: Subscriptions should be registered per row.
621
662
  // However, chain subscription cannot be integrated with DataConnector in this current implementation.
@@ -1528,6 +1569,9 @@ Grid.prototype.replaceColumn = function (columnOption, colRef) {
1528
1569
  colConfig["hidden"] = false;
1529
1570
  }
1530
1571
 
1572
+ if(colConfig.id == null) {
1573
+ colConfig.id = colDef.getId(); // retain ID
1574
+ }
1531
1575
  this._grid.startBatch("reset");
1532
1576
  this.insertColumn(colConfig, colIndex);
1533
1577
  this.removeColumn(colIndex + 1); // remove existing column after insert
@@ -1678,12 +1722,6 @@ Grid.prototype.restoreColumns = function(columns) {
1678
1722
  }
1679
1723
  }
1680
1724
 
1681
- var sortingStates;
1682
- var removeLen = removingFields.length;
1683
- if(removeLen > 0 && this._stp) {
1684
- sortingStates = this._stp.getSortingStates().slice(); // We need to clone array for avoid object reference in remove column
1685
- }
1686
-
1687
1725
  this.removeColumns(removingFields);
1688
1726
 
1689
1727
  var keepingLen = keepingColumns.length;
@@ -1711,10 +1749,6 @@ Grid.prototype.restoreColumns = function(columns) {
1711
1749
  this._grid.freezeLayout(prevState);
1712
1750
  }
1713
1751
 
1714
- if(removeLen > 0 && this._stp) {
1715
- this._stp.sortColumns(sortingStates);
1716
- }
1717
-
1718
1752
  grid.reorderColumns(columnOrdering);
1719
1753
  grid.stopBatch("reset");
1720
1754
  };
@@ -2601,37 +2635,29 @@ Grid.prototype.hasHiddenRow = function(){
2601
2635
  /** Set RIC to the specified row
2602
2636
  * @public
2603
2637
  * @param {Grid~RowReference} rowRef
2604
- * @param {string} str
2638
+ * @param {string} str RIC to be set to a row
2605
2639
  * @param {RowDefinition~Options=} options
2606
2640
  */
2607
2641
  Grid.prototype.setRic = function(rowRef, str, options) {
2608
2642
  if(this._mainGrid) {
2609
- this._mainGrid.setRic(this._toRowId(rowRef), str);
2643
+ this._mainGrid.setRic(this._toRowId(rowRef), str, options);
2610
2644
  return;
2611
2645
  }
2612
2646
  var rowDef = this._getRowDefinitionByRef(rowRef);
2613
2647
  if(rowDef) {
2614
2648
  options = options || {};
2615
- var newChain = false;
2616
- if(str.indexOf("0#") > 0 || options["asChain"]) {
2617
- newChain = true;
2649
+ options["ric"] = str;
2650
+ var extractedOptions = RowDefinition.extractRowOptions(options);
2651
+ var oldRic = rowDef.getSymbol();
2652
+ if(rowDef.setContent(str, extractedOptions)) { // The given string may not be a RIC
2653
+ this._connector.removeRic(rowDef, oldRic);
2654
+ this._initDuplicateRicData(rowDef);
2655
+ this._connector.addRic(rowDef);
2618
2656
  }
2619
- if(rowDef.isChain() || newChain) {
2620
- if(rowDef.getRic() !== str.replace("0#", "")) {
2621
- var rowIndex = this._dv.getRowIndex(rowDef.getRowId());
2622
- this.removeRow(rowDef);
2623
2657
 
2624
- options["ric"] = str;
2625
- this.insertRow(options, rowIndex);
2626
- }
2627
- } else {
2628
- var oldRic = rowDef.getSymbol();
2629
- var permId = options["permId"] || "";
2630
- if(rowDef.setContent(str, permId)) { // The given string may not be a RIC
2631
- this._connector.removeRic(rowDef, oldRic);
2632
- this._initDuplicateRicData(rowDef);
2633
- this._connector.addRic(rowDef);
2634
- }
2658
+ var values = options["values"];
2659
+ if(values != null) {
2660
+ rowDef.setStaticRowData(values, options["fields"]);
2635
2661
  }
2636
2662
  }
2637
2663
  };
@@ -3337,6 +3363,19 @@ Grid.prototype.clearSort = function() {
3337
3363
  this._stp.clearSortState(); // WARNING: No event is dispatched
3338
3364
  };
3339
3365
 
3366
+ /**
3367
+ * @private
3368
+ * @param {Object} e Event object from quote2
3369
+ */
3370
+ Grid.prototype._onQuote2PostUpdate = function (e) {
3371
+ if(e.childOrderChange) { // For dynamic chain when CHILD_ORDER from the server change, it will be call sort children
3372
+ if(!this.isSorting()) {
3373
+ // Use rowDef for get CHILD_ORDER to sort
3374
+ this._dt.sortOnce("ROW_DEF", "a", _sortChildrenOfChain);
3375
+ }
3376
+ }
3377
+ };
3378
+
3340
3379
  /** @private
3341
3380
  * @param {!Object} e
3342
3381
  */
@@ -3882,6 +3921,28 @@ Grid.prototype._logData = function(rowDefs, options) {
3882
3921
 
3883
3922
  console.table(tbl); // eslint-disable-line
3884
3923
  };
3924
+ /** @public
3925
+ * @description Replace existing row with a new row. Row ID would be changed, after row is replaced.
3926
+ * @param {Grid~RowReference} rowRef Reference (i.e. row index, row id, or row definition) of the insert position
3927
+ * @param {Object=} rowOption
3928
+ * @returns {Object}
3929
+ */
3930
+ Grid.prototype.replaceRow = function(rowRef, rowOption) {
3931
+ var rowId = this._getRowId(rowRef);
3932
+ var rowDef = this._getRowDefinitionByRef(rowRef);
3933
+ if(rowDef.isAutoGenerated()) { // Users cannot replace auto-generated
3934
+ return null;
3935
+ }
3936
+ var configObj = rowDef.getConfigObject();
3937
+
3938
+ if(deepEqual(configObj, rowOption)){
3939
+ return null;
3940
+ } else {
3941
+ var insertedRow = this.insertRow(rowOption, rowId);
3942
+ this.removeRow(rowId);
3943
+ return insertedRow;
3944
+ }
3945
+ };
3885
3946
 
3886
3947
  export { Grid };
3887
3948
  export default Grid;
@@ -13,7 +13,8 @@ declare namespace RowDefinition {
13
13
  chainRic?: string|null,
14
14
  collapsed?: boolean|null,
15
15
  label?: (string|null)|null,
16
- hidden?: boolean|null
16
+ hidden?: boolean|null,
17
+ realTime?: boolean|null
17
18
  };
18
19
 
19
20
  type RowTypes = {
@@ -37,8 +38,6 @@ declare class RowDefinition {
37
38
 
38
39
  public initialize(rowOptions?: RowDefinition.Options|null): void;
39
40
 
40
- public setContent(userInput: string, permId?: string|null, asChain?: boolean|null, expanded?: boolean|null, realTime?: boolean|null): boolean;
41
-
42
41
  public getRowId(): string;
43
42
 
44
43
  public getConfigObject(rowOptions?: RowDefinition.Options|null): RowDefinition.Options|null;
@@ -105,7 +104,7 @@ declare class RowDefinition {
105
104
 
106
105
  public resetUpdates(): void;
107
106
 
108
- public registerToView(view: DataTable|null, rowId?: string|null): void;
107
+ public registerToView(view: DataView|null, rowId?: string|null): void;
109
108
 
110
109
  public static deregisterFromView(rowIds: (string)[]|null, rowDef: RowDefinition|null): (string)[]|null;
111
110
 
@@ -143,7 +142,7 @@ declare const ROW_DEF: string;
143
142
 
144
143
  declare const ROW_TYPES: RowDefinition.RowTypes;
145
144
 
146
- declare function rowData(userInput: string, permId?: string|null, asChain?: boolean|null, expanded?: boolean|null, realTime?: boolean|null): boolean;
145
+ declare function rowData(userInput: string, extractedOptions: any): boolean;
147
146
 
148
147
  export {RowDefinition, ROW_DEF, ROW_TYPES};
149
148
  export default RowDefinition;
@@ -15,7 +15,7 @@ import { DataTable } from "../../core/es6/data/DataTable.js";
15
15
  * @property {boolean=} collapsed=true Chain is collapsed by default
16
16
  * @property {(string|null)=} label=null
17
17
  * @property {boolean=} hidden=true When this row is hidden
18
- * @pro // realTime
18
+ * @property {boolean=} realTime=true Realtime row, able to request for JET/RTK
19
19
  */
20
20
 
21
21
  /** @typedef {Object} RowDefinition~RowTypes
@@ -217,6 +217,8 @@ RowDefinition.prototype.initialize = function(rowOptions) {
217
217
  return;
218
218
  }
219
219
 
220
+ var extractedOptions = RowDefinition.extractRowOptions(rowOptions);
221
+
220
222
  var val = rowOptions["permId"];
221
223
  if(val != null) {
222
224
  this._permId = val;
@@ -234,13 +236,8 @@ RowDefinition.prototype.initialize = function(rowOptions) {
234
236
  if(val != null) {
235
237
  this._chainRic = val;
236
238
  }
237
- val = rowOptions["values"];
238
- // eslint-disable-next-line no-undefined
239
- if(val !== undefined) {
240
- this.setStaticRowData(val, rowOptions["fields"]);
241
- }
242
239
 
243
- val = rowOptions["asChain"];
240
+ val = extractedOptions["asChain"];
244
241
  if(val !== null) {
245
242
  this._isChain = val;
246
243
  }
@@ -251,29 +248,24 @@ RowDefinition.prototype.initialize = function(rowOptions) {
251
248
  }
252
249
 
253
250
  val = rowOptions["collapsed"];
254
- if(val != null){
255
- this._expanded = !val;
251
+ var collapsed = extractedOptions["collapsed"];
252
+ if(val != null || !collapsed){
253
+ this._expanded = !collapsed;
256
254
  }
257
255
  val = rowOptions["keepModel"];
258
256
  if(val) {
259
257
  this._userModel = rowOptions;
260
258
  }
261
259
 
262
- var expanded = this._expanded;
263
260
  var symbol = this._ric || this._chainRic;
264
- var asChain = this._isChain || !!this._chainRic;
265
- if(this._ric && this._ric.indexOf("0#") >= 0){
266
- asChain = true;
267
- expanded = true;
268
- }
269
- if(this._isChain === false){
270
- asChain = false;
271
- }
272
- if(this._expanded === false){
273
- expanded = false;
274
- }
275
261
  if(symbol || this._permId){
276
- this.setContent(symbol, this._permId, asChain, expanded); // this._dataId is modified
262
+ this.setContent(symbol, extractedOptions); // this._dataId is modified
263
+ }
264
+
265
+ val = rowOptions["values"];
266
+ // eslint-disable-next-line no-undefined
267
+ if(val !== undefined) {
268
+ this.setStaticRowData(val, rowOptions["fields"]);
277
269
  }
278
270
  };
279
271
  /** @private
@@ -300,14 +292,12 @@ RowDefinition.prototype._initializeAsConstituent = function(rowOptions) {
300
292
  }
301
293
  };
302
294
  /** @public
295
+ * @ignore
303
296
  * @param {string} userInput RIC
304
- * @param {string=} permId=null Organization PermId, which use for getting ADC data for private company
305
- * @param {boolean=} asChain
306
- * @param {boolean=} expanded
307
- * @param {boolean=} realTime
297
+ * @param {Object} extractedOptions
308
298
  * @return {boolean} True if there is any change otherwise false
309
299
  */
310
- RowDefinition.prototype.setContent = function(userInput, permId, asChain, expanded) {
300
+ RowDefinition.prototype.setContent = function(userInput, extractedOptions) {
311
301
  if(this._autoGenerated) { // AutoGenerated RowDefinition cannot be changed by user input
312
302
  return false;
313
303
  }
@@ -319,6 +309,7 @@ RowDefinition.prototype.setContent = function(userInput, permId, asChain, expand
319
309
  }
320
310
 
321
311
  var dirty = (this._userInput !== userInput);
312
+ var permId = extractedOptions["permId"];
322
313
  if(this._permId !== permId){
323
314
  this._permId = permId || "";
324
315
  dirty = true;
@@ -327,33 +318,42 @@ RowDefinition.prototype.setContent = function(userInput, permId, asChain, expand
327
318
  return false;
328
319
  }
329
320
 
330
- this.unsubscribeForUpdates();
321
+ if(!this.unsubscribeForUpdates()){
322
+ this._clearStaticData();
323
+ }
331
324
  this.resetUpdates(); // Remove all previous data updates because a new content is just entered
332
325
 
333
- // TODO: handle changing between chain and ric row
334
326
  this._userInput = userInput;
335
327
  if(this._userInput.charAt(0) === "'") { // This is a row header
336
328
  this._ric = this._chainRic = ""; // No ric for realtime request
337
329
  } else {
338
- if(this._userInput.indexOf("0#") >= 0) {
339
- if(asChain === false){
340
- this._ric = this._userInput;
341
- } else {
342
- this._ric = expanded === false ? this._userInput : this._userInput.replace("0#", "");
343
- this._expanded = expanded;
344
- this._isChain = true; // Only chain can be expanded by 0#
345
- this._chainRic = this._userInput;
346
- if(this._view) {
347
- this._view.setSegmentSeparator(this._rowId);
348
- this.expandChain();
349
- }
350
- }
330
+ var asChain = extractedOptions["asChain"];
331
+ var expanded = !extractedOptions["collapsed"];
332
+ var chainRic = extractedOptions["chainRic"];
333
+ if(asChain === true){
334
+ this._ric = expanded === false ? this._userInput : this._userInput.replace("0#", "");
335
+ this._expanded = expanded; // Only chain can be expanded by 0#
351
336
  } else {
352
337
  this._ric = this._userInput;
353
- if(asChain){
354
- this._isChain = true;
338
+ }
339
+ this._isChain = asChain;
340
+ this._chainRic = chainRic || "";
341
+ }
342
+
343
+ if(this._view) {
344
+ if(this._isChain){
345
+ var rid = this.getRowId();
346
+ var segmentId = this._view.getSegmentParentRowId(rid);
347
+ if(segmentId){
348
+ this._view.removeSegmentChild(segmentId, rid);
355
349
  }
356
350
  }
351
+ this._view.setSegmentSeparator(this._rowId, !!this._isChain);
352
+ if(this._expanded && this.isChainCollapsed()){
353
+ this.expandChain();
354
+ } else if (!this._expanded && this.isChainExpanded()){
355
+ this.collapseChain();
356
+ }
357
357
  }
358
358
 
359
359
  this._dataId = this._rowId + this.getSymbol(); // JET/RTK will generate data id to be rowId (given from this rowDef) + ric;
@@ -769,8 +769,17 @@ RowDefinition.prototype.subscribeForUpdates = function() {
769
769
  var prevRowData = this.unsubscribeForUpdates();
770
770
 
771
771
  if(this.isChain()) {
772
- this._subId = subs["addChain"](this._chainRic || this._ric, this._rowId); // Some chain require 0# symbol to populate its constituents
773
- // TODO: Handle Dynamic chain such as .PG.PA
772
+ var symbol = this._chainRic;
773
+ if(!symbol){
774
+ symbol = this._ric;
775
+ if(symbol.indexOf("0#") < 0){
776
+ var count = (symbol.match(/\./g) || []).length;
777
+ if(count < 2){
778
+ symbol = "0#" + symbol;
779
+ }
780
+ }
781
+ }
782
+ this._subId = subs["addChain"](symbol, this._rowId); // Some chain require 0# symbol to populate its constituents
774
783
  } else if(this._ric) {
775
784
  this._subId = subs["addRic"](this._ric, this._rowId);
776
785
  }
@@ -798,7 +807,7 @@ RowDefinition.prototype.unsubscribeForUpdates = function() {
798
807
  this.resetUpdates();
799
808
  // TODO: Reset only if this is the last ric
800
809
  this._dc.setRowData(this._dataId, null); // Trigger data update immediately
801
- // TODO: Handle static values
810
+ this._clearStaticData();
802
811
  // eslint-disable-next-line consistent-return
803
812
  return prevRowData;
804
813
  };
@@ -847,7 +856,7 @@ RowDefinition.prototype.resetUpdates = function() {
847
856
  };
848
857
 
849
858
  /** @public
850
- * @param {DataTable} view
859
+ * @param {DataView} view
851
860
  * @param {string=} rowId
852
861
  */
853
862
  RowDefinition.prototype.registerToView = function(view, rowId) {
@@ -964,11 +973,17 @@ RowDefinition.prototype.addConstituent = function(ric) {
964
973
  }
965
974
 
966
975
  if(this._view) {
967
- // WARNING: ChildCount may not be enough to determine proper inserting position
968
- // TODO: Handle nested children
969
976
  var rowId = this.getRowId();
970
- var rowIndex = this._view.getRowIndex(rowId) + this.getChildCount(); // Children must be directly under its parent
971
- childDef.registerToView(this._view, this._view.getRowId(rowIndex));
977
+ // WARNING: insert position, we prioritize using CHILD_ORDER (From server) in dc first. If it does not exist, the last row of the segment will be pushed
978
+ var childOrder = childDef.getData("CHILD_ORDER");
979
+ var parentIndex = this._view.getRowIndex(rowId);
980
+ var position = parentIndex + this.getChildCount(); // push the last position
981
+ if(childOrder != null) {
982
+ // Warning: We need to carry a value of 1 because the CHILD_ORDER starts with 0, and it will be added to the parentIndex. In case the parent rowIndex is not included.
983
+ position = parentIndex + childOrder + 1; // insert between segment
984
+ } // else {} it will be push in the last row of segment
985
+ childDef.registerToView(this._view, this._view.getRowId(position));
986
+ // TODO: Handle nested children
972
987
  this._view.addSegmentChild(rowId, childDef.getRowId(), childDef.getDataId());
973
988
  }
974
989
 
@@ -1210,6 +1225,42 @@ RowDefinition.prototype.getUserModel = function() {
1210
1225
  RowDefinition.toRowId = function(rowDef) {
1211
1226
  return rowDef.getRowId();
1212
1227
  };
1228
+ /** For transforming row options into standard format
1229
+ * @public
1230
+ * @ignore
1231
+ * @function
1232
+ * @param {RowDefinition~Options} rowOptions
1233
+ * @return {RowDefinition~Options}
1234
+ */
1235
+ RowDefinition.extractRowOptions = function(rowOptions) {
1236
+ var ric = rowOptions["ric"];
1237
+ var permId = rowOptions["permId"];
1238
+ var chainRic = rowOptions["chainRic"];
1239
+ var collapsed = rowOptions["collapsed"];
1240
+ var asChain = rowOptions["asChain"];
1241
+ if(asChain == null && chainRic){
1242
+ asChain = true;
1243
+ }
1244
+ var expanded = null;
1245
+ if(ric && ric.indexOf("0#") >= 0){
1246
+ if(asChain == null){
1247
+ asChain = true;
1248
+ }
1249
+ expanded = true;
1250
+ }
1251
+
1252
+ var extractedOptions = {};
1253
+ if(collapsed == null) {
1254
+ extractedOptions["collapsed"] = !expanded;
1255
+ } else {
1256
+ extractedOptions["collapsed"] = collapsed;
1257
+ }
1258
+ extractedOptions["ric"] = ric;
1259
+ extractedOptions["permId"] = permId;
1260
+ extractedOptions["chainRic"] = chainRic;
1261
+ extractedOptions["asChain"] = asChain;
1262
+ return extractedOptions;
1263
+ };
1213
1264
  /** For mapping row Id by Array.map()
1214
1265
  * @public
1215
1266
  * @function
@@ -64,10 +64,6 @@ ColumnGroupingPlugin.prototype._maxDepth = 0;
64
64
  * @private
65
65
  */
66
66
  ColumnGroupingPlugin.prototype._restructuring = false;
67
- /** @type {boolean}
68
- * @private
69
- */
70
- ColumnGroupingPlugin.prototype._autoGrouping = true;
71
67
  /** @type {number}
72
68
  * @private
73
69
  */
@@ -894,9 +890,11 @@ ColumnGroupingPlugin.prototype._applyTimeSeries = function (e) {
894
890
  * @param {Object} e dispatching of columnAdded event object
895
891
  */
896
892
  ColumnGroupingPlugin.prototype._onColumnAdded = function (e) {
897
- var colIndex = e.colIndex;
898
- this._requestApplyAddChildGroup(e);
899
- this._applyNearestGrouping(colIndex);
893
+ var batches = e["batches"];
894
+ if (!(batches && batches["reset"])) {
895
+ this._requestApplyAddChildGroup(e);
896
+ this._applyNearestGrouping(e.colIndex);
897
+ }
900
898
  this._requestApplyGrouping();
901
899
  };
902
900
  /** @private
@@ -908,7 +906,8 @@ ColumnGroupingPlugin.prototype._onColumnChanged = function () {
908
906
  * @param {Object} e dispatching of columnMoved event object
909
907
  */
910
908
  ColumnGroupingPlugin.prototype._onColumnMoved = function (e) {
911
- if (this._autoGrouping) {
909
+ var batches = e["batches"];
910
+ if (!(batches && batches["move"])) {
912
911
  this._applyNearestGrouping(e.toColIndex);
913
912
  }
914
913
  this._requestApplyGrouping();
@@ -917,11 +916,16 @@ ColumnGroupingPlugin.prototype._onColumnMoved = function (e) {
917
916
  * @param {Object} e
918
917
  */
919
918
  ColumnGroupingPlugin.prototype._onColumnRemoved = function (e) {
920
- var colId = e.colId;
921
- if (colId) {
922
- if (this._groupDefs.unsetParent(colId)) {
923
- this._requestApplyGrouping();
919
+ var batches = e["batches"];
920
+ if (!(batches && batches["reset"])) {
921
+ var colId = e.colId;
922
+ if (colId) {
923
+ if (this._groupDefs.unsetParent(colId)) {
924
+ this._requestApplyGrouping();
925
+ }
924
926
  }
927
+ } else {
928
+ this._requestApplyGrouping();
925
929
  }
926
930
  };
927
931
  /** @private
@@ -1028,29 +1032,22 @@ ColumnGroupingPlugin.prototype._onBeforeColumnBoundUpdate = function (e) {
1028
1032
  */
1029
1033
  ColumnGroupingPlugin.prototype.addColumnToGroup = function (column, groupId, colIndex) {
1030
1034
  if (!column) return;
1031
- var columnIndex = -1;
1032
- if (colIndex == null) {
1035
+ var destIndex = this.getColumnCount();
1036
+ if (colIndex != null) {
1033
1037
  var groupDef = this._groupDefs.getGroup(groupId);
1034
1038
  if (groupDef) {
1035
- var childIndices = this.getChildColumnIndices(groupId);
1036
- if (childIndices && childIndices.length) {
1037
- // Child indices need to be sorted here
1038
- columnIndex = childIndices[childIndices.length - 1] + 1; // Put new column next to the last child in the group
1039
- }
1040
-
1041
1039
  this._groupDefs.addGroupChild(groupId, column.id);
1042
1040
  }
1043
- } else {
1044
- columnIndex = colIndex;
1045
- }
1046
- if (columnIndex < 0) {
1047
- columnIndex = this.getColumnCount();
1041
+ destIndex = colIndex;
1048
1042
  }
1049
1043
  if (this._realTimeGrid) {
1050
1044
  // TODO: Support multi-table feature
1051
- this._realTimeGrid.insertColumn(column, columnIndex);
1045
+ this._realTimeGrid.insertColumn(column, destIndex);
1052
1046
  } else if (this._compositeGrid) {
1053
- this._compositeGrid.insertColumn(columnIndex, column);
1047
+ this._compositeGrid.insertColumn(destIndex, column);
1048
+ }
1049
+ if (colIndex == null) {
1050
+ this.setColumnParent(column.id || destColIndex, groupId);
1054
1051
  }
1055
1052
  };
1056
1053
 
@@ -1622,13 +1619,7 @@ ColumnGroupingPlugin.prototype.moveGroup = function (id, destCol) {
1622
1619
  * @return {boolean}
1623
1620
  */
1624
1621
  ColumnGroupingPlugin.prototype.reorderColumns = function (colList, destCol) {
1625
- var dirty = false;
1626
- // TODO: create method for toggling autoGrouping flag
1627
- this._autoGrouping = false; // Prevent re-grouping in columnMoved event
1628
-
1629
- this._reorderColumns(colList, destCol);
1630
- this._autoGrouping = true;
1631
- return dirty;
1622
+ return this._reorderColumns(colList, destCol);
1632
1623
  };
1633
1624
  /** Move the specified column to position before the destination
1634
1625
  * @public
@@ -1637,12 +1628,7 @@ ColumnGroupingPlugin.prototype.reorderColumns = function (colList, destCol) {
1637
1628
  * @return {boolean}
1638
1629
  */
1639
1630
  ColumnGroupingPlugin.prototype.moveColumnById = function (srcCol, destCol) {
1640
- var dirty = false;
1641
- this._autoGrouping = false; // Prevent re-grouping in columnMoved event
1642
-
1643
- this._moveColumnById(srcCol, destCol);
1644
- this._autoGrouping = true;
1645
- return dirty;
1631
+ return this._moveColumnById(srcCol, destCol);
1646
1632
  };
1647
1633
  /** @public
1648
1634
  * @param {string} groupId