@elyx-code/editor-ui 0.0.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 (452) hide show
  1. package/README.md +2 -0
  2. package/package.json +109 -0
  3. package/src/App.tsx +31 -0
  4. package/src/Router.tsx +115 -0
  5. package/src/__mocks__/defaultModuleMock.ts +1 -0
  6. package/src/__mocks__/fileMock.ts +1 -0
  7. package/src/__mocks__/styleMock.ts +1 -0
  8. package/src/assets/Clock-11.1s-18px.svg +16 -0
  9. package/src/assets/Clock-11.1s-28px.svg +16 -0
  10. package/src/assets/authentication.svg +1 -0
  11. package/src/assets/canvas-backdrop-0.png +0 -0
  12. package/src/assets/canvas-backdrop-1.png +0 -0
  13. package/src/assets/canvas-backdrop-2.png +0 -0
  14. package/src/assets/canvas-backdrop-3.png +0 -0
  15. package/src/assets/canvas-backdrop-4.png +0 -0
  16. package/src/assets/canvas-backdrop-5.png +0 -0
  17. package/src/assets/canvas-backdrop.png +0 -0
  18. package/src/assets/checkmark-animation.gif +0 -0
  19. package/src/assets/checkmark-animation.mp4 +0 -0
  20. package/src/assets/code-formatting/format-black.svg +6 -0
  21. package/src/assets/code-formatting/format-dark-grey.svg +6 -0
  22. package/src/assets/code-formatting/format-light-grey.svg +6 -0
  23. package/src/assets/code-formatting/format-white.svg +6 -0
  24. package/src/assets/code-formatting/inline-black.svg +5 -0
  25. package/src/assets/code-formatting/inline-dark-grey.svg +5 -0
  26. package/src/assets/code-formatting/inline-light-grey.svg +5 -0
  27. package/src/assets/code-formatting/inline-white.svg +5 -0
  28. package/src/assets/contained-logo-full-word.png +0 -0
  29. package/src/assets/cron-job-color.png +0 -0
  30. package/src/assets/cron-job.png +0 -0
  31. package/src/assets/database-table-color.png +0 -0
  32. package/src/assets/database-table.png +0 -0
  33. package/src/assets/datatype-icons/black/any.svg +1 -0
  34. package/src/assets/datatype-icons/black/binary.svg +1 -0
  35. package/src/assets/datatype-icons/black/boolean.svg +3 -0
  36. package/src/assets/datatype-icons/black/date-time.svg +3 -0
  37. package/src/assets/datatype-icons/black/definition-entity.svg +6 -0
  38. package/src/assets/datatype-icons/black/key-file.svg +1 -0
  39. package/src/assets/datatype-icons/black/list.svg +3 -0
  40. package/src/assets/datatype-icons/black/null.svg +3 -0
  41. package/src/assets/datatype-icons/black/number.svg +13 -0
  42. package/src/assets/datatype-icons/black/project.svg +12 -0
  43. package/src/assets/datatype-icons/black/sql-program.svg +2 -0
  44. package/src/assets/datatype-icons/black/text.svg +3 -0
  45. package/src/assets/datatype-icons/black/unknown.svg +3 -0
  46. package/src/assets/datatype-icons/black/uuid.svg +4 -0
  47. package/src/assets/datatype-icons/black/void.svg +1 -0
  48. package/src/assets/datatype-icons/dark-grey/any.svg +1 -0
  49. package/src/assets/datatype-icons/dark-grey/boolean.svg +3 -0
  50. package/src/assets/datatype-icons/dark-grey/date-time.svg +3 -0
  51. package/src/assets/datatype-icons/dark-grey/definition-entity.svg +6 -0
  52. package/src/assets/datatype-icons/dark-grey/list.svg +3 -0
  53. package/src/assets/datatype-icons/dark-grey/null.svg +3 -0
  54. package/src/assets/datatype-icons/dark-grey/number.svg +13 -0
  55. package/src/assets/datatype-icons/dark-grey/project.svg +12 -0
  56. package/src/assets/datatype-icons/dark-grey/sql-program.svg +2 -0
  57. package/src/assets/datatype-icons/dark-grey/text.svg +3 -0
  58. package/src/assets/datatype-icons/dark-grey/unknown.svg +3 -0
  59. package/src/assets/datatype-icons/dark-grey/uuid.svg +4 -0
  60. package/src/assets/datatype-icons/dark-grey/void.svg +1 -0
  61. package/src/assets/datatype-icons/light-grey/any.svg +1 -0
  62. package/src/assets/datatype-icons/light-grey/boolean.svg +3 -0
  63. package/src/assets/datatype-icons/light-grey/date-time.svg +3 -0
  64. package/src/assets/datatype-icons/light-grey/definition-entity.svg +6 -0
  65. package/src/assets/datatype-icons/light-grey/list.svg +3 -0
  66. package/src/assets/datatype-icons/light-grey/null.svg +3 -0
  67. package/src/assets/datatype-icons/light-grey/number.svg +13 -0
  68. package/src/assets/datatype-icons/light-grey/project.svg +12 -0
  69. package/src/assets/datatype-icons/light-grey/sql-program.svg +2 -0
  70. package/src/assets/datatype-icons/light-grey/text.svg +3 -0
  71. package/src/assets/datatype-icons/light-grey/unknown.svg +3 -0
  72. package/src/assets/datatype-icons/light-grey/uuid.svg +4 -0
  73. package/src/assets/datatype-icons/light-grey/void.svg +1 -0
  74. package/src/assets/edit.png +0 -0
  75. package/src/assets/execution.svg +13 -0
  76. package/src/assets/favicon.svg +14 -0
  77. package/src/assets/file-search.svg +1 -0
  78. package/src/assets/http-endpoint.png +0 -0
  79. package/src/assets/image-input-placeholder.png +0 -0
  80. package/src/assets/logo-full-word-white.png +0 -0
  81. package/src/assets/logo-full-word.png +0 -0
  82. package/src/assets/password.svg +85 -0
  83. package/src/assets/pencil.png +0 -0
  84. package/src/assets/publish-project-rich-icon-2.svg +1 -0
  85. package/src/assets/publish-project-rich-icon.svg +1 -0
  86. package/src/assets/relational-database.png +0 -0
  87. package/src/assets/resources.svg +3 -0
  88. package/src/assets/resume-icon-14px.png +0 -0
  89. package/src/assets/server.png +0 -0
  90. package/src/assets/small-status/checkmark.svg +4 -0
  91. package/src/assets/small-status/error.svg +4 -0
  92. package/src/assets/small-status/loading.svg +4 -0
  93. package/src/assets/small-status/skipped.svg +11 -0
  94. package/src/assets/sql-connection-config.svg +1 -0
  95. package/src/assets/sql-row-transformer.svg +1 -0
  96. package/src/assets/ssl-certificate-config.svg +1 -0
  97. package/src/assets/sync.svg +1 -0
  98. package/src/assets/testing-logic-icon.svg +1 -0
  99. package/src/assets/versions.svg +25 -0
  100. package/src/assets/visual-programming-icon.svg +1 -0
  101. package/src/assets/warning-sign-24px.png +0 -0
  102. package/src/auth/index.ts +318 -0
  103. package/src/components/DialogLoader.tsx +94 -0
  104. package/src/components/EntityDialogHeader.tsx +110 -0
  105. package/src/components/EntityDialogSectionHeader.tsx +214 -0
  106. package/src/components/GalleryAddExternalIntegrationInfoDialog.tsx +87 -0
  107. package/src/components/GenerateProjectStartingLogicPromptDialog.tsx +281 -0
  108. package/src/components/LegacyRouteRedirector.tsx +55 -0
  109. package/src/components/ProPlanChip.tsx +23 -0
  110. package/src/components/ReportBugDialog.tsx +412 -0
  111. package/src/components/RequestIntegrationAccessDialog.tsx +261 -0
  112. package/src/components/UseTemplateProjectDialog.tsx +193 -0
  113. package/src/components/WorkspaceLayout.tsx +152 -0
  114. package/src/components/animated-svg/AnimatedCheckmark.tsx +41 -0
  115. package/src/components/animated-svg/AnimatedCrossmark.tsx +51 -0
  116. package/src/components/animated-svg/AnimatedEmailSending.tsx +38 -0
  117. package/src/components/animated-svg/AnimatedLoading.tsx +72 -0
  118. package/src/components/animated-svg/animated-svg.css +239 -0
  119. package/src/components/canvas/Canvas.tsx +16 -0
  120. package/src/components/canvas/CreateEntityMenu.tsx +2020 -0
  121. package/src/components/canvas/canvas.css +10 -0
  122. package/src/components/canvas/create-entity-menu.css +579 -0
  123. package/src/components/canvas-search/CanvasSearch.tsx +501 -0
  124. package/src/components/canvas-search/canvas-search.css +126 -0
  125. package/src/components/canvas-settings-menu/CanvasSettingsMenuButton.tsx +515 -0
  126. package/src/components/canvas-settings-menu/canvas-settings-menu.css +96 -0
  127. package/src/components/circular-image-upload/CircularImageUpload.tsx +113 -0
  128. package/src/components/circular-image-upload/circular-image-upload.css +69 -0
  129. package/src/components/costs/CostsDialog.tsx +459 -0
  130. package/src/components/data-type/DataTypeBuilder.tsx +3127 -0
  131. package/src/components/data-type/data-type-builder.css +45 -0
  132. package/src/components/dialogs/BetaAcknowledgeDialog.tsx +43 -0
  133. package/src/components/dialogs/ComplexDataDialog.tsx +458 -0
  134. package/src/components/dialogs/CronBuilderDialog.tsx +2145 -0
  135. package/src/components/dialogs/ExternalIntegrationConnections.tsx +565 -0
  136. package/src/components/dialogs/JsonEditorDialog.tsx +1392 -0
  137. package/src/components/dialogs/StringEditorDialog.tsx +268 -0
  138. package/src/components/dialogs/argument-declaration/ArgumentDeclaration.tsx +1167 -0
  139. package/src/components/dialogs/argument-declaration/ArgumentDeclarationDialogContent.tsx +128 -0
  140. package/src/components/dialogs/beta-dialog.css +165 -0
  141. package/src/components/dialogs/condition/Condition.tsx +431 -0
  142. package/src/components/dialogs/condition/ConditionDialogContent.tsx +126 -0
  143. package/src/components/dialogs/definition-entity/DefinitionEntityDialogContent.tsx +973 -0
  144. package/src/components/dialogs/function-call/FunctionCall.tsx +442 -0
  145. package/src/components/dialogs/function-call/FunctionCallDialogContent.tsx +126 -0
  146. package/src/components/dialogs/function-declaration/FunctionDeclaration.tsx +926 -0
  147. package/src/components/dialogs/function-declaration/FunctionDeclarationDialogContent.tsx +124 -0
  148. package/src/components/dialogs/generating-project-starting-logic-overlay/GeneratingProjectStartingLogicOverlay.tsx +176 -0
  149. package/src/components/dialogs/generating-project-starting-logic-overlay/generating-project-starting-logic-overlay.css +13 -0
  150. package/src/components/dialogs/global-event/GlobalEvent.tsx +475 -0
  151. package/src/components/dialogs/global-event/GlobalEventDialogContent.tsx +126 -0
  152. package/src/components/dialogs/help/HelpDialog.tsx +217 -0
  153. package/src/components/dialogs/help/HelpDilalogHomeContent.tsx +178 -0
  154. package/src/components/dialogs/help/help-dialog.css +116 -0
  155. package/src/components/dialogs/help/help-icon/HelpIconButton.tsx +41 -0
  156. package/src/components/dialogs/help/help-icon/help-icon.css +9 -0
  157. package/src/components/dialogs/input-map/InputMap.tsx +635 -0
  158. package/src/components/dialogs/input-map/InputMapDialogContent.tsx +126 -0
  159. package/src/components/dialogs/json-editor-dialog.css +4 -0
  160. package/src/components/dialogs/loop/Loop.tsx +650 -0
  161. package/src/components/dialogs/loop/LoopDialogContent.tsx +122 -0
  162. package/src/components/dialogs/operation/Operation.tsx +440 -0
  163. package/src/components/dialogs/operation/OperationDialogContent.tsx +126 -0
  164. package/src/components/dialogs/output-map/OutputMap.tsx +536 -0
  165. package/src/components/dialogs/output-map/OutputMapDialogContent.tsx +126 -0
  166. package/src/components/dialogs/property/Property.tsx +1490 -0
  167. package/src/components/dialogs/property/PropertyDialogContent.tsx +106 -0
  168. package/src/components/dialogs/search-statement/ColumnSelector.tsx +334 -0
  169. package/src/components/dialogs/search-statement/ConditionBuilder.tsx +750 -0
  170. package/src/components/dialogs/search-statement/DataAggregationSection.tsx +621 -0
  171. package/src/components/dialogs/search-statement/DataSourceSelection.tsx +734 -0
  172. package/src/components/dialogs/search-statement/EntityMetadataSection.tsx +135 -0
  173. package/src/components/dialogs/search-statement/FilterConditionsSection.tsx +151 -0
  174. package/src/components/dialogs/search-statement/InlineInputMap.tsx +153 -0
  175. package/src/components/dialogs/search-statement/LiteralValue.tsx +616 -0
  176. package/src/components/dialogs/search-statement/MainSourceAndInputsSection.tsx +271 -0
  177. package/src/components/dialogs/search-statement/NestedSearchStatementBuilder.tsx +170 -0
  178. package/src/components/dialogs/search-statement/OutputFormatSection.tsx +1779 -0
  179. package/src/components/dialogs/search-statement/ResultsSection.tsx +344 -0
  180. package/src/components/dialogs/search-statement/SearchStatementBuilder.tsx +251 -0
  181. package/src/components/dialogs/search-statement/SearchStatementDialogContent.tsx +398 -0
  182. package/src/components/dialogs/search-statement/ValueSelector.tsx +766 -0
  183. package/src/components/dialogs/search-statement/search-statement-context.tsx +1630 -0
  184. package/src/components/dialogs/search-statement/search-statement-dialog.css +56 -0
  185. package/src/components/dialogs/search-statement/test.sql +111 -0
  186. package/src/components/dialogs/value-descriptor/ValueDescriptor.tsx +824 -0
  187. package/src/components/dialogs/value-descriptor/ValueDescriptorDialogContent.tsx +124 -0
  188. package/src/components/dialogs/variable-declaration/VariableDeclaration.tsx +836 -0
  189. package/src/components/dialogs/variable-declaration/VariableDeclarationDialogContent.tsx +106 -0
  190. package/src/components/dialogs/variable-instance/VariableInstance.tsx +443 -0
  191. package/src/components/dialogs/variable-instance/VariableInstanceDialogContent.tsx +124 -0
  192. package/src/components/draggable-entity-card/ArgumentDeclaration.tsx +736 -0
  193. package/src/components/draggable-entity-card/CollapseEntityButton.tsx +170 -0
  194. package/src/components/draggable-entity-card/ConditionCard.tsx +1062 -0
  195. package/src/components/draggable-entity-card/ConnectionDeleteButton.tsx +309 -0
  196. package/src/components/draggable-entity-card/DataTypeIcon.tsx +624 -0
  197. package/src/components/draggable-entity-card/DraggableEntityCard.tsx +617 -0
  198. package/src/components/draggable-entity-card/ErrorMapProperty.tsx +464 -0
  199. package/src/components/draggable-entity-card/EventCard.tsx +700 -0
  200. package/src/components/draggable-entity-card/ExecutionInProgressValue.tsx +327 -0
  201. package/src/components/draggable-entity-card/FunctionDeclarationCard.tsx +819 -0
  202. package/src/components/draggable-entity-card/InputMapProperty.tsx +1067 -0
  203. package/src/components/draggable-entity-card/InternalCall.tsx +978 -0
  204. package/src/components/draggable-entity-card/InternalCallExecutionNode.tsx +643 -0
  205. package/src/components/draggable-entity-card/LogicScopeCallerNode.tsx +262 -0
  206. package/src/components/draggable-entity-card/LoopCard.tsx +791 -0
  207. package/src/components/draggable-entity-card/MainValueInput.tsx +523 -0
  208. package/src/components/draggable-entity-card/MainValueOutput.tsx +458 -0
  209. package/src/components/draggable-entity-card/MethodDeclaration.tsx +1088 -0
  210. package/src/components/draggable-entity-card/NestedCondition.tsx +1025 -0
  211. package/src/components/draggable-entity-card/OutputMapProperty.tsx +843 -0
  212. package/src/components/draggable-entity-card/PassthroughEntityCard.tsx +1247 -0
  213. package/src/components/draggable-entity-card/ReturnedError.tsx +549 -0
  214. package/src/components/draggable-entity-card/SmallSuccessFailureNodes.tsx +523 -0
  215. package/src/components/draggable-entity-card/SuccessFailureNodes.tsx +509 -0
  216. package/src/components/draggable-entity-card/TestEntityButton.tsx +946 -0
  217. package/src/components/draggable-entity-card/TestMenu.tsx +523 -0
  218. package/src/components/draggable-entity-card/TestMenuValidationDropdown.tsx +84 -0
  219. package/src/components/draggable-entity-card/UnreachableMarker.tsx +114 -0
  220. package/src/components/draggable-entity-card/VariableCard.tsx +1577 -0
  221. package/src/components/draggable-entity-card/VariableScopeMarker.tsx +117 -0
  222. package/src/components/draggable-entity-card/collapse-entity-button.css +44 -0
  223. package/src/components/draggable-entity-card/definition-entity/DefinitionEntityCard.tsx +1181 -0
  224. package/src/components/draggable-entity-card/definition-entity/DefinitionEntityIcon.tsx +36 -0
  225. package/src/components/draggable-entity-card/definition-entity/DefinitionEntityProperty.tsx +478 -0
  226. package/src/components/draggable-entity-card/definition-entity/DynamicFooterActions.tsx +112 -0
  227. package/src/components/draggable-entity-card/definition-entity/actions/external-integration-connection/ExportCredentialsFooterAction.tsx +461 -0
  228. package/src/components/draggable-entity-card/definition-entity/actions/external-integration-connection/RestablishConnectionFooterAction.tsx +199 -0
  229. package/src/components/draggable-entity-card/definition-entity/actions/external-integration-connection/restablish-connection-footer-action.css +85 -0
  230. package/src/components/draggable-entity-card/definition-entity/actions/google-drive/GoogleDriveFilePickerAPIFooterAction.tsx +277 -0
  231. package/src/components/draggable-entity-card/definition-entity/actions/google-drive/google-drive-file-picker-api-footer-action.css +107 -0
  232. package/src/components/draggable-entity-card/definition-entity/actions/persisted-entity/DatabaseFooterAction.tsx +452 -0
  233. package/src/components/draggable-entity-card/definition-entity/actions/persisted-entity/database-footer-action.css +86 -0
  234. package/src/components/draggable-entity-card/definition-entity/definition-entity-card.css +17 -0
  235. package/src/components/draggable-entity-card/draggable-entity-card.css +1140 -0
  236. package/src/components/draggable-entity-card/entity-locked-icon/EntityLockedIcon.tsx +133 -0
  237. package/src/components/draggable-entity-card/entity-locked-icon/entity-locked.css +8 -0
  238. package/src/components/draggable-entity-card/expand-properties-icon-button/ExpandPropertiesIconButton.tsx +84 -0
  239. package/src/components/draggable-entity-card/expand-properties-icon-button/expand-properties-icon-button.css +21 -0
  240. package/src/components/draggable-entity-card/implement-entity-icon/ImplementEntityIcon.tsx +74 -0
  241. package/src/components/draggable-entity-card/implement-entity-icon/implement-entity-icon.css +13 -0
  242. package/src/components/draggable-entity-card/logic-error/LogicErrorIconMenu.tsx +424 -0
  243. package/src/components/draggable-entity-card/logic-error/logic-error.css +23 -0
  244. package/src/components/draggable-entity-card/new-card-input-button/NewCardInputButton.tsx +193 -0
  245. package/src/components/draggable-entity-card/new-card-input-button/NewDynamicInputButton.tsx +214 -0
  246. package/src/components/draggable-entity-card/new-card-input-button/new-card-input-button.css +71 -0
  247. package/src/components/draggable-entity-card/new-card-output-button/NewCardOutputButton.tsx +192 -0
  248. package/src/components/draggable-entity-card/new-card-output-button/new-card-output-button.css +71 -0
  249. package/src/components/draggable-entity-card/termination-statement/TerminationStatementCard.tsx +1543 -0
  250. package/src/components/draggable-entity-card/termination-statement/termination-statement-card.css +17 -0
  251. package/src/components/draggable-entity-card/test-entity-button.css +55 -0
  252. package/src/components/draggable-entity-card/test-menu.css +181 -0
  253. package/src/components/draggable-entity-card/unreachable-marker.css +43 -0
  254. package/src/components/draggable-entity-card/variable-scope-marker.css +22 -0
  255. package/src/components/dynamic-value/DynamicValue.tsx +2395 -0
  256. package/src/components/dynamic-value/DynamicValueEntry.tsx +1957 -0
  257. package/src/components/dynamic-value/dynamic-value.css +230 -0
  258. package/src/components/editor/ElyxMonacoEditor.tsx +38 -0
  259. package/src/components/entity-error/EntityErrorListItem.tsx +47 -0
  260. package/src/components/entity-error/entity-error.css +198 -0
  261. package/src/components/entity-icon/EntityIcon.tsx +292 -0
  262. package/src/components/entity-icon/entity-icon.css +39 -0
  263. package/src/components/gallery-card/CreateNewProject.tsx +222 -0
  264. package/src/components/gallery-card/GalleryCard.tsx +171 -0
  265. package/src/components/gallery-card/MarketplaceCard.tsx +87 -0
  266. package/src/components/gallery-card/ProjectDuplicationCard.tsx +575 -0
  267. package/src/components/gallery-card/gallery-card.css +25 -0
  268. package/src/components/notifications/NotificationsIconButton.tsx +124 -0
  269. package/src/components/notifications/NotificationsPanel.tsx +385 -0
  270. package/src/components/notifications/notifications.css +189 -0
  271. package/src/components/online-users/LocalOnlineUsers.tsx +175 -0
  272. package/src/components/online-users/PageOnlineUsers.tsx +297 -0
  273. package/src/components/online-users/online-users.css +72 -0
  274. package/src/components/page-backdrop/PageBackdrop.tsx +8 -0
  275. package/src/components/page-backdrop/page-backdrop.css +7 -0
  276. package/src/components/project-configuration/DeleteProjectConfirmationDialog.tsx +134 -0
  277. package/src/components/project-configuration/ProjectConfigurationDialog.tsx +972 -0
  278. package/src/components/project-configuration/ProjectDataForm.tsx +121 -0
  279. package/src/components/project-configuration/UnpublishProjectConfirmationDialog.tsx +162 -0
  280. package/src/components/project-configuration/project-configuration-content.css +209 -0
  281. package/src/components/project-name/ProjectName.tsx +2025 -0
  282. package/src/components/project-name/project-name.css +599 -0
  283. package/src/components/publishing/Publication.tsx +133 -0
  284. package/src/components/publishing/history/PublicationHistoryContent.tsx +414 -0
  285. package/src/components/publishing/history/PublicationHistoryDialog.tsx +234 -0
  286. package/src/components/publishing/preview/PublicationPreviewDialog.tsx +1158 -0
  287. package/src/components/publishing/preview/PublishingPriceForecast.tsx +160 -0
  288. package/src/components/publishing/preview/PublishingResourcesDetails.tsx +91 -0
  289. package/src/components/publishing/publication-sequence/PublishingSequenceContent.tsx +375 -0
  290. package/src/components/publishing/publication-sequence/PublishingSequenceDialog.tsx +344 -0
  291. package/src/components/publishing/publishing-dialog.css +142 -0
  292. package/src/components/publishing/utils.ts +227 -0
  293. package/src/components/resources/ResourcesDialog.tsx +591 -0
  294. package/src/components/resources/UpgradeBanner.tsx +102 -0
  295. package/src/components/resources/codebase/CodebaseDetails.tsx +156 -0
  296. package/src/components/resources/cron-job/CronJobsList.tsx +532 -0
  297. package/src/components/resources/functions/FunctionsList.tsx +454 -0
  298. package/src/components/resources/http-api/HttpAPI.tsx +566 -0
  299. package/src/components/resources/http-api/HttpAPIClientModule.tsx +37 -0
  300. package/src/components/resources/logs/LogsViewer.tsx +768 -0
  301. package/src/components/resources/query.ts +74 -0
  302. package/src/components/resources/relational-database/DatabaseTable.tsx +905 -0
  303. package/src/components/resources/relational-database/RelationalDatabase.tsx +83 -0
  304. package/src/components/resources/relational-database/RelationalDatabaseSecrets.tsx +361 -0
  305. package/src/components/resources/resources-dialog.css +74 -0
  306. package/src/components/test-relational-database/DatabaseTable.tsx +913 -0
  307. package/src/components/test-relational-database/TestDatabaseDialogContent.tsx +670 -0
  308. package/src/components/test-relational-database/query.ts +74 -0
  309. package/src/components/toolbar/ToolBar.tsx +236 -0
  310. package/src/components/toolbar/toolbar.css +78 -0
  311. package/src/components/transaction-history/TransactionHistoryDialog.tsx +268 -0
  312. package/src/components/user/CurrentUserAvatar.tsx +65 -0
  313. package/src/components/user/UserChip.tsx +62 -0
  314. package/src/components/user/user.css +39 -0
  315. package/src/components/user-profile/ChangePasswordForm.tsx +67 -0
  316. package/src/components/user-profile/OwnUserProfileContent.tsx +665 -0
  317. package/src/components/user-profile/PublicUserProfileContent.tsx +99 -0
  318. package/src/components/user-profile/UserDataForm.tsx +75 -0
  319. package/src/components/user-profile/UserProfileDialog.tsx +110 -0
  320. package/src/components/user-profile/user-profile-content.css +25 -0
  321. package/src/config.ts +130 -0
  322. package/src/globals.d.ts +13 -0
  323. package/src/index.html +27 -0
  324. package/src/index.tsx +23 -0
  325. package/src/lib/badge/Badge.tsx +35 -0
  326. package/src/lib/badge/badge.css +32 -0
  327. package/src/lib/button/Button.tsx +129 -0
  328. package/src/lib/button/button.css +145 -0
  329. package/src/lib/canvas/canvas-undo-redo.ts +263 -0
  330. package/src/lib/canvas/defs.ts +170 -0
  331. package/src/lib/canvas/index.test.ts +189 -0
  332. package/src/lib/canvas/index.ts +6999 -0
  333. package/src/lib/canvas/utils.ts +59 -0
  334. package/src/lib/card/Card.tsx +62 -0
  335. package/src/lib/card/LoadingCard.tsx +82 -0
  336. package/src/lib/card/card.css +259 -0
  337. package/src/lib/chip/Chip.tsx +79 -0
  338. package/src/lib/chip/chip.css +0 -0
  339. package/src/lib/dialog/Dialog.tsx +122 -0
  340. package/src/lib/dialog/SmallDialog.tsx +61 -0
  341. package/src/lib/dialog/dialog.css +40 -0
  342. package/src/lib/display-data-structure/index.tsx +21 -0
  343. package/src/lib/dropdown/CanvasDropdownMenuCard.tsx +68 -0
  344. package/src/lib/dropdown/CanvasDropdownMenuCardOption.tsx +136 -0
  345. package/src/lib/dropdown/DropdownButton.tsx +104 -0
  346. package/src/lib/dropdown/DropdownMenuCard.tsx +324 -0
  347. package/src/lib/dropdown/DropdownMenuPopup.tsx +27 -0
  348. package/src/lib/dropdown/dropdown-button.css +76 -0
  349. package/src/lib/dropdown/dropdown-menu.css +151 -0
  350. package/src/lib/json-editor/RawJsonEditor.tsx +137 -0
  351. package/src/lib/json-editor/json-editor.css +35 -0
  352. package/src/lib/loader/Loader.tsx +120 -0
  353. package/src/lib/loader/loader.css +38 -0
  354. package/src/lib/pagination/Pagination.tsx +64 -0
  355. package/src/lib/popup/CanvasPopupBaseComponent.tsx +103 -0
  356. package/src/lib/popup/Popup.tsx +243 -0
  357. package/src/lib/popup/popup.css +16 -0
  358. package/src/lib/table/RowForm.tsx +301 -0
  359. package/src/lib/table/Table.tsx +1069 -0
  360. package/src/lib/table/table.css +249 -0
  361. package/src/lib/table/types.ts +108 -0
  362. package/src/lib/text-area/TextArea.tsx +183 -0
  363. package/src/lib/text-area/text-area.css +156 -0
  364. package/src/lib/text-field/TextField.tsx +218 -0
  365. package/src/lib/text-field/index.ts +8 -0
  366. package/src/lib/text-field/text-field.css +201 -0
  367. package/src/lib/tooltip/Tooltip.tsx +24 -0
  368. package/src/lib/tooltip/tooltip.css +17 -0
  369. package/src/localization/index.ts +47 -0
  370. package/src/main.css +343 -0
  371. package/src/pages/Auth.tsx +848 -0
  372. package/src/pages/Editor.tsx +883 -0
  373. package/src/pages/ErrorPage.tsx +179 -0
  374. package/src/pages/Gallery.tsx +1693 -0
  375. package/src/pages/NewPaymentMethodCallback.tsx +53 -0
  376. package/src/pages/NotFoundPage.tsx +126 -0
  377. package/src/pages/PricingPlans.tsx +155 -0
  378. package/src/pages/auth.css +304 -0
  379. package/src/pages/gallery.css +421 -0
  380. package/src/payments/index.ts +187 -0
  381. package/src/popup-notification/index.ts +90 -0
  382. package/src/services/database/index.ts +1 -0
  383. package/src/services/database/utils.ts +1301 -0
  384. package/src/services/editor/CanvasElement.tsx +2934 -0
  385. package/src/services/editor/CanvasElementConnectionDeleteButton.ts +204 -0
  386. package/src/services/editor/CanvasPopup.tsx +749 -0
  387. package/src/services/editor/EditorService.ts +8157 -0
  388. package/src/services/editor/area.ts +1312 -0
  389. package/src/services/editor/connections.ts +1019 -0
  390. package/src/services/editor/create/condition.ts +25 -0
  391. package/src/services/editor/create/definition-entity.ts +29 -0
  392. package/src/services/editor/create/function-call.ts +25 -0
  393. package/src/services/editor/create/global-event.ts +33 -0
  394. package/src/services/editor/create/loop.ts +25 -0
  395. package/src/services/editor/create/operation.ts +30 -0
  396. package/src/services/editor/create/utils.ts +140 -0
  397. package/src/services/editor/create/variable-declaration.ts +135 -0
  398. package/src/services/editor/create/variable-instance.ts +100 -0
  399. package/src/services/editor/editor-ui-extensions-context.ts +43 -0
  400. package/src/services/editor/entities-metadata.json +9310 -0
  401. package/src/services/editor/icons.ts +1093 -0
  402. package/src/services/editor/index.ts +1 -0
  403. package/src/services/editor/layout.ts +102 -0
  404. package/src/services/editor/modules/built-in-function-implementations/base.ts +14 -0
  405. package/src/services/editor/modules/built-in-function-implementations/create-persisted-entity/index.ts +56 -0
  406. package/src/services/editor/modules/built-in-function-implementations/delete-persisted-entity/index.ts +55 -0
  407. package/src/services/editor/modules/built-in-function-implementations/index.ts +4 -0
  408. package/src/services/editor/modules/built-in-function-implementations/update-persisted-entity/index.ts +56 -0
  409. package/src/services/editor/modules/operations-implementations/external-integrations/google-drive/get-files.ts +183 -0
  410. package/src/services/editor/modules/operations-implementations/external-integrations/google-drive/list-drives.ts +124 -0
  411. package/src/services/editor/modules/operations-implementations/external-integrations/google-drive/list-root-folders.ts +125 -0
  412. package/src/services/editor/modules/operations-implementations/external-integrations/google-drive/smart-fetch-document.ts +702 -0
  413. package/src/services/editor/modules/operations-implementations/external-integrations/google-drive/upload-document.ts +535 -0
  414. package/src/services/editor/modules/operations-implementations/external-integrations/google-gemini/generate-content.ts +193 -0
  415. package/src/services/editor/modules/operations-implementations/external-integrations/google-mail/get-emails.ts +586 -0
  416. package/src/services/editor/modules/operations-implementations/external-integrations/google-mail/send-email.ts +386 -0
  417. package/src/services/editor/modules/operations-implementations/external-integrations/index.ts +12 -0
  418. package/src/services/editor/modules/operations-implementations/external-integrations/slack/channels.ts +240 -0
  419. package/src/services/editor/modules/operations-implementations/external-integrations/slack/messages.ts +210 -0
  420. package/src/services/editor/modules/operations-implementations/external-integrations/slack/replies.ts +200 -0
  421. package/src/services/editor/modules/operations-implementations/external-integrations/slack/send-message.ts +177 -0
  422. package/src/services/editor/modules/operations-implementations/index.ts +1 -0
  423. package/src/services/editor/modules/search-node-implementation/index.ts +42 -0
  424. package/src/services/editor/modules/sql-migrations-generation.tsx +1054 -0
  425. package/src/services/editor/publication/publication.ts +578 -0
  426. package/src/services/editor/ui.ts +1348 -0
  427. package/src/services/editor/utils.ts +5868 -0
  428. package/src/services/editor/value-store.ts +619 -0
  429. package/src/services/execution/built-in-function-implementations.ts +422 -0
  430. package/src/services/execution/index.ts +4747 -0
  431. package/src/services/execution/logic.ts +121 -0
  432. package/src/services/execution/test-instance.tsx +2296 -0
  433. package/src/services/execution/utils.ts +33 -0
  434. package/src/services/execution/value-resolution.test.ts +424 -0
  435. package/src/services/execution/value-resolution.ts +4087 -0
  436. package/src/services/integrations/ExternalIntegrationsService.ts +439 -0
  437. package/src/services/integrations/api.ts +175 -0
  438. package/src/services/local-relational-database/idb_helper.ts +66 -0
  439. package/src/services/local-relational-database/index.ts +3308 -0
  440. package/src/services/local-relational-database/utils.ts +403 -0
  441. package/src/services/notifications/index.ts +525 -0
  442. package/src/services/user/index.ts +144 -0
  443. package/src/setupTests.ts +1 -0
  444. package/src/socket/socket.ts +248 -0
  445. package/src/socket/utils.ts +10 -0
  446. package/src/store/workspace.ts +12 -0
  447. package/src/theme.ts +19 -0
  448. package/src/utils/DOM.ts +39 -0
  449. package/src/utils/date.ts +169 -0
  450. package/src/utils/index.ts +158 -0
  451. package/src/utils/react.tsx +679 -0
  452. package/src/utils/testing.ts +103 -0
@@ -0,0 +1,621 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import {
3
+ Collapse,
4
+ IconButton,
5
+ Tooltip as MuiTooltip,
6
+ Autocomplete,
7
+ TextField,
8
+ Box
9
+ } from '@mui/material';
10
+ import { useSearchStatementContext } from './search-statement-context';
11
+ import Tooltip from '../../../lib/tooltip/Tooltip';
12
+ import DataSourceSelection from './DataSourceSelection';
13
+ import ConditionBuilder from './ConditionBuilder';
14
+ import WarningIcon from '../../../assets/warning-sign-24px.png';
15
+ import {
16
+ getDatabaseEntity,
17
+ searchStatementState as searchStatementStateLib,
18
+ searchStatementDefs
19
+ } from '@elyx-code/project-logic-tree';
20
+ import EntityDialogSectionHeader from '../../EntityDialogSectionHeader';
21
+
22
+ const { AggregationStatement } = searchStatementStateLib;
23
+ const { AggregationStatementType, DataSourceType } = searchStatementDefs;
24
+
25
+ type AggregationStatement = searchStatementStateLib.AggregationStatement;
26
+ type AggregationStatementType = searchStatementDefs.AggregationStatementType;
27
+
28
+ export function resolveJoinTypeExplanationText(
29
+ joinType: AggregationStatementType
30
+ ): string {
31
+ switch (joinType) {
32
+ case AggregationStatementType.Inner:
33
+ return 'Returns only the rows with matches in both data sources.';
34
+ case AggregationStatementType.Left:
35
+ return 'Returns all rows from the main data source, and matched rows from the aggregated data source.';
36
+ case AggregationStatementType.Right:
37
+ return 'Returns all rows from the aggregated data source, and matched rows from the main source.';
38
+ case AggregationStatementType.Full:
39
+ return 'Returns all rows when there is a match in either main or aggregated source.';
40
+ case AggregationStatementType.Cross:
41
+ return 'Returns the Cartesian product of both sources (every row paired with every other).';
42
+ case AggregationStatementType.Self:
43
+ return 'Joins a data source with itself to compare rows within the same data source.';
44
+ case AggregationStatementType.Natural:
45
+ return 'Automatically joins data sources based on properties with the same name.';
46
+ }
47
+
48
+ return '';
49
+ }
50
+
51
+ export function resolveJoinTypeOptionSubLabel(
52
+ joinType: AggregationStatementType
53
+ ): string {
54
+ switch (joinType) {
55
+ case AggregationStatementType.Inner:
56
+ return 'Matched rows from both data sources';
57
+ case AggregationStatementType.Left:
58
+ return 'All rows from the main data source, NULL if no match in the aggregated data source.';
59
+ case AggregationStatementType.Right:
60
+ return 'All rows from the aggregated data source, NULL if no match in the main data source.';
61
+ case AggregationStatementType.Full:
62
+ return 'All rows from both data sources, NULL for missing matches on either side.';
63
+ case AggregationStatementType.Cross:
64
+ return 'Every possible combination of rows from both data sources.';
65
+ case AggregationStatementType.Self:
66
+ return 'Rows where one entry is compared with another entry from the same data source.';
67
+ case AggregationStatementType.Natural:
68
+ return 'Automatically matched rows based on property names.';
69
+ }
70
+
71
+ return '';
72
+ }
73
+
74
+ export const AggregationElement = ({
75
+ aggregation
76
+ }: {
77
+ aggregation: AggregationStatement;
78
+ }) => {
79
+ const {
80
+ searchStatementState,
81
+ editAggregation,
82
+ removeAggregation,
83
+ entity,
84
+ dataSources,
85
+ aggregationsUpdateKey,
86
+ mainDataSource
87
+ } = useSearchStatementContext();
88
+
89
+ const resolvedOptions = [
90
+ ...entity.inputs,
91
+ ...(searchStatementState.from?.columns || []),
92
+ ...(aggregation.dataSource?.columns || [])
93
+ ];
94
+
95
+ return (
96
+ <div
97
+ key={aggregationsUpdateKey}
98
+ style={{
99
+ display: 'flex',
100
+ flexDirection: 'column',
101
+ gap: 4,
102
+ marginLeft: 40
103
+ }}
104
+ >
105
+ <div
106
+ style={{
107
+ display: 'flex',
108
+ alignItems: 'center',
109
+ gap: 10
110
+ }}
111
+ >
112
+ <div
113
+ style={{
114
+ display: 'flex'
115
+ }}
116
+ >
117
+ <IconButton
118
+ id="search-statement-dialog-remove-aggregation-clause-button"
119
+ aria-label="delete"
120
+ size="small"
121
+ disabled={!entity.editable}
122
+ onClick={() => {
123
+ removeAggregation(aggregation);
124
+ }}
125
+ style={{
126
+ width: 30,
127
+ height: 30,
128
+ fontSize: 18,
129
+ color: '#F65858'
130
+ }}
131
+ >
132
+ <i className="fa-regular fa-trash" />
133
+ </IconButton>
134
+ <Tooltip
135
+ anchorQuerySelector="#search-statement-dialog-remove-aggregation-clause-button"
136
+ placement="bottom"
137
+ openDelay={300}
138
+ >
139
+ Remove this aggregation clause
140
+ </Tooltip>
141
+ </div>
142
+ <div
143
+ style={{
144
+ display: 'flex',
145
+ flexDirection: 'column'
146
+ }}
147
+ >
148
+ <h3 style={{ margin: 0, fontSize: 12, fontWeight: 500 }}>
149
+ Merge
150
+ </h3>
151
+ <p
152
+ style={{
153
+ margin: 0,
154
+ fontSize: 10,
155
+ color: 'rgba(0,0,0,0.54)'
156
+ }}
157
+ >
158
+ Uses data from a different entity for the output values
159
+ </p>
160
+ </div>
161
+ </div>
162
+ <div
163
+ style={{
164
+ display: 'flex',
165
+ flexDirection: 'column',
166
+ gap: 4,
167
+ marginLeft: 40
168
+ }}
169
+ >
170
+ <br className="quarter-space" />
171
+
172
+ <div
173
+ style={{
174
+ display: 'flex',
175
+ // flex-start so the merge-strategy field stays aligned with
176
+ // the top of the data-source row instead of getting vertically
177
+ // centered against a tall data-source (e.g. function with args).
178
+ alignItems: 'flex-start',
179
+ gap: 12
180
+ }}
181
+ >
182
+ {/* Data source field */}
183
+ <DataSourceSelection
184
+ options={dataSources.filter(
185
+ (source) =>
186
+ source.sourceType !==
187
+ DataSourceType.Aggregation &&
188
+ // A JOIN should not reuse another data source's function call —
189
+ // it creates its own. Existing function-typed data sources from
190
+ // elsewhere in the search statement would otherwise show up in
191
+ // this dropdown alongside the registry entries with the same
192
+ // name, looking like duplicates to the user.
193
+ source.sourceType !== DataSourceType.Function
194
+ )}
195
+ onChange={(dataSource) => {
196
+ // If the data source isn't the same as the previous one, also delete the 'on' clause
197
+ if (
198
+ !!aggregation.dataSource &&
199
+ aggregation.dataSource?.entity?.id !==
200
+ dataSource?.entity?.id
201
+ ) {
202
+ aggregation.on = null;
203
+ }
204
+
205
+ aggregation.dataSource = dataSource;
206
+ // Keep aggregation.as in sync with the new dataSource's
207
+ // alias. `aggregation.isValid` requires `!!this.as`, but
208
+ // the SQL emitter writes the alias from
209
+ // `aggregation.dataSource.as`. Without syncing here, a
210
+ // freshly-attached data source with its own alias (e.g.
211
+ // a table whose `.as` is the PascalCase name, or a new
212
+ // nested search seeded with a default alias) leaves
213
+ // aggregation.as empty, the aggregation is judged
214
+ // invalid, and the entire JOIN clause is silently
215
+ // dropped on the next toQuery() — destroying the user's
216
+ // work on the round-trip back through the saved SQL.
217
+ aggregation.as = dataSource?.as || null;
218
+ editAggregation(aggregation);
219
+ }}
220
+ alias={aggregation?.as}
221
+ onAliasChange={(alias) => {
222
+ if (aggregation) {
223
+ aggregation.as = alias;
224
+ // The SQL emitter reads the JOIN alias from
225
+ // `aggregation.dataSource.as` (and for query sources,
226
+ // from the underlying NestedSearchStatement.as via the
227
+ // DataSource setter). Without this the DataSource-level
228
+ // alias stays empty, the dropdown keeps showing `""`,
229
+ // and `AS <empty>` breaks the JOIN parse.
230
+ if (aggregation.dataSource) {
231
+ aggregation.dataSource.as = alias;
232
+ }
233
+ editAggregation(aggregation);
234
+ }
235
+ }}
236
+ value={aggregation.dataSource}
237
+ alwaysShowAlias
238
+ id={`search-statement-dialog--merge-data-source--${aggregation.id}--select`}
239
+ getOptionDisabled={(option) => {
240
+ if (option.sourceType === DataSourceType.Table) {
241
+ // If the entity is not part of the same database as the main data source,
242
+ // disable the option
243
+ const assignedDatabaseEntity =
244
+ getDatabaseEntity(option.entity);
245
+
246
+ console.log(
247
+ 'assignedDatabaseEntity',
248
+ assignedDatabaseEntity?.name
249
+ );
250
+
251
+ if (!assignedDatabaseEntity) {
252
+ return true;
253
+ }
254
+
255
+ if (!mainDataSource) {
256
+ return false;
257
+ }
258
+
259
+ const mainDataSourceDatabaseEntity =
260
+ getDatabaseEntity(mainDataSource?.entity);
261
+
262
+ console.log(
263
+ 'mainDataSourceDatabaseEntity',
264
+ mainDataSourceDatabaseEntity?.name
265
+ );
266
+
267
+ if (
268
+ mainDataSourceDatabaseEntity &&
269
+ assignedDatabaseEntity?.id !==
270
+ mainDataSourceDatabaseEntity?.id
271
+ ) {
272
+ return true;
273
+ }
274
+ }
275
+
276
+ return false;
277
+ }}
278
+ getTooltip={(option) => {
279
+ // Return simple tooltip, or the disabled reason
280
+ // If the entity is not part of the same database as the main data source,
281
+ // disable the option
282
+ if (option.sourceType === DataSourceType.Table) {
283
+ const assignedDatabaseEntity =
284
+ getDatabaseEntity(option.entity);
285
+
286
+ if (!assignedDatabaseEntity) {
287
+ return (
288
+ <>
289
+ This entity is not part of a
290
+ database
291
+ <br />
292
+ Please assign a parent database to
293
+ this entity on the canvas
294
+ </>
295
+ );
296
+ }
297
+
298
+ if (!mainDataSource) {
299
+ return '';
300
+ }
301
+
302
+ const mainDataSourceDatabaseEntity =
303
+ getDatabaseEntity(mainDataSource?.entity);
304
+
305
+ if (
306
+ mainDataSourceDatabaseEntity &&
307
+ assignedDatabaseEntity?.id !==
308
+ mainDataSourceDatabaseEntity?.id
309
+ ) {
310
+ return (
311
+ <>
312
+ This entity is part of a different
313
+ database than the currently selected
314
+ main data source
315
+ <br />
316
+ All data sources must be part of the
317
+ same database
318
+ </>
319
+ );
320
+ }
321
+ }
322
+
323
+ return '';
324
+ }}
325
+ />
326
+
327
+ {/* Join type (INNER, LEFT, etc.) */}
328
+ <Autocomplete
329
+ disablePortal
330
+ disabled={!entity.editable}
331
+ options={Object.values(AggregationStatementType)}
332
+ id={`search-statement-dialog--merge-join-type--${aggregation.id}--select`}
333
+ sx={{
334
+ width: 200,
335
+ flexShrink: 0
336
+ }}
337
+ value={aggregation.joinType}
338
+ onChange={(e, newValue) => {
339
+ aggregation.joinType =
340
+ newValue as AggregationStatementType;
341
+ editAggregation(aggregation);
342
+ }}
343
+ getOptionLabel={(option) =>
344
+ option.charAt(0).toUpperCase() +
345
+ option.slice(1).toLowerCase()
346
+ }
347
+ renderOption={(props, option) => {
348
+ const { key, ...optionProps } = props;
349
+
350
+ return (
351
+ <MuiTooltip
352
+ key={key}
353
+ title={resolveJoinTypeExplanationText(
354
+ option
355
+ )}
356
+ placement="right"
357
+ arrow
358
+ enterDelay={200}
359
+ leaveDelay={200}
360
+ >
361
+ <Box
362
+ component="li"
363
+ sx={{
364
+ '& > img': { mr: 2, flexShrink: 0 }
365
+ }}
366
+ {...optionProps}
367
+ >
368
+ <span
369
+ style={{
370
+ display: 'flex',
371
+ flexDirection: 'column'
372
+ }}
373
+ >
374
+ <span
375
+ style={{
376
+ display: 'flex',
377
+ flexDirection: 'column'
378
+ }}
379
+ >
380
+ {option
381
+ .charAt(0)
382
+ .toUpperCase() +
383
+ option
384
+ .slice(1)
385
+ .toLowerCase()}
386
+ </span>
387
+ <p
388
+ style={{
389
+ margin: 0,
390
+ fontSize: 10,
391
+ color: 'rgba(0,0,0,0.54)'
392
+ }}
393
+ >
394
+ {resolveJoinTypeOptionSubLabel(
395
+ option
396
+ )}
397
+ </p>
398
+ </span>
399
+ </Box>
400
+ </MuiTooltip>
401
+ );
402
+ }}
403
+ renderInput={(params) => (
404
+ <TextField
405
+ {...params}
406
+ label="Merge strategy"
407
+ variant="outlined"
408
+ size="small"
409
+ />
410
+ )}
411
+ />
412
+
413
+ {!aggregation.isValid && (
414
+ <MuiTooltip
415
+ placement="bottom"
416
+ enterDelay={300}
417
+ leaveDelay={200}
418
+ arrow
419
+ title={
420
+ <>
421
+ This aggregation is not fully resolved.
422
+ <br />
423
+ Please make sure to select a data source and
424
+ set an alias as well as adding a valid
425
+ condition.
426
+ <br />
427
+ <br />
428
+ If the aggregation is not resolved it will
429
+ be ignored in the final search execution.
430
+ </>
431
+ }
432
+ >
433
+ <img
434
+ className="search-statement__error-icon"
435
+ id={`data-type-builder--${aggregation?.id}--error-icon`}
436
+ style={{
437
+ marginTop: 8
438
+ }}
439
+ src={WarningIcon}
440
+ />
441
+ </MuiTooltip>
442
+ )}
443
+ </div>
444
+
445
+ {aggregation.joinType !== AggregationStatementType.Cross && (
446
+ <>
447
+ <br className="eighth-space" />
448
+ <span>
449
+ <p
450
+ style={{
451
+ margin: 0,
452
+ fontSize: 10,
453
+ color: 'rgba(0,0,0,0.54)'
454
+ }}
455
+ >
456
+ Merge entity with the original data source
457
+ </p>
458
+ <p
459
+ style={{
460
+ margin: 0,
461
+ fontSize: 10,
462
+ color: 'rgba(0,0,0,0.54)'
463
+ }}
464
+ >
465
+ where the condition matches
466
+ </p>
467
+ </span>
468
+
469
+ <br className="quarter-space" />
470
+
471
+ <ConditionBuilder
472
+ condition={aggregation.on}
473
+ options={resolvedOptions}
474
+ onChange={(updatedCondition) => {
475
+ aggregation.on = updatedCondition;
476
+
477
+ editAggregation(aggregation);
478
+ }}
479
+ />
480
+ </>
481
+ )}
482
+ </div>
483
+ </div>
484
+ );
485
+ };
486
+
487
+ const DataAggregationSection = ({}: {}) => {
488
+ const {
489
+ searchStatementState,
490
+ hydrationReady,
491
+ aggregations,
492
+ addAggregation,
493
+ mainDataSource,
494
+ entity
495
+ } = useSearchStatementContext();
496
+
497
+ const [sectionOpen, setSectionOpen] = useState(null);
498
+
499
+ useEffect(() => {
500
+ if (hydrationReady) {
501
+ setSectionOpen(!!aggregations.length && !!mainDataSource);
502
+ }
503
+ }, [hydrationReady]);
504
+
505
+ return (
506
+ <section
507
+ style={{
508
+ display: 'flex',
509
+ flexDirection: 'column',
510
+ paddingBottom: sectionOpen ? 20 : 0
511
+ }}
512
+ >
513
+ <EntityDialogSectionHeader
514
+ title="Data aggregation"
515
+ subtitle="Aggregate data from entries in different data sources into one final entry"
516
+ hideShowSuffix="the aggregation section"
517
+ open={sectionOpen}
518
+ onToggle={() => setSectionOpen(!sectionOpen)}
519
+ headerEndIcon={
520
+ !mainDataSource &&
521
+ !!aggregations.length && (
522
+ <MuiTooltip
523
+ placement="bottom"
524
+ enterDelay={0}
525
+ leaveDelay={200}
526
+ arrow
527
+ title={
528
+ <>
529
+ Aggregations require a main data source to
530
+ be set up first.
531
+ <br />
532
+ <br />
533
+ Please select a data source to start adding
534
+ aggregations.
535
+ <br />
536
+ Existing aggregations will be ignored in the
537
+ final results
538
+ </>
539
+ }
540
+ >
541
+ <img
542
+ className="search-statement__error-icon"
543
+ id={`all-aggregations--error-icon`}
544
+ src={WarningIcon}
545
+ />
546
+ </MuiTooltip>
547
+ )
548
+ }
549
+ />
550
+
551
+ <Collapse in={sectionOpen}>
552
+ <div
553
+ style={{
554
+ marginTop: 6,
555
+ display: 'flex',
556
+ flexDirection: 'column',
557
+ gap: 14
558
+ }}
559
+ >
560
+ {aggregations.map((aggregation) => (
561
+ <AggregationElement
562
+ key={aggregation.id}
563
+ aggregation={aggregation}
564
+ />
565
+ ))}
566
+ </div>
567
+
568
+ {!!aggregations.length && <br />}
569
+
570
+ <div
571
+ style={{
572
+ display: 'flex',
573
+ alignItems: 'center',
574
+ gap: 18,
575
+ marginLeft: 40
576
+ }}
577
+ >
578
+ <IconButton
579
+ id="search-statement-dialog-add-aggregation-clause-button"
580
+ aria-label="delete"
581
+ size="small"
582
+ color="primary"
583
+ style={{ width: 30, height: 30, fontSize: 18 }}
584
+ // Disable if there is already an aggreation not fully set up
585
+ disabled={
586
+ !entity.editable ||
587
+ !!aggregations.find(
588
+ (agg) => !agg.dataSource || !agg.id
589
+ )
590
+ }
591
+ onClick={() => {
592
+ addAggregation(
593
+ new AggregationStatement(searchStatementState)
594
+ );
595
+ }}
596
+ >
597
+ <i className="fa-regular fa-plus" />
598
+ </IconButton>
599
+ <Tooltip
600
+ anchorQuerySelector="#search-statement-dialog-add-aggregation-clause-button"
601
+ placement="bottom"
602
+ openDelay={300}
603
+ >
604
+ Add a new separate aggregation clause
605
+ </Tooltip>
606
+ <p
607
+ style={{
608
+ margin: 0,
609
+ fontSize: 10,
610
+ color: 'rgba(0,0,0,0.54)'
611
+ }}
612
+ >
613
+ Add new merge clause
614
+ </p>
615
+ </div>
616
+ </Collapse>
617
+ </section>
618
+ );
619
+ };
620
+
621
+ export default DataAggregationSection;