@gadmin2n/schematics 0.0.144 → 0.0.146

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 (280) hide show
  1. package/dist/lib/application/files/gadmin2-game-angle-demo/config/.types.d.ts +10 -0
  2. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/approval.prisma +2 -0
  3. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/workflow.prisma +140 -19
  4. package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +2 -2
  5. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/data-mngt.seed.ts +0 -2
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts +694 -327
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-outbox.ts +49 -0
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow.seed.ts +35 -5
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agenda/agenda.service.ts +14 -24
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-executor.spec.ts +23 -0
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-executor.ts +16 -5
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.controller.spec.ts +98 -0
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.controller.ts +26 -6
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.dto.ts +17 -2
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.spec.ts +1 -0
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.ts +3 -0
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.dto.ts +0 -2
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-signal-outbox.service.spec.ts +30 -0
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-signal-outbox.service.ts +28 -6
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.spec.ts +63 -0
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.ts +151 -38
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-wait.handler.ts +4 -1
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/human-approval.handler.spec.ts +16 -5
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/human-approval.handler.ts +23 -6
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.controller.spec.ts +130 -0
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.controller.ts +62 -62
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.dto.ts +15 -1
  28. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.spec.ts +70 -9
  29. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.ts +31 -7
  30. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-signal-outbox.service.spec.ts +30 -0
  31. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-signal-outbox.service.ts +28 -6
  32. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.spec.ts +50 -3
  33. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.ts +26 -3
  34. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.dto.ts +53 -47
  35. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.errors.ts +0 -1
  36. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.service.spec.ts +541 -0
  37. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.service.ts +442 -200
  38. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/outbox-retry.util.ts +1 -0
  39. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.controller.spec.ts +150 -0
  40. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.controller.ts +56 -40
  41. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.dto.ts +16 -60
  42. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.controller.ts +13 -0
  43. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.service.spec.ts +44 -0
  44. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.service.ts +6 -0
  45. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.spec.ts +258 -12
  46. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.ts +127 -14
  47. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/manual-workflow-execution.spec.ts +85 -0
  48. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/manual-workflow-execution.ts +108 -0
  49. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/parameter-binding.ts +5 -5
  50. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.spec.ts +96 -25
  51. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.ts +77 -34
  52. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.spec.ts +23 -34
  53. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.ts +0 -21
  54. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-cancellation.spec.ts +245 -0
  55. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.spec.ts +639 -188
  56. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.ts +408 -235
  57. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.types.ts +1 -3
  58. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.spec.ts +279 -95
  59. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.ts +360 -80
  60. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-event-catalog.spec.ts +323 -0
  61. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-execution-idempotency.spec.ts +773 -0
  62. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-execution.dto.ts +7 -13
  63. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.dto.ts +0 -16
  64. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.service.spec.ts +184 -0
  65. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.service.ts +69 -138
  66. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-handle-validator.spec.ts +113 -0
  67. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-handle-validator.ts +59 -13
  68. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-runtime.facade.ts +86 -0
  69. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-switch-config.spec.ts +25 -0
  70. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-switch-config.ts +45 -0
  71. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.spec.ts +78 -43
  72. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.ts +103 -40
  73. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.dto.ts +57 -0
  74. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.module.ts +3 -1
  75. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.spec.ts +1000 -240
  76. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +2184 -317
  77. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.spec.ts +279 -2
  78. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.ts +5 -1
  79. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.spec.ts +4 -1
  80. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.ts +5 -1
  81. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.spec.ts +12 -3
  82. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.ts +10 -1
  83. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.spec.ts +2 -24
  84. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.ts +3 -70
  85. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +3 -1
  86. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/RowActions.tsx +25 -5
  87. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/WorkflowActionButton.test.tsx +71 -0
  88. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/WorkflowActionButton.tsx +89 -0
  89. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/index.ts +1 -0
  90. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/header.tsx +52 -12
  91. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +12 -0
  92. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +2 -2
  93. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddDataModal.tsx +10 -33
  94. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddPageModal.tsx +13 -37
  95. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +55 -7
  96. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/style.css +14 -0
  97. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/http.ts +10 -0
  98. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/list.tsx +1 -0
  99. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/workflowAction.ts +19 -0
  100. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/index.ts +1 -0
  101. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/types.ts +3 -1
  102. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +1 -6
  103. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useReferenceUpload.ts +95 -0
  104. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +2 -2
  105. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/workflow.json +672 -110
  106. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +2 -2
  107. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/workflow.json +676 -114
  108. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/plugins/devShellPlugin.ts +13 -1
  109. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/index.tsx +1 -0
  110. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasEditPage.tsx +38 -4
  111. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +276 -376
  112. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/CanvasAiModal.tsx +126 -6
  113. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/DecisionModal.test.tsx +50 -0
  114. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/DecisionModal.tsx +48 -11
  115. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/inbox.tsx +32 -34
  116. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/RegisterBusinessEventModal.test.tsx +111 -0
  117. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/RegisterBusinessEventModal.tsx +167 -0
  118. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/business-events.css +99 -0
  119. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/detail.test.tsx +106 -0
  120. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/detail.tsx +324 -0
  121. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/index.test.tsx +73 -0
  122. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/business-events/index.tsx +359 -0
  123. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CanvasZoomControls.tsx +46 -0
  124. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CreateNodeInstanceDrawer.tsx +9 -1
  125. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.test.tsx +105 -4
  126. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.tsx +90 -48
  127. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DeletableEdge.tsx +3 -2
  128. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DslView.test.tsx +259 -0
  129. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DslView.tsx +167 -103
  130. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/EnhancedFlowRenderer.tsx +142 -140
  131. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.test.tsx +60 -15
  132. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.tsx +25 -12
  133. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/FlowRenderer.tsx +364 -200
  134. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NewNodeDefaults.test.tsx +220 -52
  135. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeOutputSummary.test.tsx +260 -0
  136. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeOutputSummary.tsx +300 -130
  137. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.test.tsx +507 -33
  138. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.tsx +630 -592
  139. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ParameterBindingEditor.tsx +67 -70
  140. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ReadonlyNodePanel.test.tsx +90 -0
  141. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ReadonlyNodePanel.tsx +325 -0
  142. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/RunWorkflowModal.test.tsx +52 -0
  143. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/RunWorkflowModal.tsx +14 -9
  144. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/StatusCards.tsx +2 -1
  145. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/VersionPanel.tsx +2 -1
  146. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/WorkflowCodeEditor.test.tsx +42 -0
  147. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/WorkflowCodeEditor.tsx +76 -0
  148. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/WorkflowWorkspaceHeader.tsx +56 -0
  149. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/parameter-binding-editor.css +46 -0
  150. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/workflow-code-editor.css +34 -0
  151. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/ConnectionModal.test.tsx +53 -7
  152. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/ConnectionModal.tsx +123 -62
  153. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/connections.css +85 -0
  154. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/connectionsApi.ts +29 -0
  155. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/index.test.tsx +75 -0
  156. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/index.tsx +69 -36
  157. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.test.tsx +494 -0
  158. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.tsx +665 -194
  159. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useReferencedNodeInstanceConfigs.test.tsx +92 -0
  160. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useReferencedNodeInstanceConfigs.ts +96 -0
  161. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useWorkflowAgent.test.tsx +297 -0
  162. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useWorkflowAgent.ts +135 -65
  163. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/index.tsx +53 -42
  164. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instance-detail.tsx +344 -155
  165. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instances.tsx +79 -58
  166. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/CreateNodeInstanceModal.tsx +123 -144
  167. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/NodeInstanceForm.tsx +169 -98
  168. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/node-instance-form.css +91 -0
  169. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/index.tsx +54 -31
  170. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/node-config.css +854 -0
  171. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaField.tsx +41 -14
  172. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaForm.test.tsx +75 -0
  173. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaForm.tsx +3 -0
  174. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/default-widgets.tsx +20 -2
  175. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/widget-registry.tsx +2 -1
  176. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/show.tsx +61 -66
  177. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRuleEditor.test.tsx +33 -1
  178. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRuleEditor.tsx +47 -15
  179. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/BranchConfigEditors.test.tsx +104 -0
  180. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CallableInputParametersEditor.tsx +22 -52
  181. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CodeConfigEditor.test.tsx +72 -0
  182. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CodeConfigEditor.tsx +78 -70
  183. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CronTriggerConfigEditor.tsx +569 -0
  184. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/DbExecuteConfigEditor.tsx +130 -0
  185. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/DelayConfigEditor.tsx +100 -0
  186. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/EventTriggerConfigEditor.tsx +620 -0
  187. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.test.tsx +22 -45
  188. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.tsx +25 -92
  189. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalWaitConfigEditor.tsx +3 -11
  190. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ForEachConfigEditor.test.tsx +58 -0
  191. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ForEachConfigEditor.tsx +107 -0
  192. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.test.tsx +212 -31
  193. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.tsx +214 -304
  194. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.test.tsx +175 -40
  195. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.tsx +693 -293
  196. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/IfElseConfigEditor.tsx +190 -0
  197. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ManualTriggerConfigEditor.test.tsx +152 -0
  198. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ManualTriggerConfigEditor.tsx +286 -0
  199. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ParallelConfigEditor.tsx +101 -0
  200. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ParameterBindingListEditor.tsx +99 -0
  201. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SimplifiedNodeEditors.test.tsx +495 -0
  202. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubWorkflowConfigEditor.test.tsx +124 -0
  203. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubWorkflowConfigEditor.tsx +222 -0
  204. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubjectPicker.tsx +2 -4
  205. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SwitchConfigEditor.tsx +204 -0
  206. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupCreateModal.tsx +3 -1
  207. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupEditModal.tsx +9 -6
  208. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/callable-workflow.ts +4 -0
  209. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/code-config.css +96 -0
  210. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/event-catalog.api.ts +117 -0
  211. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/http-request-config.css +242 -0
  212. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/human-approval-config.css +194 -0
  213. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/show.tsx +264 -167
  214. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/temporal-tenant/index.tsx +6 -9
  215. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types/parameter-binding.ts +19 -16
  216. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types.ts +28 -4
  217. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/useWorkflowFormValidation.test.tsx +59 -0
  218. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/useWorkflowFormValidation.ts +24 -0
  219. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/forEachConnection.test.ts +311 -0
  220. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/forEachConnection.ts +198 -0
  221. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/mainFlowConnection.test.ts +143 -0
  222. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/mainFlowConnection.ts +19 -0
  223. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/newNodeConfig.ts +103 -5
  224. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/removeWorkflowEdges.test.ts +158 -3
  225. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/removeWorkflowEdges.ts +117 -9
  226. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveEffectiveOutput.test.ts +70 -0
  227. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveEffectiveOutput.ts +48 -0
  228. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveLookupPorts.test.ts +55 -0
  229. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveLookupPorts.ts +95 -22
  230. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.test.ts +148 -1
  231. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.ts +62 -11
  232. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveWorkflowDisplay.test.ts +19 -0
  233. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveWorkflowDisplay.ts +1 -1
  234. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/subWorkflowChange.test.ts +45 -0
  235. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/subWorkflowChange.ts +26 -0
  236. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/validateWorkflowDsl.test.ts +502 -0
  237. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/validateWorkflowDsl.ts +694 -0
  238. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowDateTime.test.ts +27 -0
  239. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowDateTime.ts +33 -0
  240. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowHistory.test.ts +34 -0
  241. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowHistory.ts +52 -0
  242. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowPublishError.test.ts +99 -0
  243. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowPublishError.ts +91 -0
  244. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowSkillPrompt.test.ts +74 -0
  245. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/workflowSkillPrompt.ts +120 -0
  246. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/workflow-ui.css +481 -0
  247. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/index.css +1 -1
  248. package/package.json +1 -1
  249. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/WorkflowEventOutbox.ts +0 -62
  250. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/migrate-human-approval-configs.ts +0 -86
  251. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-event-trigger.ts +0 -60
  252. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflows.ts +0 -698
  253. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.external-decision.spec.ts +0 -183
  254. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/legacy-approval-config-migration.ts +0 -227
  255. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.spec.ts +0 -82
  256. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.ts +0 -111
  257. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.controller.spec.ts +0 -54
  258. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.controller.ts +0 -147
  259. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.module.ts +0 -10
  260. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.service.spec.ts +0 -350
  261. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.service.ts +0 -110
  262. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.ts +0 -1
  263. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/InstanceRequiredDialog.tsx +0 -106
  264. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.test.tsx +0 -45
  265. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.tsx +0 -43
  266. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeTypeBadge.tsx +0 -36
  267. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useNodeInstanceLibrary.ts +0 -41
  268. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.test.tsx +0 -47
  269. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.tsx +0 -182
  270. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.test.tsx +0 -34
  271. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.tsx +0 -16
  272. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.test.ts +0 -25
  273. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.ts +0 -42
  274. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.test.ts +0 -208
  275. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.ts +0 -246
  276. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/create.tsx +0 -111
  277. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/edit.tsx +0 -127
  278. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/index.tsx +0 -4
  279. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/list.tsx +0 -282
  280. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/show.tsx +0 -74
@@ -1,7 +1,5 @@
1
1
  import React, { useEffect, useRef, useState } from 'react';
2
- import Editor from '@monaco-editor/react';
3
2
  import {
4
- Alert,
5
3
  Button,
6
4
  Card,
7
5
  Form,
@@ -10,13 +8,11 @@ import {
10
8
  Modal,
11
9
  Select,
12
10
  Space,
13
- Switch,
14
11
  Typography,
15
12
  message,
16
13
  } from 'antd';
17
14
  import {
18
15
  AlignLeftOutlined,
19
- ApiOutlined,
20
16
  DeleteOutlined,
21
17
  ExpandOutlined,
22
18
  PlusOutlined,
@@ -24,13 +20,12 @@ import {
24
20
  import { customRequest } from 'helpers/http';
25
21
  import { useTranslation } from 'react-i18next';
26
22
  import { ConnectionModal } from '../../connections/ConnectionModal';
27
- import {
28
- ParameterBindingEditor,
29
- type SystemDataOption,
30
- } from '../../components/ParameterBindingEditor';
23
+ import { ParameterBindingEditor } from '../../components/ParameterBindingEditor';
24
+ import { WorkflowCodeEditor } from '../../components/WorkflowCodeEditor';
31
25
  import type { IntegrationConnection } from '../../connections/connection.types';
32
26
  import type { ParameterBinding } from '../../types/parameter-binding';
33
27
  import type { WidgetProps } from '../schema-form/widget-registry';
28
+ import './http-request-config.css';
34
29
 
35
30
  type HttpRequestConfig = {
36
31
  connectionRef?: string;
@@ -41,17 +36,13 @@ type HttpRequestConfig = {
41
36
  bodyMode?: 'FIELDS' | 'JSON';
42
37
  bodyBindings?: Record<string, ParameterBinding>;
43
38
  body?: unknown;
44
- timeoutSeconds?: number;
45
- retryOnFail?: boolean;
46
- maxRetries?: number;
47
- retryInterval?: number;
39
+ timeoutSeconds?: number | null;
48
40
  };
49
41
 
50
42
  const HTTP_REQUEST_DEFAULTS: HttpRequestConfig = {
51
43
  method: 'GET',
52
44
  path: '/',
53
45
  timeoutSeconds: 30,
54
- retryOnFail: false,
55
46
  queryBindings: {},
56
47
  headerBindings: {},
57
48
  bodyMode: 'FIELDS',
@@ -63,6 +54,7 @@ export function HttpRequestConfigEditor({
63
54
  onChange,
64
55
  disabled,
65
56
  schema,
57
+ uiOptions,
66
58
  }: WidgetProps<HttpRequestConfig | undefined>) {
67
59
  const { t } = useTranslation('workflow');
68
60
  const config: HttpRequestConfig = {
@@ -72,37 +64,33 @@ export function HttpRequestConfigEditor({
72
64
  delete (config as Record<string, unknown>).inputParameters;
73
65
  delete (config as Record<string, unknown>).query;
74
66
  delete (config as Record<string, unknown>).headers;
67
+ delete (config as Record<string, unknown>).retryOnFail;
68
+ delete (config as Record<string, unknown>).maxRetries;
69
+ delete (config as Record<string, unknown>).retryInterval;
75
70
  if (value && value.bodyMode === undefined) delete config.body;
76
71
  const requiredFields = new Set(schema.required ?? []);
77
72
  const [connections, setConnections] = useState<IntegrationConnection[]>([]);
78
73
  const [loadingConnections, setLoadingConnections] = useState(false);
79
74
  const [creatingConnection, setCreatingConnection] = useState(false);
80
- const systemOptions: SystemDataOption[] = [
81
- { value: 'callback.token', label: t('systemData.callbackToken') },
82
- {
83
- value: 'approval.requestId',
84
- label: t('systemData.approvalRequestId'),
85
- },
86
- {
87
- value: 'approval.candidates',
88
- label: t('systemData.approvalCandidates'),
89
- },
90
- {
91
- value: 'approval.expiresAt',
92
- label: t('systemData.approvalExpiresAt'),
93
- },
94
- { value: 'invocation.id', label: t('systemData.invocationId') },
95
- {
96
- value: 'caller.workflowInstanceId',
97
- label: t('systemData.callerWorkflowInstanceId'),
98
- },
99
- ];
100
-
75
+ const requestDataDescription =
76
+ typeof uiOptions?.requestDataDescriptionKey === 'string'
77
+ ? t(uiOptions.requestDataDescriptionKey)
78
+ : t('httpRequest.requestDataDescription');
79
+ const embedded = uiOptions?.embedded === true;
80
+ const bindingSources = Array.isArray(uiOptions?.bindingSources)
81
+ ? (uiOptions.bindingSources as Array<ParameterBinding['source']>)
82
+ : undefined;
83
+ const variableContext =
84
+ uiOptions?.variableContext === 'approvalExternal'
85
+ ? 'approvalExternal'
86
+ : undefined;
101
87
  useEffect(() => {
102
- const hasMissingDefault = Object.keys(HTTP_REQUEST_DEFAULTS).some(
103
- (key) => value?.[key as keyof HttpRequestConfig] === undefined,
104
- );
105
- if (hasMissingDefault) onChange(config);
88
+ const hasRemovedOption =
89
+ value !== undefined &&
90
+ ['retryOnFail', 'maxRetries', 'retryInterval'].some(
91
+ (key) => key in value,
92
+ );
93
+ if (hasRemovedOption) onChange(config);
106
94
  }, [onChange, value]);
107
95
 
108
96
  useEffect(() => {
@@ -120,16 +108,13 @@ export function HttpRequestConfigEditor({
120
108
  }
121
109
 
122
110
  return (
123
- <Space direction="vertical" size={12} style={{ width: '100%' }}>
124
- <Card
125
- size="small"
126
- title={
127
- <Space>
128
- <ApiOutlined />
129
- <span>{t('httpRequest.connectionOperation')}</span>
130
- </Space>
131
- }
132
- >
111
+ <Space
112
+ className={`http-request-config${embedded ? ' http-request-config--embedded' : ''}`}
113
+ direction="vertical"
114
+ size={12}
115
+ style={{ width: '100%' }}
116
+ >
117
+ <Card size="small" title={t('httpRequest.connectionOperation')}>
133
118
  <Typography.Paragraph type="secondary">
134
119
  {t('httpRequest.connectionDescription')}
135
120
  </Typography.Paragraph>
@@ -162,6 +147,7 @@ export function HttpRequestConfigEditor({
162
147
  />
163
148
  </Form.Item>
164
149
  <Button
150
+ className="workflow-panel-action"
165
151
  icon={<PlusOutlined />}
166
152
  disabled={disabled}
167
153
  onClick={() => setCreatingConnection(true)}
@@ -199,64 +185,73 @@ export function HttpRequestConfigEditor({
199
185
  <Input
200
186
  value={config.path}
201
187
  disabled={disabled}
202
- placeholder="/departments/{{input.departmentId}}/approvers"
188
+ placeholder="/departments/123/approvers"
203
189
  onChange={(event) => update({ path: event.target.value })}
204
190
  />
205
191
  </Form.Item>
206
192
  </div>
207
- <Alert
208
- type="info"
209
- showIcon
210
- message={
211
- <Space size={4} wrap>
212
- <span>{t('httpRequest.pathTemplateHint')}</span>
213
- <Typography.Text code>{'{{input.wecomId}}'}</Typography.Text>
214
- <span>{t('httpRequest.templateOr')}</span>
215
- <Typography.Text code>{'{{workflow.wecomId}}'}</Typography.Text>
216
- </Space>
217
- }
218
- style={{ marginTop: 14 }}
219
- />
220
193
  </Card>
221
194
 
222
- <Card size="small" title={t('httpRequest.requestData')}>
223
- <Typography.Paragraph type="secondary">
224
- {t('httpRequest.requestDataDescription')}
225
- </Typography.Paragraph>
226
- <Space direction="vertical" size={18} style={{ width: '100%' }}>
227
- <BindingMapEditor
228
- label={t('httpRequest.queryParameters')}
229
- addLabel={t('httpRequest.addQueryParameter')}
230
- keyPlaceholder="departmentId"
231
- value={config.queryBindings ?? {}}
232
- systemOptions={systemOptions}
233
- disabled={disabled}
234
- onChange={(queryBindings) => update({ queryBindings })}
235
- />
236
- <BindingMapEditor
237
- label={t('httpRequest.headers')}
238
- addLabel={t('httpRequest.addHeader')}
239
- keyPlaceholder="X-Request-Source"
240
- value={config.headerBindings ?? {}}
241
- systemOptions={systemOptions}
242
- disabled={disabled}
243
- onChange={(headerBindings) => update({ headerBindings })}
244
- />
245
- <div>
246
- <div
247
- style={{
248
- display: 'flex',
249
- alignItems: 'center',
250
- justifyContent: 'space-between',
251
- marginBottom: 8,
252
- }}
253
- >
254
- <Typography.Text strong>
255
- {t('httpRequest.requestBody')}
256
- </Typography.Text>
195
+ <Card
196
+ size="small"
197
+ title={t('httpRequest.requestData')}
198
+ className="http-request-data"
199
+ >
200
+ <div className="http-request-data__intro">
201
+ <Typography.Text type="secondary">
202
+ {requestDataDescription}
203
+ </Typography.Text>
204
+ {variableContext && (
205
+ <div className="http-request-data__variables">
206
+ {(['input', 'workflow', 'approval'] as const).map((name) => (
207
+ <div className="http-request-data__variable" key={name}>
208
+ <code>{name}</code>
209
+ <Typography.Text type="secondary">
210
+ {t(`httpRequest.context.${variableContext}.${name}`)}
211
+ </Typography.Text>
212
+ </div>
213
+ ))}
214
+ </div>
215
+ )}
216
+ </div>
217
+ <div className="http-request-data__sections">
218
+ <RequestDataSection
219
+ title={t('httpRequest.queryParameters')}
220
+ count={Object.keys(config.queryBindings ?? {}).length}
221
+ >
222
+ <BindingMapEditor
223
+ addLabel={t('httpRequest.addQueryParameter')}
224
+ keyPlaceholder="departmentId"
225
+ value={config.queryBindings ?? {}}
226
+ sources={bindingSources}
227
+ disabled={disabled}
228
+ onChange={(queryBindings) => update({ queryBindings })}
229
+ />
230
+ </RequestDataSection>
231
+ <RequestDataSection
232
+ title={t('httpRequest.headers')}
233
+ count={Object.keys(config.headerBindings ?? {}).length}
234
+ >
235
+ <BindingMapEditor
236
+ addLabel={t('httpRequest.addHeader')}
237
+ keyPlaceholder="X-Request-Source"
238
+ value={config.headerBindings ?? {}}
239
+ sources={bindingSources}
240
+ disabled={disabled}
241
+ onChange={(headerBindings) => update({ headerBindings })}
242
+ />
243
+ </RequestDataSection>
244
+ <RequestDataSection
245
+ title={t('httpRequest.requestBody')}
246
+ meta={
247
+ config.bodyMode === 'JSON'
248
+ ? t('httpRequest.jsonMode')
249
+ : t('httpRequest.fieldsMode')
250
+ }
251
+ action={
257
252
  <Button
258
- type="link"
259
253
  size="small"
254
+ className="workflow-panel-action"
260
255
  disabled={disabled}
261
256
  onClick={() =>
262
257
  update({
@@ -268,99 +263,37 @@ export function HttpRequestConfigEditor({
268
263
  ? t('httpRequest.useFields')
269
264
  : t('httpRequest.advancedJson')}
270
265
  </Button>
271
- </div>
266
+ }
267
+ >
272
268
  {config.bodyMode === 'JSON' ? (
273
- <>
274
- <Typography.Paragraph type="secondary">
275
- {t('httpRequest.advancedJsonHint')}{' '}
276
- <Typography.Text code>{'{{input.field}}'}</Typography.Text>{' '}
277
- {t('httpRequest.templateOr')}{' '}
278
- <Typography.Text code>{'{{workflow.field}}'}</Typography.Text>{' '}
279
- {t('httpRequest.templateOr')}{' '}
280
- <Typography.Text code>
281
- {'{{system.callback.token}}'}
282
- </Typography.Text>
283
- </Typography.Paragraph>
284
- <JsonEditor
285
- label={t('httpRequest.bodyJson')}
286
- value={config.body ?? {}}
287
- disabled={disabled}
288
- onChange={(body) => update({ body })}
289
- />
290
- </>
269
+ <JsonEditor
270
+ label={t('httpRequest.bodyJson')}
271
+ value={config.body ?? {}}
272
+ disabled={disabled}
273
+ onChange={(body) => update({ body })}
274
+ />
291
275
  ) : (
292
276
  <BindingMapEditor
293
277
  addLabel={t('httpRequest.addBodyField')}
294
278
  keyPlaceholder="ticketId"
295
279
  value={config.bodyBindings ?? {}}
296
- systemOptions={systemOptions}
280
+ sources={bindingSources}
297
281
  disabled={disabled}
298
282
  onChange={(bodyBindings) => update({ bodyBindings })}
299
283
  />
300
284
  )}
301
- </div>
302
- </Space>
285
+ </RequestDataSection>
286
+ </div>
303
287
  </Card>
304
288
 
305
- <Card size="small" title={t('httpRequest.responseOut')}>
306
- <Alert
307
- type="info"
308
- showIcon
309
- message={t('httpRequest.responseReturned')}
310
- description={t('httpRequest.responseDescription')}
289
+ <div className="http-request-config__timeout">
290
+ <Typography.Text>{t('httpRequest.timeoutSeconds')}</Typography.Text>
291
+ <InputNumber
292
+ value={config.timeoutSeconds}
293
+ disabled={disabled}
294
+ onChange={(timeoutSeconds) => update({ timeoutSeconds })}
311
295
  />
312
- </Card>
313
-
314
- <Card size="small" title={t('httpRequest.timeoutRetry')}>
315
- <div
316
- style={{
317
- display: 'grid',
318
- gridTemplateColumns: '1fr 1fr 1fr',
319
- gap: 16,
320
- }}
321
- >
322
- <div>
323
- <Typography.Text>{t('httpRequest.timeoutSeconds')}</Typography.Text>
324
- <InputNumber
325
- min={1}
326
- max={300}
327
- value={config.timeoutSeconds}
328
- disabled={disabled}
329
- onChange={(timeoutSeconds) =>
330
- update({ timeoutSeconds: timeoutSeconds ?? 30 })
331
- }
332
- style={{ width: '100%', marginTop: 6 }}
333
- />
334
- </div>
335
- <div>
336
- <Typography.Text>{t('httpRequest.retryOnFailure')}</Typography.Text>
337
- <div style={{ marginTop: 9 }}>
338
- <Switch
339
- checked={config.retryOnFail}
340
- disabled={disabled}
341
- onChange={(retryOnFail) => update({ retryOnFail })}
342
- />
343
- </div>
344
- </div>
345
- {config.retryOnFail && (
346
- <div>
347
- <Typography.Text>
348
- {t('httpRequest.extraAttempts')}
349
- </Typography.Text>
350
- <InputNumber
351
- min={0}
352
- max={10}
353
- value={config.maxRetries ?? 2}
354
- disabled={disabled}
355
- onChange={(maxRetries) =>
356
- update({ maxRetries: maxRetries ?? 0 })
357
- }
358
- style={{ width: '100%', marginTop: 6 }}
359
- />
360
- </div>
361
- )}
362
- </div>
363
- </Card>
296
+ </div>
364
297
 
365
298
  <ConnectionModal
366
299
  open={creatingConnection}
@@ -375,12 +308,42 @@ export function HttpRequestConfigEditor({
375
308
  );
376
309
  }
377
310
 
311
+ function RequestDataSection({
312
+ title,
313
+ count,
314
+ meta,
315
+ action,
316
+ children,
317
+ }: {
318
+ title: string;
319
+ count?: number;
320
+ meta?: string;
321
+ action?: React.ReactNode;
322
+ children: React.ReactNode;
323
+ }) {
324
+ const { t } = useTranslation('workflow');
325
+ return (
326
+ <section className="http-request-data__section">
327
+ <div className="http-request-data__section-head">
328
+ <div className="http-request-data__section-title">
329
+ <Typography.Text strong>{title}</Typography.Text>
330
+ <span className="http-request-data__section-meta">
331
+ {meta ?? t('httpRequest.fieldCount', { count: count ?? 0 })}
332
+ </span>
333
+ </div>
334
+ {action}
335
+ </div>
336
+ <div className="http-request-data__section-body">{children}</div>
337
+ </section>
338
+ );
339
+ }
340
+
378
341
  function BindingMapEditor({
379
342
  label,
380
343
  addLabel,
381
344
  keyPlaceholder,
382
345
  value,
383
- systemOptions,
346
+ sources,
384
347
  disabled,
385
348
  onChange,
386
349
  }: {
@@ -388,7 +351,7 @@ function BindingMapEditor({
388
351
  addLabel: string;
389
352
  keyPlaceholder: string;
390
353
  value: Record<string, ParameterBinding>;
391
- systemOptions: SystemDataOption[];
354
+ sources?: Array<ParameterBinding['source']>;
392
355
  disabled?: boolean;
393
356
  onChange(value: Record<string, ParameterBinding>): void;
394
357
  }) {
@@ -400,28 +363,32 @@ function BindingMapEditor({
400
363
  nextKey: string,
401
364
  nextValue: ParameterBinding,
402
365
  ) {
366
+ const normalizedKey = nextKey.trim();
367
+ if (
368
+ normalizedKey &&
369
+ entries.some(
370
+ ([entryKey], current) =>
371
+ current !== index && entryKey === normalizedKey,
372
+ )
373
+ )
374
+ return;
403
375
  const nextEntries = [...entries];
404
- nextEntries[index] = [nextKey, nextValue];
376
+ nextEntries[index] = [
377
+ normalizedKey || nextBlankEntryKey(entries, index),
378
+ nextValue,
379
+ ];
405
380
  onChange(Object.fromEntries(nextEntries));
406
381
  }
407
382
 
408
383
  return (
409
- <div>
384
+ <div className="http-request-binding-map">
410
385
  {label && (
411
386
  <Typography.Text strong style={{ display: 'block', marginBottom: 8 }}>
412
387
  {label}
413
388
  </Typography.Text>
414
389
  )}
415
390
  {entries.length > 0 && (
416
- <div
417
- style={{
418
- display: 'grid',
419
- gridTemplateColumns:
420
- 'minmax(140px, 0.65fr) minmax(280px, 1.6fr) 32px',
421
- gap: 8,
422
- marginBottom: 6,
423
- }}
424
- >
391
+ <div className="http-request-binding-map__head">
425
392
  <Typography.Text type="secondary">
426
393
  {t('httpRequest.fieldName')}
427
394
  </Typography.Text>
@@ -433,34 +400,21 @@ function BindingMapEditor({
433
400
  )}
434
401
  <Space direction="vertical" size={8} style={{ width: '100%' }}>
435
402
  {entries.map(([entryKey, entryValue], index) => (
436
- <div
437
- key={index}
438
- style={{
439
- display: 'grid',
440
- gridTemplateColumns:
441
- 'minmax(140px, 0.65fr) minmax(280px, 1.6fr) 32px',
442
- gap: 8,
443
- alignItems: 'start',
444
- }}
445
- >
403
+ <div className="http-request-binding-map__row" key={index}>
446
404
  <Input
447
- value={entryKey}
405
+ value={entryKey.trim()}
448
406
  disabled={disabled}
449
407
  placeholder={keyPlaceholder}
450
408
  onChange={(event) => {
451
409
  const nextKey = event.target.value;
452
- const nextValue =
453
- entryValue.source !== 'FIXED' && entryValue.path === entryKey
454
- ? { ...entryValue, path: nextKey }
455
- : entryValue;
456
- replaceEntry(index, nextKey, nextValue);
410
+ replaceEntry(index, nextKey, entryValue);
457
411
  }}
458
412
  />
459
413
  <ParameterBindingEditor
460
- name={entryKey || t('httpRequest.addField')}
461
- defaultPath={entryKey}
414
+ name={entryKey.trim() || t('httpRequest.addField')}
415
+ defaultPath={entryKey.trim()}
462
416
  value={entryValue}
463
- systemOptions={systemOptions}
417
+ sources={sources}
464
418
  disabled={disabled}
465
419
  onChange={(binding) => replaceEntry(index, entryKey, binding)}
466
420
  />
@@ -470,7 +424,7 @@ function BindingMapEditor({
470
424
  icon={<DeleteOutlined />}
471
425
  disabled={disabled}
472
426
  aria-label={t('httpRequest.deleteField', {
473
- name: entryKey || t('httpRequest.addField'),
427
+ name: entryKey.trim() || t('httpRequest.addField'),
474
428
  })}
475
429
  onClick={() =>
476
430
  onChange(
@@ -485,6 +439,7 @@ function BindingMapEditor({
485
439
  <Button
486
440
  type="dashed"
487
441
  block
442
+ className="workflow-panel-action"
488
443
  icon={<PlusOutlined />}
489
444
  disabled={disabled}
490
445
  onClick={() => {
@@ -513,6 +468,21 @@ function nextEntryKey(
513
468
  return `${base}_${index}`;
514
469
  }
515
470
 
471
+ function nextBlankEntryKey(
472
+ entries: Array<[string, ParameterBinding]>,
473
+ currentIndex: number,
474
+ ) {
475
+ let key = ' ';
476
+ while (
477
+ entries.some(
478
+ ([entryKey], index) => index !== currentIndex && entryKey === key,
479
+ )
480
+ ) {
481
+ key += ' ';
482
+ }
483
+ return key;
484
+ }
485
+
516
486
  function JsonEditor({
517
487
  label,
518
488
  value,
@@ -527,7 +497,6 @@ function JsonEditor({
527
497
  const { t } = useTranslation('workflow');
528
498
  const serializedValue = JSON.stringify(value ?? {}, null, 2);
529
499
  const [text, setText] = useState(() => serializedValue);
530
- const [error, setError] = useState<JsonError>();
531
500
  const [expanded, setExpanded] = useState(false);
532
501
  const lastEmittedValue = useRef<string>();
533
502
 
@@ -537,56 +506,37 @@ function JsonEditor({
537
506
  return;
538
507
  }
539
508
  setText(serializedValue);
540
- setError(undefined);
541
509
  }, [serializedValue]);
542
510
 
543
511
  function changeText(next: string) {
544
512
  setText(next);
545
513
  const result = parseJson(next);
546
514
  if (result.ok) {
547
- setError(undefined);
548
515
  lastEmittedValue.current = JSON.stringify(result.value, null, 2);
549
516
  onChange(result.value);
550
517
  } else {
551
- setError(result.error);
518
+ lastEmittedValue.current = JSON.stringify(next, null, 2);
519
+ onChange(next);
552
520
  }
553
521
  }
554
522
 
555
523
  function format() {
556
524
  const result = parseJson(text);
557
- if (!result.ok) {
558
- setError(result.error);
559
- return;
560
- }
525
+ if (!result.ok) return;
561
526
  const formatted = JSON.stringify(result.value, null, 2);
562
527
  setText(formatted);
563
- setError(undefined);
564
528
  lastEmittedValue.current = formatted;
565
529
  onChange(result.value);
566
530
  }
567
531
 
568
532
  const editor = (height: string) => (
569
- <Editor
533
+ <WorkflowCodeEditor
570
534
  height={height}
571
535
  language="json"
572
536
  value={text}
573
- onChange={(next) => changeText(next ?? '')}
574
- options={{
575
- readOnly: disabled,
576
- minimap: { enabled: false },
577
- fontSize: 13,
578
- lineNumbers: 'on',
579
- lineNumbersMinChars: 3,
580
- scrollBeyondLastLine: false,
581
- automaticLayout: true,
582
- tabSize: 2,
583
- wordWrap: 'on',
584
- folding: true,
585
- formatOnPaste: true,
586
- bracketPairColorization: { enabled: true },
587
- guides: { bracketPairs: true },
588
- padding: { top: 10, bottom: 10 },
589
- }}
537
+ onChange={changeText}
538
+ readOnly={disabled}
539
+ ariaLabel={label}
590
540
  />
591
541
  );
592
542
 
@@ -605,14 +555,16 @@ function JsonEditor({
605
555
  <Space size={4}>
606
556
  <Button
607
557
  size="small"
558
+ className="workflow-panel-action"
608
559
  icon={<AlignLeftOutlined />}
609
- disabled={disabled || Boolean(error)}
560
+ disabled={disabled}
610
561
  onClick={format}
611
562
  >
612
563
  {t('httpRequest.formatJson')}
613
564
  </Button>
614
565
  <Button
615
566
  size="small"
567
+ className="workflow-panel-action"
616
568
  icon={<ExpandOutlined />}
617
569
  onClick={() => setExpanded(true)}
618
570
  >
@@ -620,86 +572,44 @@ function JsonEditor({
620
572
  </Button>
621
573
  </Space>
622
574
  </div>
623
- <div
624
- style={{
625
- height: 300,
626
- overflow: 'hidden',
627
- border: `1px solid ${error ? '#ff4d4f' : '#d9d9d9'}`,
628
- borderRadius: 6,
629
- }}
630
- >
631
- {editor('300px')}
632
- </div>
633
- {error && (
634
- <Typography.Text
635
- type="danger"
636
- style={{ display: 'block', marginTop: 6 }}
637
- >
638
- {t('httpRequest.invalidJsonLocation', error)}
639
- </Typography.Text>
640
- )}
575
+ {editor('300px')}
641
576
  <Modal
642
577
  open={expanded}
643
578
  title={label}
644
- width="calc(100vw - 96px)"
579
+ width="min(1280px, calc(100vw - 48px))"
580
+ centered
581
+ zIndex={11000}
582
+ className="workflow-json-editor-modal"
645
583
  footer={null}
646
584
  destroyOnHidden
647
585
  onCancel={() => setExpanded(false)}
648
586
  styles={{ body: { padding: 0 } }}
649
587
  >
650
- <div style={{ marginBottom: 8, textAlign: 'right' }}>
651
- <Button
652
- size="small"
653
- icon={<AlignLeftOutlined />}
654
- disabled={disabled || Boolean(error)}
655
- onClick={format}
656
- >
657
- {t('httpRequest.formatJson')}
658
- </Button>
659
- </div>
660
- <div
661
- style={{
662
- height: 'calc(100vh - 190px)',
663
- overflow: 'hidden',
664
- border: `1px solid ${error ? '#ff4d4f' : '#d9d9d9'}`,
665
- borderRadius: 6,
666
- }}
667
- >
668
- {editor('calc(100vh - 190px)')}
588
+ <div className="workflow-json-editor-modal__body">
589
+ <div className="workflow-json-editor-modal__toolbar">
590
+ <Button
591
+ size="small"
592
+ className="workflow-panel-action"
593
+ icon={<AlignLeftOutlined />}
594
+ disabled={disabled}
595
+ onClick={format}
596
+ >
597
+ {t('httpRequest.formatJson')}
598
+ </Button>
599
+ </div>
600
+ <div className="workflow-json-editor-modal__editor">
601
+ {editor('100%')}
602
+ </div>
669
603
  </div>
670
- {error && (
671
- <Typography.Text
672
- type="danger"
673
- style={{ display: 'block', marginTop: 6 }}
674
- >
675
- {t('httpRequest.invalidJsonLocation', error)}
676
- </Typography.Text>
677
- )}
678
604
  </Modal>
679
605
  </div>
680
606
  );
681
607
  }
682
608
 
683
- type JsonError = { line: number; column: number };
684
-
685
- function parseJson(
686
- text: string,
687
- ): { ok: true; value: unknown } | { ok: false; error: JsonError } {
609
+ function parseJson(text: string): { ok: true; value: unknown } | { ok: false } {
688
610
  try {
689
611
  return { ok: true, value: JSON.parse(text || '{}') };
690
- } catch (error) {
691
- const message = error instanceof Error ? error.message : '';
692
- const position = Number(
693
- message.match(/position\s+(\d+)/i)?.[1] ?? text.length,
694
- );
695
- const beforeError = text.slice(0, Math.max(0, position));
696
- const lines = beforeError.split('\n');
697
- return {
698
- ok: false,
699
- error: {
700
- line: lines.length,
701
- column: (lines.at(-1)?.length ?? 0) + 1,
702
- },
703
- };
612
+ } catch {
613
+ return { ok: false };
704
614
  }
705
615
  }