@deephaven/iris-grid 0.15.1-beta.4 → 0.15.2-beta.6

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.
@@ -7,7 +7,7 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
7
7
  /* eslint class-methods-use-this: "off" */
8
8
  import React from 'react';
9
9
  import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
10
- import { dhFilterFilled, vsRemove, vsCheck, vsFilter, vsReply } from '@deephaven/icons';
10
+ import { dhFilterFilled, vsRemove, vsCheck, vsFilter } from '@deephaven/icons';
11
11
  import debounce from 'lodash.debounce';
12
12
  import { ContextActions, ContextActionUtils, GLOBAL_SHORTCUTS } from '@deephaven/components';
13
13
  import { GridMouseHandler, isEditableGridModel } from '@deephaven/grid';
@@ -27,33 +27,41 @@ var CONTEXT_MENU_DATE_FORMAT = 'yyyy-MM-dd HH:mm:ss.SSSSSSSSS';
27
27
 
28
28
  class IrisGridContextMenuHandler extends GridMouseHandler {
29
29
  /**
30
- * Get filter condition for quick filter with existed column filter and the new filter to be applied,
31
- * returns new filter if filters are not additive.
32
- * if filters are additive, returns filter conditions combined with 'and'.
30
+ * Get filter condition for quick filter and combines with a new filter using the operator specified,
31
+ * returns new filter if no operator supplied.
33
32
  * @param columnFilter
34
33
  * @param newColumnFilter
35
- * @param additive
34
+ * @param operator
36
35
  */
37
- static getQuickFilterCondition(columnFilter, newColumnFilter) {
38
- var additive = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
36
+ static getQuickFilterCondition(columnFilter, newColumnFilter, operator) {
37
+ if (columnFilter && operator === '&&') {
38
+ return columnFilter.and(newColumnFilter);
39
+ }
39
40
 
40
- if (!additive || !columnFilter) {
41
- return newColumnFilter;
41
+ if (columnFilter && operator === '||') {
42
+ return columnFilter.or(newColumnFilter);
42
43
  }
43
44
 
44
- return columnFilter.and(newColumnFilter);
45
+ return newColumnFilter;
45
46
  }
46
47
  /**
47
- * combines filter text with '&&' if filters are additive
48
+ * combines filter text with operator if declared
48
49
  * @param filterText
49
50
  * @param newFilterText
50
- * @param additive
51
+ * @param operator
52
+ */
53
+
54
+
55
+ static getQuickFilterText(filterText, newFilterText, operator) {
56
+ return operator && filterText ? "".concat(filterText, " ").concat(operator, " ").concat(newFilterText) : newFilterText;
57
+ }
58
+ /**
59
+ * Converts operator to text string,
51
60
  */
52
61
 
53
62
 
54
- static getQuickFilterText(filterText, newFilterText) {
55
- var additive = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
56
- return additive && filterText ? "".concat(filterText, " && ").concat(newFilterText) : newFilterText;
63
+ static getOperatorAsText(operator) {
64
+ return operator === '&&' ? 'And' : 'Or';
57
65
  }
58
66
  /**
59
67
  * Gets an equality filter for the provided numeric value
@@ -196,7 +204,7 @@ class IrisGridContextMenuHandler extends GridMouseHandler {
196
204
  action: () => {
197
205
  this.irisGrid.clearAllFilters();
198
206
  },
199
- disabled: !(quickFilters.size > 0 || advancedFilters.size > 0 || searchFilter !== null)
207
+ disabled: !(quickFilters.size > 0 || advancedFilters.size > 0 || searchFilter != null)
200
208
  });
201
209
  actions.push({
202
210
  title: 'Sort by',
@@ -319,133 +327,121 @@ class IrisGridContextMenuHandler extends GridMouseHandler {
319
327
  showTimeZone: settings === null || settings === void 0 ? void 0 : settings.showTimeZone,
320
328
  showTSeparator: settings === null || settings === void 0 ? void 0 : settings.showTSeparator,
321
329
  defaultDateTimeFormatString: CONTEXT_MENU_DATE_FORMAT
322
- }); // grid data area context menu options
323
-
324
- if (column != null && rowIndex != null) {
325
- if (model.isFilterable(modelColumn)) {
326
- // cell data area contextmenu options
327
- var filterMenu = {
328
- title: 'Filter By Value',
329
- icon: vsRemove,
330
- iconColor: filterIconColor,
331
- group: IrisGridContextMenuHandler.GROUP_FILTER,
332
- order: 10,
333
- actions: []
334
- };
335
- var andFilterMenu = {
336
- title: 'Add Filter By Value',
337
- icon: vsRemove,
338
- iconColor: filterIconColor,
339
- group: IrisGridContextMenuHandler.GROUP_FILTER,
340
- order: 20,
341
- actions: [],
342
- disabled: !quickFilters.get(modelColumn)
343
- };
344
- var gotoRow = {
345
- title: 'Go to',
346
- icon: vsReply,
347
- iconColor: filterIconColor,
348
- shortcut: SHORTCUTS.TABLE.GOTO_ROW,
349
- group: IrisGridContextMenuHandler.GROUP_GOTO,
350
- order: 10,
351
- action: () => this.irisGrid.handleGotoRowOpened()
352
- };
353
-
354
- if (value != null) {
355
- // Chars get treated like numbers in terms of which filters are available
356
- if (TableUtils.isNumberType(column.type) || TableUtils.isCharType(column.type)) {
357
- assertNotNull(modelColumn); // We want to show the full unformatted value if it's a number, so user knows which value they are matching
358
- // If it's a Char we just show the char
359
-
360
- var numberValueText = TableUtils.isCharType(column.type) ? String.fromCharCode(value) : "".concat(value);
361
- filterMenu.actions = this.numberFilterActions(column, numberValueText, value, quickFilters.get(modelColumn));
362
- andFilterMenu.actions = this.numberFilterActions(column, numberValueText, value, quickFilters.get(modelColumn), true);
363
- } else if (TableUtils.isBooleanType(column.type)) {
364
- filterMenu.actions = this.booleanFilterActions(column, valueText);
365
- andFilterMenu.actions = this.booleanFilterActions(column, valueText, quickFilters.get(modelColumn), true);
366
- } else if (TableUtils.isDateType(column.type)) {
367
- var dateValueText = dateFilterFormatter.format(value);
368
- var previewValue = previewFilterFormatter.format(value);
369
- filterMenu.actions = this.dateFilterActions(column, dateValueText, previewValue, value);
370
- andFilterMenu.actions = this.dateFilterActions(column, dateValueText, previewValue, value, quickFilters.get(modelColumn), true);
371
- } else {
372
- filterMenu.actions = this.stringFilterActions(column, valueText, value);
373
- andFilterMenu.actions = this.stringFilterActions(column, valueText, value, quickFilters.get(modelColumn), true);
374
- }
375
- } else {
376
- filterMenu.actions = this.nullFilterActions(column);
377
- andFilterMenu.actions = this.nullFilterActions(column, quickFilters.get(modelColumn), true);
378
- }
330
+ });
331
+ if (column == null || rowIndex == null) return actions; // grid data area context menu options
379
332
 
380
- if (filterMenu.actions != null && filterMenu.actions.length > 0) {
381
- actions.push(filterMenu);
382
- }
333
+ if (model.isFilterable(modelColumn)) {
334
+ // cell data area contextmenu options
335
+ var filterMenu = {
336
+ title: 'Filter By Value',
337
+ icon: vsRemove,
338
+ iconColor: filterIconColor,
339
+ group: IrisGridContextMenuHandler.GROUP_FILTER,
340
+ order: 10,
341
+ actions: []
342
+ };
383
343
 
384
- if (andFilterMenu.actions != null && andFilterMenu.actions.length > 0) {
385
- actions.push(andFilterMenu);
344
+ if (value == null) {
345
+ if (quickFilters.get(modelColumn)) {
346
+ filterMenu.actions.push({
347
+ title: 'And',
348
+ actions: this.nullFilterActions(column, quickFilters.get(modelColumn), '&&'),
349
+ order: 2,
350
+ group: ContextActions.groups.high
351
+ });
386
352
  }
387
353
 
388
- actions.push(gotoRow);
389
- }
354
+ filterMenu.actions.push(...this.nullFilterActions(column));
355
+ } else if (TableUtils.isBooleanType(column.type)) {
356
+ // boolean should have OR condition, and handles it's own null menu options
357
+ if (quickFilters.get(modelColumn)) {
358
+ filterMenu.actions.push({
359
+ title: 'Or',
360
+ actions: this.booleanFilterActions(column, valueText, quickFilters.get(modelColumn), '||'),
361
+ order: 2,
362
+ group: ContextActions.groups.high
363
+ });
364
+ }
390
365
 
391
- if (canCopy) {
392
- actions.push({
393
- title: 'Copy Cell',
394
- group: IrisGridContextMenuHandler.GROUP_COPY,
395
- order: 10,
396
- action: () => {
397
- irisGrid.copyCell(columnIndex, rowIndex);
398
- }
399
- });
400
- actions.push({
401
- title: 'Copy Cell Unformatted',
402
- group: IrisGridContextMenuHandler.GROUP_COPY,
403
- order: 20,
404
- action: () => {
405
- irisGrid.copyCell(columnIndex, rowIndex, true);
406
- }
407
- });
408
- }
409
- } // data area, including blank space context menu options
366
+ filterMenu.actions.push(...this.booleanFilterActions(column, valueText));
367
+ } else if (TableUtils.isNumberType(column.type) || TableUtils.isCharType(column.type)) {
368
+ // Chars get treated like numbers in terms of which filters are available
369
+ assertNotNull(modelColumn); // We want to show the full unformatted value if it's a number, so user knows which value they are matching
370
+ // If it's a Char we just show the char
371
+
372
+ var numberValueText = TableUtils.isCharType(column.type) ? String.fromCharCode(value) : "".concat(value);
373
+
374
+ if (quickFilters.get(modelColumn)) {
375
+ filterMenu.actions.push({
376
+ title: 'And',
377
+ actions: this.numberFilterActions(column, numberValueText, value, quickFilters.get(modelColumn), '&&'),
378
+ order: 2,
379
+ group: ContextActions.groups.high
380
+ });
381
+ }
410
382
 
383
+ filterMenu.actions.push(...this.numberFilterActions(column, numberValueText, value, quickFilters.get(modelColumn)));
384
+ } else if (TableUtils.isDateType(column.type)) {
385
+ var dateValueText = dateFilterFormatter.format(value);
386
+ var previewValue = previewFilterFormatter.format(value);
387
+
388
+ if (quickFilters.get(modelColumn)) {
389
+ filterMenu.actions.push({
390
+ title: 'And',
391
+ actions: this.dateFilterActions(column, dateValueText, previewValue, value, quickFilters.get(modelColumn), '&&'),
392
+ order: 2,
393
+ group: ContextActions.groups.high
394
+ });
395
+ }
411
396
 
412
- var {
413
- selectedRanges
414
- } = grid.state;
397
+ filterMenu.actions.push(...this.dateFilterActions(column, dateValueText, previewValue, value, quickFilters.get(modelColumn)));
398
+ } else {
399
+ if (quickFilters.get(modelColumn)) {
400
+ filterMenu.actions.push({
401
+ title: 'And',
402
+ actions: this.stringFilterActions(column, valueText, value, quickFilters.get(modelColumn), '&&'),
403
+ order: 2,
404
+ group: ContextActions.groups.high
405
+ });
406
+ }
415
407
 
416
- if (selectedRanges.length > 0) {
417
- if (canCopy) {
418
- actions.push({
419
- title: 'Copy Selection',
420
- shortcut: GLOBAL_SHORTCUTS.COPY,
421
- group: IrisGridContextMenuHandler.GROUP_COPY,
422
- order: 30,
423
- action: () => {
424
- irisGrid.copyRanges(selectedRanges);
425
- }
426
- });
427
- actions.push({
428
- title: 'Copy Selection w/ Headers',
429
- group: IrisGridContextMenuHandler.GROUP_COPY,
430
- order: 40,
431
- action: () => {
432
- irisGrid.copyRanges(selectedRanges, true);
433
- }
434
- });
408
+ filterMenu.actions.push(...this.stringFilterActions(column, valueText, value));
435
409
  }
436
410
 
437
- if (isEditableGridModel(model) && model.isEditable) {
438
- actions.push({
439
- title: 'Delete Selected Rows',
440
- group: IrisGridContextMenuHandler.GROUP_EDIT,
441
- order: 50,
442
- action: () => {
443
- this.irisGrid.deleteRanges(selectedRanges);
444
- }
445
- });
411
+ if (filterMenu.actions != null && filterMenu.actions.length > 0) {
412
+ actions.push(filterMenu);
446
413
  }
447
414
  }
448
415
 
416
+ var gotoRow = {
417
+ title: 'Go to',
418
+ iconColor: filterIconColor,
419
+ shortcut: SHORTCUTS.TABLE.GOTO_ROW,
420
+ group: IrisGridContextMenuHandler.GROUP_GOTO,
421
+ order: 10,
422
+ action: () => this.irisGrid.toggleGotoRow("".concat(rowIndex + 1))
423
+ };
424
+ actions.push(gotoRow);
425
+
426
+ if (canCopy) {
427
+ actions.push({
428
+ title: 'Copy Cell',
429
+ group: IrisGridContextMenuHandler.GROUP_COPY,
430
+ order: 10,
431
+ action: () => {
432
+ irisGrid.copyCell(columnIndex, rowIndex);
433
+ }
434
+ });
435
+ actions.push({
436
+ title: 'Copy Cell Unformatted',
437
+ group: IrisGridContextMenuHandler.GROUP_COPY,
438
+ order: 20,
439
+ action: () => {
440
+ irisGrid.copyCell(columnIndex, rowIndex, true);
441
+ }
442
+ });
443
+ }
444
+
449
445
  return actions;
450
446
  }
451
447
 
@@ -461,7 +457,8 @@ class IrisGridContextMenuHandler extends GridMouseHandler {
461
457
  var modelColumn = irisGrid.getModelColumn(columnIndex);
462
458
  var modelRow = irisGrid.getModelRow(rowIndex);
463
459
  var {
464
- model
460
+ model,
461
+ canCopy
465
462
  } = irisGrid.props;
466
463
  var {
467
464
  columns
@@ -470,7 +467,8 @@ class IrisGridContextMenuHandler extends GridMouseHandler {
470
467
  metrics,
471
468
  isFilterBarShown,
472
469
  quickFilters,
473
- advancedFilters
470
+ advancedFilters,
471
+ selectedRanges
474
472
  } = irisGrid.state;
475
473
  assertNotNull(metrics);
476
474
  var {
@@ -499,30 +497,63 @@ class IrisGridContextMenuHandler extends GridMouseHandler {
499
497
  modelColumn
500
498
  }));
501
499
  }
500
+ }
502
501
 
503
- if (modelColumn != null && column != null && model.isFilterable(modelColumn)) {
502
+ if (modelColumn != null && model.isFilterable(modelColumn)) {
503
+ // Clear column filter should still be available after last row
504
+ // And should be available in both header and body context menus
505
+ actions.push({
506
+ title: 'Clear Column Filter',
507
+ group: IrisGridContextMenuHandler.GROUP_FILTER,
508
+ order: 30,
509
+ action: () => {
510
+ this.irisGrid.removeColumnFilter(modelColumn);
511
+ },
512
+ disabled: !(quickFilters.has(modelColumn) || advancedFilters.has(modelColumn))
513
+ });
514
+ }
515
+
516
+ if (isFilterBarShown ? y <= gridY : y <= columnHeaderHeight) {
517
+ // grid header context menu options
518
+ if (modelColumn != null) {
519
+ actions.push(...this.getHeaderActions(modelColumn, gridPoint));
520
+ }
521
+ } else {
522
+ // grid body context menu options
523
+ if (modelColumn != null && modelRow != null) {
524
+ actions.push(...this.getCellActions(modelColumn, grid, gridPoint));
525
+ } // blank space context menu options
526
+
527
+
528
+ if (canCopy && selectedRanges.length > 0) {
504
529
  actions.push({
505
- title: 'Clear Column Filter',
506
- group: IrisGridContextMenuHandler.GROUP_FILTER,
530
+ title: 'Copy Selection',
531
+ shortcut: GLOBAL_SHORTCUTS.COPY,
532
+ group: IrisGridContextMenuHandler.GROUP_COPY,
507
533
  order: 30,
508
534
  action: () => {
509
- this.irisGrid.removeColumnFilter(modelColumn);
510
- },
511
- disabled: !(quickFilters.has(modelColumn) || advancedFilters.has(modelColumn))
535
+ irisGrid.copyRanges(selectedRanges);
536
+ }
537
+ });
538
+ actions.push({
539
+ title: 'Copy Selection w/ Headers',
540
+ group: IrisGridContextMenuHandler.GROUP_COPY,
541
+ order: 40,
542
+ action: () => {
543
+ irisGrid.copyRanges(selectedRanges, true);
544
+ }
512
545
  });
513
546
  }
514
- }
515
547
 
516
- if (modelColumn != null) {
517
- var _column = columns[modelColumn];
518
-
519
- if (isFilterBarShown ? y <= gridY : y <= columnHeaderHeight) {
520
- // grid header context menu options
521
- if (_column != null) {
522
- actions.push(...this.getHeaderActions(modelColumn, gridPoint));
523
- }
524
- } else {
525
- actions.push(...this.getCellActions(modelColumn, grid, gridPoint));
548
+ if (isEditableGridModel(model) && model.isEditable && selectedRanges.length > 0) {
549
+ actions.push({
550
+ title: 'Delete Selected Rows',
551
+ group: IrisGridContextMenuHandler.GROUP_EDIT,
552
+ order: 50,
553
+ action: () => {
554
+ this.irisGrid.deleteRanges(selectedRanges);
555
+ }
556
+ });
526
557
  }
527
558
  }
528
559
 
@@ -636,8 +667,7 @@ class IrisGridContextMenuHandler extends GridMouseHandler {
636
667
  return actions;
637
668
  }
638
669
 
639
- stringFilterActions(column, valueText, value, quickFilter) {
640
- var additive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
670
+ stringFilterActions(column, valueText, value, quickFilter, operator) {
641
671
  var filterValue = dh.FilterValue.ofString(value);
642
672
  var newQuickFilter = quickFilter;
643
673
 
@@ -661,62 +691,68 @@ class IrisGridContextMenuHandler extends GridMouseHandler {
661
691
  actions.push({
662
692
  menuElement: /*#__PURE__*/React.createElement("div", {
663
693
  className: "iris-grid-filter-menu-item-value"
664
- }, "\"", valueText, "\""),
665
- order: 1
694
+ }, operator ? IrisGridContextMenuHandler.getOperatorAsText(operator) : '', ' ', "\"", valueText, "\""),
695
+ order: 1,
696
+ group: ContextActions.groups.high
666
697
  });
667
698
  actions.push({
668
699
  title: 'text is exactly',
669
700
  description: "Show only rows where ".concat(column.name, " is ").concat(value, " (case sensitive)"),
670
701
  action: () => {
671
- this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().eq(filterValue), additive), IrisGridContextMenuHandler.getQuickFilterText(filterText, "=".concat(valueText), additive));
702
+ this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().eq(filterValue), operator), IrisGridContextMenuHandler.getQuickFilterText(filterText, "=".concat(valueText), operator));
672
703
  },
673
- order: 10
704
+ order: 10,
705
+ group: ContextActions.groups.low
674
706
  });
675
707
  actions.push({
676
708
  title: 'text is not exactly',
677
709
  description: "Show only rows where ".concat(column.name, " is not ").concat(valueText, " (case sensitive)"),
678
710
  action: () => {
679
- this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().notEq(filterValue), additive), IrisGridContextMenuHandler.getQuickFilterText(filterText, "!=".concat(valueText), additive));
711
+ this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().notEq(filterValue), operator), IrisGridContextMenuHandler.getQuickFilterText(filterText, "!=".concat(valueText), operator));
680
712
  },
681
- order: 20
713
+ order: 20,
714
+ group: ContextActions.groups.low
682
715
  });
683
716
  actions.push({
684
717
  title: "text contains",
685
718
  description: "Show only rows where ".concat(column.name, " contains ").concat(valueText),
686
719
  action: () => {
687
- this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().contains(filterValue), additive), IrisGridContextMenuHandler.getQuickFilterText(filterText, "~".concat(valueText), additive));
720
+ this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().contains(filterValue), operator), IrisGridContextMenuHandler.getQuickFilterText(filterText, "~".concat(valueText), operator));
688
721
  },
689
- order: 30
722
+ order: 30,
723
+ group: ContextActions.groups.low
690
724
  });
691
725
  actions.push({
692
726
  title: 'text does not contain',
693
727
  description: "Show only rows where ".concat(column.name, " does not contain ").concat(value),
694
728
  action: () => {
695
- this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().contains(filterValue).not(), additive), IrisGridContextMenuHandler.getQuickFilterText(filterText, "!~".concat(valueText), additive));
729
+ this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().contains(filterValue).not(), operator), IrisGridContextMenuHandler.getQuickFilterText(filterText, "!~".concat(valueText), operator));
696
730
  },
697
- order: 40
731
+ order: 40,
732
+ group: ContextActions.groups.low
698
733
  });
699
734
  actions.push({
700
735
  title: 'text starts with',
701
736
  description: "Show only rows where ".concat(column.name, " starts with ").concat(valueText),
702
737
  action: () => {
703
- this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().invoke('startsWith', filterValue), additive), IrisGridContextMenuHandler.getQuickFilterText(filterText, "".concat(valueText, "*"), additive));
738
+ this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().invoke('startsWith', filterValue), operator), IrisGridContextMenuHandler.getQuickFilterText(filterText, "".concat(valueText, "*"), operator));
704
739
  },
705
- order: 50
740
+ order: 50,
741
+ group: ContextActions.groups.low
706
742
  });
707
743
  actions.push({
708
744
  title: 'text ends with',
709
745
  description: "Show only rows where ".concat(column.name, " ends with ").concat(valueText),
710
746
  action: () => {
711
- this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().invoke('endsWith', filterValue), additive), IrisGridContextMenuHandler.getQuickFilterText(filterText, "*".concat(valueText), additive));
747
+ this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().invoke('endsWith', filterValue), operator), IrisGridContextMenuHandler.getQuickFilterText(filterText, "*".concat(valueText), operator));
712
748
  },
713
- order: 60
749
+ order: 60,
750
+ group: ContextActions.groups.low
714
751
  });
715
752
  return actions;
716
753
  }
717
754
 
718
- numberFilterActions(column, valueText, value, quickFilter) {
719
- var additive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
755
+ numberFilterActions(column, valueText, value, quickFilter, operator) {
720
756
  var filterValue = IrisGridContextMenuHandler.getFilterValueForNumberOrChar(column.type, value);
721
757
  var filter = null;
722
758
  var filterText = null;
@@ -736,26 +772,29 @@ class IrisGridContextMenuHandler extends GridMouseHandler {
736
772
  actions.push({
737
773
  menuElement: /*#__PURE__*/React.createElement("div", {
738
774
  className: "iris-grid-filter-menu-item-value"
739
- }, additive ? ' AND ' : '', "\"", valueText, "\""),
740
- order: 1
775
+ }, operator ? IrisGridContextMenuHandler.getOperatorAsText(operator) : '', ' ', "\"", valueText, "\""),
776
+ order: 1,
777
+ group: ContextActions.groups.high
741
778
  });
742
779
  actions.push({
743
780
  title: 'is equal to',
744
781
  description: "Show only rows where ".concat(column.name, " is ").concat(valueText),
745
782
  action: () => {
746
783
  var valueFilter = IrisGridContextMenuHandler.getNumberValueEqualsFilter(column, value);
747
- this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, valueFilter, additive), IrisGridContextMenuHandler.getQuickFilterText(filterText, "=".concat(valueText), additive));
784
+ this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, valueFilter, operator), IrisGridContextMenuHandler.getQuickFilterText(filterText, "=".concat(valueText), operator));
748
785
  },
749
- order: 10
786
+ order: 10,
787
+ group: ContextActions.groups.low
750
788
  });
751
789
  actions.push({
752
790
  title: 'is not equal to',
753
791
  description: "Show only rows where ".concat(column.name, " is not ").concat(valueText),
754
792
  action: () => {
755
793
  var valueFilter = IrisGridContextMenuHandler.getNumberValueEqualsFilter(column, value).not();
756
- this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, valueFilter, additive), IrisGridContextMenuHandler.getQuickFilterText(filterText, "!=".concat(valueText), additive));
794
+ this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, valueFilter, operator), IrisGridContextMenuHandler.getQuickFilterText(filterText, "!=".concat(valueText), operator));
757
795
  },
758
- order: 20
796
+ order: 20,
797
+ group: ContextActions.groups.low
759
798
  }); // IDS-6092 Less/greater than filters don't make sense for Infinite/NaN
760
799
  // TODO (DH-11799): These char filters should work in Bard, with the merge for DH-11040: https://gitlab.eng.illumon.com/illumon/iris/merge_requests/5801
761
800
  // They do not work in Powell though, so disable them.
@@ -765,91 +804,101 @@ class IrisGridContextMenuHandler extends GridMouseHandler {
765
804
  title: 'greater than',
766
805
  description: "Show only rows where ".concat(column.name, " is greater than ").concat(valueText),
767
806
  action: () => {
768
- this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().greaterThan(filterValue), additive), IrisGridContextMenuHandler.getQuickFilterText(filterText, ">".concat(valueText), additive));
807
+ this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().greaterThan(filterValue), operator), IrisGridContextMenuHandler.getQuickFilterText(filterText, ">".concat(valueText), operator));
769
808
  },
770
- order: 30
809
+ order: 30,
810
+ group: ContextActions.groups.low
771
811
  });
772
812
  actions.push({
773
813
  title: 'greater than or equal to',
774
814
  description: "Show only rows where ".concat(column.name, " is greater than or equal to ").concat(valueText),
775
815
  action: () => {
776
- this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().greaterThanOrEqualTo(filterValue), additive), IrisGridContextMenuHandler.getQuickFilterText(filterText, ">=".concat(valueText), additive));
816
+ this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().greaterThanOrEqualTo(filterValue), operator), IrisGridContextMenuHandler.getQuickFilterText(filterText, ">=".concat(valueText), operator));
777
817
  },
778
- order: 40
818
+ order: 40,
819
+ group: ContextActions.groups.low
779
820
  });
780
821
  actions.push({
781
822
  title: 'less than',
782
823
  description: "Show only rows where ".concat(column.name, " is less than ").concat(valueText),
783
824
  action: () => {
784
- this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().lessThan(filterValue), additive), IrisGridContextMenuHandler.getQuickFilterText(filterText, "<".concat(valueText), additive));
825
+ this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().lessThan(filterValue), operator), IrisGridContextMenuHandler.getQuickFilterText(filterText, "<".concat(valueText), operator));
785
826
  },
786
- order: 50
827
+ order: 50,
828
+ group: ContextActions.groups.low
787
829
  });
788
830
  actions.push({
789
831
  title: 'less than or equal to',
790
832
  description: "Show only rows where ".concat(column.name, " is less than or equal to ").concat(valueText),
791
833
  action: () => {
792
- this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().lessThanOrEqualTo(filterValue), additive), IrisGridContextMenuHandler.getQuickFilterText(filterText, "<=".concat(valueText), additive));
834
+ this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().lessThanOrEqualTo(filterValue), operator), IrisGridContextMenuHandler.getQuickFilterText(filterText, "<=".concat(valueText), operator));
793
835
  },
794
- order: 60
836
+ order: 60,
837
+ group: ContextActions.groups.low
795
838
  });
796
839
  }
797
840
 
798
841
  return actions;
799
842
  }
800
843
 
801
- booleanFilterActions(column, valueText, quickFilter) {
802
- var additive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
844
+ booleanFilterActions(column, valueText, quickFilter, operator) {
803
845
  var actions = [];
804
-
805
- if (quickFilter == null) {
806
- return actions;
807
- }
808
-
809
- var {
810
- filter,
811
- text: filterText
812
- } = quickFilter;
813
846
  var {
814
847
  model
815
848
  } = this.irisGrid.props;
849
+ var {
850
+ filter,
851
+ text: filterText
852
+ } = quickFilter || {};
816
853
  var columnIndex = model.getColumnIndexByName(column.name);
817
854
  assertNotNull(columnIndex);
818
855
  actions.push({
819
856
  menuElement: /*#__PURE__*/React.createElement("div", {
820
857
  className: "iris-grid-filter-menu-item-value"
821
- }, additive ? 'AND ' : '', "\"", valueText, "\""),
822
- order: 1
858
+ }, operator ? IrisGridContextMenuHandler.getOperatorAsText(operator) : '', ' ', "\"", valueText || 'null', "\""),
859
+ order: 1,
860
+ group: ContextActions.groups.high
823
861
  });
824
862
  actions.push({
825
863
  title: 'true',
826
864
  description: "Show only rows where ".concat(column.name, " is true"),
827
865
  action: () => {
828
- this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().isTrue(), additive), IrisGridContextMenuHandler.getQuickFilterText(filterText, 'true', additive));
866
+ this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().isTrue(), operator), IrisGridContextMenuHandler.getQuickFilterText(filterText, 'true', operator));
829
867
  },
830
- order: 10
868
+ order: 10,
869
+ group: ContextActions.groups.low
831
870
  });
832
871
  actions.push({
833
872
  title: 'false',
834
873
  description: "Show only rows where ".concat(column.name, " is false"),
835
874
  action: () => {
836
- this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().isFalse(), additive), IrisGridContextMenuHandler.getQuickFilterText(filterText, 'false', additive));
875
+ this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().isFalse(), operator), IrisGridContextMenuHandler.getQuickFilterText(filterText, 'false', operator));
837
876
  },
838
- order: 20
877
+ order: 20,
878
+ group: ContextActions.groups.low
839
879
  });
840
880
  actions.push({
841
- title: 'null',
881
+ title: 'is null',
842
882
  description: "Show only rows where ".concat(column.name, " is null"),
843
883
  action: () => {
844
- this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().isNull(), additive), IrisGridContextMenuHandler.getQuickFilterText(filterText, 'null', additive));
884
+ this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().isNull(), operator), IrisGridContextMenuHandler.getQuickFilterText(filterText, 'null', operator));
845
885
  },
846
- order: 30
886
+ order: 30,
887
+ group: ContextActions.groups.low
888
+ });
889
+ actions.push({
890
+ title: 'is not null',
891
+ description: "Show only rows where ".concat(column.name, " is not null"),
892
+ action: () => {
893
+ this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().isNull().not(), operator), IrisGridContextMenuHandler.getQuickFilterText(filterText, '!null', operator));
894
+ },
895
+ order: 40,
896
+ group: ContextActions.groups.low
847
897
  });
848
898
  return actions;
849
899
  }
850
900
 
851
- dateFilterActions(column, valueText, previewValue, value, quickFilter) {
852
- var additive = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
901
+ dateFilterActions(column, valueText, previewValue, value, quickFilter, operator) {
853
902
  var filterValue = dh.FilterValue.ofNumber(value);
854
903
  var filter = null;
855
904
  var filterText = null;
@@ -868,62 +917,68 @@ class IrisGridContextMenuHandler extends GridMouseHandler {
868
917
  actions.push({
869
918
  menuElement: /*#__PURE__*/React.createElement("div", {
870
919
  className: "iris-grid-filter-menu-item-value"
871
- }, additive ? ' AND ' : '', "\"", previewValue, "\""),
872
- order: 1
920
+ }, operator ? IrisGridContextMenuHandler.getOperatorAsText(operator) : '', ' ', "\"", previewValue, "\""),
921
+ order: 1,
922
+ group: ContextActions.groups.high
873
923
  });
874
924
  actions.push({
875
925
  title: 'date is',
876
926
  description: "Show only rows where ".concat(column.name, " is ").concat(previewValue),
877
927
  action: () => {
878
- this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().eq(filterValue), additive), IrisGridContextMenuHandler.getQuickFilterText(filterText, "=".concat(valueText), additive));
928
+ this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().eq(filterValue), operator), IrisGridContextMenuHandler.getQuickFilterText(filterText, "=".concat(valueText), operator));
879
929
  },
880
- order: 10
930
+ order: 10,
931
+ group: ContextActions.groups.low
881
932
  });
882
933
  actions.push({
883
934
  title: 'date is not',
884
935
  description: "Show only rows where ".concat(column.name, " is not ").concat(previewValue),
885
936
  action: () => {
886
- this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().notEq(filterValue), additive), IrisGridContextMenuHandler.getQuickFilterText(filterText, "!=".concat(valueText), additive));
937
+ this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().notEq(filterValue), operator), IrisGridContextMenuHandler.getQuickFilterText(filterText, "!=".concat(valueText), operator));
887
938
  },
888
- order: 20
939
+ order: 20,
940
+ group: ContextActions.groups.low
889
941
  });
890
942
  actions.push({
891
943
  title: 'date is before',
892
944
  description: "Show only rows where ".concat(column.name, " is before ").concat(previewValue),
893
945
  action: () => {
894
- this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().lessThan(filterValue), additive), IrisGridContextMenuHandler.getQuickFilterText(filterText, "<".concat(valueText), additive));
946
+ this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().lessThan(filterValue), operator), IrisGridContextMenuHandler.getQuickFilterText(filterText, "<".concat(valueText), operator));
895
947
  },
896
- order: 30
948
+ order: 30,
949
+ group: ContextActions.groups.low
897
950
  });
898
951
  actions.push({
899
952
  title: 'date is before or equal',
900
953
  description: "Show only rows where ".concat(column.name, " is before or equal to ").concat(previewValue),
901
954
  action: () => {
902
- this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().lessThanOrEqualTo(filterValue), additive), IrisGridContextMenuHandler.getQuickFilterText(filterText, "<=".concat(valueText), additive));
955
+ this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().lessThanOrEqualTo(filterValue), operator), IrisGridContextMenuHandler.getQuickFilterText(filterText, "<=".concat(valueText), operator));
903
956
  },
904
- order: 40
957
+ order: 40,
958
+ group: ContextActions.groups.low
905
959
  });
906
960
  actions.push({
907
961
  title: 'date is after',
908
962
  description: "Show only rows where ".concat(column.name, " is greater than ").concat(previewValue),
909
963
  action: () => {
910
- this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().greaterThan(filterValue), additive), IrisGridContextMenuHandler.getQuickFilterText(filterText, ">".concat(valueText), additive));
964
+ this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().greaterThan(filterValue), operator), IrisGridContextMenuHandler.getQuickFilterText(filterText, ">".concat(valueText), operator));
911
965
  },
912
- order: 50
966
+ order: 50,
967
+ group: ContextActions.groups.low
913
968
  });
914
969
  actions.push({
915
970
  title: 'date is after or equal',
916
971
  description: "Show only rows where ".concat(column.name, " is after or equal to ").concat(previewValue),
917
972
  action: () => {
918
- this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().greaterThanOrEqualTo(filterValue), additive), IrisGridContextMenuHandler.getQuickFilterText(filterText, ">=".concat(valueText), additive));
973
+ this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().greaterThanOrEqualTo(filterValue), operator), IrisGridContextMenuHandler.getQuickFilterText(filterText, ">=".concat(valueText), operator));
919
974
  },
920
- order: 60
975
+ order: 60,
976
+ group: ContextActions.groups.low
921
977
  });
922
978
  return actions;
923
979
  }
924
980
 
925
- nullFilterActions(column, quickFilter) {
926
- var additive = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
981
+ nullFilterActions(column, quickFilter, operator) {
927
982
  var filter = null;
928
983
  var filterText = null;
929
984
 
@@ -941,24 +996,27 @@ class IrisGridContextMenuHandler extends GridMouseHandler {
941
996
  actions.push({
942
997
  menuElement: /*#__PURE__*/React.createElement("div", {
943
998
  className: "iris-grid-filter-menu-item-value"
944
- }, additive ? ' AND ' : '', "\"null\""),
945
- order: 1
999
+ }, operator ? IrisGridContextMenuHandler.getOperatorAsText(operator) : '', ' ', "\"null\""),
1000
+ order: 1,
1001
+ group: ContextActions.groups.high
946
1002
  });
947
1003
  actions.push({
948
- title: 'equals null',
1004
+ title: 'is null',
949
1005
  description: "Show only rows where ".concat(column.name, " is null"),
950
1006
  action: () => {
951
- this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().isNull(), additive), IrisGridContextMenuHandler.getQuickFilterText(filterText, 'null', additive));
1007
+ this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().isNull(), operator), IrisGridContextMenuHandler.getQuickFilterText(filterText, 'null', operator));
952
1008
  },
953
- order: 10
1009
+ order: 10,
1010
+ group: ContextActions.groups.low
954
1011
  });
955
1012
  actions.push({
956
- title: 'not equals null',
1013
+ title: 'is not null',
957
1014
  description: "Show only rows where ".concat(column.name, " is not null"),
958
1015
  action: () => {
959
- this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().isNull().not(), additive), IrisGridContextMenuHandler.getQuickFilterText(filterText, '!null', additive));
1016
+ this.irisGrid.setQuickFilter(columnIndex, IrisGridContextMenuHandler.getQuickFilterCondition(filter, column.filter().isNull().not(), operator), IrisGridContextMenuHandler.getQuickFilterText(filterText, '!null', operator));
960
1017
  },
961
- order: 20
1018
+ order: 20,
1019
+ group: ContextActions.groups.low
962
1020
  });
963
1021
  return actions;
964
1022
  }