@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,978 @@
1
+ import React, { useCallback, useEffect, useRef, useState } from 'react';
2
+ import './draggable-entity-card.css';
3
+ import {
4
+ ENTITY_FA_ICON_NAMES,
5
+ entityDisabledReasonToShortReadableError,
6
+ getCanvasEntityDOMId,
7
+ getUnreachableStripesStyle,
8
+ safeResolveEntityName
9
+ } from '../../services/editor/ui';
10
+ import Button from '../../lib/button/Button';
11
+ import { Canvas } from '../../lib/canvas';
12
+ import {
13
+ VariableState,
14
+ InternalCallState,
15
+ EntityType,
16
+ CanvasEntityTestingDisabledReason,
17
+ removeDisabledReasons,
18
+ addDisabledReasons,
19
+ CanvasEntityDisabledReason,
20
+ CanvasEntityConnectionDisabledReason,
21
+ CanvasEntityOtherDisabledReason,
22
+ ALL_CONNECTION_DISABLED_REASONS,
23
+ OutputMapState,
24
+ IActionOutputMapTransfer,
25
+ getDeclarationOutputedError,
26
+ ProjectState,
27
+ ChangeSet,
28
+ IValueDescriptorTransfer,
29
+ OutputMapParentChildRelation,
30
+ createStateFromTypeAndSubscribe,
31
+ ChangeSetEntityChangeType,
32
+ lowercaseFirstLetter,
33
+ READABLE_ENTITY_TYPES,
34
+ BUILT_IN_BASE_ENTITY_IDS,
35
+ StateMutationAction
36
+ } from '@elyx-code/project-logic-tree';
37
+ import { EditorService } from '../../services/editor';
38
+ import CanvasPopupBaseComponent from '../../lib/popup/CanvasPopupBaseComponent';
39
+ import CanvasDropdownMenuCard from '../../lib/dropdown/CanvasDropdownMenuCard';
40
+ import CanvasPopup, { useCanvasPopup } from '../../services/editor/CanvasPopup';
41
+ import InternalCallExecutionNode from './InternalCallExecutionNode';
42
+ import SmallSuccessFailureNodes from './SmallSuccessFailureNodes';
43
+ import LogicErrorIconMenu from './logic-error/LogicErrorIconMenu';
44
+ import { CanvasEntityElement } from '../../services/editor/CanvasElement';
45
+ import InputMapProperty from './InputMapProperty';
46
+ import OutputMapProperty from './OutputMapProperty';
47
+ import ExpandPropertiesIconButton from './expand-properties-icon-button/ExpandPropertiesIconButton';
48
+ import ErrorMapProperty from './ErrorMapProperty';
49
+ import EntityLockedIconMenu from './entity-locked-icon/EntityLockedIcon';
50
+ import MainValueOutput from './MainValueOutput';
51
+ import UnreachableMarker from './UnreachableMarker';
52
+ import { popupNotification } from '../../popup-notification';
53
+
54
+ interface IInternalCallProps {
55
+ call: InternalCallState;
56
+ entity: VariableState;
57
+ canvasElement: CanvasEntityElement;
58
+ project: EditorService;
59
+ parentDisabledReasons: CanvasEntityDisabledReason[];
60
+ }
61
+
62
+ export default function InternalCall(props: IInternalCallProps) {
63
+ const rootElementRef = useRef<HTMLDivElement>(null);
64
+
65
+ const [updateKey, setValue] = useState(0);
66
+
67
+ const useForceUpdate = () => {
68
+ return () => setValue((value) => value + 1);
69
+ };
70
+ const forceUpdate = useForceUpdate(); // Update the component
71
+
72
+ const [expandedError, setExpandedError] = useState<boolean>(false);
73
+
74
+ const [_disabledReasons, setDisabledReasons] = useState<
75
+ CanvasEntityDisabledReason[]
76
+ >([]);
77
+
78
+ const memoizedCanvasPopupBody = useCallback(
79
+ (popup: CanvasPopup) => (
80
+ <CanvasPopupBaseComponent>
81
+ <CanvasDropdownMenuCard
82
+ options={[
83
+ {
84
+ project: props.project,
85
+ onClick: async () => {
86
+ await props.project.remove(props.call.id);
87
+ },
88
+ label: 'Delete',
89
+ color: 'error',
90
+ iconEnd: 'fa-solid fa-trash-can',
91
+ disabled: !props.call.deletable || true,
92
+ tooltip: !props.call.deletable
93
+ ? `This ${lowercaseFirstLetter(
94
+ READABLE_ENTITY_TYPES[props.call.type]
95
+ .singular
96
+ )} cannot be deleted. Because the system need to refer to it over time.`
97
+ : `${lowercaseFirstLetter(
98
+ READABLE_ENTITY_TYPES[props.call.type]
99
+ .plural
100
+ )} cannot be deleted from their parent variables.`,
101
+ parentCanvasObject: popup.self,
102
+ id:
103
+ 'canvas--' +
104
+ props.entity.id +
105
+ '--' +
106
+ props.call.type +
107
+ '--' +
108
+ props.call.id +
109
+ '--delete'
110
+ },
111
+ {
112
+ project: props.project,
113
+ onClick: async () => {
114
+ props.project?.canvas?.unselectAll();
115
+
116
+ EditorService.navigate(
117
+ `${props.project?.editorBasePath}/entity/${EntityType.InternalCall}/${props.call.id}`
118
+ );
119
+ },
120
+ label: 'Edit',
121
+ iconEnd: 'fa-solid fa-pencil',
122
+ disabled: false,
123
+ tooltip: !call.editable
124
+ ? `This ${lowercaseFirstLetter(
125
+ READABLE_ENTITY_TYPES[call.type]
126
+ .singular
127
+ )} has been locked and can no longer be edited`
128
+ : `Edit this ${lowercaseFirstLetter(
129
+ READABLE_ENTITY_TYPES[call.type]
130
+ .singular
131
+ )}`,
132
+ parentCanvasObject: popup.self,
133
+ id:
134
+ 'canvas--' +
135
+ props.entity.id +
136
+ '--' +
137
+ props.call.type +
138
+ '--' +
139
+ props.call.id +
140
+ '--edit'
141
+ },
142
+ {
143
+ project: props.project,
144
+ onClick: async () => {
145
+ const changeSet =
146
+ props.project.logic.addChangeSet(
147
+ new ChangeSet(
148
+ props.project.logic,
149
+ ProjectState.sessionAuthor,
150
+ new Date().toISOString(),
151
+ call,
152
+ false,
153
+ call.catchesError
154
+ ? StateMutationAction.ChangeInternalCallToThrowErrors
155
+ : StateMutationAction.ChangeInternalCallToCatchErrors
156
+ )
157
+ );
158
+
159
+ call.metaSync(
160
+ {
161
+ catchesError: !call.catchesError
162
+ },
163
+ changeSet
164
+ );
165
+
166
+ props.project.renderAndCloseChangeSet(
167
+ changeSet
168
+ );
169
+ },
170
+ label:
171
+ call.catchesError || !!call.errorCalls.length
172
+ ? 'Errors are caught'
173
+ : 'Errors terminate execution',
174
+ color: 'error',
175
+ disabled: !!call.errorCalls.length,
176
+ iconEnd:
177
+ call.catchesError || !!call.errorCalls.length
178
+ ? 'fa-solid fa-xmark'
179
+ : 'fa-solid fa-ban',
180
+ subLabel: !!call.errorCalls.length
181
+ ? 'Error call connected nodes'
182
+ : call.catchesError
183
+ ? 'Click to throw error instead'
184
+ : 'Click to catch errors instead',
185
+ tooltip: !!call.errorCalls.length
186
+ ? 'Remove all connected nodes to the error branch if you want to throw the error instead'
187
+ : call.catchesError
188
+ ? 'Currently, if an error occurs, all other branches will continue executing.'
189
+ : 'Currently, if an error occurs it will terminate all ongoing executions. Including paralel branches.',
190
+ parentCanvasObject: popup.self,
191
+ id:
192
+ `canvas--${call.type}--` +
193
+ props.call.id +
194
+ '--error-handling'
195
+ },
196
+ {
197
+ project: props.project,
198
+ onClick: async () => {
199
+ console.log('HEREEEEEE');
200
+ const changeSet =
201
+ props.project.logic.addChangeSet(
202
+ new ChangeSet(
203
+ props.project.logic,
204
+ ProjectState.sessionAuthor,
205
+ new Date().toISOString(),
206
+ call,
207
+ false,
208
+ StateMutationAction.RecalculateCondition
209
+ )
210
+ );
211
+
212
+ call.afterAllChildrenInitialized(changeSet);
213
+
214
+ props.project.renderAndCloseChangeSet(
215
+ changeSet
216
+ );
217
+ },
218
+ label: 'Recalculate',
219
+ color: 'warning',
220
+ // Bug icon
221
+ iconEnd: 'fa-solid fa-bug',
222
+ disabled: false,
223
+ // Lower case the first letter of the resolved readable name
224
+ tooltip:
225
+ 'Recalculate the state of this ' +
226
+ lowercaseFirstLetter(
227
+ READABLE_ENTITY_TYPES[props.call.type]
228
+ .shortSingular
229
+ ),
230
+ parentCanvasObject: popup.self,
231
+ id:
232
+ 'canvas--' +
233
+ props.call.type +
234
+ '-card--' +
235
+ props.call.id +
236
+ '--recalculate'
237
+ },
238
+ {
239
+ project: props.project,
240
+ onClick: async () => {
241
+ navigator.clipboard.writeText(props.call.id);
242
+ popupNotification({
243
+ text: `Copied ID: ${props.call.id}`,
244
+ color: 'success'
245
+ });
246
+ },
247
+ label: 'Copy ID',
248
+ color: 'warning',
249
+ iconEnd: 'fa-solid fa-bug',
250
+ tooltip:
251
+ 'Copy this node ID to clipboard for debugging',
252
+ parentCanvasObject: popup.self,
253
+ id: 'copy-id-' + props.call.id
254
+ },
255
+ {
256
+ project: props.project,
257
+ onClick: async () => {
258
+ await props.project.recalculateValidateEntity(
259
+ props.call
260
+ );
261
+ popupNotification({
262
+ text: `Re-validated node successfully`,
263
+ color: 'success'
264
+ });
265
+ },
266
+ label: 'Re-validate',
267
+ color: 'warning',
268
+ iconEnd: 'fa-solid fa-bug',
269
+ tooltip:
270
+ "Re-validate this node's state and its errors",
271
+ parentCanvasObject: popup.self,
272
+ id: 're-validate-' + props.call.id
273
+ }
274
+ ]}
275
+ />
276
+ </CanvasPopupBaseComponent>
277
+ ),
278
+ [props.entity.id, props.call, props.project]
279
+ );
280
+
281
+ const canvasPopup = useCanvasPopup(
282
+ {
283
+ editor: props.project,
284
+ id:
285
+ 'canvas--internal-call--menu-button-' +
286
+ props.call.id +
287
+ '--popup',
288
+ anchorQuerySelector: '#' + getCanvasEntityDOMId(props.call),
289
+ arrowClasses: ['dropdown-menu-card-arrow'],
290
+ parentCanvasObject: props.canvasElement.draggableObject,
291
+ placement: 'left'
292
+ },
293
+ memoizedCanvasPopupBody
294
+ );
295
+
296
+ useEffect(() => {
297
+ // --- Initial Setup Logic ---
298
+ const initialNewDisabledReasons: CanvasEntityOtherDisabledReason[] = [];
299
+
300
+ // @ts-ignore
301
+ if (props.call.suggestion) {
302
+ initialNewDisabledReasons.push(
303
+ CanvasEntityOtherDisabledReason.Suggestion
304
+ );
305
+ }
306
+
307
+ if (props.project.canvas?.disabled) {
308
+ initialNewDisabledReasons.push(
309
+ CanvasEntityOtherDisabledReason.CanvasGloballyDisabled
310
+ );
311
+ }
312
+
313
+ if (!!initialNewDisabledReasons.length) {
314
+ setDisabledReasons((currentReasons) => {
315
+ const config = addDisabledReasons(
316
+ currentReasons,
317
+ initialNewDisabledReasons
318
+ );
319
+ return config.reasons;
320
+ });
321
+ } else {
322
+ // This handles the case where canvas was disabled but is now enabled
323
+ setDisabledReasons((currentReasons) => {
324
+ const config = removeDisabledReasons(currentReasons, [
325
+ CanvasEntityOtherDisabledReason.CanvasGloballyDisabled
326
+ ]);
327
+ return config.reasons;
328
+ });
329
+ }
330
+
331
+ const handleEntityUpdate = () => {
332
+ forceUpdate();
333
+ };
334
+
335
+ const handleCanvasGloballyEnabled = () => {
336
+ setDisabledReasons((currentReasons) => {
337
+ const config = removeDisabledReasons(currentReasons, [
338
+ CanvasEntityOtherDisabledReason.CanvasGloballyDisabled
339
+ ]);
340
+ return config.reasons;
341
+ });
342
+ };
343
+ const handleCanvasGloballyDisabled = () => {
344
+ setDisabledReasons((currentReasons) => {
345
+ const config = addDisabledReasons(currentReasons, [
346
+ CanvasEntityOtherDisabledReason.CanvasGloballyDisabled
347
+ ]);
348
+ return config.reasons;
349
+ });
350
+ };
351
+
352
+ const handleCallUpdate = (payload: any) => {
353
+ let hasUpdated = false;
354
+ const newDisabledReasons: CanvasEntityTestingDisabledReason[] = [];
355
+ const disabledReasonsToRemove: CanvasEntityTestingDisabledReason[] =
356
+ [];
357
+
358
+ props.project.test?.disabledConnectionsNotInTest(
359
+ props.canvasElement.draggableObject,
360
+ props.call
361
+ );
362
+
363
+ if (
364
+ !!props.project.test &&
365
+ !props.project.test?.hasEntity(props.call) &&
366
+ !props.project.test?.getCanBeAddedToTest(props.call)
367
+ ) {
368
+ props.project.canvas?.disable(
369
+ props.canvasElement.draggableObject,
370
+ {
371
+ quiet: true
372
+ }
373
+ );
374
+ newDisabledReasons.push(
375
+ CanvasEntityTestingDisabledReason.CannotBeAddedToTest
376
+ );
377
+ hasUpdated = true;
378
+ }
379
+
380
+ if (
381
+ (props.project.test?.hasEntity(props.call) ||
382
+ props.project.test?.getCanBeAddedToTest(props.call)) &&
383
+ props.canvasElement.draggableObject.disabled
384
+ ) {
385
+ props.project.canvas?.enable(
386
+ props.canvasElement.draggableObject,
387
+ {
388
+ quiet: true
389
+ }
390
+ );
391
+ disabledReasonsToRemove.push(
392
+ CanvasEntityTestingDisabledReason.CannotBeAddedToTest
393
+ );
394
+ hasUpdated = true;
395
+ }
396
+
397
+ if (
398
+ !!props.project.test &&
399
+ !props.project.test?.hasEntity(props.call)
400
+ ) {
401
+ newDisabledReasons.push(
402
+ CanvasEntityTestingDisabledReason.NotPartOfOngoingTest
403
+ );
404
+ hasUpdated = true;
405
+ } else if (
406
+ !!props.project.test &&
407
+ props.project.test?.hasEntity(props.call)
408
+ ) {
409
+ disabledReasonsToRemove.push(
410
+ CanvasEntityTestingDisabledReason.NotPartOfOngoingTest
411
+ );
412
+ hasUpdated = true;
413
+ }
414
+
415
+ if (newDisabledReasons.length || disabledReasonsToRemove.length) {
416
+ setDisabledReasons((currentReasons) => {
417
+ const config = addDisabledReasons(
418
+ currentReasons,
419
+ newDisabledReasons
420
+ );
421
+ const finalConfig = removeDisabledReasons(
422
+ config.reasons,
423
+ disabledReasonsToRemove
424
+ );
425
+ return finalConfig.reasons;
426
+ });
427
+ }
428
+
429
+ if (!hasUpdated) {
430
+ forceUpdate();
431
+ }
432
+ };
433
+
434
+ const handleTestSetupStarted = () => {
435
+ const newDisabledReasons: CanvasEntityTestingDisabledReason[] = [];
436
+
437
+ if (
438
+ !!props.project.test &&
439
+ !props.project.test?.hasEntity(props.call) &&
440
+ !props.project.test?.getCanBeAddedToTest(props.call)
441
+ ) {
442
+ props.project.canvas?.disable(
443
+ props.canvasElement.draggableObject,
444
+ {
445
+ quiet: true
446
+ }
447
+ );
448
+ props.project.test?.disabledConnectionsNotInTest(
449
+ props.canvasElement.draggableObject,
450
+ props.call
451
+ );
452
+
453
+ newDisabledReasons.push(
454
+ CanvasEntityTestingDisabledReason.CannotBeAddedToTest
455
+ );
456
+ }
457
+
458
+ if (!props.project.test?.hasEntity(props.call)) {
459
+ newDisabledReasons.push(
460
+ CanvasEntityTestingDisabledReason.NotPartOfOngoingTest
461
+ );
462
+ }
463
+
464
+ setDisabledReasons((currentReasons) => {
465
+ const config = addDisabledReasons(
466
+ currentReasons,
467
+ newDisabledReasons
468
+ );
469
+ return config.reasons;
470
+ });
471
+ };
472
+
473
+ const handleExecutionStart = () => {
474
+ if (!!props.project.test?.hasEntity(props.call)) {
475
+ forceUpdate();
476
+ }
477
+ };
478
+
479
+ const handleTestExited = () => {
480
+ setDisabledReasons((currentReasons) => {
481
+ const config = removeDisabledReasons(currentReasons, [
482
+ CanvasEntityTestingDisabledReason.NotPartOfOngoingTest,
483
+ CanvasEntityTestingDisabledReason.CannotBeAddedToTest
484
+ ]);
485
+ return config.reasons;
486
+ });
487
+
488
+ if (props.canvasElement.draggableObject.disabled) {
489
+ props.project.canvas?.enable(
490
+ props.canvasElement.draggableObject,
491
+ {
492
+ quiet: true
493
+ }
494
+ );
495
+ }
496
+
497
+ props.canvasElement.draggableObject.connections.forEach(
498
+ (connection) => {
499
+ connection.enable();
500
+ connection.element.classList.remove('disabled');
501
+
502
+ if (connection.complementaryLineElement) {
503
+ connection.complementaryLineElement.classList.remove(
504
+ 'disabled'
505
+ );
506
+ }
507
+ }
508
+ );
509
+ };
510
+
511
+ const handleCanvasConnectionStart = (payload: any) => {
512
+ if (!payload.compatible?.[props.call.id]) {
513
+ props.project.canvas?.disable(
514
+ props.canvasElement.draggableObject,
515
+ {
516
+ quiet: true
517
+ }
518
+ );
519
+
520
+ const newOwnConnectionDisabledReasons: CanvasEntityConnectionDisabledReason[] =
521
+ payload.incompatible?.[props.call.id]?.reasons || [];
522
+
523
+ setDisabledReasons((currentReasons) => {
524
+ const config = addDisabledReasons(
525
+ currentReasons,
526
+ newOwnConnectionDisabledReasons
527
+ );
528
+ return config.reasons;
529
+ });
530
+ } else {
531
+ forceUpdate();
532
+ }
533
+ };
534
+
535
+ const handleCanvasConnectionEnd = () => {
536
+ props.project.canvas?.enable(props.canvasElement.draggableObject, {
537
+ quiet: true
538
+ });
539
+
540
+ setDisabledReasons((currentReasons) => {
541
+ const config = removeDisabledReasons(
542
+ currentReasons,
543
+ ALL_CONNECTION_DISABLED_REASONS
544
+ );
545
+ return config.reasons;
546
+ });
547
+ };
548
+
549
+ props.project.on(props.entity.id, handleEntityUpdate);
550
+ props.project.on(
551
+ 'canvas-globally-enabled',
552
+ handleCanvasGloballyEnabled
553
+ );
554
+ props.project.on(
555
+ 'canvas-globally-disabled',
556
+ handleCanvasGloballyDisabled
557
+ );
558
+ props.project.on(props.call.id, handleCallUpdate);
559
+ props.project.on('test-setup-started', handleTestSetupStarted);
560
+ props.project.on('execution-start', handleExecutionStart);
561
+ props.project.on('test-exited', handleTestExited);
562
+ props.project.on(
563
+ 'canvas-connection-start',
564
+ handleCanvasConnectionStart
565
+ );
566
+ props.project.on('canvas-connection-end', handleCanvasConnectionEnd);
567
+
568
+ return () => {
569
+ props.project.off(props.entity.id, handleEntityUpdate);
570
+ props.project.off(
571
+ 'canvas-globally-enabled',
572
+ handleCanvasGloballyEnabled
573
+ );
574
+ props.project.off(
575
+ 'canvas-globally-disabled',
576
+ handleCanvasGloballyDisabled
577
+ );
578
+ props.project.off(props.call.id, handleCallUpdate);
579
+ props.project.off('test-setup-started', handleTestSetupStarted);
580
+ props.project.off('execution-start', handleExecutionStart);
581
+ props.project.off('test-exited', handleTestExited);
582
+ props.project.off(
583
+ 'canvas-connection-start',
584
+ handleCanvasConnectionStart
585
+ );
586
+ props.project.off(
587
+ 'canvas-connection-end',
588
+ handleCanvasConnectionEnd
589
+ );
590
+ };
591
+ }, [
592
+ props.project,
593
+ props.entity,
594
+ props.call,
595
+ props.canvasElement,
596
+ updateKey
597
+ ]);
598
+
599
+ useEffect(() => {
600
+ props.canvasElement.draggableObject.updateConnections();
601
+ });
602
+
603
+ const entity = props.entity;
604
+ const call: InternalCallState = props.call;
605
+ const iconName = ENTITY_FA_ICON_NAMES[call.declaration?.type];
606
+
607
+ // When the entity is part of a variable declaration,
608
+ // which has a different internal calls being executed,
609
+ // we can't execute a new one
610
+ const parentVarCallsDifferentInternalCalls =
611
+ (entity.type === EntityType.VariableDeclaration ||
612
+ entity.type === EntityType.VariableInstance) &&
613
+ entity.internalCalls.some(
614
+ (call) => !!call.calledBy.length && call.id !== props.call.id
615
+ );
616
+
617
+ const relevantParentDisabledReasonsWhileConnecting =
618
+ props.parentDisabledReasons.filter(
619
+ (reason) =>
620
+ reason !==
621
+ CanvasEntityConnectionDisabledReason.ExecutionsAlreadyConnected
622
+ );
623
+ const relevantParentDisabledReasonsWhenNotConnecting =
624
+ props.parentDisabledReasons.filter(
625
+ (reason) =>
626
+ reason !==
627
+ CanvasEntityTestingDisabledReason.CannotBeAddedToTest &&
628
+ reason !==
629
+ CanvasEntityTestingDisabledReason.NotPartOfOngoingTest
630
+ );
631
+
632
+ const relevantParentDisabledReasons = !!props.project
633
+ .onGoingConnectionNodeType
634
+ ? relevantParentDisabledReasonsWhileConnecting
635
+ : relevantParentDisabledReasonsWhenNotConnecting;
636
+
637
+ const disabled =
638
+ !!relevantParentDisabledReasons.length ||
639
+ !!parentVarCallsDifferentInternalCalls;
640
+
641
+ const disabledReasons = [
642
+ ...relevantParentDisabledReasons,
643
+ ..._disabledReasons
644
+ ];
645
+
646
+ return (
647
+ <div
648
+ ref={rootElementRef}
649
+ className={[
650
+ 'canvas-draggable-card__property-row',
651
+ 'canvas-draggable-card__internal-call',
652
+ 'canvas-draggable-card__nested-card'
653
+ ].join(' ')}
654
+ id={getCanvasEntityDOMId(props.call)}
655
+ {...{
656
+ [Canvas.OBJ_ATTR_NAME]: getCanvasEntityDOMId(props.call)
657
+ }}
658
+ >
659
+ <InternalCallExecutionNode
660
+ call={props.call}
661
+ entity={props.entity}
662
+ canvasElement={props.canvasElement}
663
+ project={props.project}
664
+ parentDisabledReasons={disabledReasons}
665
+ />
666
+ <div
667
+ style={{
668
+ width: '100%',
669
+ // `position: relative` so the absolutely-positioned
670
+ // UnreachableMarker below resolves its `top: -26px;
671
+ // right: 12px` offsets against THIS wrapper (which is just
672
+ // the internal-call body) instead of bubbling up to the
673
+ // parent variable card's own `canvas-draggable-card`
674
+ // container. Without this, the marker floats above the
675
+ // variable's header instead of above its own blue body and
676
+ // is invisible behind the variable card.
677
+ position: 'relative'
678
+ }}
679
+ >
680
+ {/* Pass `props.call` — not `props.entity` — as the entity to
681
+ check. The unreachability error lives on the InternalCall
682
+ itself; the parent variable instance may very well be
683
+ reachable while one of its method calls is not. */}
684
+ <UnreachableMarker
685
+ entity={props.call}
686
+ parentDisabledReasons={disabledReasons}
687
+ project={props.project}
688
+ draggableObject={props.canvasElement.draggableObject}
689
+ />
690
+ <div
691
+ style={{
692
+ display: 'flex',
693
+ justifyContent: 'space-between',
694
+ alignItems: 'center',
695
+ width: '100%',
696
+ // When the call is unreachable, this injects the
697
+ // `--unreachable-stripes-bg` CSS custom property; the
698
+ // `__header--small[style*="--unreachable-stripes-bg"]::before`
699
+ // rule in draggable-entity-card.css then layers the
700
+ // diagonal stripes on top of this body and pulses them
701
+ // in/out — same animation as on full-sized cards.
702
+ // Empty object spread when reachable, so no inline
703
+ // `style` noise on healthy nodes.
704
+ ...getUnreachableStripesStyle(props.call)
705
+ }}
706
+ className={['canvas-draggable-card__header--small'].join(
707
+ ' '
708
+ )}
709
+ onMouseOver={(e: any) => {
710
+ if (!!props.project.canvas?.activeConnectionDrawing) {
711
+ if (
712
+ !!props.project
713
+ .onGoingConnectionIncompatibleEntities?.[
714
+ props.call.id
715
+ ]
716
+ ) {
717
+ // Read the disabled reasons and add a tooltip to the mouse
718
+ const reasonsMessage =
719
+ props.project.onGoingConnectionIncompatibleEntities?.[
720
+ props.call.id
721
+ ].reasons
722
+ .map((reason) =>
723
+ entityDisabledReasonToShortReadableError(
724
+ reason
725
+ )
726
+ )
727
+ .join('.\n');
728
+
729
+ props.project.canvas?.showTooltip(
730
+ 'connection-disabled-reasons-test-entity-button',
731
+ reasonsMessage
732
+ );
733
+ if (props.project.canvas) {
734
+ props.project.canvas.tooltip.style.fontSize =
735
+ '28px';
736
+ props.project.canvas.canvasElement.style.cursor =
737
+ 'not-allowed';
738
+ }
739
+ }
740
+ }
741
+ }}
742
+ onMouseLeave={(e: any) => {
743
+ props.project.canvas?.hideTooltip(
744
+ 'connection-disabled-reasons-test-entity-button'
745
+ );
746
+ }}
747
+ >
748
+ <div
749
+ className={[
750
+ 'canvas-draggable-card__property__left-block canvas-draggable-card__property__value-container',
751
+ ...(disabled || !!disabledReasons.length
752
+ ? ['disabled']
753
+ : [])
754
+ ].join(' ')}
755
+ >
756
+ <i className={`fas fa-${iconName}`} />
757
+
758
+ <span className="canvas-draggable-card__property__labels-group">
759
+ <p className="canvas-draggable-card__property__name">
760
+ {safeResolveEntityName(call, call.project)}
761
+ </p>
762
+ <p className="canvas-draggable-card__property__type">
763
+ Internal action
764
+ </p>
765
+ </span>
766
+ </div>
767
+ <span
768
+ style={{
769
+ display: 'flex',
770
+ alignItems: 'center',
771
+ gap: '6px'
772
+ }}
773
+ className={[
774
+ ...(disabled || !!disabledReasons.length
775
+ ? ['disabled']
776
+ : [])
777
+ ].join(' ')}
778
+ >
779
+ <EntityLockedIconMenu
780
+ entity={call}
781
+ project={props.project}
782
+ canvasElement={props.canvasElement}
783
+ parentDisabledReasons={disabledReasons}
784
+ />
785
+ <LogicErrorIconMenu
786
+ entity={call}
787
+ project={props.project}
788
+ canvasElement={props.canvasElement}
789
+ parentDisabledReasons={disabledReasons}
790
+ />
791
+ <div className="canvas-draggable-card__property-row__menu-button">
792
+ <Button
793
+ variant="text"
794
+ color="grey"
795
+ iconEnd="fa-solid fa-ellipsis-v"
796
+ className="canvas-small-entity-card-menu-button"
797
+ ref={canvasPopup.anchorRef}
798
+ size="small"
799
+ id={`canvas-property-card-menu-button-${entity.id}`}
800
+ onClick={(e: any) => {
801
+ e.stopPropagation();
802
+ canvasPopup?.toggle();
803
+ }}
804
+ onDoubleClick={(
805
+ e: React.MouseEvent<HTMLButtonElement>
806
+ ) => {
807
+ e.stopPropagation();
808
+ props.project?.canvas?.unselectAll();
809
+ EditorService.navigate(
810
+ `${props.project?.editorBasePath}/entity/${EntityType.InternalCall}/${props.call.id}`
811
+ );
812
+ }}
813
+ />
814
+ </div>
815
+ </span>
816
+ <SmallSuccessFailureNodes
817
+ call={call}
818
+ entity={entity}
819
+ draggableObject={props.canvasElement.draggableObject}
820
+ project={props.project}
821
+ parentDisabledReasons={disabledReasons}
822
+ />
823
+ </div>
824
+ <div>
825
+ {expandedError ||
826
+ (!!(call as InternalCallState).error && (
827
+ <ErrorMapProperty
828
+ outputMap={
829
+ (call as InternalCallState).error || null
830
+ }
831
+ entity={call}
832
+ draggableObject={
833
+ props.canvasElement.draggableObject
834
+ }
835
+ project={props.project}
836
+ parentDisabledReasons={disabledReasons}
837
+ />
838
+ ))}
839
+ <ExpandPropertiesIconButton
840
+ project={props.project}
841
+ expanded={expandedError}
842
+ draggableObject={props.canvasElement.draggableObject}
843
+ onClick={() => {
844
+ const errorDeclaration =
845
+ getDeclarationOutputedError(call);
846
+
847
+ // Create error output-map entity before expanding the error for the first time
848
+ if (!call.error && !expandedError) {
849
+ const changeSet =
850
+ props.project.logic.addChangeSet(
851
+ new ChangeSet(
852
+ props.project.logic,
853
+ ProjectState.sessionAuthor,
854
+ new Date().toISOString(),
855
+ call,
856
+ false,
857
+ StateMutationAction.AddErrorOutputToInternalCall
858
+ )
859
+ );
860
+
861
+ const newOutputMapTransfer: IActionOutputMapTransfer =
862
+ OutputMapState.new(
863
+ changeSet
864
+ ) as IActionOutputMapTransfer;
865
+ newOutputMapTransfer.parent =
866
+ call.toReference();
867
+ newOutputMapTransfer.declaration =
868
+ (errorDeclaration?.toJSON() as IValueDescriptorTransfer) ||
869
+ null;
870
+ newOutputMapTransfer.parentRelationType =
871
+ OutputMapParentChildRelation.Error;
872
+
873
+ const newInstance =
874
+ createStateFromTypeAndSubscribe(
875
+ newOutputMapTransfer,
876
+ props.project.logic
877
+ ) as OutputMapState;
878
+
879
+ newInstance.hydrateAncestors();
880
+ newInstance.addSelfToProject(changeSet);
881
+
882
+ changeSet.add(
883
+ newInstance,
884
+ ChangeSetEntityChangeType.Added
885
+ );
886
+
887
+ newInstance.initChildren(changeSet);
888
+
889
+ props.project.renderAndCloseChangeSet(
890
+ changeSet
891
+ );
892
+ }
893
+
894
+ setExpandedError(!expandedError);
895
+ }}
896
+ id={`expand-inputs-icon-button--${call.id}`}
897
+ tooltip={
898
+ expandedError
899
+ ? 'Click to hide unused error output'
900
+ : 'Click to show unused error output'
901
+ }
902
+ tooltipPlacement="top"
903
+ style={{ marginTop: '6px' }}
904
+ parentDisabledReasons={disabledReasons}
905
+ />
906
+
907
+ {props.call.getDataType(null)?.entity?.id !==
908
+ BUILT_IN_BASE_ENTITY_IDS['primitive-entity'].void
909
+ .id && (
910
+ <MainValueOutput
911
+ entity={props.call}
912
+ canvasElement={props.canvasElement}
913
+ project={props.project}
914
+ parentDisabledReasons={disabledReasons}
915
+ />
916
+ )}
917
+
918
+ {call.inputs.length > 0 && (
919
+ <ul className="canvas-draggable-card__property-list">
920
+ {call.inputs
921
+ .sort((a, b) => {
922
+ // Sort by `.index` property
923
+ if (a.index < b.index) {
924
+ return -1;
925
+ }
926
+ if (a.index > b.index) {
927
+ return 1;
928
+ }
929
+ return 0;
930
+ })
931
+ .map((inputMap) => {
932
+ return (
933
+ <InputMapProperty
934
+ key={inputMap.id}
935
+ inputMap={inputMap}
936
+ entity={props.call}
937
+ canvasElement={props.canvasElement}
938
+ project={props.project}
939
+ parentDisabledReasons={
940
+ disabledReasons
941
+ }
942
+ size="small"
943
+ />
944
+ );
945
+ })}
946
+ </ul>
947
+ )}
948
+ {(call.outputs || []).length > 0 && (
949
+ <ul className="canvas-draggable-card__property-list">
950
+ {(call.outputs || [])
951
+ .sort((a, b) => {
952
+ // Sort by `.index` property
953
+ if (a.index < b.index) {
954
+ return -1;
955
+ }
956
+ if (a.index > b.index) {
957
+ return 1;
958
+ }
959
+ return 0;
960
+ })
961
+ .map((outputMap) => (
962
+ <OutputMapProperty
963
+ key={outputMap.id}
964
+ outputMap={outputMap}
965
+ entity={props.call}
966
+ canvasElement={props.canvasElement}
967
+ project={props.project}
968
+ parentDisabledReasons={disabledReasons}
969
+ size="small"
970
+ />
971
+ ))}
972
+ </ul>
973
+ )}
974
+ </div>
975
+ </div>
976
+ </div>
977
+ );
978
+ }