@deephaven/jsapi-utils 0.35.1-react-spectrum-provider.11 → 0.35.1-test-envoy.18
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.
- package/dist/DateUtils.d.ts +4 -3
- package/dist/DateUtils.d.ts.map +1 -1
- package/dist/DateUtils.js +16 -17
- package/dist/DateUtils.js.map +1 -1
- package/dist/MessageUtils.d.ts +34 -0
- package/dist/MessageUtils.d.ts.map +1 -0
- package/dist/MessageUtils.js +80 -0
- package/dist/MessageUtils.js.map +1 -0
- package/dist/TableUtils.d.ts +54 -52
- package/dist/TableUtils.d.ts.map +1 -1
- package/dist/TableUtils.js +294 -265
- package/dist/TableUtils.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +9 -7
package/dist/TableUtils.js
CHANGED
|
@@ -3,7 +3,6 @@ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typ
|
|
|
3
3
|
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
4
4
|
import { Type as FilterType, Operator as FilterOperator } from '@deephaven/filters';
|
|
5
5
|
import Log from '@deephaven/log';
|
|
6
|
-
import dh from '@deephaven/jsapi-shim';
|
|
7
6
|
import { PromiseUtils, TextUtils, TimeoutError } from '@deephaven/utils';
|
|
8
7
|
import DateUtils from "./DateUtils.js";
|
|
9
8
|
var log = Log.module('TableUtils');
|
|
@@ -301,6 +300,207 @@ export class TableUtils {
|
|
|
301
300
|
return TableUtils.getNormalizedType(type1) === TableUtils.getNormalizedType(type2);
|
|
302
301
|
}
|
|
303
302
|
|
|
303
|
+
/**
|
|
304
|
+
* Adds quotes to a value if they're not already added
|
|
305
|
+
* @param value Value to add quotes around
|
|
306
|
+
*/
|
|
307
|
+
static quoteValue(value) {
|
|
308
|
+
if (value.length >= 2 && (value.charAt(0) === '"' && value.charAt(value.length - 1) === '"' || value.charAt(0) === "'" && value.charAt(value.length - 1) === "'")) {
|
|
309
|
+
return value;
|
|
310
|
+
}
|
|
311
|
+
return "\"".concat(value, "\"");
|
|
312
|
+
}
|
|
313
|
+
static isRangeOperation(operation) {
|
|
314
|
+
switch (operation) {
|
|
315
|
+
case '<':
|
|
316
|
+
case '<=':
|
|
317
|
+
case '=<':
|
|
318
|
+
case '>':
|
|
319
|
+
case '>=':
|
|
320
|
+
case '=>':
|
|
321
|
+
return true;
|
|
322
|
+
default:
|
|
323
|
+
return false;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* @param filter The column filter to apply the range operation to
|
|
329
|
+
* @param operation The range operation to run
|
|
330
|
+
* @param value The value to use for the operation
|
|
331
|
+
* @returns The condition with the specified operation
|
|
332
|
+
*/
|
|
333
|
+
static makeRangeFilterWithOperation(filter, operation, value) {
|
|
334
|
+
switch (operation) {
|
|
335
|
+
case '=':
|
|
336
|
+
return filter.eq(value);
|
|
337
|
+
case '<':
|
|
338
|
+
return filter.lessThan(value);
|
|
339
|
+
case '<=':
|
|
340
|
+
case '=<':
|
|
341
|
+
return filter.lessThanOrEqualTo(value);
|
|
342
|
+
case '>':
|
|
343
|
+
return filter.greaterThan(value);
|
|
344
|
+
case '>=':
|
|
345
|
+
case '=>':
|
|
346
|
+
return filter.greaterThanOrEqualTo(value);
|
|
347
|
+
case '!=':
|
|
348
|
+
case '!':
|
|
349
|
+
return filter.notEq(value);
|
|
350
|
+
default:
|
|
351
|
+
return null;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* Wraps a table promise in a cancelable promise that will close the table if the promise is cancelled.
|
|
357
|
+
* Use in a component that loads a table, and call cancel when unmounting.
|
|
358
|
+
* @param table The table promise to wrap
|
|
359
|
+
*/
|
|
360
|
+
static makeCancelableTablePromise(table) {
|
|
361
|
+
return PromiseUtils.makeCancelable(table, resolved => {
|
|
362
|
+
resolved.close();
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
* Make a cancelable promise for a one-shot table event with a timeout.
|
|
368
|
+
* @param table Table to listen for events on
|
|
369
|
+
* @param eventName Event to listen for
|
|
370
|
+
* @param timeout Event timeout in milliseconds, defaults to 0
|
|
371
|
+
* @param matcher Optional function to determine if the promise can be resolved or stays pending
|
|
372
|
+
* @returns Resolves with the event data
|
|
373
|
+
*/
|
|
374
|
+
static makeCancelableTableEventPromise(table, eventName) {
|
|
375
|
+
var timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
|
|
376
|
+
var matcher = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
|
|
377
|
+
var eventCleanup;
|
|
378
|
+
var timeoutId;
|
|
379
|
+
var isPending = true;
|
|
380
|
+
var wrappedPromise = new Promise((resolve, reject) => {
|
|
381
|
+
timeoutId = setTimeout(() => {
|
|
382
|
+
eventCleanup();
|
|
383
|
+
isPending = false;
|
|
384
|
+
reject(new TimeoutError("Event \"".concat(eventName, "\" timed out.")));
|
|
385
|
+
}, timeout);
|
|
386
|
+
eventCleanup = table.addEventListener(eventName, event => {
|
|
387
|
+
if (matcher != null && !matcher(event)) {
|
|
388
|
+
log.debug2('Event triggered, but matcher returned false.');
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
log.debug2('Event triggered, resolving.');
|
|
392
|
+
eventCleanup();
|
|
393
|
+
clearTimeout(timeoutId);
|
|
394
|
+
isPending = false;
|
|
395
|
+
resolve(event);
|
|
396
|
+
});
|
|
397
|
+
});
|
|
398
|
+
wrappedPromise.cancel = () => {
|
|
399
|
+
if (isPending) {
|
|
400
|
+
log.debug2('Pending promise cleanup.');
|
|
401
|
+
eventCleanup();
|
|
402
|
+
clearTimeout(timeoutId);
|
|
403
|
+
isPending = false;
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
log.debug2('Ignoring non-pending promise cancel.');
|
|
407
|
+
};
|
|
408
|
+
return wrappedPromise;
|
|
409
|
+
}
|
|
410
|
+
static removeCommas(value) {
|
|
411
|
+
return value.replace(/[\s|,]/g, '');
|
|
412
|
+
}
|
|
413
|
+
static makeBooleanValue(text) {
|
|
414
|
+
var allowEmpty = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
415
|
+
if (text === '' && allowEmpty) {
|
|
416
|
+
return null;
|
|
417
|
+
}
|
|
418
|
+
switch (text === null || text === void 0 ? void 0 : text.toLowerCase()) {
|
|
419
|
+
case 'null':
|
|
420
|
+
return null;
|
|
421
|
+
case '0':
|
|
422
|
+
case 'f':
|
|
423
|
+
case 'fa':
|
|
424
|
+
case 'fal':
|
|
425
|
+
case 'fals':
|
|
426
|
+
case 'false':
|
|
427
|
+
case 'n':
|
|
428
|
+
case 'no':
|
|
429
|
+
return false;
|
|
430
|
+
case '1':
|
|
431
|
+
case 't':
|
|
432
|
+
case 'tr':
|
|
433
|
+
case 'tru':
|
|
434
|
+
case 'true':
|
|
435
|
+
case 'y':
|
|
436
|
+
case 'ye':
|
|
437
|
+
case 'yes':
|
|
438
|
+
return true;
|
|
439
|
+
default:
|
|
440
|
+
throw new Error("Invalid boolean '".concat(text, "'"));
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
static makeNumberValue(text) {
|
|
444
|
+
if (text === 'null' || text === '') {
|
|
445
|
+
return null;
|
|
446
|
+
}
|
|
447
|
+
var cleanText = text.toLowerCase().trim();
|
|
448
|
+
if (cleanText === '∞' || cleanText === 'infinity' || cleanText === 'inf') {
|
|
449
|
+
return Number.POSITIVE_INFINITY;
|
|
450
|
+
}
|
|
451
|
+
if (cleanText === '-∞' || cleanText === '-infinity' || cleanText === '-inf') {
|
|
452
|
+
return Number.NEGATIVE_INFINITY;
|
|
453
|
+
}
|
|
454
|
+
var numberText = TableUtils.removeCommas(cleanText);
|
|
455
|
+
if (TableUtils.NUMBER_REGEX.test(numberText)) {
|
|
456
|
+
return parseFloat(numberText);
|
|
457
|
+
}
|
|
458
|
+
throw new Error("Invalid number '".concat(text, "'"));
|
|
459
|
+
}
|
|
460
|
+
static getFilterOperatorString(operation) {
|
|
461
|
+
switch (operation) {
|
|
462
|
+
case FilterType.eq:
|
|
463
|
+
return '=';
|
|
464
|
+
case FilterType.notEq:
|
|
465
|
+
return '!=';
|
|
466
|
+
case FilterType.greaterThan:
|
|
467
|
+
return '>';
|
|
468
|
+
case FilterType.greaterThanOrEqualTo:
|
|
469
|
+
return '>=';
|
|
470
|
+
case FilterType.lessThan:
|
|
471
|
+
return '<';
|
|
472
|
+
case FilterType.lessThanOrEqualTo:
|
|
473
|
+
return '<=';
|
|
474
|
+
case FilterType.contains:
|
|
475
|
+
return '~';
|
|
476
|
+
case FilterType.notContains:
|
|
477
|
+
return '!~';
|
|
478
|
+
default:
|
|
479
|
+
throw new Error("Unexpected filter type ".concat(operation));
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
static isTreeTable(table) {
|
|
483
|
+
return table != null && table.expand !== undefined && table.collapse !== undefined;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* Copies the provided array, sorts by column name case insensitive, and returns the sorted array.
|
|
488
|
+
* @param columns The columns to sort
|
|
489
|
+
* @param isAscending Whether to sort ascending
|
|
490
|
+
*/
|
|
491
|
+
static sortColumns(columns) {
|
|
492
|
+
var isAscending = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
493
|
+
return [...columns].sort((a, b) => {
|
|
494
|
+
var aName = a.name.toUpperCase();
|
|
495
|
+
var bName = b.name.toUpperCase();
|
|
496
|
+
return TextUtils.sort(aName, bName, isAscending);
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
constructor(dh) {
|
|
500
|
+
_defineProperty(this, "dh", void 0);
|
|
501
|
+
this.dh = dh;
|
|
502
|
+
}
|
|
503
|
+
|
|
304
504
|
/**
|
|
305
505
|
* Create filter with the provided column and text. Handles multiple filters joined with && or ||
|
|
306
506
|
* @param column The column to set the filter on
|
|
@@ -308,7 +508,7 @@ export class TableUtils {
|
|
|
308
508
|
* @param timeZone The time zone to make this value in if it is a date type. E.g. America/New_York
|
|
309
509
|
* @returns Returns the created filter, null if text could not be parsed
|
|
310
510
|
*/
|
|
311
|
-
|
|
511
|
+
makeQuickFilter(column, text, timeZone) {
|
|
312
512
|
var orComponents = text.split('||');
|
|
313
513
|
var orFilter = null;
|
|
314
514
|
for (var i = 0; i < orComponents.length; i += 1) {
|
|
@@ -318,7 +518,7 @@ export class TableUtils {
|
|
|
318
518
|
for (var j = 0; j < andComponents.length; j += 1) {
|
|
319
519
|
var andComponent = andComponents[j].trim();
|
|
320
520
|
if (andComponent.length > 0) {
|
|
321
|
-
var filter =
|
|
521
|
+
var filter = this.makeQuickFilterFromComponent(column, andComponent, timeZone);
|
|
322
522
|
if (filter) {
|
|
323
523
|
if (andFilter) {
|
|
324
524
|
andFilter = andFilter.and(filter);
|
|
@@ -346,7 +546,7 @@ export class TableUtils {
|
|
|
346
546
|
* @param timeZone The time zone to make this filter in if it is a date type. E.g. America/New_York
|
|
347
547
|
* @returns Returns the created filter, null if text could not be parsed
|
|
348
548
|
*/
|
|
349
|
-
|
|
549
|
+
makeQuickFilterFromComponent(column, text, timeZone) {
|
|
350
550
|
var {
|
|
351
551
|
type
|
|
352
552
|
} = column;
|
|
@@ -364,8 +564,11 @@ export class TableUtils {
|
|
|
364
564
|
}
|
|
365
565
|
return this.makeQuickTextFilter(column, text);
|
|
366
566
|
}
|
|
367
|
-
|
|
567
|
+
makeQuickNumberFilter(column, text) {
|
|
368
568
|
var columnFilter = column.filter();
|
|
569
|
+
var {
|
|
570
|
+
dh
|
|
571
|
+
} = this;
|
|
369
572
|
var filter = null;
|
|
370
573
|
var regex = /\s*(>=|<=|=>|=<|>|<|!=|=|!)?(\s*-\s*)?(\s*\d*(?:,\d{3})*(?:\.\d*)?\s*)?(null|nan|infinity|inf|\u221E)?(.*)/i;
|
|
371
574
|
var result = regex.exec(text);
|
|
@@ -435,7 +638,10 @@ export class TableUtils {
|
|
|
435
638
|
filter = column.filter();
|
|
436
639
|
return TableUtils.makeRangeFilterWithOperation(filter, operation, value);
|
|
437
640
|
}
|
|
438
|
-
|
|
641
|
+
makeQuickTextFilter(column, text) {
|
|
642
|
+
var {
|
|
643
|
+
dh
|
|
644
|
+
} = this;
|
|
439
645
|
var cleanText = "".concat(text).trim();
|
|
440
646
|
var regex = /^(!~|!=|~|=|!)?(.*)/;
|
|
441
647
|
var result = regex.exec(cleanText);
|
|
@@ -509,7 +715,9 @@ export class TableUtils {
|
|
|
509
715
|
}
|
|
510
716
|
return null;
|
|
511
717
|
}
|
|
512
|
-
|
|
718
|
+
|
|
719
|
+
// eslint-disable-next-line class-methods-use-this
|
|
720
|
+
makeQuickBooleanFilter(column, text) {
|
|
513
721
|
var regex = /^(!=|=|!)?(.*)/;
|
|
514
722
|
var result = regex.exec("".concat(text).trim());
|
|
515
723
|
if (result === null) {
|
|
@@ -540,7 +748,7 @@ export class TableUtils {
|
|
|
540
748
|
* @param text The date string text to parse.
|
|
541
749
|
* @param timeZone The time zone to make this filter in if it is a date type. E.g. America/New_York
|
|
542
750
|
*/
|
|
543
|
-
|
|
751
|
+
makeQuickDateFilter(column, text, timeZone) {
|
|
544
752
|
var cleanText = text.trim();
|
|
545
753
|
var regex = /\s*(>=|<=|=>|=<|>|<|!=|!|=)?(.*)/;
|
|
546
754
|
var result = regex.exec(cleanText);
|
|
@@ -576,7 +784,7 @@ export class TableUtils {
|
|
|
576
784
|
filterOperation = FilterType.eq;
|
|
577
785
|
break;
|
|
578
786
|
}
|
|
579
|
-
return
|
|
787
|
+
return this.makeQuickDateFilterWithOperation(column, dateText, filterOperation, timeZone);
|
|
580
788
|
}
|
|
581
789
|
|
|
582
790
|
/**
|
|
@@ -586,8 +794,11 @@ export class TableUtils {
|
|
|
586
794
|
* @param operation The filter operation to use.
|
|
587
795
|
* @param timeZone The time zone to make this filter with. E.g. America/New_York
|
|
588
796
|
*/
|
|
589
|
-
|
|
590
|
-
var
|
|
797
|
+
makeQuickDateFilterWithOperation(column, text, operation, timeZone) {
|
|
798
|
+
var {
|
|
799
|
+
dh
|
|
800
|
+
} = this;
|
|
801
|
+
var [startDate, endDate] = DateUtils.parseDateRange(dh, text, timeZone);
|
|
591
802
|
var startValue = startDate != null ? dh.FilterValue.ofNumber(startDate) : null;
|
|
592
803
|
var endValue = endDate != null ? dh.FilterValue.ofNumber(endDate) : null;
|
|
593
804
|
var filter = column.filter();
|
|
@@ -637,31 +848,10 @@ export class TableUtils {
|
|
|
637
848
|
throw new Error("Invalid operator: ".concat(operation));
|
|
638
849
|
}
|
|
639
850
|
}
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
*/
|
|
645
|
-
static quoteValue(value) {
|
|
646
|
-
if (value.length >= 2 && (value.charAt(0) === '"' && value.charAt(value.length - 1) === '"' || value.charAt(0) === "'" && value.charAt(value.length - 1) === "'")) {
|
|
647
|
-
return value;
|
|
648
|
-
}
|
|
649
|
-
return "\"".concat(value, "\"");
|
|
650
|
-
}
|
|
651
|
-
static isRangeOperation(operation) {
|
|
652
|
-
switch (operation) {
|
|
653
|
-
case '<':
|
|
654
|
-
case '<=':
|
|
655
|
-
case '=<':
|
|
656
|
-
case '>':
|
|
657
|
-
case '>=':
|
|
658
|
-
case '=>':
|
|
659
|
-
return true;
|
|
660
|
-
default:
|
|
661
|
-
return false;
|
|
662
|
-
}
|
|
663
|
-
}
|
|
664
|
-
static makeQuickCharFilter(column, text) {
|
|
851
|
+
makeQuickCharFilter(column, text) {
|
|
852
|
+
var {
|
|
853
|
+
dh
|
|
854
|
+
} = this;
|
|
665
855
|
var cleanText = "".concat(text).trim();
|
|
666
856
|
var regex = /^(>=|<=|=>|=<|>|<|!=|=|!)?(null|"."|'.'|.)?(.*)/;
|
|
667
857
|
var result = regex.exec(cleanText);
|
|
@@ -699,91 +889,7 @@ export class TableUtils {
|
|
|
699
889
|
var filterValue = dh.FilterValue.ofString(TableUtils.isRangeOperation(operation) ? TableUtils.quoteValue(value) : value);
|
|
700
890
|
return TableUtils.makeRangeFilterWithOperation(filter, operation, filterValue);
|
|
701
891
|
}
|
|
702
|
-
|
|
703
|
-
/**
|
|
704
|
-
* @param filter The column filter to apply the range operation to
|
|
705
|
-
* @param operation The range operation to run
|
|
706
|
-
* @param value The value to use for the operation
|
|
707
|
-
* @returns The condition with the specified operation
|
|
708
|
-
*/
|
|
709
|
-
static makeRangeFilterWithOperation(filter, operation, value) {
|
|
710
|
-
switch (operation) {
|
|
711
|
-
case '=':
|
|
712
|
-
return filter.eq(value);
|
|
713
|
-
case '<':
|
|
714
|
-
return filter.lessThan(value);
|
|
715
|
-
case '<=':
|
|
716
|
-
case '=<':
|
|
717
|
-
return filter.lessThanOrEqualTo(value);
|
|
718
|
-
case '>':
|
|
719
|
-
return filter.greaterThan(value);
|
|
720
|
-
case '>=':
|
|
721
|
-
case '=>':
|
|
722
|
-
return filter.greaterThanOrEqualTo(value);
|
|
723
|
-
case '!=':
|
|
724
|
-
case '!':
|
|
725
|
-
return filter.notEq(value);
|
|
726
|
-
default:
|
|
727
|
-
return null;
|
|
728
|
-
}
|
|
729
|
-
}
|
|
730
|
-
|
|
731
|
-
/**
|
|
732
|
-
* Wraps a table promise in a cancelable promise that will close the table if the promise is cancelled.
|
|
733
|
-
* Use in a component that loads a table, and call cancel when unmounting.
|
|
734
|
-
* @param table The table promise to wrap
|
|
735
|
-
*/
|
|
736
|
-
static makeCancelableTablePromise(table) {
|
|
737
|
-
return PromiseUtils.makeCancelable(table, resolved => {
|
|
738
|
-
resolved.close();
|
|
739
|
-
});
|
|
740
|
-
}
|
|
741
|
-
|
|
742
|
-
/**
|
|
743
|
-
* Make a cancelable promise for a one-shot table event with a timeout.
|
|
744
|
-
* @param table Table to listen for events on
|
|
745
|
-
* @param eventName Event to listen for
|
|
746
|
-
* @param timeout Event timeout in milliseconds, defaults to 0
|
|
747
|
-
* @param matcher Optional function to determine if the promise can be resolved or stays pending
|
|
748
|
-
* @returns Resolves with the event data
|
|
749
|
-
*/
|
|
750
|
-
static makeCancelableTableEventPromise(table, eventName) {
|
|
751
|
-
var timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
|
|
752
|
-
var matcher = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
|
|
753
|
-
var eventCleanup;
|
|
754
|
-
var timeoutId;
|
|
755
|
-
var isPending = true;
|
|
756
|
-
var wrappedPromise = new Promise((resolve, reject) => {
|
|
757
|
-
timeoutId = setTimeout(() => {
|
|
758
|
-
eventCleanup();
|
|
759
|
-
isPending = false;
|
|
760
|
-
reject(new TimeoutError("Event \"".concat(eventName, "\" timed out.")));
|
|
761
|
-
}, timeout);
|
|
762
|
-
eventCleanup = table.addEventListener(eventName, event => {
|
|
763
|
-
if (matcher != null && !matcher(event)) {
|
|
764
|
-
log.debug2('Event triggered, but matcher returned false.');
|
|
765
|
-
return;
|
|
766
|
-
}
|
|
767
|
-
log.debug2('Event triggered, resolving.');
|
|
768
|
-
eventCleanup();
|
|
769
|
-
clearTimeout(timeoutId);
|
|
770
|
-
isPending = false;
|
|
771
|
-
resolve(event);
|
|
772
|
-
});
|
|
773
|
-
});
|
|
774
|
-
wrappedPromise.cancel = () => {
|
|
775
|
-
if (isPending) {
|
|
776
|
-
log.debug2('Pending promise cleanup.');
|
|
777
|
-
eventCleanup();
|
|
778
|
-
clearTimeout(timeoutId);
|
|
779
|
-
isPending = false;
|
|
780
|
-
return;
|
|
781
|
-
}
|
|
782
|
-
log.debug2('Ignoring non-pending promise cancel.');
|
|
783
|
-
};
|
|
784
|
-
return wrappedPromise;
|
|
785
|
-
}
|
|
786
|
-
static makeAdvancedFilter(column, options, timeZone) {
|
|
892
|
+
makeAdvancedFilter(column, options, timeZone) {
|
|
787
893
|
var {
|
|
788
894
|
filterItems,
|
|
789
895
|
filterOperators,
|
|
@@ -799,7 +905,7 @@ export class TableUtils {
|
|
|
799
905
|
} = filterItem;
|
|
800
906
|
if (selectedType != null && selectedType.length > 0 && value != null && value.length > 0) {
|
|
801
907
|
try {
|
|
802
|
-
var newFilter =
|
|
908
|
+
var newFilter = this.makeAdvancedValueFilter(column, selectedType, value, timeZone);
|
|
803
909
|
if (newFilter != null) {
|
|
804
910
|
if (i === 0) {
|
|
805
911
|
filter = newFilter;
|
|
@@ -825,7 +931,7 @@ export class TableUtils {
|
|
|
825
931
|
}
|
|
826
932
|
}
|
|
827
933
|
}
|
|
828
|
-
var selectValueFilter =
|
|
934
|
+
var selectValueFilter = this.makeSelectValueFilter(column, selectedValues, invertSelection);
|
|
829
935
|
if (selectValueFilter != null) {
|
|
830
936
|
if (filter != null) {
|
|
831
937
|
filter = filter.and(selectValueFilter);
|
|
@@ -835,8 +941,54 @@ export class TableUtils {
|
|
|
835
941
|
}
|
|
836
942
|
return filter;
|
|
837
943
|
}
|
|
838
|
-
|
|
839
|
-
|
|
944
|
+
makeAdvancedValueFilter(column, operation, value, timeZone) {
|
|
945
|
+
if (TableUtils.isDateType(column.type)) {
|
|
946
|
+
return this.makeQuickDateFilterWithOperation(column, value, operation, timeZone);
|
|
947
|
+
}
|
|
948
|
+
if (TableUtils.isNumberType(column.type) || TableUtils.isCharType(column.type)) {
|
|
949
|
+
return this.makeQuickFilter(column, "".concat(TableUtils.getFilterOperatorString(operation)).concat(value));
|
|
950
|
+
}
|
|
951
|
+
var filterValue = this.makeFilterValue(column.type, value);
|
|
952
|
+
var filter = column.filter();
|
|
953
|
+
switch (operation) {
|
|
954
|
+
case FilterType.eq:
|
|
955
|
+
return filter.eq(filterValue);
|
|
956
|
+
case FilterType.eqIgnoreCase:
|
|
957
|
+
return filter.eqIgnoreCase(filterValue);
|
|
958
|
+
case FilterType.notEq:
|
|
959
|
+
return filter.notEq(filterValue);
|
|
960
|
+
case FilterType.notEqIgnoreCase:
|
|
961
|
+
return filter.notEqIgnoreCase(filterValue);
|
|
962
|
+
case FilterType.greaterThan:
|
|
963
|
+
return filter.greaterThan(filterValue);
|
|
964
|
+
case FilterType.greaterThanOrEqualTo:
|
|
965
|
+
return filter.greaterThanOrEqualTo(filterValue);
|
|
966
|
+
case FilterType.lessThan:
|
|
967
|
+
return filter.lessThan(filterValue);
|
|
968
|
+
case FilterType.lessThanOrEqualTo:
|
|
969
|
+
return filter.lessThanOrEqualTo(filterValue);
|
|
970
|
+
case FilterType.isTrue:
|
|
971
|
+
return filter.isTrue();
|
|
972
|
+
case FilterType.isFalse:
|
|
973
|
+
return filter.isFalse();
|
|
974
|
+
case FilterType.isNull:
|
|
975
|
+
return filter.isNull();
|
|
976
|
+
case FilterType.contains:
|
|
977
|
+
return filter.isNull().not().and(filter.invoke('matches', dh.FilterValue.ofString("(?s)(?i).*\\Q".concat(value, "\\E.*"))));
|
|
978
|
+
case FilterType.notContains:
|
|
979
|
+
return filter.isNull().or(filter.invoke('matches', dh.FilterValue.ofString("(?s)(?i).*\\Q".concat(value, "\\E.*"))).not());
|
|
980
|
+
case FilterType.startsWith:
|
|
981
|
+
return filter.isNull().not().and(filter.invoke('matches', dh.FilterValue.ofString("(?s)(?i)^\\Q".concat(value, "\\E.*"))));
|
|
982
|
+
case FilterType.endsWith:
|
|
983
|
+
return filter.isNull().not().and(filter.invoke('matches', dh.FilterValue.ofString("(?s)(?i).*\\Q".concat(value, "\\E$"))));
|
|
984
|
+
case FilterType.in:
|
|
985
|
+
case FilterType.inIgnoreCase:
|
|
986
|
+
case FilterType.notIn:
|
|
987
|
+
case FilterType.notInIgnoreCase:
|
|
988
|
+
case FilterType.invoke:
|
|
989
|
+
default:
|
|
990
|
+
throw new Error("Unexpected filter operation: ".concat(operation));
|
|
991
|
+
}
|
|
840
992
|
}
|
|
841
993
|
|
|
842
994
|
/**
|
|
@@ -844,7 +996,10 @@ export class TableUtils {
|
|
|
844
996
|
* @param value The value to make the filter value from.
|
|
845
997
|
* @returns The FilterValue item for this column/value combination
|
|
846
998
|
*/
|
|
847
|
-
|
|
999
|
+
makeFilterValue(columnType, value) {
|
|
1000
|
+
var {
|
|
1001
|
+
dh
|
|
1002
|
+
} = this;
|
|
848
1003
|
var type = TableUtils.getBaseType(columnType);
|
|
849
1004
|
if (TableUtils.isTextType(type)) {
|
|
850
1005
|
return dh.FilterValue.ofString(value);
|
|
@@ -862,7 +1017,10 @@ export class TableUtils {
|
|
|
862
1017
|
* @param value The value to actually set
|
|
863
1018
|
* @returns The FilterValue item for this column/value combination
|
|
864
1019
|
*/
|
|
865
|
-
|
|
1020
|
+
makeFilterRawValue(columnType, rawValue) {
|
|
1021
|
+
var {
|
|
1022
|
+
dh
|
|
1023
|
+
} = this;
|
|
866
1024
|
if (TableUtils.isTextType(columnType)) {
|
|
867
1025
|
return dh.FilterValue.ofString(rawValue);
|
|
868
1026
|
}
|
|
@@ -878,7 +1036,10 @@ export class TableUtils {
|
|
|
878
1036
|
* @param text The string value to make a type for
|
|
879
1037
|
* @param timeZone The time zone to make this value in if it is a date type. E.g. America/New_York
|
|
880
1038
|
*/
|
|
881
|
-
|
|
1039
|
+
makeValue(columnType, text, timeZone) {
|
|
1040
|
+
var {
|
|
1041
|
+
dh
|
|
1042
|
+
} = this;
|
|
882
1043
|
if (text === 'null') {
|
|
883
1044
|
return null;
|
|
884
1045
|
}
|
|
@@ -892,7 +1053,7 @@ export class TableUtils {
|
|
|
892
1053
|
return TableUtils.makeBooleanValue(text, true);
|
|
893
1054
|
}
|
|
894
1055
|
if (TableUtils.isDateType(columnType)) {
|
|
895
|
-
var [date] = DateUtils.parseDateRange(text, timeZone);
|
|
1056
|
+
var [date] = DateUtils.parseDateRange(dh, text, timeZone);
|
|
896
1057
|
return date;
|
|
897
1058
|
}
|
|
898
1059
|
if (TableUtils.isNumberType(columnType)) {
|
|
@@ -901,124 +1062,6 @@ export class TableUtils {
|
|
|
901
1062
|
log.error('Unexpected column type', columnType);
|
|
902
1063
|
return null;
|
|
903
1064
|
}
|
|
904
|
-
static makeBooleanValue(text) {
|
|
905
|
-
var allowEmpty = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
906
|
-
if (text === '' && allowEmpty) {
|
|
907
|
-
return null;
|
|
908
|
-
}
|
|
909
|
-
switch (text === null || text === void 0 ? void 0 : text.toLowerCase()) {
|
|
910
|
-
case 'null':
|
|
911
|
-
return null;
|
|
912
|
-
case '0':
|
|
913
|
-
case 'f':
|
|
914
|
-
case 'fa':
|
|
915
|
-
case 'fal':
|
|
916
|
-
case 'fals':
|
|
917
|
-
case 'false':
|
|
918
|
-
case 'n':
|
|
919
|
-
case 'no':
|
|
920
|
-
return false;
|
|
921
|
-
case '1':
|
|
922
|
-
case 't':
|
|
923
|
-
case 'tr':
|
|
924
|
-
case 'tru':
|
|
925
|
-
case 'true':
|
|
926
|
-
case 'y':
|
|
927
|
-
case 'ye':
|
|
928
|
-
case 'yes':
|
|
929
|
-
return true;
|
|
930
|
-
default:
|
|
931
|
-
throw new Error("Invalid boolean '".concat(text, "'"));
|
|
932
|
-
}
|
|
933
|
-
}
|
|
934
|
-
static makeNumberValue(text) {
|
|
935
|
-
if (text === 'null' || text === '') {
|
|
936
|
-
return null;
|
|
937
|
-
}
|
|
938
|
-
var cleanText = text.toLowerCase().trim();
|
|
939
|
-
if (cleanText === '∞' || cleanText === 'infinity' || cleanText === 'inf') {
|
|
940
|
-
return Number.POSITIVE_INFINITY;
|
|
941
|
-
}
|
|
942
|
-
if (cleanText === '-∞' || cleanText === '-infinity' || cleanText === '-inf') {
|
|
943
|
-
return Number.NEGATIVE_INFINITY;
|
|
944
|
-
}
|
|
945
|
-
var numberText = TableUtils.removeCommas(cleanText);
|
|
946
|
-
if (TableUtils.NUMBER_REGEX.test(numberText)) {
|
|
947
|
-
return parseFloat(numberText);
|
|
948
|
-
}
|
|
949
|
-
throw new Error("Invalid number '".concat(text, "'"));
|
|
950
|
-
}
|
|
951
|
-
static getFilterOperatorString(operation) {
|
|
952
|
-
switch (operation) {
|
|
953
|
-
case FilterType.eq:
|
|
954
|
-
return '=';
|
|
955
|
-
case FilterType.notEq:
|
|
956
|
-
return '!=';
|
|
957
|
-
case FilterType.greaterThan:
|
|
958
|
-
return '>';
|
|
959
|
-
case FilterType.greaterThanOrEqualTo:
|
|
960
|
-
return '>=';
|
|
961
|
-
case FilterType.lessThan:
|
|
962
|
-
return '<';
|
|
963
|
-
case FilterType.lessThanOrEqualTo:
|
|
964
|
-
return '<=';
|
|
965
|
-
case FilterType.contains:
|
|
966
|
-
return '~';
|
|
967
|
-
case FilterType.notContains:
|
|
968
|
-
return '!~';
|
|
969
|
-
default:
|
|
970
|
-
throw new Error("Unexpected filter type ".concat(operation));
|
|
971
|
-
}
|
|
972
|
-
}
|
|
973
|
-
static makeAdvancedValueFilter(column, operation, value, timeZone) {
|
|
974
|
-
if (TableUtils.isDateType(column.type)) {
|
|
975
|
-
return TableUtils.makeQuickDateFilterWithOperation(column, value, operation, timeZone);
|
|
976
|
-
}
|
|
977
|
-
if (TableUtils.isNumberType(column.type) || TableUtils.isCharType(column.type)) {
|
|
978
|
-
return TableUtils.makeQuickFilter(column, "".concat(TableUtils.getFilterOperatorString(operation)).concat(value));
|
|
979
|
-
}
|
|
980
|
-
var filterValue = TableUtils.makeFilterValue(column.type, value);
|
|
981
|
-
var filter = column.filter();
|
|
982
|
-
switch (operation) {
|
|
983
|
-
case FilterType.eq:
|
|
984
|
-
return filter.eq(filterValue);
|
|
985
|
-
case FilterType.eqIgnoreCase:
|
|
986
|
-
return filter.eqIgnoreCase(filterValue);
|
|
987
|
-
case FilterType.notEq:
|
|
988
|
-
return filter.notEq(filterValue);
|
|
989
|
-
case FilterType.notEqIgnoreCase:
|
|
990
|
-
return filter.notEqIgnoreCase(filterValue);
|
|
991
|
-
case FilterType.greaterThan:
|
|
992
|
-
return filter.greaterThan(filterValue);
|
|
993
|
-
case FilterType.greaterThanOrEqualTo:
|
|
994
|
-
return filter.greaterThanOrEqualTo(filterValue);
|
|
995
|
-
case FilterType.lessThan:
|
|
996
|
-
return filter.lessThan(filterValue);
|
|
997
|
-
case FilterType.lessThanOrEqualTo:
|
|
998
|
-
return filter.lessThanOrEqualTo(filterValue);
|
|
999
|
-
case FilterType.isTrue:
|
|
1000
|
-
return filter.isTrue();
|
|
1001
|
-
case FilterType.isFalse:
|
|
1002
|
-
return filter.isFalse();
|
|
1003
|
-
case FilterType.isNull:
|
|
1004
|
-
return filter.isNull();
|
|
1005
|
-
case FilterType.contains:
|
|
1006
|
-
return filter.isNull().not().and(filter.invoke('matches', dh.FilterValue.ofString("(?s)(?i).*\\Q".concat(value, "\\E.*"))));
|
|
1007
|
-
case FilterType.notContains:
|
|
1008
|
-
return filter.isNull().or(filter.invoke('matches', dh.FilterValue.ofString("(?s)(?i).*\\Q".concat(value, "\\E.*"))).not());
|
|
1009
|
-
case FilterType.startsWith:
|
|
1010
|
-
return filter.isNull().not().and(filter.invoke('matches', dh.FilterValue.ofString("(?s)(?i)^\\Q".concat(value, "\\E.*"))));
|
|
1011
|
-
case FilterType.endsWith:
|
|
1012
|
-
return filter.isNull().not().and(filter.invoke('matches', dh.FilterValue.ofString("(?s)(?i).*\\Q".concat(value, "\\E$"))));
|
|
1013
|
-
case FilterType.in:
|
|
1014
|
-
case FilterType.inIgnoreCase:
|
|
1015
|
-
case FilterType.notIn:
|
|
1016
|
-
case FilterType.notInIgnoreCase:
|
|
1017
|
-
case FilterType.invoke:
|
|
1018
|
-
default:
|
|
1019
|
-
throw new Error("Unexpected filter operation: ".concat(operation));
|
|
1020
|
-
}
|
|
1021
|
-
}
|
|
1022
1065
|
|
|
1023
1066
|
/**
|
|
1024
1067
|
* Create a filter using the selected items
|
|
@@ -1029,7 +1072,10 @@ export class TableUtils {
|
|
|
1029
1072
|
* @param invertSelection Invert the selection (eg. All items are selected, then you deselect items)
|
|
1030
1073
|
* @returns Returns a `in` or `notIn` FilterCondition as necessary, or null if no filtering should be applied (everything selected)
|
|
1031
1074
|
*/
|
|
1032
|
-
|
|
1075
|
+
makeSelectValueFilter(column, selectedValues, invertSelection) {
|
|
1076
|
+
var {
|
|
1077
|
+
dh
|
|
1078
|
+
} = this;
|
|
1033
1079
|
if (selectedValues.length === 0) {
|
|
1034
1080
|
if (invertSelection) {
|
|
1035
1081
|
// No filter means select everything
|
|
@@ -1085,23 +1131,6 @@ export class TableUtils {
|
|
|
1085
1131
|
}
|
|
1086
1132
|
return column.filter().in(values);
|
|
1087
1133
|
}
|
|
1088
|
-
static isTreeTable(table) {
|
|
1089
|
-
return table != null && table.expand !== undefined && table.collapse !== undefined;
|
|
1090
|
-
}
|
|
1091
|
-
|
|
1092
|
-
/**
|
|
1093
|
-
* Copies the provided array, sorts by column name case insensitive, and returns the sorted array.
|
|
1094
|
-
* @param columns The columns to sort
|
|
1095
|
-
* @param isAscending Whether to sort ascending
|
|
1096
|
-
*/
|
|
1097
|
-
static sortColumns(columns) {
|
|
1098
|
-
var isAscending = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
1099
|
-
return [...columns].sort((a, b) => {
|
|
1100
|
-
var aName = a.name.toUpperCase();
|
|
1101
|
-
var bName = b.name.toUpperCase();
|
|
1102
|
-
return TextUtils.sort(aName, bName, isAscending);
|
|
1103
|
-
});
|
|
1104
|
-
}
|
|
1105
1134
|
}
|
|
1106
1135
|
_defineProperty(TableUtils, "dataType", {
|
|
1107
1136
|
BOOLEAN: 'boolean',
|