@refinitiv-ui/efx-grid 6.0.33 → 6.0.35

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. package/lib/column-dragging/es6/ColumnDragging.js +50 -40
  2. package/lib/core/dist/core.js +210 -38
  3. package/lib/core/dist/core.min.js +1 -1
  4. package/lib/core/es6/data/DataTable.d.ts +3 -1
  5. package/lib/core/es6/data/DataTable.js +27 -9
  6. package/lib/core/es6/data/DataView.d.ts +2 -0
  7. package/lib/core/es6/data/DataView.js +12 -1
  8. package/lib/core/es6/data/Segment.d.ts +2 -0
  9. package/lib/core/es6/data/Segment.js +16 -0
  10. package/lib/core/es6/data/SegmentCollection.d.ts +1 -3
  11. package/lib/core/es6/data/SegmentCollection.js +25 -18
  12. package/lib/core/es6/grid/Core.d.ts +12 -0
  13. package/lib/core/es6/grid/Core.js +64 -2
  14. package/lib/core/es6/grid/plugins/SortableTitlePlugin.js +13 -7
  15. package/lib/grid/index.js +1 -1
  16. package/lib/grid/themes/halo/dark/efx-grid.js +1 -1
  17. package/lib/grid/themes/halo/dark/es5/all-elements.js +1 -1
  18. package/lib/grid/themes/halo/efx-grid.less +3 -1
  19. package/lib/grid/themes/halo/light/efx-grid.js +1 -1
  20. package/lib/grid/themes/halo/light/es5/all-elements.js +1 -1
  21. package/lib/rt-grid/dist/rt-grid.js +766 -293
  22. package/lib/rt-grid/dist/rt-grid.min.js +1 -1
  23. package/lib/rt-grid/es6/ColumnDefinition.js +13 -8
  24. package/lib/rt-grid/es6/DataConnector.js +3 -2
  25. package/lib/rt-grid/es6/Grid.d.ts +3 -1
  26. package/lib/rt-grid/es6/Grid.js +148 -40
  27. package/lib/rt-grid/es6/RowDefSorter.d.ts +5 -5
  28. package/lib/rt-grid/es6/RowDefSorter.js +165 -71
  29. package/lib/rt-grid/es6/RowDefinition.d.ts +7 -2
  30. package/lib/rt-grid/es6/RowDefinition.js +48 -10
  31. package/lib/rt-grid/es6/SnapshotFiller.d.ts +1 -0
  32. package/lib/rt-grid/es6/SnapshotFiller.js +1 -11
  33. package/lib/tr-grid-column-selection/es6/ColumnSelection.js +66 -0
  34. package/lib/tr-grid-column-stack/es6/ColumnStack.d.ts +2 -0
  35. package/lib/tr-grid-column-stack/es6/ColumnStack.js +38 -13
  36. package/lib/tr-grid-conditional-coloring/es6/ConditionalColoring.d.ts +12 -5
  37. package/lib/tr-grid-conditional-coloring/es6/ConditionalColoring.js +128 -42
  38. package/lib/tr-grid-heat-map/es6/HeatMap.d.ts +3 -3
  39. package/lib/tr-grid-heat-map/es6/HeatMap.js +13 -2
  40. package/lib/tr-grid-row-dragging/es6/RowDragging.d.ts +2 -1
  41. package/lib/tr-grid-row-dragging/es6/RowDragging.js +153 -17
  42. package/lib/tr-grid-rowcoloring/es6/RowColoring.js +3 -2
  43. package/lib/tr-grid-textformatting/es6/TextFormatting.d.ts +20 -20
  44. package/lib/tr-grid-textformatting/es6/TextFormatting.js +37 -138
  45. package/lib/tr-grid-util/es6/CellPainter.d.ts +1 -1
  46. package/lib/tr-grid-util/es6/CellPainter.js +56 -55
  47. package/lib/tr-grid-util/es6/DragUI.js +7 -3
  48. package/lib/tr-grid-util/es6/FieldFormatter.js +6 -2
  49. package/lib/tr-grid-util/es6/NumberFormatter.js +23 -11
  50. package/lib/tr-grid-util/es6/Util.d.ts +3 -0
  51. package/lib/tr-grid-util/es6/Util.js +53 -0
  52. package/lib/tr-grid-util/es6/jet/DataGenerator.js +36 -33
  53. package/lib/types/es6/ColumnStack.d.ts +2 -0
  54. package/lib/types/es6/ConditionalColoring.d.ts +12 -5
  55. package/lib/types/es6/Core/data/DataTable.d.ts +3 -1
  56. package/lib/types/es6/Core/data/DataView.d.ts +2 -0
  57. package/lib/types/es6/Core/data/Segment.d.ts +2 -0
  58. package/lib/types/es6/Core/data/SegmentCollection.d.ts +1 -3
  59. package/lib/types/es6/Core/grid/Core.d.ts +4 -0
  60. package/lib/types/es6/Core/grid/plugins/SortableTitlePlugin.d.ts +1 -0
  61. package/lib/types/es6/HeatMap.d.ts +3 -3
  62. package/lib/types/es6/RealtimeGrid/Grid.d.ts +3 -1
  63. package/lib/types/es6/RealtimeGrid/RowDefSorter.d.ts +5 -5
  64. package/lib/types/es6/RealtimeGrid/RowDefinition.d.ts +7 -2
  65. package/lib/types/es6/RealtimeGrid/SnapshotFiller.d.ts +1 -0
  66. package/lib/types/es6/RowDragging.d.ts +2 -1
  67. package/lib/types/es6/TextFormatting.d.ts +20 -20
  68. package/lib/versions.json +9 -9
  69. package/package.json +1 -1
@@ -13,16 +13,16 @@ declare namespace ConditionalColoringPlugin {
13
13
 
14
14
  type ColumnOptions = {
15
15
  conditions?: (ConditionalColoringPlugin.Condition)[]|null,
16
- colorText?: (string|boolean)|null,
17
- tickColor?: (string|boolean)|null,
18
- blinking?: (ConditionalColoringPlugin.Blinking|boolean)|null,
16
+ colorText?: (string|boolean|ConditionalColoringPlugin.ColorText)|null,
17
+ tickColor?: (string|boolean|ConditionalColoringPlugin.ColorText)|null,
18
+ blinking?: (string|boolean|ConditionalColoringPlugin.Blinking)|null,
19
19
  field?: string|null
20
20
  };
21
21
 
22
22
  type ConditionalColoringOptions = {
23
23
  conditions?: (ConditionalColoringPlugin.Condition)[]|null,
24
- colorText?: (string|boolean)|null,
25
- tickColor?: (string|boolean)|null,
24
+ colorText?: (string|boolean|ConditionalColoringPlugin.ColorText)|null,
25
+ tickColor?: (string|boolean|ConditionalColoringPlugin.ColorText)|null,
26
26
  field?: string|null
27
27
  };
28
28
 
@@ -41,6 +41,13 @@ declare namespace ConditionalColoringPlugin {
41
41
  level?: (string|boolean)|null
42
42
  };
43
43
 
44
+ type ColorText = {
45
+ field?: string|null,
46
+ upClass?: string|null,
47
+ downClass?: string|null,
48
+ levelClass?: string|null
49
+ };
50
+
44
51
  }
45
52
 
46
53
  declare class ConditionalColoringPlugin extends GridPlugin {
@@ -13,17 +13,17 @@ import {ElfUtil} from '../../tr-grid-util/es6/ElfUtil.js';
13
13
  /** @typedef {Object} ConditionalColoringPlugin~ColumnOptions
14
14
  * @description Extension column options that can be specified on each individual grid's column option:
15
15
  * @property {Array.<ConditionalColoringPlugin~Condition>=} conditions=null List of condition options
16
- * @property {(string|boolean)=} colorText=null A shorthand for specifying default condition based on the field.
17
- * @property {(string|boolean)=} tickColor=null Alias of colorText.
18
- * @property {(ConditionalColoringPlugin~Blinking|boolean)=} blinking=null Blink Options. If specified, the cell will be blinked on data change.
16
+ * @property {(string|boolean|ConditionalColoringPlugin~ColorText)=} colorText=null A shorthand for specifying default condition based on the field.
17
+ * @property {(string|boolean|ConditionalColoringPlugin~ColorText)=} tickColor=null Alias of colorText.
18
+ * @property {(string|boolean|ConditionalColoringPlugin~Blinking)=} blinking=null Blink Options. If specified, the cell will be blinked on data change.
19
19
  * @property {string=} field
20
20
  */
21
21
 
22
22
  /** @typedef {Object} ConditionalColoringPlugin~ConditionalColoringOptions
23
23
  * @description Extension column options that can be specified on each individual grid's column option:
24
24
  * @property {Array.<ConditionalColoringPlugin~Condition>=} conditions=null List of condition options
25
- * @property {(string|boolean)=} colorText=null A shorthand for specifying default condition based on the field.
26
- * @property {(string|boolean)=} tickColor=null Alias of colorText.
25
+ * @property {(string|boolean|ConditionalColoringPlugin~ColorText)=} colorText=null A shorthand for specifying default condition based on the field.
26
+ * @property {(string|boolean|ConditionalColoringPlugin~ColorText)=} tickColor=null Alias of colorText.
27
27
  * @property {string=} field
28
28
  */
29
29
 
@@ -45,6 +45,15 @@ import {ElfUtil} from '../../tr-grid-util/es6/ElfUtil.js';
45
45
  * @property {(string|boolean)=} level CSS color (e.g. #33333, grey). If false value is specified, blinking for level color is disabled.
46
46
  */
47
47
 
48
+ /** @typedef {(string|boolean|Object)} ConditionalColoringPlugin~ColorText
49
+ * @description Available options describing `colorText` object. Additionally if specify colorText as string of field, colorText will base on the field. <br>
50
+ * If specified true, field from column definition will be used.
51
+ * @property {string=} field If not specified, field from column definition will be used
52
+ * @property {string=} upClass CSS class name.
53
+ * @property {string=} downClass CSS class name.
54
+ * @property {string=} levelClass CSS class name.
55
+ */
56
+
48
57
  var COLORING_TYPE = "coloring";
49
58
  var BLINKING_TYPE = "blinking";
50
59
 
@@ -89,6 +98,10 @@ ConditionalColoringPlugin._cleanUpTimer = 0;
89
98
  * @private
90
99
  */
91
100
  ConditionalColoringPlugin._controlClass = "predefined-conditional-color";
101
+ /** @type {string}
102
+ * @private
103
+ */
104
+ ConditionalColoringPlugin._colorTextStyles;
92
105
 
93
106
  /** @type {boolean}
94
107
  * @private
@@ -103,6 +116,10 @@ ConditionalColoringPlugin.prototype._pendingFields;
103
116
  * @private
104
117
  */
105
118
  ConditionalColoringPlugin.prototype._predefinedColors = null;
119
+ /** @type {string}
120
+ * @private
121
+ */
122
+ ConditionalColoringPlugin._predefinedColorsStyles;
106
123
 
107
124
  /** @override
108
125
  * @return {string}
@@ -136,7 +153,12 @@ ConditionalColoringPlugin.prototype.initialize = function (host, options) {
136
153
  if (extOptions) {
137
154
  var predefinedColors = extOptions["predefinedColors"];
138
155
  if (predefinedColors != null && typeof predefinedColors === "object") {
139
- this._injectStyles(predefinedColors);
156
+ if (!this._predefinedColors) {
157
+ this._predefinedColors = predefinedColors;
158
+ this._predefinedColorsStyles = this._prepareStyles(predefinedColors);
159
+ }
160
+
161
+ this._injectPredefinedColors(host);
140
162
  host.enableClass(ConditionalColoringPlugin._controlClass);
141
163
  }
142
164
  }
@@ -145,6 +167,7 @@ ConditionalColoringPlugin.prototype.initialize = function (host, options) {
145
167
  this.config(options);
146
168
  } else {
147
169
  this._applyStyle(host, options);
170
+ this._injectColorTextStyles();
148
171
  }
149
172
 
150
173
  host.listen("postSectionDataBinding", this._onSectionBinding);
@@ -455,7 +478,7 @@ ConditionalColoringPlugin.prototype._removeDataFields = function(fieldRef, colRe
455
478
  };
456
479
 
457
480
  /** @private
458
- * @param {(Object|number)=} colRef
481
+ * @param {(string|number)=} colRef
459
482
  * @param {string} type
460
483
  */
461
484
  ConditionalColoringPlugin.prototype._removeFieldReferrer = function(colRef, type) {
@@ -464,8 +487,15 @@ ConditionalColoringPlugin.prototype._removeFieldReferrer = function(colRef, type
464
487
  }
465
488
  var referrer = null;
466
489
  if (colRef != null) {
467
- var colDef = typeof colRef === "object" ? colRef : this._realTimeGrid.getColumnDefinition(colRef);
468
- referrer = colDef ? colDef.getId() + "_" + type : null;
490
+ var colId = colRef;
491
+ if (typeof colRef === "number") {
492
+ var colDef = this._realTimeGrid.getColumnDefinition(colRef);
493
+ if (colDef) {
494
+ colId = colDef.getId();
495
+ }
496
+ }
497
+
498
+ referrer = colId ? colId + "_" + type : null;
469
499
  this._realTimeGrid.removeFieldReferrer(referrer);
470
500
  }
471
501
  };
@@ -496,25 +526,16 @@ ConditionalColoringPlugin.prototype._removeFieldReferrer = function(colRef, type
496
526
  * };
497
527
  */
498
528
  ConditionalColoringPlugin.prototype.setColumnColoring = function (colIndex, columnOptions) {
499
- // Save column config state
500
- var colData = this._newColumnData(colIndex);
501
529
  var blinkingOptions, field;
502
530
  if(columnOptions) {
503
- colData["conditions"] = columnOptions["conditions"];
504
- colData["colorText"] = columnOptions["colorText"];
505
- colData["tickColor"] = columnOptions["tickColor"];
506
- colData["blinking"] = blinkingOptions = columnOptions["blinking"];
507
- colData["field"] = field = columnOptions["field"];
508
- } else {
509
- colData["conditions"] = null;
510
- colData["colorText"] = null;
511
- colData["tickColor"] = null;
512
- colData["blinking"] = null;
531
+ blinkingOptions = columnOptions["blinking"];
532
+ field = columnOptions["field"];
513
533
  }
514
534
 
515
535
  this.setColumnBlinking(colIndex, blinkingOptions, field);
516
536
  this.setConditionalColoring(colIndex, columnOptions);
517
537
 
538
+ var colData = this._newColumnData(colIndex);
518
539
  if (colData["painter"] && !(colData["coloringFields"] || colData["blinkingField"])) { // Clear existing painter
519
540
  this._clearPainter(colData);
520
541
  }
@@ -526,6 +547,17 @@ ConditionalColoringPlugin.prototype.setColumnColoring = function (colIndex, colu
526
547
  */
527
548
  ConditionalColoringPlugin.prototype.setConditionalColoring = function (colIndex, coloringOptions) {
528
549
  var colData = this._newColumnData(colIndex);
550
+ if(coloringOptions) {
551
+ // Save column config state
552
+ colData["conditions"] = coloringOptions["conditions"];
553
+ colData["colorText"] = coloringOptions["colorText"];
554
+ colData["tickColor"] = coloringOptions["tickColor"];
555
+ colData["field"] = coloringOptions["field"];
556
+ } else {
557
+ colData["conditions"] = null;
558
+ colData["colorText"] = null;
559
+ colData["tickColor"] = null;
560
+ }
529
561
  var painter = colData["painter"];
530
562
  var prevFields = colData["coloringFields"] ? Object.keys(colData["coloringFields"]) : null;
531
563
  var colorOptions = this._prepareColorOptions(colIndex, coloringOptions);
@@ -552,7 +584,28 @@ ConditionalColoringPlugin.prototype.setConditionalColoring = function (colIndex,
552
584
  painter.setConditions(colorOptions.condColoring.conditions);
553
585
  } else if(colorOptions.colorText) {
554
586
  painter.resetColoring(); //Clear conditions before add new color
555
- painter.addColorTextWithTheme(colorOptions.colorText.field);
587
+ var options = colorOptions.colorText;
588
+ if (options.useThemeColors) {
589
+ if (!ConditionalColoringPlugin._colorTextStyles) {
590
+ var styles = {
591
+ positive: {
592
+ color: "var(--color-scheme-positive)"
593
+ },
594
+ negative: {
595
+ color: "var(--color-scheme-negative)"
596
+ },
597
+ neutral: {
598
+ color: "var(--color-scheme-neutral)"
599
+ }
600
+ };
601
+
602
+ ConditionalColoringPlugin._colorTextStyles = this._prepareStyles(styles);
603
+ }
604
+ this._injectColorTextStyles();
605
+ painter.addColorTextWithTheme(colorOptions.colorText.field);
606
+ } else {
607
+ painter.addColorText(options.field, options.upClass, options.downClass, options.levelClass);
608
+ }
556
609
  }
557
610
 
558
611
  var fields = Object.keys(newFieldsMap);
@@ -777,12 +830,19 @@ ConditionalColoringPlugin.prototype._prepareColorOptions = function(colIndex, co
777
830
  colorOptions.hasColor = 1;
778
831
  colorOptions.fields = {};
779
832
  colorOptions.colorText = {};
780
-
833
+ colorOptions.colorText.useThemeColors = true;
781
834
  var type = typeof colorText;
782
835
  if(type === "string") {
783
836
  field = colorText;
784
837
  } else if(type === "object") {
785
838
  field = /** @type{string} */(colorText["field"]) || field;
839
+
840
+ if (colorText["upClass"] || colorText["downClass"] || colorText["levelClass"]) {
841
+ colorOptions.colorText.useThemeColors = false;
842
+ colorOptions.colorText.upClass = colorText["upClass"];
843
+ colorOptions.colorText.downClass = colorText["downClass"];
844
+ colorOptions.colorText.levelClass = colorText["levelClass"];
845
+ }
786
846
  }
787
847
  colorOptions.colorText.field = field;
788
848
  colorOptions.fields[field] = true;
@@ -856,16 +916,17 @@ ConditionalColoringPlugin._mergeUpdates = function(e) {
856
916
  return changedRows;
857
917
  };
858
918
  /** @private
859
- * @param {Object} predefinedColors Predefined color object map
919
+ * @param {Object} colors Predefined color object map
920
+ * @return {string} prettified CSS string
860
921
  */
861
- ConditionalColoringPlugin.prototype._injectStyles = function(predefinedColors) {
862
- var prefix = ".tr-grid." + ConditionalColoringPlugin._controlClass + " .tr-lg .cell";
922
+ ConditionalColoringPlugin.prototype._prepareStyles = function(colors) {
923
+ var prefix = ".tr-grid." + ConditionalColoringPlugin._controlClass + " .column.conditionally-colored .cell";
863
924
  var css = [];
864
925
  var ss, styles, value;
865
- for (var className in predefinedColors) {
926
+ for (var className in colors) {
866
927
  css.push(prefix + "." + className);
867
928
  ss = [];
868
- styles = predefinedColors[className];
929
+ styles = colors[className];
869
930
 
870
931
  value = styles["backgroundColor"];
871
932
  if(value) {
@@ -880,22 +941,46 @@ ConditionalColoringPlugin.prototype._injectStyles = function(predefinedColors) {
880
941
  css.push(ss);
881
942
  }
882
943
 
883
- // TODO: support multitable
884
- var host = this._hosts[0];
885
-
886
- if(this._styleTag) {
887
- this._styleTag.parentNode.removeChild(this._styleTag);
888
- this._styleTag = null;
944
+ return prettifyCss(css);
945
+ };
946
+ /** @private
947
+ */
948
+ ConditionalColoringPlugin.prototype._injectColorTextStyles = function() {
949
+ if (ConditionalColoringPlugin._colorTextStyles) {
950
+ var hosts = this._hosts;
951
+ var len = hosts.length;
952
+ for (var i = 0; i < len; i++) {
953
+ var host = hosts[i];
954
+ host.enableClass(ConditionalColoringPlugin._controlClass);
955
+ if (!host._colorTextStyles) {
956
+ injectCss(ConditionalColoringPlugin._colorTextStyles, host.getElement());
957
+ host._colorTextStyles = true;
958
+ }
959
+ }
889
960
  }
890
- this._styleTag = injectCss(prettifyCss(css), host.getElement());
891
- this._predefinedColors = predefinedColors;
961
+ };
962
+ /** @private
963
+ * @param {Object} host
964
+ */
965
+ ConditionalColoringPlugin.prototype._injectPredefinedColors = function(host) {
966
+ if(host._conditionalColoringStyleTag) {
967
+ host._conditionalColoringStyleTag.parentNode.removeChild(host._conditionalColoringStyleTag);
968
+ host._conditionalColoringStyleTag = null;
969
+ }
970
+ host._conditionalColoringStyleTag = injectCss(this._predefinedColorsStyles, host.getElement());
892
971
  };
893
972
  /** @public
894
973
  * @param {Object} predefinedColors Predefined color object map
895
974
  */
896
975
  ConditionalColoringPlugin.prototype.setPredefinedColors = function(predefinedColors) {
897
- if(predefinedColors != null && typeof predefinedColors === "object") {
898
- this._injectStyles(predefinedColors);
976
+ if (predefinedColors != null && typeof predefinedColors === "object") {
977
+ this._predefinedColors = predefinedColors;
978
+ this._predefinedColorsStyles = this._prepareStyles(predefinedColors);
979
+ var hosts = this._hosts;
980
+ var len = hosts.length;
981
+ for (var i = 0; i < len; i++) {
982
+ this._injectPredefinedColors(hosts[i]);
983
+ }
899
984
  }
900
985
  };
901
986
  /** @private
@@ -1073,19 +1158,20 @@ ConditionalColoringPlugin.prototype._onColumnRemoved = function(e) {
1073
1158
  this._clearPainter(colData);
1074
1159
 
1075
1160
  // Removed column
1076
- var colDef = colData["COL_DEF"];
1077
- if (colDef) {
1161
+ var colId = e["colId"];
1162
+ if (colId) {
1078
1163
  if (colData["coloringFields"]) {
1079
- this._removeFieldReferrer(colDef, COLORING_TYPE);
1164
+ this._removeFieldReferrer(colId, COLORING_TYPE);
1080
1165
  }
1081
1166
  if (colData["blinkingField"]) {
1082
- this._removeFieldReferrer(colDef, BLINKING_TYPE);
1167
+ this._removeFieldReferrer(colId, BLINKING_TYPE);
1083
1168
  }
1084
1169
  }
1085
1170
 
1086
1171
  // Another columns
1087
1172
  var field = colData["field"];
1088
1173
  if (field) {
1174
+ var colDef = colData["COL_DEF"];
1089
1175
  var isStaticField = colDef ? !colDef.isRealTimeField() : true;
1090
1176
  if (isStaticField) {
1091
1177
  var colCount = this.getColumnCount();
@@ -7,12 +7,12 @@ declare namespace HeatMapPlugin {
7
7
 
8
8
  type ColumnOptions = {
9
9
  field: string,
10
- heatMap?: HeatMapPlugin.Heatmap
10
+ heatMap?: HeatMapPlugin.Heatmap|null
11
11
  };
12
12
 
13
13
  type Heatmap = {
14
- midPoint?: number,
15
- mode?: string
14
+ midPoint?: number|null,
15
+ mode?: string|null
16
16
  };
17
17
 
18
18
  }
@@ -144,14 +144,25 @@ HeatMapPlugin.prototype.getConfigObject = function (out_obj) {
144
144
  col = columns[i] = {};
145
145
  }
146
146
 
147
- var heatMap = col.heatMap = {};
148
147
 
149
148
  var opt = this.getColumnHeatMap(i);
150
149
 
151
- if (!opt) { continue; }
150
+ if (!opt) { // We are only interested in the columns that have heat map informations
151
+ continue;
152
+ }
153
+
154
+ // default value of midPoint and mode
155
+ if(opt.midPoint === 0 && opt.mode === "cell") {
156
+ col.heatMap = true;
157
+ continue;
158
+ }
159
+
160
+ var heatMap = col.heatMap = {};
161
+
152
162
  if (opt.midPoint != null) {
153
163
  heatMap.midPoint = opt.midPoint;
154
164
  }
165
+
155
166
  if (opt.mode != null) {
156
167
  heatMap.mode = opt.mode;
157
168
  }
@@ -18,7 +18,8 @@ declare namespace RowDraggingPlugin {
18
18
  dragStart?: ((...params: any[]) => any)|null,
19
19
  drag?: ((...params: any[]) => any)|null,
20
20
  dragEnd?: ((...params: any[]) => any)|null,
21
- dataMoved?: ((...params: any[]) => any)|null
21
+ dataMoved?: ((...params: any[]) => any)|null,
22
+ beforeDataMoved?: ((...params: any[]) => any)|null
22
23
  };
23
24
 
24
25
  }
@@ -18,6 +18,7 @@ import { injectCss, prettifyCss } from "../../tr-grid-util/es6/Util.js";
18
18
  * @property {Function=} drag=null Function handler for drag event
19
19
  * @property {Function=} dragEnd=null Function handler for dragEnd event
20
20
  * @property {Function=} dataMoved=null Function handler for dataMoved event
21
+ * @property {Function=} beforeDataMoved=null Function handler for beforeDataMoved event
21
22
  */
22
23
 
23
24
  /** @event RowDraggingPlugin#drag
@@ -42,8 +43,34 @@ import { injectCss, prettifyCss } from "../../tr-grid-util/es6/Util.js";
42
43
  * @type {Object}
43
44
  */
44
45
  /** @event RowDraggingPlugin#dataMoved
45
- * @description Fired when rows or data are moved by drag operation.
46
+ * @description Fired when rows or data are moved by the drag operation.
46
47
  * @type {Object}
48
+ * @property {Array.<number>} srcRowIndices row indices of the selected rows
49
+ * @property {Array.<string>} srcRowIds row ids of the selected rows
50
+ * @property {Array.<string>} srcRowTypes row types of the selected rows
51
+ * @property {string} consolidatedSrcRowType "MIXED" type is set if there are two or more row types in the srcRowTypes
52
+ * @property {number} destRowIndex row index of the drop area
53
+ * @property {string} destRowId row id of the drop area. This will be empty string for the end of grid
54
+ * @property {number} destRowType row type of the drop area. This will be empty string for the end of grid
55
+ */
56
+ /** @event RowDraggingPlugin#beforeDataMoved
57
+ * @description Fired after mouseup and before the data/row is about to be moved. You can check the current drag and drop states, cancel operation or apply custom tasks in this event.
58
+ * @type {Object}
59
+ * @property {Array.<number>} srcRowIndices row indices of the selected rows
60
+ * @property {Array.<string>} srcRowIds row ids of the selected rows
61
+ * @property {Array.<string>} srcRowTypes row types of the selected rows
62
+ * @property {string} consolidatedSrcRowType "MIXED" type is set if there are two or more row types in the srcRowTypes
63
+ * @property {number} destRowIndex row index of the drop area
64
+ * @property {string} destRowId row id of the drop area. This will be empty string for the end of grid
65
+ * @property {number} destRowType row type of the drop area. This will be empty string for the end of grid
66
+ * @example
67
+ * beforeDataMoved: function(e) {
68
+ * var srcRowType = e.srcRowTypes[0];
69
+ * var destRowType = e.destRowType;
70
+ * if(srcRowType === "GROUP_MEMBER" && destRowType === "CONTENT") {
71
+ * e.cancel = true; // Prevent a group member row from moving outside of its own group
72
+ * }
73
+ * }
47
74
  */
48
75
 
49
76
 
@@ -55,6 +82,27 @@ var _isInContentSection = function (pos) {
55
82
  return (pos && pos["sectionType"] === "content") ? true : false;
56
83
  };
57
84
 
85
+ /** @private
86
+ * @param {string} rowType
87
+ * @return {boolean}
88
+ */
89
+ var _isNormalRowType = function (rowType) {
90
+ if(rowType) {
91
+ if(rowType === "CONTENT") {
92
+ return true;
93
+ }
94
+ if(rowType === "CHAIN") {
95
+ return true;
96
+ }
97
+ if(rowType === "GROUP_HEADER") {
98
+ return true;
99
+ }
100
+ return false;
101
+ } else {
102
+ return true;
103
+ }
104
+ };
105
+
58
106
  /** @constructor
59
107
  * @param {RowDraggingPlugin.Options=} options
60
108
  * @extends {GridPlugin}
@@ -397,6 +445,7 @@ RowDraggingPlugin.prototype.config = function (options) {
397
445
  this.addListener(extOptions, "drag");
398
446
  this.addListener(extOptions, "dragEnd");
399
447
  this.addListener(extOptions, "dataMoved");
448
+ this.addListener(extOptions, "beforeDataMoved");
400
449
  };
401
450
 
402
451
  /** Get a current state of grid and extension config
@@ -795,7 +844,7 @@ RowDraggingPlugin.prototype._onDragEnd = function (e) {
795
844
  var destGrid = destPos["grid"] || srcGrid;
796
845
  var destRowIndex = destPos["rowIndex"];
797
846
 
798
- var rowSelection = srcGrid.getPlugin('RowSelectionPlugin');
847
+ var rowSelection = srcGrid.getPlugin("RowSelectionPlugin");
799
848
  var srcRowIndices = rowSelection && rowSelection.getSelectedRows();
800
849
  if (!srcRowIndices || !srcRowIndices.length) {
801
850
  // case no row selection or it disabled
@@ -834,10 +883,9 @@ RowDraggingPlugin.prototype._onDragEnd = function (e) {
834
883
  * @return {number}
835
884
  */
836
885
  RowDraggingPlugin.prototype._moveRows = function (srcRowRef, destRowIndex, srcGrid, destGrid, evtArg) {
837
- var destDv = destGrid.getDataSource();
838
-
839
886
  var srcRowIndices = null;
840
887
  var srcDv = srcGrid.getDataSource();
888
+ var destDv = destGrid.getDataSource();
841
889
  if(typeof srcRowRef === "string") {
842
890
  var srcRowIndex = srcDv.getRowIndex(this._startingRid);
843
891
  if(srcRowIndex >= 0) {
@@ -851,27 +899,114 @@ RowDraggingPlugin.prototype._moveRows = function (srcRowRef, destRowIndex, srcGr
851
899
  return 0;
852
900
  }
853
901
 
902
+ // Available row types are ["CONTENT", "CHAIN", "CONSTITUENT", "GROUP_HEADER", "SUBGROUP_HEADER", "GROUP_MEMBER"]
903
+ var i, len;
904
+ var srcCount = srcRowIndices.length;
905
+ var srcRowIds = new Array(srcCount);
906
+ var srcRowTypes = [];
907
+ var conRowType = "";
908
+ var api = this.getGridApi();
909
+ if(api && !api.getRowType) {
910
+ api = null;
911
+ }
912
+ for(i = 0; i < srcCount; ++i) {
913
+ var srcIndex = srcRowIndices[i];
914
+ var rowType = api ? api.getRowType(srcIndex) : "CONTENT";
915
+ srcRowIds[i] = srcDv.getRowId(srcIndex);
916
+ srcRowTypes[i] = rowType;
917
+ if(conRowType) {
918
+ if(conRowType !== rowType) {
919
+ conRowType = "MIXED";
920
+ }
921
+ } else {
922
+ conRowType = rowType;
923
+ }
924
+ }
925
+ if(!conRowType) {
926
+ conRowType = "CONTENT";
927
+ }
928
+ var destRowType = api ? api.getRowType(destRowIndex) : ""; // TODO: this has to be get from destGrid
929
+ var destRowId = destDv.getRowId(destRowIndex);
930
+ var parentRowId, childRowIds;
931
+
932
+ if(this.hasListener("beforeDataMoved")) {
933
+ evtArg["srcRowIndices"] = srcRowIndices;
934
+ evtArg["srcRowIds"] = srcRowIds;
935
+ evtArg["srcRowTypes"] = srcRowTypes;
936
+ evtArg["consolidatedSrcRowType"] = conRowType;
937
+ evtArg["destRowIndex"] = destRowIndex;
938
+ evtArg["destRowId"] = destRowId;
939
+ evtArg["destRowType"] = destRowType;
940
+ this._dispatch("beforeDataMoved", evtArg);
941
+ if(evtArg["cancel"]) {
942
+ return 0;
943
+ }
944
+ }
854
945
 
946
+ var rsp = srcGrid.getPlugin("RowSegmentingPlugin");
855
947
  var movedRowIds = null;
856
- var destRowId = destDv.getRowId(destRowIndex);
857
948
  if(srcGrid === destGrid) { // TODO: Support wrap mode
858
- movedRowIds = srcDv.moveRow(srcRowIndices, destRowIndex) || [];
949
+ if(conRowType === "MIXED") {
950
+ movedRowIds = srcDv.moveRow(srcRowIds, destRowId);
951
+ } else if(conRowType === "CONTENT") {
952
+ if(destRowType === "GROUP_HEADER") {
953
+ childRowIds = rsp.getSegmentChildIds(destRowId);
954
+ if(childRowIds) {
955
+ movedRowIds = srcDv.moveRow(srcRowIds, destRowId);
956
+ } else { // Add content row as a new member only if there is no member
957
+ rsp.addSegmentChildren(destRowId, srcRowIds);
958
+ movedRowIds = srcRowIds;
959
+ }
960
+ } else if(_isNormalRowType(destRowType)) {
961
+ movedRowIds = srcDv.moveRow(srcRowIds, destRowId);
962
+ } else if(destRowType === "GROUP_MEMBER") {
963
+ parentRowId = rsp.getSegmentParentRowId(destRowId);
964
+ rsp.addSegmentChildren(parentRowId, srcRowIds);
965
+
966
+ srcDv.moveRow(srcRowIds, destRowId);
967
+ movedRowIds = srcRowIds;
968
+ }
969
+ } else if(conRowType === "CHAIN" || conRowType === "GROUP_HEADER") {
970
+ if(_isNormalRowType(destRowType)) {
971
+ movedRowIds = srcDv.moveRow(srcRowIds, destRowId);
972
+ }
973
+ } else if(conRowType === "GROUP_MEMBER") {
974
+ if(srcCount === 1) {
975
+ var srcRowId = srcRowIds[0];
976
+ parentRowId = rsp.getSegmentParentRowId(srcRowId);
977
+ childRowIds = rsp.getSegmentChildIds(parentRowId);
978
+ var childCount = childRowIds ? childRowIds.length : 0;
979
+ var endOfSegment = srcDv.getRowIndex(parentRowId) + childCount + 1;
980
+ if(destRowIndex === endOfSegment) {
981
+ movedRowIds = srcDv.moveRow(srcRowIds, destRowId);
982
+ } else if(destRowType === "GROUP_MEMBER") {
983
+ var destParentRowId = rsp.getSegmentParentRowId(destRowId);
984
+ if(parentRowId === destParentRowId) {
985
+ movedRowIds = srcDv.moveRow(srcRowIds, destRowId);
986
+ } else { // Moving row between two segments
987
+ rsp.removeSegmentChild(parentRowId, srcRowId);
988
+ rsp.addSegmentChild(destParentRowId, srcRowId);
989
+ movedRowIds = srcDv.moveRow(srcRowIds, destRowId);
990
+ }
991
+ } else if(_isNormalRowType(destRowType)) { // move member out of existing segment
992
+ rsp.removeSegmentChild(parentRowId, srcRowIds[0]);
993
+
994
+ movedRowIds = srcDv.moveRow(srcRowIds[0], destRowId);
995
+ }
996
+ } else {
997
+ movedRowIds = srcDv.moveRow(srcRowIds, destRowId);
998
+ }
999
+ } // else CONSTITUENT, SUBGROUP_HEADER and other types cannot be moved
859
1000
  } else {
1001
+ // TODO: Add support moving row based on row types
860
1002
  // TODO: Check if we support moving to last row for multi table
861
- // if(!destRowId) {
862
- // return 0;
863
- // }
864
- movedRowIds = [];
1003
+ movedRowIds = srcRowIds;
865
1004
  evtArg["destGrid"] = destGrid;
866
1005
 
867
1006
  var originalRows = [];
868
- var i;
869
- var len = srcRowIndices.length;
870
- for(i = 0; i < len; ++i) {
871
- var rowId = srcDv.getRowId(srcRowIndices[i]);
1007
+ for(i = 0; i < srcCount; ++i) {
872
1008
  var rowData = srcDv.getRowData(rowId);
873
1009
  if(rowData) {
874
- movedRowIds.push(rowId);
875
1010
  originalRows.push(rowData);
876
1011
  }
877
1012
  }
@@ -891,14 +1026,15 @@ RowDraggingPlugin.prototype._moveRows = function (srcRowRef, destRowIndex, srcGr
891
1026
  }
892
1027
  }
893
1028
 
894
- if(movedRowIds.length) {
1029
+ var moveCount = movedRowIds ? movedRowIds.length : 0;
1030
+ if(moveCount) {
895
1031
  evtArg["originRowId"] = movedRowIds[0];
896
1032
  evtArg["originRowIds"] = movedRowIds;
897
1033
  evtArg["destinationRowId"] = destRowId; // Return empty string for the last row
898
1034
 
899
1035
  this._dispatch("dataMoved", evtArg);
900
1036
  }
901
- return movedRowIds.length;
1037
+ return moveCount;
902
1038
  };
903
1039
  /** @private
904
1040
  * @return {boolean}
@@ -320,11 +320,12 @@ RowColoringPlugin.prototype.setPredefinedColors = function (predefinedColors) {
320
320
  * @param {Object} predefinedColors Predefined color object map
321
321
  */
322
322
  RowColoringPlugin.prototype._injectStyles = function (predefinedColors) {
323
- var prefix = ".tr-grid." + RowColoringPlugin._controlClass + " .tr-lg .cell";
323
+ var prefix1 = ".tr-grid." + RowColoringPlugin._controlClass + " .section .column .cell";
324
+ var prefix2 = ".tr-grid." + RowColoringPlugin._controlClass + " .section .cover-layer .cell";
324
325
  var css = [];
325
326
  var ss, styles, value;
326
327
  for (var className in predefinedColors) {
327
- css.push(prefix + "." + className);
328
+ css.push(prefix1 + "." + className + ", " + prefix2 + "." + className);
328
329
  ss = [];
329
330
  styles = predefinedColors[className];
330
331
  value = styles["backgroundColor"];