@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
@@ -4,7 +4,6 @@ import {
4
4
  Button,
5
5
  Card,
6
6
  Input,
7
- InputNumber,
8
7
  Radio,
9
8
  Space,
10
9
  Tag,
@@ -21,10 +20,10 @@ type ExternalRequestConfig = {
21
20
  method?: string;
22
21
  secret?: string;
23
22
  verificationMode?: 'HMAC' | 'NONE';
24
- responseMode?: 'IMMEDIATE' | 'WAIT_FOR_RESULT';
25
- responseTimeoutSeconds?: number;
26
23
  };
27
24
 
25
+ const WEBHOOK_PATH_PATTERN = /^[A-Za-z0-9](?:[A-Za-z0-9_-]*[A-Za-z0-9])?$/;
26
+
28
27
  export function ExternalRequestConfigEditor({
29
28
  value,
30
29
  onChange,
@@ -33,14 +32,12 @@ export function ExternalRequestConfigEditor({
33
32
  const { t } = useTranslation('workflow');
34
33
  const config = value ?? {};
35
34
  const verificationMode = config.verificationMode === 'NONE' ? 'NONE' : 'HMAC';
36
- const responseMode =
37
- config.responseMode === 'WAIT_FOR_RESULT' ? 'WAIT_FOR_RESULT' : 'IMMEDIATE';
38
35
  const [endpoint, setEndpoint] = useState('');
39
36
  const [endpointLoadFailed, setEndpointLoadFailed] = useState(false);
40
37
 
41
38
  useEffect(() => {
42
39
  const path = config.path?.trim();
43
- if (!path) {
40
+ if (!path || !WEBHOOK_PATH_PATTERN.test(path)) {
44
41
  setEndpoint('');
45
42
  setEndpointLoadFailed(false);
46
43
  return;
@@ -71,15 +68,29 @@ export function ExternalRequestConfigEditor({
71
68
 
72
69
  return (
73
70
  <Space direction="vertical" size={12} style={{ width: '100%' }}>
74
- <Alert
75
- type="info"
76
- showIcon
77
- message={t('externalRequest.description')}
78
- description={t('externalRequest.workflowData')}
79
- />
80
-
81
71
  <Card size="small" title={t('externalRequest.endpoint')}>
82
72
  <Space direction="vertical" size={10} style={{ width: '100%' }}>
73
+ <div>
74
+ <Typography.Text className="workflow-node-config__field-label">
75
+ {t('externalRequest.path')}
76
+ </Typography.Text>
77
+ <Input
78
+ aria-label={t('externalRequest.path')}
79
+ value={config.path ?? ''}
80
+ disabled={disabled}
81
+ placeholder={t('externalRequest.pathPlaceholder')}
82
+ onChange={(event) =>
83
+ onChange({
84
+ ...config,
85
+ method: 'POST',
86
+ path: event.target.value,
87
+ })
88
+ }
89
+ />
90
+ <Typography.Text type="secondary">
91
+ {t('externalRequest.pathHint')}
92
+ </Typography.Text>
93
+ </div>
83
94
  <Tag color="blue">POST</Tag>
84
95
  <Input
85
96
  value={endpoint}
@@ -106,78 +117,6 @@ export function ExternalRequestConfigEditor({
106
117
  </Space>
107
118
  </Card>
108
119
 
109
- <Card size="small" title={t('externalRequest.response')}>
110
- <Radio.Group
111
- value={responseMode}
112
- disabled={disabled}
113
- onChange={(event) => {
114
- const nextMode = event.target.value as
115
- | 'IMMEDIATE'
116
- | 'WAIT_FOR_RESULT';
117
- onChange({
118
- ...config,
119
- method: 'POST',
120
- responseMode: nextMode,
121
- ...(nextMode === 'WAIT_FOR_RESULT' && {
122
- responseTimeoutSeconds:
123
- config.responseTimeoutSeconds &&
124
- config.responseTimeoutSeconds >= 1 &&
125
- config.responseTimeoutSeconds <= 300
126
- ? config.responseTimeoutSeconds
127
- : 60,
128
- }),
129
- });
130
- }}
131
- >
132
- <Space direction="vertical" size={12}>
133
- <Radio value="IMMEDIATE">
134
- <Space direction="vertical" size={0}>
135
- <Typography.Text>
136
- {t('externalRequest.respondImmediately')}
137
- </Typography.Text>
138
- <Typography.Text type="secondary">
139
- {t('externalRequest.respondImmediatelyHint')}
140
- </Typography.Text>
141
- </Space>
142
- </Radio>
143
- <Radio value="WAIT_FOR_RESULT">
144
- <Space direction="vertical" size={0}>
145
- <Typography.Text>
146
- {t('externalRequest.waitForResult')}
147
- </Typography.Text>
148
- <Typography.Text type="secondary">
149
- {t('externalRequest.waitForResultHint')}
150
- </Typography.Text>
151
- </Space>
152
- </Radio>
153
- </Space>
154
- </Radio.Group>
155
- {responseMode === 'WAIT_FOR_RESULT' && (
156
- <div style={{ marginTop: 16 }}>
157
- <Typography.Text>
158
- {t('externalRequest.responseTimeout')}
159
- </Typography.Text>
160
- <InputNumber
161
- min={1}
162
- max={300}
163
- precision={0}
164
- value={config.responseTimeoutSeconds ?? 60}
165
- disabled={disabled}
166
- addonAfter={t('externalRequest.seconds')}
167
- onChange={(next) =>
168
- onChange({
169
- ...config,
170
- method: 'POST',
171
- responseMode: 'WAIT_FOR_RESULT',
172
- responseTimeoutSeconds: next ?? 60,
173
- })
174
- }
175
- style={{ display: 'block', marginTop: 6, width: '100%' }}
176
- />
177
- </div>
178
- )}
179
- </Card>
180
-
181
120
  <Card size="small" title={t('externalRequest.verification')}>
182
121
  <Radio.Group
183
122
  value={verificationMode}
@@ -253,13 +192,7 @@ export function ExternalRequestConfigEditor({
253
192
  <Typography.Text code>X-Workflow-Signature</Typography.Text>
254
193
  </Typography.Paragraph>
255
194
  </Card>
256
- ) : (
257
- <Alert
258
- type="warning"
259
- showIcon
260
- message={t('externalRequest.directWarning')}
261
- />
262
- )}
195
+ ) : null}
263
196
  </Space>
264
197
  );
265
198
  }
@@ -1,4 +1,4 @@
1
- import { Alert, Card, InputNumber, Radio, Space, Typography } from 'antd';
1
+ import { Card, InputNumber, Radio, Space, Typography } from 'antd';
2
2
  import { useTranslation } from 'react-i18next';
3
3
  import { ParameterBindingEditor } from '../../components/ParameterBindingEditor';
4
4
  import type { ParameterBinding } from '../../types/parameter-binding';
@@ -6,7 +6,7 @@ import type { WidgetProps } from '../schema-form/widget-registry';
6
6
 
7
7
  type TimeoutConfig =
8
8
  | { mode: 'DEADLINE'; deadlineBinding: ParameterBinding }
9
- | { mode: 'DURATION'; durationSeconds: number }
9
+ | { mode: 'DURATION'; durationSeconds: number | null }
10
10
  | { mode: 'NONE' };
11
11
 
12
12
  type ExternalWaitConfig = {
@@ -47,13 +47,6 @@ export function ExternalWaitConfigEditor({
47
47
 
48
48
  return (
49
49
  <Space direction="vertical" size={12} style={{ width: '100%' }}>
50
- <Alert
51
- type="info"
52
- showIcon
53
- message={t('externalWait.description')}
54
- description={t('externalWait.hint')}
55
- />
56
-
57
50
  <Card size="small" title={t('externalWait.callbackToken')}>
58
51
  <ParameterBindingEditor
59
52
  name={t('externalWait.callbackToken')}
@@ -99,7 +92,6 @@ export function ExternalWaitConfigEditor({
99
92
  {timeout.mode === 'DURATION' && (
100
93
  <div style={{ marginTop: 12 }}>
101
94
  <InputNumber
102
- min={1}
103
95
  precision={0}
104
96
  value={timeout.durationSeconds}
105
97
  disabled={disabled}
@@ -108,7 +100,7 @@ export function ExternalWaitConfigEditor({
108
100
  update({
109
101
  timeout: {
110
102
  mode: 'DURATION',
111
- durationSeconds: durationSeconds ?? 86400,
103
+ durationSeconds,
112
104
  },
113
105
  })
114
106
  }
@@ -0,0 +1,58 @@
1
+ import { fireEvent, render, screen } from '@testing-library/react';
2
+ import { useState } from 'react';
3
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
4
+ import i18n from '../../../../i18n';
5
+ import { ForEachConfigEditor } from './ForEachConfigEditor';
6
+
7
+ Object.defineProperty(window, 'matchMedia', {
8
+ writable: true,
9
+ value: () => ({
10
+ matches: false,
11
+ addListener: () => undefined,
12
+ removeListener: () => undefined,
13
+ addEventListener: () => undefined,
14
+ removeEventListener: () => undefined,
15
+ dispatchEvent: () => false,
16
+ }),
17
+ });
18
+
19
+ describe('ForEachConfigEditor', () => {
20
+ beforeEach(async () => {
21
+ await i18n.changeLanguage('zh_CN');
22
+ });
23
+
24
+ it('configures loop execution without a separate Workflow mode', () => {
25
+ const onChange = vi.fn();
26
+ function Harness() {
27
+ const [value, setValue] = useState<
28
+ NonNullable<Parameters<typeof ForEachConfigEditor>[0]['value']>
29
+ >({
30
+ itemsBinding: { source: 'INPUT', path: 'rows' },
31
+ execution: { mode: 'SEQUENTIAL' },
32
+ errorPolicy: 'STOP',
33
+ });
34
+ return (
35
+ <ForEachConfigEditor
36
+ value={value}
37
+ onChange={(next) => {
38
+ if (!next) return;
39
+ setValue(next);
40
+ onChange(next);
41
+ }}
42
+ schema={{ type: 'object' }}
43
+ />
44
+ );
45
+ }
46
+ render(<Harness />);
47
+
48
+ expect(screen.queryByText('调用 Workflow 处理')).not.toBeInTheDocument();
49
+ fireEvent.click(screen.getByRole('radio', { name: '并行处理' }));
50
+
51
+ expect(onChange).toHaveBeenLastCalledWith(
52
+ expect.objectContaining({
53
+ itemsBinding: { source: 'INPUT', path: 'rows' },
54
+ execution: { mode: 'PARALLEL', concurrency: 3 },
55
+ }),
56
+ );
57
+ });
58
+ });
@@ -0,0 +1,107 @@
1
+ import { Card, InputNumber, Radio, Space } from 'antd';
2
+ import { useTranslation } from 'react-i18next';
3
+ import { ParameterBindingEditor } from '../../components/ParameterBindingEditor';
4
+ import type { ParameterBinding } from '../../types/parameter-binding';
5
+ import type { WidgetProps } from '../schema-form/widget-registry';
6
+
7
+ type ForEachConfig = {
8
+ itemsBinding: ParameterBinding;
9
+ execution:
10
+ | { mode: 'SEQUENTIAL' }
11
+ | { mode: 'PARALLEL'; concurrency: number | null };
12
+ errorPolicy: 'STOP' | 'CONTINUE';
13
+ };
14
+
15
+ const DEFAULT_CONFIG: ForEachConfig = {
16
+ itemsBinding: { source: 'INPUT', path: 'items' },
17
+ execution: { mode: 'SEQUENTIAL' },
18
+ errorPolicy: 'STOP',
19
+ };
20
+
21
+ export function ForEachConfigEditor({
22
+ value,
23
+ onChange,
24
+ disabled,
25
+ }: WidgetProps<ForEachConfig | undefined>) {
26
+ const { t } = useTranslation('workflow');
27
+ const config = { ...DEFAULT_CONFIG, ...value } as ForEachConfig;
28
+
29
+ function update(patch: Partial<ForEachConfig>) {
30
+ onChange({ ...config, ...patch });
31
+ }
32
+
33
+ return (
34
+ <Space direction="vertical" size={12} style={{ width: '100%' }}>
35
+ <Card size="small" title={t('forEach.items')}>
36
+ <ParameterBindingEditor
37
+ name={t('forEach.items')}
38
+ defaultPath="items"
39
+ value={config.itemsBinding}
40
+ disabled={disabled}
41
+ onChange={(binding) =>
42
+ update({
43
+ itemsBinding:
44
+ binding.source === 'FIXED'
45
+ ? { ...binding, valueType: 'JSON' }
46
+ : binding,
47
+ })
48
+ }
49
+ />
50
+ </Card>
51
+
52
+ <Card size="small" title={t('forEach.execution')}>
53
+ <Radio.Group
54
+ value={config.execution.mode}
55
+ disabled={disabled}
56
+ onChange={(event) =>
57
+ update({
58
+ execution:
59
+ event.target.value === 'PARALLEL'
60
+ ? { mode: 'PARALLEL', concurrency: 3 }
61
+ : { mode: 'SEQUENTIAL' },
62
+ })
63
+ }
64
+ >
65
+ <Space direction="vertical">
66
+ <Radio value="SEQUENTIAL">{t('forEach.sequential')}</Radio>
67
+ <Radio value="PARALLEL">{t('forEach.parallel')}</Radio>
68
+ </Space>
69
+ </Radio.Group>
70
+ {config.execution.mode === 'PARALLEL' && (
71
+ <InputNumber
72
+ precision={0}
73
+ value={config.execution.concurrency}
74
+ disabled={disabled}
75
+ addonBefore={t('forEach.concurrency')}
76
+ onChange={(concurrency) =>
77
+ update({
78
+ execution: {
79
+ mode: 'PARALLEL',
80
+ concurrency,
81
+ },
82
+ })
83
+ }
84
+ style={{ width: '100%', marginTop: 12 }}
85
+ />
86
+ )}
87
+ </Card>
88
+
89
+ <Card size="small" title={t('forEach.failure')}>
90
+ <Radio.Group
91
+ value={config.errorPolicy}
92
+ disabled={disabled}
93
+ onChange={(event) =>
94
+ update({
95
+ errorPolicy: event.target.value as ForEachConfig['errorPolicy'],
96
+ })
97
+ }
98
+ >
99
+ <Space direction="vertical">
100
+ <Radio value="STOP">{t('forEach.stop')}</Radio>
101
+ <Radio value="CONTINUE">{t('forEach.continue')}</Radio>
102
+ </Space>
103
+ </Radio.Group>
104
+ </Card>
105
+ </Space>
106
+ );
107
+ }
@@ -1,5 +1,11 @@
1
1
  import React from 'react';
2
- import { fireEvent, render, screen, waitFor } from '@testing-library/react';
2
+ import {
3
+ fireEvent,
4
+ render,
5
+ screen,
6
+ waitFor,
7
+ within,
8
+ } from '@testing-library/react';
3
9
  import { Form } from 'antd';
4
10
  import type { FormInstance } from 'antd';
5
11
  import { beforeEach, describe, expect, it, vi } from 'vitest';
@@ -51,7 +57,7 @@ const httpSchema = {
51
57
  required: ['connectionRef', 'method', 'path'],
52
58
  };
53
59
 
54
- function renderEditor() {
60
+ function renderEditor(options?: Record<string, unknown>) {
55
61
  let form!: FormInstance;
56
62
 
57
63
  function TestForm() {
@@ -60,7 +66,7 @@ function renderEditor() {
60
66
  <Form form={form}>
61
67
  <SchemaForm
62
68
  schema={httpSchema}
63
- uiSchema={{ widget: 'http-request-config' }}
69
+ uiSchema={{ widget: 'http-request-config', options }}
64
70
  />
65
71
  </Form>
66
72
  );
@@ -88,6 +94,40 @@ describe('HttpRequestConfigEditor', () => {
88
94
  ).toBeInTheDocument();
89
95
  });
90
96
 
97
+ it('uses contextual request data guidance when embedded in another node', async () => {
98
+ await i18n.changeLanguage('zh_CN');
99
+
100
+ renderEditor({
101
+ requestDataDescriptionKey:
102
+ 'httpRequest.approvalLookupRequestDataDescription',
103
+ });
104
+
105
+ expect(
106
+ screen.getByText(
107
+ '设置查询审批人接口需要的数据。字段可以读取当前审批节点收到的内容、Workflow 启动数据或使用固定值。',
108
+ ),
109
+ ).toBeInTheDocument();
110
+ });
111
+
112
+ it('shows the stable approval scope for external approval requests', async () => {
113
+ await i18n.changeLanguage('zh_CN');
114
+
115
+ renderEditor({
116
+ requestDataDescriptionKey:
117
+ 'httpRequest.approvalExternalRequestDataDescription',
118
+ variableContext: 'approvalExternal',
119
+ bindingSources: ['INPUT', 'WORKFLOW', 'APPROVAL', 'FIXED'],
120
+ });
121
+
122
+ expect(
123
+ screen.getByText('人工审批节点从上一个节点收到的结果。'),
124
+ ).toBeInTheDocument();
125
+ expect(
126
+ screen.getByText(/当前审批任务,包括 requestId、callbackToken/),
127
+ ).toBeInTheDocument();
128
+ expect(screen.getByText('approval')).toBeInTheDocument();
129
+ });
130
+
91
131
  it('stores a query field as a direct input binding', async () => {
92
132
  const form = renderEditor();
93
133
 
@@ -102,35 +142,161 @@ describe('HttpRequestConfigEditor', () => {
102
142
  },
103
143
  }),
104
144
  );
105
- expect(screen.getByText('input.departmentId')).toBeInTheDocument();
145
+ const pathInput = screen.getByLabelText('departmentId field path');
146
+ expect(pathInput).toHaveValue('departmentId');
147
+ expect(pathInput.closest('.ant-input-affix-wrapper')).toHaveTextContent(
148
+ 'input.',
149
+ );
106
150
  });
107
151
 
108
- it('offers friendly system-provided values for request fields', async () => {
152
+ it('keeps the value path unchanged when the API field name changes', async () => {
109
153
  const form = renderEditor();
110
154
 
111
- fireEvent.click(screen.getByRole('button', { name: /Add body field/ }));
112
- fireEvent.mouseDown(
113
- await screen.findByRole('combobox', {
114
- name: /ticketId value source/,
155
+ fireEvent.click(
156
+ screen.getByRole('button', { name: /Add query parameter/ }),
157
+ );
158
+ const [fieldNameInput] = await screen.findAllByDisplayValue('departmentId');
159
+ fireEvent.change(fieldNameInput, { target: { value: 'user_id' } });
160
+
161
+ await waitFor(() =>
162
+ expect(form.getFieldValue('config')).toMatchObject({
163
+ queryBindings: {
164
+ user_id: { source: 'INPUT', path: 'departmentId' },
165
+ },
115
166
  }),
116
167
  );
117
- fireEvent.click(await screen.findByText('System-provided'));
168
+ expect(screen.getByLabelText('user_id field path')).toHaveValue(
169
+ 'departmentId',
170
+ );
171
+ });
172
+
173
+ it('allows an unfinished query field name and fixed value to be cleared', async () => {
174
+ const form = renderEditor();
175
+
176
+ fireEvent.click(
177
+ screen.getByRole('button', { name: /Add query parameter/ }),
178
+ );
179
+ const [fieldNameInput] = await screen.findAllByDisplayValue('departmentId');
118
180
 
119
181
  fireEvent.mouseDown(
120
- screen.getByRole('combobox', { name: /System value for ticketId/ }),
182
+ screen.getByRole('combobox', {
183
+ name: 'departmentId value source',
184
+ }),
185
+ );
186
+ fireEvent.click(await screen.findByText('Fixed value'));
187
+ const fixedValueInput = await screen.findByLabelText(
188
+ 'departmentId fixed value',
121
189
  );
122
- const callbackTokenOptions = await screen.findAllByText(
123
- 'External result callback token',
190
+ fireEvent.change(fixedValueInput, { target: { value: 'temporary' } });
191
+ fireEvent.change(fixedValueInput, { target: { value: '' } });
192
+ fireEvent.change(fieldNameInput, { target: { value: '' } });
193
+
194
+ await waitFor(() =>
195
+ expect(
196
+ Object.entries(
197
+ form.getFieldValue(['config', 'queryBindings']) as Record<
198
+ string,
199
+ unknown
200
+ >,
201
+ ),
202
+ ).toEqual([[' ', { source: 'FIXED', valueType: 'STRING', value: '' }]]),
124
203
  );
125
- fireEvent.click(callbackTokenOptions[callbackTokenOptions.length - 1]);
204
+ expect(fieldNameInput).toHaveValue('');
205
+ });
126
206
 
207
+ it('allows multiple unfinished query field names to be cleared', async () => {
208
+ const form = renderEditor();
209
+ fireEvent.click(
210
+ screen.getByRole('button', { name: /Add query parameter/ }),
211
+ );
212
+ await waitFor(() =>
213
+ expect(
214
+ Object.keys(
215
+ form.getFieldValue(['config', 'queryBindings']) as Record<
216
+ string,
217
+ unknown
218
+ >,
219
+ ),
220
+ ).toEqual(['departmentId']),
221
+ );
222
+ fireEvent.click(
223
+ screen.getByRole('button', { name: /Add query parameter/ }),
224
+ );
225
+ await waitFor(() =>
226
+ expect(
227
+ Object.keys(
228
+ form.getFieldValue(['config', 'queryBindings']) as Record<
229
+ string,
230
+ unknown
231
+ >,
232
+ ),
233
+ ).toEqual(['departmentId', 'departmentId_2']),
234
+ );
235
+
236
+ const fieldNameInputs =
237
+ await screen.findAllByPlaceholderText('departmentId');
238
+ fireEvent.change(fieldNameInputs[0], { target: { value: '' } });
239
+ await waitFor(() =>
240
+ expect(
241
+ Object.keys(
242
+ form.getFieldValue(['config', 'queryBindings']) as Record<
243
+ string,
244
+ unknown
245
+ >,
246
+ ),
247
+ ).toEqual([' ', 'departmentId_2']),
248
+ );
249
+ fireEvent.change(
250
+ (await screen.findAllByPlaceholderText('departmentId'))[1],
251
+ { target: { value: '' } },
252
+ );
253
+
254
+ await waitFor(() => {
255
+ const queryBindings = form.getFieldValue([
256
+ 'config',
257
+ 'queryBindings',
258
+ ]) as Record<string, unknown>;
259
+ expect(Object.keys(queryBindings)).toHaveLength(2);
260
+ expect(Object.keys(queryBindings).every((key) => key.trim() === '')).toBe(
261
+ true,
262
+ );
263
+ });
264
+ for (const input of screen.getAllByPlaceholderText('departmentId')) {
265
+ expect(input).toHaveValue('');
266
+ }
267
+ });
268
+
269
+ it('does not overwrite another field when a name is duplicated', async () => {
270
+ const form = renderEditor();
271
+ const addButton = screen.getByRole('button', {
272
+ name: /Add query parameter/,
273
+ });
274
+ fireEvent.click(addButton);
127
275
  await waitFor(() =>
128
276
  expect(form.getFieldValue('config')).toMatchObject({
129
- bodyBindings: {
130
- ticketId: { source: 'SYSTEM', path: 'callback.token' },
277
+ queryBindings: {
278
+ departmentId: { source: 'INPUT', path: 'departmentId' },
131
279
  },
132
280
  }),
133
281
  );
282
+ fireEvent.click(
283
+ screen.getByRole('button', { name: /Add query parameter/ }),
284
+ );
285
+
286
+ const secondField = (
287
+ await screen.findAllByDisplayValue('departmentId_2')
288
+ ).find((element) => !element.hasAttribute('aria-label'))!;
289
+ fireEvent.change(secondField, { target: { value: 'departmentId' } });
290
+
291
+ await waitFor(() =>
292
+ expect(form.getFieldValue('config')).toMatchObject({
293
+ queryBindings: {
294
+ departmentId: { source: 'INPUT', path: 'departmentId' },
295
+ departmentId_2: { source: 'INPUT', path: 'departmentId_2' },
296
+ },
297
+ }),
298
+ );
299
+ expect(secondField).toHaveValue('departmentId_2');
134
300
  });
135
301
 
136
302
  it('marks required request fields and rejects a missing Connection', async () => {
@@ -147,18 +313,23 @@ describe('HttpRequestConfigEditor', () => {
147
313
  });
148
314
  });
149
315
 
150
- it('stores the visible Method and Path defaults in the form', async () => {
316
+ it('does not write visible defaults into an uninitialized form', async () => {
151
317
  const form = renderEditor();
152
318
 
153
- await waitFor(() =>
154
- expect(form.getFieldValue('config')).toMatchObject({
155
- method: 'GET',
156
- path: '/',
157
- }),
158
- );
319
+ expect(screen.getByText('GET')).toBeInTheDocument();
320
+ expect(screen.getByDisplayValue('/')).toBeInTheDocument();
321
+ await waitFor(() => expect(form.getFieldValue('config')).toBeUndefined());
159
322
  });
160
323
 
161
- it('uses a large JSON editor with live validation, formatting, and expansion', async () => {
324
+ it('shows only the request timeout in execution settings', async () => {
325
+ renderEditor();
326
+
327
+ expect(screen.getByRole('spinbutton')).toHaveValue('30');
328
+ expect(screen.queryByRole('switch')).not.toBeInTheDocument();
329
+ expect(screen.queryByText('Retry on failure')).not.toBeInTheDocument();
330
+ });
331
+
332
+ it('saves unfinished JSON without showing an edit-time error', async () => {
162
333
  const form = renderEditor();
163
334
 
164
335
  fireEvent.click(screen.getByRole('button', { name: 'Advanced JSON' }));
@@ -168,13 +339,17 @@ describe('HttpRequestConfigEditor', () => {
168
339
  expect(
169
340
  screen.getByRole('button', { name: /Format JSON/ }),
170
341
  ).toBeInTheDocument();
171
- expect(
172
- screen.getByRole('button', { name: /Expand editor/ }),
173
- ).toBeInTheDocument();
174
- expect(screen.getByText('{{system.callback.token}}')).toBeInTheDocument();
175
-
342
+ const formatButton = screen.getByRole('button', { name: /Format JSON/ });
343
+ const expandButton = screen.getByRole('button', {
344
+ name: /Expand editor/,
345
+ });
346
+ expect(formatButton).toHaveClass('workflow-panel-action');
347
+ expect(expandButton).toHaveClass('workflow-panel-action');
176
348
  fireEvent.change(editor, { target: { value: '{' } });
177
- expect(await screen.findByText(/line 1, column 2/i)).toBeInTheDocument();
349
+ await waitFor(() =>
350
+ expect(form.getFieldValue(['config', 'body'])).toBe('{'),
351
+ );
352
+ expect(screen.queryByText(/line 1, column 2/i)).not.toBeInTheDocument();
178
353
 
179
354
  fireEvent.change(editor, {
180
355
  target: { value: '{"title":"{{workflow.title}}"}' },
@@ -184,6 +359,12 @@ describe('HttpRequestConfigEditor', () => {
184
359
  title: '{{workflow.title}}',
185
360
  }),
186
361
  );
187
- expect(screen.queryByText(/line 1, column 2/i)).not.toBeInTheDocument();
362
+ fireEvent.click(expandButton);
363
+ const dialog = await screen.findByRole('dialog');
364
+ expect(dialog).toHaveClass('workflow-json-editor-modal');
365
+ expect(within(dialog).getByLabelText('JSON code editor')).toHaveAttribute(
366
+ 'data-height',
367
+ 'calc(100% - 28px)',
368
+ );
188
369
  });
189
370
  });