@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,1247 @@
1
+ import React, {
2
+ useCallback,
3
+ useEffect,
4
+ useLayoutEffect,
5
+ useRef,
6
+ useState
7
+ } from 'react';
8
+ import parse from 'style-to-object';
9
+ import './draggable-entity-card.css';
10
+ import {
11
+ getCanvasEntityDOMId,
12
+ resolveEntityColorClass,
13
+ getCardGradientStatement,
14
+ resolveCardSubheader,
15
+ fromDisabledReasonsToCardState,
16
+ safeResolveEntityName,
17
+ entityDisabledReasonToShortReadableError
18
+ } from '../../services/editor/ui';
19
+ import Button from '../../lib/button/Button';
20
+ import { Canvas } from '../../lib/canvas';
21
+ import InputMapProperty from './InputMapProperty';
22
+ import TestEntityButton from './TestEntityButton';
23
+ import OutputMapProperty from './OutputMapProperty';
24
+ import SuccessFailureNodes from './SuccessFailureNodes';
25
+ import {
26
+ FunctionCallState,
27
+ OperationState,
28
+ EntityType,
29
+ ConditionState,
30
+ SearchState,
31
+ ValueDescriptorState,
32
+ ValueDescriptorParentChildRelation,
33
+ ProjectState,
34
+ createStateFromTypeAndSubscribe,
35
+ IValueDescriptorTransfer,
36
+ ChangeSet,
37
+ OutputMapState,
38
+ getDeclarationOutputedError,
39
+ IActionOutputMapTransfer,
40
+ OutputMapParentChildRelation,
41
+ ChangeSetEntityChangeType,
42
+ ActionInputMapState,
43
+ CanvasEntityConnectionDisabledReason,
44
+ CanvasEntityDisabledReason,
45
+ CanvasEntityOtherDisabledReason,
46
+ CanvasEntityTestingDisabledReason,
47
+ ALL_CONNECTION_DISABLED_REASONS,
48
+ addDisabledReasons,
49
+ removeDisabledReasons,
50
+ READABLE_ENTITY_TYPES,
51
+ BUILT_IN_BASE_ENTITY_IDS,
52
+ lowercaseFirstLetter,
53
+ StateMutationAction
54
+ } from '@elyx-code/project-logic-tree';
55
+ import CanvasPopup, { useCanvasPopup } from '../../services/editor/CanvasPopup';
56
+ import CanvasPopupBaseComponent from '../../lib/popup/CanvasPopupBaseComponent';
57
+ import CanvasDropdownMenuCard from '../../lib/dropdown/CanvasDropdownMenuCard';
58
+ import ErrorMapProperty from './ErrorMapProperty';
59
+ import LogicErrorIconMenu from './logic-error/LogicErrorIconMenu';
60
+ import { ICanvasElementComponentProps } from '../../services/editor/CanvasElement';
61
+ import ExpandPropertiesIconButton from './expand-properties-icon-button/ExpandPropertiesIconButton';
62
+ import NewDynamicInputButton from './new-card-input-button/NewDynamicInputButton';
63
+ import { ConnectionNodeType, EditorService } from '../../services/editor';
64
+ import NewCardInputButton from './new-card-input-button/NewCardInputButton';
65
+ import { initializeNewInputDeclarationForSearch } from '../../services/editor/utils';
66
+ import EntityIcon from '../entity-icon/EntityIcon';
67
+ import MainValueOutput from './MainValueOutput';
68
+ import EntityLockedIconMenu from './entity-locked-icon/EntityLockedIcon';
69
+ import UnreachableMarker from './UnreachableMarker';
70
+ import { popupNotification } from '../../popup-notification';
71
+
72
+ interface IPassthroughEntityCardProps extends ICanvasElementComponentProps {
73
+ entity: OperationState | FunctionCallState | SearchState;
74
+ }
75
+
76
+ const PassthroughEntityCard = (props: IPassthroughEntityCardProps) => {
77
+ const rootElementRef = useRef(null);
78
+
79
+ useEffect(() => {
80
+ const element = rootElementRef.current;
81
+
82
+ if (!!element && document.contains(element)) {
83
+ props.onMount?.(element);
84
+ }
85
+
86
+ // When the component is unmounted
87
+ return () => {
88
+ props.onUnmount?.();
89
+ };
90
+ }, []);
91
+
92
+ useEffect(() => {
93
+ const element = rootElementRef.current;
94
+
95
+ props.onUpdate?.(element);
96
+ });
97
+
98
+ useLayoutEffect(() => {
99
+ props.onBeforeUpdate?.();
100
+ }, []);
101
+
102
+ const [disabledReasons, setDisabledReasons] = useState<
103
+ CanvasEntityDisabledReason[]
104
+ >([]);
105
+
106
+ const [updateKey, setValue] = useState(0);
107
+
108
+ const useForceUpdate = () => {
109
+ return () => setValue((value) => value + 1);
110
+ };
111
+ const forceUpdate = useForceUpdate(); // Update the component
112
+
113
+ const [expandedError, setExpandedError] = useState<boolean>(false);
114
+
115
+ const memoizedCanvasPopupBody = useCallback(
116
+ (popup: CanvasPopup) => (
117
+ <CanvasPopupBaseComponent
118
+ id={
119
+ 'canvas-small-entity-card-menu-button-' +
120
+ props.entity.id +
121
+ '--popup--body'
122
+ }
123
+ >
124
+ <CanvasDropdownMenuCard
125
+ options={[
126
+ {
127
+ project: props.project,
128
+ onClick: async () => {
129
+ await props.project.remove(props.entity.id);
130
+ },
131
+ label: 'Delete',
132
+ color: 'error',
133
+ iconEnd: 'fa-solid fa-trash-can',
134
+ disabled: !entity.deletable,
135
+ tooltip: entity.deletable
136
+ ? 'Forever delete this node'
137
+ : 'This node cannot be deleted. Because the system need to refer to it over time.',
138
+ parentCanvasObject: popup.self,
139
+ id:
140
+ 'canvas--' +
141
+ props.entity.type +
142
+ '-card--' +
143
+ props.entity.id +
144
+ '--delete'
145
+ },
146
+ {
147
+ project: props.project,
148
+ onClick: async () => {
149
+ props.project?.canvas?.unselectAll();
150
+
151
+ EditorService.navigate(
152
+ `${props.project?.editorBasePath}/entity/${props.entity.type}/${props.entity.id}`
153
+ );
154
+ },
155
+ label: 'Edit',
156
+ iconEnd: 'fa-solid fa-pencil',
157
+ disabled: false,
158
+ tooltip: !props.entity.editable
159
+ ? `This ${lowercaseFirstLetter(
160
+ READABLE_ENTITY_TYPES[props.entity.type]
161
+ .singular
162
+ )} has been locked and can no longer be edited`
163
+ : `Edit this ${lowercaseFirstLetter(
164
+ READABLE_ENTITY_TYPES[props.entity.type]
165
+ .singular
166
+ )}`,
167
+ parentCanvasObject: popup.self,
168
+ id:
169
+ 'canvas--' +
170
+ props.entity.type +
171
+ '-card--' +
172
+ props.entity.id +
173
+ '--edit'
174
+ },
175
+ {
176
+ project: props.project,
177
+ onClick: async () => {
178
+ let actionName =
179
+ StateMutationAction.RecalculateNode;
180
+
181
+ if (
182
+ props.entity.type === EntityType.Operation
183
+ ) {
184
+ actionName =
185
+ StateMutationAction.RecalculateOperation;
186
+ } else if (
187
+ props.entity.type ===
188
+ EntityType.FunctionCall
189
+ ) {
190
+ actionName =
191
+ StateMutationAction.RecalculateFuncCall;
192
+ } else if (
193
+ props.entity.type === EntityType.Search
194
+ ) {
195
+ actionName =
196
+ StateMutationAction.RecalculateSearch;
197
+ }
198
+
199
+ const changeSet =
200
+ props.project.logic.addChangeSet(
201
+ new ChangeSet(
202
+ props.project.logic,
203
+ ProjectState.sessionAuthor,
204
+ new Date().toISOString(),
205
+ entity,
206
+ false,
207
+ actionName
208
+ )
209
+ );
210
+
211
+ entity.afterAllChildrenInitialized(changeSet);
212
+
213
+ props.project.renderAndCloseChangeSet(
214
+ changeSet
215
+ );
216
+ },
217
+ label: 'Recalculate',
218
+ color: 'warning',
219
+ // Bug icon
220
+ iconEnd: 'fa-solid fa-bug',
221
+ disabled: false,
222
+ // Lower case the first letter of the resolved readable name
223
+ tooltip:
224
+ 'Recalculate the state of this ' +
225
+ lowercaseFirstLetter(
226
+ READABLE_ENTITY_TYPES[props.entity.type]
227
+ .shortSingular
228
+ ),
229
+ parentCanvasObject: popup.self,
230
+ id:
231
+ 'canvas--' +
232
+ props.entity.type +
233
+ '-card--' +
234
+ props.entity.id +
235
+ '--recalculate'
236
+ },
237
+ {
238
+ project: props.project,
239
+ onClick: async () => {
240
+ let actionName = entity.catchesError
241
+ ? StateMutationAction.ChangeNodeToThrowErrors
242
+ : StateMutationAction.ChangeNodeToCatchErrors;
243
+
244
+ if (
245
+ props.entity.type === EntityType.Operation
246
+ ) {
247
+ actionName = entity.catchesError
248
+ ? StateMutationAction.ChangeOperationToThrowErrors
249
+ : StateMutationAction.ChangeOperationToCatchErrors;
250
+ } else if (
251
+ props.entity.type ===
252
+ EntityType.FunctionCall
253
+ ) {
254
+ actionName = entity.catchesError
255
+ ? StateMutationAction.ChangeFuncCallToThrowErrors
256
+ : StateMutationAction.ChangeFuncCallToCatchErrors;
257
+ } else if (
258
+ props.entity.type === EntityType.Search
259
+ ) {
260
+ actionName = entity.catchesError
261
+ ? StateMutationAction.ChangeSearchToThrowErrors
262
+ : StateMutationAction.ChangeSearchToCatchErrors;
263
+ }
264
+
265
+ const changeSet =
266
+ props.project.logic.addChangeSet(
267
+ new ChangeSet(
268
+ props.project.logic,
269
+ ProjectState.sessionAuthor,
270
+ new Date().toISOString(),
271
+ entity,
272
+ false,
273
+ actionName
274
+ )
275
+ );
276
+
277
+ entity.metaSync(
278
+ {
279
+ catchesError: !entity.catchesError
280
+ },
281
+ changeSet
282
+ );
283
+
284
+ props.project.renderAndCloseChangeSet(
285
+ changeSet
286
+ );
287
+ },
288
+ label:
289
+ entity.catchesError ||
290
+ !!entity.errorCalls.length
291
+ ? 'Errors are caught'
292
+ : 'Errors terminate execution',
293
+ color: 'error',
294
+ disabled: !!entity.errorCalls.length,
295
+ iconEnd:
296
+ entity.catchesError ||
297
+ !!entity.errorCalls.length
298
+ ? 'fa-solid fa-xmark'
299
+ : 'fa-solid fa-ban',
300
+ subLabel: !!entity.errorCalls.length
301
+ ? 'Error call connected nodes'
302
+ : entity.catchesError
303
+ ? 'Click to throw error instead'
304
+ : 'Click to catch errors instead',
305
+ tooltip: !!entity.errorCalls.length
306
+ ? 'Remove all connected nodes to the error branch if you want to throw the error instead'
307
+ : entity.catchesError
308
+ ? 'Currently, if an error occurs, all other branches will continue executing.'
309
+ : 'Currently, if an error occurs it will terminate all ongoing executions. Including paralel branches.',
310
+ parentCanvasObject: popup.self,
311
+ id:
312
+ `canvas--${entity.type}--` +
313
+ props.entity.id +
314
+ '--error-handling'
315
+ },
316
+ {
317
+ project: props.project,
318
+ onClick: async () => {
319
+ navigator.clipboard.writeText(props.entity.id);
320
+ popupNotification({
321
+ text: `Copied ID: ${props.entity.id}`,
322
+ color: 'success'
323
+ });
324
+ },
325
+ label: 'Copy ID',
326
+ color: 'warning',
327
+ iconEnd: 'fa-solid fa-bug',
328
+ tooltip:
329
+ 'Copy this node ID to clipboard for debugging',
330
+ parentCanvasObject: popup.self,
331
+ id: 'copy-id-' + props.entity.id
332
+ },
333
+ {
334
+ project: props.project,
335
+ onClick: async () => {
336
+ await props.project.recalculateValidateEntity(
337
+ props.entity
338
+ );
339
+ popupNotification({
340
+ text: `Re-validated node successfully`,
341
+ color: 'success'
342
+ });
343
+ },
344
+ label: 'Re-validate',
345
+ color: 'warning',
346
+ iconEnd: 'fa-solid fa-bug',
347
+ tooltip:
348
+ "Re-validate this node's state and its errors",
349
+ parentCanvasObject: popup.self,
350
+ id: 're-validate-' + props.entity.id
351
+ }
352
+ ]}
353
+ />
354
+ </CanvasPopupBaseComponent>
355
+ ),
356
+ [props.entity, props.project]
357
+ );
358
+
359
+ const canvasPopup = useCanvasPopup(
360
+ {
361
+ editor: props.project,
362
+ id:
363
+ 'canvas-small-entity-card-menu-button-' +
364
+ props.entity.id +
365
+ '--popup',
366
+ anchorQuerySelector:
367
+ '#canvas-small-entity-card-menu-button-' + props.entity.id,
368
+ arrowClasses: ['dropdown-menu-card-arrow'],
369
+ parentCanvasObject: props.canvasElement.draggableObject,
370
+ arrowContainerSelector:
371
+ '#canvas-small-entity-card-menu-button-' +
372
+ props.entity.id +
373
+ '--popup--body'
374
+ },
375
+ memoizedCanvasPopupBody
376
+ );
377
+
378
+ useEffect(() => {
379
+ // --- Initial Setup Logic ---
380
+ const initialNewDisabledReasons: CanvasEntityOtherDisabledReason[] = [];
381
+
382
+ // @ts-ignore
383
+ if (props.entity.suggestion) {
384
+ initialNewDisabledReasons.push(
385
+ CanvasEntityOtherDisabledReason.Suggestion
386
+ );
387
+ }
388
+
389
+ if (props.project.canvas?.disabled) {
390
+ initialNewDisabledReasons.push(
391
+ CanvasEntityOtherDisabledReason.CanvasGloballyDisabled
392
+ );
393
+ }
394
+
395
+ if (!!initialNewDisabledReasons.length) {
396
+ setDisabledReasons((currentReasons) => {
397
+ const config = addDisabledReasons(
398
+ currentReasons,
399
+ initialNewDisabledReasons
400
+ );
401
+ return config.reasons;
402
+ });
403
+ } else {
404
+ setDisabledReasons((currentReasons) => {
405
+ const config = removeDisabledReasons(currentReasons, [
406
+ CanvasEntityOtherDisabledReason.CanvasGloballyDisabled
407
+ ]);
408
+ return config.reasons;
409
+ });
410
+ }
411
+
412
+ const handleCanvasGloballyEnabled = () => {
413
+ setDisabledReasons((currentReasons) => {
414
+ const config = removeDisabledReasons(currentReasons, [
415
+ CanvasEntityOtherDisabledReason.CanvasGloballyDisabled
416
+ ]);
417
+ return config.reasons;
418
+ });
419
+ };
420
+ const handleCanvasGloballyDisabled = () => {
421
+ setDisabledReasons((currentReasons) => {
422
+ const config = addDisabledReasons(currentReasons, [
423
+ CanvasEntityOtherDisabledReason.CanvasGloballyDisabled
424
+ ]);
425
+ return config.reasons;
426
+ });
427
+ };
428
+
429
+ const handleEntityUpdate = (payload: any) => {
430
+ let hasUpdated = false;
431
+ const newDisabledReasons: CanvasEntityTestingDisabledReason[] = [];
432
+ const disabledReasonsToRemove: CanvasEntityTestingDisabledReason[] =
433
+ [];
434
+
435
+ props.project.test?.disabledConnectionsNotInTest(
436
+ props.canvasElement.draggableObject,
437
+ props.entity
438
+ );
439
+
440
+ if (
441
+ !!props.project.test &&
442
+ !props.project.test?.hasEntity(props.entity) &&
443
+ !props.project.test?.getCanBeAddedToTest(props.entity)
444
+ ) {
445
+ props.project.canvas?.disable(
446
+ props.canvasElement.draggableObject,
447
+ {
448
+ quiet: true
449
+ }
450
+ );
451
+
452
+ newDisabledReasons.push(
453
+ CanvasEntityTestingDisabledReason.CannotBeAddedToTest
454
+ );
455
+ }
456
+
457
+ if (
458
+ (props.project.test?.hasEntity(props.entity) ||
459
+ props.project.test?.getCanBeAddedToTest(props.entity)) &&
460
+ props.canvasElement.draggableObject.disabled
461
+ ) {
462
+ props.project.canvas?.enable(
463
+ props.canvasElement.draggableObject,
464
+ {
465
+ quiet: true
466
+ }
467
+ );
468
+
469
+ disabledReasonsToRemove.push(
470
+ CanvasEntityTestingDisabledReason.CannotBeAddedToTest
471
+ );
472
+ }
473
+
474
+ if (
475
+ !!props.project.test &&
476
+ !props.project.test?.hasEntity(props.entity)
477
+ ) {
478
+ newDisabledReasons.push(
479
+ CanvasEntityTestingDisabledReason.NotPartOfOngoingTest
480
+ );
481
+ } else if (
482
+ !!props.project.test &&
483
+ props.project.test?.hasEntity(props.entity)
484
+ ) {
485
+ disabledReasonsToRemove.push(
486
+ CanvasEntityTestingDisabledReason.NotPartOfOngoingTest
487
+ );
488
+ }
489
+
490
+ if (newDisabledReasons.length || disabledReasonsToRemove.length) {
491
+ setDisabledReasons((currentReasons) => {
492
+ const config = addDisabledReasons(
493
+ currentReasons,
494
+ newDisabledReasons
495
+ );
496
+ const finalConfig = removeDisabledReasons(
497
+ config.reasons,
498
+ disabledReasonsToRemove
499
+ );
500
+ return finalConfig.reasons;
501
+ });
502
+ hasUpdated = true;
503
+ }
504
+
505
+ if (!hasUpdated) {
506
+ forceUpdate();
507
+ }
508
+ };
509
+
510
+ const handleTestSetupStarted = () => {
511
+ const newDisabledReasons: CanvasEntityTestingDisabledReason[] = [];
512
+
513
+ if (
514
+ !!props.project.test &&
515
+ !props.project.test?.hasEntity(props.entity) &&
516
+ !props.project.test?.getCanBeAddedToTest(props.entity)
517
+ ) {
518
+ props.project.canvas?.disable(
519
+ props.canvasElement.draggableObject,
520
+ {
521
+ quiet: true
522
+ }
523
+ );
524
+ props.project.test?.disabledConnectionsNotInTest(
525
+ props.canvasElement.draggableObject,
526
+ props.entity
527
+ );
528
+
529
+ newDisabledReasons.push(
530
+ CanvasEntityTestingDisabledReason.CannotBeAddedToTest
531
+ );
532
+ }
533
+
534
+ if (!props.project.test?.hasEntity(props.entity)) {
535
+ newDisabledReasons.push(
536
+ CanvasEntityTestingDisabledReason.NotPartOfOngoingTest
537
+ );
538
+ }
539
+
540
+ setDisabledReasons((currentReasons) => {
541
+ const config = addDisabledReasons(
542
+ currentReasons,
543
+ newDisabledReasons
544
+ );
545
+ return config.reasons;
546
+ });
547
+ };
548
+
549
+ const handleExecutionStart = () => {
550
+ if (!!props.project.test?.hasEntity(props.entity)) {
551
+ forceUpdate();
552
+ }
553
+ };
554
+
555
+ const handleTestExited = () => {
556
+ setDisabledReasons((currentReasons) => {
557
+ const config = removeDisabledReasons(currentReasons, [
558
+ CanvasEntityTestingDisabledReason.NotPartOfOngoingTest,
559
+ CanvasEntityTestingDisabledReason.CannotBeAddedToTest
560
+ ]);
561
+ return config.reasons;
562
+ });
563
+
564
+ if (props.canvasElement.draggableObject.disabled) {
565
+ props.project.canvas?.enable(
566
+ props.canvasElement.draggableObject,
567
+ {
568
+ quiet: true
569
+ }
570
+ );
571
+ }
572
+
573
+ props.canvasElement.draggableObject.connections.forEach(
574
+ (connection) => {
575
+ connection.enable();
576
+ connection.element.classList.remove('disabled');
577
+
578
+ if (connection.complementaryLineElement) {
579
+ connection.complementaryLineElement.classList.remove(
580
+ 'disabled'
581
+ );
582
+ }
583
+ }
584
+ );
585
+ };
586
+
587
+ const handleCanvasConnectionStart = (payload: any) => {
588
+ if (!payload.compatible?.[props.entity.id]) {
589
+ props.project.canvas?.disable(
590
+ props.canvasElement.draggableObject,
591
+ {
592
+ quiet: true
593
+ }
594
+ );
595
+
596
+ const newOwnConnectionDisabledReasons: CanvasEntityConnectionDisabledReason[] =
597
+ payload.incompatible?.[props.entity.id]?.reasons || [];
598
+
599
+ setDisabledReasons((currentReasons) => {
600
+ const config = addDisabledReasons(
601
+ currentReasons,
602
+ newOwnConnectionDisabledReasons
603
+ );
604
+ return config.reasons;
605
+ });
606
+ } else {
607
+ forceUpdate();
608
+ }
609
+ };
610
+
611
+ const handleCanvasConnectionEnd = () => {
612
+ props.project.canvas?.enable(props.canvasElement.draggableObject, {
613
+ quiet: true
614
+ });
615
+
616
+ setDisabledReasons((currentReasons) => {
617
+ const config = removeDisabledReasons(
618
+ currentReasons,
619
+ ALL_CONNECTION_DISABLED_REASONS
620
+ );
621
+ return config.reasons;
622
+ });
623
+ };
624
+
625
+ props.project.on(
626
+ 'canvas-globally-enabled',
627
+ handleCanvasGloballyEnabled
628
+ );
629
+ props.project.on(
630
+ 'canvas-globally-disabled',
631
+ handleCanvasGloballyDisabled
632
+ );
633
+ props.project.on(props.entity.id, handleEntityUpdate);
634
+ props.project.on('test-setup-started', handleTestSetupStarted);
635
+ props.project.on('execution-start', handleExecutionStart);
636
+ props.project.on('test-exited', handleTestExited);
637
+ props.project.on(
638
+ 'canvas-connection-start',
639
+ handleCanvasConnectionStart
640
+ );
641
+ props.project.on('canvas-connection-end', handleCanvasConnectionEnd);
642
+
643
+ return () => {
644
+ props.project.off(
645
+ 'canvas-globally-enabled',
646
+ handleCanvasGloballyEnabled
647
+ );
648
+ props.project.off(
649
+ 'canvas-globally-disabled',
650
+ handleCanvasGloballyDisabled
651
+ );
652
+ props.project.off(props.entity.id, handleEntityUpdate);
653
+ props.project.off('test-setup-started', handleTestSetupStarted);
654
+ props.project.off('execution-start', handleExecutionStart);
655
+ props.project.off('test-exited', handleTestExited);
656
+ props.project.off(
657
+ 'canvas-connection-start',
658
+ handleCanvasConnectionStart
659
+ );
660
+ props.project.off(
661
+ 'canvas-connection-end',
662
+ handleCanvasConnectionEnd
663
+ );
664
+ };
665
+ }, [
666
+ props.project,
667
+ props.entity,
668
+ props.canvasElement,
669
+ updateKey,
670
+ // @ts-ignore
671
+ props.entity.suggestion
672
+ ]);
673
+
674
+ useEffect(() => {
675
+ props.canvasElement.draggableObject.updateConnections();
676
+ });
677
+
678
+ const entity = props.entity;
679
+
680
+ const classes = ['canvas-draggable-card'];
681
+
682
+ const dynamicInputsValueDescriptors: ValueDescriptorState[] = [];
683
+
684
+ if (props.entity.type !== EntityType.Search) {
685
+ props.entity.declaration.inputs.forEach((input) => {
686
+ if (
687
+ (input as ValueDescriptorState).parentRelationType ===
688
+ ValueDescriptorParentChildRelation.DynamicArgument
689
+ ) {
690
+ dynamicInputsValueDescriptors.push(
691
+ input as ValueDescriptorState
692
+ );
693
+ }
694
+ });
695
+ }
696
+
697
+ const commonInputButtonAllowed =
698
+ !props.project.test &&
699
+ !disabledReasons.includes(CanvasEntityOtherDisabledReason.Suggestion) &&
700
+ !disabledReasons.includes(
701
+ CanvasEntityOtherDisabledReason.CanvasGloballyDisabled
702
+ ) &&
703
+ !disabledReasons.includes(
704
+ CanvasEntityTestingDisabledReason.NotPartOfOngoingTest
705
+ ) &&
706
+ !disabledReasons.includes(
707
+ CanvasEntityTestingDisabledReason.CannotBeAddedToTest
708
+ ) &&
709
+ (!props.project.onGoingConnectionNodeType ||
710
+ (props.project.onGoingConnectionNodeType &&
711
+ props.project.onGoingConnectionNodeType ===
712
+ ConnectionNodeType.PropertyOut)) &&
713
+ !disabledReasons.includes(
714
+ CanvasEntityConnectionDisabledReason.NotInScope
715
+ );
716
+
717
+ const showNewDynamicInputButton =
718
+ commonInputButtonAllowed &&
719
+ // If the entity is a function call or a search, we don't show the new input button
720
+ ![EntityType.FunctionCall, EntityType.Search].includes(entity.type);
721
+
722
+ const showNewInlineDeclaredInputButton =
723
+ commonInputButtonAllowed &&
724
+ entity.type === EntityType.Search &&
725
+ !showNewDynamicInputButton;
726
+
727
+ return (
728
+ <div
729
+ ref={rootElementRef}
730
+ className={classes.join(' ')}
731
+ id={getCanvasEntityDOMId(props.entity)}
732
+ {...{
733
+ [Canvas.OBJ_ATTR_NAME]: getCanvasEntityDOMId(props.entity)
734
+ }}
735
+ onClick={(e) => {
736
+ e.stopPropagation();
737
+ }}
738
+ >
739
+ <TestEntityButton
740
+ entity={props.entity}
741
+ canvasElement={props.canvasElement}
742
+ project={props.project}
743
+ parentDisabledReasons={disabledReasons}
744
+ />
745
+ {/* Floats "Unreachable!" above the right side of the header when
746
+ the entity carries the blocked-reachability error. Same DOM
747
+ placement as VariableScopeMarker on VariableCard so the
748
+ `position: absolute` offsets resolve against the outer
749
+ canvas-draggable-card div. Returns null when reachable. */}
750
+ <UnreachableMarker
751
+ entity={props.entity}
752
+ parentDisabledReasons={disabledReasons}
753
+ project={props.project}
754
+ draggableObject={props.canvasElement.draggableObject}
755
+ />
756
+ <div
757
+ className={[
758
+ 'canvas-draggable-card__body',
759
+ ...(!!disabledReasons.length
760
+ ? ['canvas-draggable-card__body__disabled']
761
+ : []),
762
+ resolveEntityColorClass(props.entity.type, {
763
+ state: fromDisabledReasonsToCardState(disabledReasons)
764
+ })
765
+ ].join(' ')}
766
+ >
767
+ <header
768
+ className="canvas-draggable-card__header"
769
+ {...{
770
+ [Canvas.OBJ_ATTR_NAME]:
771
+ getCanvasEntityDOMId(props.entity) + '--header'
772
+ }}
773
+ style={parse(
774
+ getCardGradientStatement(entity, {
775
+ state: fromDisabledReasonsToCardState(
776
+ disabledReasons
777
+ )
778
+ })
779
+ )}
780
+ onMouseOver={(e: any) => {
781
+ if (!!props.project.canvas?.activeConnectionDrawing) {
782
+ if (
783
+ !!props.project
784
+ .onGoingConnectionIncompatibleEntities?.[
785
+ props.entity.id
786
+ ]
787
+ ) {
788
+ // Read the disabled reasons and add a tooltip to the mouse
789
+ const reasonsMessage =
790
+ props.project.onGoingConnectionIncompatibleEntities?.[
791
+ props.entity.id
792
+ ].reasons
793
+ .map((reason) =>
794
+ entityDisabledReasonToShortReadableError(
795
+ reason
796
+ )
797
+ )
798
+ .join('.\n');
799
+
800
+ props.project.canvas?.showTooltip(
801
+ 'connection-disabled-reasons-test-entity-button',
802
+ reasonsMessage
803
+ );
804
+ if (props.project.canvas) {
805
+ props.project.canvas.tooltip.style.fontSize =
806
+ '28px';
807
+ props.project.canvas.canvasElement.style.cursor =
808
+ 'not-allowed';
809
+ }
810
+ }
811
+ }
812
+ }}
813
+ onMouseLeave={(e: any) => {
814
+ props.project.canvas?.hideTooltip(
815
+ 'connection-disabled-reasons-test-entity-button'
816
+ );
817
+ }}
818
+ >
819
+ <div className="canvas-draggable-card__header__left-block">
820
+ <EntityIcon
821
+ entity={entity}
822
+ size="medium"
823
+ color="black"
824
+ parentDisabledReasons={disabledReasons}
825
+ project={props.project}
826
+ parentCanvasObject={
827
+ props.canvasElement.draggableObject
828
+ }
829
+ />
830
+ <span className="canvas-draggable-card__header__labels">
831
+ <h3>
832
+ {safeResolveEntityName(
833
+ entity,
834
+ props.project.logic
835
+ )}
836
+ </h3>
837
+ <p>{resolveCardSubheader(entity)}</p>
838
+ </span>
839
+ </div>
840
+ <div className="canvas-draggable-card__header__actions">
841
+ <EntityLockedIconMenu
842
+ entity={entity}
843
+ project={props.project}
844
+ canvasElement={props.canvasElement}
845
+ parentDisabledReasons={disabledReasons}
846
+ />
847
+ <LogicErrorIconMenu
848
+ entity={entity}
849
+ project={props.project}
850
+ canvasElement={props.canvasElement}
851
+ parentDisabledReasons={disabledReasons}
852
+ />
853
+ <Button
854
+ variant="text"
855
+ color="grey"
856
+ iconEnd="fa-solid fa-ellipsis-v"
857
+ size="small"
858
+ ref={canvasPopup.anchorRef}
859
+ className="canvas-small-entity-card-menu-button"
860
+ id={`canvas-small-entity-card-menu-button-${entity.id}`}
861
+ disabled={!!disabledReasons.length}
862
+ onClick={(e: any) => {
863
+ e.stopPropagation();
864
+ canvasPopup?.toggle();
865
+ }}
866
+ onDoubleClick={(
867
+ e: React.MouseEvent<HTMLButtonElement>
868
+ ) => {
869
+ e.stopPropagation();
870
+ if (disabledReasons.length) return;
871
+ props.project?.canvas?.unselectAll();
872
+ EditorService.navigate(
873
+ `${props.project?.editorBasePath}/entity/${props.entity.type}/${props.entity.id}`
874
+ );
875
+ }}
876
+ />
877
+ <SuccessFailureNodes
878
+ entity={entity}
879
+ draggableObject={
880
+ props.canvasElement.draggableObject
881
+ }
882
+ project={props.project}
883
+ parentDisabledReasons={disabledReasons}
884
+ />
885
+ </div>
886
+ </header>
887
+ <div className="canvas-draggable-card__content">
888
+ {/* {((entity as OperationState)?.process?.writesValues || []).length >
889
+ 0 && (
890
+ <ExecutionInProgressValue
891
+ entity={entity as OperationState}
892
+ draggableObject={props.canvasElement.draggableObject}
893
+ project={props.project}
894
+ parentDisabledReasons={disabledReasons}
895
+ />
896
+ )} */}
897
+ {!!(entity as FunctionCallState).error ? (
898
+ <ErrorMapProperty
899
+ outputMap={(entity as FunctionCallState).error}
900
+ entity={entity}
901
+ draggableObject={
902
+ props.canvasElement.draggableObject
903
+ }
904
+ project={props.project}
905
+ parentDisabledReasons={disabledReasons}
906
+ />
907
+ ) : (
908
+ <>
909
+ {expandedError && (
910
+ <ErrorMapProperty
911
+ outputMap={
912
+ (entity as OperationState).error || null
913
+ }
914
+ entity={entity}
915
+ draggableObject={
916
+ props.canvasElement.draggableObject
917
+ }
918
+ project={props.project}
919
+ parentDisabledReasons={disabledReasons}
920
+ />
921
+ )}
922
+
923
+ <ExpandPropertiesIconButton
924
+ project={props.project}
925
+ expanded={expandedError}
926
+ draggableObject={
927
+ props.canvasElement.draggableObject
928
+ }
929
+ onClick={() => {
930
+ const errorDeclaration =
931
+ getDeclarationOutputedError(entity);
932
+
933
+ // Create error output-map entity before expanding the error for the first time
934
+ if (!entity.error && !expandedError) {
935
+ let actionName =
936
+ StateMutationAction.AddErrorOutputToNode;
937
+
938
+ if (
939
+ props.entity.type ===
940
+ EntityType.Operation
941
+ ) {
942
+ actionName =
943
+ StateMutationAction.AddErrorOutputToOperation;
944
+ } else if (
945
+ props.entity.type ===
946
+ EntityType.FunctionCall
947
+ ) {
948
+ actionName =
949
+ StateMutationAction.AddErrorOutputToFuncCall;
950
+ } else if (
951
+ props.entity.type ===
952
+ EntityType.Search
953
+ ) {
954
+ actionName =
955
+ StateMutationAction.AddErrorOutputToSearch;
956
+ }
957
+
958
+ const changeSet =
959
+ props.project.logic.addChangeSet(
960
+ new ChangeSet(
961
+ props.project.logic,
962
+ ProjectState.sessionAuthor,
963
+ new Date().toISOString(),
964
+ entity,
965
+ false,
966
+ actionName
967
+ )
968
+ );
969
+
970
+ const newOutputMapTransfer: IActionOutputMapTransfer =
971
+ OutputMapState.new(
972
+ changeSet
973
+ ) as IActionOutputMapTransfer;
974
+ newOutputMapTransfer.parent =
975
+ entity.toReference();
976
+ newOutputMapTransfer.declaration =
977
+ (errorDeclaration?.toJSON() as IValueDescriptorTransfer) ||
978
+ null;
979
+ newOutputMapTransfer.parentRelationType =
980
+ OutputMapParentChildRelation.Error;
981
+
982
+ const newInstance =
983
+ createStateFromTypeAndSubscribe(
984
+ newOutputMapTransfer,
985
+ props.project.logic
986
+ ) as OutputMapState;
987
+
988
+ newInstance.hydrateAncestors();
989
+ newInstance.addSelfToProject(changeSet);
990
+
991
+ changeSet.add(
992
+ newInstance,
993
+ ChangeSetEntityChangeType.Added
994
+ );
995
+
996
+ newInstance.initChildren(changeSet);
997
+
998
+ props.project.renderAndCloseChangeSet(
999
+ changeSet
1000
+ );
1001
+ }
1002
+
1003
+ setExpandedError(!expandedError);
1004
+ }}
1005
+ id={`expand-inputs-icon-button--${entity.id}`}
1006
+ tooltip={
1007
+ expandedError
1008
+ ? 'Click to hide unused error output'
1009
+ : 'Click to show unused error output'
1010
+ }
1011
+ tooltipPlacement="top"
1012
+ style={{ marginTop: '6px' }}
1013
+ parentDisabledReasons={disabledReasons}
1014
+ />
1015
+ </>
1016
+ )}
1017
+
1018
+ {entity.getDataType(null)?.entity?.id !==
1019
+ BUILT_IN_BASE_ENTITY_IDS['primitive-entity'].void
1020
+ .id && (
1021
+ <MainValueOutput
1022
+ entity={entity}
1023
+ canvasElement={props.canvasElement}
1024
+ project={props.project}
1025
+ parentDisabledReasons={disabledReasons}
1026
+ />
1027
+ )}
1028
+
1029
+ {entity.inputs.length > 0 && (
1030
+ <ul className="canvas-draggable-card__property-list">
1031
+ {entity.inputs
1032
+ .sort((a, b) => {
1033
+ // Sort by `.index` property
1034
+ if (a.index < b.index) {
1035
+ return -1;
1036
+ }
1037
+ if (a.index > b.index) {
1038
+ return 1;
1039
+ }
1040
+ return 0;
1041
+ })
1042
+ .map((inputMap) => {
1043
+ return (
1044
+ <InputMapProperty
1045
+ key={inputMap.id}
1046
+ inputMap={inputMap}
1047
+ entity={props.entity}
1048
+ canvasElement={props.canvasElement}
1049
+ project={props.project}
1050
+ parentDisabledReasons={
1051
+ disabledReasons
1052
+ }
1053
+ />
1054
+ );
1055
+ })}
1056
+ </ul>
1057
+ )}
1058
+ {showNewInlineDeclaredInputButton && (
1059
+ <div
1060
+ className={[
1061
+ 'canvas-draggable-card__action-alt',
1062
+ 'align-left'
1063
+ ].join(' ')}
1064
+ >
1065
+ <NewCardInputButton
1066
+ iconStart="fa-solid fa-plus"
1067
+ size="small"
1068
+ parentDisabledReasons={disabledReasons}
1069
+ entity={entity as SearchState}
1070
+ project={props.project}
1071
+ canvasElement={props.canvasElement}
1072
+ onClick={() => {
1073
+ const { declaration: newInputDeclaration } =
1074
+ initializeNewInputDeclarationForSearch(
1075
+ props.project,
1076
+ entity,
1077
+ 'Input'
1078
+ );
1079
+
1080
+ EditorService.navigate(
1081
+ `${props.project?.editorBasePath}/entity/${EntityType.ValueDescriptor}/${newInputDeclaration.id}`
1082
+ );
1083
+ }}
1084
+ >
1085
+ Input
1086
+ </NewCardInputButton>
1087
+ </div>
1088
+ )}
1089
+ {showNewDynamicInputButton &&
1090
+ dynamicInputsValueDescriptors
1091
+ .sort((a, b) => {
1092
+ // Sort by `.index` property
1093
+ if (a.index < b.index) {
1094
+ return -1;
1095
+ }
1096
+ if (a.index > b.index) {
1097
+ return 1;
1098
+ }
1099
+ return 0;
1100
+ })
1101
+ .map((valueDescriptor) => {
1102
+ return (
1103
+ <div
1104
+ key={valueDescriptor.id}
1105
+ className={[
1106
+ 'canvas-draggable-card__action-alt',
1107
+ 'align-left'
1108
+ ].join(' ')}
1109
+ >
1110
+ <NewDynamicInputButton
1111
+ iconStart="fa-solid fa-plus"
1112
+ size="small"
1113
+ parentDisabledReasons={
1114
+ disabledReasons
1115
+ }
1116
+ entity={
1117
+ entity as
1118
+ | OperationState
1119
+ | ConditionState
1120
+ }
1121
+ inputValueDescriptor={
1122
+ valueDescriptor
1123
+ }
1124
+ project={props.project}
1125
+ canvasElement={props.canvasElement}
1126
+ onClick={() => {
1127
+ let actionName =
1128
+ StateMutationAction.AddInputToNode;
1129
+
1130
+ if (
1131
+ props.entity.type ===
1132
+ EntityType.Operation
1133
+ ) {
1134
+ actionName =
1135
+ StateMutationAction.AddInputToOperation;
1136
+ } else if (
1137
+ props.entity.type ===
1138
+ EntityType.FunctionCall
1139
+ ) {
1140
+ actionName =
1141
+ StateMutationAction.AddInputToFuncCall;
1142
+ } else if (
1143
+ props.entity.type ===
1144
+ EntityType.Search
1145
+ ) {
1146
+ actionName =
1147
+ StateMutationAction.AddInputToSearch;
1148
+ }
1149
+
1150
+ const changeSet =
1151
+ props.project.logic.addChangeSet(
1152
+ new ChangeSet(
1153
+ props.project.logic,
1154
+ ProjectState.sessionAuthor,
1155
+ new Date().toISOString(),
1156
+ entity,
1157
+ false,
1158
+ actionName
1159
+ )
1160
+ );
1161
+
1162
+ const newInputMapTransfer =
1163
+ ActionInputMapState.new(
1164
+ changeSet
1165
+ );
1166
+ newInputMapTransfer.parent =
1167
+ entity.toReference();
1168
+ newInputMapTransfer.declaration =
1169
+ valueDescriptor.toJSON() as IValueDescriptorTransfer;
1170
+ newInputMapTransfer.index =
1171
+ entity.inputs.length;
1172
+
1173
+ const newInputMap =
1174
+ createStateFromTypeAndSubscribe(
1175
+ newInputMapTransfer,
1176
+ props.project.logic
1177
+ ) as ValueDescriptorState;
1178
+
1179
+ newInputMap.hydrateAncestors();
1180
+
1181
+ changeSet.add(
1182
+ newInputMap,
1183
+ ChangeSetEntityChangeType.Added
1184
+ );
1185
+
1186
+ newInputMap.addSelfToProject(
1187
+ changeSet
1188
+ );
1189
+ newInputMap.afterAllChildrenInitialized(
1190
+ changeSet
1191
+ );
1192
+
1193
+ entity.afterAllChildrenInitialized(
1194
+ changeSet
1195
+ );
1196
+
1197
+ EditorService.navigate(
1198
+ `${props.project?.editorBasePath}/entity/${EntityType.InputMap}/${newInputMap.id}`
1199
+ );
1200
+
1201
+ props.project.renderAndCloseChangeSet(
1202
+ changeSet
1203
+ );
1204
+ }}
1205
+ >
1206
+ {safeResolveEntityName(
1207
+ valueDescriptor,
1208
+ props.project.logic
1209
+ )}
1210
+ </NewDynamicInputButton>
1211
+ </div>
1212
+ );
1213
+ })}
1214
+ {((entity as FunctionCallState).outputs || []).length >
1215
+ 0 && (
1216
+ <ul className="canvas-draggable-card__property-list">
1217
+ {((entity as FunctionCallState).outputs || [])
1218
+ .sort((a, b) => {
1219
+ // Sort by `.index` property
1220
+ if (a.index < b.index) {
1221
+ return -1;
1222
+ }
1223
+ if (a.index > b.index) {
1224
+ return 1;
1225
+ }
1226
+ return 0;
1227
+ })
1228
+ .map((outputMap) => (
1229
+ <OutputMapProperty
1230
+ key={outputMap.id}
1231
+ outputMap={outputMap}
1232
+ entity={props.entity}
1233
+ canvasElement={props.canvasElement}
1234
+ project={props.project}
1235
+ parentDisabledReasons={disabledReasons}
1236
+ size="small"
1237
+ />
1238
+ ))}
1239
+ </ul>
1240
+ )}
1241
+ </div>
1242
+ </div>
1243
+ </div>
1244
+ );
1245
+ };
1246
+
1247
+ export default PassthroughEntityCard;