@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.
@@ -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
- static makeQuickFilter(column, text, timeZone) {
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 = TableUtils.makeQuickFilterFromComponent(column, andComponent, timeZone);
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
- static makeQuickFilterFromComponent(column, text, timeZone) {
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
- static makeQuickNumberFilter(column, text) {
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
- static makeQuickTextFilter(column, text) {
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
- static makeQuickBooleanFilter(column, text) {
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
- static makeQuickDateFilter(column, text, timeZone) {
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 TableUtils.makeQuickDateFilterWithOperation(column, dateText, filterOperation, timeZone);
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
- static makeQuickDateFilterWithOperation(column, text, operation, timeZone) {
590
- var [startDate, endDate] = DateUtils.parseDateRange(text, timeZone);
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
- * Adds quotes to a value if they're not already added
643
- * @param value Value to add quotes around
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 = TableUtils.makeAdvancedValueFilter(column, selectedType, value, timeZone);
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 = TableUtils.makeSelectValueFilter(column, selectedValues, invertSelection);
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
- static removeCommas(value) {
839
- return value.replace(/[\s|,]/g, '');
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
- static makeFilterValue(columnType, value) {
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
- static makeFilterRawValue(columnType, rawValue) {
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
- static makeValue(columnType, text, timeZone) {
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
- static makeSelectValueFilter(column, selectedValues, invertSelection) {
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',