@refinitiv-ui/efx-grid 6.0.49 → 6.0.51

Sign up to get free protection for your applications and to get access to all the features.
@@ -11243,6 +11243,14 @@ DataTable.prototype._removedRows = null;
11243
11243
  */
11244
11244
  DataTable.prototype._userSegmentComparer = null;
11245
11245
  /** @private
11246
+ * @type {number}
11247
+ */
11248
+ DataTable.prototype._segmentSortOrder = 0;
11249
+ /** @private
11250
+ * @type {*}
11251
+ */
11252
+ DataTable.prototype._segmentSortContext = null;
11253
+ /** @private
11246
11254
  * @type {Object.<string, Object>}
11247
11255
  */
11248
11256
  DataTable.prototype._clsSource = null;
@@ -12415,6 +12423,51 @@ DataTable.prototype.getSegmentChildIds = function(segmentId) {
12415
12423
  }
12416
12424
  return null;
12417
12425
  };
12426
+ /** Sort all of existing segments by multiple sort logics
12427
+ * @public
12428
+ * @param {Function|Array.<Function>} sortLogics
12429
+ * @param {Array.<number>} sortOrders
12430
+ * @param {Array.<string>} cids
12431
+ * @return {boolean}
12432
+ */
12433
+ DataTable.prototype.sortSeparators = function (sortLogics, sortOrders, cids) {
12434
+ var dirty = false;
12435
+ if(!this._segments){
12436
+ return false;
12437
+ }
12438
+ if(typeof sortLogics === "function"){
12439
+ return this.sortSegments(sortLogics);
12440
+ }
12441
+ var sortingDefs = DataTable._buildSortContext(
12442
+ [],
12443
+ cids,
12444
+ sortOrders,
12445
+ sortLogics
12446
+ );
12447
+ var defCount = sortingDefs ? sortingDefs.length : 0;
12448
+ if(!defCount){
12449
+ return dirty;
12450
+ }
12451
+
12452
+ var sortOrder = 0;
12453
+ var sortLogic, sortContext;
12454
+ if(defCount > 1) {
12455
+ sortLogic = DataTable._multiColumnSeparatorCompareLogic;
12456
+ sortContext = sortingDefs;
12457
+ sortOrder = 1; // sortOrder is not used by _multiColumnSeparatorCompareLogic
12458
+ } else { // Single level sorting
12459
+ sortLogic = DataTable._singleColumnSeparatorCompareLogic;
12460
+ sortContext = sortingDefs[0];
12461
+ sortOrder = /** @type{number} */(sortContext[3]);
12462
+ }
12463
+ this._segmentSortOrder = sortOrder;
12464
+ this._segmentSortContext = sortContext;
12465
+ dirty = this.sortSegments(sortLogic);
12466
+ this._segmentSortOrder = 0;
12467
+ this._segmentSortContext = null;
12468
+
12469
+ return dirty;
12470
+ };
12418
12471
  /** Sort all of existing segments by given compare function
12419
12472
  * @public
12420
12473
  * @param {Function} compare
@@ -12483,7 +12536,9 @@ DataTable.prototype.sortSegments = function (compare) {
12483
12536
  DataTable.prototype._bySegmentSeparator = function (segmentA, segmentB) {
12484
12537
  return /** @type{number} */(this._userSegmentComparer(
12485
12538
  this.getRowData(segmentA.getId()),
12486
- this.getRowData(segmentB.getId())
12539
+ this.getRowData(segmentB.getId()),
12540
+ this._segmentSortOrder,
12541
+ this._segmentSortContext
12487
12542
  ));
12488
12543
  };
12489
12544
 
@@ -12824,6 +12879,47 @@ DataTable._singleColumnCompareLogic = function(a, b, order, sortingDef) {
12824
12879
  sortingDef[4] // Context object
12825
12880
  ));
12826
12881
  };
12882
+ /** Performance is extremely vital in this method
12883
+ * @public
12884
+ * @ignore
12885
+ * @function
12886
+ * @param {*} a
12887
+ * @param {*} b
12888
+ * @param {number} order Not used by in this method
12889
+ * @param {Array.<Array>} sortingDefs
12890
+ * @return {number}
12891
+ */
12892
+ DataTable._multiColumnSeparatorCompareLogic = function(a, b, order, sortingDefs) {
12893
+ var count = sortingDefs.length;
12894
+ var result = 0;
12895
+ for(var c = 0; c < count; ++c) {
12896
+ var sortingDef = sortingDefs[c];
12897
+ result = DataTable._singleColumnSeparatorCompareLogic(a, b, sortingDef[3], sortingDef);
12898
+ if(result) {
12899
+ return result;
12900
+ }
12901
+ }
12902
+ return result;
12903
+ };
12904
+ /** Performance is extremely vital in this method
12905
+ * @public
12906
+ * @ignore
12907
+ * @function
12908
+ * @param {*} a
12909
+ * @param {*} b
12910
+ * @param {number} order
12911
+ * @param {Array} sortingDef
12912
+ * @return {number}
12913
+ */
12914
+ DataTable._singleColumnSeparatorCompareLogic = function(a, b, order, sortingDef) {
12915
+ var key = /** @type{string} */(sortingDef[0]);
12916
+ return /** @type{number} */(sortingDef[2](
12917
+ a[key], // Value1
12918
+ b[key], // Value2
12919
+ order, // Sort order (3)
12920
+ sortingDef[4] // Context object
12921
+ ));
12922
+ };
12827
12923
  /** @public
12828
12924
  * @function
12829
12925
  * @ignore
@@ -16020,8 +16116,7 @@ ColumnDefinition.prototype._retrieveNestedFields = function(fields) {
16020
16116
  */
16021
16117
  ColumnDefinition.prototype._defaultRenderer = function(e) {
16022
16118
  var rowDef = /** @type{RowDefinition} */(e["dataValue"]);
16023
- var data = rowDef.getData(this._field);
16024
- e["cell"].setContent(data);
16119
+ e["cell"].setContent(rowDef ? rowDef.getData(this._field) : null);
16025
16120
  };
16026
16121
  /** @private
16027
16122
  * @param {Object} e
@@ -31351,6 +31446,15 @@ DataView.prototype.getSegmentIds = function() {
31351
31446
  DataView.prototype.getSegmentChildIds = function(segmentRef) {
31352
31447
  return this._dt.getSegmentChildIds(this._toRowId(segmentRef));
31353
31448
  };
31449
+ /** Sort all of existing segments by multiple sort logics
31450
+ * @public
31451
+ * @param {Array.<Function>} sortLogics
31452
+ * @param {Array.<number>} sortOrders
31453
+ * @param {Array.<string>} cids
31454
+ */
31455
+ DataView.prototype.sortSeparators = function (sortLogics, sortOrders, cids) {
31456
+ this._dt.sortSeparators(sortLogics, sortOrders, cids);
31457
+ };
31354
31458
  /** Sort all of existing segments by given compare function
31355
31459
  * @public
31356
31460
  * @param {Function} compare
@@ -35906,7 +36010,7 @@ Core.prototype._batches = null;
35906
36010
  * @return {string}
35907
36011
  */
35908
36012
  Core.getVersion = function () {
35909
- return "5.1.63";
36013
+ return "5.1.67";
35910
36014
  };
35911
36015
  /** {@link ElementWrapper#dispose}
35912
36016
  * @override
@@ -43415,6 +43519,28 @@ SortableTitlePlugin.prototype.setSortingSequence = function (sequence, colRef) {
43415
43519
  SortableTitlePlugin.prototype.clearAllColumnSortingSequences = function () {
43416
43520
  this._sortingSequenceMap = null;
43417
43521
  };
43522
+ /** @public
43523
+ * @description Sorting all separators according to compare function. If compare function is not specified, separators will will be sort by current sorting states.
43524
+ * @param {Function} comparer Compare function
43525
+ */
43526
+ SortableTitlePlugin.prototype.sortSeparators = function (comparer) {
43527
+ var host = this._hosts[0];
43528
+ var dv = host.getDataSource();
43529
+ if(comparer){
43530
+ dv.sortSeparators(comparer);
43531
+ } else {
43532
+ var sortLogics = dv.getSortingLogics();
43533
+ var sortOrders = [];
43534
+ var sortFields = [];
43535
+ var sortStateCount = this._sortStates.length;
43536
+ for(var i = 0; i < sortStateCount; i++){
43537
+ var sortState = this._sortStates[i];
43538
+ sortOrders.push(sortState["sortOrder"]);
43539
+ sortFields.push(sortState["field"]);
43540
+ }
43541
+ dv.sortSeparators(sortLogics, sortOrders, sortFields);
43542
+ }
43543
+ };
43418
43544
 
43419
43545
 
43420
43546
  /** @private
@@ -43895,6 +44021,12 @@ SortableTitlePlugin.prototype._isCellSortable = function (section, colIndex, row
43895
44021
  if (targetCell !== bottomCell) {
43896
44022
  return false;
43897
44023
  }
44024
+ var parentCell = targetCell.getParent();
44025
+ var classList = parentCell["classList"];
44026
+ // "collapsed" class in column element only enable by column stack in spreading mode
44027
+ if (classList.contains("collapsed")) { // HACK: unsortable for collapsed stack in spreading mode
44028
+ return false;
44029
+ }
43898
44030
 
43899
44031
  return true; // By default all cells are sortable
43900
44032
  };
@@ -44059,6 +44191,12 @@ SortableTitlePlugin._proto = SortableTitlePlugin.prototype;
44059
44191
  * @property {Grid} grid
44060
44192
  * @property {RowDefinition} rowDef
44061
44193
  */
44194
+
44195
+ /** @event Grid#beforeContentBinding
44196
+ * @property {Object} e Event of beforeContentBinding, We can use e.actualUpdate to check the actual data update, otherwise It will be empty when it is rendered by row virtualization or only the UI changes.
44197
+ * @description Trigger before content binding.
44198
+ */
44199
+
44062
44200
  /** @event Grid#beforeRowRemoved
44063
44201
  * @description Fired only when a row will be removed through Grid's API and before occurring of the actual removal
44064
44202
  */
@@ -44209,6 +44347,7 @@ var Grid = function(placeholder, config) {
44209
44347
  t.updateColumnTitle = t.updateColumnTitle.bind(t);
44210
44348
  t._populateTimeSeriesChildren = t._populateTimeSeriesChildren.bind(t);
44211
44349
 
44350
+ t._onBeforeContentBinding = t._onBeforeContentBinding.bind(t);
44212
44351
  t._onPostSectionDataBinding = t._onPostSectionDataBinding.bind(t);
44213
44352
  t._asyncClearDataUpdates = t._asyncClearDataUpdates.bind(t);
44214
44353
  t._clearDataUpdates = t._clearDataUpdates.bind(t);
@@ -44301,6 +44440,7 @@ var Grid = function(placeholder, config) {
44301
44440
  t._grid.loadPlugin(t._stp, config);
44302
44441
  }
44303
44442
 
44443
+ t._grid.listen("beforeContentBinding", t._onBeforeContentBinding);
44304
44444
  t._grid.listen("preSectionRender", t._onColumnHeaderBinding);
44305
44445
  t._grid.listen("postSectionDataBinding", t._onPostSectionDataBinding);
44306
44446
 
@@ -47420,6 +47560,13 @@ Grid.prototype._mainSorter = function (rowDefA, rowDefB, order) {
47420
47560
  return this._columnSorter(rowDefA, rowDefB, order);
47421
47561
  };
47422
47562
 
47563
+ /** @private
47564
+ * @param {Object} e
47565
+ */
47566
+ Grid.prototype._onBeforeContentBinding = function(e) {
47567
+ this._dispatch("beforeContentBinding", e);
47568
+ };
47569
+
47423
47570
  /** @private
47424
47571
  * @param {Object} e
47425
47572
  */
@@ -49517,6 +49664,46 @@ var _joinSubKeys = function(subA, subB) {
49517
49664
  return subA.ric + "_" + subB.ric;
49518
49665
  };
49519
49666
 
49667
+ /** @private
49668
+ * @param {string} ric
49669
+ * @return {boolean}
49670
+ */
49671
+ var _isDynamicChain = function(ric) {
49672
+ // Dynamic chain will be 2 . (dot) for example .PG.PA
49673
+ return ric.match(/\./g).length > 1;
49674
+ };
49675
+
49676
+ /** @private
49677
+ * @param {Array<Object>} arr sub children
49678
+ * @return {Array<Object>}
49679
+ */
49680
+ var _shuffleArray = function(arr) {
49681
+ var arrayShuffled = arr; // Modify original array
49682
+ var i, randNumber, tmp;
49683
+ // Shuffle the array randomly using the Fisher-Yates algorithm
49684
+ for (i = arrayShuffled.length - 1; i > 0; i--) {
49685
+ randNumber = Math.floor(Math.random() * (i + 1)); // TODO: it can be use this._dataGen.randInt(min, max) range
49686
+ tmp = arrayShuffled[i];
49687
+ arrayShuffled[i] = arrayShuffled[randNumber];
49688
+ arrayShuffled[randNumber] = tmp;
49689
+ }
49690
+
49691
+ // TODO: merge into 1 loop
49692
+ // Update the CHILD_ORDER property based on the new index
49693
+ arrayShuffled.forEach(_assignChildOrder);
49694
+ arrayShuffled = arrayShuffled.sort(_childOrderSort);
49695
+
49696
+ return arrayShuffled;
49697
+ };
49698
+
49699
+ var _assignChildOrder = function(obj, index) {
49700
+ obj["CHILD_ORDER"] = index;
49701
+ };
49702
+
49703
+ var _childOrderSort = function(a, b) {
49704
+ return a["CHILD_ORDER"] - b["CHILD_ORDER"];
49705
+ };
49706
+
49520
49707
  /** @constructor */
49521
49708
  var MockQuotes2 = function() {
49522
49709
 
@@ -49949,7 +50136,7 @@ MockSubscriptions.prototype._addSymbol = function(ric, asChain, subId) {
49949
50136
  childSub["dataId"] = subId + childSub["ric"];
49950
50137
  childSub["parent"] = sub; // This does not exist in real subscription
49951
50138
  sub["children"].push(childSub);
49952
-
50139
+ childSub["CHILD_ORDER"] = i;
49953
50140
  this._dataMap.addItem(_joinSubKeys(sub, childSub), childSub);
49954
50141
  }
49955
50142
  } else {
@@ -49996,7 +50183,7 @@ MockSubscriptions.simpleDigest = function(str) {
49996
50183
  MockSubscriptions.prototype._connect = function() {
49997
50184
  if(this._working && !this._timerId) {
49998
50185
  var delay = this._dataGen.randInt(this._minInterval, this._maxInterval);
49999
- this._timerId = window.setTimeout(this._onSubscriptionResponse, delay);
50186
+ this._timerId = window.setTimeout(this._onSubscriptionResponse, delay); // This will be async for fire event to user
50000
50187
  }
50001
50188
  };
50002
50189
 
@@ -50005,7 +50192,7 @@ MockSubscriptions.prototype._onSubscriptionResponse = function() {
50005
50192
  this._timerId = 0;
50006
50193
 
50007
50194
  var keys = this._dataMap.getAllKeys(); // list of all rics
50008
- var len = keys ? keys.length : 0;
50195
+ var len = keys ? keys.length : 0; // len include all row index (Constituent and normal ric)
50009
50196
  if(!len) { // No symbol has been added
50010
50197
  this._connect();
50011
50198
  return;
@@ -50023,16 +50210,63 @@ MockSubscriptions.prototype._onSubscriptionResponse = function() {
50023
50210
  var subs = this._dataMap.getItems(key); // Get all subs with the same RIC
50024
50211
 
50025
50212
  var sub = subs[0]; // Only the first sub is need to generate data
50026
- var values = this._generateQuoteData(sub, fields);
50213
+ var subParent = sub.parent;
50214
+ var updatePosition = this._dataGen.randBoolean(); // Flag for change CHILD_ORDER position
50215
+
50216
+ var values, j, jLen;
50217
+ if(_isDynamicChain(key) && subParent && updatePosition) { // subParent in header of dynamic chain is behavior like a normal ric
50218
+ // TODO: support rate of ordering is changed
50219
+ var children = subParent.children;
50220
+
50221
+ children = _shuffleArray(children);
50222
+ var childrenLen = children.length;
50223
+ var subIndex = children.indexOf(sub);
50224
+ sub["CHILD_ORDER"] = subIndex;
50225
+
50226
+ values = this._generateQuoteData(sub, fields);
50227
+
50228
+ jLen = subs.length;
50229
+ for(j = 0; j < jLen; ++j) { // It could be same ric and it need to dispatch with same ric number
50230
+ for (var k = 0; k < childrenLen; k++) {
50231
+ var child = children[k];
50232
+ if(subs[j] === child) {
50233
+ values["CHILD_ORDER"] = child["CHILD_ORDER"];
50234
+ this._dispatchDataChanged(subs[j], values);
50235
+ } else {
50236
+ var currentChild = child["CHILD_ORDER"];
50237
+ this._dispatchDataChanged(child, {
50238
+ X_RIC_NAME: child.ric,
50239
+ CHILD_ORDER: currentChild
50240
+ });
50241
+ }
50242
+ }
50243
+ this._dispatchPostUpdate({ childOrderChange: true });
50244
+ }
50027
50245
 
50028
- var jLen = subs.length;
50029
- for(var j = 0; j < jLen; ++j) {
50030
- this._dispatchDataChanged(subs[j], values);
50246
+ } else {
50247
+ values = this._generateQuoteData(sub, fields);
50248
+ jLen = subs.length;
50249
+ for(j = 0; j < jLen; ++j) { // It could be same ric and it need to dispatch with same ric number
50250
+ var childOrder = subs[j]["CHILD_ORDER"];
50251
+ if(childOrder != null) { // Children of chain will have a CHILD_ORDER
50252
+ values["CHILD_ORDER"] = childOrder;
50253
+ }
50254
+ this._dispatchDataChanged(subs[j], values);
50255
+ }
50031
50256
  }
50032
50257
  }
50033
50258
 
50034
50259
  this._connect();
50035
50260
  };
50261
+
50262
+ /** @private
50263
+ * @param {Object} obj
50264
+ */
50265
+ MockSubscriptions.prototype._dispatchPostUpdate = function (obj) {
50266
+ // TODO: handlded another property of "postUpdate" event
50267
+ this._dispatch("postUpdate", obj);
50268
+ };
50269
+
50036
50270
  /** @private
50037
50271
  * @param {Object} sub
50038
50272
  * @param {Object} fields
@@ -50112,6 +50346,7 @@ MockSubscriptions.prototype._updateDuplicateSymbol = function(ric) {
50112
50346
  for(i = 1; i < subCount; ++i) {
50113
50347
  var sub = subs[i];
50114
50348
  if(!sub["prevData"]) {
50349
+ // TODO: check in duplicate dynamic chain
50115
50350
  this._dispatchDataChanged(sub, prevData);
50116
50351
  }
50117
50352
  }
@@ -50137,6 +50372,7 @@ MockSubscriptions.prototype._updateDuplicateSymbol = function(ric) {
50137
50372
  var childSub2 = this._getChildSubByRic(sub2, childRic);
50138
50373
  if(childSub && childSub2) {
50139
50374
  if(childSub["prevData"]) {
50375
+ // TODO: check in duplicate dynamic chain
50140
50376
  this._dispatchDataChanged(childSub2, childSub["prevData"]);
50141
50377
  }
50142
50378
  }
@@ -50318,15 +50554,12 @@ MockArchive.prototype.filter = function(func) {
50318
50554
 
50319
50555
 
50320
50556
 
50321
- // CONCATENATED MODULE: ./node_modules/tr-grid-util/es6/jet/mockDataAPI.js
50322
-
50323
-
50324
-
50557
+ // CONCATENATED MODULE: ./node_modules/tr-grid-util/es6/jet/MockUtil.js
50325
50558
  /**
50326
- * @private
50327
- * @type {object}
50559
+ * @public
50560
+ * @type {Object}
50328
50561
  */
50329
- var _invalidFieldDict = {
50562
+ var invalidFieldDict = {
50330
50563
  'TR.NonExistField': true,
50331
50564
  'TR.NotExistField': true,
50332
50565
  'CF_IGNORE_FIELD': true
@@ -50338,104 +50571,27 @@ var _invalidFieldDict = {
50338
50571
  */
50339
50572
  function setInvalidFields(fields) {
50340
50573
  if (fields && typeof fields === 'string') {
50341
- _invalidFieldDict[fields] = true;
50574
+ invalidFieldDict[fields] = true;
50342
50575
  } else if (Array.isArray(fields)) {
50343
50576
  for (var i = 0; i < fields.length; i++) {
50344
- _invalidFieldDict[fields[i]] = true;
50577
+ invalidFieldDict[fields[i]] = true;
50345
50578
  }
50346
50579
  }
50347
50580
  }
50348
50581
 
50349
50582
 
50350
- var dataGen = new DataGenerator();
50351
-
50352
- /** @private
50353
- * @namespace
50354
- */
50355
- var DataGrid = {};
50356
-
50357
- /** @private
50358
- * @namespace
50359
- */
50360
- var Adc = {};
50361
-
50362
- /** @private
50363
- * @function
50364
- * @param {Object} payload
50365
- * @param {Object=} mockResponse
50366
- * @return {Promise}
50367
- */
50368
- DataGrid.request = function (payload, mockResponse) {
50369
- if (mockResponse) {
50370
- return Promise.resolve(JSON.stringify(mockResponse));
50371
- }
50372
-
50373
- var i, f, len, row;
50374
- var instruments = payload.instruments;
50375
- var fields = payload.fields;
50376
50583
 
50377
- // _invalidFieldDict is a dictionary of non exist field
50378
- // so we must remove invalid field to make "mocking api" return result more like a "real api".
50379
- var invalidDict = _invalidFieldDict;
50380
- fields = [];
50381
- for (i = 0; i < payload.fields.length; i++) {
50382
- f = payload.fields[i];
50383
- if (!invalidDict[f.name]) {
50384
- fields.push(f);
50385
- }
50386
- }
50584
+ // CONCATENATED MODULE: ./node_modules/tr-grid-util/es6/jet/Adc.js
50387
50585
 
50388
- // for filter duplicate instrument
50389
- var rowMap = {};
50390
50586
 
50391
- // build data
50392
- len = instruments.length;
50393
- var data2D = [];
50394
- var rowData = dataGen.generate(fields, len);
50395
- for (i = 0; i < len; ++i) {
50396
- var inst = instruments[i];
50397
- row = rowMap[inst];
50398
- if (!row) {
50399
- row = rowMap[inst] = rowData[i];
50400
- row.unshift(inst); // prepend instrument on each row
50401
- }
50402
- data2D.push(row);
50403
- }
50404
50587
 
50405
- // There is a chance that rtk will return multiple row data per instrument
50406
- // so we must create mock up for this case
50407
- if (data2D.length > 0) {
50408
- var chance = dataGen.randInt(1, 10);
50409
- if (chance <= 3) { // chance 30%
50410
- var pos = dataGen.randInt(0, data2D.length - 1); // random row pos
50411
- row = data2D[pos];
50412
- len = row.length;
50413
- var mockupRow = new Array(len);
50414
- mockupRow[0] = row[0]; // 1st index is for instrument
50415
- for (i = 1; i < len; i++) {
50416
- mockupRow[i] = ''; // real case will return null or empty string
50417
- }
50418
- data2D.splice(pos + 1, 0, mockupRow);
50419
- }
50420
- }
50421
50588
 
50422
- // build header
50423
- var headers = [{
50424
- "displayName": "Instrument"
50425
- }];
50426
- for (i = 0; i < fields.length; i++) {
50427
- f = fields[i];
50428
- headers.push({
50429
- "displayName": f.name,
50430
- "field": f.name.toUpperCase() // server only return in uppercase
50431
- });
50432
- }
50589
+ var dataGen = new DataGenerator();
50433
50590
 
50434
- return Promise.resolve(JSON.stringify({
50435
- data: data2D,
50436
- headers: [headers]
50437
- }));
50438
- };
50591
+ /** @private
50592
+ * @namespace
50593
+ */
50594
+ var Adc = {};
50439
50595
 
50440
50596
  /** @private
50441
50597
  * @function
@@ -50458,9 +50614,9 @@ Adc.request = function (payload, mockResponse) {
50458
50614
  formula = payload.formula.trim().split(/(?=,TR.)/);// TODO: check each field with another way, this doesn't work when user use some comma (,) formula
50459
50615
  fields = [];
50460
50616
 
50461
- // _invalidFieldDict is a dictionary of non exist field
50617
+ // invalidFieldDict is a dictionary of non exist field
50462
50618
  // so we must remove invalid field to make "mocking api" return result more like a "real api".
50463
- invalidDict = _invalidFieldDict;
50619
+ invalidDict = invalidFieldDict;
50464
50620
  for (i = 0; i < formula.length; i++) {
50465
50621
  f = formula[i];
50466
50622
  if (!invalidDict[f]) {
@@ -50590,9 +50746,9 @@ Adc.request = function (payload, mockResponse) {
50590
50746
  formula = Adc.splitFields(payload.formula);
50591
50747
  fields = [];
50592
50748
 
50593
- // _invalidFieldDict is a dictionary of non exist field
50749
+ // invalidFieldDict is a dictionary of non exist field
50594
50750
  // so we must remove invalid field to make "mocking api" return result more like a "real api".
50595
- invalidDict = _invalidFieldDict;
50751
+ invalidDict = invalidFieldDict;
50596
50752
  for (i = 0; i < formula.length; i++) {
50597
50753
  f = formula[i];
50598
50754
  if (!invalidDict[f]) {
@@ -50693,6 +50849,98 @@ Adc.splitFields = function(strFields) {
50693
50849
  return fields;
50694
50850
  };
50695
50851
 
50852
+
50853
+
50854
+ // CONCATENATED MODULE: ./node_modules/tr-grid-util/es6/jet/mockDataAPI.js
50855
+
50856
+
50857
+
50858
+
50859
+ var mockDataAPI_dataGen = new DataGenerator();
50860
+
50861
+ /** @private
50862
+ * @namespace
50863
+ */
50864
+ var DataGrid = {};
50865
+
50866
+ /** @private
50867
+ * @function
50868
+ * @param {Object} payload
50869
+ * @param {Object=} mockResponse
50870
+ * @return {Promise}
50871
+ */
50872
+ DataGrid.request = function (payload, mockResponse) {
50873
+ if (mockResponse) {
50874
+ return Promise.resolve(JSON.stringify(mockResponse));
50875
+ }
50876
+
50877
+ var i, f, len, row;
50878
+ var instruments = payload.instruments;
50879
+ var fields = payload.fields;
50880
+
50881
+ // _invalidFieldDict is a dictionary of non exist field
50882
+ // so we must remove invalid field to make "mocking api" return result more like a "real api".
50883
+ var invalidDict = invalidFieldDict;
50884
+ fields = [];
50885
+ for (i = 0; i < payload.fields.length; i++) {
50886
+ f = payload.fields[i];
50887
+ if (!invalidDict[f.name]) {
50888
+ fields.push(f);
50889
+ }
50890
+ }
50891
+
50892
+ // for filter duplicate instrument
50893
+ var rowMap = {};
50894
+
50895
+ // build data
50896
+ len = instruments.length;
50897
+ var data2D = [];
50898
+ var rowData = mockDataAPI_dataGen.generate(fields, len);
50899
+ for (i = 0; i < len; ++i) {
50900
+ var inst = instruments[i];
50901
+ row = rowMap[inst];
50902
+ if (!row) {
50903
+ row = rowMap[inst] = rowData[i];
50904
+ row.unshift(inst); // prepend instrument on each row
50905
+ }
50906
+ data2D.push(row);
50907
+ }
50908
+
50909
+ // There is a chance that rtk will return multiple row data per instrument
50910
+ // so we must create mock up for this case
50911
+ if (data2D.length > 0) {
50912
+ var chance = mockDataAPI_dataGen.randInt(1, 10);
50913
+ if (chance <= 3) { // chance 30%
50914
+ var pos = mockDataAPI_dataGen.randInt(0, data2D.length - 1); // random row pos
50915
+ row = data2D[pos];
50916
+ len = row.length;
50917
+ var mockupRow = new Array(len);
50918
+ mockupRow[0] = row[0]; // 1st index is for instrument
50919
+ for (i = 1; i < len; i++) {
50920
+ mockupRow[i] = ''; // real case will return null or empty string
50921
+ }
50922
+ data2D.splice(pos + 1, 0, mockupRow);
50923
+ }
50924
+ }
50925
+
50926
+ // build header
50927
+ var headers = [{
50928
+ "displayName": "Instrument"
50929
+ }];
50930
+ for (i = 0; i < fields.length; i++) {
50931
+ f = fields[i];
50932
+ headers.push({
50933
+ "displayName": f.name,
50934
+ "field": f.name.toUpperCase() // server only return in uppercase
50935
+ });
50936
+ }
50937
+
50938
+ return Promise.resolve(JSON.stringify({
50939
+ data: data2D,
50940
+ headers: [headers]
50941
+ }));
50942
+ };
50943
+
50696
50944
  /** @public
50697
50945
  * @function
50698
50946
  * @param {string} dataType