@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,766 @@
1
+ import React from 'react';
2
+ import {
3
+ EntityType,
4
+ InputMapState,
5
+ ProjectState,
6
+ resolveEntityDataTypeLabel,
7
+ resolveEntityName,
8
+ searchStatementDefs,
9
+ searchStatementFunctions,
10
+ searchStatementState as searchStatementStateLib,
11
+ } from '@elyx-code/project-logic-tree';
12
+ import {
13
+ Autocomplete,
14
+ Box,
15
+ TextField,
16
+ Tooltip as MuiTooltip,
17
+ Button,
18
+ } from '@mui/material';
19
+ import { useSearchStatementContext } from './search-statement-context';
20
+ import DataTypeIcon from '../../draggable-entity-card/DataTypeIcon';
21
+ import { ColumnSelectorValue } from './ColumnSelector';
22
+ import LiteralValueField, {
23
+ fromLiteralValueTypeToReadableLabel,
24
+ ILiteralValueOption,
25
+ LiteralArrayBuilder,
26
+ LiteralValueTypeSelectorValue,
27
+ } from './LiteralValue';
28
+
29
+ const { ColumnRef, SearchStatementLiteralValue, ValueRef, FunctionCall } =
30
+ searchStatementStateLib;
31
+
32
+ const { getFunctionDefinition, SQL_FUNCTION_REGISTRY } =
33
+ searchStatementFunctions;
34
+
35
+ const { SearchStatementNodeType, SQLFunctionCategory, SearchLiteralValueType } =
36
+ searchStatementDefs;
37
+
38
+ type ColumnRef = searchStatementStateLib.ColumnRef;
39
+ type ValueRef = searchStatementStateLib.ValueRef;
40
+ type SearchStatementLiteralValue =
41
+ searchStatementStateLib.SearchStatementLiteralValue;
42
+ type FunctionCall = searchStatementStateLib.FunctionCall;
43
+ type SearchLiteralValueType = searchStatementDefs.SearchLiteralValueType;
44
+ type SQLFunctionCategory = searchStatementDefs.SQLFunctionCategory;
45
+ type SQLDataType = searchStatementDefs.SQLDataType;
46
+
47
+ // --- UTILS ---
48
+
49
+ export function matchesDataType(
50
+ entityDataTypeLabel: string,
51
+ acceptedTypes: SQLDataType[],
52
+ ): boolean {
53
+ if (!acceptedTypes || acceptedTypes.includes('any')) return true;
54
+ const lowerLabel = (entityDataTypeLabel || '').toLowerCase();
55
+
56
+ // NULL is universally accepted — every SQL type allows NULL.
57
+ if (lowerLabel === 'null') return true;
58
+
59
+ // Direct matches.
60
+ if (lowerLabel === 'text' && acceptedTypes.includes('string')) return true;
61
+ if (lowerLabel === 'number' && acceptedTypes.includes('number')) return true;
62
+ if (lowerLabel === 'boolean' && acceptedTypes.includes('boolean'))
63
+ return true;
64
+ if (lowerLabel === 'date' && acceptedTypes.includes('date')) return true;
65
+ if (lowerLabel === 'json' && acceptedTypes.includes('json')) return true;
66
+ if (
67
+ (lowerLabel === 'array' || lowerLabel === 'list') &&
68
+ (acceptedTypes.includes('array') || acceptedTypes.includes('table'))
69
+ )
70
+ return true;
71
+
72
+ // Castability: types that aren't a direct match but can serve where a
73
+ // string is expected. Keeps the option enabled in the dropdown rather
74
+ // than disabling it outright — the SQL coercion at runtime handles the
75
+ // conversion (UUIDs and enum identifiers are stored as text underneath,
76
+ // dates serialise as ISO strings, JSON values stringify trivially).
77
+ if (acceptedTypes.includes('string')) {
78
+ if (
79
+ lowerLabel === 'uuid' ||
80
+ lowerLabel === 'enum' ||
81
+ lowerLabel === 'date' ||
82
+ lowerLabel === 'json'
83
+ )
84
+ return true;
85
+ }
86
+
87
+ // Castability: numbers can serve where a date is expected (epoch-ish
88
+ // patterns are common) — kept explicit so it's easy to revisit.
89
+ if (lowerLabel === 'number' && acceptedTypes.includes('date')) return true;
90
+
91
+ return false;
92
+ }
93
+
94
+ export interface IFunctionOption {
95
+ type: 'function-option';
96
+ // The registry definition of the function this option represents. Carrying
97
+ // it here lets the parent value-picker offer specific functions (UPPER,
98
+ // LOWER, …) directly as Autocomplete options, instead of a generic
99
+ // "Function value" option that then required a second dropdown to pick
100
+ // the actual function.
101
+ def?: searchStatementFunctions.ISQLFunctionDefinition;
102
+ }
103
+
104
+ // --- DISPLAY COMPONENTS ---
105
+
106
+ export const ConditionSelectorValue = ({
107
+ value,
108
+ }: {
109
+ value:
110
+ | SearchStatementLiteralValue
111
+ | ValueRef
112
+ | ColumnRef
113
+ | InputMapState
114
+ | ILiteralValueOption
115
+ | IFunctionOption
116
+ | FunctionCall;
117
+ }) => {
118
+ const { project } = useSearchStatementContext();
119
+
120
+ if (!value) return null;
121
+
122
+ if (
123
+ value.type === SearchStatementNodeType.FunctionCall ||
124
+ value.type === 'function-option'
125
+ ) {
126
+ const isInstance = value.type === SearchStatementNodeType.FunctionCall;
127
+ const optionDef = !isInstance ? (value as IFunctionOption).def : undefined;
128
+ const name = isInstance
129
+ ? (value as FunctionCall).functionName
130
+ : optionDef?.name;
131
+ const label = isInstance
132
+ ? name
133
+ ? `${name}(...)`
134
+ : 'Function value'
135
+ : name
136
+ ? `${name}()`
137
+ : 'Function value';
138
+ const description =
139
+ optionDef?.description || 'A dynamically calculated function';
140
+ return (
141
+ <span style={{ display: 'flex', flexDirection: 'column' }}>
142
+ <span
143
+ style={{
144
+ display: 'flex',
145
+ alignItems: 'center',
146
+ gap: 8,
147
+ color: 'var(--color-main-primary)',
148
+ }}
149
+ >
150
+ <i className='fa-solid fa-function' style={{ fontSize: 12 }} />
151
+ {label}
152
+ </span>
153
+ <p
154
+ style={{
155
+ margin: 0,
156
+ marginLeft: 20,
157
+ fontSize: 10,
158
+ color: 'rgba(0,0,0,0.54)',
159
+ }}
160
+ >
161
+ {description}
162
+ </p>
163
+ </span>
164
+ );
165
+ }
166
+
167
+ if (value.type === SearchStatementNodeType.ColumnRef) {
168
+ return <ColumnSelectorValue value={value as ColumnRef} />;
169
+ } else if (
170
+ value.type === SearchStatementNodeType.LiteralValue ||
171
+ value.type === 'literal-value-option'
172
+ ) {
173
+ return <LiteralValueTypeSelectorValue value={value as any} />;
174
+ } else if (value.type === SearchStatementNodeType.ValueRef) {
175
+ return (
176
+ <span style={{ display: 'flex', flexDirection: 'column' }}>
177
+ <span style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
178
+ <DataTypeIcon entity={(value as ValueRef).inputMap} size='small' />
179
+ {resolveEntityName((value as ValueRef).inputMap, project.logic)}
180
+ </span>
181
+ <p
182
+ style={{
183
+ margin: 0,
184
+ marginLeft: 20,
185
+ fontSize: 10,
186
+ color: 'rgba(0,0,0,0.54)',
187
+ }}
188
+ >
189
+ {resolveEntityDataTypeLabel((value as ValueRef).inputMap)}{' '}
190
+ <b style={{ color: 'var(--color-main-primary)' }}>external input</b>{' '}
191
+ value
192
+ </p>
193
+ </span>
194
+ );
195
+ } else if (value.type === EntityType.InputMap) {
196
+ return (
197
+ <span style={{ display: 'flex', flexDirection: 'column' }}>
198
+ <span style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
199
+ <DataTypeIcon entity={value as InputMapState} size='small' />
200
+ {resolveEntityName(value as InputMapState, project.logic)}
201
+ </span>
202
+ <p
203
+ style={{
204
+ margin: 0,
205
+ marginLeft: 20,
206
+ fontSize: 10,
207
+ color: 'rgba(0,0,0,0.54)',
208
+ }}
209
+ >
210
+ {resolveEntityDataTypeLabel(value as InputMapState)}{' '}
211
+ <b style={{ color: 'var(--color-main-primary)' }}>external input</b>{' '}
212
+ value
213
+ </p>
214
+ </span>
215
+ );
216
+ }
217
+
218
+ return null;
219
+ };
220
+
221
+ export const FunctionCallSelector = ({
222
+ value,
223
+ onChange,
224
+ options,
225
+ disabledFunctionCategories,
226
+ disabled,
227
+ }: {
228
+ value: FunctionCall;
229
+ onChange: (value: FunctionCall) => void;
230
+ options: (InputMapState | ColumnRef | IFunctionOption)[];
231
+ disabledFunctionCategories?: SQLFunctionCategory[];
232
+ disabled?: boolean;
233
+ showFunctionPicker?: boolean;
234
+ }) => {
235
+ const { searchStatementState } = useSearchStatementContext();
236
+
237
+ const selectedDef: searchStatementFunctions.ISQLFunctionDefinition | null =
238
+ (!!value.functionName ? getFunctionDefinition(value.functionName) : null) ||
239
+ null;
240
+
241
+ return (
242
+ <div
243
+ className='test-class'
244
+ style={{
245
+ display: 'flex',
246
+ flexDirection: 'column',
247
+ gap: 12,
248
+ paddingLeft: 16,
249
+ borderLeft: '2px solid rgba(0,0,0,0.1)',
250
+ marginTop: 8,
251
+ width: '100%',
252
+ }}
253
+ >
254
+ {/* Render Arguments */}
255
+ {selectedDef && (
256
+ <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
257
+ {(() => {
258
+ // Render one slot per actual argument the value carries, padded
259
+ // up to the registry-required count. For variadic functions the
260
+ // last argDef stays "active" beyond the registry's static list,
261
+ // so additional user-added args still get a label and accepted-type set.
262
+ const slotCount = Math.max(
263
+ value.arguments.length,
264
+ selectedDef.arguments.length,
265
+ );
266
+ const variadicArgDef = selectedDef.arguments.find(
267
+ (a) => a.isVariadic,
268
+ );
269
+ const resolveArgDef = (i: number) =>
270
+ selectedDef.arguments[i] ||
271
+ variadicArgDef ||
272
+ selectedDef.arguments[selectedDef.arguments.length - 1];
273
+ return Array.from({ length: slotCount }).map((_, i) => {
274
+ const argDef = resolveArgDef(i);
275
+ return (
276
+ <div
277
+ key={i}
278
+ style={{
279
+ display: 'flex',
280
+ // flex-start so the tick mark stays anchored to the top
281
+ // of the argument block — when the argument is itself a
282
+ // nested function whose body is multi-line, alignItems
283
+ // 'center' would float the tick to the vertical middle of
284
+ // the whole stack.
285
+ alignItems: 'flex-start',
286
+ gap: 8,
287
+ }}
288
+ >
289
+ <div
290
+ style={{
291
+ width: 12,
292
+ height: 1,
293
+ // Push the 1px tick down to the vertical middle of the
294
+ // 40px MUI small Autocomplete input row that sits at the
295
+ // top of the argument block.
296
+ marginTop: 20,
297
+ backgroundColor: 'rgba(0,0,0,0.2)',
298
+ flexShrink: 0,
299
+ }}
300
+ />
301
+ <ValueSelector
302
+ value={value.arguments[i] as any}
303
+ side={argDef.name as any}
304
+ label={`Argument: ${argDef.name}`}
305
+ options={options}
306
+ acceptedTypes={argDef.acceptedTypes}
307
+ disabledFunctionCategories={disabledFunctionCategories}
308
+ onChange={(newArg) => {
309
+ value.arguments[i] = newArg;
310
+ onChange(value);
311
+ }}
312
+ disabled={disabled}
313
+ />
314
+ </div>
315
+ );
316
+ });
317
+ })()}
318
+
319
+ {selectedDef.arguments.some((a) => a.isVariadic) && (
320
+ <Button
321
+ size='small'
322
+ disabled={disabled}
323
+ onClick={() => {
324
+ value.arguments.push(
325
+ new SearchStatementLiteralValue(searchStatementState),
326
+ );
327
+ onChange(value);
328
+ }}
329
+ style={{ alignSelf: 'flex-start', fontSize: 10, marginLeft: 20 }}
330
+ >
331
+ + Add Argument
332
+ </Button>
333
+ )}
334
+ </div>
335
+ )}
336
+ </div>
337
+ );
338
+ };
339
+
340
+ export const ValueSelector = ({
341
+ value,
342
+ onChange,
343
+ options,
344
+ side,
345
+ label,
346
+ acceptedTypes,
347
+ disabledFunctionCategories,
348
+ includeOnlyOptionTypes,
349
+ disabled,
350
+ horizontalSeparator,
351
+ }: {
352
+ value: SearchStatementLiteralValue | ValueRef | ColumnRef | FunctionCall;
353
+ onChange: (
354
+ value: SearchStatementLiteralValue | ValueRef | ColumnRef | FunctionCall,
355
+ ) => void;
356
+ options: (InputMapState | ColumnRef | IFunctionOption)[];
357
+ side: 'left' | 'right' | string;
358
+ label?: string;
359
+ acceptedTypes?: SQLDataType[];
360
+ disabledFunctionCategories?: SQLFunctionCategory[];
361
+ includeOnlyOptionTypes?: (
362
+ | EntityType.InputMap
363
+ | searchStatementDefs.SearchStatementNodeType.ColumnRef
364
+ | searchStatementDefs.SearchStatementNodeType.FunctionCall
365
+ | searchStatementDefs.SearchStatementNodeType.LiteralValue
366
+ )[];
367
+ disabled?: boolean;
368
+ horizontalSeparator?: boolean;
369
+ }) => {
370
+ const { project, searchStatementState } = useSearchStatementContext();
371
+
372
+ const resolveLocalValueFromExternalValue = (
373
+ val: any,
374
+ ):
375
+ | ValueRef
376
+ | ColumnRef
377
+ | ILiteralValueOption
378
+ | IFunctionOption
379
+ | FunctionCall => {
380
+ if (val?.type === SearchStatementNodeType.LiteralValue) {
381
+ return { type: 'literal-value-option', valueType: val.valueType };
382
+ }
383
+ // FunctionCall is passed through unchanged. The Autocomplete uses
384
+ // `isOptionEqualToValue` to match it against the corresponding
385
+ // function-option entry in the option list (by function name).
386
+ return val;
387
+ };
388
+
389
+ const localValue = resolveLocalValueFromExternalValue(value);
390
+
391
+ const getOptionDisabled = (option: any): boolean => {
392
+ if (option.type === 'literal-value-option') {
393
+ if (!acceptedTypes || acceptedTypes.includes('any')) return false;
394
+ const t = option.valueType;
395
+ if (
396
+ t === SearchLiteralValueType.String &&
397
+ acceptedTypes.includes('string')
398
+ )
399
+ return false;
400
+ if (
401
+ t === SearchLiteralValueType.Number &&
402
+ acceptedTypes.includes('number')
403
+ )
404
+ return false;
405
+ if (
406
+ t === SearchLiteralValueType.Boolean &&
407
+ acceptedTypes.includes('boolean')
408
+ )
409
+ return false;
410
+ if (t === SearchLiteralValueType.Date && acceptedTypes.includes('date'))
411
+ return false;
412
+ if (
413
+ t === SearchLiteralValueType.Array &&
414
+ (acceptedTypes.includes('array') || acceptedTypes.includes('table'))
415
+ )
416
+ return false;
417
+ if (t === SearchLiteralValueType.Null) return false;
418
+ return true;
419
+ }
420
+
421
+ if (option.type === 'function-option') {
422
+ const def = (option as IFunctionOption).def;
423
+ if (!def) return false;
424
+ return !!disabledFunctionCategories?.includes(def.category);
425
+ }
426
+
427
+ if (
428
+ option.type === EntityType.InputMap ||
429
+ option.type === SearchStatementNodeType.ColumnRef
430
+ ) {
431
+ const typeLabel = resolveEntityDataTypeLabel(
432
+ option.type === EntityType.InputMap
433
+ ? option
434
+ : (option as ColumnRef).property,
435
+ );
436
+ return !matchesDataType(typeLabel, acceptedTypes || ['any']);
437
+ }
438
+
439
+ return false;
440
+ };
441
+
442
+ const getOptionTooltip = (option: any): string => {
443
+ if (getOptionDisabled(option)) {
444
+ return `This argument expects one of the following types: ${acceptedTypes?.join(', ') || 'None'}`;
445
+ }
446
+ return '';
447
+ };
448
+
449
+ let rawOptions: (
450
+ | ValueRef
451
+ | ColumnRef
452
+ | ILiteralValueOption
453
+ | IFunctionOption
454
+ )[] = [
455
+ { type: 'literal-value-option', valueType: SearchLiteralValueType.String },
456
+ { type: 'literal-value-option', valueType: SearchLiteralValueType.Number },
457
+ { type: 'literal-value-option', valueType: SearchLiteralValueType.Boolean },
458
+ { type: 'literal-value-option', valueType: SearchLiteralValueType.Date },
459
+ { type: 'literal-value-option', valueType: SearchLiteralValueType.Null },
460
+ { type: 'literal-value-option', valueType: SearchLiteralValueType.Array },
461
+ // Specific SQL functions are surfaced directly as options here, so the
462
+ // user picks the function (UPPER, LOWER, …) at this top-level dropdown
463
+ // rather than picking a generic "Function value" and then disambiguating
464
+ // in a second dropdown inside FunctionCallSelector.
465
+ ...Object.values(SQL_FUNCTION_REGISTRY).map<IFunctionOption>((def) => ({
466
+ type: 'function-option',
467
+ def,
468
+ })),
469
+ ...(options.map((option) => {
470
+ if (option.type === EntityType.InputMap) {
471
+ const newValueRef = new ValueRef(searchStatementState);
472
+ newValueRef.inputMap = option;
473
+ return newValueRef;
474
+ }
475
+ return option;
476
+ }) as (ColumnRef | ValueRef)[]),
477
+ ];
478
+
479
+ if (!!includeOnlyOptionTypes && !!includeOnlyOptionTypes.length) {
480
+ rawOptions = rawOptions.filter((op) => {
481
+ if (
482
+ includeOnlyOptionTypes.includes(
483
+ op.type as
484
+ | EntityType.InputMap
485
+ | searchStatementDefs.SearchStatementNodeType.ColumnRef
486
+ | searchStatementDefs.SearchStatementNodeType.FunctionCall
487
+ | searchStatementDefs.SearchStatementNodeType.LiteralValue,
488
+ )
489
+ ) {
490
+ return true;
491
+ }
492
+
493
+ if (
494
+ includeOnlyOptionTypes.includes(
495
+ searchStatementDefs.SearchStatementNodeType.LiteralValue,
496
+ ) &&
497
+ op.type === 'literal-value-option'
498
+ ) {
499
+ return true;
500
+ }
501
+
502
+ if (
503
+ includeOnlyOptionTypes.includes(
504
+ searchStatementDefs.SearchStatementNodeType.FunctionCall,
505
+ ) &&
506
+ op.type === 'function-option'
507
+ ) {
508
+ return true;
509
+ }
510
+
511
+ return false;
512
+ });
513
+ }
514
+
515
+ // Sort disabled options to the bottom!
516
+ const sanitizedOptions = rawOptions.sort((a, b) => {
517
+ const aDis = getOptionDisabled(a) ? 1 : 0;
518
+ const bDis = getOptionDisabled(b) ? 1 : 0;
519
+ return aDis - bDis;
520
+ });
521
+
522
+ const CLAUSE_ROW_ID = 'value-selector--' + ProjectState.UUID.uuid();
523
+ const showLiteralValueField =
524
+ localValue?.type === 'literal-value-option' &&
525
+ (localValue as ILiteralValueOption).valueType !==
526
+ SearchLiteralValueType.Null &&
527
+ (localValue as ILiteralValueOption).valueType !==
528
+ SearchLiteralValueType.Array;
529
+ // Check the actual `value`, not the resolved `localValue`: localValue maps
530
+ // FunctionCall → function-option so the parent Autocomplete can match a
531
+ // specific function in its option list, but the recursive arg-builder
532
+ // still needs to render whenever the underlying value is a FunctionCall.
533
+ const showFunctionBuilder =
534
+ (value as any)?.type === SearchStatementNodeType.FunctionCall;
535
+ // Array literal: render the item-list builder BELOW the picker row.
536
+ const showArrayBuilder =
537
+ (value as any)?.type === SearchStatementNodeType.LiteralValue &&
538
+ (value as SearchStatementLiteralValue).valueType ===
539
+ SearchLiteralValueType.Array;
540
+
541
+ return (
542
+ <span style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
543
+ <span
544
+ id='field-row'
545
+ style={{ display: 'flex', gap: 8, alignItems: 'center' }}
546
+ >
547
+ <span
548
+ id='field-group'
549
+ style={{ display: 'flex', gap: 8, alignItems: 'center' }}
550
+ >
551
+ <Autocomplete
552
+ disablePortal
553
+ disabled={disabled}
554
+ options={sanitizedOptions}
555
+ sx={{ width: 200 }}
556
+ value={localValue as any}
557
+ getOptionDisabled={getOptionDisabled}
558
+ isOptionEqualToValue={(option, val) => {
559
+ // MUI uses === by default, which would never match because
560
+ // resolveLocalValueFromExternalValue returns freshly-built
561
+ // option objects for literal values, and FunctionCall values
562
+ // must be matched against function-option entries by function
563
+ // name. Match structurally for both cases.
564
+ if (!option || !val) return option === val;
565
+ if (
566
+ option.type === 'function-option' &&
567
+ val.type === SearchStatementNodeType.FunctionCall
568
+ ) {
569
+ return (
570
+ (option as IFunctionOption).def?.name ===
571
+ (val as FunctionCall).functionName
572
+ );
573
+ }
574
+ if (
575
+ option.type === 'literal-value-option' &&
576
+ val.type === 'literal-value-option'
577
+ ) {
578
+ return (
579
+ (option as ILiteralValueOption).valueType ===
580
+ (val as ILiteralValueOption).valueType
581
+ );
582
+ }
583
+ return option === val;
584
+ }}
585
+ getOptionLabel={(option) => {
586
+ if (option.type === 'literal-value-option')
587
+ return `${fromLiteralValueTypeToReadableLabel(option.valueType)} value`;
588
+ if (option.type === 'function-option') {
589
+ const def = (option as IFunctionOption).def;
590
+ return def ? `${def.name}()` : 'Function value';
591
+ }
592
+ if (option.type === SearchStatementNodeType.FunctionCall) {
593
+ const fc = option as FunctionCall;
594
+ return fc.functionName
595
+ ? `${fc.functionName}()`
596
+ : 'Function value';
597
+ }
598
+ if (option.type === SearchStatementNodeType.ValueRef)
599
+ return resolveEntityName(option.inputMap, project.logic);
600
+ if (option.type === SearchStatementNodeType.ColumnRef)
601
+ return option?.as || '';
602
+ return '';
603
+ }}
604
+ onChange={(e, newValue) => {
605
+ let resolvedNewValue: any;
606
+
607
+ if (newValue?.type === 'literal-value-option') {
608
+ resolvedNewValue = new SearchStatementLiteralValue(
609
+ searchStatementState,
610
+ );
611
+ resolvedNewValue.valueType = newValue.valueType;
612
+ if (newValue.valueType === SearchLiteralValueType.Null)
613
+ resolvedNewValue.value = null;
614
+ else if (newValue.valueType === SearchLiteralValueType.Array)
615
+ // Arrays default to an empty item list — the user adds
616
+ // items via the "+ Add Item" button on the array editor.
617
+ resolvedNewValue.value = [];
618
+ } else if (newValue?.type === 'function-option') {
619
+ const def = (newValue as IFunctionOption).def;
620
+ if (value?.type === SearchStatementNodeType.FunctionCall) {
621
+ const fc = new FunctionCall(searchStatementState);
622
+ fc._id = (value as FunctionCall)._id;
623
+ fc._as = (value as FunctionCall)._as;
624
+ if (def) {
625
+ fc.functionName = def.name;
626
+ }
627
+ fc.arguments = [];
628
+ resolvedNewValue = fc;
629
+ } else {
630
+ const fc = new FunctionCall(searchStatementState);
631
+ if (def) {
632
+ fc.functionName = def.name;
633
+ }
634
+ resolvedNewValue = fc;
635
+ }
636
+ } else {
637
+ resolvedNewValue = newValue;
638
+ }
639
+
640
+ onChange(resolvedNewValue);
641
+ }}
642
+ renderOption={(props, option) => {
643
+ const { key, ...optionProps } = props;
644
+ const isDisabled = getOptionDisabled(option);
645
+
646
+ return (
647
+ <MuiTooltip
648
+ key={key}
649
+ placement='right'
650
+ arrow
651
+ disableHoverListener={!isDisabled}
652
+ title={getOptionTooltip(option)}
653
+ >
654
+ <Box
655
+ component='li'
656
+ {...optionProps}
657
+ sx={{ opacity: isDisabled ? 0.5 : 1 }}
658
+ >
659
+ <ConditionSelectorValue value={option} />
660
+ </Box>
661
+ </MuiTooltip>
662
+ );
663
+ }}
664
+ renderInput={(params) => (
665
+ <span
666
+ style={{
667
+ position: 'relative',
668
+ display: 'block',
669
+ height: '100%',
670
+ }}
671
+ >
672
+ <span
673
+ id={CLAUSE_ROW_ID + `--${side}-input-selected-value`}
674
+ style={{
675
+ position: 'absolute',
676
+ top: 8,
677
+ left: 0,
678
+ width: '100%',
679
+ height: '100%',
680
+ maxHeight: 30,
681
+ overflowY: 'hidden',
682
+ paddingLeft: 14,
683
+ display: 'flex',
684
+ flexDirection: 'column',
685
+ }}
686
+ >
687
+ <ConditionSelectorValue value={value as any} />
688
+ </span>
689
+ <TextField
690
+ {...params}
691
+ size='small'
692
+ label={label || `Select ${side} value`}
693
+ slotProps={{
694
+ htmlInput: {
695
+ ...params.inputProps,
696
+ id: CLAUSE_ROW_ID + `--${side}-input`,
697
+ style: { opacity: 0 },
698
+ },
699
+ }}
700
+ onFocus={(e) => {
701
+ e.target.style.opacity = '1';
702
+ const el = document.getElementById(
703
+ CLAUSE_ROW_ID + `--${side}-input-selected-value`,
704
+ );
705
+ if (el) el.style.visibility = 'hidden';
706
+ }}
707
+ onBlur={(e) => {
708
+ e.target.style.opacity = '0';
709
+ const el = document.getElementById(
710
+ CLAUSE_ROW_ID + `--${side}-input-selected-value`,
711
+ );
712
+ if (el) el.style.visibility = 'visible';
713
+ }}
714
+ />
715
+ </span>
716
+ )}
717
+ />
718
+ {showLiteralValueField && (
719
+ <LiteralValueField
720
+ disabled={disabled}
721
+ value={value as SearchStatementLiteralValue}
722
+ onChange={onChange}
723
+ />
724
+ )}
725
+ </span>
726
+ {showFunctionBuilder && horizontalSeparator && (
727
+ <hr
728
+ style={{
729
+ width: '100%',
730
+ border: 'none',
731
+ borderTop: '2px solid rgba(0, 0, 0, 0.1)',
732
+ margin: '0',
733
+ }}
734
+ />
735
+ )}
736
+ </span>
737
+
738
+ {/* RECURSIVE FUNCTION BUILDER INJECTION
739
+ The parent Autocomplete above already lets the user pick the specific
740
+ function (UPPER, LOWER, …) directly, so the inner builder skips its
741
+ own picker and only renders the argument list. */}
742
+ {showFunctionBuilder && (
743
+ <FunctionCallSelector
744
+ value={value as FunctionCall}
745
+ onChange={onChange}
746
+ options={options}
747
+ disabledFunctionCategories={disabledFunctionCategories}
748
+ disabled={disabled}
749
+ />
750
+ )}
751
+
752
+ {/* ARRAY LITERAL ITEMS BUILDER
753
+ Renders the item list below the picker row, mirroring how a
754
+ function's arguments nest below its name. Each item recursively
755
+ uses LiteralValueTypeSelector so nested arrays / mixed-type items
756
+ work without further special-casing here. */}
757
+ {showArrayBuilder && (
758
+ <LiteralArrayBuilder
759
+ value={value as SearchStatementLiteralValue}
760
+ onChange={(newValue) => onChange(newValue)}
761
+ disabled={disabled}
762
+ />
763
+ )}
764
+ </span>
765
+ );
766
+ };