@finos/legend-query-builder 4.14.18 → 4.14.19

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. package/lib/components/QueryBuilder.d.ts.map +1 -1
  2. package/lib/components/QueryBuilder.js +5 -3
  3. package/lib/components/QueryBuilder.js.map +1 -1
  4. package/lib/components/QueryBuilderConstantExpressionPanel.d.ts.map +1 -1
  5. package/lib/components/QueryBuilderConstantExpressionPanel.js +71 -45
  6. package/lib/components/QueryBuilderConstantExpressionPanel.js.map +1 -1
  7. package/lib/components/QueryBuilderDiffPanel.d.ts.map +1 -1
  8. package/lib/components/QueryBuilderDiffPanel.js +2 -1
  9. package/lib/components/QueryBuilderDiffPanel.js.map +1 -1
  10. package/lib/components/QueryBuilderParametersPanel.d.ts.map +1 -1
  11. package/lib/components/QueryBuilderParametersPanel.js +25 -26
  12. package/lib/components/QueryBuilderParametersPanel.js.map +1 -1
  13. package/lib/components/QueryBuilderPropertyExpressionEditor.d.ts +11 -2
  14. package/lib/components/QueryBuilderPropertyExpressionEditor.d.ts.map +1 -1
  15. package/lib/components/QueryBuilderPropertyExpressionEditor.js +35 -10
  16. package/lib/components/QueryBuilderPropertyExpressionEditor.js.map +1 -1
  17. package/lib/components/QueryBuilderSideBar.d.ts.map +1 -1
  18. package/lib/components/QueryBuilderSideBar.js +6 -1
  19. package/lib/components/QueryBuilderSideBar.js.map +1 -1
  20. package/lib/components/QueryBuilderTextEditor.d.ts.map +1 -1
  21. package/lib/components/QueryBuilderTextEditor.js +3 -3
  22. package/lib/components/QueryBuilderTextEditor.js.map +1 -1
  23. package/lib/components/QueryLoader.d.ts.map +1 -1
  24. package/lib/components/QueryLoader.js +5 -3
  25. package/lib/components/QueryLoader.js.map +1 -1
  26. package/lib/components/QueryUsageViewer.d.ts.map +1 -1
  27. package/lib/components/QueryUsageViewer.js +2 -2
  28. package/lib/components/QueryUsageViewer.js.map +1 -1
  29. package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.d.ts +2 -0
  30. package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.d.ts.map +1 -1
  31. package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.js +19 -2
  32. package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.js.map +1 -1
  33. package/lib/components/data-access/DataAccessOverview.d.ts.map +1 -1
  34. package/lib/components/data-access/DataAccessOverview.js +6 -1
  35. package/lib/components/data-access/DataAccessOverview.js.map +1 -1
  36. package/lib/components/execution-plan/ExecutionPlanViewer.d.ts.map +1 -1
  37. package/lib/components/execution-plan/ExecutionPlanViewer.js +6 -6
  38. package/lib/components/execution-plan/ExecutionPlanViewer.js.map +1 -1
  39. package/lib/components/explorer/QueryBuilderExplorerPanel.d.ts.map +1 -1
  40. package/lib/components/explorer/QueryBuilderExplorerPanel.js +3 -2
  41. package/lib/components/explorer/QueryBuilderExplorerPanel.js.map +1 -1
  42. package/lib/components/explorer/QueryBuilderMilestoningEditor.d.ts.map +1 -1
  43. package/lib/components/explorer/QueryBuilderMilestoningEditor.js +3 -2
  44. package/lib/components/explorer/QueryBuilderMilestoningEditor.js.map +1 -1
  45. package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.d.ts.map +1 -1
  46. package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.js +6 -3
  47. package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.js.map +1 -1
  48. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.d.ts.map +1 -1
  49. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js +4 -3
  50. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js.map +1 -1
  51. package/lib/components/fetch-structure/QueryBuilderTDSPanel.d.ts.map +1 -1
  52. package/lib/components/fetch-structure/QueryBuilderTDSPanel.js +11 -22
  53. package/lib/components/fetch-structure/QueryBuilderTDSPanel.js.map +1 -1
  54. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.d.ts.map +1 -1
  55. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js +2 -2
  56. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js.map +1 -1
  57. package/lib/components/result/QueryBuilderResultPanel.d.ts.map +1 -1
  58. package/lib/components/result/QueryBuilderResultPanel.js +2 -1
  59. package/lib/components/result/QueryBuilderResultPanel.js.map +1 -1
  60. package/lib/components/result/tds/QueryBuilderTDSGridResult.d.ts.map +1 -1
  61. package/lib/components/result/tds/QueryBuilderTDSGridResult.js +5 -1
  62. package/lib/components/result/tds/QueryBuilderTDSGridResult.js.map +1 -1
  63. package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.d.ts.map +1 -1
  64. package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.js +11 -2
  65. package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.js.map +1 -1
  66. package/lib/components/shared/BasicValueSpecificationEditor.d.ts.map +1 -1
  67. package/lib/components/shared/BasicValueSpecificationEditor.js +25 -22
  68. package/lib/components/shared/BasicValueSpecificationEditor.js.map +1 -1
  69. package/lib/components/shared/CustomDatePicker.d.ts.map +1 -1
  70. package/lib/components/shared/CustomDatePicker.js +8 -5
  71. package/lib/components/shared/CustomDatePicker.js.map +1 -1
  72. package/lib/components/shared/LambdaEditor.d.ts.map +1 -1
  73. package/lib/components/shared/LambdaEditor.js +17 -3
  74. package/lib/components/shared/LambdaEditor.js.map +1 -1
  75. package/lib/components/shared/LambdaParameterValuesEditor.d.ts.map +1 -1
  76. package/lib/components/shared/LambdaParameterValuesEditor.js +2 -2
  77. package/lib/components/shared/LambdaParameterValuesEditor.js.map +1 -1
  78. package/lib/components/shared/QueryBuilderPropertyInfoTooltip.d.ts +6 -0
  79. package/lib/components/shared/QueryBuilderPropertyInfoTooltip.d.ts.map +1 -1
  80. package/lib/components/shared/QueryBuilderPropertyInfoTooltip.js +40 -3
  81. package/lib/components/shared/QueryBuilderPropertyInfoTooltip.js.map +1 -1
  82. package/lib/components/watermark/QueryBuilderWatermark.d.ts.map +1 -1
  83. package/lib/components/watermark/QueryBuilderWatermark.js +28 -12
  84. package/lib/components/watermark/QueryBuilderWatermark.js.map +1 -1
  85. package/lib/index.css +17 -1
  86. package/lib/index.css.map +1 -1
  87. package/lib/package.json +1 -1
  88. package/lib/stores/QueryBuilderConstantsState.d.ts +1 -0
  89. package/lib/stores/QueryBuilderConstantsState.d.ts.map +1 -1
  90. package/lib/stores/QueryBuilderConstantsState.js +7 -1
  91. package/lib/stores/QueryBuilderConstantsState.js.map +1 -1
  92. package/lib/stores/QueryBuilder_LegendApplicationPlugin_Extension.d.ts +5 -0
  93. package/lib/stores/QueryBuilder_LegendApplicationPlugin_Extension.d.ts.map +1 -1
  94. package/lib/stores/watermark/QueryBuilderWatermarkState.d.ts +1 -2
  95. package/lib/stores/watermark/QueryBuilderWatermarkState.d.ts.map +1 -1
  96. package/lib/stores/watermark/QueryBuilderWatermarkState.js +2 -12
  97. package/lib/stores/watermark/QueryBuilderWatermarkState.js.map +1 -1
  98. package/package.json +8 -8
  99. package/src/components/QueryBuilder.tsx +14 -2
  100. package/src/components/QueryBuilderConstantExpressionPanel.tsx +145 -69
  101. package/src/components/QueryBuilderDiffPanel.tsx +10 -2
  102. package/src/components/QueryBuilderParametersPanel.tsx +42 -37
  103. package/src/components/QueryBuilderPropertyExpressionEditor.tsx +87 -24
  104. package/src/components/QueryBuilderSideBar.tsx +20 -0
  105. package/src/components/QueryBuilderTextEditor.tsx +6 -4
  106. package/src/components/QueryLoader.tsx +12 -3
  107. package/src/components/QueryUsageViewer.tsx +7 -1
  108. package/src/components/__test-utils__/QueryBuilderComponentTestUtils.tsx +40 -4
  109. package/src/components/data-access/DataAccessOverview.tsx +9 -1
  110. package/src/components/execution-plan/ExecutionPlanViewer.tsx +11 -8
  111. package/src/components/explorer/QueryBuilderExplorerPanel.tsx +5 -2
  112. package/src/components/explorer/QueryBuilderMilestoningEditor.tsx +5 -2
  113. package/src/components/fetch-structure/QueryBuilderGraphFetchTreePanel.tsx +12 -5
  114. package/src/components/fetch-structure/QueryBuilderResultModifierPanel.tsx +8 -4
  115. package/src/components/fetch-structure/QueryBuilderTDSPanel.tsx +56 -72
  116. package/src/components/fetch-structure/QueryBuilderTDSWindowPanel.tsx +8 -2
  117. package/src/components/result/QueryBuilderResultPanel.tsx +8 -1
  118. package/src/components/result/tds/QueryBuilderTDSGridResult.tsx +6 -3
  119. package/src/components/result/tds/QueryBuilderTDSSimpleGridResult.tsx +14 -4
  120. package/src/components/shared/BasicValueSpecificationEditor.tsx +39 -25
  121. package/src/components/shared/CustomDatePicker.tsx +18 -5
  122. package/src/components/shared/LambdaEditor.tsx +27 -11
  123. package/src/components/shared/LambdaParameterValuesEditor.tsx +4 -1
  124. package/src/components/shared/QueryBuilderPropertyInfoTooltip.tsx +115 -64
  125. package/src/components/watermark/QueryBuilderWatermark.tsx +60 -19
  126. package/src/stores/QueryBuilderConstantsState.ts +12 -0
  127. package/src/stores/QueryBuilder_LegendApplicationPlugin_Extension.ts +9 -0
  128. package/src/stores/watermark/QueryBuilderWatermarkState.ts +2 -12
@@ -14,7 +14,13 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import { useCallback } from 'react';
17
+ import {
18
+ useCallback,
19
+ useEffect,
20
+ useRef,
21
+ useState,
22
+ type ChangeEvent,
23
+ } from 'react';
18
24
  import {
19
25
  clsx,
20
26
  Dialog,
@@ -26,6 +32,7 @@ import {
26
32
  ModalBody,
27
33
  ModalFooter,
28
34
  ModalFooterButton,
35
+ InputWithInlineValidation,
29
36
  } from '@finos/legend-art';
30
37
  import { observer } from 'mobx-react-lite';
31
38
  import {
@@ -301,6 +308,8 @@ const DerivedPropertyExpressionEditor = observer(
301
308
  export const QueryBuilderPropertyExpressionEditor = observer(
302
309
  (props: { propertyExpressionState: QueryBuilderPropertyExpressionState }) => {
303
310
  const { propertyExpressionState } = props;
311
+ const applicationStore =
312
+ propertyExpressionState.queryBuilderState.applicationStore;
304
313
  const handleClose = (): void =>
305
314
  propertyExpressionState.setIsEditingDerivedProperty(false);
306
315
  const isParameterCompatibleWithDerivedProperty = (
@@ -334,7 +343,9 @@ export const QueryBuilderPropertyExpressionEditor = observer(
334
343
  }}
335
344
  >
336
345
  <Modal
337
- darkMode={true}
346
+ darkMode={
347
+ !applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
348
+ }
338
349
  className="editor-modal query-builder-property-editor"
339
350
  >
340
351
  <ModalHeader title="Derived Property" />
@@ -368,6 +379,72 @@ export const QueryBuilderPropertyExpressionEditor = observer(
368
379
  },
369
380
  );
370
381
 
382
+ export const QueryBuilderEditablePropertyName = observer(
383
+ (props: {
384
+ columnName: string;
385
+ changeColumnName?:
386
+ | ((event: ChangeEvent<HTMLInputElement>) => void)
387
+ | undefined;
388
+ error: string | undefined;
389
+ title: string;
390
+ }) => {
391
+ const { columnName, changeColumnName, error, title } = props;
392
+
393
+ const [isEditingColumnName, setIsEditingColumnName] = useState(false);
394
+ const columnNameInputRef = useRef<HTMLInputElement>(null);
395
+
396
+ useEffect(() => {
397
+ if (isEditingColumnName) {
398
+ columnNameInputRef.current?.focus();
399
+ }
400
+ }, [isEditingColumnName, columnNameInputRef]);
401
+
402
+ return isEditingColumnName ? (
403
+ <div className="query-builder__property__name__editor">
404
+ <InputWithInlineValidation
405
+ className="query-builder__property__name__editor__input input-group__input"
406
+ spellCheck={false}
407
+ value={columnName}
408
+ onChange={changeColumnName}
409
+ onKeyDown={(event: React.KeyboardEvent<HTMLInputElement>) => {
410
+ if (event.key === 'Enter') {
411
+ setIsEditingColumnName(false);
412
+ }
413
+ }}
414
+ onBlur={() => {
415
+ setIsEditingColumnName(false);
416
+ }}
417
+ error={error}
418
+ ref={columnNameInputRef}
419
+ draggable={true}
420
+ onDragStart={(e: React.DragEvent<HTMLInputElement>) => {
421
+ // The below 2 lines are to allow dragging to select text in the input instead of
422
+ // dragging the draggable element containing the input.
423
+ e.preventDefault();
424
+ e.stopPropagation();
425
+ }}
426
+ />
427
+ </div>
428
+ ) : (
429
+ <div className="query-builder__property__name__display" title={title}>
430
+ <span
431
+ className={clsx('query-builder__property__name__display__content', {
432
+ 'query-builder__property__name__display__content--error': error,
433
+ 'editable-value': changeColumnName,
434
+ })}
435
+ onClick={() => {
436
+ if (changeColumnName) {
437
+ setIsEditingColumnName(true);
438
+ }
439
+ }}
440
+ >
441
+ {columnName}
442
+ </span>
443
+ </div>
444
+ );
445
+ },
446
+ );
447
+
371
448
  export const QueryBuilderPropertyExpressionBadge = observer(
372
449
  (props: {
373
450
  columnName?: string;
@@ -375,14 +452,14 @@ export const QueryBuilderPropertyExpressionBadge = observer(
375
452
  onPropertyExpressionChange: (
376
453
  node: QueryBuilderExplorerTreePropertyNodeData,
377
454
  ) => void;
378
- setIsEditingColumnName?: (isEditing: boolean) => void;
379
- error?: boolean | undefined;
455
+ changeColumnName?: (event: ChangeEvent<HTMLInputElement>) => void;
456
+ error?: string | undefined;
380
457
  }) => {
381
458
  const {
382
459
  columnName,
383
460
  propertyExpressionState,
384
461
  onPropertyExpressionChange,
385
- setIsEditingColumnName,
462
+ changeColumnName,
386
463
  error,
387
464
  } = props;
388
465
  const type =
@@ -446,26 +523,12 @@ export const QueryBuilderPropertyExpressionBadge = observer(
446
523
  },
447
524
  )}
448
525
  >
449
- <div
450
- className="query-builder-property-expression-badge__property"
526
+ <QueryBuilderEditablePropertyName
527
+ columnName={columnName ?? propertyExpressionState.title}
528
+ changeColumnName={changeColumnName}
529
+ error={error}
451
530
  title={`${propertyExpressionState.title} - ${propertyExpressionState.path}`}
452
- >
453
- <span
454
- className={clsx(
455
- 'query-builder-property-expression-badge__property__content',
456
- {
457
- 'query-builder-property-expression-badge__property__content--error':
458
- error,
459
- 'editable-value': !!setIsEditingColumnName,
460
- },
461
- )}
462
- onClick={() => {
463
- setIsEditingColumnName?.(true);
464
- }}
465
- >
466
- {columnName ?? propertyExpressionState.title}
467
- </span>
468
- </div>
531
+ />
469
532
  {hasDerivedPropertyInExpression && (
470
533
  <button
471
534
  className={clsx(
@@ -49,6 +49,7 @@ import {
49
49
  type PackageableElementOption,
50
50
  } from '@finos/legend-lego/graph-editor';
51
51
  import { MilestoningParametersEditor } from './explorer/QueryBuilderMilestoningEditor.js';
52
+ import type { QueryBuilder_LegendApplicationPlugin_Extension } from '../stores/QueryBuilder_LegendApplicationPlugin_Extension.js';
52
53
 
53
54
  export const getParameterValue = (
54
55
  parameter: ValueSpecification | undefined,
@@ -602,6 +603,22 @@ export const QueryBuilderSidebar = observer(
602
603
  children: React.ReactNode;
603
604
  }) => {
604
605
  const { queryBuilderState, children } = props;
606
+ const applicationStore = useApplicationStore();
607
+ const extraTemplateQueryPanelContentRenderer =
608
+ applicationStore.pluginManager
609
+ .getApplicationPlugins()
610
+ .flatMap(
611
+ (plugin) =>
612
+ (
613
+ plugin as QueryBuilder_LegendApplicationPlugin_Extension
614
+ ).getExtraTemplateQueryPanelContentRenderer?.() ?? [],
615
+ );
616
+ const templateQueryPanelContentTab =
617
+ extraTemplateQueryPanelContentRenderer[0] ? (
618
+ extraTemplateQueryPanelContentRenderer[0](queryBuilderState)
619
+ ) : (
620
+ <></>
621
+ );
605
622
 
606
623
  return (
607
624
  <div
@@ -620,6 +637,9 @@ export const QueryBuilderSidebar = observer(
620
637
  )}
621
638
  </div>
622
639
  </div>
640
+ <div className="query-builder__template-query">
641
+ {templateQueryPanelContentTab}
642
+ </div>
623
643
  <div className="query-builder__side-bar__content">{children}</div>
624
644
  </div>
625
645
  );
@@ -71,7 +71,9 @@ export const QueryBuilderTextEditor = observer(
71
71
  }}
72
72
  >
73
73
  <Modal
74
- darkMode={true}
74
+ darkMode={
75
+ !applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
76
+ }
75
77
  className={clsx('editor-modal query-builder-text-mode__modal', {
76
78
  'query-builder-text-mode__modal--has-error': Boolean(
77
79
  queryTextEditorState.parserError,
@@ -135,13 +137,13 @@ export const QueryBuilderTextEditor = observer(
135
137
  text="Discard Changes"
136
138
  />
137
139
  )}
138
- <button
139
- className="btn btn--dark"
140
+ <ModalFooterButton
140
141
  onClick={close}
141
142
  disabled={
142
143
  Boolean(queryTextEditorState.parserError) ||
143
144
  queryBuilderState.textEditorState.closingQueryState.isInProgress
144
145
  }
146
+ type="secondary"
145
147
  >
146
148
  {queryBuilderState.textEditorState.closingQueryState
147
149
  .isInProgress ? (
@@ -154,7 +156,7 @@ export const QueryBuilderTextEditor = observer(
154
156
  ) : (
155
157
  <> Close </>
156
158
  )}
157
- </button>
159
+ </ModalFooterButton>
158
160
  </ModalFooter>
159
161
  </Modal>
160
162
  </Dialog>
@@ -59,6 +59,7 @@ import {
59
59
  const QueryPreviewViewer = observer(
60
60
  (props: { queryLoaderState: QueryLoaderState }) => {
61
61
  const { queryLoaderState } = props;
62
+ const applicationStore = queryLoaderState.applicationStore;
62
63
  const close = (): void => {
63
64
  queryLoaderState.setShowPreviewViewer(false);
64
65
  };
@@ -72,7 +73,12 @@ const QueryPreviewViewer = observer(
72
73
  paper: 'editor-modal__content',
73
74
  }}
74
75
  >
75
- <Modal className="editor-modal" darkMode={true}>
76
+ <Modal
77
+ className="editor-modal"
78
+ darkMode={
79
+ !applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
80
+ }
81
+ >
76
82
  <ModalHeader
77
83
  title={
78
84
  guaranteeNonNullable(queryLoaderState.queryPreviewContent).name
@@ -89,7 +95,7 @@ const QueryPreviewViewer = observer(
89
95
  />
90
96
  </ModalBody>
91
97
  <ModalFooter>
92
- <ModalFooterButton onClick={close} text="Close" />
98
+ <ModalFooterButton onClick={close} text="Close" type="secondary" />
93
99
  </ModalFooter>
94
100
  </Modal>
95
101
  </Dialog>
@@ -456,6 +462,7 @@ export const QueryLoaderDialog = observer(
456
462
  loadActionLabel?: string | undefined;
457
463
  }) => {
458
464
  const { queryLoaderState, title, loadActionLabel } = props;
465
+ const applicationStore = queryLoaderState.applicationStore;
459
466
 
460
467
  const close = (): void => {
461
468
  queryLoaderState.setQueryLoaderDialogOpen(false);
@@ -475,7 +482,9 @@ export const QueryLoaderDialog = observer(
475
482
  }}
476
483
  >
477
484
  <Modal
478
- darkMode={true}
485
+ darkMode={
486
+ !applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
487
+ }
479
488
  className="modal query-loader__dialog__body__content"
480
489
  >
481
490
  <div className="modal query-loader__dialog__header">
@@ -56,7 +56,12 @@ export const QueryUsageViewer = observer(
56
56
  open={resultState.isQueryUsageViewerOpened}
57
57
  onClose={() => resultState.setIsQueryUsageViewerOpened(false)}
58
58
  >
59
- <Modal className="query-builder__usage-viewer__modal" darkMode={true}>
59
+ <Modal
60
+ className="query-builder__usage-viewer__modal"
61
+ darkMode={
62
+ !applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
63
+ }
64
+ >
60
65
  <ModalHeader title="Query Usage" />
61
66
  <ModalBody className="query-builder__usage-viewer__body">
62
67
  <>
@@ -102,6 +107,7 @@ export const QueryUsageViewer = observer(
102
107
  <ModalFooterButton
103
108
  onClick={() => resultState.setIsQueryUsageViewerOpened(false)}
104
109
  text="Close"
110
+ type="secondary"
105
111
  />
106
112
  </ModalFooter>
107
113
  </Modal>
@@ -52,15 +52,19 @@ import {
52
52
  import { STYLE_PREFIX, STYLE_PREFIX__DARK } from '@finos/legend-art';
53
53
  import { expect } from '@jest/globals';
54
54
 
55
+ const getSelectorContainerClassName = (lightMode?: boolean): string =>
56
+ '.' + `${lightMode ? STYLE_PREFIX : STYLE_PREFIX__DARK}__value-container`;
57
+
58
+ const getSelectorInputClassName = (lightMode?: boolean): string =>
59
+ '.' + `${lightMode ? STYLE_PREFIX : STYLE_PREFIX__DARK}__single-value`;
60
+
55
61
  export const selectFromCustomSelectorInput = (
56
62
  selectorContainer: HTMLElement,
57
63
  optionText: string,
58
64
  lightMode?: boolean,
59
65
  ): void => {
60
- const selectorContainerClassName =
61
- '.' + `${lightMode ? STYLE_PREFIX : STYLE_PREFIX__DARK}__value-container`;
62
- const selectorInputValue =
63
- '.' + `${lightMode ? STYLE_PREFIX : STYLE_PREFIX__DARK}__single-value`;
66
+ const selectorContainerClassName = getSelectorContainerClassName(lightMode);
67
+ const selectorInputValue = getSelectorInputClassName(lightMode);
64
68
 
65
69
  let foundOptionText = false;
66
70
  const selector = selectorContainer.querySelector(
@@ -106,6 +110,38 @@ export const selectFromCustomSelectorInput = (
106
110
  }
107
111
  };
108
112
 
113
+ export const selectFirstOptionFromCustomSelectorInput = (
114
+ selectorContainer: HTMLElement,
115
+ lightMode?: boolean,
116
+ ): void => {
117
+ const selectorContainerClassName = getSelectorContainerClassName(lightMode);
118
+ const selectorInputValue = getSelectorInputClassName(lightMode);
119
+
120
+ const selector = selectorContainer.querySelector(
121
+ selectorContainerClassName,
122
+ ) as HTMLSelectElement;
123
+
124
+ fireEvent.keyDown(selector, { key: 'ArrowDown' });
125
+ fireEvent.keyDown(selector, { key: 'Enter' });
126
+ expect(selector.querySelector(selectorInputValue)).not.toBeNull();
127
+ };
128
+
129
+ export const getCustomSelectorInputValue = (
130
+ selectorContainer: HTMLElement,
131
+ lightMode?: boolean,
132
+ ): string | null => {
133
+ const selectorContainerClassName = getSelectorContainerClassName(lightMode);
134
+ const selectorInputValue = getSelectorInputClassName(lightMode);
135
+
136
+ const selector = guaranteeNonNullable(
137
+ selectorContainer.querySelector(selectorContainerClassName),
138
+ ) as HTMLSelectElement;
139
+ const selectorInput = guaranteeNonNullable(
140
+ selector.querySelector(selectorInputValue),
141
+ );
142
+ return selectorInput.textContent;
143
+ };
144
+
109
145
  export const dragAndDrop = async (
110
146
  source: HTMLElement,
111
147
  drop: HTMLElement,
@@ -217,9 +217,17 @@ const AccessStatusCellRenderer = observer(
217
217
  const DataAccessOverviewGrid = observer(
218
218
  (props: { dataAccessState: DataAccessState }) => {
219
219
  const { dataAccessState } = props;
220
+ const darkMode =
221
+ !dataAccessState.applicationStore.layoutService
222
+ .TEMPORARY__isLightColorThemeEnabled;
220
223
 
221
224
  return (
222
- <div className="data-access-overview__grid ag-theme-balham-dark">
225
+ <div
226
+ className={clsx('data-access-overview__grid', {
227
+ 'ag-theme-balham': !darkMode,
228
+ 'ag-theme-balham-dark': darkMode,
229
+ })}
230
+ >
223
231
  <DataGrid
224
232
  rowData={dataAccessState.datasets}
225
233
  gridOptions={{
@@ -148,11 +148,13 @@ export const ExecutionPlanViewerPanelContent: React.FC<{
148
148
  executionPlanState: ExecutionPlanState;
149
149
  }> = observer((props) => {
150
150
  const { executionPlanState } = props;
151
- const applicationStore = executionPlanState.applicationStore;
152
151
  const globalImplementationSupport =
153
152
  executionPlanState.plan?.globalImplementationSupport;
154
153
  const templateFunctions =
155
154
  executionPlanState.plan?.processingTemplateFunctions ?? [];
155
+ const isDarkMode =
156
+ !executionPlanState.applicationStore.layoutService
157
+ .TEMPORARY__isLightColorThemeEnabled;
156
158
 
157
159
  if (
158
160
  globalImplementationSupport &&
@@ -210,10 +212,7 @@ export const ExecutionPlanViewerPanelContent: React.FC<{
210
212
  <ResizablePanelGroup orientation="vertical">
211
213
  <ResizablePanel minSize={30} size={400}>
212
214
  <PanelContent
213
- darkMode={
214
- !applicationStore.layoutService
215
- .TEMPORARY__isLightColorThemeEnabled
216
- }
215
+ darkMode={isDarkMode}
217
216
  className="query-builder__java__container__panel"
218
217
  >
219
218
  <div className="query-builder__java__container">
@@ -773,7 +772,7 @@ const ExecutionPlanViewerContent = observer(
773
772
  <ResizablePanel size={300} minSize={300}>
774
773
  <div className="panel execution-plan-viewer__explorer">
775
774
  <PanelSideBarHeader
776
- darkMode={true}
775
+ darkMode={isDarkMode}
777
776
  title="execution plan explorer"
778
777
  />
779
778
  <div className="panel__content execution-plan-viewer__explorer__content__container">
@@ -846,7 +845,7 @@ export const ExecutionPlanViewer = observer(
846
845
  paper: 'editor-modal__content',
847
846
  }}
848
847
  >
849
- <Modal className="editor-modal" darkMode={true}>
848
+ <Modal className="editor-modal" darkMode={isDarkMode}>
850
849
  <ModalHeader title="Execution Plan" />
851
850
  <ModalBody>
852
851
  {executionPlanState.debugText ? (
@@ -891,7 +890,11 @@ export const ExecutionPlanViewer = observer(
891
890
  )}
892
891
  </ModalBody>
893
892
  <ModalFooter>
894
- <ModalFooterButton onClick={closePlanViewer} text="Close" />
893
+ <ModalFooterButton
894
+ onClick={closePlanViewer}
895
+ text="Close"
896
+ type="secondary"
897
+ />
895
898
  </ModalFooter>
896
899
  </Modal>
897
900
  </Dialog>
@@ -217,6 +217,7 @@ export const QueryBuilderSubclassInfoTooltip: React.FC<{
217
217
  const QueryBuilderExplorerPreviewDataModal = observer(
218
218
  (props: { queryBuilderState: QueryBuilderState }) => {
219
219
  const { queryBuilderState } = props;
220
+ const applicationStore = queryBuilderState.applicationStore;
220
221
  const previewDataState = queryBuilderState.explorerState.previewDataState;
221
222
  const close = (): void => previewDataState.setPreviewData(undefined);
222
223
 
@@ -234,7 +235,9 @@ const QueryBuilderExplorerPreviewDataModal = observer(
234
235
  }}
235
236
  >
236
237
  <Modal
237
- darkMode={true}
238
+ darkMode={
239
+ !applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
240
+ }
238
241
  className="editor-modal query-builder__explorer__preview-data-modal"
239
242
  >
240
243
  <ModalHeader title={prettyCONSTName(previewDataState.propertyName)} />
@@ -276,7 +279,7 @@ const QueryBuilderExplorerPreviewDataModal = observer(
276
279
  )}
277
280
  </ModalBody>
278
281
  <ModalFooter>
279
- <ModalFooterButton text="Close" onClick={close} />
282
+ <ModalFooterButton text="Close" onClick={close} type="secondary" />
280
283
  </ModalFooter>
281
284
  </Modal>
282
285
  </Dialog>
@@ -281,6 +281,7 @@ const AllVersionsInRangelMilestoningParametersEditor = observer(
281
281
  export const MilestoningParametersEditor = observer(
282
282
  (props: { queryBuilderState: QueryBuilderState }) => {
283
283
  const { queryBuilderState } = props;
284
+ const applicationStore = queryBuilderState.applicationStore;
284
285
  const milestoningState = queryBuilderState.milestoningState;
285
286
  const close = (): void => milestoningState.setShowMilestoningEditor(false);
286
287
  const isCompatibleMilestoningParameter = (
@@ -302,7 +303,9 @@ export const MilestoningParametersEditor = observer(
302
303
  }}
303
304
  >
304
305
  <Modal
305
- darkMode={true}
306
+ darkMode={
307
+ !applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
308
+ }
306
309
  className="editor-modal query-builder__variables__modal"
307
310
  >
308
311
  <ModalHeader title="Milestoning Parameters" />
@@ -352,7 +355,7 @@ export const MilestoningParametersEditor = observer(
352
355
  </div>
353
356
  </ModalBody>
354
357
  <ModalFooter>
355
- <ModalFooterButton text="Close" onClick={close} />
358
+ <ModalFooterButton text="Close" onClick={close} type="secondary" />
356
359
  </ModalFooter>
357
360
  </Modal>
358
361
  </Dialog>
@@ -346,12 +346,13 @@ const PureSerializationConfigModal = observer(
346
346
  onClick={removeConfig}
347
347
  />
348
348
  )}
349
- <button
350
- className="btn modal__footer__close-btn btn--dark"
349
+ <ModalFooterButton
350
+ className="modal__footer__close-btn"
351
351
  onClick={handleAction}
352
+ type={toAdd ? 'primary' : 'secondary'}
352
353
  >
353
354
  {toAdd ? 'Add Config' : 'Close'}
354
- </button>
355
+ </ModalFooterButton>
355
356
  </ModalFooter>
356
357
  </Modal>
357
358
  </Dialog>
@@ -379,6 +380,7 @@ export const QueryBuilderGraphFetchExternalConfig = observer(
379
380
  value: serializationState.targetBinding,
380
381
  label: serializationState.targetBinding.name,
381
382
  };
383
+ const applicationStore = graphFetchState.queryBuilderState.applicationStore;
382
384
  const onBindingChange = (
383
385
  val: PackageableElementOption<Binding> | null,
384
386
  ): void => {
@@ -423,9 +425,14 @@ export const QueryBuilderGraphFetchExternalConfig = observer(
423
425
  onChange={onBindingChange}
424
426
  value={selectedBinding}
425
427
  formatOptionLabel={getBindingFormatter({
426
- darkMode: true,
428
+ darkMode:
429
+ !applicationStore.layoutService
430
+ .TEMPORARY__isLightColorThemeEnabled,
427
431
  })}
428
- darkMode={true}
432
+ darkMode={
433
+ !applicationStore.layoutService
434
+ .TEMPORARY__isLightColorThemeEnabled
435
+ }
429
436
  />
430
437
  </div>
431
438
  <div className="service-execution-editor__configuration__item">
@@ -227,8 +227,10 @@ const cloneSortColumnStateArray = (
227
227
 
228
228
  export const QueryResultModifierModal = observer(
229
229
  (props: { tdsState: QueryBuilderTDSState }) => {
230
- // Read current state
231
230
  const { tdsState } = props;
231
+ const applicationStore = tdsState.queryBuilderState.applicationStore;
232
+
233
+ // Read current state
232
234
  const resultSetModifierState = tdsState.resultSetModifierState;
233
235
  const stateSortColumns = resultSetModifierState.sortColumns;
234
236
  const stateDistinct = resultSetModifierState.distinct;
@@ -331,7 +333,9 @@ export const QueryResultModifierModal = observer(
331
333
  data-testid={QUERY_BUILDER_TEST_ID.QUERY_BUILDER_RESULT_MODIFIER_PANEL}
332
334
  >
333
335
  <Modal
334
- darkMode={true}
336
+ darkMode={
337
+ !applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
338
+ }
335
339
  className="editor-modal query-builder__projection__modal"
336
340
  >
337
341
  <ModalHeader title="Result Set Modifier" />
@@ -403,7 +407,7 @@ export const QueryResultModifierModal = observer(
403
407
  <div className="query-builder__result__slice__input__wrapper">
404
408
  <InputWithInlineValidation
405
409
  id="query-builder__projection__modal__slice-start-input"
406
- className="input--dark query-builder__result__slice__input"
410
+ className="input--dark query-builder__result__slice__input panel__content__form__section__input"
407
411
  spellCheck={false}
408
412
  value={slice[0] ?? ''}
409
413
  onChange={changeSliceStart}
@@ -414,7 +418,7 @@ export const QueryResultModifierModal = observer(
414
418
  <div className="query-builder__result__slice__range">..</div>
415
419
  <div className="query-builder__result__slice__input__wrapper">
416
420
  <InputWithInlineValidation
417
- className="input--dark query-builder__result__slice__input"
421
+ className="input--dark query-builder__result__slice__input panel__content__form__section__input"
418
422
  spellCheck={false}
419
423
  value={slice[1] ?? ''}
420
424
  onChange={changeSliceEnd}