@refinitiv-ui/efx-grid 6.0.67 → 6.0.68

Sign up to get free protection for your applications and to get access to all the features.
@@ -124,7 +124,6 @@ var ColumnDefinition = function(columnOption, hostGrid) {
124
124
  this._classes = [];
125
125
  this._requiredFields = [];
126
126
  this._children = [];
127
- this._parent = [];
128
127
 
129
128
  if(columnOption) {
130
129
  if(columnOption["parent"]) { // WARNING: This assume time series child, when have a parent
@@ -1030,8 +1029,9 @@ ColumnDefinition.prototype._setField = function(field, columnOption) {
1030
1029
  // We need to cache time series in field definition for improve performance of checking methond
1031
1030
  FieldDefinition.setFieldProperty(field, "timeSeries", FieldDefinition.isTimeSeries(field) ? true : false);
1032
1031
 
1033
- if(columnOption && columnOption["parent"]) {
1034
- FieldDefinition.setFieldProperty(field, "timeSeriesChild", true);
1032
+ var parentColDef = columnOption["parent"];
1033
+ if(columnOption && parentColDef) {
1034
+ FieldDefinition.setFieldProperty(field, "timeSeriesParent", parentColDef.getField());
1035
1035
  }
1036
1036
 
1037
1037
  this._updateContext("field", field);
@@ -280,7 +280,7 @@ FieldDefinition.isRealTimeField = function(field) {
280
280
  * @return {boolean}
281
281
  */
282
282
  FieldDefinition.isTimeSeriesChild = function(field) {
283
- return FieldDefinition.getFieldProperty(field, "timeSeriesChild") ? true : false;
283
+ return FieldDefinition.getFieldProperty(field, "timeSeriesParent") ? true : false;
284
284
  };
285
285
 
286
286
  /** @public
@@ -308,12 +308,12 @@ FieldDefinition.isTimeSeries = function (field) {
308
308
  [\w]+ => any field with string and value
309
309
  [\(] => open bucket (
310
310
  [\w\-\=\,]* => any property name and follow by = EX. SDATE=2011-11-11, PRIOD=123123
311
- EDATE\=+ => EDATE in bucket
311
+ (?:EDATE|SDATE ) => non-capturing group match EDATE or SDATE
312
312
  [\w\-\=\,]+ => another propertie param
313
313
  [\)]$ => end with only )
314
314
  i => for match both upper and lower cases
315
315
  */
316
- var timeSeriesRegex = /^TR.[\w]+[\(][\w\-\=\,]*EDATE\=+[\w\-\=\,]+[\)]$/i;
316
+ var timeSeriesRegex = /^TR\.[\w]+\([\w\-\=\,]*(?:EDATE|SDATE)\=+[\w\-\=\,]*[ \w]*\)$/i;
317
317
  return timeSeriesRegex.test(field);
318
318
  };
319
319
 
@@ -1142,7 +1142,7 @@ Grid.prototype.getConfigObject = function (gridOptions) {
1142
1142
  }
1143
1143
 
1144
1144
 
1145
- var i, len;
1145
+ var i, len, prevTimeSeriesField;
1146
1146
  len = this.getColumnCount();
1147
1147
  for (i = 0; i < len; ++i) {
1148
1148
  var column = columns[i];
@@ -1152,9 +1152,19 @@ Grid.prototype.getConfigObject = function (gridOptions) {
1152
1152
  var colDef = this.getColumnDefinition(i);
1153
1153
  // TODO: Update width and scalability changed by the extensions
1154
1154
  colDef.getConfigObject(column);
1155
- }
1155
+ var parentField = FieldDefinition.getFieldProperty(colDef.getField(), "timeSeriesParent");
1156
+ if(parentField && !prevTimeSeriesField) { // Assume first column of time series child to convert to time series parent
1157
+ prevTimeSeriesField = parentField;
1158
+ column.field = parentField;
1159
+ delete column.name; // WARNING: Name of child should be retained
1160
+ delete column.autoGenerated; // Convert to parent time series field
1161
+ }
1156
1162
 
1157
- obj.columns = columns = columns.filter(_byNonAutoGeneratedColumn);
1163
+ if(!parentField && prevTimeSeriesField) { // Handled duplicate parent time series field in difference position of column
1164
+ prevTimeSeriesField = null;
1165
+ }
1166
+ }
1167
+ obj.columns = columns = columns.filter(_byNonAutoGeneratedColumn); // Time series child will be filtered out
1158
1168
 
1159
1169
  if(this._topNode.style.overflow === "") {
1160
1170
  obj["scrollbar"] = false;
@@ -1409,52 +1419,49 @@ Grid.prototype.insertColumn = function (columnOption, idx) {
1409
1419
  this._grid.insertColumn(idx, configObj); // columnAdded is fired
1410
1420
  };
1411
1421
 
1412
- /** @private
1422
+ /**
1423
+ * @private
1413
1424
  * @param {Object} e snapshort change event object
1414
1425
  */
1415
1426
  Grid.prototype._updateTimeSeriesFields = function (e) {
1416
- var snapShortData = e.data;
1417
- var childFields;
1418
- for (var ric in snapShortData) {
1419
- childFields = snapShortData[ric];
1420
- this.setRicData(ric, snapShortData[ric]);
1427
+ var childField;
1428
+ var snapShotData = e.data;
1429
+ var childFields = {};
1430
+ for (var ric in snapShotData) {
1431
+ // childFields = snapShotData[ric];
1432
+ for (childField in snapShotData[ric]) {
1433
+ childFields[childField] = true; // Merge child fields to parent (Don't truth each ric it will be have some empty data)
1434
+ }
1435
+ this.setRicData(ric, snapShotData[ric]); // update cell data if exist
1421
1436
  }
1422
1437
  var parentField, field, colIndex, parentColDef, childColIndex;
1423
-
1424
- var firstField;
1425
- for (field in childFields) {
1426
- firstField = field;
1427
- break;
1428
- }
1429
-
1430
- parentField = e.childrenFieldToParent[firstField];
1431
- colIndex = this.getColumnIndex(parentField);
1432
- this._grid.setColumnVisibility(colIndex);
1433
- parentColDef = this._getColumnDefinition(colIndex);
1434
-
1435
-
1436
- var children = parentColDef.getChildren();
1437
- var i, len, childDef, childField;
1438
- len = children.length;
1439
- if(len > 0){
1440
- for (i = 0; i < len; i++) {
1441
- childDef = children[i];
1442
- childField = childDef.getField();
1443
- if(!childFields[childField]) {
1444
- this.removeColumn(childField);
1445
- }
1438
+ var parentMap = {}; // map parent time series field and their first child
1439
+ for (field in childFields) { // Warning: data change can be differ time series child field
1440
+ parentField = e.childrenFieldToParent[field];
1441
+ if(!parentMap[parentField]) {
1442
+ parentMap[parentField] = [field];
1443
+ } else {
1444
+ parentMap[parentField].push(field);
1446
1445
  }
1447
1446
  }
1448
1447
 
1449
- for (childField in childFields) {
1450
- parentField = e.childrenFieldToParent[childField];
1448
+ for (parentField in parentMap) { // WARNING: one dataChanged event can be multiple fields
1449
+ var childrenField = parentMap[parentField];
1451
1450
  colIndex = this.getColumnIndex(parentField);
1452
1451
  parentColDef = this._getColumnDefinition(colIndex);
1453
- childColIndex = this.getColumnIndex(childField);
1454
- if(childColIndex < 0) { // not found column index in view tried to clone from parent
1455
- this._cloneTimeSeriesColumn(parentColDef, childField, colIndex);
1456
- FieldDefinition.addTimeSeriesChild(parentField, childField);
1452
+ var i, len;
1453
+ len = childrenField.length;
1454
+ for (i = 0; i < len; i++) {
1455
+ childField = childrenField[i];
1456
+ childColIndex = this.getColumnIndex(childField);
1457
+ if(childColIndex < 0) { // not found column index in view tried to clone from parent
1458
+ colIndex = this.getColumnIndex(parentField);
1459
+ parentColDef = this._getColumnDefinition(colIndex);
1460
+ this._cloneTimeSeriesColumn(parentColDef, childField, colIndex);
1461
+ FieldDefinition.addTimeSeriesChild(parentField, childField); // TODO: time series child can be difference of response even if the input is the same, It should be dynamic add/remove fields
1462
+ }
1457
1463
  }
1464
+ this.removeColumn(parentField);
1458
1465
  }
1459
1466
 
1460
1467
  };
@@ -1474,12 +1481,12 @@ Grid.prototype._populateTimeSeriesChildren = function (colDef) {
1474
1481
  for (i = 0; i < colDefs.length; i++) {
1475
1482
  colDef = colDefs[i];
1476
1483
  idx = this.getColumnIndex(colDef);
1477
- this._grid.setColumnVisibility(idx); // hide parent field
1478
1484
 
1479
1485
  if(!colDef) {
1480
1486
  continue;
1481
1487
  }
1482
- var childFields = FieldDefinition.getTimeSeriesChildren(colDef.getField());
1488
+ var parentField = colDef.getField();
1489
+ var childFields = FieldDefinition.getTimeSeriesChildren(parentField);
1483
1490
  if(!childFields) { // not found time series field
1484
1491
  return;
1485
1492
  }
@@ -1504,18 +1511,14 @@ Grid.prototype._populateTimeSeriesChildren = function (colDef) {
1504
1511
  * @param {number} idx index of insertion column
1505
1512
  */
1506
1513
  Grid.prototype._cloneTimeSeriesColumn = function (parentColDef, childField, idx) {
1507
- var parentConfig, columnOption, obj, key;
1514
+ var parentConfig, columnOption;
1508
1515
  parentConfig = parentColDef.getConfigObject();
1509
- obj = {};
1510
- for (key in parentConfig) {
1511
- if(key !== "hidden") {
1512
- obj[key] = parentConfig[key];
1513
- }
1514
- }
1515
- columnOption = cloneObject(obj);
1516
+ columnOption = cloneObject(parentConfig);
1516
1517
  columnOption["field"] = childField.replace("TR.", ""); // We need to remove the 'TR' prefix from the field to avoid confusion with time series fields.
1517
1518
  columnOption["name"] = childField.split("_")[1].split("T")[0]; // Currently, response server format utc date ex "2022-11-23T00:00:00"
1518
1519
  columnOption["parent"] = parentColDef;
1520
+ columnOption["timeSeriesName"] = parentColDef.getName();
1521
+ columnOption["timeSeriesId"] = parentColDef.getId();
1519
1522
  this.insertColumn(columnOption, idx++);
1520
1523
 
1521
1524
  };
@@ -1581,10 +1584,6 @@ Grid.prototype.replaceColumn = function (columnOption, colRef) {
1581
1584
  }
1582
1585
 
1583
1586
  var colDef = this.getColumnDefinition(colIndex);
1584
- if(colDef && colDef.getChildren().length > 0) { // Parent time series field doesn't provide hidden property
1585
- colConfig["hidden"] = false;
1586
- }
1587
-
1588
1587
  if(colDef && colConfig.id == null) {
1589
1588
  colConfig.id = colDef.getId(); // retain ID
1590
1589
  }
@@ -1920,18 +1919,6 @@ Grid.prototype.removeColumn = function(colRef) {
1920
1919
  }
1921
1920
 
1922
1921
  var colDef = this.getColumnDefinition(colIndex);
1923
- var children = colDef.getChildren();
1924
- if(children) {
1925
- var len = children.length;
1926
- if(len > 0) { // remove time series child
1927
- var i, childDef;
1928
- for (i = 0; i < len; i++) {
1929
- childDef = children[i];
1930
- this.removeColumn(childDef);
1931
- }
1932
- colIndex = this.getColumnIndex(colRef); // children in parent will be remove the parent should be get new index
1933
- }
1934
- }
1935
1922
 
1936
1923
  if(!colDef.isRealTimeField()) {
1937
1924
  if(this._dc) {
@@ -2064,18 +2051,7 @@ Grid.prototype.hideColumn = function(colRef, hidden) {
2064
2051
  if(colIndex < 0) { // not found
2065
2052
  return;
2066
2053
  }
2067
- var colDef = this.getColumnDefinition(colIndex);
2068
- var children = colDef.getChildren();
2069
- var len = children.length;
2070
- if(len > 0) { // remove time series child, and parent shouldn't unHide
2071
- var i, childDef;
2072
- for (i = 0; i < len; i++) {
2073
- childDef = children[i];
2074
- this.hideColumn(childDef, hidden);
2075
- }
2076
- } else {
2077
- this._grid.hideColumn(colIndex, hidden);
2078
- }
2054
+ this._grid.hideColumn(colIndex, hidden);
2079
2055
 
2080
2056
  };
2081
2057
  /** Hide multiple columns at once. The hidden columns still occupy the same index.
@@ -8,8 +8,16 @@ declare class SnapshotFiller extends EventDispatcher {
8
8
 
9
9
  constructor();
10
10
 
11
+ public static readonly _mockAdc: any;
12
+
11
13
  public setRTK(rtk: any): void;
12
14
 
15
+ public static setMockAdc(str: string, value: any): void;
16
+
17
+ public static getMockAdc(str: string): any;
18
+
19
+ public static clearMockAdc(): void;
20
+
13
21
  public setADCOptions(adcOptions: Grid.ADCOptions|null): void;
14
22
 
15
23
  public addRic(ric: string): void;
@@ -50,6 +50,43 @@ SnapshotFiller.prototype.setRTK = function (rtk) {
50
50
  this._rtk = rtk;
51
51
  };
52
52
 
53
+ /**
54
+ * @public
55
+ * @type {Object}
56
+ */
57
+ SnapshotFiller._mockAdc = null;
58
+
59
+ /**
60
+ * @public
61
+ * @param {string} str
62
+ * @param {*} value
63
+ */
64
+ SnapshotFiller.setMockAdc = function(str, value) {
65
+ if(!SnapshotFiller._mockAdc) {
66
+ SnapshotFiller._mockAdc = {};
67
+ }
68
+ SnapshotFiller._mockAdc[str] = value;
69
+ };
70
+
71
+ /**
72
+ * @public
73
+ * @param {string} str
74
+ * @return {*}
75
+ */
76
+ SnapshotFiller.getMockAdc = function(str) {
77
+ if(!SnapshotFiller._mockAdc) {
78
+ return null;
79
+ }
80
+ return SnapshotFiller._mockAdc[str];
81
+ };
82
+
83
+ /**
84
+ * @public
85
+ */
86
+ SnapshotFiller.clearMockAdc = function() {
87
+ SnapshotFiller._mockAdc = null;
88
+ }
89
+
53
90
  /** @public
54
91
  * @param {Grid~ADCOptions} adcOptions ADC requesting level parameter options
55
92
  */
@@ -215,12 +252,19 @@ SnapshotFiller.prototype._onRequest = function () {
215
252
  "output": "Col,date|,Row,In|,va,T,NoEmptyTickers" // For customize output server, for more information please visit "https://confluence.refinitiv.com/display/ADC/Data+Cloud+Output+Format"
216
253
  };
217
254
  onSuccess = this._onRTKTimeSeriesSuccess.bind(this, timeSeriesFields);
218
- this._rtk.Data.Adc
255
+ var responseMockAdc = SnapshotFiller.getMockAdc(payload.formula);
256
+ if(responseMockAdc) {
257
+ setTimeout(function() {
258
+ onSuccess(responseMockAdc);
259
+ }, 10); // Mock Async operation
260
+ } else {
261
+ this._rtk.Data.Adc
219
262
  .request(payload)
220
263
  .then(onSuccess)
221
264
  .catch(function (err) {
222
265
  console.log(err);
223
266
  });
267
+ }
224
268
  }
225
269
 
226
270
  // Request normal adc field
@@ -421,61 +465,66 @@ SnapshotFiller.prototype._onRTKTimeSeriesSuccess = function (fields, serverResul
421
465
  if (!Array.isArray(data2D) || !Array.isArray(svHeaders)) {
422
466
  return; // TODO: Return Promise.reject(errMsg);
423
467
  }
424
-
425
- var headerLen = svHeaders.length;
426
-
427
- var headerDates = [];
428
- var i, j;
429
-
430
- for (i = 2; i < headerLen; i++) { // Start with 2 (Skip instrunment and date header)
431
- headerDates.push(svHeaders[i].v);
432
- }
433
-
434
- var ric, j, field;
435
- var len = data2D.length;
436
- var ricMap = {};
437
- var childrenFieldToParent = {};
438
-
468
+ // Extract header dates
469
+ var headerDates = svHeaders.slice(2).map(header => header.v);
470
+ // Create necessary variables
439
471
  var fileNameToTSField = {};
440
472
  var count = 0;
441
- for (let i = 1; i < len; i++) {
473
+ // Convert map to fieldMap
474
+ var data2DLength = data2D.length;
475
+ for (var i = 1; i < data2DLength; i++) {
442
476
  var dataRow = data2D[i];
443
477
  var fieldName = dataRow[1];
444
- if(!fileNameToTSField[fieldName]) {
478
+ if (!fileNameToTSField[fieldName]) {
445
479
  fileNameToTSField[fieldName] = fields[count++];
446
- }
480
+ }
447
481
  }
448
-
449
- // TODO: Freeze the data view before setting multiple data
450
- for (i = 1; i < len; i++) { // to skip column header index, use i = 1
482
+ // Process data and populate ricMap and childrenFieldToParent
483
+ var ricMap = {};
484
+ var childrenFieldToParent = {};
485
+ for (var i = 1; i < data2DLength; i++) {
451
486
  var dataRow = data2D[i];
452
- ric = dataRow[0];
453
- var fieldName = dataRow[1]; // ex. PRICECLOSE
454
- if(!ricMap[ric]) {
487
+ var ric = dataRow[0];
488
+ var fieldName = dataRow[1];
489
+
490
+ if (!ricMap[ric]) {
455
491
  ricMap[ric] = {};
456
492
  }
457
493
  var snapData = ricMap[ric];
458
- for (var k = 0; k < headerDates.length; k++) {
459
- field = fileNameToTSField[fieldName].replace("TR.", "") + "_" + headerDates[k]; // TODO: make support time series field definition cache
460
- childrenFieldToParent[field] = fileNameToTSField[fieldName];
461
- snapData[field] = dataRow[2 + k]; // Start with field value
494
+ if (headerDates.length === 1) {
495
+ // Time series with only 1 column, it will be a normal adc field
496
+ snapData[fileNameToTSField[fieldName]] = dataRow[2];
497
+ } else {
498
+ // Multiple columns, it will be a time series field
499
+ for (var k = 0; k < headerDates.length; k++) {
500
+ var field = fileNameToTSField[fieldName].replace("TR.", "") + "_" + headerDates[k];
501
+ var celLData = dataRow[2 + k];
502
+ if(celLData !== null) {
503
+ childrenFieldToParent[field] = fileNameToTSField[fieldName];
504
+ snapData[field] = celLData;
505
+ }
506
+ }
462
507
  }
463
508
  }
464
509
 
465
- // return result only ric that has update data
510
+ // Return result only for ric that has updated data
466
511
  var dataMapping = {};
467
- for (ric in ricMap) {
512
+ for (var ric in ricMap) {
468
513
  var obj = ricMap[ric];
469
514
  if (!isEmptyObject(obj)) {
470
515
  dataMapping[ric] = obj;
471
516
  }
472
517
  }
473
518
 
474
- this._dispatch("dataChanged", {
519
+ // Dispatch events based on the header length
520
+ var eventData = {
475
521
  data: dataMapping,
476
- timeSeries: true,
477
- childrenFieldToParent: childrenFieldToParent
478
- });
522
+ };
523
+ if (headerDates.length > 1) {
524
+ eventData.timeSeries = true;
525
+ eventData.childrenFieldToParent = childrenFieldToParent;
526
+ }
527
+ this._dispatch("dataChanged", eventData);
479
528
  };
480
529
 
481
530
  export { SnapshotFiller };
@@ -36,7 +36,6 @@ var ColumnGroupingPlugin = function ColumnGroupingPlugin(options) {
36
36
  t._requestApplyAddChildGroup = t._requestApplyAddChildGroup.bind(this);
37
37
  t._onPostSectionRender = t._onPostSectionRender.bind(t);
38
38
  t._onBeforeColumnBoundUpdate = t._onBeforeColumnBoundUpdate.bind(t);
39
- t._onPinningChanged = t._onPinningChanged.bind(this);
40
39
  t._groupDefs = new GroupDefinitions();
41
40
  if (options) {
42
41
  t.config({
@@ -84,10 +83,6 @@ ColumnGroupingPlugin.prototype._addingEvents = null;
84
83
  * @private
85
84
  */
86
85
  ColumnGroupingPlugin.prototype._legacyColumnGroups = null;
87
- /** @type {boolean}
88
- * @private
89
- */
90
- ColumnGroupingPlugin.prototype._inPinning = false;
91
86
  /** @type {!Object.<string, boolean>}
92
87
  * @description A map of selected groups
93
88
  * @private
@@ -211,6 +206,15 @@ ColumnGroupingPlugin._recursivelyFlatten = function (groupDef, groupDefs) {
211
206
  }
212
207
  };
213
208
 
209
+ /** Filter time series group out
210
+ * @private
211
+ * @param {Object} groupDef
212
+ * @return {boolean}
213
+ */
214
+ ColumnGroupingPlugin._isNotTimeSeriesGroup = function (groupDef) {
215
+ return groupDef.timeSeriesGroup ? false : true;
216
+ };
217
+
214
218
  /** @public
215
219
  * @return {string}
216
220
  */
@@ -247,7 +251,6 @@ ColumnGroupingPlugin.prototype.initialize = function (host, options) {
247
251
  host.listen("columnVisibilityChanged", this._onColumnChanged);
248
252
  host.listen("postSectionRender", this._onPostSectionRender);
249
253
  host.listen("beforeColumnBoundUpdate", this._onBeforeColumnBoundUpdate);
250
- host.listen("pinningChanged", this._onPinningChanged);
251
254
  }
252
255
  this.config(options);
253
256
  this._legacyColumnGroups = null;
@@ -301,7 +304,6 @@ ColumnGroupingPlugin.prototype.unload = function (host) {
301
304
  host.unlisten("columnRemoved", this._onColumnRemoved);
302
305
  host.unlisten("postSectionRender", this._onPostSectionRender);
303
306
  host.unlisten("beforeColumnBoundUpdate", this._onBeforeColumnBoundUpdate);
304
- host.unlisten("pinningChanged", this._onPinningChanged);
305
307
  if (!this._hosts.length) {
306
308
  if (this._rerenderTimerId) {
307
309
  clearTimeout(this._rerenderTimerId);
@@ -350,6 +352,7 @@ ColumnGroupingPlugin.prototype.getConfigObject = function (gridOptions) {
350
352
 
351
353
  // TODO: Handle legacyRender method that has been migrated
352
354
  var groupDefs = this.getGroupDefinitions();
355
+ groupDefs = groupDefs.filter(ColumnGroupingPlugin._isNotTimeSeriesGroup);
353
356
  if (groupDefs.length) {
354
357
  obj.columnGrouping = groupDefs;
355
358
  }
@@ -429,12 +432,10 @@ ColumnGroupingPlugin.prototype._migrateLegacyStructure = function (groupDefs, co
429
432
  * @param {number=} numRightColumn
430
433
  */
431
434
  ColumnGroupingPlugin.prototype._freezeColumn = function (frozenColIndex, numRightColumn) {
432
- this._inPinning = true;
433
435
  var hosts = this._hosts;
434
436
  for (var i = 0; i < hosts.length; i++) {
435
437
  hosts[i].freezeColumn(frozenColIndex, numRightColumn);
436
438
  }
437
- this._inPinning = false;
438
439
  };
439
440
  /** @private
440
441
  */
@@ -893,28 +894,38 @@ ColumnGroupingPlugin.prototype._requestApplyAddChildGroup = function (e) {
893
894
  };
894
895
 
895
896
  /** @private
896
- * @param {Object} e dispatching of columnAdded event object
897
- */
897
+ * @param {Object} e dispatching of columnAdded event object
898
+ */
898
899
  ColumnGroupingPlugin.prototype._applyTimeSeries = function (e) {
899
900
  this._addingTimerId = 0; // clear timer
900
901
  var addingEvents = this._addingEvents;
901
902
  this._addingEvents = [];
902
903
  if (addingEvents.length > 0) {
903
904
  var children = [];
904
- var tsParentDef;
905
+ var timeSeriesId, timeSeriesName;
906
+ var tsgChild = {};
905
907
  for (var i = 0; i < addingEvents.length; i++) {
908
+ // WARNING: addingEvents column can be difference group
906
909
  var addingEvent = addingEvents[i];
907
- tsParentDef = addingEvent.context.parent;
908
- if (tsParentDef) {
909
- var childIndex = addingEvent.colIndex; // Assume time series column ordered
910
- var childId = this.getColumnId(childIndex);
911
- children.push(childId);
910
+ timeSeriesName = addingEvent.context.timeSeriesName;
911
+ timeSeriesId = addingEvent.context.timeSeriesId;
912
+ var childIndex, childId;
913
+ if (!tsgChild[timeSeriesId]) {
914
+ tsgChild[timeSeriesId] = {
915
+ name: timeSeriesName,
916
+ children: []
917
+ };
918
+ childIndex = addingEvent.colIndex;
919
+ childId = this.getColumnId(childIndex);
920
+ tsgChild[timeSeriesId].children.push(childId);
921
+ } else {
922
+ childIndex = addingEvent.colIndex;
923
+ childId = this.getColumnId(childIndex);
924
+ tsgChild[timeSeriesId].children.push(childId);
912
925
  }
913
926
  }
914
- if (tsParentDef) {
915
- var parentName = tsParentDef.getName();
916
- var parentId = tsParentDef.getId();
917
- var groupId = "timeSerieGroup_" + parentId;
927
+ for (timeSeriesId in tsgChild) {
928
+ var groupId = "timeSerieGroup_" + timeSeriesId;
918
929
  var groupDef = this._groupDefs.getGroup(groupId);
919
930
  if (groupDef) {
920
931
  // add children time series field to parent
@@ -925,12 +936,14 @@ ColumnGroupingPlugin.prototype._applyTimeSeries = function (e) {
925
936
  // create new group
926
937
  this.addGroup({
927
938
  id: groupId,
928
- title: parentName,
929
- children: children
939
+ title: tsgChild[timeSeriesId].name,
940
+ children: tsgChild[timeSeriesId].children,
941
+ timeSeriesGroup: true // For remove it when getConfigObject
930
942
  });
931
943
  }
932
944
  }
933
945
  }
946
+
934
947
  this._requestApplyGrouping();
935
948
  };
936
949
 
@@ -979,22 +992,6 @@ ColumnGroupingPlugin.prototype._onColumnRemoved = function (e) {
979
992
  /** @private
980
993
  * @param {Object} e
981
994
  */
982
- ColumnGroupingPlugin.prototype._onPinningChanged = function (e) {
983
- if (!this._inPinning) {
984
- // Clear current pinning states
985
- var groupMap = this._visibleGroupMap;
986
- for (var groupId in groupMap) {
987
- var groupDef = groupMap[groupId];
988
- groupDef.leftPinned = false;
989
- groupDef.rightPinned = false;
990
- }
991
- this._verifyColumnPinning();
992
- this._applyPinning();
993
- }
994
- };
995
- /** @private
996
- * @param {Object} e
997
- */
998
995
  ColumnGroupingPlugin.prototype._onBeforeColumnBoundUpdate = function (e) {
999
996
  var selectedColumns = e.selectedColumns; // Hidden columns are included
1000
997