@refinitiv-ui/efx-grid 6.0.40 → 6.0.41

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. package/lib/column-selection-dialog/lib/column-selection-dialog.d.ts +2 -1
  2. package/lib/column-selection-dialog/lib/column-selection-dialog.js +23 -7
  3. package/lib/core/dist/core.js +25 -26
  4. package/lib/core/dist/core.min.js +1 -1
  5. package/lib/core/es6/grid/Core.js +25 -26
  6. package/lib/grid/index.js +1 -1
  7. package/lib/rt-grid/dist/rt-grid.js +2083 -1753
  8. package/lib/rt-grid/dist/rt-grid.min.js +1 -1
  9. package/lib/rt-grid/es6/Grid.js +55 -7
  10. package/lib/rt-grid/es6/RowDefinition.d.ts +2 -2
  11. package/lib/rt-grid/es6/RowDefinition.js +37 -18
  12. package/lib/tr-grid-column-grouping/es6/ColumnGrouping.js +26 -40
  13. package/lib/tr-grid-util/es6/CellPainter.d.ts +2 -1
  14. package/lib/tr-grid-util/es6/CellPainter.js +6 -4
  15. package/lib/tr-grid-util/es6/ExpressionParser.d.ts +10 -0
  16. package/lib/tr-grid-util/es6/ExpressionParser.js +366 -0
  17. package/lib/tr-grid-util/es6/FilterBuilder.d.ts +10 -6
  18. package/lib/tr-grid-util/es6/FilterBuilder.js +264 -234
  19. package/lib/tr-grid-util/es6/FilterOperators.d.ts +3 -1
  20. package/lib/tr-grid-util/es6/FilterOperators.js +51 -2
  21. package/lib/tr-grid-util/es6/Util.d.ts +0 -3
  22. package/lib/tr-grid-util/es6/Util.js +0 -53
  23. package/lib/tr-grid-util/es6/formula/Formula.js +3 -3
  24. package/lib/types/es6/ColumnDragging.d.ts +51 -0
  25. package/lib/types/es6/ExtensionOptions.d.ts +2 -0
  26. package/lib/types/es6/Extensions.d.ts +3 -1
  27. package/lib/types/es6/RealtimeGrid/RowDefinition.d.ts +2 -2
  28. package/lib/types/es6/index.d.ts +1 -0
  29. package/lib/versions.json +3 -3
  30. package/package.json +1 -1
@@ -0,0 +1,366 @@
1
+ /** @type {Object.<string, number>}
2
+ * @private
3
+ * @const
4
+ */
5
+ var OperatorPrecedences = {
6
+ "||": 1,
7
+ "&&": 2,
8
+ "<": 3,
9
+ ">": 3,
10
+ "<=": 3,
11
+ ">=": 3,
12
+ "!=": 3,
13
+ "=": 3,
14
+ "==": 3,
15
+ "===": 3,
16
+ "+": 4,
17
+ "-": 4,
18
+ "*": 5,
19
+ "%": 6,
20
+ "/": 6
21
+ };
22
+ /** @type {Object.<string, Function>}
23
+ * @private
24
+ * @const
25
+ */
26
+ var OperatorFunctions = {
27
+ "+": function(lhs, rhs){ return lhs + rhs; },
28
+ "-": function(lhs, rhs){ return lhs - rhs; },
29
+ "*": function(lhs, rhs){ return lhs * rhs; },
30
+ "/": function(lhs, rhs){ return lhs / rhs; },
31
+ "%": function(lhs, rhs){ return lhs % rhs; },
32
+ "<": function(lhs, rhs){ return lhs < rhs; },
33
+ ">": function(lhs, rhs){ return lhs > rhs; },
34
+ "<=": function(lhs, rhs){ return lhs <= rhs; },
35
+ ">=": function(lhs, rhs){ return lhs >= rhs; },
36
+ "==": function(lhs, rhs){ return lhs == rhs; },
37
+ "!=": function(lhs, rhs){ return lhs != rhs; },
38
+ "&&": function(lhs, rhs){ return lhs && rhs; },
39
+ "||": function(lhs, rhs){ return lhs || rhs; }
40
+ };
41
+ /** @type {Object.<string, Function>}
42
+ * @private
43
+ * @function
44
+ * @param {Array.<Object>} ary
45
+ * @param {string|number} value
46
+ * @param {string} type
47
+ * @param {string=} dataType
48
+ * @return {number}
49
+ */
50
+ var _addToken = function(ary, value, type, dataType) {
51
+ var tok = {
52
+ value: value,
53
+ type: type
54
+ };
55
+ if(dataType) {
56
+ tok.dataType = dataType;
57
+ }
58
+ if(type === "operator") {
59
+ tok.precedence = OperatorPrecedences[value];
60
+ }
61
+ ary.push(tok);
62
+ return ary.length - 1;
63
+ };
64
+
65
+ /** @public
66
+ * @namespace
67
+ */
68
+ var ExpressionParser = {};
69
+ /** @type {Array.<Object>}
70
+ * @private
71
+ * @const
72
+ */
73
+ ExpressionParser._tokens = [];
74
+
75
+
76
+ /** @private
77
+ * @function
78
+ * @param {string} str
79
+ * @return {string}
80
+ */
81
+ ExpressionParser._withString = function(str) {
82
+ var tokId = _addToken(ExpressionParser._tokens,
83
+ str.substring(1, str.length - 1),
84
+ "literal",
85
+ "string"
86
+ );
87
+ return " #" + tokId + "#";
88
+ };
89
+ /** @private
90
+ * @function
91
+ * @param {string} field
92
+ * @return {string}
93
+ */
94
+ ExpressionParser._withField = function(field) {
95
+ var tokId = _addToken(ExpressionParser._tokens,
96
+ field,
97
+ "literal",
98
+ "variable"
99
+ );
100
+ return " #" + tokId + "#";
101
+ };
102
+ /** @private
103
+ * @function
104
+ * @param {string} field
105
+ * @return {string}
106
+ */
107
+ ExpressionParser._withFieldInBrackets = function(field) {
108
+ return ExpressionParser._withField(field.substring(1, field.length - 1));
109
+ };
110
+ /** @private
111
+ * @function
112
+ * @param {string} numStr
113
+ * @return {string}
114
+ */
115
+ ExpressionParser._withNegativeNumber = function(numStr) {
116
+ var num = +numStr;
117
+ if(num === num) {
118
+ var tokId = _addToken(ExpressionParser._tokens,
119
+ num,
120
+ "literal",
121
+ "number"
122
+ );
123
+ return " #" + tokId + "#";
124
+ }
125
+ return "";
126
+ };
127
+ /** @private
128
+ * @function
129
+ * @param {string} numStr
130
+ * @return {string}
131
+ */
132
+ ExpressionParser._withPositiveNumber = function(numStr) {
133
+ if(numStr.charCodeAt(0) === 35) {
134
+ return numStr; // skip token (string with leading #)
135
+ }
136
+ return ExpressionParser._withNegativeNumber(numStr);
137
+ };
138
+ /** @private
139
+ * @function
140
+ * @param {string} opStr
141
+ * @return {string}
142
+ */
143
+ ExpressionParser._withOperator = function(opStr) {
144
+ if(OperatorPrecedences[opStr]) {
145
+ if(opStr == "=" || opStr == "===") {
146
+ opStr = "==";
147
+ }
148
+ var tokId = _addToken(ExpressionParser._tokens, opStr, "operator");
149
+ return "#" + tokId + "#";
150
+ }
151
+ return "";
152
+ };
153
+ /** @private
154
+ * @function
155
+ * @param {string} paStr
156
+ * @return {string}
157
+ */
158
+ ExpressionParser._withParenthesis = function(paStr) {
159
+ var tokId = _addToken(ExpressionParser._tokens, paStr, "parenthesis");
160
+ return "#" + tokId + "#";
161
+ };
162
+
163
+
164
+ /** @private
165
+ * @function
166
+ * @param {Object} ctx
167
+ * @return {boolean} Returns true if there is any error, otherwise returns false (everything is OK)
168
+ */
169
+ ExpressionParser._tester = function(ctx) {
170
+ var rpn = ctx._rpn;
171
+ var inputCount = rpn.length;
172
+ var operandCount = 0;
173
+ var maxStack = 0;
174
+ for(var i = 0; i < inputCount; ++i) {
175
+ var tok = rpn[i];
176
+ if(tok.type !== "literal") {
177
+ if(operandCount >= 2) {
178
+ operandCount -= 2;
179
+ } else {
180
+ console.warn("Cannot parse an expression with insufficient number of operands");
181
+ return true;
182
+ }
183
+ }
184
+ operandCount++;
185
+ if(operandCount > maxStack) {
186
+ maxStack = operandCount;
187
+ }
188
+ }
189
+
190
+ if(operandCount !== 1) {
191
+ return true;
192
+ }
193
+
194
+ ctx._stackSize = maxStack;
195
+ return false;
196
+ };
197
+ /** @private
198
+ * @function
199
+ * @param {Object} ctx
200
+ * @param {Object} rowData
201
+ * @return {boolean}
202
+ */
203
+ ExpressionParser._filter = function(ctx, rowData) {
204
+ var rpn = ctx._rpn;
205
+ var results = new Array(ctx._stackSize);
206
+ var inputCount = rpn.length;
207
+ var operandCount = 0;
208
+ var curRes;
209
+ for(var i = 0; i < inputCount; ++i) {
210
+ var tok = rpn[i];
211
+ var tokValue = tok.value;
212
+ if(tok.type === "literal") {
213
+ if(tok.dataType !== "variable") {
214
+ curRes = tokValue;
215
+ } else {
216
+ curRes = rowData ? rowData[tokValue] : null;
217
+ }
218
+ } else { // operator
219
+ curRes = OperatorFunctions[tokValue](
220
+ results[operandCount - 2],
221
+ results[operandCount - 1]
222
+ );
223
+ operandCount -= 2;
224
+ }
225
+ results[operandCount++] = curRes;
226
+ }
227
+ // return results[0];
228
+ return results[0] ? true : false;
229
+ };
230
+
231
+ /** Parse an expression into a filter function (returning boolean value)
232
+ * @public
233
+ * @param {string|Function} expression
234
+ * @return {Function}
235
+ * @example
236
+ * func = ExpressionParser.parse("field1 >= 10");
237
+ * func = ExpressionParser.parse("[field with space] != 'text'");
238
+ * func = ExpressionParser.parse("(field1 + 1) / 2 < 10 && field2 - 10 > 3");
239
+ */
240
+ ExpressionParser.parse = function(expression) {
241
+ if(typeof expression === "function") {
242
+ return expression;
243
+ }
244
+ if(!expression || typeof expression !== "string") {
245
+ return null;
246
+ }
247
+
248
+ var tokExp = expression.trim();
249
+ if(!tokExp) {
250
+ return null;
251
+ }
252
+ ExpressionParser._tokens.length = 0;
253
+
254
+ tokExp = tokExp.replace(/".+?"/g, ExpressionParser._withString); // double quote string
255
+ tokExp = tokExp.replace(/'.+?'/g, ExpressionParser._withString); // single quote string
256
+ tokExp = tokExp.replace(/\[.+?\]/g, ExpressionParser._withFieldInBrackets); // field in square brackets
257
+ tokExp = tokExp.replace(/-[0-9.]+/g, ExpressionParser._withNegativeNumber);
258
+ tokExp = tokExp.replace(/[0-9.#]+/g, ExpressionParser._withPositiveNumber);
259
+ tokExp = tokExp.replace(/[a-zA-Z_]\w*/g, ExpressionParser._withField);
260
+ tokExp = tokExp.replace(/[\-\/+*%!=<>&|]+/g, ExpressionParser._withOperator);
261
+ tokExp = tokExp.replace(/[()]/g, ExpressionParser._withParenthesis); // round brackets
262
+
263
+ var tokens = ExpressionParser._tokens;
264
+ var tokCount = tokens.length;
265
+ if(!tokCount) {
266
+ return null; // There is no recognizable character
267
+ }
268
+
269
+ // Generate infix token list
270
+ var infixTokens = [];
271
+ var matches = tokExp.match(/#[0-9]+#/g);
272
+ var i, tok, tokType;
273
+ for(i = 0; i < tokCount; ++i) {
274
+ var tokId = matches[i];
275
+ var tokIdx = +(tokId.substring(1, tokId.length - 1));
276
+ tok = tokens[tokIdx];
277
+ tokType = tok.type;
278
+ if(tokType === "literal") {
279
+ var prevTok = infixTokens[infixTokens.length - 1];
280
+ if(prevTok && prevTok.type === "literal") { // Incorrect infix notation detected
281
+ if(tok.value < 0 && tok.dataType === "number") {
282
+ _addToken(infixTokens, "-", "operator");
283
+ tok.value *= -1;
284
+ } else {
285
+ console.warn("Cannot parse an expression with insufficient number of operators");
286
+ return null;
287
+ }
288
+ }
289
+ }
290
+ infixTokens.push(tok);
291
+ }
292
+ // TODO: Handle the case where subtraction operator is in front of a variable
293
+ ExpressionParser._tokens.length = 0;
294
+
295
+ // Convert Infix notation to Reverse Polish Notation (Postfix)
296
+ // See https://en.wikipedia.org/wiki/Shunting_yard_algorithm#The_algorithm_in_detail
297
+ tokCount = infixTokens.length;
298
+ var rpn = [];
299
+ var operators = [];
300
+ var lastOp = null;
301
+ var foundLeftPa = false;
302
+ for(i = 0; i < tokCount; ++i) {
303
+ tok = infixTokens[i];
304
+ tokType = tok.type;
305
+
306
+ if(tokType === "literal") {
307
+ rpn.push(tok);
308
+ } else if(tokType === "parenthesis") {
309
+ if(tok.value === "(") {
310
+ operators.push(tok);
311
+ } else { // When finding right parenthesis, pop all operators until left parenthesis
312
+ foundLeftPa = false;
313
+ while(operators.length) {
314
+ lastOp = operators.pop();
315
+ if(lastOp.value === "(" && lastOp.type === "parenthesis") {
316
+ foundLeftPa = true;
317
+ break;
318
+ } else {
319
+ rpn.push(lastOp);
320
+ }
321
+ }
322
+ if(!foundLeftPa) {
323
+ console.warn("No left parenthesis paired with the right one");
324
+ }
325
+ }
326
+ } else { // operator
327
+ lastOp = operators[operators.length - 1];
328
+ var prevPrecedence = lastOp ? lastOp.precedence : null;
329
+ if(prevPrecedence != null && tok.precedence <= prevPrecedence) {
330
+ rpn.push(operators.pop());
331
+ }
332
+ operators.push(tok);
333
+ }
334
+ }
335
+
336
+ foundLeftPa = false;
337
+ while(operators.length) {
338
+ lastOp = operators.pop();
339
+ if(lastOp.value === "(" && lastOp.type === "parenthesis") {
340
+ foundLeftPa = true;
341
+ } else {
342
+ rpn.push(lastOp);
343
+ }
344
+ }
345
+ if(foundLeftPa) {
346
+ console.warn("No right parenthesis paired with the left one");
347
+ }
348
+
349
+ var inputCount = rpn.length;
350
+ if(!inputCount) {
351
+ return null; // The expression contains nothing but parentheses
352
+ }
353
+
354
+ var ctx = {
355
+ _rpn: rpn
356
+ };
357
+
358
+ if(ExpressionParser._tester(ctx)) {
359
+ return null; // Insufficient number of operands
360
+ }
361
+
362
+ return ExpressionParser._filter.bind(null, ctx);
363
+ };
364
+
365
+ export default ExpressionParser;
366
+ export {ExpressionParser};
@@ -1,13 +1,15 @@
1
- import { parseCondition } from "./Util.js";
2
- import { DateTime } from "./DateTime.js";
3
- import { FilterOperators } from "./FilterOperators.js";
1
+ import { FilterOperators, OperatorFunctions } from "./FilterOperators.js";
2
+ import { ExpressionParser } from "./ExpressionParser.js";
4
3
 
5
4
  declare namespace FilterBuilder {
6
5
 
7
6
  type Options = {
8
- field: string,
7
+ field?: (string|null)|null,
9
8
  formatter?: ((...params: any[]) => any)|null,
10
- formattedField?: string|null
9
+ formattedField?: string|null,
10
+ useUTCTime?: boolean|null,
11
+ rawDataAccessor?: ((...params: any[]) => any)|null,
12
+ formattedDataAccessor?: ((...params: any[]) => any)|null
11
13
  };
12
14
 
13
15
  type Condition = any[]|null;
@@ -26,9 +28,11 @@ declare class FilterBuilder {
26
28
 
27
29
  public setFieldDefinition(fieldName: string, formatter?: ((...params: any[]) => any)|null, formattedField?: string|null): void;
28
30
 
31
+ public setDefaultUTCUsage(useUTCTime: boolean): void;
32
+
29
33
  public setDataAccessors(rawDataAccessor?: ((...params: any[]) => any)|null, formattedDataAccessor?: ((...params: any[]) => any)|null): void;
30
34
 
31
- public addCondition(oper: string, value: string|number|null, connector?: string|null, useUTCTime?: boolean|null): boolean;
35
+ public addCondition(oper: string, value: string|number|Date|null, connector?: string|null, useUTCTime?: boolean|null): boolean;
32
36
 
33
37
  public addConditions(conditions: FilterBuilder.Conditions|null): number;
34
38