@finos/legend-query-builder 4.14.71 → 4.14.73

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/lib/components/QueryLoader.d.ts.map +1 -1
  2. package/lib/components/QueryLoader.js +12 -34
  3. package/lib/components/QueryLoader.js.map +1 -1
  4. package/lib/components/explorer/QueryBuilderPropertySearchPanel.d.ts.map +1 -1
  5. package/lib/components/explorer/QueryBuilderPropertySearchPanel.js +108 -36
  6. package/lib/components/explorer/QueryBuilderPropertySearchPanel.js.map +1 -1
  7. package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.d.ts.map +1 -1
  8. package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.js +10 -3
  9. package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.js.map +1 -1
  10. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.d.ts.map +1 -1
  11. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js +2 -2
  12. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js.map +1 -1
  13. package/lib/components/fetch-structure/QueryBuilderTDSPanel.d.ts.map +1 -1
  14. package/lib/components/fetch-structure/QueryBuilderTDSPanel.js +6 -2
  15. package/lib/components/fetch-structure/QueryBuilderTDSPanel.js.map +1 -1
  16. package/lib/components/filter/QueryBuilderFilterPanel.d.ts.map +1 -1
  17. package/lib/components/filter/QueryBuilderFilterPanel.js +5 -1
  18. package/lib/components/filter/QueryBuilderFilterPanel.js.map +1 -1
  19. package/lib/components/result/QueryBuilderResultPanel.d.ts.map +1 -1
  20. package/lib/components/result/QueryBuilderResultPanel.js +3 -1
  21. package/lib/components/result/QueryBuilderResultPanel.js.map +1 -1
  22. package/lib/components/result/tds/QueryBuilderTDSGridResult.d.ts.map +1 -1
  23. package/lib/components/result/tds/QueryBuilderTDSGridResult.js +5 -2
  24. package/lib/components/result/tds/QueryBuilderTDSGridResult.js.map +1 -1
  25. package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.d.ts +3 -0
  26. package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.d.ts.map +1 -1
  27. package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.js +92 -2
  28. package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.js.map +1 -1
  29. package/lib/index.css +1 -17
  30. package/lib/index.css.map +1 -1
  31. package/lib/package.json +1 -1
  32. package/lib/stores/QueryBuilderConfig.d.ts +2 -1
  33. package/lib/stores/QueryBuilderConfig.d.ts.map +1 -1
  34. package/lib/stores/QueryBuilderConfig.js +2 -1
  35. package/lib/stores/QueryBuilderConfig.js.map +1 -1
  36. package/lib/stores/QueryBuilderResultState.d.ts.map +1 -1
  37. package/lib/stores/QueryBuilderResultState.js +4 -1
  38. package/lib/stores/QueryBuilderResultState.js.map +1 -1
  39. package/lib/stores/QueryBuilderValueSpecificationHelper.d.ts +1 -1
  40. package/lib/stores/QueryBuilderValueSpecificationHelper.d.ts.map +1 -1
  41. package/lib/stores/QueryBuilderValueSpecificationHelper.js +1 -0
  42. package/lib/stores/QueryBuilderValueSpecificationHelper.js.map +1 -1
  43. package/lib/stores/QueryLoaderState.d.ts +8 -6
  44. package/lib/stores/QueryLoaderState.d.ts.map +1 -1
  45. package/lib/stores/QueryLoaderState.js +30 -7
  46. package/lib/stores/QueryLoaderState.js.map +1 -1
  47. package/lib/stores/explorer/QueryBuilderExplorerState.d.ts +4 -3
  48. package/lib/stores/explorer/QueryBuilderExplorerState.d.ts.map +1 -1
  49. package/lib/stores/explorer/QueryBuilderExplorerState.js +22 -7
  50. package/lib/stores/explorer/QueryBuilderExplorerState.js.map +1 -1
  51. package/lib/stores/explorer/QueryBuilderFuzzySearchAdvancedConfigState.d.ts.map +1 -1
  52. package/lib/stores/explorer/QueryBuilderFuzzySearchAdvancedConfigState.js +1 -1
  53. package/lib/stores/explorer/QueryBuilderFuzzySearchAdvancedConfigState.js.map +1 -1
  54. package/lib/stores/explorer/QueryBuilderPropertySearchState.d.ts +7 -1
  55. package/lib/stores/explorer/QueryBuilderPropertySearchState.d.ts.map +1 -1
  56. package/lib/stores/explorer/QueryBuilderPropertySearchState.js +160 -74
  57. package/lib/stores/explorer/QueryBuilderPropertySearchState.js.map +1 -1
  58. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.d.ts +4 -1
  59. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.d.ts.map +1 -1
  60. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.js +23 -12
  61. package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.js.map +1 -1
  62. package/lib/stores/filter/QueryBuilderFilterState.d.ts +1 -1
  63. package/lib/stores/filter/QueryBuilderFilterState.d.ts.map +1 -1
  64. package/lib/stores/filter/QueryBuilderFilterState.js +9 -5
  65. package/lib/stores/filter/QueryBuilderFilterState.js.map +1 -1
  66. package/package.json +3 -3
  67. package/src/components/QueryLoader.tsx +37 -54
  68. package/src/components/explorer/QueryBuilderPropertySearchPanel.tsx +249 -226
  69. package/src/components/fetch-structure/QueryBuilderPostFilterPanel.tsx +24 -2
  70. package/src/components/fetch-structure/QueryBuilderResultModifierPanel.tsx +6 -2
  71. package/src/components/fetch-structure/QueryBuilderTDSPanel.tsx +10 -2
  72. package/src/components/filter/QueryBuilderFilterPanel.tsx +10 -1
  73. package/src/components/result/QueryBuilderResultPanel.tsx +3 -1
  74. package/src/components/result/tds/QueryBuilderTDSGridResult.tsx +8 -2
  75. package/src/components/result/tds/QueryBuilderTDSSimpleGridResult.tsx +106 -1
  76. package/src/stores/QueryBuilderConfig.ts +2 -1
  77. package/src/stores/QueryBuilderResultState.ts +4 -0
  78. package/src/stores/QueryBuilderValueSpecificationHelper.ts +2 -1
  79. package/src/stores/QueryLoaderState.ts +43 -17
  80. package/src/stores/explorer/QueryBuilderExplorerState.ts +58 -5
  81. package/src/stores/explorer/QueryBuilderFuzzySearchAdvancedConfigState.ts +1 -1
  82. package/src/stores/explorer/QueryBuilderPropertySearchState.ts +194 -92
  83. package/src/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.ts +43 -13
  84. package/src/stores/filter/QueryBuilderFilterState.ts +16 -7
@@ -14,6 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
+ import { useState } from 'react';
17
18
  import {
18
19
  clsx,
19
20
  CheckSquareIcon,
@@ -257,6 +258,7 @@ const QueryBuilderTreeNodeViewer = observer(
257
258
  node instanceof QueryBuilderExplorerTreePropertyNodeData
258
259
  ? { node }
259
260
  : {},
261
+ canDrag: () => !(node.type instanceof Class),
260
262
  collect: (monitor) => ({
261
263
  isDragging: monitor.isDragging(),
262
264
  }),
@@ -312,9 +314,11 @@ const QueryBuilderTreeNodeViewer = observer(
312
314
  );
313
315
 
314
316
  const propertyName =
315
- parentNode instanceof QueryBuilderExplorerTreeSubTypeNodeData
316
- ? prettyPropertyNameForSubType(node.id, true)
317
- : prettyPropertyNameFromNodeId(node.id, true);
317
+ parentNode?.type instanceof Class && level > 1
318
+ ? prettyCONSTName(node.label)
319
+ : parentNode instanceof QueryBuilderExplorerTreeSubTypeNodeData
320
+ ? prettyPropertyNameForSubType(node.id, true)
321
+ : prettyPropertyNameFromNodeId(node.id, true);
318
322
 
319
323
  const nodeExpandIcon = isExpandable ? (
320
324
  node.isOpen ? (
@@ -345,6 +349,8 @@ const QueryBuilderTreeNodeViewer = observer(
345
349
  )
346
350
  : null;
347
351
 
352
+ const isMultiple = propertySearchState.isNodeMultiple(node);
353
+
348
354
  return (
349
355
  <>
350
356
  <div
@@ -377,6 +383,14 @@ const QueryBuilderTreeNodeViewer = observer(
377
383
  QUERY_BUILDER_PROPERTY_SEARCH_LABEL_TEXT_CLASS,
378
384
  node.id,
379
385
  )}
386
+ {isMultiple && (
387
+ <div
388
+ className="query-builder-explorer-tree__node__label__multiple"
389
+ title="Multiple values of this property can cause row explosion"
390
+ >
391
+ *
392
+ </div>
393
+ )}
380
394
  </div>
381
395
  <div className="tree-view__node__label query-builder-property-search-panel__node__doc">
382
396
  {formattedDocText}
@@ -434,21 +448,119 @@ const QueryBuilderTreeNodeViewer = observer(
434
448
  </div>
435
449
  </div>
436
450
  {node.isOpen &&
437
- getChildrenNodes().map((childNode) => (
438
- <QueryBuilderTreeNodeViewer
439
- key={`${node.id}>${childNode.id}`}
440
- node={childNode}
441
- queryBuilderState={queryBuilderState}
442
- level={level + 1}
443
- stepPaddingInRem={2}
444
- explorerState={queryBuilderState.explorerState}
445
- />
446
- ))}
451
+ getChildrenNodes()
452
+ .filter((childNode) =>
453
+ propertySearchState.isNodeIncludedInFilter(childNode),
454
+ )
455
+ .sort((nodeA, nodeB) => nodeA.label.localeCompare(nodeB.label))
456
+ .map((childNode) => (
457
+ <QueryBuilderTreeNodeViewer
458
+ key={`${node.id}>${childNode.id}`}
459
+ node={childNode}
460
+ queryBuilderState={queryBuilderState}
461
+ level={level + 1}
462
+ stepPaddingInRem={2}
463
+ explorerState={queryBuilderState.explorerState}
464
+ />
465
+ ))}
447
466
  </>
448
467
  );
449
468
  },
450
469
  );
451
470
 
471
+ const QueryBuilderSearchConfigToggleButton = observer(
472
+ (props: {
473
+ label: string;
474
+ enabled: boolean;
475
+ onClick: () => void;
476
+ showOnlyButton?: boolean;
477
+ onOnlyButtonClick?: (() => void) | undefined;
478
+ }) => {
479
+ const { label, enabled, onClick, showOnlyButton, onOnlyButtonClick } =
480
+ props;
481
+
482
+ const [isMouseOver, setIsMouseOver] = useState(false);
483
+
484
+ return (
485
+ <div
486
+ className="query-builder-property-search-panel__form__section__toggler__btn__container"
487
+ onMouseEnter={() => setIsMouseOver(true)}
488
+ onMouseLeave={() => setIsMouseOver(false)}
489
+ >
490
+ <button
491
+ className={clsx(
492
+ 'query-builder-property-search-panel__form__section__toggler__btn',
493
+ {
494
+ 'query-builder-property-search-panel__form__section__toggler__btn--toggled':
495
+ enabled,
496
+ },
497
+ )}
498
+ onClick={onClick}
499
+ tabIndex={-1}
500
+ >
501
+ {enabled ? <CheckSquareIcon /> : <SquareIcon />}
502
+ <div className="query-builder-property-search-panel__form__section__toggler__prompt">
503
+ {label}
504
+ </div>
505
+ </button>
506
+ {showOnlyButton && isMouseOver && (
507
+ <button
508
+ className="query-builder-property-search-panel__form__section__toggler__only-btn"
509
+ onClick={onOnlyButtonClick}
510
+ >
511
+ only
512
+ </button>
513
+ )}
514
+ </div>
515
+ );
516
+ },
517
+ );
518
+
519
+ const QueryBuilderSearchConfigToggleButtonGroup = observer(
520
+ (props: {
521
+ header: string;
522
+ headerTooltipText?: string;
523
+ buttons: {
524
+ label: string;
525
+ enabled: boolean;
526
+ onClick: () => void;
527
+ onOnlyButtonClick?: () => void;
528
+ }[];
529
+ }) => {
530
+ const { header, headerTooltipText, buttons } = props;
531
+
532
+ return (
533
+ <div className="query-builder-property-search-panel__form__section">
534
+ <div className="query-builder-property-search-panel__form__section__header__label">
535
+ {header}
536
+ {headerTooltipText && (
537
+ <Tooltip
538
+ TransitionProps={{
539
+ timeout: 0,
540
+ }}
541
+ title={<div>{headerTooltipText}</div>}
542
+ >
543
+ <div className="query-builder-property-search-panel__tagged-values__tooltip">
544
+ <InfoCircleIcon />
545
+ </div>
546
+ </Tooltip>
547
+ )}
548
+ </div>
549
+ {buttons.map(({ label, enabled, onClick, onOnlyButtonClick }) => (
550
+ <QueryBuilderSearchConfigToggleButton
551
+ key={label}
552
+ label={label}
553
+ enabled={enabled}
554
+ onClick={onClick}
555
+ showOnlyButton={buttons.length > 1}
556
+ onOnlyButtonClick={onOnlyButtonClick}
557
+ />
558
+ ))}
559
+ </div>
560
+ );
561
+ },
562
+ );
563
+
452
564
  export const QueryBuilderPropertySearchPanel = observer(
453
565
  (props: {
454
566
  queryBuilderState: QueryBuilderState;
@@ -568,234 +680,145 @@ export const QueryBuilderPropertySearchPanel = observer(
568
680
  />
569
681
  </div>
570
682
  </div>
571
- <div className="query-builder-property-search-panel__form__section">
572
- <div className="query-builder-property-search-panel__form__section__header__label">
573
- Documentation
574
- <Tooltip
575
- TransitionProps={{
576
- timeout: 0,
577
- }}
578
- title={
579
- <div>
580
- Include &quot;doc&quot; type tagged values in
581
- search results
582
- </div>
583
- }
584
- >
585
- <div className="query-builder-property-search-panel__tagged-values__tooltip">
586
- <InfoCircleIcon />
587
- </div>
588
- </Tooltip>
589
- </div>
590
- <div className="query-builder-property-search-panel__filter__element">
591
- <button
592
- className={clsx(
593
- 'query-builder-property-search-panel__form__section__toggler__btn',
594
- {
595
- 'query-builder-property-search-panel__form__section__toggler__btn--toggled':
596
- propertySearchState.searchConfigurationState
597
- .includeDocumentation,
598
- },
599
- )}
600
- onClick={handleToggleIncludeDocumentation}
601
- tabIndex={-1}
602
- >
603
- {propertySearchState.searchConfigurationState
604
- .includeDocumentation ? (
605
- <CheckSquareIcon />
606
- ) : (
607
- <SquareIcon />
608
- )}
609
- </button>
610
- <div className="query-builder-property-search-panel__form__section__toggler__prompt">
611
- Include
612
- </div>
613
- </div>
614
- </div>
615
- <div className="query-builder-property-search-panel__form__section">
616
- <div className="query-builder-property-search-panel__form__section__header__label">
617
- Sub-types
618
- </div>
619
- <div className="query-builder-property-search-panel__filter__element">
620
- <button
621
- className={clsx(
622
- 'query-builder-property-search-panel__form__section__toggler__btn',
623
- {
624
- 'query-builder-property-search-panel__form__section__toggler__btn--toggled':
625
- propertySearchState.searchConfigurationState
626
- .includeSubTypes,
627
- },
628
- )}
629
- onClick={handleToggleIncludeSubTypes}
630
- tabIndex={-1}
631
- >
632
- {propertySearchState.searchConfigurationState
633
- .includeSubTypes ? (
634
- <CheckSquareIcon />
635
- ) : (
636
- <SquareIcon />
637
- )}
638
- </button>
639
- <div className="query-builder-property-search-panel__form__section__toggler__prompt">
640
- Include
641
- </div>
642
- </div>
643
- </div>
644
- <div className="query-builder-property-search-panel__form__section">
645
- <div className="query-builder-property-search-panel__form__section__header__label">
646
- By type
647
- </div>
648
- <div className="query-builder-property-search-panel__filter__element">
649
- <button
650
- className={clsx(
651
- 'query-builder-property-search-panel__form__section__toggler__btn',
652
- {
653
- 'query-builder-property-search-panel__form__section__toggler__btn--toggled':
654
- propertySearchState.typeFilters.includes(
655
- QUERY_BUILDER_PROPERTY_SEARCH_TYPE.CLASS,
656
- ),
657
- },
658
- )}
659
- onClick={(): void => {
683
+ <QueryBuilderSearchConfigToggleButtonGroup
684
+ header="One-Many rows"
685
+ buttons={[
686
+ {
687
+ label: 'Include',
688
+ enabled: propertySearchState.includeOneMany,
689
+ onClick: () =>
690
+ propertySearchState.setIncludeOneMany(
691
+ !propertySearchState.includeOneMany,
692
+ ),
693
+ },
694
+ ]}
695
+ />
696
+ <QueryBuilderSearchConfigToggleButtonGroup
697
+ header="Documentation"
698
+ headerTooltipText={`Include "doc" type tagged values in search results`}
699
+ buttons={[
700
+ {
701
+ label: 'Include',
702
+ enabled:
703
+ propertySearchState.searchConfigurationState
704
+ .includeDocumentation,
705
+ onClick: handleToggleIncludeDocumentation,
706
+ },
707
+ ]}
708
+ />
709
+ <QueryBuilderSearchConfigToggleButtonGroup
710
+ header="Sub-types"
711
+ buttons={[
712
+ {
713
+ label: 'Include',
714
+ enabled:
715
+ propertySearchState.searchConfigurationState
716
+ .includeSubTypes,
717
+ onClick: handleToggleIncludeSubTypes,
718
+ },
719
+ ]}
720
+ />
721
+ <QueryBuilderSearchConfigToggleButtonGroup
722
+ header="By type"
723
+ buttons={[
724
+ {
725
+ label: 'Class',
726
+ enabled: propertySearchState.typeFilters.includes(
727
+ QUERY_BUILDER_PROPERTY_SEARCH_TYPE.CLASS,
728
+ ),
729
+ onClick: () => {
660
730
  propertySearchState.toggleFilterForType(
661
731
  QUERY_BUILDER_PROPERTY_SEARCH_TYPE.CLASS,
662
732
  );
663
- }}
664
- tabIndex={-1}
665
- >
666
- {propertySearchState.typeFilters.includes(
667
- QUERY_BUILDER_PROPERTY_SEARCH_TYPE.CLASS,
668
- ) ? (
669
- <CheckSquareIcon />
670
- ) : (
671
- <SquareIcon />
672
- )}
673
- </button>
674
- <div className="query-builder-property-search-panel__form__section__toggler__prompt">
675
- Class
676
- </div>
677
- </div>
678
- <div className="query-builder-property-search-panel__filter__element">
679
- <button
680
- className={clsx(
681
- 'query-builder-property-search-panel__form__section__toggler__btn',
682
- {
683
- 'query-builder-property-search-panel__form__section__toggler__btn--toggled':
684
- propertySearchState.typeFilters.includes(
685
- QUERY_BUILDER_PROPERTY_SEARCH_TYPE.STRING,
686
- ),
687
- },
688
- )}
689
- onClick={(): void => {
733
+ },
734
+ onOnlyButtonClick: () => {
735
+ propertySearchState.setFilterOnlyType(
736
+ QUERY_BUILDER_PROPERTY_SEARCH_TYPE.CLASS,
737
+ );
738
+ },
739
+ },
740
+ {
741
+ label: 'Enumeration',
742
+ enabled: propertySearchState.typeFilters.includes(
743
+ QUERY_BUILDER_PROPERTY_SEARCH_TYPE.ENUMERATION,
744
+ ),
745
+ onClick: () => {
690
746
  propertySearchState.toggleFilterForType(
691
- QUERY_BUILDER_PROPERTY_SEARCH_TYPE.STRING,
747
+ QUERY_BUILDER_PROPERTY_SEARCH_TYPE.ENUMERATION,
748
+ );
749
+ },
750
+ onOnlyButtonClick: () => {
751
+ propertySearchState.setFilterOnlyType(
752
+ QUERY_BUILDER_PROPERTY_SEARCH_TYPE.ENUMERATION,
692
753
  );
693
- }}
694
- tabIndex={-1}
695
- >
696
- {propertySearchState.typeFilters.includes(
754
+ },
755
+ },
756
+ {
757
+ label: 'String',
758
+ enabled: propertySearchState.typeFilters.includes(
697
759
  QUERY_BUILDER_PROPERTY_SEARCH_TYPE.STRING,
698
- ) ? (
699
- <CheckSquareIcon />
700
- ) : (
701
- <SquareIcon />
702
- )}
703
- </button>
704
- <div className="query-builder-property-search-panel__form__section__toggler__prompt">
705
- String
706
- </div>
707
- </div>
708
- <div className="query-builder-property-search-panel__filter__element">
709
- <button
710
- className={clsx(
711
- 'query-builder-property-search-panel__form__section__toggler__btn',
712
- {
713
- 'query-builder-property-search-panel__form__section__toggler__btn--toggled':
714
- propertySearchState.typeFilters.includes(
715
- QUERY_BUILDER_PROPERTY_SEARCH_TYPE.BOOLEAN,
716
- ),
717
- },
718
- )}
719
- onClick={(): void => {
760
+ ),
761
+ onClick: () => {
720
762
  propertySearchState.toggleFilterForType(
721
- QUERY_BUILDER_PROPERTY_SEARCH_TYPE.BOOLEAN,
763
+ QUERY_BUILDER_PROPERTY_SEARCH_TYPE.STRING,
764
+ );
765
+ },
766
+ onOnlyButtonClick: () => {
767
+ propertySearchState.setFilterOnlyType(
768
+ QUERY_BUILDER_PROPERTY_SEARCH_TYPE.STRING,
722
769
  );
723
- }}
724
- tabIndex={-1}
725
- >
726
- {propertySearchState.typeFilters.includes(
770
+ },
771
+ },
772
+ {
773
+ label: 'Boolean',
774
+ enabled: propertySearchState.typeFilters.includes(
727
775
  QUERY_BUILDER_PROPERTY_SEARCH_TYPE.BOOLEAN,
728
- ) ? (
729
- <CheckSquareIcon />
730
- ) : (
731
- <SquareIcon />
732
- )}
733
- </button>
734
- <div className="query-builder-property-search-panel__form__section__toggler__prompt">
735
- Boolean
736
- </div>
737
- </div>
738
- <div className="query-builder-property-search-panel__filter__element">
739
- <button
740
- className={clsx(
741
- 'query-builder-property-search-panel__form__section__toggler__btn',
742
- {
743
- 'query-builder-property-search-panel__form__section__toggler__btn--toggled':
744
- propertySearchState.typeFilters.includes(
745
- QUERY_BUILDER_PROPERTY_SEARCH_TYPE.NUMBER,
746
- ),
747
- },
748
- )}
749
- onClick={(): void => {
776
+ ),
777
+ onClick: () => {
750
778
  propertySearchState.toggleFilterForType(
751
- QUERY_BUILDER_PROPERTY_SEARCH_TYPE.NUMBER,
779
+ QUERY_BUILDER_PROPERTY_SEARCH_TYPE.BOOLEAN,
752
780
  );
753
- }}
754
- tabIndex={-1}
755
- >
756
- {propertySearchState.typeFilters.includes(
781
+ },
782
+ onOnlyButtonClick: () => {
783
+ propertySearchState.setFilterOnlyType(
784
+ QUERY_BUILDER_PROPERTY_SEARCH_TYPE.BOOLEAN,
785
+ );
786
+ },
787
+ },
788
+ {
789
+ label: 'Number',
790
+ enabled: propertySearchState.typeFilters.includes(
757
791
  QUERY_BUILDER_PROPERTY_SEARCH_TYPE.NUMBER,
758
- ) ? (
759
- <CheckSquareIcon />
760
- ) : (
761
- <SquareIcon />
762
- )}
763
- </button>
764
- <div className="query-builder-property-search-panel__form__section__toggler__prompt">
765
- Number
766
- </div>
767
- </div>
768
- <div className="query-builder-property-search-panel__filter__element">
769
- <button
770
- className={clsx(
771
- 'query-builder-property-search-panel__form__section__toggler__btn',
772
- {
773
- 'query-builder-property-search-panel__form__section__toggler__btn--toggled':
774
- propertySearchState.typeFilters.includes(
775
- QUERY_BUILDER_PROPERTY_SEARCH_TYPE.DATE,
776
- ),
777
- },
778
- )}
779
- onClick={(): void => {
792
+ ),
793
+ onClick: () => {
780
794
  propertySearchState.toggleFilterForType(
781
- QUERY_BUILDER_PROPERTY_SEARCH_TYPE.DATE,
795
+ QUERY_BUILDER_PROPERTY_SEARCH_TYPE.NUMBER,
796
+ );
797
+ },
798
+ onOnlyButtonClick: () => {
799
+ propertySearchState.setFilterOnlyType(
800
+ QUERY_BUILDER_PROPERTY_SEARCH_TYPE.NUMBER,
782
801
  );
783
- }}
784
- tabIndex={-1}
785
- >
786
- {propertySearchState.typeFilters.includes(
802
+ },
803
+ },
804
+ {
805
+ label: 'Date',
806
+ enabled: propertySearchState.typeFilters.includes(
787
807
  QUERY_BUILDER_PROPERTY_SEARCH_TYPE.DATE,
788
- ) ? (
789
- <CheckSquareIcon />
790
- ) : (
791
- <SquareIcon />
792
- )}
793
- </button>
794
- <div className="query-builder-property-search-panel__form__section__toggler__prompt">
795
- Date
796
- </div>
797
- </div>
798
- </div>
808
+ ),
809
+ onClick: () => {
810
+ propertySearchState.toggleFilterForType(
811
+ QUERY_BUILDER_PROPERTY_SEARCH_TYPE.DATE,
812
+ );
813
+ },
814
+ onOnlyButtonClick: () => {
815
+ propertySearchState.setFilterOnlyType(
816
+ QUERY_BUILDER_PROPERTY_SEARCH_TYPE.DATE,
817
+ );
818
+ },
819
+ },
820
+ ]}
821
+ />
799
822
  </div>
800
823
  </ResizablePanel>
801
824
  <ResizablePanelSplitter>
@@ -52,6 +52,7 @@ import {
52
52
  Class,
53
53
  Enumeration,
54
54
  PrimitiveType,
55
+ VariableExpression,
55
56
  } from '@finos/legend-graph';
56
57
  import {
57
58
  assertErrorThrown,
@@ -422,10 +423,21 @@ const QueryBuilderPostFilterConditionEditor = observer(
422
423
  rightConditionValue instanceof PostFilterValueSpecConditionValueState &&
423
424
  rightConditionValue.value
424
425
  ) {
426
+ const isInvalidVariable =
427
+ rightConditionValue.value instanceof VariableExpression &&
428
+ node.condition.postFilterState.isInvalidValueSpecPostFilterValue(
429
+ node,
430
+ );
425
431
  return (
426
432
  <div
427
433
  ref={dropConnector}
428
- className="query-builder-post-filter-tree__condition-node__value"
434
+ className={clsx(
435
+ 'query-builder-post-filter-tree__condition-node__value',
436
+ {
437
+ 'query-builder-post-filter-tree__condition-node__value--error':
438
+ isInvalidVariable,
439
+ },
440
+ )}
429
441
  >
430
442
  <PanelEntryDropZonePlaceholder
431
443
  isDragOver={isFilterValueDragOver}
@@ -456,10 +468,20 @@ const QueryBuilderPostFilterConditionEditor = observer(
456
468
  rightConditionValue instanceof
457
469
  PostFilterTDSColumnValueConditionValueState
458
470
  ) {
471
+ const isInvalidTDSColumn =
472
+ node.condition.postFilterState.isInvalidTDSColumnPostFilterValue(
473
+ node,
474
+ );
459
475
  return (
460
476
  <div
461
477
  ref={dropConnector}
462
- className="query-builder-post-filter-tree__condition-node__value"
478
+ className={clsx(
479
+ 'query-builder-post-filter-tree__condition-node__value',
480
+ {
481
+ 'query-builder-post-filter-tree__condition-node__value--error':
482
+ isInvalidTDSColumn,
483
+ },
484
+ )}
463
485
  >
464
486
  <PanelEntryDropZonePlaceholder
465
487
  isDragOver={isFilterValueDragOver}
@@ -746,7 +746,8 @@ export const QueryResultModifierModal = observer(
746
746
  classes={{
747
747
  root: 'editor-modal__root-container',
748
748
  container: 'editor-modal__container',
749
- paper: 'editor-modal__content',
749
+ paper:
750
+ 'editor-modal__content query-builder__projection__modal__content',
750
751
  }}
751
752
  data-testid={QUERY_BUILDER_TEST_ID.QUERY_BUILDER_RESULT_MODIFIER_PANEL}
752
753
  >
@@ -756,7 +757,10 @@ export const QueryResultModifierModal = observer(
756
757
  }
757
758
  className="editor-modal query-builder__projection__modal"
758
759
  >
759
- <ModalHeader title="Query Options" />
760
+ <ModalHeader
761
+ className="query-builder__projection__modal__header"
762
+ title="Query Options"
763
+ />
760
764
  <ModalBody className="query-builder__projection__modal__body">
761
765
  <div className="query-builder__projection__options">
762
766
  {tdsState.queryBuilderState.milestoningState
@@ -214,7 +214,8 @@ const QueryBuilderDerivationProjectionColumnEditor = observer(
214
214
  }) => {
215
215
  const { projectionColumnState } = props;
216
216
  const hasParserError = projectionColumnState.tdsState.hasParserError;
217
- const onEditorBlur = (): void => {
217
+
218
+ const onEditorBlur = useCallback((): void => {
218
219
  flowResult(
219
220
  projectionColumnState.fetchDerivationLambdaReturnType({
220
221
  forceConversionStringToLambda: true,
@@ -224,7 +225,8 @@ const QueryBuilderDerivationProjectionColumnEditor = observer(
224
225
  projectionColumnState.tdsState.queryBuilderState.applicationStore
225
226
  .alertUnhandledError,
226
227
  );
227
- };
228
+ }, [projectionColumnState]);
229
+
228
230
  const handleDrop = useCallback(
229
231
  (
230
232
  item: QueryBuilderDerivationProjectionColumnDropTarget,
@@ -256,6 +258,7 @@ const QueryBuilderDerivationProjectionColumnEditor = observer(
256
258
  },
257
259
  [projectionColumnState],
258
260
  );
261
+
259
262
  const [, dropConnector] =
260
263
  useDrop<QueryBuilderDerivationProjectionColumnDropTarget>(
261
264
  () => ({
@@ -269,6 +272,11 @@ const QueryBuilderDerivationProjectionColumnEditor = observer(
269
272
  [handleDrop],
270
273
  );
271
274
 
275
+ // Calculate derivation return type on mount
276
+ useEffect(() => {
277
+ onEditorBlur();
278
+ }, [onEditorBlur]);
279
+
272
280
  return (
273
281
  <div
274
282
  ref={dropConnector}