@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.
- package/lib/components/QueryLoader.d.ts.map +1 -1
- package/lib/components/QueryLoader.js +12 -34
- package/lib/components/QueryLoader.js.map +1 -1
- package/lib/components/explorer/QueryBuilderPropertySearchPanel.d.ts.map +1 -1
- package/lib/components/explorer/QueryBuilderPropertySearchPanel.js +108 -36
- package/lib/components/explorer/QueryBuilderPropertySearchPanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.js +10 -3
- package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js +2 -2
- package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.js +6 -2
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.js.map +1 -1
- package/lib/components/filter/QueryBuilderFilterPanel.d.ts.map +1 -1
- package/lib/components/filter/QueryBuilderFilterPanel.js +5 -1
- package/lib/components/filter/QueryBuilderFilterPanel.js.map +1 -1
- package/lib/components/result/QueryBuilderResultPanel.d.ts.map +1 -1
- package/lib/components/result/QueryBuilderResultPanel.js +3 -1
- package/lib/components/result/QueryBuilderResultPanel.js.map +1 -1
- package/lib/components/result/tds/QueryBuilderTDSGridResult.d.ts.map +1 -1
- package/lib/components/result/tds/QueryBuilderTDSGridResult.js +5 -2
- package/lib/components/result/tds/QueryBuilderTDSGridResult.js.map +1 -1
- package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.d.ts +3 -0
- package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.d.ts.map +1 -1
- package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.js +92 -2
- package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.js.map +1 -1
- package/lib/index.css +1 -17
- package/lib/index.css.map +1 -1
- package/lib/package.json +1 -1
- package/lib/stores/QueryBuilderConfig.d.ts +2 -1
- package/lib/stores/QueryBuilderConfig.d.ts.map +1 -1
- package/lib/stores/QueryBuilderConfig.js +2 -1
- package/lib/stores/QueryBuilderConfig.js.map +1 -1
- package/lib/stores/QueryBuilderResultState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderResultState.js +4 -1
- package/lib/stores/QueryBuilderResultState.js.map +1 -1
- package/lib/stores/QueryBuilderValueSpecificationHelper.d.ts +1 -1
- package/lib/stores/QueryBuilderValueSpecificationHelper.d.ts.map +1 -1
- package/lib/stores/QueryBuilderValueSpecificationHelper.js +1 -0
- package/lib/stores/QueryBuilderValueSpecificationHelper.js.map +1 -1
- package/lib/stores/QueryLoaderState.d.ts +8 -6
- package/lib/stores/QueryLoaderState.d.ts.map +1 -1
- package/lib/stores/QueryLoaderState.js +30 -7
- package/lib/stores/QueryLoaderState.js.map +1 -1
- package/lib/stores/explorer/QueryBuilderExplorerState.d.ts +4 -3
- package/lib/stores/explorer/QueryBuilderExplorerState.d.ts.map +1 -1
- package/lib/stores/explorer/QueryBuilderExplorerState.js +22 -7
- package/lib/stores/explorer/QueryBuilderExplorerState.js.map +1 -1
- package/lib/stores/explorer/QueryBuilderFuzzySearchAdvancedConfigState.d.ts.map +1 -1
- package/lib/stores/explorer/QueryBuilderFuzzySearchAdvancedConfigState.js +1 -1
- package/lib/stores/explorer/QueryBuilderFuzzySearchAdvancedConfigState.js.map +1 -1
- package/lib/stores/explorer/QueryBuilderPropertySearchState.d.ts +7 -1
- package/lib/stores/explorer/QueryBuilderPropertySearchState.d.ts.map +1 -1
- package/lib/stores/explorer/QueryBuilderPropertySearchState.js +160 -74
- package/lib/stores/explorer/QueryBuilderPropertySearchState.js.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.d.ts +4 -1
- package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.js +23 -12
- package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.js.map +1 -1
- package/lib/stores/filter/QueryBuilderFilterState.d.ts +1 -1
- package/lib/stores/filter/QueryBuilderFilterState.d.ts.map +1 -1
- package/lib/stores/filter/QueryBuilderFilterState.js +9 -5
- package/lib/stores/filter/QueryBuilderFilterState.js.map +1 -1
- package/package.json +3 -3
- package/src/components/QueryLoader.tsx +37 -54
- package/src/components/explorer/QueryBuilderPropertySearchPanel.tsx +249 -226
- package/src/components/fetch-structure/QueryBuilderPostFilterPanel.tsx +24 -2
- package/src/components/fetch-structure/QueryBuilderResultModifierPanel.tsx +6 -2
- package/src/components/fetch-structure/QueryBuilderTDSPanel.tsx +10 -2
- package/src/components/filter/QueryBuilderFilterPanel.tsx +10 -1
- package/src/components/result/QueryBuilderResultPanel.tsx +3 -1
- package/src/components/result/tds/QueryBuilderTDSGridResult.tsx +8 -2
- package/src/components/result/tds/QueryBuilderTDSSimpleGridResult.tsx +106 -1
- package/src/stores/QueryBuilderConfig.ts +2 -1
- package/src/stores/QueryBuilderResultState.ts +4 -0
- package/src/stores/QueryBuilderValueSpecificationHelper.ts +2 -1
- package/src/stores/QueryLoaderState.ts +43 -17
- package/src/stores/explorer/QueryBuilderExplorerState.ts +58 -5
- package/src/stores/explorer/QueryBuilderFuzzySearchAdvancedConfigState.ts +1 -1
- package/src/stores/explorer/QueryBuilderPropertySearchState.ts +194 -92
- package/src/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.ts +43 -13
- 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
|
|
316
|
-
?
|
|
317
|
-
:
|
|
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()
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
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
|
-
<
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
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
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
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.
|
|
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
|
-
|
|
695
|
-
|
|
696
|
-
|
|
754
|
+
},
|
|
755
|
+
},
|
|
756
|
+
{
|
|
757
|
+
label: 'String',
|
|
758
|
+
enabled: propertySearchState.typeFilters.includes(
|
|
697
759
|
QUERY_BUILDER_PROPERTY_SEARCH_TYPE.STRING,
|
|
698
|
-
)
|
|
699
|
-
|
|
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.
|
|
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
|
-
|
|
725
|
-
|
|
726
|
-
|
|
770
|
+
},
|
|
771
|
+
},
|
|
772
|
+
{
|
|
773
|
+
label: 'Boolean',
|
|
774
|
+
enabled: propertySearchState.typeFilters.includes(
|
|
727
775
|
QUERY_BUILDER_PROPERTY_SEARCH_TYPE.BOOLEAN,
|
|
728
|
-
)
|
|
729
|
-
|
|
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.
|
|
779
|
+
QUERY_BUILDER_PROPERTY_SEARCH_TYPE.BOOLEAN,
|
|
752
780
|
);
|
|
753
|
-
}
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
785
|
-
|
|
786
|
-
|
|
802
|
+
},
|
|
803
|
+
},
|
|
804
|
+
{
|
|
805
|
+
label: 'Date',
|
|
806
|
+
enabled: propertySearchState.typeFilters.includes(
|
|
787
807
|
QUERY_BUILDER_PROPERTY_SEARCH_TYPE.DATE,
|
|
788
|
-
)
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
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=
|
|
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=
|
|
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:
|
|
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
|
|
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
|
-
|
|
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}
|