@finos/legend-application-studio 15.2.0 → 16.0.1

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 (277) hide show
  1. package/lib/application/LegendStudio.d.ts.map +1 -1
  2. package/lib/application/LegendStudio.js +5 -2
  3. package/lib/application/LegendStudio.js.map +1 -1
  4. package/lib/application/LegendStudioPluginManager.js +2 -2
  5. package/lib/application/LegendStudioPluginManager.js.map +1 -1
  6. package/lib/components/DSLExternalFormat_LegendStudioApplicationPlugin.d.ts +4 -4
  7. package/lib/components/DSLExternalFormat_LegendStudioApplicationPlugin.d.ts.map +1 -1
  8. package/lib/components/DSLExternalFormat_LegendStudioApplicationPlugin.js +3 -3
  9. package/lib/components/DSLExternalFormat_LegendStudioApplicationPlugin.js.map +1 -1
  10. package/lib/components/EditorComponentTestUtils.d.ts +10 -2
  11. package/lib/components/EditorComponentTestUtils.d.ts.map +1 -1
  12. package/lib/components/EditorComponentTestUtils.js +24 -18
  13. package/lib/components/EditorComponentTestUtils.js.map +1 -1
  14. package/lib/components/EmbeddedQueryBuilder.d.ts +19 -0
  15. package/lib/components/EmbeddedQueryBuilder.d.ts.map +1 -0
  16. package/lib/components/EmbeddedQueryBuilder.js +80 -0
  17. package/lib/components/EmbeddedQueryBuilder.js.map +1 -0
  18. package/lib/components/LegendStudioApplication.d.ts +0 -1
  19. package/lib/components/LegendStudioApplication.d.ts.map +1 -1
  20. package/lib/components/editor/Editor.d.ts.map +1 -1
  21. package/lib/components/editor/Editor.js +12 -13
  22. package/lib/components/editor/Editor.js.map +1 -1
  23. package/lib/components/editor/StatusBar.d.ts +0 -1
  24. package/lib/components/editor/StatusBar.d.ts.map +1 -1
  25. package/lib/components/editor/aux-panel/AuxiliaryPanel.d.ts +0 -1
  26. package/lib/components/editor/aux-panel/AuxiliaryPanel.d.ts.map +1 -1
  27. package/lib/components/editor/aux-panel/Console.d.ts +0 -1
  28. package/lib/components/editor/aux-panel/Console.d.ts.map +1 -1
  29. package/lib/components/editor/aux-panel/DevTool.d.ts +0 -1
  30. package/lib/components/editor/aux-panel/DevTool.d.ts.map +1 -1
  31. package/lib/components/editor/command-center/ProjectSearchCommand.d.ts +0 -1
  32. package/lib/components/editor/command-center/ProjectSearchCommand.d.ts.map +1 -1
  33. package/lib/components/editor/edit-panel/FileGenerationViewer.d.ts +0 -1
  34. package/lib/components/editor/edit-panel/FileGenerationViewer.d.ts.map +1 -1
  35. package/lib/components/editor/edit-panel/FunctionEditor.d.ts +0 -1
  36. package/lib/components/editor/edit-panel/FunctionEditor.d.ts.map +1 -1
  37. package/lib/components/editor/edit-panel/GenerationSpecificationEditor.d.ts +0 -1
  38. package/lib/components/editor/edit-panel/GenerationSpecificationEditor.d.ts.map +1 -1
  39. package/lib/components/editor/edit-panel/GrammarTextEditor.d.ts.map +1 -1
  40. package/lib/components/editor/edit-panel/GrammarTextEditor.js +15 -3
  41. package/lib/components/editor/edit-panel/GrammarTextEditor.js.map +1 -1
  42. package/lib/components/editor/edit-panel/ModelImporter.d.ts +0 -1
  43. package/lib/components/editor/edit-panel/ModelImporter.d.ts.map +1 -1
  44. package/lib/components/editor/edit-panel/RuntimeEditor.d.ts +0 -1
  45. package/lib/components/editor/edit-panel/RuntimeEditor.d.ts.map +1 -1
  46. package/lib/components/editor/edit-panel/UnsupportedElementEditor.d.ts +0 -1
  47. package/lib/components/editor/edit-panel/UnsupportedElementEditor.d.ts.map +1 -1
  48. package/lib/components/editor/edit-panel/connection-editor/ConnectionEditor.d.ts +0 -1
  49. package/lib/components/editor/edit-panel/connection-editor/ConnectionEditor.d.ts.map +1 -1
  50. package/lib/components/editor/edit-panel/connection-editor/DatabaseBuilder.d.ts +0 -1
  51. package/lib/components/editor/edit-panel/connection-editor/DatabaseBuilder.d.ts.map +1 -1
  52. package/lib/components/editor/edit-panel/connection-editor/FlatDataConnectionEditor.d.ts +0 -1
  53. package/lib/components/editor/edit-panel/connection-editor/FlatDataConnectionEditor.d.ts.map +1 -1
  54. package/lib/components/editor/edit-panel/connection-editor/RelationalDatabaseConnectionEditor.d.ts +0 -1
  55. package/lib/components/editor/edit-panel/connection-editor/RelationalDatabaseConnectionEditor.d.ts.map +1 -1
  56. package/lib/components/editor/edit-panel/connection-editor/RelationalDatabaseConnectionEditor.js +2 -2
  57. package/lib/components/editor/edit-panel/connection-editor/RelationalDatabaseConnectionEditor.js.map +1 -1
  58. package/lib/components/editor/edit-panel/connection-editor/post-processor-editor/MapperPostProcessorEditor.d.ts +0 -1
  59. package/lib/components/editor/edit-panel/connection-editor/post-processor-editor/MapperPostProcessorEditor.d.ts.map +1 -1
  60. package/lib/components/editor/edit-panel/connection-editor/post-processor-editor/MapperPostProcessorEditor.js.map +1 -1
  61. package/lib/components/editor/edit-panel/data-editor/DataElementEditor.d.ts +0 -1
  62. package/lib/components/editor/edit-panel/data-editor/DataElementEditor.d.ts.map +1 -1
  63. package/lib/components/editor/edit-panel/data-editor/RelationalCSVDataEditor.d.ts +0 -1
  64. package/lib/components/editor/edit-panel/data-editor/RelationalCSVDataEditor.d.ts.map +1 -1
  65. package/lib/components/editor/edit-panel/diff-editor/EntityChangeConflictEditor.d.ts +0 -1
  66. package/lib/components/editor/edit-panel/diff-editor/EntityChangeConflictEditor.d.ts.map +1 -1
  67. package/lib/components/editor/edit-panel/diff-editor/EntityDiffView.d.ts +0 -1
  68. package/lib/components/editor/edit-panel/diff-editor/EntityDiffView.d.ts.map +1 -1
  69. package/lib/components/editor/edit-panel/element-generation-editor/ElementGenerationEditor.d.ts +0 -1
  70. package/lib/components/editor/edit-panel/element-generation-editor/ElementGenerationEditor.d.ts.map +1 -1
  71. package/lib/components/editor/edit-panel/element-generation-editor/ElementNativeView.d.ts +0 -1
  72. package/lib/components/editor/edit-panel/element-generation-editor/ElementNativeView.d.ts.map +1 -1
  73. package/lib/components/editor/edit-panel/external-format-editor/BindingElementEditor.d.ts +0 -1
  74. package/lib/components/editor/edit-panel/external-format-editor/BindingElementEditor.d.ts.map +1 -1
  75. package/lib/components/editor/edit-panel/external-format-editor/ExternalFormatConnectionEditor.d.ts +0 -1
  76. package/lib/components/editor/edit-panel/external-format-editor/ExternalFormatConnectionEditor.d.ts.map +1 -1
  77. package/lib/components/editor/edit-panel/external-format-editor/NewSchemaSetDriver.d.ts +0 -1
  78. package/lib/components/editor/edit-panel/external-format-editor/NewSchemaSetDriver.d.ts.map +1 -1
  79. package/lib/components/editor/edit-panel/external-format-editor/SchemaSetElementEditor.d.ts +0 -1
  80. package/lib/components/editor/edit-panel/external-format-editor/SchemaSetElementEditor.d.ts.map +1 -1
  81. package/lib/components/editor/edit-panel/external-format-editor/SchemaSetModelGenerationEditor.d.ts +0 -1
  82. package/lib/components/editor/edit-panel/external-format-editor/SchemaSetModelGenerationEditor.d.ts.map +1 -1
  83. package/lib/components/editor/edit-panel/mapping-editor/ClassMappingEditor.d.ts +0 -1
  84. package/lib/components/editor/edit-panel/mapping-editor/ClassMappingEditor.d.ts.map +1 -1
  85. package/lib/components/editor/edit-panel/mapping-editor/EnumerationMappingEditor.d.ts +0 -1
  86. package/lib/components/editor/edit-panel/mapping-editor/EnumerationMappingEditor.d.ts.map +1 -1
  87. package/lib/components/editor/edit-panel/mapping-editor/FlatDataPropertyMappingEditor.d.ts +0 -1
  88. package/lib/components/editor/edit-panel/mapping-editor/FlatDataPropertyMappingEditor.d.ts.map +1 -1
  89. package/lib/components/editor/edit-panel/mapping-editor/InstanceSetImplementationEditor.d.ts +0 -1
  90. package/lib/components/editor/edit-panel/mapping-editor/InstanceSetImplementationEditor.d.ts.map +1 -1
  91. package/lib/components/editor/edit-panel/mapping-editor/InstanceSetImplementationSourceSelectorModal.d.ts +0 -1
  92. package/lib/components/editor/edit-panel/mapping-editor/InstanceSetImplementationSourceSelectorModal.d.ts.map +1 -1
  93. package/lib/components/editor/edit-panel/mapping-editor/MappingExecutionBuilder.d.ts +0 -1
  94. package/lib/components/editor/edit-panel/mapping-editor/MappingExecutionBuilder.d.ts.map +1 -1
  95. package/lib/components/editor/edit-panel/mapping-editor/MappingExecutionBuilder.js +40 -8
  96. package/lib/components/editor/edit-panel/mapping-editor/MappingExecutionBuilder.js.map +1 -1
  97. package/lib/components/editor/edit-panel/mapping-editor/MappingExecutionQueryBuilder.d.ts +18 -0
  98. package/lib/components/editor/edit-panel/mapping-editor/MappingExecutionQueryBuilder.d.ts.map +1 -0
  99. package/lib/components/editor/edit-panel/mapping-editor/MappingExecutionQueryBuilder.js +38 -0
  100. package/lib/components/editor/edit-panel/mapping-editor/MappingExecutionQueryBuilder.js.map +1 -0
  101. package/lib/components/editor/edit-panel/mapping-editor/MappingTestEditor.d.ts +0 -1
  102. package/lib/components/editor/edit-panel/mapping-editor/MappingTestEditor.d.ts.map +1 -1
  103. package/lib/components/editor/edit-panel/mapping-editor/MappingTestEditor.js +40 -8
  104. package/lib/components/editor/edit-panel/mapping-editor/MappingTestEditor.js.map +1 -1
  105. package/lib/components/editor/edit-panel/mapping-editor/NewMappingElementModal.d.ts +0 -1
  106. package/lib/components/editor/edit-panel/mapping-editor/NewMappingElementModal.d.ts.map +1 -1
  107. package/lib/components/editor/edit-panel/mapping-editor/OperationSetImplementationEditor.d.ts +0 -1
  108. package/lib/components/editor/edit-panel/mapping-editor/OperationSetImplementationEditor.d.ts.map +1 -1
  109. package/lib/components/editor/edit-panel/mapping-editor/PropertyMappingsEditor.d.ts +0 -1
  110. package/lib/components/editor/edit-panel/mapping-editor/PropertyMappingsEditor.d.ts.map +1 -1
  111. package/lib/components/editor/edit-panel/mapping-editor/PurePropertyMappingEditor.d.ts +0 -1
  112. package/lib/components/editor/edit-panel/mapping-editor/PurePropertyMappingEditor.d.ts.map +1 -1
  113. package/lib/components/editor/edit-panel/mapping-editor/relational/RelationalPropertyMappingEditor.d.ts +0 -1
  114. package/lib/components/editor/edit-panel/mapping-editor/relational/RelationalPropertyMappingEditor.d.ts.map +1 -1
  115. package/lib/components/editor/edit-panel/project-configuration-editor/ProjectConfigurationEditor.d.ts +0 -1
  116. package/lib/components/editor/edit-panel/project-configuration-editor/ProjectConfigurationEditor.d.ts.map +1 -1
  117. package/lib/components/editor/edit-panel/project-configuration-editor/ProjectConfigurationEditor.js +52 -8
  118. package/lib/components/editor/edit-panel/project-configuration-editor/ProjectConfigurationEditor.js.map +1 -1
  119. package/lib/components/editor/edit-panel/service-editor/NewServiceModal.d.ts +0 -1
  120. package/lib/components/editor/edit-panel/service-editor/NewServiceModal.d.ts.map +1 -1
  121. package/lib/components/editor/edit-panel/service-editor/ServiceEditor.d.ts +0 -1
  122. package/lib/components/editor/edit-panel/service-editor/ServiceEditor.d.ts.map +1 -1
  123. package/lib/components/editor/edit-panel/service-editor/ServiceExecutionEditor.d.ts +0 -1
  124. package/lib/components/editor/edit-panel/service-editor/ServiceExecutionEditor.d.ts.map +1 -1
  125. package/lib/components/editor/edit-panel/service-editor/ServiceExecutionQueryEditor.d.ts +0 -1
  126. package/lib/components/editor/edit-panel/service-editor/ServiceExecutionQueryEditor.d.ts.map +1 -1
  127. package/lib/components/editor/edit-panel/service-editor/ServiceExecutionQueryEditor.js +58 -10
  128. package/lib/components/editor/edit-panel/service-editor/ServiceExecutionQueryEditor.js.map +1 -1
  129. package/lib/components/editor/edit-panel/service-editor/ServiceRegistrationEditor.d.ts +0 -1
  130. package/lib/components/editor/edit-panel/service-editor/ServiceRegistrationEditor.d.ts.map +1 -1
  131. package/lib/components/editor/edit-panel/service-editor/testable/ServiceTestDataEditor.d.ts +0 -1
  132. package/lib/components/editor/edit-panel/service-editor/testable/ServiceTestDataEditor.d.ts.map +1 -1
  133. package/lib/components/editor/edit-panel/service-editor/testable/ServiceTestableEditor.d.ts +0 -1
  134. package/lib/components/editor/edit-panel/service-editor/testable/ServiceTestableEditor.d.ts.map +1 -1
  135. package/lib/components/editor/edit-panel/service-editor/testable/ServiceTestsEditor.d.ts +0 -1
  136. package/lib/components/editor/edit-panel/service-editor/testable/ServiceTestsEditor.d.ts.map +1 -1
  137. package/lib/components/editor/edit-panel/testable/TestAssertionEditor.d.ts +0 -1
  138. package/lib/components/editor/edit-panel/testable/TestAssertionEditor.d.ts.map +1 -1
  139. package/lib/components/editor/edit-panel/uml-editor/AssociationEditor.d.ts +0 -1
  140. package/lib/components/editor/edit-panel/uml-editor/AssociationEditor.d.ts.map +1 -1
  141. package/lib/components/editor/edit-panel/uml-editor/ClassEditor.d.ts +0 -1
  142. package/lib/components/editor/edit-panel/uml-editor/ClassEditor.d.ts.map +1 -1
  143. package/lib/components/editor/edit-panel/uml-editor/ClassQueryBuilder.d.ts +19 -0
  144. package/lib/components/editor/edit-panel/uml-editor/ClassQueryBuilder.d.ts.map +1 -0
  145. package/lib/components/editor/edit-panel/uml-editor/ClassQueryBuilder.js +80 -0
  146. package/lib/components/editor/edit-panel/uml-editor/ClassQueryBuilder.js.map +1 -0
  147. package/lib/components/editor/edit-panel/uml-editor/EnumerationEditor.d.ts +0 -1
  148. package/lib/components/editor/edit-panel/uml-editor/EnumerationEditor.d.ts.map +1 -1
  149. package/lib/components/editor/edit-panel/uml-editor/ProfileEditor.d.ts +0 -1
  150. package/lib/components/editor/edit-panel/uml-editor/ProfileEditor.d.ts.map +1 -1
  151. package/lib/components/editor/edit-panel/uml-editor/PropertyEditor.d.ts +0 -1
  152. package/lib/components/editor/edit-panel/uml-editor/PropertyEditor.d.ts.map +1 -1
  153. package/lib/components/editor/edit-panel/uml-editor/UMLEditor.d.ts +0 -1
  154. package/lib/components/editor/edit-panel/uml-editor/UMLEditor.d.ts.map +1 -1
  155. package/lib/components/editor/side-bar/CreateNewElementModal.d.ts +0 -1
  156. package/lib/components/editor/side-bar/CreateNewElementModal.d.ts.map +1 -1
  157. package/lib/components/editor/side-bar/Explorer.d.ts +0 -1
  158. package/lib/components/editor/side-bar/Explorer.d.ts.map +1 -1
  159. package/lib/components/editor/side-bar/Explorer.js +15 -8
  160. package/lib/components/editor/side-bar/Explorer.js.map +1 -1
  161. package/lib/components/editor/side-bar/LocalChanges.d.ts +0 -1
  162. package/lib/components/editor/side-bar/LocalChanges.d.ts.map +1 -1
  163. package/lib/components/editor/side-bar/ProjectOverview.d.ts +0 -1
  164. package/lib/components/editor/side-bar/ProjectOverview.d.ts.map +1 -1
  165. package/lib/components/editor/side-bar/SideBar.d.ts +0 -1
  166. package/lib/components/editor/side-bar/SideBar.d.ts.map +1 -1
  167. package/lib/components/editor/side-bar/WorkflowManager.d.ts +0 -1
  168. package/lib/components/editor/side-bar/WorkflowManager.d.ts.map +1 -1
  169. package/lib/components/editor/side-bar/WorkspaceReview.d.ts +0 -1
  170. package/lib/components/editor/side-bar/WorkspaceReview.d.ts.map +1 -1
  171. package/lib/components/editor/side-bar/WorkspaceSyncConflictResolver.d.ts +0 -1
  172. package/lib/components/editor/side-bar/WorkspaceSyncConflictResolver.d.ts.map +1 -1
  173. package/lib/components/editor/side-bar/WorkspaceUpdateConflictResolver.d.ts +0 -1
  174. package/lib/components/editor/side-bar/WorkspaceUpdateConflictResolver.d.ts.map +1 -1
  175. package/lib/components/editor/side-bar/WorkspaceUpdater.d.ts +0 -1
  176. package/lib/components/editor/side-bar/WorkspaceUpdater.d.ts.map +1 -1
  177. package/lib/components/editor/side-bar/testable/GlobalTestRunner.d.ts +0 -1
  178. package/lib/components/editor/side-bar/testable/GlobalTestRunner.d.ts.map +1 -1
  179. package/lib/components/project-viewer/ProjectViewer.d.ts.map +1 -1
  180. package/lib/components/project-viewer/ProjectViewer.js +5 -6
  181. package/lib/components/project-viewer/ProjectViewer.js.map +1 -1
  182. package/lib/components/shared/DiffView.d.ts +0 -1
  183. package/lib/components/shared/DiffView.d.ts.map +1 -1
  184. package/lib/components/shared/StudioLambdaEditor.d.ts +0 -1
  185. package/lib/components/shared/StudioLambdaEditor.d.ts.map +1 -1
  186. package/lib/components/workspace-review/WorkspaceReviewPanel.d.ts +0 -1
  187. package/lib/components/workspace-review/WorkspaceReviewPanel.d.ts.map +1 -1
  188. package/lib/components/workspace-review/WorkspaceReviewSideBar.d.ts +0 -1
  189. package/lib/components/workspace-review/WorkspaceReviewSideBar.d.ts.map +1 -1
  190. package/lib/components/workspace-setup/ProjectCreateModal.d.ts +0 -1
  191. package/lib/components/workspace-setup/ProjectCreateModal.d.ts.map +1 -1
  192. package/lib/index.css +2 -2
  193. package/lib/index.css.map +1 -1
  194. package/lib/index.d.ts +1 -1
  195. package/lib/index.d.ts.map +1 -1
  196. package/lib/index.js +1 -1
  197. package/lib/index.js.map +1 -1
  198. package/lib/package.json +5 -5
  199. package/lib/stores/DSLMapping_LegendStudioApplicationPlugin_Extension.d.ts +0 -18
  200. package/lib/stores/DSLMapping_LegendStudioApplicationPlugin_Extension.d.ts.map +1 -1
  201. package/lib/stores/DSLService_LegendStudioApplicationPlugin_Extension.d.ts +0 -10
  202. package/lib/stores/DSLService_LegendStudioApplicationPlugin_Extension.d.ts.map +1 -1
  203. package/lib/stores/EditorGraphState.d.ts.map +1 -1
  204. package/lib/stores/EditorGraphState.js +37 -9
  205. package/lib/stores/EditorGraphState.js.map +1 -1
  206. package/lib/stores/EditorStore.d.ts +2 -0
  207. package/lib/stores/EditorStore.d.ts.map +1 -1
  208. package/lib/stores/EditorStore.js +3 -0
  209. package/lib/stores/EditorStore.js.map +1 -1
  210. package/lib/stores/EmbeddedQueryBuilderState.d.ts +40 -0
  211. package/lib/stores/EmbeddedQueryBuilderState.d.ts.map +1 -0
  212. package/lib/stores/EmbeddedQueryBuilderState.js +80 -0
  213. package/lib/stores/EmbeddedQueryBuilderState.js.map +1 -0
  214. package/lib/stores/LegendStudioAppEvent.d.ts +2 -1
  215. package/lib/stores/LegendStudioAppEvent.d.ts.map +1 -1
  216. package/lib/stores/LegendStudioAppEvent.js +1 -0
  217. package/lib/stores/LegendStudioAppEvent.js.map +1 -1
  218. package/lib/stores/LegendStudioApplicationNavigationContext.d.ts +1 -0
  219. package/lib/stores/LegendStudioApplicationNavigationContext.d.ts.map +1 -1
  220. package/lib/stores/LegendStudioApplicationNavigationContext.js +1 -0
  221. package/lib/stores/LegendStudioApplicationNavigationContext.js.map +1 -1
  222. package/lib/stores/LegendStudioApplicationPlugin.d.ts +7 -7
  223. package/lib/stores/LegendStudioApplicationPlugin.d.ts.map +1 -1
  224. package/lib/stores/LegendStudioCodeSnippets.d.ts +2 -0
  225. package/lib/stores/LegendStudioCodeSnippets.d.ts.map +1 -1
  226. package/lib/stores/LegendStudioCodeSnippets.js +28 -0
  227. package/lib/stores/LegendStudioCodeSnippets.js.map +1 -1
  228. package/lib/stores/StoreRelational_LegendStudioApplicationPlugin_Extension.d.ts +13 -5
  229. package/lib/stores/StoreRelational_LegendStudioApplicationPlugin_Extension.d.ts.map +1 -1
  230. package/lib/stores/editor-state/ProjectConfigurationEditorState.d.ts +11 -1
  231. package/lib/stores/editor-state/ProjectConfigurationEditorState.d.ts.map +1 -1
  232. package/lib/stores/editor-state/ProjectConfigurationEditorState.js +66 -1
  233. package/lib/stores/editor-state/ProjectConfigurationEditorState.js.map +1 -1
  234. package/lib/stores/editor-state/element-editor-state/connection/ConnectionEditorState.js +9 -9
  235. package/lib/stores/editor-state/element-editor-state/connection/ConnectionEditorState.js.map +1 -1
  236. package/lib/stores/editor-state/element-editor-state/mapping/MappingExecutionQueryBuilderState.d.ts +29 -0
  237. package/lib/stores/editor-state/element-editor-state/mapping/MappingExecutionQueryBuilderState.d.ts.map +1 -0
  238. package/lib/stores/editor-state/element-editor-state/mapping/MappingExecutionQueryBuilderState.js +42 -0
  239. package/lib/stores/editor-state/element-editor-state/mapping/MappingExecutionQueryBuilderState.js.map +1 -0
  240. package/lib/stores/shared/DnDUtil.js +1 -1
  241. package/lib/stores/shared/PackageTreeUtil.js +6 -6
  242. package/lib/stores/shared/PackageTreeUtil.js.map +1 -1
  243. package/package.json +13 -13
  244. package/src/application/LegendStudio.tsx +8 -2
  245. package/src/application/LegendStudioPluginManager.ts +2 -2
  246. package/src/components/DSLExternalFormat_LegendStudioApplicationPlugin.tsx +5 -5
  247. package/src/components/EditorComponentTestUtils.tsx +29 -23
  248. package/src/components/EmbeddedQueryBuilder.tsx +165 -0
  249. package/src/components/editor/Editor.tsx +77 -79
  250. package/src/components/editor/edit-panel/GrammarTextEditor.tsx +24 -2
  251. package/src/components/editor/edit-panel/connection-editor/RelationalDatabaseConnectionEditor.tsx +2 -2
  252. package/src/components/editor/edit-panel/connection-editor/post-processor-editor/MapperPostProcessorEditor.tsx +1 -0
  253. package/src/components/editor/edit-panel/mapping-editor/MappingExecutionBuilder.tsx +88 -15
  254. package/src/components/editor/edit-panel/mapping-editor/MappingExecutionQueryBuilder.tsx +93 -0
  255. package/src/components/editor/edit-panel/mapping-editor/MappingTestEditor.tsx +81 -16
  256. package/src/components/editor/edit-panel/project-configuration-editor/ProjectConfigurationEditor.tsx +170 -4
  257. package/src/components/editor/edit-panel/service-editor/ServiceExecutionQueryEditor.tsx +115 -20
  258. package/src/components/editor/edit-panel/uml-editor/ClassQueryBuilder.tsx +159 -0
  259. package/src/components/editor/side-bar/Explorer.tsx +20 -10
  260. package/src/components/project-viewer/ProjectViewer.tsx +36 -38
  261. package/src/index.ts +1 -1
  262. package/src/stores/DSLMapping_LegendStudioApplicationPlugin_Extension.ts +0 -27
  263. package/src/stores/DSLService_LegendStudioApplicationPlugin_Extension.ts +0 -14
  264. package/src/stores/EditorGraphState.ts +56 -11
  265. package/src/stores/EditorStore.ts +3 -0
  266. package/src/stores/EmbeddedQueryBuilderState.ts +105 -0
  267. package/src/stores/LegendStudioAppEvent.ts +1 -0
  268. package/src/stores/LegendStudioApplicationNavigationContext.ts +1 -0
  269. package/src/stores/LegendStudioApplicationPlugin.ts +7 -7
  270. package/src/stores/LegendStudioCodeSnippets.ts +34 -0
  271. package/src/stores/StoreRelational_LegendStudioApplicationPlugin_Extension.ts +19 -5
  272. package/src/stores/editor-state/ProjectConfigurationEditorState.ts +104 -1
  273. package/src/stores/editor-state/element-editor-state/connection/ConnectionEditorState.ts +9 -9
  274. package/src/stores/editor-state/element-editor-state/mapping/MappingExecutionQueryBuilderState.ts +58 -0
  275. package/src/stores/shared/DnDUtil.ts +1 -1
  276. package/src/stores/shared/PackageTreeUtil.ts +6 -6
  277. package/tsconfig.json +5 -0
@@ -25,6 +25,9 @@ import { observer } from 'mobx-react-lite';
25
25
  import {
26
26
  ProjectConfigurationEditorState,
27
27
  CONFIGURATION_EDITOR_TAB,
28
+ DEPENDENCY_INFO_TYPE,
29
+ getDependencyTreeStringFromInfo,
30
+ getConflictsString,
28
31
  } from '../../../../stores/editor-state/ProjectConfigurationEditorState.js';
29
32
  import {
30
33
  type SelectComponent,
@@ -36,6 +39,8 @@ import {
36
39
  CheckCircleIcon,
37
40
  ExclamationCircleIcon,
38
41
  ExternalLinkSquareIcon,
42
+ ArchiveIcon,
43
+ Dialog,
39
44
  } from '@finos/legend-art';
40
45
  import { flowResult } from 'mobx';
41
46
  import {
@@ -46,6 +51,8 @@ import { useEditorStore } from '../../EditorStoreProvider.js';
46
51
  import {
47
52
  ActionAlertActionType,
48
53
  ActionAlertType,
54
+ EDITOR_LANGUAGE,
55
+ TextInputEditor,
49
56
  useApplicationStore,
50
57
  } from '@finos/legend-application';
51
58
  import { LEGEND_STUDIO_APP_EVENT } from '../../../../stores/LegendStudioAppEvent.js';
@@ -55,7 +62,9 @@ import {
55
62
  type ProjectData,
56
63
  compareSemVerVersions,
57
64
  generateGAVCoordinates,
65
+ type ProjectDependencyInfo,
58
66
  } from '@finos/legend-server-depot';
67
+ import { generateViewProjectRoute } from '../../../../stores/LegendStudioRouter.js';
59
68
 
60
69
  interface VersionOption {
61
70
  label: string;
@@ -192,14 +201,73 @@ const formatOptionLabel = (option: ProjectOption): React.ReactNode => (
192
201
  </div>
193
202
  );
194
203
 
204
+ const ProjectDependencyInfoModal = observer(
205
+ (props: {
206
+ configState: ProjectConfigurationEditorState;
207
+ info: ProjectDependencyInfo;
208
+ type: DEPENDENCY_INFO_TYPE;
209
+ }) => {
210
+ const { configState, info, type } = props;
211
+ const closeModal = (): void =>
212
+ configState.setDependencyInfoModal(undefined);
213
+ return (
214
+ <Dialog
215
+ open={Boolean(configState.dependencyInfoModalType)}
216
+ onClose={closeModal}
217
+ classes={{
218
+ root: 'editor-modal__root-container',
219
+ container: 'editor-modal__container',
220
+ paper: 'editor-modal__content',
221
+ }}
222
+ >
223
+ <div className="modal modal--dark editor-modal">
224
+ <div className="modal__header">
225
+ <div className="modal__title">{prettyCONSTName(type)}</div>
226
+ </div>
227
+ <div className="modal__body">
228
+ <div className="panel__content">
229
+ {type === DEPENDENCY_INFO_TYPE.TREE ? (
230
+ <TextInputEditor
231
+ inputValue={getDependencyTreeStringFromInfo(info)}
232
+ isReadOnly={true}
233
+ language={EDITOR_LANGUAGE.TEXT}
234
+ showMiniMap={true}
235
+ />
236
+ ) : (
237
+ <TextInputEditor
238
+ inputValue={getConflictsString(info)}
239
+ isReadOnly={true}
240
+ language={EDITOR_LANGUAGE.TEXT}
241
+ showMiniMap={true}
242
+ />
243
+ )}
244
+ </div>
245
+
246
+ <div className="modal__footer">
247
+ <button
248
+ className="btn modal__footer__close-btn"
249
+ onClick={closeModal}
250
+ >
251
+ Close
252
+ </button>
253
+ </div>
254
+ </div>
255
+ </div>
256
+ </Dialog>
257
+ );
258
+ },
259
+ );
260
+
195
261
  const ProjectDependencyEditor = observer(
196
262
  (props: {
197
263
  projectDependency: ProjectDependency;
198
264
  deleteValue: () => void;
199
265
  isReadOnly: boolean;
266
+ projects: Map<string, ProjectData>;
200
267
  }) => {
201
268
  // init
202
- const { projectDependency, deleteValue, isReadOnly } = props;
269
+ const { projectDependency, deleteValue, isReadOnly, projects } = props;
270
+ const projectDependencyData = projects.get(projectDependency.projectId);
203
271
  const editorStore = useEditorStore();
204
272
  const applicationStore = useApplicationStore();
205
273
  const projectSelectorRef = useRef<SelectComponent>(null);
@@ -228,6 +296,9 @@ const ProjectDependencyEditor = observer(
228
296
  projectDependency.setProjectId(val?.value.coordinates ?? '');
229
297
  if (val) {
230
298
  projectDependency.setVersionId(val.value.latestVersion);
299
+ flowResult(configState.fetchDependencyInfo()).catch(
300
+ applicationStore.alertUnhandledError,
301
+ );
231
302
  }
232
303
  }
233
304
  };
@@ -258,6 +329,9 @@ const ProjectDependencyEditor = observer(
258
329
  ) {
259
330
  try {
260
331
  projectDependency.setVersionId(val?.value ?? '');
332
+ flowResult(configState.fetchDependencyInfo()).catch(
333
+ applicationStore.alertUnhandledError,
334
+ );
261
335
  } catch (error) {
262
336
  assertErrorThrown(error);
263
337
  applicationStore.log.error(
@@ -267,7 +341,7 @@ const ProjectDependencyEditor = observer(
267
341
  }
268
342
  }
269
343
  };
270
- const openProject = (): void => {
344
+ const openProjectinArchive = (): void => {
271
345
  if (!projectDependency.isLegacyDependency) {
272
346
  const projectDependencyVersionId =
273
347
  projectDependency.versionId === MASTER_SNAPSHOT_ALIAS
@@ -284,6 +358,17 @@ const ProjectDependencyEditor = observer(
284
358
  );
285
359
  }
286
360
  };
361
+ // NOTE: This assumes that the dependant project is in the same studio instance as the current project
362
+ // In the future, the studio instance may be part of the project data
363
+ const openProject = (): void => {
364
+ if (projectDependencyData) {
365
+ applicationStore.navigator.openNewWindow(
366
+ applicationStore.navigator.generateLocation(
367
+ generateViewProjectRoute(projectDependencyData.projectId),
368
+ ),
369
+ );
370
+ }
371
+ };
287
372
  const projectSelectorPlaceholder = !projectDependency.projectId.length
288
373
  ? 'Choose project'
289
374
  : versionDisabled
@@ -326,7 +411,8 @@ const ProjectDependencyEditor = observer(
326
411
  disabled={
327
412
  projectDependency.isLegacyDependency ||
328
413
  !selectedProject ||
329
- !selectedVersionOption
414
+ !selectedVersionOption ||
415
+ !projectDependencyData
330
416
  }
331
417
  onClick={openProject}
332
418
  tabIndex={-1}
@@ -334,6 +420,19 @@ const ProjectDependencyEditor = observer(
334
420
  >
335
421
  <ExternalLinkSquareIcon />
336
422
  </button>
423
+ <button
424
+ className="project-dependency-editor__visit-btn btn--dark btn--sm"
425
+ disabled={
426
+ projectDependency.isLegacyDependency ||
427
+ !selectedProject ||
428
+ !selectedVersionOption
429
+ }
430
+ onClick={openProjectinArchive}
431
+ tabIndex={-1}
432
+ title={'Open Project in archive'}
433
+ >
434
+ <ArchiveIcon />
435
+ </button>
337
436
  <button
338
437
  className="project-dependency-editor__remove-btn btn--dark btn--caution"
339
438
  disabled={isReadOnly}
@@ -348,6 +447,52 @@ const ProjectDependencyEditor = observer(
348
447
  },
349
448
  );
350
449
 
450
+ const ProjectDependencyActions = observer(
451
+ (props: { config: ProjectConfigurationEditorState }) => {
452
+ const { config } = props;
453
+ const hasConflicts = config.dependencyInfo?.conflicts.length;
454
+ const viewTree = (): void => {
455
+ if (config.dependencyInfo) {
456
+ config.setDependencyInfoModal(DEPENDENCY_INFO_TYPE.TREE);
457
+ }
458
+ };
459
+ const viewConflict = (): void => {
460
+ if (config.dependencyInfo) {
461
+ config.setDependencyInfoModal(DEPENDENCY_INFO_TYPE.CONFLICTS);
462
+ }
463
+ };
464
+ return (
465
+ <div className="project-dependency-editor__info">
466
+ <button
467
+ className="project-dependency-editor__tree-btn"
468
+ tabIndex={-1}
469
+ onClick={viewTree}
470
+ disabled={
471
+ !config.dependencyInfo || !config.dependencyInfo.conflicts.length
472
+ }
473
+ title={`View dependency tree`}
474
+ >
475
+ View Dependency Tree
476
+ </button>
477
+
478
+ {Boolean(hasConflicts) && (
479
+ <button
480
+ className="project-dependency-editor__conflicts-btn"
481
+ tabIndex={-1}
482
+ onClick={viewConflict}
483
+ disabled={
484
+ !config.dependencyInfo || !config.dependencyInfo.conflicts.length
485
+ }
486
+ title={`View any conflcits in your dependencies`}
487
+ >
488
+ View Conflicts
489
+ </button>
490
+ )}
491
+ </div>
492
+ );
493
+ },
494
+ );
495
+
351
496
  export const ProjectConfigurationEditor = observer(() => {
352
497
  const editorStore = useEditorStore();
353
498
  const applicationStore = useApplicationStore();
@@ -376,8 +521,12 @@ export const ProjectConfigurationEditor = observer(() => {
376
521
  const currentProjectConfiguration = configState.currentProjectConfiguration;
377
522
  const deleteProjectDependency =
378
523
  (val: ProjectDependency): (() => void) =>
379
- (): void =>
524
+ (): void => {
380
525
  currentProjectConfiguration.deleteProjectDependency(val);
526
+ flowResult(configState.fetchDependencyInfo()).catch(
527
+ applicationStore.alertUnhandledError,
528
+ );
529
+ };
381
530
  const addValue = (): void => {
382
531
  if (!isReadOnly) {
383
532
  if (selectedTab === CONFIGURATION_EDITOR_TAB.PROJECT_DEPENDENCIES) {
@@ -389,6 +538,9 @@ export const ProjectConfigurationEditor = observer(() => {
389
538
  );
390
539
  dependencyToAdd.setVersionId(projectToAdd.latestVersion);
391
540
  currentProjectConfiguration.addProjectDependency(dependencyToAdd);
541
+ flowResult(configState.fetchDependencyInfo()).catch(
542
+ applicationStore.alertUnhandledError,
543
+ );
392
544
  } else {
393
545
  currentProjectConfiguration.addProjectDependency(
394
546
  new ProjectDependency(''),
@@ -441,6 +593,9 @@ export const ProjectConfigurationEditor = observer(() => {
441
593
  flowResult(configState.fectchAssociatedProjectsAndVersions()).catch(
442
594
  applicationStore.alertUnhandledError,
443
595
  );
596
+ flowResult(configState.fetchDependencyInfo()).catch(
597
+ applicationStore.alertUnhandledError,
598
+ );
444
599
  }
445
600
  }, [applicationStore, configState, selectedTab]);
446
601
 
@@ -510,6 +665,7 @@ export const ProjectConfigurationEditor = observer(() => {
510
665
  )}
511
666
  {selectedTab === CONFIGURATION_EDITOR_TAB.PROJECT_DEPENDENCIES && (
512
667
  <div className="panel__content__lists">
668
+ <ProjectDependencyActions config={configState} />
513
669
  {currentProjectConfiguration.projectDependencies.map(
514
670
  (projectDependency) => (
515
671
  <ProjectDependencyEditor
@@ -517,11 +673,21 @@ export const ProjectConfigurationEditor = observer(() => {
517
673
  projectDependency={projectDependency}
518
674
  deleteValue={deleteProjectDependency(projectDependency)}
519
675
  isReadOnly={isReadOnly}
676
+ projects={configState.projects}
520
677
  />
521
678
  ),
522
679
  )}
523
680
  </div>
524
681
  )}
682
+
683
+ {configState.dependencyInfo &&
684
+ configState.dependencyInfoModalType && (
685
+ <ProjectDependencyInfoModal
686
+ configState={configState}
687
+ info={configState.dependencyInfo}
688
+ type={configState.dependencyInfoModalType}
689
+ />
690
+ )}
525
691
  </div>
526
692
  </div>
527
693
  </div>
@@ -14,7 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import { Fragment, useEffect, useMemo, useRef, useState } from 'react';
17
+ import { useEffect, useMemo, useRef, useState } from 'react';
18
18
  import { observer } from 'mobx-react-lite';
19
19
  import type {
20
20
  ServicePureExecutionQueryState,
@@ -34,8 +34,9 @@ import {
34
34
  CaretDownIcon,
35
35
  MenuContentItem,
36
36
  PauseCircleIcon,
37
+ PencilIcon,
37
38
  } from '@finos/legend-art';
38
- import { debounce } from '@finos/legend-shared';
39
+ import { assertErrorThrown, debounce, hashObject } from '@finos/legend-shared';
39
40
  import { flowResult } from 'mobx';
40
41
  import { useEditorStore } from '../../EditorStoreProvider.js';
41
42
  import {
@@ -45,8 +46,16 @@ import {
45
46
  useApplicationStore,
46
47
  } from '@finos/legend-application';
47
48
  import { StudioTextInputEditor } from '../../../shared/StudioTextInputEditor.js';
48
- import type { LightQuery } from '@finos/legend-graph';
49
- import type { DSLService_LegendStudioApplicationPlugin_Extension } from '../../../../stores/DSLService_LegendStudioApplicationPlugin_Extension.js';
49
+ import {
50
+ type LightQuery,
51
+ isStubbed_PackageableElement,
52
+ isStubbed_RawLambda,
53
+ KeyedExecutionParameter,
54
+ } from '@finos/legend-graph';
55
+ import {
56
+ type QueryBuilderState,
57
+ ServiceQueryBuilderState,
58
+ } from '@finos/legend-query-builder';
50
59
 
51
60
  const ServiceExecutionResultViewer = observer(
52
61
  (props: { executionState: ServicePureExecutionState }) => {
@@ -233,22 +242,101 @@ export const ServiceExecutionQueryEditor = observer(
233
242
  isReadOnly: boolean;
234
243
  }) => {
235
244
  const { executionState, isReadOnly } = props;
236
- const queryState = executionState.queryState;
237
- const editorStore = useEditorStore();
238
245
  const applicationStore = useApplicationStore();
239
- const extraServiceQueryEditorActions = editorStore.pluginManager
240
- .getApplicationPlugins()
241
- .flatMap(
242
- (plugin) =>
243
- (
244
- plugin as DSLService_LegendStudioApplicationPlugin_Extension
245
- ).getExtraServiceQueryEditorActionConfigurations?.() ?? [],
246
- )
247
- .map((config) => (
248
- <Fragment key={config.key}>
249
- {config.renderer(executionState, isReadOnly)}
250
- </Fragment>
251
- ));
246
+ const editorStore = useEditorStore();
247
+ const queryState = executionState.queryState;
248
+
249
+ // actions
250
+ const editWithQueryBuilder = applicationStore.guardUnhandledError(
251
+ async () => {
252
+ const embeddedQueryBuilderState = editorStore.embeddedQueryBuilderState;
253
+ executionState.setOpeningQueryEditor(true);
254
+ const service = executionState.serviceEditorState.service;
255
+ const selectedExecutionState =
256
+ executionState.selectedExecutionContextState;
257
+ if (selectedExecutionState) {
258
+ const mapping = selectedExecutionState.executionContext.mapping.value;
259
+ if (!isStubbed_PackageableElement(mapping)) {
260
+ await flowResult(
261
+ embeddedQueryBuilderState.setEmbeddedQueryBuilderConfiguration({
262
+ setupQueryBuilderState: (): QueryBuilderState => {
263
+ const queryBuilderState = new ServiceQueryBuilderState(
264
+ embeddedQueryBuilderState.editorStore.applicationStore,
265
+ embeddedQueryBuilderState.editorStore.graphManagerState,
266
+ service,
267
+ selectedExecutionState.executionContext instanceof
268
+ KeyedExecutionParameter
269
+ ? selectedExecutionState.executionContext.key
270
+ : undefined,
271
+ );
272
+ queryBuilderState.initializeWithQuery(
273
+ executionState.execution.func,
274
+ );
275
+ queryBuilderState.changeDetectionState.setQueryHashCode(
276
+ hashObject(executionState.execution.func),
277
+ );
278
+ queryBuilderState.changeDetectionState.setIsEnabled(true);
279
+ return queryBuilderState;
280
+ },
281
+ actionConfigs: [
282
+ {
283
+ key: 'save-query-btn',
284
+ renderer: (
285
+ queryBuilderState: QueryBuilderState,
286
+ ): React.ReactNode => {
287
+ const save = applicationStore.guardUnhandledError(
288
+ async () => {
289
+ try {
290
+ const rawLambda = queryBuilderState.buildQuery();
291
+ await flowResult(
292
+ executionState.queryState.updateLamba(rawLambda),
293
+ );
294
+ applicationStore.notifySuccess(
295
+ `Service query is updated`,
296
+ );
297
+ queryBuilderState.changeDetectionState.setQueryHashCode(
298
+ hashObject(rawLambda),
299
+ );
300
+ embeddedQueryBuilderState.setEmbeddedQueryBuilderConfiguration(
301
+ undefined,
302
+ );
303
+ } catch (error) {
304
+ assertErrorThrown(error);
305
+ applicationStore.notifyError(
306
+ `Can't save query: ${error.message}`,
307
+ );
308
+ }
309
+ },
310
+ );
311
+
312
+ return (
313
+ <button
314
+ className="query-builder__dialog__header__custom-action"
315
+ tabIndex={-1}
316
+ disabled={isReadOnly}
317
+ onClick={save}
318
+ >
319
+ Save Query
320
+ </button>
321
+ );
322
+ },
323
+ },
324
+ ],
325
+ disableCompile: isStubbed_RawLambda(
326
+ executionState.queryState.query,
327
+ ),
328
+ }),
329
+ );
330
+ executionState.setOpeningQueryEditor(false);
331
+ return;
332
+ }
333
+ }
334
+ applicationStore.notifyWarning(
335
+ 'Please specify a mapping and a runtime for the execution context to edit with query builder',
336
+ );
337
+ executionState.setOpeningQueryEditor(false);
338
+ },
339
+ );
252
340
  const importQuery = (): void => {
253
341
  queryState.setOpenQueryImporter(true);
254
342
  };
@@ -284,7 +372,14 @@ export const ServiceExecutionQueryEditor = observer(
284
372
  </div>
285
373
  </div>
286
374
  <div className="panel__header__actions">
287
- {extraServiceQueryEditorActions}
375
+ <button
376
+ className="panel__header__action"
377
+ tabIndex={-1}
378
+ onClick={editWithQueryBuilder}
379
+ title="Edit query..."
380
+ >
381
+ <PencilIcon />
382
+ </button>
288
383
  <button
289
384
  className="panel__header__action"
290
385
  onClick={importQuery}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Copyright (c) 2020-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import {
18
+ type Class,
19
+ PackageableElementExplicitReference,
20
+ PureSingleExecution,
21
+ Service,
22
+ } from '@finos/legend-graph';
23
+ import {
24
+ type QueryBuilderState,
25
+ ClassQueryBuilderState,
26
+ } from '@finos/legend-query-builder';
27
+ import { assertErrorThrown, guaranteeNonNullable } from '@finos/legend-shared';
28
+ import { flowResult } from 'mobx';
29
+ import { observer } from 'mobx-react-lite';
30
+ import { useState } from 'react';
31
+ import type { EditorStore } from '../../../../stores/EditorStore.js';
32
+ import type { EmbeddedQueryBuilderState } from '../../../../stores/EmbeddedQueryBuilderState.js';
33
+ import {
34
+ service_initNewService,
35
+ service_setExecution,
36
+ } from '../../../../stores/graphModifier/DSLService_GraphModifierHelper.js';
37
+ import { useEditorStore } from '../../EditorStoreProvider.js';
38
+ import { NewServiceModal } from '../service-editor/NewServiceModal.js';
39
+
40
+ const promoteQueryToService = async (
41
+ packagePath: string,
42
+ serviceName: string,
43
+ embeddedQueryBuilderState: EmbeddedQueryBuilderState,
44
+ queryBuilderState: QueryBuilderState,
45
+ ): Promise<void> => {
46
+ const editorStore = embeddedQueryBuilderState.editorStore;
47
+ const applicationStore = editorStore.applicationStore;
48
+ try {
49
+ const mapping = guaranteeNonNullable(
50
+ queryBuilderState.mapping,
51
+ 'Mapping is required to create service execution',
52
+ );
53
+ const runtime = guaranteeNonNullable(
54
+ queryBuilderState.runtimeValue,
55
+ 'Runtime is required to create service execution',
56
+ );
57
+ const query = queryBuilderState.buildQuery();
58
+ const service = new Service(serviceName);
59
+ service_initNewService(service);
60
+ service_setExecution(
61
+ service,
62
+ new PureSingleExecution(
63
+ query,
64
+ service,
65
+ PackageableElementExplicitReference.create(mapping),
66
+ runtime,
67
+ ),
68
+ editorStore.changeDetectionState.observerContext,
69
+ );
70
+ await flowResult(editorStore.addElement(service, packagePath, true));
71
+ await flowResult(
72
+ embeddedQueryBuilderState.setEmbeddedQueryBuilderConfiguration(undefined),
73
+ ).catch(applicationStore.alertUnhandledError);
74
+ applicationStore.notifySuccess(`Service '${service.name}' created`);
75
+ } catch (error) {
76
+ assertErrorThrown(error);
77
+ applicationStore.notifyError(error);
78
+ }
79
+ };
80
+
81
+ const PromoteToServiceQueryBuilderAction = observer(
82
+ (props: { queryBuilderState: QueryBuilderState }) => {
83
+ const { queryBuilderState } = props;
84
+ const editorStore = useEditorStore();
85
+ const queryBuilderExtension = editorStore.embeddedQueryBuilderState;
86
+ const [openNewServiceModal, setOpenNewServiceModal] = useState(false);
87
+ const showNewServiceModal = (): void => setOpenNewServiceModal(true);
88
+ const closeNewServiceModal = (): void => setOpenNewServiceModal(false);
89
+ const allowPromoteToService = Boolean(
90
+ queryBuilderState.mapping && queryBuilderState.runtimeValue,
91
+ );
92
+ const promoteToService = async (
93
+ packagePath: string,
94
+ serviceName: string,
95
+ ): Promise<void> => {
96
+ if (allowPromoteToService) {
97
+ await promoteQueryToService(
98
+ packagePath,
99
+ serviceName,
100
+ queryBuilderExtension,
101
+ queryBuilderState,
102
+ );
103
+ }
104
+ };
105
+ return (
106
+ <>
107
+ <button
108
+ className="query-builder__dialog__header__custom-action"
109
+ tabIndex={-1}
110
+ onClick={showNewServiceModal}
111
+ disabled={!allowPromoteToService}
112
+ >
113
+ Promote to Service
114
+ </button>
115
+ {queryBuilderState.mapping && (
116
+ <NewServiceModal
117
+ mapping={queryBuilderState.mapping}
118
+ close={closeNewServiceModal}
119
+ showModal={openNewServiceModal}
120
+ promoteToService={promoteToService}
121
+ />
122
+ )}
123
+ </>
124
+ );
125
+ },
126
+ );
127
+
128
+ export const queryClass = async (
129
+ _class: Class,
130
+ editorStore: EditorStore,
131
+ ): Promise<void> => {
132
+ const embeddedQueryBuilderState = editorStore.embeddedQueryBuilderState;
133
+ await flowResult(
134
+ embeddedQueryBuilderState.setEmbeddedQueryBuilderConfiguration({
135
+ setupQueryBuilderState: () => {
136
+ const queryBuilderState = new ClassQueryBuilderState(
137
+ embeddedQueryBuilderState.editorStore.applicationStore,
138
+ embeddedQueryBuilderState.editorStore.graphManagerState,
139
+ );
140
+ queryBuilderState.changeClass(_class);
141
+ queryBuilderState.propagateClassChange(_class);
142
+ return queryBuilderState;
143
+ },
144
+ // TODO: when we modularize DSL service, we will create an extension
145
+ // mechanism for this action config
146
+ // See https://github.com/finos/legend-studio/issues/65
147
+ actionConfigs: [
148
+ {
149
+ key: 'promote-to-service-btn',
150
+ renderer: (queryBuilderState: QueryBuilderState): React.ReactNode => (
151
+ <PromoteToServiceQueryBuilderAction
152
+ queryBuilderState={queryBuilderState}
153
+ />
154
+ ),
155
+ },
156
+ ],
157
+ }),
158
+ );
159
+ };
@@ -75,10 +75,12 @@ import {
75
75
  isSystemElement,
76
76
  isDependencyElement,
77
77
  isElementReadOnly,
78
+ Class,
78
79
  } from '@finos/legend-graph';
79
80
  import { useApplicationStore } from '@finos/legend-application';
80
81
  import { PACKAGEABLE_ELEMENT_TYPE } from '../../../stores/shared/ModelUtil.js';
81
82
  import { useLegendStudioApplicationStore } from '../../LegendStudioBaseStoreProvider.js';
83
+ import { queryClass } from '../edit-panel/uml-editor/ClassQueryBuilder.js';
82
84
 
83
85
  const ElementRenamer = observer(() => {
84
86
  const editorStore = useEditorStore();
@@ -198,6 +200,23 @@ const ExplorerContextMenu = observer(
198
200
  ? node.packageableElement
199
201
  : undefined
200
202
  : editorStore.graphManagerState.graph.root;
203
+ const elementTypes = ([PACKAGEABLE_ELEMENT_TYPE.PACKAGE] as string[])
204
+ .concat(editorStore.getSupportedElementTypes())
205
+ .filter(
206
+ // NOTE: we can only create package in root
207
+ (type) =>
208
+ _package !== editorStore.graphManagerState.graph.root ||
209
+ type === PACKAGEABLE_ELEMENT_TYPE.PACKAGE,
210
+ );
211
+
212
+ // actions
213
+ const buildQuery = editorStore.applicationStore.guardUnhandledError(
214
+ async () => {
215
+ if (node?.packageableElement instanceof Class) {
216
+ await queryClass(node.packageableElement, editorStore);
217
+ }
218
+ },
219
+ );
201
220
  const removeElement = (): void => {
202
221
  if (node) {
203
222
  flowResult(editorStore.deleteElement(node.packageableElement)).catch(
@@ -237,21 +256,11 @@ const ExplorerContextMenu = observer(
237
256
  .catch(applicationStore.alertUnhandledError);
238
257
  }
239
258
  };
240
-
241
259
  const createNewElement =
242
260
  (type: string): (() => void) =>
243
261
  (): void =>
244
262
  editorStore.newElementState.openModal(type, _package);
245
263
 
246
- const elementTypes = ([PACKAGEABLE_ELEMENT_TYPE.PACKAGE] as string[])
247
- .concat(editorStore.getSupportedElementTypes())
248
- .filter(
249
- // NOTE: we can only create package in root
250
- (type) =>
251
- _package !== editorStore.graphManagerState.graph.root ||
252
- type === PACKAGEABLE_ELEMENT_TYPE.PACKAGE,
253
- );
254
-
255
264
  if (_package && !isReadOnly) {
256
265
  return (
257
266
  <MenuContent data-testid={LEGEND_STUDIO_TEST_ID.EXPLORER_CONTEXT_MENU}>
@@ -281,6 +290,7 @@ const ExplorerContextMenu = observer(
281
290
 
282
291
  return (
283
292
  <MenuContent data-testid={LEGEND_STUDIO_TEST_ID.EXPLORER_CONTEXT_MENU}>
293
+ <MenuContentItem onClick={buildQuery}>Query...</MenuContentItem>
284
294
  {extraExplorerContextMenuItems}
285
295
  {!isReadOnly && node && (
286
296
  <>