@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,750 @@
1
+ import React from 'react';
2
+ import {
3
+ InputMapState,
4
+ ProjectState,
5
+ searchStatementDefs,
6
+ searchStatementState as searchStatementStateLib,
7
+ } from '@elyx-code/project-logic-tree';
8
+ import {
9
+ Autocomplete,
10
+ Box,
11
+ IconButton,
12
+ TextField,
13
+ Tooltip as MuiTooltip,
14
+ } from '@mui/material';
15
+ import { useSearchStatementContext } from './search-statement-context';
16
+ import DropdownMenuPopup from '../../../lib/dropdown/DropdownMenuPopup';
17
+ import Tooltip from '../../../lib/tooltip/Tooltip';
18
+ import { ValueSelector } from './ValueSelector';
19
+ import WarningIcon from '../../../assets/warning-sign-24px.png';
20
+
21
+ const { ColumnRef, WhereStatement } = searchStatementStateLib;
22
+ const { SQLFunctionCategory, WhereStatementOperator } = searchStatementDefs;
23
+
24
+ type ColumnRef = searchStatementStateLib.ColumnRef;
25
+ type WhereStatement = searchStatementStateLib.WhereStatement;
26
+ type WhereStatementOperator = searchStatementDefs.WhereStatementOperator;
27
+
28
+ export function resolveOperatorName(operator: WhereStatementOperator): string {
29
+ switch (operator) {
30
+ case WhereStatementOperator.Equal:
31
+ return 'Equals';
32
+ case WhereStatementOperator.NotEqual:
33
+ return 'Not equal to';
34
+ case WhereStatementOperator.BiggerThan:
35
+ return 'Is greater than';
36
+ case WhereStatementOperator.BiggerThanOrEqualTo:
37
+ return 'Is greater than or equal';
38
+ case WhereStatementOperator.SmallerThan:
39
+ return 'Is less than';
40
+ case WhereStatementOperator.SmallerThanOrEqualTo:
41
+ return 'Is less than or equal';
42
+ case WhereStatementOperator.In:
43
+ return 'Is in';
44
+ case WhereStatementOperator.Like:
45
+ return 'Like pattern';
46
+ case WhereStatementOperator.NotLike:
47
+ return 'Not like pattern';
48
+ default: {
49
+ const operatorKey = Object.keys(WhereStatementOperator).find(
50
+ (key) => (WhereStatementOperator as any)[key] === operator,
51
+ );
52
+ return operatorKey?.replace(/_/g, ' ').toLowerCase() || '';
53
+ }
54
+ }
55
+ }
56
+
57
+ const ConditionBuilderRow = ({
58
+ index,
59
+ parent,
60
+ condition,
61
+ onChange,
62
+ options,
63
+ }: {
64
+ index: number;
65
+ parent?: string;
66
+ condition: WhereStatement;
67
+ onChange: (value: WhereStatement) => void;
68
+ options: (InputMapState | ColumnRef)[];
69
+ }) => {
70
+ const CLAUSE_ROW_ID =
71
+ 'condition-builder--' +
72
+ (condition?.id || ProjectState.UUID.uuid()) +
73
+ '--row';
74
+ const [isMenuOpen, setIsMenuOpen] = React.useState(false);
75
+
76
+ const disabledFunctionsInWhere = [
77
+ SQLFunctionCategory.Aggregate,
78
+ SQLFunctionCategory.TableValued,
79
+ ];
80
+
81
+ return (
82
+ <>
83
+ <div style={{ display: 'flex', gap: 12, alignItems: 'stretch' }}>
84
+ {/* CHANGED FROM span TO div, removed height: 100% */}
85
+ <div
86
+ style={{
87
+ display: 'flex',
88
+ flexDirection: 'column',
89
+ // paddingTop: 3,
90
+ }}
91
+ >
92
+ {index === 0 ? (
93
+ <div
94
+ style={{
95
+ width: 1,
96
+ height: 16.5,
97
+ backgroundColor: 'transparent',
98
+ marginLeft: 5,
99
+ }}
100
+ />
101
+ ) : (
102
+ <div
103
+ style={{
104
+ width: 1,
105
+ height: 16.5,
106
+ backgroundColor: 'rgba(0,0,0,0.54)',
107
+ marginLeft: 5,
108
+ }}
109
+ />
110
+ )}
111
+
112
+ {/* CHANGED FROM span TO div */}
113
+ <div style={{ display: 'flex', alignItems: 'center' }}>
114
+ {!!parent && (
115
+ <div
116
+ style={{
117
+ width: 2,
118
+ height: 1,
119
+ backgroundColor: 'rgba(0,0,0,0.54)',
120
+ }}
121
+ />
122
+ )}
123
+ <div
124
+ style={{
125
+ width: 7,
126
+ height: 7,
127
+ borderRadius: 1,
128
+ backgroundColor: 'rgba(0,0,0,0.54)',
129
+ marginLeft: !!parent ? 0 : 2,
130
+ }}
131
+ />
132
+ </div>
133
+
134
+ {/* RELY PURELY ON flexGrow: 1 */}
135
+ {condition.isValid ? (
136
+ <div
137
+ style={{
138
+ width: 1,
139
+ flexGrow: 1,
140
+ backgroundColor: 'rgba(0,0,0,0.54)',
141
+ marginLeft: 5,
142
+ minHeight: 16.5,
143
+ }}
144
+ />
145
+ ) : (
146
+ <div
147
+ style={{
148
+ width: 1,
149
+ flexGrow: 1,
150
+ backgroundColor: 'transparent',
151
+ marginLeft: 5,
152
+ minHeight: 16.5,
153
+ }}
154
+ />
155
+ )}
156
+ </div>
157
+
158
+ <div style={{ display: 'flex', gap: 12, alignItems: 'flex-start' }}>
159
+ <ValueSelector
160
+ value={condition.left as any}
161
+ side='left'
162
+ onChange={(newValue) => {
163
+ condition.left = newValue as any;
164
+ onChange(condition);
165
+ }}
166
+ options={options}
167
+ disabledFunctionCategories={disabledFunctionsInWhere}
168
+ horizontalSeparator={
169
+ condition.left?.type ===
170
+ searchStatementDefs.SearchStatementNodeType.FunctionCall
171
+ }
172
+ />
173
+
174
+ <Autocomplete
175
+ disablePortal
176
+ options={Object.values(WhereStatementOperator).map(
177
+ (key) => ({ key }) as { key: WhereStatementOperator },
178
+ )}
179
+ sx={{ width: 200 }}
180
+ value={{ key: condition.operator }}
181
+ onChange={(e, newValue) => {
182
+ condition.operator =
183
+ (newValue?.key as WhereStatementOperator) || null;
184
+ onChange(condition);
185
+ }}
186
+ getOptionLabel={(option) =>
187
+ resolveOperatorName(option.key as WhereStatementOperator)
188
+ }
189
+ renderOption={(props, option) => {
190
+ const { key, ...optionProps } = props;
191
+ return (
192
+ <Box
193
+ key={key}
194
+ component='li'
195
+ sx={{ '& > img': { mr: 2, flexShrink: 0 } }}
196
+ {...optionProps}
197
+ >
198
+ <div style={{ display: 'flex', flexDirection: 'column' }}>
199
+ <div
200
+ style={{ display: 'flex', alignItems: 'center', gap: 8 }}
201
+ >
202
+ {resolveOperatorName(
203
+ option.key as WhereStatementOperator,
204
+ )}
205
+ </div>
206
+ <p
207
+ style={{
208
+ margin: 0,
209
+ fontSize: 10,
210
+ color: 'rgba(0,0,0,0.54)',
211
+ }}
212
+ >
213
+ {option.key}
214
+ </p>
215
+ </div>
216
+ </Box>
217
+ );
218
+ }}
219
+ renderInput={(params) => (
220
+ <TextField {...params} size='small' label='Select operator' />
221
+ )}
222
+ />
223
+
224
+ <ValueSelector
225
+ value={condition.right as any}
226
+ side='right'
227
+ onChange={(newValue) => {
228
+ condition.right = newValue as any;
229
+ onChange(condition);
230
+ }}
231
+ options={options}
232
+ disabledFunctionCategories={disabledFunctionsInWhere}
233
+ />
234
+
235
+ <IconButton
236
+ id={CLAUSE_ROW_ID + '--menu-button'}
237
+ size='small'
238
+ style={{ width: 22, height: 22, marginTop: 8 }}
239
+ onClick={() => setIsMenuOpen(!isMenuOpen)}
240
+ >
241
+ <i className='fas fa-ellipsis-v' />
242
+ </IconButton>
243
+
244
+ {!condition.isValid && (
245
+ <div style={{ marginTop: 8 }}>
246
+ <MuiTooltip
247
+ placement='bottom'
248
+ enterDelay={300}
249
+ leaveDelay={200}
250
+ arrow
251
+ title={
252
+ <>
253
+ This condition is not fully resolved.
254
+ <br />
255
+ If the condition is not resolved it will be ignored.
256
+ </>
257
+ }
258
+ >
259
+ <img
260
+ className='search-statement__error-icon'
261
+ src={WarningIcon}
262
+ />
263
+ </MuiTooltip>
264
+ </div>
265
+ )}
266
+ </div>
267
+ </div>
268
+
269
+ <DropdownMenuPopup
270
+ popupOptions={{
271
+ anchorQuerySelector: `#${CLAUSE_ROW_ID}--menu-button`,
272
+ placement: 'right',
273
+ open: isMenuOpen,
274
+ }}
275
+ options={[
276
+ {
277
+ onClick: async () => {
278
+ condition.remove();
279
+ onChange(null as any);
280
+ },
281
+ label: 'Delete',
282
+ color: 'error',
283
+ iconEnd: 'fa-solid fa-trash-can',
284
+ tooltip: 'Click to delete this part of the statement',
285
+ },
286
+ ]}
287
+ />
288
+ </>
289
+ );
290
+ };
291
+
292
+ const ConditionBuilder = ({
293
+ parent,
294
+ condition,
295
+ onChange,
296
+ options,
297
+ }: {
298
+ parent?: string;
299
+ condition: WhereStatement;
300
+ onChange: (value: WhereStatement) => void;
301
+ options: (InputMapState | ColumnRef)[];
302
+ }) => {
303
+ const { searchStatementState, entity } = useSearchStatementContext();
304
+
305
+ const CLAUSE_ID =
306
+ 'condition-builder--' + (condition?.id || ProjectState.UUID.uuid());
307
+
308
+ const conditions: { operator: 'and' | 'or'; condition: WhereStatement }[] =
309
+ !condition
310
+ ? []
311
+ : [
312
+ ...condition.and.map((c) => ({
313
+ operator: 'and' as 'and' | 'or',
314
+ condition: c,
315
+ })),
316
+ ...condition.or.map((c) => ({
317
+ operator: 'or' as 'and' | 'or',
318
+ condition: c,
319
+ })),
320
+ ];
321
+
322
+ const disabled = !entity.editable;
323
+
324
+ return (
325
+ <div
326
+ style={{
327
+ display: 'flex',
328
+ flexDirection: 'column',
329
+ }}
330
+ >
331
+ {!!condition && !condition.and.length && !condition.or.length && (
332
+ <>
333
+ <ConditionBuilderRow
334
+ options={options}
335
+ index={0}
336
+ parent={parent}
337
+ condition={condition}
338
+ onChange={(nestedCondition) => {
339
+ onChange(nestedCondition);
340
+ }}
341
+ />
342
+
343
+ {condition.isValid && (
344
+ <>
345
+ {/* vertical centered line */}
346
+ {!!parent && (
347
+ <div
348
+ id='condition-builder__vertical-line-after-root-condition'
349
+ style={{
350
+ width: 1,
351
+ height: 4,
352
+ backgroundColor: 'rgba(0,0,0,0.54)',
353
+ marginLeft: 5,
354
+ }}
355
+ />
356
+ )}
357
+
358
+ <span
359
+ className='condition-builder__add-condition-between__container'
360
+ style={{
361
+ display: 'flex',
362
+ gap: 6,
363
+ alignItems: 'center',
364
+ }}
365
+ >
366
+ <button
367
+ id={`${CLAUSE_ID}--add-first-nested-condition`}
368
+ className='condition-builder__add-condition-between__button'
369
+ disabled={disabled}
370
+ style={{
371
+ width: 11,
372
+ height: 11,
373
+ }}
374
+ >
375
+ <i className='fas fa-plus' />
376
+ </button>
377
+
378
+ <hr
379
+ className='condition-builder__add-condition-between__line'
380
+ style={{
381
+ width: 630,
382
+ backgroundColor: 'var(--color-main-primary)',
383
+ color: 'var(--color-main-primary)',
384
+ borderTop: '2px solid var(--color-main-primary)',
385
+ maxWidth: '100%',
386
+ margin: 0,
387
+ }}
388
+ />
389
+ </span>
390
+
391
+ <DropdownMenuPopup
392
+ popupOptions={{
393
+ anchorQuerySelector: `#${CLAUSE_ID}--add-first-nested-condition`,
394
+ placement: 'bottom',
395
+ }}
396
+ options={[
397
+ {
398
+ disabled: disabled,
399
+ onClick: async () => {
400
+ const newSiblingWhereStatement = new WhereStatement(
401
+ searchStatementState,
402
+ );
403
+
404
+ const oldSelfClone = new WhereStatement(
405
+ searchStatementState,
406
+ );
407
+
408
+ oldSelfClone.left = condition.left;
409
+ oldSelfClone.right = condition.right;
410
+ oldSelfClone.operator = condition.operator;
411
+
412
+ newSiblingWhereStatement.parent = condition;
413
+ oldSelfClone.parent = condition;
414
+
415
+ condition.and = [
416
+ ...(condition.and || []),
417
+ oldSelfClone,
418
+ newSiblingWhereStatement,
419
+ ];
420
+
421
+ condition.left = null;
422
+ condition.right = null;
423
+ condition.operator = null;
424
+
425
+ onChange?.(condition);
426
+ },
427
+ label: `Add 'AND' condition`,
428
+ color: 'primary',
429
+ iconEnd: 'fa-solid fa-plus',
430
+ tooltip: 'Click to add',
431
+ },
432
+ {
433
+ disabled: disabled,
434
+ onClick: async () => {
435
+ const newSiblingWhereStatement = new WhereStatement(
436
+ searchStatementState,
437
+ );
438
+
439
+ const oldSelfClone = new WhereStatement(
440
+ searchStatementState,
441
+ );
442
+
443
+ oldSelfClone.left = condition.left;
444
+ oldSelfClone.right = condition.right;
445
+ oldSelfClone.operator = condition.operator;
446
+
447
+ newSiblingWhereStatement.parent = condition;
448
+ oldSelfClone.parent = condition;
449
+
450
+ condition.or = [
451
+ ...(condition.or || []),
452
+ oldSelfClone,
453
+ newSiblingWhereStatement,
454
+ ];
455
+
456
+ condition.left = null;
457
+ condition.right = null;
458
+ condition.operator = null;
459
+
460
+ onChange?.(condition);
461
+ },
462
+ label: `Add 'OR' condition`,
463
+ color: 'primary',
464
+ iconEnd: 'fa-solid fa-plus',
465
+ tooltip: 'Click to add',
466
+ },
467
+ ]}
468
+ />
469
+ </>
470
+ )}
471
+ </>
472
+ )}
473
+ {conditions.map((nestedConditionItem, index) => (
474
+ <div
475
+ key={nestedConditionItem.condition.id}
476
+ style={{
477
+ display: 'flex',
478
+ flexDirection: 'column',
479
+ }}
480
+ >
481
+ <span
482
+ style={{
483
+ display: 'flex',
484
+ }}
485
+ >
486
+ <span
487
+ key={index}
488
+ style={{
489
+ display: 'flex',
490
+ flexDirection: 'column',
491
+ }}
492
+ >
493
+ {index === 0 ? (
494
+ <div
495
+ id={`condition-builder__vertical-line-before-operator-keyword--${index}`}
496
+ style={{
497
+ width: 1,
498
+ height: 17,
499
+ backgroundColor: 'transparent',
500
+ marginLeft: 5,
501
+ }}
502
+ />
503
+ ) : (
504
+ <div
505
+ id={`condition-builder__vertical-line-before-operator-keyword--${index}`}
506
+ style={{
507
+ width: 1,
508
+ height: 16,
509
+ backgroundColor: 'rgba(0,0,0,0.54)',
510
+ marginLeft: 5,
511
+ }}
512
+ />
513
+ )}
514
+
515
+ <span
516
+ style={{
517
+ display: 'flex',
518
+ alignItems: 'center',
519
+ }}
520
+ >
521
+ {index !== 0 ? (
522
+ <p
523
+ style={{
524
+ textTransform: 'uppercase',
525
+ fontSize: 8,
526
+ color: 'rgba(0,0,0,0.54)',
527
+ margin: 0,
528
+ }}
529
+ >
530
+ {nestedConditionItem.operator?.toUpperCase()}
531
+ </p>
532
+ ) : (
533
+ <span
534
+ style={{
535
+ display: 'flex',
536
+ alignItems: 'center',
537
+ }}
538
+ >
539
+ {!!parent && (
540
+ <span
541
+ style={{
542
+ width: 2,
543
+ height: 1,
544
+ backgroundColor: 'rgba(0,0,0,0.54)',
545
+ }}
546
+ />
547
+ )}
548
+ <div
549
+ style={{
550
+ width: 7,
551
+ height: 7,
552
+ borderRadius: 1,
553
+ backgroundColor: 'rgba(0,0,0,0.54)',
554
+ marginLeft: !!parent ? 0 : 2,
555
+ }}
556
+ />
557
+ </span>
558
+ )}
559
+
560
+ {/* Horizontal line to connect to the nested condition builder */}
561
+ <span
562
+ style={{
563
+ width:
564
+ index !== 0
565
+ ? nestedConditionItem.operator?.toUpperCase() === 'AND'
566
+ ? 8
567
+ : 12
568
+ : 18,
569
+ height: 1,
570
+ backgroundColor: 'rgba(0,0,0,0.54)',
571
+ flexGrow: 1,
572
+ marginLeft: index !== 0 ? 2 : 0,
573
+ }}
574
+ />
575
+ </span>
576
+ <div
577
+ id={`condition-builder__vertical-line-after-operator-keyword--${index}`}
578
+ style={{
579
+ width: 1,
580
+ backgroundColor: 'rgba(0,0,0,0.54)',
581
+ flexGrow: 1,
582
+ marginLeft: 5,
583
+ }}
584
+ />
585
+ </span>
586
+
587
+ <ConditionBuilder
588
+ parent={CLAUSE_ID}
589
+ condition={nestedConditionItem.condition}
590
+ options={options}
591
+ onChange={(value) => {
592
+ onChange(condition);
593
+ }}
594
+ />
595
+ </span>
596
+
597
+ {!!parent && (
598
+ <div
599
+ id='condition-builder__vertical-line-after-root-condition'
600
+ style={{
601
+ width: 1,
602
+ height: 4,
603
+ backgroundColor: 'rgba(0,0,0,0.54)',
604
+ marginLeft: 5,
605
+ }}
606
+ />
607
+ )}
608
+
609
+ {condition.isValid && (
610
+ <>
611
+ <span
612
+ className='condition-builder__add-condition-between__container'
613
+ style={{
614
+ display: 'flex',
615
+ gap: 6,
616
+ alignItems: 'center',
617
+ }}
618
+ >
619
+ <button
620
+ id={`${nestedConditionItem.condition.id}--add-nest-condition-in-group`}
621
+ className='condition-builder__add-condition-between__button'
622
+ disabled={disabled}
623
+ style={{
624
+ width: 11,
625
+ height: 11,
626
+ }}
627
+ >
628
+ <i className='fas fa-plus' />
629
+ </button>
630
+
631
+ <hr
632
+ className='condition-builder__add-condition-between__line'
633
+ style={{
634
+ width: 630,
635
+ backgroundColor: 'var(--color-main-primary)',
636
+ color: 'var(--color-main-primary)',
637
+ borderTop: '2px solid var(--color-main-primary)',
638
+ maxWidth: '100%',
639
+ margin: 0,
640
+ }}
641
+ />
642
+ </span>
643
+
644
+ <DropdownMenuPopup
645
+ popupOptions={{
646
+ anchorQuerySelector: `#${nestedConditionItem.condition.id}--add-nest-condition-in-group`,
647
+ placement: 'bottom',
648
+ }}
649
+ options={[
650
+ {
651
+ disabled: disabled,
652
+ onClick: async () => {
653
+ const newSiblingStatement = new WhereStatement(
654
+ searchStatementState,
655
+ );
656
+
657
+ newSiblingStatement.parent = condition;
658
+
659
+ condition.and = [
660
+ ...(condition.and || []),
661
+ newSiblingStatement,
662
+ ];
663
+
664
+ onChange?.(newSiblingStatement);
665
+ },
666
+ label: `Add 'AND' condition`,
667
+ color: 'primary',
668
+ iconEnd: 'fa-solid fa-plus',
669
+ tooltip: 'Click to add',
670
+ },
671
+ {
672
+ disabled: disabled,
673
+ onClick: async () => {
674
+ const newSiblingStatement = new WhereStatement(
675
+ searchStatementState,
676
+ );
677
+
678
+ newSiblingStatement.parent = condition;
679
+
680
+ condition.or = [
681
+ ...(condition.or || []),
682
+ newSiblingStatement,
683
+ ];
684
+
685
+ onChange?.(newSiblingStatement);
686
+ },
687
+ label: `Add 'OR' condition`,
688
+ color: 'primary',
689
+ iconEnd: 'fa-solid fa-plus',
690
+ tooltip: 'Click to add',
691
+ },
692
+ ]}
693
+ />
694
+ </>
695
+ )}
696
+ </div>
697
+ ))}
698
+
699
+ {!condition && (
700
+ <>
701
+ <div
702
+ style={{
703
+ display: 'flex',
704
+ alignItems: 'center',
705
+ gap: 8,
706
+ }}
707
+ >
708
+ <button
709
+ id={`${CLAUSE_ID}--add-root-condition`}
710
+ className='condition-builder__add-condition-between__button'
711
+ disabled={disabled}
712
+ onClick={() => {
713
+ if (!condition) {
714
+ const newCondition = new WhereStatement(searchStatementState);
715
+ onChange?.(newCondition);
716
+ } else {
717
+ onChange?.(condition);
718
+ }
719
+ }}
720
+ style={{
721
+ width: 11,
722
+ height: 11,
723
+ }}
724
+ >
725
+ <i className='fas fa-plus' />
726
+ </button>
727
+ <p
728
+ style={{
729
+ margin: 0,
730
+ fontSize: 10,
731
+ color: 'rgba(0,0,0,0.54)',
732
+ }}
733
+ >
734
+ No conditions
735
+ </p>
736
+ </div>
737
+
738
+ <Tooltip
739
+ anchorQuerySelector={`#${CLAUSE_ID}--add-root-condition`}
740
+ placement='bottom'
741
+ >
742
+ Click to add the first condition
743
+ </Tooltip>
744
+ </>
745
+ )}
746
+ </div>
747
+ );
748
+ };
749
+
750
+ export default ConditionBuilder;