@finos/legend-application-studio 27.1.0 → 27.1.2

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 (156) hide show
  1. package/lib/__lib__/LegendStudioEvent.d.ts +1 -0
  2. package/lib/__lib__/LegendStudioEvent.d.ts.map +1 -1
  3. package/lib/__lib__/LegendStudioEvent.js +1 -0
  4. package/lib/__lib__/LegendStudioEvent.js.map +1 -1
  5. package/lib/components/editor/editor-group/FunctionEditor.d.ts.map +1 -1
  6. package/lib/components/editor/editor-group/FunctionEditor.js +28 -24
  7. package/lib/components/editor/editor-group/FunctionEditor.js.map +1 -1
  8. package/lib/components/editor/editor-group/connection-editor/{DatabaseBuilder.d.ts → DatabaseBuilderWizard.d.ts} +4 -11
  9. package/lib/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.d.ts.map +1 -0
  10. package/lib/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.js +48 -0
  11. package/lib/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.js.map +1 -0
  12. package/lib/components/editor/editor-group/connection-editor/DatabaseSchemaExplorer.d.ts +32 -0
  13. package/lib/components/editor/editor-group/connection-editor/DatabaseSchemaExplorer.d.ts.map +1 -0
  14. package/lib/components/editor/editor-group/connection-editor/DatabaseSchemaExplorer.js +99 -0
  15. package/lib/components/editor/editor-group/connection-editor/DatabaseSchemaExplorer.js.map +1 -0
  16. package/lib/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.js +1 -1
  17. package/lib/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.js.map +1 -1
  18. package/lib/components/editor/editor-group/data-editor/EmbeddedDataEditor.d.ts.map +1 -1
  19. package/lib/components/editor/editor-group/data-editor/EmbeddedDataEditor.js +5 -4
  20. package/lib/components/editor/editor-group/data-editor/EmbeddedDataEditor.js.map +1 -1
  21. package/lib/components/editor/editor-group/data-editor/RelationalCSVDataEditor.d.ts.map +1 -1
  22. package/lib/components/editor/editor-group/data-editor/RelationalCSVDataEditor.js +62 -12
  23. package/lib/components/editor/editor-group/data-editor/RelationalCSVDataEditor.js.map +1 -1
  24. package/lib/components/editor/editor-group/mapping-editor/MappingTestableEditor.d.ts +1 -1
  25. package/lib/components/editor/editor-group/mapping-editor/MappingTestableEditor.d.ts.map +1 -1
  26. package/lib/components/editor/editor-group/mapping-editor/MappingTestableEditor.js +101 -137
  27. package/lib/components/editor/editor-group/mapping-editor/MappingTestableEditor.js.map +1 -1
  28. package/lib/components/editor/editor-group/testable/TestableSharedComponents.d.ts +11 -0
  29. package/lib/components/editor/editor-group/testable/TestableSharedComponents.d.ts.map +1 -1
  30. package/lib/components/editor/editor-group/testable/TestableSharedComponents.js +27 -2
  31. package/lib/components/editor/editor-group/testable/TestableSharedComponents.js.map +1 -1
  32. package/lib/components/editor/panel-group/SQLPlaygroundPanel.d.ts +0 -7
  33. package/lib/components/editor/panel-group/SQLPlaygroundPanel.d.ts.map +1 -1
  34. package/lib/components/editor/panel-group/SQLPlaygroundPanel.js +20 -77
  35. package/lib/components/editor/panel-group/SQLPlaygroundPanel.js.map +1 -1
  36. package/lib/components/editor/side-bar/Explorer.js +3 -3
  37. package/lib/components/editor/side-bar/Explorer.js.map +1 -1
  38. package/lib/components/editor/side-bar/WorkflowManager.d.ts.map +1 -1
  39. package/lib/components/editor/side-bar/WorkflowManager.js +6 -1
  40. package/lib/components/editor/side-bar/WorkflowManager.js.map +1 -1
  41. package/lib/index.css +2 -2
  42. package/lib/index.css.map +1 -1
  43. package/lib/package.json +3 -3
  44. package/lib/stores/editor/ExplorerTreeState.d.ts +4 -4
  45. package/lib/stores/editor/ExplorerTreeState.d.ts.map +1 -1
  46. package/lib/stores/editor/ExplorerTreeState.js +4 -4
  47. package/lib/stores/editor/ExplorerTreeState.js.map +1 -1
  48. package/lib/stores/editor/NewElementState.d.ts.map +1 -1
  49. package/lib/stores/editor/NewElementState.js.map +1 -1
  50. package/lib/stores/editor/editor-state/element-editor-state/FunctionEditorState.d.ts +12 -12
  51. package/lib/stores/editor/editor-state/element-editor-state/FunctionEditorState.d.ts.map +1 -1
  52. package/lib/stores/editor/editor-state/element-editor-state/FunctionEditorState.js +45 -46
  53. package/lib/stores/editor/editor-state/element-editor-state/FunctionEditorState.js.map +1 -1
  54. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.d.ts +20 -29
  55. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.d.ts.map +1 -1
  56. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.js +60 -141
  57. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.js.map +1 -1
  58. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.d.ts +33 -0
  59. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.d.ts.map +1 -0
  60. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.js +71 -0
  61. package/lib/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.js.map +1 -0
  62. package/lib/stores/editor/editor-state/element-editor-state/data/DataEditorState.d.ts +2 -2
  63. package/lib/stores/editor/editor-state/element-editor-state/data/DataEditorState.d.ts.map +1 -1
  64. package/lib/stores/editor/editor-state/element-editor-state/data/DataEditorState.js +2 -2
  65. package/lib/stores/editor/editor-state/element-editor-state/data/DataEditorState.js.map +1 -1
  66. package/lib/stores/editor/editor-state/element-editor-state/data/EmbeddedDataState.d.ts +14 -19
  67. package/lib/stores/editor/editor-state/element-editor-state/data/EmbeddedDataState.d.ts.map +1 -1
  68. package/lib/stores/editor/editor-state/element-editor-state/data/EmbeddedDataState.js +30 -65
  69. package/lib/stores/editor/editor-state/element-editor-state/data/EmbeddedDataState.js.map +1 -1
  70. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestableState.d.ts +56 -78
  71. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestableState.d.ts.map +1 -1
  72. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestableState.js +285 -384
  73. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestableState.js.map +1 -1
  74. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestingHelper.d.ts +23 -0
  75. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestingHelper.d.ts.map +1 -0
  76. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestingHelper.js +129 -0
  77. package/lib/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestingHelper.js.map +1 -0
  78. package/lib/stores/editor/editor-state/element-editor-state/service/ServiceEditorState.d.ts.map +1 -1
  79. package/lib/stores/editor/editor-state/element-editor-state/service/ServiceEditorState.js +2 -2
  80. package/lib/stores/editor/editor-state/element-editor-state/service/ServiceEditorState.js.map +1 -1
  81. package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestDataState.d.ts +1 -0
  82. package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestDataState.d.ts.map +1 -1
  83. package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestDataState.js +12 -2
  84. package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestDataState.js.map +1 -1
  85. package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestableState.d.ts.map +1 -1
  86. package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestableState.js +15 -8
  87. package/lib/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestableState.js.map +1 -1
  88. package/lib/stores/editor/editor-state/element-editor-state/testable/TestAssertionState.d.ts +7 -4
  89. package/lib/stores/editor/editor-state/element-editor-state/testable/TestAssertionState.d.ts.map +1 -1
  90. package/lib/stores/editor/editor-state/element-editor-state/testable/TestAssertionState.js +53 -10
  91. package/lib/stores/editor/editor-state/element-editor-state/testable/TestAssertionState.js.map +1 -1
  92. package/lib/stores/editor/editor-state/element-editor-state/testable/TestableEditorState.d.ts +2 -1
  93. package/lib/stores/editor/editor-state/element-editor-state/testable/TestableEditorState.d.ts.map +1 -1
  94. package/lib/stores/editor/editor-state/element-editor-state/testable/TestableEditorState.js +20 -16
  95. package/lib/stores/editor/editor-state/element-editor-state/testable/TestableEditorState.js.map +1 -1
  96. package/lib/stores/editor/panel-group/SQLPlaygroundPanelState.d.ts +3 -48
  97. package/lib/stores/editor/panel-group/SQLPlaygroundPanelState.d.ts.map +1 -1
  98. package/lib/stores/editor/panel-group/SQLPlaygroundPanelState.js +12 -350
  99. package/lib/stores/editor/panel-group/SQLPlaygroundPanelState.js.map +1 -1
  100. package/lib/stores/editor/sidebar-state/WorkflowManagerState.d.ts +5 -0
  101. package/lib/stores/editor/sidebar-state/WorkflowManagerState.d.ts.map +1 -1
  102. package/lib/stores/editor/sidebar-state/WorkflowManagerState.js +26 -0
  103. package/lib/stores/editor/sidebar-state/WorkflowManagerState.js.map +1 -1
  104. package/lib/stores/editor/sidebar-state/testable/GlobalTestRunnerState.d.ts +1 -1
  105. package/lib/stores/editor/sidebar-state/testable/GlobalTestRunnerState.d.ts.map +1 -1
  106. package/lib/stores/editor/sidebar-state/testable/GlobalTestRunnerState.js +3 -0
  107. package/lib/stores/editor/sidebar-state/testable/GlobalTestRunnerState.js.map +1 -1
  108. package/lib/stores/editor/utils/MockDataUtils.d.ts.map +1 -1
  109. package/lib/stores/editor/utils/MockDataUtils.js +3 -0
  110. package/lib/stores/editor/utils/MockDataUtils.js.map +1 -1
  111. package/lib/stores/editor/utils/TestableUtils.d.ts +11 -1
  112. package/lib/stores/editor/utils/TestableUtils.d.ts.map +1 -1
  113. package/lib/stores/editor/utils/TestableUtils.js +50 -1
  114. package/lib/stores/editor/utils/TestableUtils.js.map +1 -1
  115. package/lib/stores/graph-modifier/DSL_Mapping_GraphModifierHelper.d.ts +5 -4
  116. package/lib/stores/graph-modifier/DSL_Mapping_GraphModifierHelper.d.ts.map +1 -1
  117. package/lib/stores/graph-modifier/DSL_Mapping_GraphModifierHelper.js +4 -1
  118. package/lib/stores/graph-modifier/DSL_Mapping_GraphModifierHelper.js.map +1 -1
  119. package/package.json +9 -9
  120. package/src/__lib__/LegendStudioEvent.ts +1 -1
  121. package/src/components/editor/editor-group/FunctionEditor.tsx +133 -118
  122. package/src/components/editor/editor-group/connection-editor/DatabaseBuilderWizard.tsx +191 -0
  123. package/src/components/editor/editor-group/connection-editor/DatabaseSchemaExplorer.tsx +227 -0
  124. package/src/components/editor/editor-group/connection-editor/RelationalDatabaseConnectionEditor.tsx +1 -1
  125. package/src/components/editor/editor-group/data-editor/EmbeddedDataEditor.tsx +34 -37
  126. package/src/components/editor/editor-group/data-editor/RelationalCSVDataEditor.tsx +134 -31
  127. package/src/components/editor/editor-group/mapping-editor/MappingTestableEditor.tsx +296 -414
  128. package/src/components/editor/editor-group/testable/TestableSharedComponents.tsx +88 -3
  129. package/src/components/editor/panel-group/SQLPlaygroundPanel.tsx +47 -211
  130. package/src/components/editor/side-bar/Explorer.tsx +3 -3
  131. package/src/components/editor/side-bar/WorkflowManager.tsx +10 -0
  132. package/src/stores/editor/ExplorerTreeState.ts +6 -9
  133. package/src/stores/editor/NewElementState.ts +0 -1
  134. package/src/stores/editor/editor-state/element-editor-state/FunctionEditorState.ts +44 -50
  135. package/src/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.ts +88 -212
  136. package/src/stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderWizardState.ts +102 -0
  137. package/src/stores/editor/editor-state/element-editor-state/data/DataEditorState.ts +7 -1
  138. package/src/stores/editor/editor-state/element-editor-state/data/EmbeddedDataState.ts +48 -77
  139. package/src/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestableState.ts +407 -617
  140. package/src/stores/editor/editor-state/element-editor-state/mapping/testable/MappingTestingHelper.ts +243 -0
  141. package/src/stores/editor/editor-state/element-editor-state/service/ServiceEditorState.ts +6 -2
  142. package/src/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestDataState.ts +18 -1
  143. package/src/stores/editor/editor-state/element-editor-state/service/testable/ServiceTestableState.ts +20 -12
  144. package/src/stores/editor/editor-state/element-editor-state/testable/TestAssertionState.ts +76 -18
  145. package/src/stores/editor/editor-state/element-editor-state/testable/TestableEditorState.ts +29 -24
  146. package/src/stores/editor/panel-group/SQLPlaygroundPanelState.ts +13 -533
  147. package/src/stores/editor/sidebar-state/WorkflowManagerState.ts +47 -0
  148. package/src/stores/editor/sidebar-state/testable/GlobalTestRunnerState.ts +4 -1
  149. package/src/stores/editor/utils/MockDataUtils.ts +2 -0
  150. package/src/stores/editor/utils/TestableUtils.ts +73 -0
  151. package/src/stores/graph-modifier/DSL_Mapping_GraphModifierHelper.ts +15 -12
  152. package/tsconfig.json +4 -1
  153. package/lib/components/editor/editor-group/connection-editor/DatabaseBuilder.d.ts.map +0 -1
  154. package/lib/components/editor/editor-group/connection-editor/DatabaseBuilder.js +0 -133
  155. package/lib/components/editor/editor-group/connection-editor/DatabaseBuilder.js.map +0 -1
  156. package/src/components/editor/editor-group/connection-editor/DatabaseBuilder.tsx +0 -397
@@ -18,6 +18,7 @@ import {
18
18
  clsx,
19
19
  CompareIcon,
20
20
  ContextMenu,
21
+ CustomSelectorInput,
21
22
  Dialog,
22
23
  MenuContent,
23
24
  MenuContentItem,
@@ -34,7 +35,7 @@ import {
34
35
  RefreshIcon,
35
36
  WrenchIcon,
36
37
  } from '@finos/legend-art';
37
- import { TestError } from '@finos/legend-graph';
38
+ import { type DataElement, TestError } from '@finos/legend-graph';
38
39
  import {
39
40
  prettyCONSTName,
40
41
  tryToFormatLosslessJSONString,
@@ -61,6 +62,86 @@ import {
61
62
  import { forwardRef, useState } from 'react';
62
63
  import type { TestableTestEditorState } from '../../../../stores/editor/editor-state/element-editor-state/testable/TestableEditorState.js';
63
64
  import { getTestableResultIcon } from '../../side-bar/testable/GlobalTestRunner.js';
65
+ import type { EditorStore } from '../../../../stores/editor/EditorStore.js';
66
+ import {
67
+ buildElementOption,
68
+ getPackageableElementOptionFormatter,
69
+ } from '@finos/legend-lego/graph-editor';
70
+
71
+ export const SharedDataElementModal = observer(
72
+ (props: {
73
+ filterBy?: (val: DataElement) => boolean;
74
+ handler: (val: DataElement) => void;
75
+ editorStore: EditorStore;
76
+ isReadOnly: boolean;
77
+ close: () => void;
78
+ }) => {
79
+ const { filterBy, isReadOnly, close, editorStore, handler } = props;
80
+ const dataElements =
81
+ editorStore.graphManagerState.graph.dataElements.filter((e) =>
82
+ filterBy ? filterBy(e) : true,
83
+ );
84
+ const [dataElement, setDataElement] = useState(dataElements[0]);
85
+ const dataElementOptions =
86
+ editorStore.graphManagerState.usableDataElements.map(buildElementOption);
87
+ const selectedDataElement = dataElement
88
+ ? buildElementOption(dataElement)
89
+ : null;
90
+ const onDataElementChange = (val: {
91
+ label: string;
92
+ value?: DataElement;
93
+ }): void => {
94
+ if (val.value !== selectedDataElement?.value && val.value) {
95
+ setDataElement(val.value);
96
+ }
97
+ };
98
+ const change = (): void => {
99
+ if (dataElement) {
100
+ handler(dataElement);
101
+ }
102
+ close();
103
+ };
104
+ return (
105
+ <Dialog
106
+ open={true}
107
+ onClose={close}
108
+ classes={{ container: 'search-modal__container' }}
109
+ PaperProps={{ classes: { root: 'search-modal__inner-container' } }}
110
+ >
111
+ <Modal darkMode={true} className="service-test-data-modal">
112
+ <ModalBody>
113
+ <div className="panel__content__form__section">
114
+ <div className="panel__content__form__section__header__label">
115
+ Data Element
116
+ </div>
117
+ <div className="explorer__new-element-modal__driver">
118
+ <CustomSelectorInput
119
+ className="panel__content__form__section__dropdown data-element-reference-editor__value__dropdown"
120
+ disabled={false}
121
+ options={dataElementOptions}
122
+ onChange={onDataElementChange}
123
+ formatOptionLabel={getPackageableElementOptionFormatter({})}
124
+ value={selectedDataElement}
125
+ darkMode={true}
126
+ />
127
+ </div>
128
+ </div>
129
+ </ModalBody>
130
+ <ModalFooter>
131
+ <ModalFooterButton
132
+ className="database-builder__action--btn"
133
+ disabled={isReadOnly}
134
+ onClick={change}
135
+ title="Change to use Data Element"
136
+ >
137
+ Change
138
+ </ModalFooterButton>
139
+ </ModalFooter>
140
+ </Modal>
141
+ </Dialog>
142
+ );
143
+ },
144
+ );
64
145
 
65
146
  export const RenameModal = observer(
66
147
  (props: {
@@ -438,6 +519,10 @@ export const TestAssertionEditor = observer(
438
519
  const { testAssertionState } = props;
439
520
  const selectedTab = testAssertionState.selectedTab;
440
521
  const isReadOnly = testAssertionState.testState.isReadOnly;
522
+ const isDisabled =
523
+ isReadOnly ||
524
+ !testAssertionState.assertionState.supportsGeneratingAssertion ||
525
+ testAssertionState.generatingExpectedAction.isInProgress;
441
526
  const changeTab = (val: TEST_ASSERTION_TAB): void =>
442
527
  testAssertionState.setSelectedTab(val);
443
528
  const renderContent = (state: TestAssertionState): React.ReactNode => {
@@ -484,7 +569,7 @@ export const TestAssertionEditor = observer(
484
569
  className="panel__header__action service-execution-editor__test-data__generate-btn"
485
570
  onClick={generate}
486
571
  title="Generate expected result if possible"
487
- disabled={isReadOnly}
572
+ disabled={isDisabled}
488
573
  tabIndex={-1}
489
574
  >
490
575
  <div className="service-execution-editor__test-data__generate-btn__label">
@@ -497,7 +582,7 @@ export const TestAssertionEditor = observer(
497
582
  </div>
498
583
  </div>
499
584
  <div className="testable-test-assertion-editor__content">
500
- {selectedTab === TEST_ASSERTION_TAB.SETUP && (
585
+ {selectedTab === TEST_ASSERTION_TAB.EXPECTED && (
501
586
  <div className="testable-test-assertion-editor__setup">
502
587
  {renderContent(testAssertionState.assertionState)}
503
588
  </div>
@@ -16,16 +16,9 @@
16
16
 
17
17
  import { observer } from 'mobx-react-lite';
18
18
  import {
19
- type TreeNodeContainerProps,
20
19
  ResizablePanelGroup,
21
20
  ResizablePanel,
22
21
  ResizablePanelSplitter,
23
- TreeView,
24
- PURE_DatabaseSchemaIcon,
25
- PURE_DatabaseTableIcon,
26
- ChevronDownIcon,
27
- ChevronRightIcon,
28
- KeyIcon,
29
22
  CustomSelectorInput,
30
23
  type SelectComponent,
31
24
  createFilter,
@@ -37,9 +30,6 @@ import {
37
30
  PanelLoadingIndicator,
38
31
  BlankPanelContent,
39
32
  TrashIcon,
40
- CircleIcon,
41
- CheckCircleIcon,
42
- EmptyCircleIcon,
43
33
  PURE_DatabaseIcon,
44
34
  SyncIcon,
45
35
  } from '@finos/legend-art';
@@ -65,18 +55,9 @@ import {
65
55
  PackageableConnection,
66
56
  RelationalDatabaseConnection,
67
57
  guaranteeRelationalDatabaseConnection,
68
- stringifyDataType,
69
58
  } from '@finos/legend-graph';
70
59
  import { LEGEND_STUDIO_APPLICATION_NAVIGATION_CONTEXT_KEY } from '../../../__lib__/LegendStudioApplicationNavigationContext.js';
71
- import {
72
- DatabaseSchemaExplorerTreeColumnNodeData,
73
- DatabaseSchemaExplorerTreeSchemaNodeData,
74
- DatabaseSchemaExplorerTreeTableNodeData,
75
- type DatabaseSchemaExplorerTreeData,
76
- type DatabaseSchemaExplorerTreeNodeData,
77
- type SQLPlaygroundPanelState,
78
- } from '../../../stores/editor/panel-group/SQLPlaygroundPanelState.js';
79
- import { renderColumnTypeIcon } from '../editor-group/connection-editor/DatabaseEditorHelper.js';
60
+ import { type SQLPlaygroundPanelState } from '../../../stores/editor/panel-group/SQLPlaygroundPanelState.js';
80
61
  import { useEditorStore } from '../EditorStoreProvider.js';
81
62
  import { PANEL_MODE } from '../../../stores/editor/EditorConfig.js';
82
63
  import { useDrag, useDrop } from 'react-dnd';
@@ -94,191 +75,35 @@ import {
94
75
  parseCSVString,
95
76
  uniqBy,
96
77
  } from '@finos/legend-shared';
97
-
98
- const getDatabaseSchemaNodeIcon = (
99
- node: DatabaseSchemaExplorerTreeNodeData,
100
- ): React.ReactNode => {
101
- if (node instanceof DatabaseSchemaExplorerTreeSchemaNodeData) {
102
- return (
103
- <div className="sql-playground__database-schema-explorer-tree__icon--schema">
104
- <PURE_DatabaseSchemaIcon />
105
- </div>
106
- );
107
- } else if (node instanceof DatabaseSchemaExplorerTreeTableNodeData) {
108
- return (
109
- <div className="sql-playground__database-schema-explorer-tree__icon--table">
110
- <PURE_DatabaseTableIcon />
111
- </div>
112
- );
113
- } else if (node instanceof DatabaseSchemaExplorerTreeColumnNodeData) {
114
- return renderColumnTypeIcon(node.column.type);
115
- }
116
- return null;
117
- };
78
+ import {
79
+ DatabaseSchemaExplorer,
80
+ DatabaseSchemaExplorerTreeNodeContainer,
81
+ type DatabaseSchemaExplorerTreeNodeContainerProps,
82
+ } from '../editor-group/connection-editor/DatabaseSchemaExplorer.js';
83
+ import { DatabaseSchemaExplorerTreeTableNodeData } from '../../../stores/editor/editor-state/element-editor-state/connection/DatabaseBuilderState.js';
118
84
 
119
85
  const DATABASE_NODE_DND_TYPE = 'DATABASE_NODE_DND_TYPE';
120
86
  type DatabaseNodeDragType = { text: string };
121
87
 
122
- const DatabaseSchemaExplorerTreeNodeContainer: React.FC<
123
- TreeNodeContainerProps<
124
- DatabaseSchemaExplorerTreeNodeData,
125
- {
126
- toggleCheckedNode: (node: DatabaseSchemaExplorerTreeNodeData) => void;
127
- isPartiallySelected: (
128
- node: DatabaseSchemaExplorerTreeNodeData,
129
- ) => boolean;
130
- }
131
- >
132
- > = (props) => {
133
- const { node, level, stepPaddingInRem, onNodeSelect, innerProps } = props;
134
- const { toggleCheckedNode, isPartiallySelected } = innerProps;
135
- const isExpandable =
136
- Boolean(!node.childrenIds || node.childrenIds.length) &&
137
- !(node instanceof DatabaseSchemaExplorerTreeColumnNodeData);
138
- const nodeExpandIcon = isExpandable ? (
139
- node.isOpen ? (
140
- <ChevronDownIcon />
141
- ) : (
142
- <ChevronRightIcon />
143
- )
144
- ) : (
145
- <div />
146
- );
147
- const [, nodeDragRef] = useDrag<DatabaseNodeDragType>(
148
- () => ({
149
- type: DATABASE_NODE_DND_TYPE,
150
- item: {
151
- text:
152
- node instanceof DatabaseSchemaExplorerTreeTableNodeData
153
- ? `${node.owner.name}.${node.label}`
154
- : node.label,
155
- },
156
- }),
157
- [node],
158
- );
159
- const nodeTypeIcon = getDatabaseSchemaNodeIcon(node);
160
- const toggleExpandNode = (): void => onNodeSelect?.(node);
161
- const isPrimaryKeyColumn =
162
- node instanceof DatabaseSchemaExplorerTreeColumnNodeData &&
163
- node.owner.primaryKey.includes(node.column);
164
-
165
- const renderCheckedIcon = (
166
- _node: DatabaseSchemaExplorerTreeNodeData,
167
- ): React.ReactNode => {
168
- if (_node instanceof DatabaseSchemaExplorerTreeColumnNodeData) {
169
- return null;
170
- } else if (isPartiallySelected(_node)) {
171
- return <CircleIcon />;
172
- } else if (_node.isChecked) {
173
- return <CheckCircleIcon />;
174
- }
175
- return <EmptyCircleIcon />;
176
- };
177
-
178
- return (
179
- <div
180
- className="tree-view__node__container"
181
- style={{
182
- paddingLeft: `${level * (stepPaddingInRem ?? 1)}rem`,
183
- display: 'flex',
184
- }}
185
- ref={nodeDragRef}
186
- onClick={toggleExpandNode}
187
- >
188
- <div className="tree-view__node__icon sql-playground__database-schema-explorer-tree__node__icon__group">
189
- <div className="sql-playground__database-schema-explorer-tree__expand-icon">
190
- {nodeExpandIcon}
191
- </div>
192
- <div
193
- className="sql-playground__database-schema-explorer-tree__toggle-icon"
194
- onClick={(event) => {
195
- event.stopPropagation();
196
- toggleCheckedNode(node);
197
- }}
198
- >
199
- {renderCheckedIcon(node)}
200
- </div>
201
- <div className="sql-playground__database-schema-explorer-tree__type-icon">
202
- {nodeTypeIcon}
203
- </div>
204
- </div>
205
- <div className="tree-view__node__label sql-playground__database-schema-explorer-tree__node__label">
206
- {node.label}
207
- {node instanceof DatabaseSchemaExplorerTreeColumnNodeData && (
208
- <div className="sql-playground__database-schema-explorer-tree__node__type">
209
- <div className="sql-playground__database-schema-explorer-tree__node__type__label">
210
- {stringifyDataType(node.column.type)}
211
- </div>
212
- </div>
213
- )}
214
- {isPrimaryKeyColumn && (
215
- <div
216
- className="sql-playground__database-schema-explorer-tree__node__pk"
217
- title="Primary Key"
218
- >
219
- <KeyIcon />
220
- </div>
221
- )}
222
- </div>
223
- </div>
224
- );
225
- };
226
-
227
- export const DatabaseSchemaExplorer = observer(
228
- (props: {
229
- treeData: DatabaseSchemaExplorerTreeData;
230
- playgroundState: SQLPlaygroundPanelState;
231
- }) => {
232
- const { treeData, playgroundState } = props;
233
- const applicationStore = useApplicationStore();
234
-
235
- const onNodeSelect = (node: DatabaseSchemaExplorerTreeNodeData): void => {
236
- flowResult(playgroundState.onNodeSelect(node, treeData)).catch(
237
- applicationStore.alertUnhandledError,
238
- );
239
- };
240
-
241
- const getChildNodes = (
242
- node: DatabaseSchemaExplorerTreeNodeData,
243
- ): DatabaseSchemaExplorerTreeNodeData[] =>
244
- playgroundState
245
- .getChildNodes(node, treeData)
246
- ?.sort((a, b) => a.label.localeCompare(b.label)) ?? [];
247
-
248
- const isPartiallySelected = (
249
- node: DatabaseSchemaExplorerTreeNodeData,
250
- ): boolean => {
251
- if (
252
- node instanceof DatabaseSchemaExplorerTreeSchemaNodeData &&
253
- !node.isChecked
254
- ) {
255
- return Boolean(
256
- playgroundState
257
- .getChildNodes(node, treeData)
258
- ?.find((childNode) => childNode.isChecked === true),
259
- );
260
- }
261
- return false;
262
- };
263
-
264
- const toggleCheckedNode = (
265
- node: DatabaseSchemaExplorerTreeNodeData,
266
- ): void => playgroundState.toggleCheckedNode(node, treeData);
88
+ const SQLPlaygroundDatabaseSchemaExplorerTreeNodeContainer = observer(
89
+ (props: DatabaseSchemaExplorerTreeNodeContainerProps) => {
90
+ const { node } = props;
91
+
92
+ const [, nodeDragRef] = useDrag<DatabaseNodeDragType>(
93
+ () => ({
94
+ type: DATABASE_NODE_DND_TYPE,
95
+ item: {
96
+ text:
97
+ node instanceof DatabaseSchemaExplorerTreeTableNodeData
98
+ ? `${node.owner.name}.${node.label}`
99
+ : node.label,
100
+ },
101
+ }),
102
+ [node],
103
+ );
267
104
 
268
105
  return (
269
- <TreeView
270
- className="sql-playground__database-schema-explorer-tree"
271
- components={{
272
- TreeNodeContainer: DatabaseSchemaExplorerTreeNodeContainer,
273
- }}
274
- innerProps={{
275
- toggleCheckedNode,
276
- isPartiallySelected,
277
- }}
278
- treeData={treeData}
279
- onNodeSelect={onNodeSelect}
280
- getChildNodes={getChildNodes}
281
- />
106
+ <DatabaseSchemaExplorerTreeNodeContainer {...props} ref={nodeDragRef} />
282
107
  );
283
108
  },
284
109
  );
@@ -369,9 +194,11 @@ const getDatabaseSchemaEntities = async (
369
194
  model: monacoEditorAPI.ITextModel,
370
195
  playgroundState: SQLPlaygroundPanelState,
371
196
  ): Promise<monacoLanguagesAPI.CompletionItem[]> => {
372
- if (playgroundState.treeData) {
197
+ if (playgroundState.schemaExplorerState?.treeData) {
373
198
  return uniqBy(
374
- Array.from(playgroundState.treeData.nodes.values()).map(
199
+ Array.from(
200
+ playgroundState.schemaExplorerState.treeData.nodes.values(),
201
+ ).map(
375
202
  (value) =>
376
203
  ({
377
204
  label: value.label,
@@ -700,15 +527,21 @@ export const SQLPlaygroundPanel = observer(() => {
700
527
  [handleConnectionDrop],
701
528
  );
702
529
 
703
- const updateDatabase = applicationStore.guardUnhandledError(() =>
704
- flowResult(playgroundState.updateDatabase()),
705
- );
530
+ const updateDatabase = (): void => {
531
+ if (playgroundState.schemaExplorerState) {
532
+ flowResult(playgroundState.schemaExplorerState.updateDatabase()).catch(
533
+ applicationStore.alertUnhandledError,
534
+ );
535
+ }
536
+ };
706
537
 
707
538
  useEffect(() => {
708
- flowResult(playgroundState.fetchDatabaseMetadata()).catch(
709
- applicationStore.alertUnhandledError,
710
- );
711
- }, [playgroundState, applicationStore, playgroundState.connection]);
539
+ if (playgroundState.schemaExplorerState) {
540
+ flowResult(
541
+ playgroundState.schemaExplorerState.fetchDatabaseMetadata(),
542
+ ).catch(applicationStore.alertUnhandledError);
543
+ }
544
+ }, [playgroundState, applicationStore, playgroundState.schemaExplorerState]);
712
545
 
713
546
  useConditionedApplicationNavigationContext(
714
547
  LEGEND_STUDIO_APPLICATION_NAVIGATION_CONTEXT_KEY.SQL_PLAYGROUND,
@@ -770,10 +603,13 @@ export const SQLPlaygroundPanel = observer(() => {
770
603
  </div>
771
604
  </div>
772
605
  <div className="sql-playground__config__schema-explorer">
773
- {playgroundState.treeData && (
606
+ {playgroundState.schemaExplorerState?.treeData && (
774
607
  <DatabaseSchemaExplorer
775
- treeData={playgroundState.treeData}
776
- playgroundState={playgroundState}
608
+ treeData={playgroundState.schemaExplorerState.treeData}
609
+ schemaExplorerState={playgroundState.schemaExplorerState}
610
+ treeNodeContainerComponent={
611
+ SQLPlaygroundDatabaseSchemaExplorerTreeNodeContainer
612
+ }
777
613
  />
778
614
  )}
779
615
  </div>
@@ -133,7 +133,7 @@ import {
133
133
  CODE_EDITOR_LANGUAGE,
134
134
  CodeEditor,
135
135
  } from '@finos/legend-lego/code-editor';
136
- import { DatabaseBuilder } from '../editor-group/connection-editor/DatabaseBuilder.js';
136
+ import { DatabaseBuilderWizard } from '../editor-group/connection-editor/DatabaseBuilderWizard.js';
137
137
  import { FunctionEditorState } from '../../../stores/editor/editor-state/element-editor-state/FunctionEditorState.js';
138
138
 
139
139
  const ElementRenamer = observer(() => {
@@ -516,7 +516,7 @@ const ExplorerContextMenu = observer(
516
516
  const buildDatabase = editorStore.applicationStore.guardUnhandledError(
517
517
  async () => {
518
518
  if (isRelationalDatabaseConnection(node?.packageableElement)) {
519
- editorStore.explorerTreeState.buildDbBuilderState(
519
+ editorStore.explorerTreeState.buildDatabase(
520
520
  guaranteeRelationalDatabaseConnection(node?.packageableElement),
521
521
  editorStore.isInViewerMode,
522
522
  );
@@ -1128,7 +1128,7 @@ const ExplorerTrees = observer(() => {
1128
1128
  <ElementRenamer />
1129
1129
  <SampleDataGenerator />
1130
1130
  {editorStore.explorerTreeState.databaseBuilderState && (
1131
- <DatabaseBuilder
1131
+ <DatabaseBuilderWizard
1132
1132
  databaseBuilderState={
1133
1133
  editorStore.explorerTreeState.databaseBuilderState
1134
1134
  }
@@ -275,6 +275,11 @@ const WorkflowExplorerContextMenu = observer(
275
275
  workflowState.cancelJob(node.workflowJob, treeData);
276
276
  }
277
277
  };
278
+ const runManualJob = (): void => {
279
+ if (node instanceof WorkflowJobTreeNodeData) {
280
+ workflowState.runManualJob(node.workflowJob, treeData);
281
+ }
282
+ };
278
283
  const viewLogs = (): void => {
279
284
  if (node instanceof WorkflowJobTreeNodeData) {
280
285
  workflowManagerState.logState.viewJobLogs(node.workflowJob);
@@ -304,6 +309,11 @@ const WorkflowExplorerContextMenu = observer(
304
309
  {node.workflowJob.status === WorkflowJobStatus.IN_PROGRESS && (
305
310
  <MenuContentItem onClick={cancelJob}>Cancel Job</MenuContentItem>
306
311
  )}
312
+ {node.workflowJob.status === WorkflowJobStatus.WAITING_MANUAL && (
313
+ <MenuContentItem onClick={runManualJob}>
314
+ Run Manual Job
315
+ </MenuContentItem>
316
+ )}
307
317
  </>
308
318
  )}
309
319
  {node instanceof WorkflowTreeNodeData && (
@@ -51,7 +51,7 @@ import {
51
51
  type RelationalDatabaseConnection,
52
52
  } from '@finos/legend-graph';
53
53
  import { APPLICATION_EVENT } from '@finos/legend-application';
54
- import { DatabaseBuilderState } from './editor-state/element-editor-state/connection/DatabaseBuilderState.js';
54
+ import { DatabaseBuilderWizardState } from './editor-state/element-editor-state/connection/DatabaseBuilderWizardState.js';
55
55
 
56
56
  export enum ExplorerTreeRootPackageLabel {
57
57
  FILE_GENERATION = 'generated-files',
@@ -75,7 +75,7 @@ export class ExplorerTreeState {
75
75
 
76
76
  elementToRename?: PackageableElement | undefined;
77
77
  classToGenerateSampleData?: Class | undefined;
78
- databaseBuilderState: DatabaseBuilderState | undefined;
78
+ databaseBuilderState: DatabaseBuilderWizardState | undefined;
79
79
 
80
80
  constructor(editorStore: EditorStore) {
81
81
  makeObservable(this, {
@@ -103,7 +103,7 @@ export class ExplorerTreeState {
103
103
  buildTreeInTextMode: action,
104
104
  openExplorerTreeNodes: action,
105
105
  reprocess: action,
106
- buildDbBuilderState: action,
106
+ buildDatabase: action,
107
107
  setDatabaseBuilderState: action,
108
108
  onTreeNodeSelect: action,
109
109
  openNode: action,
@@ -176,14 +176,11 @@ export class ExplorerTreeState {
176
176
  this.classToGenerateSampleData = val;
177
177
  }
178
178
 
179
- setDatabaseBuilderState(val: DatabaseBuilderState | undefined): void {
179
+ setDatabaseBuilderState(val: DatabaseBuilderWizardState | undefined): void {
180
180
  this.databaseBuilderState = val;
181
181
  }
182
- buildDbBuilderState(
183
- val: RelationalDatabaseConnection,
184
- isReadOnly: boolean,
185
- ): void {
186
- const dbBuilderState = new DatabaseBuilderState(
182
+ buildDatabase(val: RelationalDatabaseConnection, isReadOnly: boolean): void {
183
+ const dbBuilderState = new DatabaseBuilderWizardState(
187
184
  this.editorStore,
188
185
  val,
189
186
  isReadOnly,
@@ -619,7 +619,6 @@ export class NewDataElementDriver extends NewElementDriver<DataElement> {
619
619
  createElement(name: string): DataElement {
620
620
  const embeddedDataOption = guaranteeNonNullable(this.embeddedDataOption);
621
621
  const dataElement = new DataElement(name);
622
-
623
622
  const data = createEmbeddedData(embeddedDataOption.value, this.editorStore);
624
623
  dataElement_setEmbeddedData(
625
624
  dataElement,