@refinitiv-ui/efx-grid 6.0.40 → 6.0.41

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 (30) 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 +25 -26
  4. package/lib/core/dist/core.min.js +1 -1
  5. package/lib/core/es6/grid/Core.js +25 -26
  6. package/lib/grid/index.js +1 -1
  7. package/lib/rt-grid/dist/rt-grid.js +2083 -1753
  8. package/lib/rt-grid/dist/rt-grid.min.js +1 -1
  9. package/lib/rt-grid/es6/Grid.js +55 -7
  10. package/lib/rt-grid/es6/RowDefinition.d.ts +2 -2
  11. package/lib/rt-grid/es6/RowDefinition.js +37 -18
  12. package/lib/tr-grid-column-grouping/es6/ColumnGrouping.js +26 -40
  13. package/lib/tr-grid-util/es6/CellPainter.d.ts +2 -1
  14. package/lib/tr-grid-util/es6/CellPainter.js +6 -4
  15. package/lib/tr-grid-util/es6/ExpressionParser.d.ts +10 -0
  16. package/lib/tr-grid-util/es6/ExpressionParser.js +366 -0
  17. package/lib/tr-grid-util/es6/FilterBuilder.d.ts +10 -6
  18. package/lib/tr-grid-util/es6/FilterBuilder.js +264 -234
  19. package/lib/tr-grid-util/es6/FilterOperators.d.ts +3 -1
  20. package/lib/tr-grid-util/es6/FilterOperators.js +51 -2
  21. package/lib/tr-grid-util/es6/Util.d.ts +0 -3
  22. package/lib/tr-grid-util/es6/Util.js +0 -53
  23. package/lib/tr-grid-util/es6/formula/Formula.js +3 -3
  24. package/lib/types/es6/ColumnDragging.d.ts +51 -0
  25. package/lib/types/es6/ExtensionOptions.d.ts +2 -0
  26. package/lib/types/es6/Extensions.d.ts +3 -1
  27. package/lib/types/es6/RealtimeGrid/RowDefinition.d.ts +2 -2
  28. package/lib/types/es6/index.d.ts +1 -0
  29. package/lib/versions.json +3 -3
  30. package/package.json +1 -1
@@ -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.
@@ -2608,13 +2649,7 @@ Grid.prototype.setRic = function(rowRef, str, options) {
2608
2649
  options["ric"] = str;
2609
2650
  var extractedOptions = RowDefinition.extractRowOptions(options);
2610
2651
  var oldRic = rowDef.getSymbol();
2611
- var permId = options["permId"];
2612
- var expanded = null;
2613
- var collapsed = options["collapsed"];
2614
- if(collapsed != null){
2615
- expanded = !extractedOptions["collapsed"];
2616
- }
2617
- if(rowDef.setContent(str, permId, extractedOptions["asChain"], expanded)) { // The given string may not be a RIC
2652
+ if(rowDef.setContent(str, extractedOptions)) { // The given string may not be a RIC
2618
2653
  this._connector.removeRic(rowDef, oldRic);
2619
2654
  this._initDuplicateRicData(rowDef);
2620
2655
  this._connector.addRic(rowDef);
@@ -3328,6 +3363,19 @@ Grid.prototype.clearSort = function() {
3328
3363
  this._stp.clearSortState(); // WARNING: No event is dispatched
3329
3364
  };
3330
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
+
3331
3379
  /** @private
3332
3380
  * @param {!Object} e
3333
3381
  */
@@ -104,7 +104,7 @@ declare class RowDefinition {
104
104
 
105
105
  public resetUpdates(): void;
106
106
 
107
- public registerToView(view: DataTable|null, rowId?: string|null): void;
107
+ public registerToView(view: DataView|null, rowId?: string|null): void;
108
108
 
109
109
  public static deregisterFromView(rowIds: (string)[]|null, rowDef: RowDefinition|null): (string)[]|null;
110
110
 
@@ -142,7 +142,7 @@ declare const ROW_DEF: string;
142
142
 
143
143
  declare const ROW_TYPES: RowDefinition.RowTypes;
144
144
 
145
- declare function rowData(userInput: string, permId?: string|null, asChain?: boolean|null, expanded?: boolean|null): boolean;
145
+ declare function rowData(userInput: string, extractedOptions: any): boolean;
146
146
 
147
147
  export {RowDefinition, ROW_DEF, ROW_TYPES};
148
148
  export default RowDefinition;
@@ -248,8 +248,9 @@ RowDefinition.prototype.initialize = function(rowOptions) {
248
248
  }
249
249
 
250
250
  val = rowOptions["collapsed"];
251
- if(val != null){
252
- this._expanded = extractedOptions["collapsed"];
251
+ var collapsed = extractedOptions["collapsed"];
252
+ if(val != null || !collapsed){
253
+ this._expanded = !collapsed;
253
254
  }
254
255
  val = rowOptions["keepModel"];
255
256
  if(val) {
@@ -258,7 +259,7 @@ RowDefinition.prototype.initialize = function(rowOptions) {
258
259
 
259
260
  var symbol = this._ric || this._chainRic;
260
261
  if(symbol || this._permId){
261
- this.setContent(symbol, this._permId, this._isChain, this._expanded); // this._dataId is modified
262
+ this.setContent(symbol, extractedOptions); // this._dataId is modified
262
263
  }
263
264
 
264
265
  val = rowOptions["values"];
@@ -293,12 +294,10 @@ RowDefinition.prototype._initializeAsConstituent = function(rowOptions) {
293
294
  /** @public
294
295
  * @ignore
295
296
  * @param {string} userInput RIC
296
- * @param {string=} permId=null Organization PermId, which use for getting ADC data for private company
297
- * @param {boolean=} asChain
298
- * @param {boolean=} expanded
297
+ * @param {Object} extractedOptions
299
298
  * @return {boolean} True if there is any change otherwise false
300
299
  */
301
- RowDefinition.prototype.setContent = function(userInput, permId, asChain, expanded) {
300
+ RowDefinition.prototype.setContent = function(userInput, extractedOptions) {
302
301
  if(this._autoGenerated) { // AutoGenerated RowDefinition cannot be changed by user input
303
302
  return false;
304
303
  }
@@ -310,6 +309,7 @@ RowDefinition.prototype.setContent = function(userInput, permId, asChain, expand
310
309
  }
311
310
 
312
311
  var dirty = (this._userInput !== userInput);
312
+ var permId = extractedOptions["permId"];
313
313
  if(this._permId !== permId){
314
314
  this._permId = permId || "";
315
315
  dirty = true;
@@ -327,15 +327,17 @@ RowDefinition.prototype.setContent = function(userInput, permId, asChain, expand
327
327
  if(this._userInput.charAt(0) === "'") { // This is a row header
328
328
  this._ric = this._chainRic = ""; // No ric for realtime request
329
329
  } else {
330
+ var asChain = extractedOptions["asChain"];
331
+ var expanded = !extractedOptions["collapsed"];
332
+ var chainRic = extractedOptions["chainRic"];
330
333
  if(asChain === true){
331
334
  this._ric = expanded === false ? this._userInput : this._userInput.replace("0#", "");
332
- this._expanded = expanded;
333
- this._isChain = true; // Only chain can be expanded by 0#
334
- this._chainRic = this._userInput;
335
+ this._expanded = expanded; // Only chain can be expanded by 0#
335
336
  } else {
336
337
  this._ric = this._userInput;
337
- this._isChain = asChain;
338
338
  }
339
+ this._isChain = asChain;
340
+ this._chainRic = chainRic || "";
339
341
  }
340
342
 
341
343
  if(this._view) {
@@ -767,8 +769,17 @@ RowDefinition.prototype.subscribeForUpdates = function() {
767
769
  var prevRowData = this.unsubscribeForUpdates();
768
770
 
769
771
  if(this.isChain()) {
770
- this._subId = subs["addChain"](this._chainRic || this._ric, this._rowId); // Some chain require 0# symbol to populate its constituents
771
- // 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
772
783
  } else if(this._ric) {
773
784
  this._subId = subs["addRic"](this._ric, this._rowId);
774
785
  }
@@ -845,7 +856,7 @@ RowDefinition.prototype.resetUpdates = function() {
845
856
  };
846
857
 
847
858
  /** @public
848
- * @param {DataTable} view
859
+ * @param {DataView} view
849
860
  * @param {string=} rowId
850
861
  */
851
862
  RowDefinition.prototype.registerToView = function(view, rowId) {
@@ -962,11 +973,17 @@ RowDefinition.prototype.addConstituent = function(ric) {
962
973
  }
963
974
 
964
975
  if(this._view) {
965
- // WARNING: ChildCount may not be enough to determine proper inserting position
966
- // TODO: Handle nested children
967
976
  var rowId = this.getRowId();
968
- var rowIndex = this._view.getRowIndex(rowId) + this.getChildCount(); // Children must be directly under its parent
969
- 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
970
987
  this._view.addSegmentChild(rowId, childDef.getRowId(), childDef.getDataId());
971
988
  }
972
989
 
@@ -1217,6 +1234,7 @@ RowDefinition.toRowId = function(rowDef) {
1217
1234
  */
1218
1235
  RowDefinition.extractRowOptions = function(rowOptions) {
1219
1236
  var ric = rowOptions["ric"];
1237
+ var permId = rowOptions["permId"];
1220
1238
  var chainRic = rowOptions["chainRic"];
1221
1239
  var collapsed = rowOptions["collapsed"];
1222
1240
  var asChain = rowOptions["asChain"];
@@ -1238,6 +1256,7 @@ RowDefinition.extractRowOptions = function(rowOptions) {
1238
1256
  extractedOptions["collapsed"] = collapsed;
1239
1257
  }
1240
1258
  extractedOptions["ric"] = ric;
1259
+ extractedOptions["permId"] = permId;
1241
1260
  extractedOptions["chainRic"] = chainRic;
1242
1261
  extractedOptions["asChain"] = asChain;
1243
1262
  return extractedOptions;
@@ -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
@@ -1,6 +1,7 @@
1
1
  import { TickCodes, TickFields } from "./TickCodes.js";
2
- import { parseCondition, rgb2Hex } from "./Util.js";
2
+ import { rgb2Hex } from "./Util.js";
3
3
  import { ElfUtil } from "./ElfUtil.js";
4
+ import { ExpressionParser } from "./ExpressionParser.js";
4
5
 
5
6
  declare namespace CellPainter {
6
7
 
@@ -1,6 +1,7 @@
1
1
  import { TickCodes, TickFields } from "./TickCodes.js";
2
- import { parseCondition, rgb2Hex } from "./Util.js";
2
+ import { rgb2Hex } from "./Util.js";
3
3
  import { ElfUtil } from "./ElfUtil.js";
4
+ import { ExpressionParser } from "./ExpressionParser.js";
4
5
 
5
6
  /** @typedef {Object} CellPainter~Expression
6
7
  * @property {string=} name
@@ -131,7 +132,8 @@ CellPainter.supportedStyles = CellPainter.bgStyles.concat(CellPainter.nonBgStyle
131
132
  */
132
133
  CellPainter.themeReady = null;
133
134
 
134
- /** @public
135
+ /** Deprecated in favor of ExpressionParser
136
+ * @public
135
137
  * @function
136
138
  * @param {string|Function} expression
137
139
  * @return {Function}
@@ -139,7 +141,7 @@ CellPainter.themeReady = null;
139
141
  * var fn = CellPainter.parse("[CF_BID] >= 10 && [CF_BID] <= 100");
140
142
  * window.console.log(fn(25));
141
143
  */
142
- CellPainter.parse = parseCondition;
144
+ CellPainter.parse = ExpressionParser.parse;
143
145
 
144
146
 
145
147
  /** @public */
@@ -311,7 +313,7 @@ CellPainter.prototype.getColumnStats = function() {
311
313
  CellPainter.prototype._addCondition = function(condition) {
312
314
  var exp = condition["expression"];
313
315
  if(exp) {
314
- condition._fn = CellPainter.parse(exp["text"] || exp);
316
+ condition._fn = ExpressionParser.parse(exp["text"] || exp);
315
317
  this._conditions.push(condition);
316
318
  }
317
319
  };
@@ -0,0 +1,10 @@
1
+
2
+
3
+ declare namespace ExpressionParser {
4
+
5
+ function parse(expression: string|((...params: any[]) => any)|null): ((...params: any[]) => any)|null;
6
+
7
+ }
8
+
9
+ export default ExpressionParser;
10
+ export {ExpressionParser};