@refinitiv-ui/efx-grid 6.0.69 → 6.0.71

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 (37) hide show
  1. package/lib/column-selection-dialog/lib/column-selection-dialog.js +19 -7
  2. package/lib/core/dist/core.js +38 -3
  3. package/lib/core/dist/core.min.js +1 -1
  4. package/lib/core/es6/grid/Core.d.ts +2 -0
  5. package/lib/core/es6/grid/Core.js +30 -2
  6. package/lib/core/es6/grid/VirtualizedLayoutGrid.js +8 -1
  7. package/lib/filter-dialog/lib/filter-dialog.js +90 -51
  8. package/lib/grid/index.js +1 -1
  9. package/lib/rt-grid/dist/rt-grid.js +52 -17
  10. package/lib/rt-grid/dist/rt-grid.min.js +1 -1
  11. package/lib/rt-grid/es6/Grid.d.ts +5 -2
  12. package/lib/rt-grid/es6/Grid.js +22 -15
  13. package/lib/tr-grid-column-selection/es6/ColumnSelection.js +7 -27
  14. package/lib/tr-grid-column-stack/es6/ColumnStack.js +7 -1
  15. package/lib/tr-grid-filter-input/es6/FilterInput.js +9 -3
  16. package/lib/tr-grid-in-cell-editing/es6/InCellEditing.d.ts +3 -2
  17. package/lib/tr-grid-in-cell-editing/es6/InCellEditing.js +65 -18
  18. package/lib/tr-grid-printer/es6/CellWriter.d.ts +5 -5
  19. package/lib/tr-grid-printer/es6/CellWriter.js +6 -6
  20. package/lib/tr-grid-printer/es6/GridPrinter.d.ts +7 -6
  21. package/lib/tr-grid-printer/es6/GridPrinter.js +4 -2
  22. package/lib/tr-grid-printer/es6/PrintTrait.d.ts +1 -1
  23. package/lib/tr-grid-printer/es6/SectionWriter.d.ts +1 -1
  24. package/lib/tr-grid-row-dragging/es6/RowDragging.js +65 -0
  25. package/lib/tr-grid-row-filtering/es6/RowFiltering.d.ts +1 -3
  26. package/lib/tr-grid-row-filtering/es6/RowFiltering.js +235 -114
  27. package/lib/tr-grid-row-selection/es6/RowSelection.js +14 -32
  28. package/lib/tr-grid-titlewrap/es6/TitleWrap.d.ts +2 -2
  29. package/lib/tr-grid-titlewrap/es6/TitleWrap.js +1 -1
  30. package/lib/tr-grid-util/es6/GridPlugin.js +52 -0
  31. package/lib/types/es6/Core/grid/Core.d.ts +2 -0
  32. package/lib/types/es6/InCellEditing.d.ts +3 -2
  33. package/lib/types/es6/RealtimeGrid/Grid.d.ts +5 -2
  34. package/lib/types/es6/RowFiltering.d.ts +1 -3
  35. package/lib/types/es6/TitleWrap.d.ts +2 -2
  36. package/lib/versions.json +14 -14
  37. package/package.json +1 -1
@@ -24,6 +24,14 @@ import { injectCss, prettifyCss } from "../../tr-grid-util/es6/Util.js";
24
24
  * },
25
25
  */
26
26
 
27
+ /** @event RowFilteringPlugin#dialogCommitted
28
+ * @description Fired after a user clicks done button from the filter dialog or changes sort order.
29
+ * @property {number} colIndex
30
+ * @property {Object=} value When filter is changed, the change will be passed through this property
31
+ * @property {number=} sortOrder When sort order is changed, the change will be passed through this property
32
+ * @property {string=} fieldDataType
33
+ */
34
+
27
35
  /** @event RowFilteringPlugin#iconCreated
28
36
  * @description iconCreated event is dispatched when a new column filter icon is created.
29
37
  * @property {Element} icon Filter icon element
@@ -61,7 +69,7 @@ The expression can take various forms:<br>
61
69
  */
62
70
 
63
71
  /** @typedef {Object} RowFilteringPlugin~FilterExpression
64
- * @description FilterExpression contains all data used for saving and restoring filter in a column
72
+ * @description Deprecated. FilterExpression contains all data used for saving and restoring filter in a column
65
73
  * @property {string} field
66
74
  * @property {RowFilteringPlugin~Expression} expression Expression representing filter function
67
75
  * @property {*} context Context object contains context/states given by user
@@ -307,6 +315,8 @@ RowFilteringPlugin.prototype.unload = function (host) {
307
315
  host.unlisten("columnRemoved", this._onColumnRemoved);
308
316
 
309
317
  if (!this._hosts.length) {
318
+ this._hasPendingFilter = false;
319
+
310
320
  if (this._filterDialog) {
311
321
  this._filterDialog.hide(); // Remove the dialog from document
312
322
 
@@ -335,6 +345,34 @@ RowFilteringPlugin.prototype._afterInit = function () {
335
345
  setTimeout(this._onPreLoadedDialog, 10);
336
346
  }
337
347
  }
348
+
349
+ this._applyPendingFilter();
350
+ };
351
+ /** @private
352
+ */
353
+
354
+
355
+ RowFilteringPlugin.prototype._applyPendingFilter = function () {
356
+ if (!this._initializedGrid) {
357
+ return;
358
+ }
359
+
360
+ if (!this._hasPendingFilter) {
361
+ return;
362
+ }
363
+
364
+ this._hasPendingFilter = false;
365
+ var colCount = this.getColumnCount();
366
+
367
+ for (var c = 0; c < colCount; ++c) {
368
+ var colSettings = this._getUserColumnSettings(c);
369
+
370
+ if (colSettings.expression) {
371
+ this.addColumnFilter(c, colSettings.expression, colSettings.filterState);
372
+ } else {
373
+ this._removeColumnFilters(c);
374
+ }
375
+ }
338
376
  };
339
377
  /** @private
340
378
  */
@@ -405,6 +443,7 @@ RowFilteringPlugin.prototype.config = function (options) {
405
443
 
406
444
  this.addListener(rowFiltering, "click");
407
445
  this.addListener(rowFiltering, "beforeDialogOpened");
446
+ this.addListener(rowFiltering, "dialogCommitted");
408
447
  this.addListener(rowFiltering, "iconCreated");
409
448
  this.addListener(rowFiltering, "filterChanged");
410
449
  this.addListener(rowFiltering, "refreshed");
@@ -424,6 +463,8 @@ RowFilteringPlugin.prototype.config = function (options) {
424
463
 
425
464
  this._setColumnOptions(i, column);
426
465
  }
466
+
467
+ this._applyPendingFilter();
427
468
  };
428
469
  /** @public
429
470
  * @param {Object=} gridOptions
@@ -448,22 +489,20 @@ RowFilteringPlugin.prototype.getConfigObject = function (gridOptions) {
448
489
  column = columns[i] = {};
449
490
  }
450
491
 
451
- var cfo = this._getColumnFilterOption(i);
492
+ var colSettings = this._getUserColumnSettings(i);
452
493
 
453
- if (cfo) {
454
- var exp = cfo._expressions[0];
494
+ var exp = colSettings.expression;
455
495
 
456
- if (exp && typeof exp !== "function") {
457
- // TODO: Accept function type
458
- column.filter = exp; // This could be string, array, or object
459
- }
496
+ if (exp && typeof exp !== "function") {
497
+ // TODO: Accept function type
498
+ column.filter = exp; // This could be string, array, or object
499
+ }
460
500
 
461
- var ctx = cfo._context[0];
501
+ var ctx = colSettings.filterState;
462
502
 
463
- if (ctx != null) {
464
- if (_typeof(ctx) !== "object" || !ctx._autoGenerated) {
465
- column.filterState = ctx;
466
- }
503
+ if (ctx != null) {
504
+ if (_typeof(ctx) !== "object" || !ctx._autoGenerated) {
505
+ column.filterState = ctx;
467
506
  }
468
507
  }
469
508
  }
@@ -655,7 +694,10 @@ RowFilteringPlugin.prototype.addColumnFilter = function (colIndex, exp, ctx) {
655
694
  func =
656
695
  /** @type{Function} */
657
696
  exp;
658
- exp = ctx && typeof ctx === "string" ? ctx : null; // for saving. TODO: Support saving for function type
697
+
698
+ if (ctx && typeof ctx === "string") {
699
+ exp = ctx;
700
+ }
659
701
  } else {
660
702
  func = this._parseFilter(exp, colIndex, ctx);
661
703
  }
@@ -664,6 +706,16 @@ RowFilteringPlugin.prototype.addColumnFilter = function (colIndex, exp, ctx) {
664
706
  return false;
665
707
  }
666
708
 
709
+ if (colIndex < 0 || colIndex >= this.getColumnCount()) {
710
+ return false;
711
+ }
712
+
713
+ var colSettings = this._getUserColumnSettings(colIndex);
714
+
715
+ colSettings.expression = exp; // WARNING: Only the last expression are saved (previous one is overwritten)
716
+
717
+ colSettings.filterState = ctx;
718
+
667
719
  if (ctx == null) {
668
720
  ctx = {
669
721
  "_autoGenerated": true
@@ -712,10 +764,28 @@ RowFilteringPlugin.prototype.addColumnFilter = function (colIndex, exp, ctx) {
712
764
  * @param {(Object|string)=} ctx Context object that will be passed as the third parameter for the filter logic
713
765
  * @return {boolean} True If there is any change
714
766
  * @fires RowFilteringPlugin#filterChanged
767
+ * @example
768
+ * extension.setColumnFilter(colIndex1,
769
+ * [["GT", 0]]
770
+ * );
771
+ * extension.setColumnFilter(colIndex2,
772
+ * "filter": "[PCTCHNG] > 0"
773
+ * );
774
+ * extension.setColumnFilter(colIndex3,
775
+ * function(rowData) {
776
+ * return rowData["PCTCHNG"] > 0;
777
+ * }
778
+ * );
715
779
  */
716
780
 
717
781
 
718
782
  RowFilteringPlugin.prototype.setColumnFilter = function (colIndex, exp, ctx) {
783
+ var curExp = this._getColumnExpression(colIndex);
784
+
785
+ if (curExp === exp) {
786
+ return false;
787
+ }
788
+
719
789
  var removed = this._removeColumnFilters(colIndex);
720
790
 
721
791
  var added = this.addColumnFilter(colIndex, exp, ctx);
@@ -726,71 +796,88 @@ RowFilteringPlugin.prototype.setColumnFilter = function (colIndex, exp, ctx) {
726
796
 
727
797
  return removed || added;
728
798
  };
799
+ /** @private
800
+ * @param {number} colIndex
801
+ * @return {RowFilteringPlugin~Expression}
802
+ */
803
+
804
+
805
+ RowFilteringPlugin.prototype._getColumnExpression = function (colIndex) {
806
+ var colSettings = this._getUserColumnSettings(colIndex);
807
+
808
+ return colSettings.expression || null;
809
+ };
729
810
  /** Set data to colData["rowFiltering"]
730
811
  * @private
731
812
  * @param {number} colIndex
732
- * @param {RowFilteringPlugin~ColumnOptions} columnOptions
813
+ * @param {RowFilteringPlugin~ColumnOptions} userObj
733
814
  * @example
734
- * var colDef = {
735
- * "filter": "gt♦0♣"
815
+ * var colDef1 = {
816
+ * "field": "PCTCHNG",
817
+ * "filter": [["GT", 0]]
736
818
  * };
737
819
  * var colDef2 = {
738
820
  * "filter": "[PCTCHNG] > 0"
739
821
  * };
740
822
  * var colDef3 = {
741
- * "filter": function() { }
823
+ * "filter": function(rowData) {
824
+ * return rowData["PCTCHNG"] > 0;
825
+ * }
742
826
  * };
743
827
  */
744
828
 
745
829
 
746
- RowFilteringPlugin.prototype._setColumnOptions = function (colIndex, columnOptions) {
747
- var colOptions = this._newExtColumnOptions(colIndex);
830
+ RowFilteringPlugin.prototype._setColumnOptions = function (colIndex, userObj) {
831
+ var colSettings = this._getUserColumnSettings(colIndex);
748
832
 
749
- var filterIcon = columnOptions["filterIcon"];
750
- var fieldDataType = columnOptions["fieldDataType"] || columnOptions["dataType"]; // TODO: This should not be set here, should retreive data type from Composite/Realtime Grid
833
+ var filterIcon = userObj["filterIcon"]; // TODO: This should not be set here, should retreive data type from Composite/Realtime Grid
834
+
835
+ var fieldDataType = userObj["fieldDataType"] || userObj["dataType"];
751
836
 
752
837
  if (fieldDataType) {
753
- colOptions.fieldDataType = fieldDataType; // TODO: This should not be set here, should retreive data type from Composite/Realtime Grid
838
+ colSettings.fieldDataType = fieldDataType; // TODO: This should not be set here, should retreive data type from Composite/Realtime Grid
754
839
  }
755
840
 
756
841
  if (filterIcon != null) {
757
- colOptions.filterIcon = filterIcon;
842
+ colSettings.filterIcon = filterIcon;
758
843
  }
759
844
 
760
- var iconActivation = filterIcon == false ? "none" : this._iconActivation;
761
- var exp = columnOptions["filter"];
845
+ var exp = userObj["filter"];
762
846
 
763
- if (exp) {
764
- this.addColumnFilter(colIndex, exp, columnOptions["filterState"]);
765
- } else if (iconActivation == "always" || iconActivation == "onHover") {
766
- this._updateColumnIcon(colIndex);
847
+ if (exp != null) {
848
+ colSettings.expression = exp;
849
+ colSettings.filterState = null;
850
+ this._hasPendingFilter = true;
767
851
  }
768
- };
769
- /** @private
770
- * @param {number} colIndex
771
- * @return {Object} colData["rowFiltering"]
772
- */
773
852
 
853
+ var filterState = userObj["filterState"];
854
+
855
+ if (filterState != null) {
856
+ colSettings.filterState = filterState;
857
+ }
858
+
859
+ var iconActivation = filterIcon == false ? "none" : this._iconActivation;
774
860
 
775
- RowFilteringPlugin.prototype._getExtColumnOptions = function (colIndex) {
776
- return this._getColumnOption(colIndex, "rowFiltering");
861
+ if (iconActivation == "always" || iconActivation == "onHover") {
862
+ this._updateColumnIcon(colIndex);
863
+ }
777
864
  };
778
865
  /** @private
779
866
  * @param {number} colIndex
780
- * @return {!Object} Newly created extension column option or the existing one
867
+ * @return {!Object} colData["rowFiltering"]
781
868
  */
782
869
 
783
870
 
784
- RowFilteringPlugin.prototype._newExtColumnOptions = function (colIndex) {
785
- var colDef = this._newColumnData(colIndex);
871
+ RowFilteringPlugin.prototype._getUserColumnSettings = function (colIndex) {
872
+ var colData = this._newColumnData(colIndex);
786
873
 
787
- var colExtOptions = colDef["rowFiltering"];
874
+ var colSettings = colData["rowFiltering"];
788
875
 
789
- if (!colExtOptions) {
790
- colExtOptions = colDef["rowFiltering"] = {};
876
+ if (!colSettings) {
877
+ colSettings = colData["rowFiltering"] = {};
791
878
  }
792
879
 
793
- return colExtOptions;
880
+ return colSettings;
794
881
  };
795
882
  /** @private
796
883
  * @param {number} colIndex
@@ -799,40 +886,37 @@ RowFilteringPlugin.prototype._newExtColumnOptions = function (colIndex) {
799
886
 
800
887
 
801
888
  RowFilteringPlugin.prototype._getColumnFilterOption = function (colIndex) {
802
- var colOptions = this._getExtColumnOptions(colIndex);
889
+ var colSettings = this._getUserColumnSettings(colIndex);
803
890
 
804
- if (colOptions) {
805
- return colOptions["filterOption"] || null;
891
+ if (colSettings) {
892
+ return colSettings["filterOption"] || null;
806
893
  } else {
807
894
  return null;
808
895
  }
809
896
  };
810
- /** Set data to colData["rowFiltering"]["filterOption"]
897
+ /** Remove colData["rowFiltering"]["filterOption"]
811
898
  * @private
812
899
  * @param {number} colIndex
813
- * @param {Object} filterOption
814
900
  */
815
901
 
816
902
 
817
- RowFilteringPlugin.prototype._setColumnFilterOption = function (colIndex, filterOption) {
818
- var colOptions = this._newExtColumnOptions(colIndex);
819
-
820
- if (filterOption) {
821
- colOptions["filterOption"] = filterOption;
822
- } else {
823
- var cfo = colOptions["filterOption"];
903
+ RowFilteringPlugin.prototype._removeActiveFilterStates = function (colIndex) {
904
+ var colSettings = this._getUserColumnSettings(colIndex);
824
905
 
825
- if (cfo) {
826
- colOptions["filterOption"] = null;
906
+ colSettings.expression = null;
907
+ colSettings.filterState = null;
908
+ var cfo = colSettings["filterOption"];
827
909
 
828
- if (cfo._filters.length) {
829
- this._dispatch("filterChanged", {
830
- "filterType": "column",
831
- "changeType": "remove",
832
- "colIndex": colIndex,
833
- "field": this._getField(colIndex)
834
- });
835
- }
910
+ if (cfo) {
911
+ colSettings["filterOption"] = null;
912
+
913
+ if (cfo._filters.length) {
914
+ this._dispatch("filterChanged", {
915
+ "filterType": "column",
916
+ "changeType": "remove",
917
+ "colIndex": colIndex,
918
+ "field": this._getField(colIndex)
919
+ });
836
920
  }
837
921
  }
838
922
  };
@@ -851,7 +935,9 @@ RowFilteringPlugin.prototype._initColumnFilterOption = function (colIndex) {
851
935
  cfo._expressions = [];
852
936
  cfo._context = [];
853
937
 
854
- this._setColumnFilterOption(colIndex, cfo);
938
+ var colSettings = this._getUserColumnSettings(colIndex);
939
+
940
+ colSettings["filterOption"] = cfo;
855
941
  }
856
942
 
857
943
  return cfo;
@@ -907,6 +993,7 @@ RowFilteringPlugin.prototype.removeFilter = function (funcRef) {
907
993
  * @public
908
994
  * @param {number} colIndex
909
995
  * @return {boolean} True if there is any change
996
+ * @fires RowFilteringPlugin#filterChanged
910
997
  */
911
998
 
912
999
 
@@ -927,6 +1014,7 @@ RowFilteringPlugin.prototype.removeColumnFilters = function (colIndex) {
927
1014
  /** @private
928
1015
  * @param {number} colIndex
929
1016
  * @return {boolean} True if there is any change
1017
+ * @fires RowFilteringPlugin#filterChanged
930
1018
  */
931
1019
 
932
1020
 
@@ -940,7 +1028,7 @@ RowFilteringPlugin.prototype._removeColumnFilters = function (colIndex) {
940
1028
  this._columnFilters.splice(funcIndex, 1);
941
1029
  }
942
1030
 
943
- this._setColumnFilterOption(colIndex, null); // filterChanged fired
1031
+ this._removeActiveFilterStates(colIndex); // filterChanged fired
944
1032
 
945
1033
 
946
1034
  var inputExt = this._getPlugin("FilterInputPlugin"); // TODO: Use the event instead
@@ -958,6 +1046,7 @@ RowFilteringPlugin.prototype._removeColumnFilters = function (colIndex) {
958
1046
  * @function
959
1047
  * @param {number} colIndex
960
1048
  * @return {boolean} True if there is any change
1049
+ * @fires RowFilteringPlugin#filterChanged
961
1050
  */
962
1051
 
963
1052
 
@@ -965,6 +1054,7 @@ RowFilteringPlugin.prototype.removeColumnFilter = RowFilteringPlugin.prototype.r
965
1054
  /** Remove all column filters from all columns, excluding global filters
966
1055
  * @public
967
1056
  * @return {boolean} Return true if there is any change
1057
+ * @fires RowFilteringPlugin#filterChanged
968
1058
  */
969
1059
 
970
1060
  RowFilteringPlugin.prototype.removeAllColumnFilters = function () {
@@ -976,7 +1066,7 @@ RowFilteringPlugin.prototype.removeAllColumnFilters = function () {
976
1066
  var colCount = this._getColumnCount();
977
1067
 
978
1068
  for (var i = 0; i < colCount; ++i) {
979
- this._setColumnFilterOption(i, null); // filterChanged fired
1069
+ this._removeActiveFilterStates(i); // filterChanged fired
980
1070
 
981
1071
 
982
1072
  inputExt && inputExt.updateUI(i, ""); // TODO: Use the event instead
@@ -1054,10 +1144,10 @@ RowFilteringPlugin.prototype.setRowTransform = function (func) {
1054
1144
  RowFilteringPlugin.prototype.getFilters = function () {
1055
1145
  return this._globalFilters;
1056
1146
  };
1057
- /** Return filter functions. Use getFilterExpressions for saving and loading instead of this function
1147
+ /** Returns filter functions. Use getConfigObject for saving and loading instead of this function
1058
1148
  * @public
1059
1149
  * @return {!Array.<Function>} All column filters
1060
- * @see {@link RowFilteringPlugin.getFilterExpressions}
1150
+ * @see {@link RowFilteringPlugin.getConfigObject}
1061
1151
  */
1062
1152
 
1063
1153
 
@@ -1076,21 +1166,22 @@ RowFilteringPlugin.prototype.getAllColumnFilters = function () {
1076
1166
 
1077
1167
  return filters;
1078
1168
  };
1079
- /** Get existing filter expressions for saving and restoring.
1169
+ /** Deprecated in favor of getConfigObject(). Get existing filter expressions for saving and restoring.
1080
1170
  * @public
1081
1171
  * @return {Array.<RowFilteringPlugin~FilterExpression>} Return null if there is no column filter
1082
- * @see {@link RowFilteringPlugin.setFilterExpressions}
1172
+ * @see {@link RowFilteringPlugin.getConfigObject}
1083
1173
  */
1084
1174
 
1085
1175
 
1086
1176
  RowFilteringPlugin.prototype.getFilterExpressions = function () {
1087
1177
  if (this._columnFilters.length) {
1178
+ // TODO: Provide a way to save rawDataAccessor and formattedDataAccessor
1088
1179
  return this._columnFilters.map(toFilterExpression);
1089
1180
  }
1090
1181
 
1091
1182
  return null;
1092
1183
  };
1093
- /** Clear all existing column filters and restore column filters from the given valid filter expressions. If the parameter is null, the result is equivalent to calling removeAllColumnFilters();
1184
+ /** Deprecated. Clear all existing column filters and restore column filters from the given valid filter expressions. If the parameter is null, the result is equivalent to calling removeAllColumnFilters();
1094
1185
  * @public
1095
1186
  * @param {Array.<RowFilteringPlugin~FilterExpression>} filterExps
1096
1187
  */
@@ -1110,7 +1201,7 @@ RowFilteringPlugin.prototype.setFilterExpressions = function (filterExps) {
1110
1201
  var colIndex = fields.indexOf(field);
1111
1202
 
1112
1203
  if (colIndex >= 0) {
1113
- this.addColumnFilter(colIndex, filterExp.expression, filterExp.context);
1204
+ this.setColumnFilter(colIndex, filterExp.expression, filterExp.context);
1114
1205
  }
1115
1206
  }
1116
1207
  }
@@ -1349,11 +1440,13 @@ RowFilteringPlugin.prototype.refresh = function () {
1349
1440
 
1350
1441
 
1351
1442
  RowFilteringPlugin.prototype._updateColumnIcon = function (colIndex) {
1352
- var cfo = this._getColumnFilterOption(colIndex);
1443
+ var cfo = this._getColumnFilterOption(colIndex); // colData["rowFiltering"]["filterOption"]
1444
+
1353
1445
 
1354
- var co = this._getExtColumnOptions(colIndex);
1446
+ var colSettings = this._getUserColumnSettings(colIndex); // colData["rowFiltering"]
1355
1447
 
1356
- var iconActivation = co.filterIcon == false ? "none" : this._iconActivation;
1448
+
1449
+ var iconActivation = colSettings.filterIcon == false ? "none" : this._iconActivation;
1357
1450
  var hasFilter = cfo ? cfo._filters.length : 0;
1358
1451
 
1359
1452
  for (var i = this._hosts.length; --i >= 0;) {
@@ -1492,10 +1585,10 @@ RowFilteringPlugin.prototype.getColumnFilterState = function (colIndex) {
1492
1585
 
1493
1586
  return null;
1494
1587
  };
1495
- /** Get the stored user context from all columns. The column with no filter will return null value
1588
+ /** Deprecated in favor of getConfigObject(). Get the stored user context from all columns. The column with no filter will return null value
1496
1589
  * @public
1497
1590
  * @return {!Array} Array of context objects
1498
- * @see {@link RowFilteringPlugin.getFilterExpressions}
1591
+ * @see {@link RowFilteringPlugin.getConfigObject}
1499
1592
  */
1500
1593
 
1501
1594
 
@@ -1549,16 +1642,19 @@ RowFilteringPlugin.prototype._getDataTable = function (dv) {
1549
1642
  return dt;
1550
1643
  };
1551
1644
  /** @public
1645
+ * @ignore
1552
1646
  * @param {string} field A field name for getting raw value from row data
1553
1647
  * @param {Function=} formatter A formatter that takes row data, retrieves data, and modified the data for display.
1554
1648
  * @param {string=} fmtField A field name to be used instead of formatter for getting formatted value
1555
1649
  * @param {Function=} rawDataAccessor Data getter to retrieve raw value
1556
1650
  * @param {Function=} formattedDataAccessor Data getter to retrieve formatted value. This paramter will override formatted and fmtField parameters
1651
+ * @param {Function=} filterFuncs
1652
+ * @param {Object=} selectedItems
1557
1653
  * @return {Object} Object that maps formatted value to array of raw values
1558
1654
  */
1559
1655
 
1560
1656
 
1561
- RowFilteringPlugin.prototype.getUniqueValues = function (field, formatter, fmtField, rawDataAccessor, formattedDataAccessor) {
1657
+ RowFilteringPlugin.prototype.getUniqueValues = function (field, formatter, fmtField, rawDataAccessor, formattedDataAccessor, filterFuncs, selectedItems) {
1562
1658
  if (!field) {
1563
1659
  return null;
1564
1660
  }
@@ -1629,6 +1725,12 @@ RowFilteringPlugin.prototype.getUniqueValues = function (field, formatter, fmtFi
1629
1725
  continue;
1630
1726
  }
1631
1727
 
1728
+ if (filterFuncs) {
1729
+ if (!selectedItems[formattedVal]) {
1730
+ selectedItems[formattedVal] = RowFilteringPlugin._getFilteredValue(row, filterFuncs);
1731
+ }
1732
+ }
1733
+
1632
1734
  var rawValues = uniqueValues[formattedVal];
1633
1735
 
1634
1736
  if (rawValues) {
@@ -1668,6 +1770,23 @@ RowFilteringPlugin._createDialog = function () {
1668
1770
 
1669
1771
  return tag ? document.createElement(tag) : null;
1670
1772
  };
1773
+ /** @private
1774
+ * @function
1775
+ * @param {Object} rowData
1776
+ * @param {!Array.<Function>} filters
1777
+ * @returns {boolean}
1778
+ */
1779
+
1780
+
1781
+ RowFilteringPlugin._getFilteredValue = function (rowData, filters) {
1782
+ for (var i = filters.length; --i >= 0;) {
1783
+ if (!filters[i](rowData)) {
1784
+ return false;
1785
+ }
1786
+ }
1787
+
1788
+ return true;
1789
+ };
1671
1790
  /** @public
1672
1791
  * @param {number} colIndex
1673
1792
  * @param {RowFilteringPlugin~FilterDialogOptions=} runtimeDialogOptions
@@ -1767,13 +1886,6 @@ RowFilteringPlugin.prototype.openDialog = function (colIndex, runtimeDialogOptio
1767
1886
  this._filterDialog.setSortState(stp.getSortOrder(colIndex)); // This is for ELF v3
1768
1887
 
1769
1888
  } // Setting up dialog configuration
1770
- // cfo is required for storing unique entries in the dialog, even though no filter is active
1771
-
1772
-
1773
- var cfo = this._initColumnFilterOption(colIndex); // colData["rowFiltering"]["filterOption"]
1774
-
1775
-
1776
- var colOptions = this._getExtColumnOptions(colIndex); // colData["rowFiltering"]
1777
1889
 
1778
1890
 
1779
1891
  var colData = host.getColumnData(colIndex);
@@ -1802,36 +1914,53 @@ RowFilteringPlugin.prototype.openDialog = function (colIndex, runtimeDialogOptio
1802
1914
  };
1803
1915
  var columnDialogOptions = null;
1804
1916
 
1805
- if (colOptions) {
1806
- if (colOptions.fieldDataType) {
1807
- // TODO: Use data type from Composite Grid (getColumnDataType) or Realtime Grid (getDataType) instead
1808
- columnDialogOptions = {
1809
- fieldDataType: colOptions.fieldDataType
1810
- };
1811
- }
1917
+ var colSettings = this._getUserColumnSettings(colIndex); // colData["rowFiltering"]
1918
+
1919
+
1920
+ if (colSettings.fieldDataType) {
1921
+ // TODO: Use data type from Composite Grid (getColumnDataType) or Realtime Grid (getDataType) instead
1922
+ columnDialogOptions = {
1923
+ fieldDataType: colSettings.fieldDataType
1924
+ };
1812
1925
  }
1813
1926
 
1814
1927
  RowFilteringPlugin._overrideConfig(dialogConfig, this._dialogOptions);
1815
1928
 
1816
1929
  RowFilteringPlugin._overrideConfig(dialogConfig, columnDialogOptions);
1817
1930
 
1818
- RowFilteringPlugin._overrideConfig(dialogConfig, runtimeDialogOptions);
1931
+ RowFilteringPlugin._overrideConfig(dialogConfig, runtimeDialogOptions); // cfo is required for storing unique entries in the dialog, even though no filter is active
1932
+ // TODO: move rawDataAccessor and other settings to colSettings
1933
+
1934
+
1935
+ var cfo = this._initColumnFilterOption(colIndex); // colData["rowFiltering"]["filterOption"]
1936
+
1819
1937
 
1820
1938
  var rawDataAccessor = cfo._rawDataAccessor = dialogConfig.rawDataAccessor || null;
1821
1939
  var formattedDataAccessor = cfo._formattedDataAccessor = dialogConfig.formattedDataAccessor || null;
1822
1940
  var sortLogic = dialogConfig.sortLogic || null; // Populate data for filter dialog based on existing states
1823
1941
 
1824
- var customFilter = cfo._expressions[0] || "";
1825
- var ctx = cfo._context[0];
1826
- var selectedItems = ctx ? ctx.selectedItems : null;
1942
+ var condition2D = null;
1943
+ var filterMode = ""; // default
1827
1944
 
1828
- if (selectedItems) {
1829
- customFilter = "";
1830
- } else {
1831
- selectedItems = {};
1945
+ var filterFuncs = null;
1946
+ var exp = colSettings.expression;
1947
+
1948
+ if (exp) {
1949
+ if (Array.isArray(exp)) {
1950
+ if (exp.length) {
1951
+ condition2D = Array.isArray(exp[0]) ? exp : [exp]; // Guaranteed condition2D to be a 2D array
1952
+
1953
+ filterMode = "advanced";
1954
+ }
1955
+ } else if (typeof exp === "function" || typeof exp === "string" || _typeof(exp) === "object") {
1956
+ if (cfo._filters && cfo._filters.length) {
1957
+ filterFuncs = cfo._filters;
1958
+ }
1959
+ }
1832
1960
  }
1833
1961
 
1834
- var uniqueValues = cfo.uniqueValues = this.getUniqueValues(field, this._getFormatter(colIndex), "", rawDataAccessor, formattedDataAccessor);
1962
+ var selectedItems = {};
1963
+ var uniqueValues = cfo.uniqueValues = this.getUniqueValues(field, this._getFormatter(colIndex), "", rawDataAccessor, formattedDataAccessor, filterFuncs, selectedItems);
1835
1964
  var keys = Object.keys(uniqueValues);
1836
1965
 
1837
1966
  if (sortLogic) {
@@ -1862,8 +1991,8 @@ RowFilteringPlugin.prototype.openDialog = function (colIndex, runtimeDialogOptio
1862
1991
  this._filterDialog._colIndex = colIndex;
1863
1992
  this._filterDialog.data = items; // TODO: Move all settings to configuration object
1864
1993
 
1865
- this._filterDialog.filterMode = customFilter ? "advanced" : "";
1866
- this._filterDialog.conditions = customFilter; // WARNING: This must be 2D Array
1994
+ this._filterDialog.filterMode = filterMode;
1995
+ this._filterDialog.conditions = condition2D;
1867
1996
 
1868
1997
  this._filterDialog.show();
1869
1998
  };
@@ -2059,14 +2188,6 @@ RowFilteringPlugin.prototype._onDialogFilterChanged = function (e) {
2059
2188
  }
2060
2189
 
2061
2190
  if (atLeastOne) {
2062
- if (!ctx) {
2063
- ctx = {};
2064
- }
2065
-
2066
- if (ctx) {
2067
- ctx["selectedItems"] = selectedItems; // For restore item in the dialog
2068
- }
2069
-
2070
2191
  this.addColumnFilter(colIndex, itemMap, ctx);
2071
2192
  }
2072
2193