@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,1543 @@
1
+ import React, {
2
+ useCallback,
3
+ useEffect,
4
+ useLayoutEffect,
5
+ useMemo,
6
+ useRef,
7
+ useState
8
+ } from 'react';
9
+ import parse from 'style-to-object';
10
+ import '../draggable-entity-card.css';
11
+ import './termination-statement-card.css';
12
+ import {
13
+ getCanvasEntityDOMId,
14
+ resolveEntityColorClass,
15
+ getCardGradientStatement,
16
+ fromDisabledReasonsToCardState,
17
+ safeResolveEntityName,
18
+ entityDisabledReasonToShortReadableError
19
+ } from '../../../services/editor/ui';
20
+ import Button from '../../../lib/button/Button';
21
+ import { Canvas } from '../../../lib/canvas';
22
+ import {
23
+ BreakStatementState,
24
+ ChangeSet,
25
+ ChangeSetEntityChangeType,
26
+ ContinueStatementState,
27
+ createStateFromTypeAndSubscribe,
28
+ EntityType,
29
+ FunctionDeclarationState,
30
+ ProjectState,
31
+ InputMapState,
32
+ ReturnStatementState,
33
+ removeDisabledReasons,
34
+ CanvasEntityConnectionDisabledReason,
35
+ CanvasEntityDisabledReason,
36
+ CanvasEntityOtherDisabledReason,
37
+ CanvasEntityTestingDisabledReason,
38
+ ALL_CONNECTION_DISABLED_REASONS,
39
+ addDisabledReasons,
40
+ READABLE_ENTITY_TYPES,
41
+ InputMapParentChildRelation,
42
+ lowercaseFirstLetter,
43
+ findNextAvailableName,
44
+ PropertyState,
45
+ IPropertyTransfer,
46
+ DataTypeState,
47
+ DefinitionEntityState,
48
+ TerminationInputMapState,
49
+ resolveCardSubheader,
50
+ BUILT_IN_BASE_ENTITY_IDS,
51
+ PrimitiveEntityState,
52
+ IPrimitiveEntityTransfer,
53
+ GlobalEventState,
54
+ StateMutationAction,
55
+ ValueWritingEntityState,
56
+ getParentCallerEntity,
57
+ flattenCallersWithCallType
58
+ } from '@elyx-code/project-logic-tree';
59
+ import InputMapProperty from '../InputMapProperty';
60
+ import CanvasPopup, {
61
+ useCanvasPopup
62
+ } from '../../../services/editor/CanvasPopup';
63
+ import CanvasPopupBaseComponent from '../../../lib/popup/CanvasPopupBaseComponent';
64
+ import CanvasDropdownMenuCard from '../../../lib/dropdown/CanvasDropdownMenuCard';
65
+ import ReturnedError from '../ReturnedError';
66
+ import LogicErrorIconMenu from '../logic-error/LogicErrorIconMenu';
67
+ import NewCardInputButton from '../new-card-input-button/NewCardInputButton';
68
+ import { ICanvasElementComponentProps } from '../../../services/editor/CanvasElement';
69
+ import TestEntityButton from '../TestEntityButton';
70
+ import { ConnectionNodeType, EditorService } from '../../../services/editor';
71
+ import MainValueInput from '../MainValueInput';
72
+ import DynamicValueEntry from '../../dynamic-value/DynamicValueEntry';
73
+ import DataTypeIcon from '../DataTypeIcon';
74
+ import EntityLockedIconMenu from '../entity-locked-icon/EntityLockedIcon';
75
+ import { popupNotification } from '../../../popup-notification';
76
+
77
+ interface ITerminationStatementCardProps extends ICanvasElementComponentProps {
78
+ entity: ReturnStatementState | ContinueStatementState | BreakStatementState;
79
+ }
80
+
81
+ const TerminationStatementCard = (props: ITerminationStatementCardProps) => {
82
+ const entity = props.entity;
83
+ const rootElementRef = useRef(null);
84
+
85
+ useEffect(() => {
86
+ const element = rootElementRef.current;
87
+
88
+ if (!!element && document.contains(element)) {
89
+ props.onMount?.(element);
90
+ }
91
+
92
+ // When the component is unmounted
93
+ return () => {
94
+ props.onUnmount?.();
95
+ };
96
+ }, []);
97
+
98
+ useEffect(() => {
99
+ const element = rootElementRef.current;
100
+
101
+ props.onUpdate?.(element);
102
+ });
103
+
104
+ useLayoutEffect(() => {
105
+ props.onBeforeUpdate?.();
106
+ }, []);
107
+
108
+ const [updateKey, setValue] = useState(0);
109
+
110
+ const useForceUpdate = () => {
111
+ return () => setValue((value) => value + 1);
112
+ };
113
+ const forceUpdate = useForceUpdate(); // Update the component
114
+
115
+ const [disabledReasons, setDisabledReasons] = useState<
116
+ CanvasEntityDisabledReason[]
117
+ >([]);
118
+
119
+ const disableCanAddErrorOutputReasons: string[] = (() => {
120
+ const newDisabledReasons: string[] = [];
121
+
122
+ if (!!props.entity.throws) {
123
+ newDisabledReasons.push('An error output already exists');
124
+ }
125
+
126
+ const followsImplementationTemplate =
127
+ props.entity.parent.type === EntityType.FunctionDeclaration &&
128
+ !!(props.entity.parent as FunctionDeclarationState).implements;
129
+
130
+ const hasErrorDescriptor = !!(
131
+ (props.entity.parent as FunctionDeclarationState).implements
132
+ ?.error || []
133
+ );
134
+
135
+ if (!!followsImplementationTemplate && !hasErrorDescriptor) {
136
+ newDisabledReasons.push(
137
+ 'The parent trigger implements an action template that does not have an error output'
138
+ );
139
+ }
140
+
141
+ return newDisabledReasons;
142
+ })();
143
+
144
+ const canAddErrorOutput = !disableCanAddErrorOutputReasons.length;
145
+
146
+ const disableDeleteReasons: string[] = (() => {
147
+ const newDisabledReasons: string[] = [];
148
+
149
+ // if (
150
+ // entity.parent.type === EntityType.FunctionDeclaration &&
151
+ // entity.parent.implements &&
152
+ // !!entity.parent.implements.outputs.length &&
153
+ // entity.parent.returnStatements.length === 1
154
+ // ) {
155
+ // newDisabledReasons.push(
156
+ // 'It is the last termination statement of a trigger that has required outputs'
157
+ // );
158
+ // }
159
+
160
+ return newDisabledReasons;
161
+ })();
162
+
163
+ const disableDelete = !!disableDeleteReasons.length;
164
+
165
+ const memoizedCanvasPopupBody = useCallback(
166
+ (popup: CanvasPopup) => (
167
+ <CanvasPopupBaseComponent
168
+ id={
169
+ 'canvas-small-entity-card-menu-button-' +
170
+ props.entity.id +
171
+ '--popup--body'
172
+ }
173
+ >
174
+ <CanvasDropdownMenuCard
175
+ options={[
176
+ {
177
+ project: props.project,
178
+ onClick: async () => {
179
+ await props.project.remove(props.entity.id);
180
+ },
181
+ label: 'Delete',
182
+ color: 'error',
183
+ iconEnd: 'fa-solid fa-trash-can',
184
+ disabled: disableDelete,
185
+ tooltip: disableDelete
186
+ ? `Cannot delete because: ${disableDeleteReasons
187
+ .map((r) => lowercaseFirstLetter(r))
188
+ .join(', and ')}`
189
+ : 'Forever delete this element',
190
+ parentCanvasObject: popup.self,
191
+ id:
192
+ 'canvas--' +
193
+ props.entity.type +
194
+ '--card--' +
195
+ props.entity.id +
196
+ '--delete'
197
+ },
198
+ ...(props.entity.type === EntityType.ReturnStatement
199
+ ? [
200
+ {
201
+ project: props.project,
202
+ onClick: async () => {
203
+ const changeSet =
204
+ props.project.logic.addChangeSet(
205
+ new ChangeSet(
206
+ props.project.logic,
207
+ ProjectState.sessionAuthor,
208
+ new Date().toISOString(),
209
+ props.entity,
210
+ false,
211
+ StateMutationAction.AddThrownError
212
+ )
213
+ );
214
+
215
+ // Remove all outputs
216
+ [...props.entity.outputs].forEach(
217
+ (output) => {
218
+ output.remove(
219
+ {
220
+ ignoreUpstream: false
221
+ },
222
+ changeSet
223
+ );
224
+ }
225
+ );
226
+
227
+ props.entity.readsValue?.removeValueReader(
228
+ props.entity,
229
+ changeSet
230
+ );
231
+ props.entity.setValueWriter(
232
+ null,
233
+ changeSet
234
+ );
235
+
236
+ const newInputMapTransfer =
237
+ InputMapState.new(changeSet);
238
+ newInputMapTransfer.parent =
239
+ props.entity.toReference();
240
+ newInputMapTransfer.name = 'Error';
241
+ newInputMapTransfer.parentRelationType =
242
+ InputMapParentChildRelation.Error;
243
+
244
+ const newInputMapInstance =
245
+ createStateFromTypeAndSubscribe(
246
+ newInputMapTransfer,
247
+ props.project.logic
248
+ ) as InputMapState;
249
+
250
+ newInputMapInstance.hydrateAncestors();
251
+
252
+ changeSet.add(
253
+ newInputMapInstance,
254
+ ChangeSetEntityChangeType.Added
255
+ );
256
+
257
+ newInputMapInstance.addSelfToProject(
258
+ changeSet
259
+ );
260
+ newInputMapInstance.afterAllChildrenInitialized(
261
+ changeSet
262
+ );
263
+
264
+ props.entity.afterAllChildrenInitialized(
265
+ changeSet
266
+ );
267
+
268
+ EditorService.navigate(
269
+ `${props.project?.editorBasePath}/entity/${EntityType.InputMap}/${newInputMapInstance.id}`
270
+ );
271
+
272
+ props.project.renderAndCloseChangeSet(
273
+ changeSet
274
+ );
275
+
276
+ (
277
+ (
278
+ entity.parent as FunctionDeclarationState
279
+ ).returnStatements || []
280
+ ).forEach((ent) =>
281
+ props.project.emit(ent.id, {})
282
+ );
283
+ },
284
+ label: 'New error output',
285
+ iconEnd: 'fa-solid fa-plus',
286
+ classes: [
287
+ 'canvas-dropdown-menu-card-option__new-thrown-error'
288
+ ],
289
+ disabled: !canAddErrorOutput,
290
+ tooltip: canAddErrorOutput
291
+ ? 'Add new thrown error output. Will remove all other outputs'
292
+ : `Cannot add error output because: ${disableCanAddErrorOutputReasons
293
+ .map((r) =>
294
+ lowercaseFirstLetter(r)
295
+ )
296
+ .join(', and ')}`,
297
+ parentCanvasObject: popup.self,
298
+ id:
299
+ 'canvas-card--' +
300
+ props.entity.id +
301
+ '--new-thrown-error'
302
+ }
303
+ ]
304
+ : []),
305
+ {
306
+ project: props.project,
307
+ onClick: async () => {
308
+ let actionName =
309
+ StateMutationAction.RecalculateTerminationStatement;
310
+
311
+ if (
312
+ entity.type === EntityType.ReturnStatement
313
+ ) {
314
+ actionName =
315
+ StateMutationAction.RecalculateReturnStmt;
316
+ } else if (
317
+ entity.type === EntityType.ContinueStatement
318
+ ) {
319
+ actionName =
320
+ StateMutationAction.RecalculateContinueStmt;
321
+ } else if (
322
+ entity.type === EntityType.BreakStatement
323
+ ) {
324
+ actionName =
325
+ StateMutationAction.RecalculateBreakStmt;
326
+ }
327
+
328
+ const changeSet =
329
+ props.project.logic.addChangeSet(
330
+ new ChangeSet(
331
+ props.project.logic,
332
+ ProjectState.sessionAuthor,
333
+ new Date().toISOString(),
334
+ entity,
335
+ false,
336
+ actionName
337
+ )
338
+ );
339
+
340
+ entity.afterAllChildrenInitialized(changeSet);
341
+
342
+ props.project.renderAndCloseChangeSet(
343
+ changeSet
344
+ );
345
+ },
346
+ label: 'Recalculate',
347
+ color: 'warning',
348
+ // Bug icon
349
+ iconEnd: 'fa-solid fa-bug',
350
+ disabled: false,
351
+ // Lower case the first letter of the resolved readable name
352
+ tooltip:
353
+ 'Recalculate the state of this ' +
354
+ lowercaseFirstLetter(
355
+ READABLE_ENTITY_TYPES[props.entity.type]
356
+ .shortSingular
357
+ ),
358
+ parentCanvasObject: popup.self,
359
+ id:
360
+ 'canvas--' +
361
+ props.entity.type +
362
+ '-card--' +
363
+ props.entity.id +
364
+ '--recalculate'
365
+ },
366
+ {
367
+ project: props.project,
368
+ onClick: async () => {
369
+ navigator.clipboard.writeText(props.entity.id);
370
+ popupNotification({
371
+ text: `Copied ID: ${props.entity.id}`,
372
+ color: 'success'
373
+ });
374
+ },
375
+ label: 'Copy ID',
376
+ color: 'warning',
377
+ iconEnd: 'fa-solid fa-bug',
378
+ tooltip:
379
+ 'Copy this node ID to clipboard for debugging',
380
+ parentCanvasObject: popup.self,
381
+ id: 'copy-id-' + props.entity.id
382
+ },
383
+ {
384
+ project: props.project,
385
+ onClick: async () => {
386
+ await props.project.recalculateValidateEntity(
387
+ props.entity
388
+ );
389
+ popupNotification({
390
+ text: `Re-validated node successfully`,
391
+ color: 'success'
392
+ });
393
+ },
394
+ label: 'Re-validate',
395
+ color: 'warning',
396
+ iconEnd: 'fa-solid fa-bug',
397
+ tooltip:
398
+ "Re-validate this node's state and its errors",
399
+ parentCanvasObject: popup.self,
400
+ id: 're-validate-' + props.entity.id
401
+ }
402
+ ]}
403
+ />
404
+ </CanvasPopupBaseComponent>
405
+ ),
406
+ [disableDelete, disableDeleteReasons]
407
+ );
408
+
409
+ const canvasPopup = useCanvasPopup(
410
+ {
411
+ editor: props.project,
412
+ id:
413
+ 'canvas-small-entity-card-menu-button-' +
414
+ props.entity.id +
415
+ '--popup',
416
+ anchorQuerySelector:
417
+ '#canvas-small-entity-card-menu-button-' + props.entity.id,
418
+ arrowClasses: ['dropdown-menu-card-arrow'],
419
+ parentCanvasObject: props.canvasElement.draggableObject,
420
+ arrowContainerSelector:
421
+ '#canvas-small-entity-card-menu-button-' +
422
+ props.entity.id +
423
+ '--popup--body'
424
+ },
425
+ memoizedCanvasPopupBody
426
+ // [disableDelete, disableDeleteReasons]
427
+ );
428
+
429
+ useEffect(() => {
430
+ // --- Initial Setup Logic ---
431
+ const initialNewDisabledReasons: CanvasEntityOtherDisabledReason[] = [];
432
+
433
+ // @ts-ignore
434
+ if (props.entity.suggestion) {
435
+ initialNewDisabledReasons.push(
436
+ CanvasEntityOtherDisabledReason.Suggestion
437
+ );
438
+ }
439
+
440
+ if (props.project.canvas?.disabled) {
441
+ initialNewDisabledReasons.push(
442
+ CanvasEntityOtherDisabledReason.CanvasGloballyDisabled
443
+ );
444
+ }
445
+
446
+ if (!!initialNewDisabledReasons.length) {
447
+ setDisabledReasons((currentReasons) => {
448
+ const config = addDisabledReasons(
449
+ currentReasons,
450
+ initialNewDisabledReasons
451
+ );
452
+ return config.reasons;
453
+ });
454
+ } else {
455
+ // This handles the case where canvas was disabled but is now enabled
456
+ setDisabledReasons((currentReasons) => {
457
+ const config = removeDisabledReasons(currentReasons, [
458
+ CanvasEntityOtherDisabledReason.CanvasGloballyDisabled
459
+ ]);
460
+ return config.reasons;
461
+ });
462
+ }
463
+
464
+ const handleCanvasGloballyEnabled = () => {
465
+ setDisabledReasons((currentReasons) => {
466
+ const config = removeDisabledReasons(currentReasons, [
467
+ CanvasEntityOtherDisabledReason.CanvasGloballyDisabled
468
+ ]);
469
+ return config.reasons;
470
+ });
471
+ };
472
+ const handleCanvasGloballyDisabled = () => {
473
+ setDisabledReasons((currentReasons) => {
474
+ const config = addDisabledReasons(currentReasons, [
475
+ CanvasEntityOtherDisabledReason.CanvasGloballyDisabled
476
+ ]);
477
+ return config.reasons;
478
+ });
479
+ };
480
+
481
+ const handleEntityUpdate = (payload: any) => {
482
+ let hasUpdated = false;
483
+ const newDisabledReasons: CanvasEntityTestingDisabledReason[] = [];
484
+ const disabledReasonsToRemove: CanvasEntityTestingDisabledReason[] =
485
+ [];
486
+
487
+ props.project.test?.disabledConnectionsNotInTest(
488
+ props.canvasElement.draggableObject,
489
+ props.entity
490
+ );
491
+
492
+ if (
493
+ !!props.project.test &&
494
+ !props.project.test?.hasEntity(props.entity) &&
495
+ !props.project.test?.getCanBeAddedToTest(props.entity)
496
+ ) {
497
+ props.project.canvas?.disable(
498
+ props.canvasElement.draggableObject,
499
+ {
500
+ quiet: true
501
+ }
502
+ );
503
+ newDisabledReasons.push(
504
+ CanvasEntityTestingDisabledReason.CannotBeAddedToTest
505
+ );
506
+ hasUpdated = true;
507
+ }
508
+
509
+ // If it is part of test and it is disabled, enable it
510
+ if (
511
+ (props.project.test?.hasEntity(props.entity) ||
512
+ props.project.test?.getCanBeAddedToTest(props.entity)) &&
513
+ props.canvasElement.draggableObject.disabled
514
+ ) {
515
+ props.project.canvas?.enable(
516
+ props.canvasElement.draggableObject,
517
+ {
518
+ quiet: true
519
+ }
520
+ );
521
+ disabledReasonsToRemove.push(
522
+ CanvasEntityTestingDisabledReason.CannotBeAddedToTest
523
+ );
524
+ hasUpdated = true;
525
+ }
526
+
527
+ if (
528
+ !!props.project.test &&
529
+ !props.project.test?.hasEntity(props.entity)
530
+ ) {
531
+ newDisabledReasons.push(
532
+ CanvasEntityTestingDisabledReason.NotPartOfOngoingTest
533
+ );
534
+ hasUpdated = true;
535
+ } else if (
536
+ !!props.project.test &&
537
+ props.project.test?.hasEntity(props.entity)
538
+ ) {
539
+ disabledReasonsToRemove.push(
540
+ CanvasEntityTestingDisabledReason.NotPartOfOngoingTest
541
+ );
542
+ hasUpdated = true;
543
+ }
544
+
545
+ if (newDisabledReasons.length || disabledReasonsToRemove.length) {
546
+ setDisabledReasons((currentReasons) => {
547
+ const config = addDisabledReasons(
548
+ currentReasons,
549
+ newDisabledReasons
550
+ );
551
+ const finalConfig = removeDisabledReasons(
552
+ config.reasons,
553
+ disabledReasonsToRemove
554
+ );
555
+ return finalConfig.reasons;
556
+ });
557
+ // hasUpdated is already true
558
+ }
559
+
560
+ if (!hasUpdated) {
561
+ forceUpdate();
562
+ }
563
+ };
564
+
565
+ const handleTestSetupStarted = () => {
566
+ const newDisabledReasons: CanvasEntityTestingDisabledReason[] = [];
567
+
568
+ if (
569
+ !!props.project.test &&
570
+ !props.project.test?.hasEntity(props.entity) &&
571
+ !props.project.test?.getCanBeAddedToTest(props.entity)
572
+ ) {
573
+ props.project.canvas?.disable(
574
+ props.canvasElement.draggableObject,
575
+ {
576
+ quiet: true
577
+ }
578
+ );
579
+ props.project.test?.disabledConnectionsNotInTest(
580
+ props.canvasElement.draggableObject,
581
+ props.entity
582
+ );
583
+
584
+ newDisabledReasons.push(
585
+ CanvasEntityTestingDisabledReason.CannotBeAddedToTest
586
+ );
587
+ }
588
+
589
+ if (!props.project.test?.hasEntity(props.entity)) {
590
+ newDisabledReasons.push(
591
+ CanvasEntityTestingDisabledReason.NotPartOfOngoingTest
592
+ );
593
+ }
594
+
595
+ setDisabledReasons((currentReasons) => {
596
+ const config = addDisabledReasons(
597
+ currentReasons,
598
+ newDisabledReasons
599
+ );
600
+ return config.reasons;
601
+ });
602
+ };
603
+
604
+ const handleExecutionStart = () => {
605
+ if (!!props.project.test?.hasEntity(props.entity)) {
606
+ forceUpdate();
607
+ }
608
+ };
609
+
610
+ const handleTestExited = () => {
611
+ setDisabledReasons((currentReasons) => {
612
+ const config = removeDisabledReasons(currentReasons, [
613
+ CanvasEntityTestingDisabledReason.NotPartOfOngoingTest,
614
+ CanvasEntityTestingDisabledReason.CannotBeAddedToTest
615
+ ]);
616
+ return config.reasons;
617
+ });
618
+
619
+ if (props.canvasElement.draggableObject.disabled) {
620
+ props.project.canvas?.enable(
621
+ props.canvasElement.draggableObject,
622
+ {
623
+ quiet: true
624
+ }
625
+ );
626
+ }
627
+
628
+ props.canvasElement.draggableObject.connections.forEach(
629
+ (connection) => {
630
+ connection.enable();
631
+ connection.element.classList.remove('disabled');
632
+
633
+ if (connection.complementaryLineElement) {
634
+ connection.complementaryLineElement.classList.remove(
635
+ 'disabled'
636
+ );
637
+ }
638
+ }
639
+ );
640
+ };
641
+
642
+ const handleCanvasConnectionStart = (payload: any) => {
643
+ if (!payload.compatible?.[props.entity.id]) {
644
+ props.project.canvas?.disable(
645
+ props.canvasElement.draggableObject,
646
+ {
647
+ quiet: true
648
+ }
649
+ );
650
+
651
+ const newOwnConnectionDisabledReasons: CanvasEntityConnectionDisabledReason[] =
652
+ payload.incompatible?.[props.entity.id]?.reasons || [];
653
+
654
+ setDisabledReasons((currentReasons) => {
655
+ const config = addDisabledReasons(
656
+ currentReasons,
657
+ newOwnConnectionDisabledReasons
658
+ );
659
+ return config.reasons;
660
+ });
661
+ } else {
662
+ forceUpdate();
663
+ }
664
+ };
665
+
666
+ const handleCanvasConnectionEnd = () => {
667
+ props.project.canvas?.enable(props.canvasElement.draggableObject, {
668
+ quiet: true
669
+ });
670
+
671
+ setDisabledReasons((currentReasons) => {
672
+ const config = removeDisabledReasons(
673
+ currentReasons,
674
+ ALL_CONNECTION_DISABLED_REASONS
675
+ );
676
+ return config.reasons;
677
+ });
678
+ };
679
+
680
+ props.project.on(
681
+ 'canvas-globally-enabled',
682
+ handleCanvasGloballyEnabled
683
+ );
684
+ props.project.on(
685
+ 'canvas-globally-disabled',
686
+ handleCanvasGloballyDisabled
687
+ );
688
+ props.project.on(props.entity.id, handleEntityUpdate);
689
+ props.project.on('test-setup-started', handleTestSetupStarted);
690
+ props.project.on('execution-start', handleExecutionStart);
691
+ props.project.on('test-exited', handleTestExited);
692
+ props.project.on(
693
+ 'canvas-connection-start',
694
+ handleCanvasConnectionStart
695
+ );
696
+ props.project.on('canvas-connection-end', handleCanvasConnectionEnd);
697
+
698
+ return () => {
699
+ props.project.off(
700
+ 'canvas-globally-enabled',
701
+ handleCanvasGloballyEnabled
702
+ );
703
+ props.project.off(
704
+ 'canvas-globally-disabled',
705
+ handleCanvasGloballyDisabled
706
+ );
707
+ props.project.off(props.entity.id, handleEntityUpdate);
708
+ props.project.off('test-setup-started', handleTestSetupStarted);
709
+ props.project.off('execution-start', handleExecutionStart);
710
+ props.project.off('test-exited', handleTestExited);
711
+ props.project.off(
712
+ 'canvas-connection-start',
713
+ handleCanvasConnectionStart
714
+ );
715
+ props.project.off(
716
+ 'canvas-connection-end',
717
+ handleCanvasConnectionEnd
718
+ );
719
+ };
720
+ }, [
721
+ props.project,
722
+ props.entity,
723
+ props.canvasElement,
724
+ updateKey,
725
+ // @ts-ignore
726
+ props.entity.suggestion
727
+ ]);
728
+
729
+ useEffect(() => {
730
+ props.canvasElement.draggableObject.updateConnections();
731
+ });
732
+
733
+ const inputMaps = entity.outputs;
734
+
735
+ const classes = ['canvas-draggable-card'];
736
+
737
+ const dt = entity.getDataType(null);
738
+
739
+ const isVoidReturnType =
740
+ dt?.entity?.id ===
741
+ BUILT_IN_BASE_ENTITY_IDS['primitive-entity'].void?.id;
742
+
743
+ const showNewInputButton = useMemo(
744
+ () =>
745
+ !props.project.test &&
746
+ !(entity as ReturnStatementState).throws &&
747
+ !disabledReasons.includes(
748
+ CanvasEntityOtherDisabledReason.CanvasGloballyDisabled
749
+ ) &&
750
+ !disabledReasons.includes(
751
+ CanvasEntityOtherDisabledReason.Suggestion
752
+ ) &&
753
+ !disabledReasons.includes(
754
+ CanvasEntityTestingDisabledReason.NotPartOfOngoingTest
755
+ ) &&
756
+ !disabledReasons.includes(
757
+ CanvasEntityTestingDisabledReason.CannotBeAddedToTest
758
+ ) &&
759
+ (!props.project.onGoingConnectionNodeType ||
760
+ (props.project.onGoingConnectionNodeType &&
761
+ props.project.onGoingConnectionNodeType ===
762
+ ConnectionNodeType.PropertyOut)) &&
763
+ !disabledReasons.includes(
764
+ CanvasEntityConnectionDisabledReason.NotInScope
765
+ ) &&
766
+ // If the parent is a function declaration that implements a descriptor signature,
767
+ // We hide the button because the user can't add their own outputs
768
+ !(
769
+ (entity as ReturnStatementState).parent.type ===
770
+ EntityType.FunctionDeclaration &&
771
+ !!(
772
+ (entity as ReturnStatementState)
773
+ .parent as FunctionDeclarationState
774
+ ).implements
775
+ ) &&
776
+ !isVoidReturnType &&
777
+ dt?.canBeObject() &&
778
+ // If there is an active connection and the source is an ancestor that calls the current in its error branch,
779
+ // we shouldn't show the new inputs button
780
+ ((): boolean => {
781
+ if (
782
+ !props.project.onGoingConnectionNodeType ||
783
+ props.project.onGoingConnectionNodeType !==
784
+ ConnectionNodeType.PropertyOut
785
+ ) {
786
+ return true;
787
+ }
788
+
789
+ const sourceEntity = props.project
790
+ .onGoingConnectionSource as ValueWritingEntityState;
791
+
792
+ if (!sourceEntity) {
793
+ true;
794
+ }
795
+
796
+ const sourceCallerParent = getParentCallerEntity(sourceEntity);
797
+
798
+ const errorAcestors = flattenCallersWithCallType(entity).filter(
799
+ (a) => a.callType === 'error'
800
+ );
801
+
802
+ if (
803
+ errorAcestors.find(
804
+ (a) => a.caller?.id === sourceCallerParent?.id
805
+ )
806
+ ) {
807
+ return false;
808
+ }
809
+
810
+ return true;
811
+ })(),
812
+ [
813
+ props.project,
814
+ props.project?.test,
815
+ entity,
816
+ disabledReasons,
817
+ updateKey,
818
+ props.project.onGoingConnectionNodeType
819
+ ]
820
+ );
821
+
822
+ if (!!props.entity?.deleted) {
823
+ return null;
824
+ }
825
+
826
+ return (
827
+ <div
828
+ ref={rootElementRef}
829
+ className={classes.join(' ')}
830
+ id={getCanvasEntityDOMId(props.entity)}
831
+ {...{
832
+ [Canvas.OBJ_ATTR_NAME]: getCanvasEntityDOMId(props.entity)
833
+ }}
834
+ onClick={(e) => {
835
+ e.stopPropagation();
836
+ }}
837
+ >
838
+ <TestEntityButton
839
+ entity={entity}
840
+ project={props.project}
841
+ canvasElement={props.canvasElement}
842
+ parentDisabledReasons={disabledReasons}
843
+ />
844
+ <div
845
+ className={[
846
+ 'canvas-draggable-card__body',
847
+ ...(!!disabledReasons.length
848
+ ? ['canvas-draggable-card__body__disabled']
849
+ : []),
850
+ resolveEntityColorClass(props.entity.type, {
851
+ state: fromDisabledReasonsToCardState(disabledReasons)
852
+ })
853
+ ].join(' ')}
854
+ >
855
+ <header
856
+ className="canvas-draggable-card__header"
857
+ {...{
858
+ [Canvas.OBJ_ATTR_NAME]:
859
+ getCanvasEntityDOMId(props.entity) + '--header'
860
+ }}
861
+ style={parse(
862
+ getCardGradientStatement(entity, {
863
+ state: fromDisabledReasonsToCardState(
864
+ disabledReasons
865
+ )
866
+ })
867
+ )}
868
+ onMouseOver={(e: any) => {
869
+ if (!!props.project.canvas?.activeConnectionDrawing) {
870
+ if (
871
+ !!props.project
872
+ .onGoingConnectionIncompatibleEntities?.[
873
+ props.entity.id
874
+ ]
875
+ ) {
876
+ // Read the disabled reasons and add a tooltip to the mouse
877
+ const reasonsMessage =
878
+ props.project.onGoingConnectionIncompatibleEntities?.[
879
+ props.entity.id
880
+ ].reasons
881
+ .map((reason) =>
882
+ entityDisabledReasonToShortReadableError(
883
+ reason
884
+ )
885
+ )
886
+ .join('.\n');
887
+
888
+ props.project.canvas?.showTooltip(
889
+ 'connection-disabled-reasons-test-entity-button',
890
+ reasonsMessage
891
+ );
892
+ if (props.project.canvas) {
893
+ props.project.canvas.tooltip.style.fontSize =
894
+ '28px';
895
+ props.project.canvas.canvasElement.style.cursor =
896
+ 'not-allowed';
897
+ }
898
+ }
899
+ }
900
+ }}
901
+ onMouseLeave={(e: any) => {
902
+ props.project.canvas?.hideTooltip(
903
+ 'connection-disabled-reasons-test-entity-button'
904
+ );
905
+ }}
906
+ >
907
+ <DynamicValueEntry
908
+ entity={props.entity}
909
+ project={props.project}
910
+ canvasElement={props.canvasElement}
911
+ parentDisabledReasons={disabledReasons}
912
+ >
913
+ {(extraContent) => (
914
+ <>
915
+ <div className="canvas-draggable-card__header__left-block">
916
+ {/* <i
917
+ className={[
918
+ 'canvas-draggable-card-header__icon',
919
+ 'fa-solid',
920
+ 'fa-' +
921
+ (ENTITY_FA_ICON_NAMES[entity.type] || 'rectangle-list'),
922
+ ].join(' ')}
923
+ /> */}
924
+ <DataTypeIcon
925
+ entity={entity}
926
+ size="large"
927
+ parentDisabledReasons={disabledReasons}
928
+ project={props.project}
929
+ parentCanvasObject={
930
+ props.canvasElement?.draggableObject
931
+ }
932
+ />
933
+ <span className="canvas-draggable-card__header__labels">
934
+ <h3>
935
+ {safeResolveEntityName(
936
+ entity,
937
+ props.project.logic
938
+ )}
939
+ </h3>
940
+ {!!(entity as ReturnStatementState)
941
+ .throws || isVoidReturnType
942
+ ? resolveCardSubheader(entity)
943
+ : extraContent}
944
+ {/* <p>{READABLE_ENTITY_TYPES[entity.type]?.singular}</p> */}
945
+ </span>
946
+ </div>
947
+ <div className="canvas-draggable-card__header__actions">
948
+ <EntityLockedIconMenu
949
+ entity={entity}
950
+ project={props.project}
951
+ canvasElement={props.canvasElement}
952
+ parentDisabledReasons={disabledReasons}
953
+ />
954
+ <LogicErrorIconMenu
955
+ entity={entity}
956
+ project={props.project}
957
+ canvasElement={props.canvasElement}
958
+ parentDisabledReasons={disabledReasons}
959
+ />
960
+ {/* Three dots menu */}
961
+ {!disabledReasons.length && (
962
+ <Button
963
+ variant="text"
964
+ color="grey"
965
+ iconEnd="fa-solid fa-ellipsis-v"
966
+ size="small"
967
+ ref={canvasPopup.anchorRef}
968
+ className="canvas-small-entity-card-menu-button"
969
+ id={`canvas-small-entity-card-menu-button-${entity.id}`}
970
+ disabled={!!disabledReasons.length}
971
+ onClick={(e: any) => {
972
+ e.stopPropagation();
973
+
974
+ canvasPopup?.toggle();
975
+ }}
976
+ // onDoubleClick={(e: React.MouseEvent<HTMLButtonElement>) => {
977
+ // e.stopPropagation();
978
+ // if (disabledReasons.length) return;
979
+ // props.project?.canvas?.unselectAll();
980
+ // EditorService.navigate(
981
+ // `${props.project?.editorBasePath}/entity/${props.entity.type}/${props.entity.id}`,
982
+ // );
983
+ // }}
984
+ />
985
+ )}
986
+ </div>
987
+ </>
988
+ )}
989
+ </DynamicValueEntry>
990
+ </header>
991
+ <div className="canvas-draggable-card__content">
992
+ {!!(entity as ReturnStatementState).throws && (
993
+ <ReturnedError
994
+ inputMap={(entity as ReturnStatementState).throws}
995
+ entity={entity as ReturnStatementState}
996
+ canvasElement={props.canvasElement}
997
+ project={props.project}
998
+ parentDisabledReasons={disabledReasons}
999
+ />
1000
+ )}
1001
+
1002
+ {!(entity as ReturnStatementState).throws && (
1003
+ <MainValueInput
1004
+ entity={entity}
1005
+ canvasElement={props.canvasElement}
1006
+ project={props.project}
1007
+ parentDisabledReasons={disabledReasons}
1008
+ />
1009
+ )}
1010
+
1011
+ {/* List of input maps */}
1012
+ {inputMaps.length > 0 && (
1013
+ <ul className="canvas-draggable-card__property-list">
1014
+ {inputMaps
1015
+ .sort((a, b) => {
1016
+ // Sort by `.index` property
1017
+ if (a.index < b.index) {
1018
+ return -1;
1019
+ }
1020
+ if (a.index > b.index) {
1021
+ return 1;
1022
+ }
1023
+ return 0;
1024
+ })
1025
+ .map((inputMap) => (
1026
+ <InputMapProperty
1027
+ key={inputMap.id}
1028
+ inputMap={inputMap}
1029
+ entity={props.entity}
1030
+ canvasElement={props.canvasElement}
1031
+ project={props.project}
1032
+ parentDisabledReasons={disabledReasons}
1033
+ />
1034
+ ))}
1035
+ </ul>
1036
+ )}
1037
+ {showNewInputButton && (
1038
+ <div
1039
+ className={[
1040
+ 'canvas-draggable-card__action-alt',
1041
+ 'align-left'
1042
+ ].join(' ')}
1043
+ >
1044
+ <NewCardInputButton
1045
+ iconStart="fa-solid fa-plus"
1046
+ size="small"
1047
+ parentDisabledReasons={disabledReasons}
1048
+ entity={entity}
1049
+ project={props.project}
1050
+ canvasElement={props.canvasElement}
1051
+ onClick={() => {
1052
+ let actionName =
1053
+ StateMutationAction.AddPropertyToTerminationStatement;
1054
+
1055
+ if (
1056
+ entity.type ===
1057
+ EntityType.ReturnStatement
1058
+ ) {
1059
+ actionName =
1060
+ StateMutationAction.AddPropertyToReturnStmt;
1061
+ } else if (
1062
+ entity.type ===
1063
+ EntityType.ContinueStatement
1064
+ ) {
1065
+ actionName =
1066
+ StateMutationAction.AddPropertyToContinueStmt;
1067
+ } else if (
1068
+ entity.type ===
1069
+ EntityType.BreakStatement
1070
+ ) {
1071
+ actionName =
1072
+ StateMutationAction.AddPropertyToBreakStmt;
1073
+ }
1074
+
1075
+ const changeSet =
1076
+ props.project.logic.addChangeSet(
1077
+ new ChangeSet(
1078
+ props.project.logic,
1079
+ ProjectState.sessionAuthor,
1080
+ new Date().toISOString(),
1081
+ entity,
1082
+ false,
1083
+ actionName
1084
+ )
1085
+ );
1086
+
1087
+ let newEntity!:
1088
+ | InputMapState
1089
+ | PropertyState;
1090
+
1091
+ if (
1092
+ entity.parent.type ===
1093
+ EntityType.Loop &&
1094
+ [
1095
+ EntityType.ContinueStatement,
1096
+ EntityType.BreakStatement
1097
+ ].includes(entity.type)
1098
+ ) {
1099
+ const newEntityTransfer =
1100
+ InputMapState.new(changeSet);
1101
+ newEntityTransfer.parent =
1102
+ entity.toReference();
1103
+
1104
+ newEntityTransfer.name =
1105
+ findNextAvailableName(
1106
+ 'Output',
1107
+ entity.outputs.map(
1108
+ (e) => e.declaration
1109
+ )
1110
+ );
1111
+
1112
+ newEntity =
1113
+ createStateFromTypeAndSubscribe(
1114
+ newEntityTransfer,
1115
+ props.project.logic
1116
+ ) as InputMapState;
1117
+
1118
+ newEntity.hydrateAncestors();
1119
+
1120
+ changeSet.add(
1121
+ newEntity,
1122
+ ChangeSetEntityChangeType.Added
1123
+ );
1124
+
1125
+ newEntity.addSelfToProject(changeSet);
1126
+ newEntity.afterAllChildrenInitialized(
1127
+ changeSet
1128
+ );
1129
+
1130
+ entity.afterAllChildrenInitialized(
1131
+ changeSet
1132
+ );
1133
+ } else if (
1134
+ entity.parent.type ===
1135
+ EntityType.FunctionDeclaration
1136
+ ) {
1137
+ const parentFuncDeclaration: FunctionDeclarationState =
1138
+ entity.parent;
1139
+ const dataType = entity.parent.dataType;
1140
+ let resolvedDataType: DataTypeState =
1141
+ dataType;
1142
+ let dataTypeEntity: DefinitionEntityState;
1143
+
1144
+ if (
1145
+ !!resolvedDataType.entity &&
1146
+ resolvedDataType.entity.type ===
1147
+ EntityType.DefinitionEntity &&
1148
+ resolvedDataType.entity.parent
1149
+ ?.id === resolvedDataType.id
1150
+ ) {
1151
+ dataTypeEntity =
1152
+ resolvedDataType.entity as DefinitionEntityState;
1153
+ }
1154
+
1155
+ if (!resolvedDataType) {
1156
+ const newDataTypeTransfer =
1157
+ DataTypeState.new(changeSet);
1158
+ newDataTypeTransfer.parent =
1159
+ parentFuncDeclaration.toReference();
1160
+ newDataTypeTransfer.inferred = true;
1161
+
1162
+ resolvedDataType =
1163
+ createStateFromTypeAndSubscribe(
1164
+ newDataTypeTransfer,
1165
+ props.project.logic
1166
+ ) as DataTypeState;
1167
+
1168
+ resolvedDataType.hydrateAncestors();
1169
+ resolvedDataType.addSelfToProject(
1170
+ changeSet
1171
+ );
1172
+ changeSet.add(
1173
+ resolvedDataType,
1174
+ ChangeSetEntityChangeType.Added
1175
+ );
1176
+ resolvedDataType.initChildren(
1177
+ changeSet
1178
+ );
1179
+ }
1180
+
1181
+ if (!dataTypeEntity) {
1182
+ const newDefEntityTransfer =
1183
+ DefinitionEntityState.new(
1184
+ changeSet
1185
+ );
1186
+ const allOtherDefinitions =
1187
+ props.project.logic.getDefinitionEntities();
1188
+
1189
+ const desiredName =
1190
+ 'Custom inline definition';
1191
+
1192
+ const newName =
1193
+ findNextAvailableName(
1194
+ desiredName,
1195
+ allOtherDefinitions
1196
+ );
1197
+
1198
+ newDefEntityTransfer.name = newName;
1199
+ newDefEntityTransfer.parent =
1200
+ resolvedDataType.toReference();
1201
+
1202
+ dataTypeEntity =
1203
+ createStateFromTypeAndSubscribe(
1204
+ newDefEntityTransfer,
1205
+ props.project.logic
1206
+ ) as DefinitionEntityState;
1207
+
1208
+ dataTypeEntity.hydrateAncestors();
1209
+ dataTypeEntity.addSelfToProject(
1210
+ changeSet
1211
+ );
1212
+ changeSet.add(
1213
+ dataTypeEntity,
1214
+ ChangeSetEntityChangeType.Added
1215
+ );
1216
+ dataTypeEntity.initChildren(
1217
+ changeSet
1218
+ );
1219
+ resolvedDataType.setEntity(
1220
+ dataTypeEntity,
1221
+ changeSet
1222
+ );
1223
+
1224
+ changeSet.add(
1225
+ resolvedDataType,
1226
+ ChangeSetEntityChangeType.Updated
1227
+ );
1228
+ }
1229
+
1230
+ const newPropertyTransfer =
1231
+ PropertyState.new(changeSet);
1232
+ newPropertyTransfer.parent =
1233
+ dataTypeEntity.toReference();
1234
+
1235
+ newPropertyTransfer.name =
1236
+ findNextAvailableName(
1237
+ 'Output',
1238
+ dataTypeEntity.properties
1239
+ );
1240
+
1241
+ const newProperty =
1242
+ createStateFromTypeAndSubscribe(
1243
+ newPropertyTransfer,
1244
+ props.project.logic
1245
+ ) as PropertyState;
1246
+
1247
+ newProperty.hydrateAncestors();
1248
+ newProperty.addSelfToProject(changeSet);
1249
+ changeSet.add(
1250
+ newProperty,
1251
+ ChangeSetEntityChangeType.Added
1252
+ );
1253
+ newProperty.initChildren(changeSet);
1254
+
1255
+ const builtInPrimitiveStringEntity =
1256
+ props.project.logic.getBuiltIn(
1257
+ BUILT_IN_BASE_ENTITY_IDS[
1258
+ 'primitive-entity'
1259
+ ].string.id
1260
+ ) as PrimitiveEntityState;
1261
+
1262
+ // Add 'string' data-type as default
1263
+ const dataTypeTransfer =
1264
+ DataTypeState.new(changeSet);
1265
+ dataTypeTransfer.parent =
1266
+ newProperty.toReference();
1267
+ dataTypeTransfer.entity =
1268
+ (builtInPrimitiveStringEntity?.toJSON() as IPrimitiveEntityTransfer) ||
1269
+ null;
1270
+
1271
+ const dataTypeInstance =
1272
+ createStateFromTypeAndSubscribe(
1273
+ dataTypeTransfer,
1274
+ props.project.logic
1275
+ ) as DataTypeState;
1276
+
1277
+ dataTypeInstance.hydrateAncestors();
1278
+ dataTypeInstance.addSelfToProject(
1279
+ changeSet
1280
+ );
1281
+ changeSet.add(
1282
+ dataTypeInstance,
1283
+ ChangeSetEntityChangeType.Added
1284
+ );
1285
+
1286
+ dataTypeInstance.initChildren(
1287
+ changeSet
1288
+ );
1289
+
1290
+ newEntity = newProperty;
1291
+
1292
+ const newEntityInputTransfer =
1293
+ TerminationInputMapState.new(
1294
+ changeSet
1295
+ );
1296
+ newEntityInputTransfer.parent =
1297
+ entity.toReference();
1298
+ newEntityInputTransfer.declaration =
1299
+ newProperty.toJSON() as IPropertyTransfer;
1300
+
1301
+ const newEntityInput =
1302
+ createStateFromTypeAndSubscribe(
1303
+ newEntityInputTransfer,
1304
+ props.project.logic
1305
+ ) as TerminationInputMapState;
1306
+
1307
+ newEntityInput.hydrateAncestors();
1308
+ newEntityInput.addSelfToProject(
1309
+ changeSet
1310
+ );
1311
+ changeSet.add(
1312
+ newEntityInput,
1313
+ ChangeSetEntityChangeType.Added
1314
+ );
1315
+ newEntityInput.initChildren(changeSet);
1316
+
1317
+ dataType.metaSync(
1318
+ {
1319
+ inferred: false
1320
+ },
1321
+ changeSet
1322
+ );
1323
+ } else if (
1324
+ entity.parent.type ===
1325
+ EntityType.GlobalEvent
1326
+ ) {
1327
+ const parentFuncDeclaration: GlobalEventState =
1328
+ entity.parent;
1329
+ const dataType =
1330
+ entity.parent.implements?.dataType;
1331
+ let resolvedDataType: DataTypeState =
1332
+ dataType;
1333
+ let dataTypeEntity: DefinitionEntityState;
1334
+
1335
+ if (
1336
+ !!resolvedDataType.entity &&
1337
+ resolvedDataType.entity.type ===
1338
+ EntityType.DefinitionEntity &&
1339
+ resolvedDataType.entity.parent
1340
+ ?.id === resolvedDataType.id
1341
+ ) {
1342
+ dataTypeEntity =
1343
+ resolvedDataType.entity as DefinitionEntityState;
1344
+ }
1345
+
1346
+ if (!resolvedDataType) {
1347
+ const newDataTypeTransfer =
1348
+ DataTypeState.new(changeSet);
1349
+ newDataTypeTransfer.parent =
1350
+ entity.toReference();
1351
+ newDataTypeTransfer.inferred = true;
1352
+
1353
+ resolvedDataType =
1354
+ createStateFromTypeAndSubscribe(
1355
+ newDataTypeTransfer,
1356
+ props.project.logic
1357
+ ) as DataTypeState;
1358
+
1359
+ resolvedDataType.hydrateAncestors();
1360
+ resolvedDataType.addSelfToProject(
1361
+ changeSet
1362
+ );
1363
+ changeSet.add(
1364
+ resolvedDataType,
1365
+ ChangeSetEntityChangeType.Added
1366
+ );
1367
+ resolvedDataType.initChildren(
1368
+ changeSet
1369
+ );
1370
+ }
1371
+
1372
+ if (!dataTypeEntity) {
1373
+ const newDefEntityTransfer =
1374
+ DefinitionEntityState.new(
1375
+ changeSet
1376
+ );
1377
+ const allOtherDefinitions =
1378
+ props.project.logic.getDefinitionEntities();
1379
+
1380
+ const desiredName =
1381
+ 'Custom inline definition';
1382
+
1383
+ const newName =
1384
+ findNextAvailableName(
1385
+ desiredName,
1386
+ allOtherDefinitions
1387
+ );
1388
+
1389
+ newDefEntityTransfer.name = newName;
1390
+ newDefEntityTransfer.parent =
1391
+ resolvedDataType.toReference();
1392
+
1393
+ dataTypeEntity =
1394
+ createStateFromTypeAndSubscribe(
1395
+ newDefEntityTransfer,
1396
+ props.project.logic
1397
+ ) as DefinitionEntityState;
1398
+
1399
+ dataTypeEntity.hydrateAncestors();
1400
+ dataTypeEntity.addSelfToProject(
1401
+ changeSet
1402
+ );
1403
+ changeSet.add(
1404
+ dataTypeEntity,
1405
+ ChangeSetEntityChangeType.Added
1406
+ );
1407
+ dataTypeEntity.initChildren(
1408
+ changeSet
1409
+ );
1410
+ resolvedDataType.setEntity(
1411
+ dataTypeEntity,
1412
+ changeSet
1413
+ );
1414
+
1415
+ changeSet.add(
1416
+ resolvedDataType,
1417
+ ChangeSetEntityChangeType.Updated
1418
+ );
1419
+ }
1420
+
1421
+ const newPropertyTransfer =
1422
+ PropertyState.new(changeSet);
1423
+ newPropertyTransfer.parent =
1424
+ dataTypeEntity.toReference();
1425
+
1426
+ newPropertyTransfer.name =
1427
+ findNextAvailableName(
1428
+ 'Output',
1429
+ dataTypeEntity.properties
1430
+ );
1431
+
1432
+ const newProperty =
1433
+ createStateFromTypeAndSubscribe(
1434
+ newPropertyTransfer,
1435
+ props.project.logic
1436
+ ) as PropertyState;
1437
+
1438
+ newProperty.hydrateAncestors();
1439
+ newProperty.addSelfToProject(changeSet);
1440
+ changeSet.add(
1441
+ newProperty,
1442
+ ChangeSetEntityChangeType.Added
1443
+ );
1444
+ newProperty.initChildren(changeSet);
1445
+
1446
+ const builtInPrimitiveStringEntity =
1447
+ props.project.logic.getBuiltIn(
1448
+ BUILT_IN_BASE_ENTITY_IDS[
1449
+ 'primitive-entity'
1450
+ ].string.id
1451
+ ) as PrimitiveEntityState;
1452
+
1453
+ // Add 'string' data-type as default
1454
+ const dataTypeTransfer =
1455
+ DataTypeState.new(changeSet);
1456
+ dataTypeTransfer.parent =
1457
+ newProperty.toReference();
1458
+ dataTypeTransfer.entity =
1459
+ (builtInPrimitiveStringEntity?.toJSON() as IPrimitiveEntityTransfer) ||
1460
+ null;
1461
+
1462
+ const dataTypeInstance =
1463
+ createStateFromTypeAndSubscribe(
1464
+ dataTypeTransfer,
1465
+ props.project.logic
1466
+ ) as DataTypeState;
1467
+
1468
+ dataTypeInstance.hydrateAncestors();
1469
+ dataTypeInstance.addSelfToProject(
1470
+ changeSet
1471
+ );
1472
+ changeSet.add(
1473
+ dataTypeInstance,
1474
+ ChangeSetEntityChangeType.Added
1475
+ );
1476
+
1477
+ dataTypeInstance.initChildren(
1478
+ changeSet
1479
+ );
1480
+
1481
+ newEntity = newProperty;
1482
+
1483
+ const newEntityInputTransfer =
1484
+ TerminationInputMapState.new(
1485
+ changeSet
1486
+ );
1487
+ newEntityInputTransfer.parent =
1488
+ entity.toReference();
1489
+ newEntityInputTransfer.declaration =
1490
+ newProperty.toJSON() as IPropertyTransfer;
1491
+
1492
+ const newEntityInput =
1493
+ createStateFromTypeAndSubscribe(
1494
+ newEntityInputTransfer,
1495
+ props.project.logic
1496
+ ) as TerminationInputMapState;
1497
+
1498
+ newEntityInput.hydrateAncestors();
1499
+ newEntityInput.addSelfToProject(
1500
+ changeSet
1501
+ );
1502
+ changeSet.add(
1503
+ newEntityInput,
1504
+ ChangeSetEntityChangeType.Added
1505
+ );
1506
+ newEntityInput.initChildren(changeSet);
1507
+
1508
+ dataType.metaSync(
1509
+ {
1510
+ inferred: false
1511
+ },
1512
+ changeSet
1513
+ );
1514
+ }
1515
+
1516
+ changeSet.add(
1517
+ entity,
1518
+ ChangeSetEntityChangeType.Affected
1519
+ );
1520
+ entity.parent.afterAllChildrenInitialized(
1521
+ changeSet
1522
+ );
1523
+
1524
+ props.project.renderAndCloseChangeSet(
1525
+ changeSet
1526
+ );
1527
+
1528
+ EditorService.navigate(
1529
+ `${props.project?.editorBasePath}/entity/${newEntity.type}/${newEntity.id}`
1530
+ );
1531
+ }}
1532
+ >
1533
+ Output
1534
+ </NewCardInputButton>
1535
+ </div>
1536
+ )}
1537
+ </div>
1538
+ </div>
1539
+ </div>
1540
+ );
1541
+ };
1542
+
1543
+ export default TerminationStatementCard;