@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,47 +1,70 @@
1
1
  import { fireEvent, render, screen } from '@testing-library/react';
2
2
  import { describe, expect, it, vi } from 'vitest';
3
- import '../../../i18n';
3
+ import i18n from '../../../i18n';
4
4
  import type { WorkflowNodeType } from '../types';
5
5
  import { EnhancedFlowRenderer } from './EnhancedFlowRenderer';
6
6
  import { FlowRenderer } from './FlowRenderer';
7
7
 
8
8
  vi.mock('@xyflow/react', () => ({
9
- ReactFlow: ({ children, onDrop }: any) => (
10
- <div data-testid="react-flow" onDrop={onDrop}>
9
+ ReactFlow: ({
10
+ children,
11
+ onDrop,
12
+ nodesDraggable,
13
+ nodesConnectable,
14
+ deleteKeyCode,
15
+ connectionMode,
16
+ maxZoom,
17
+ nodes,
18
+ }: any) => (
19
+ <div
20
+ data-testid="react-flow"
21
+ data-nodes-draggable={String(nodesDraggable)}
22
+ data-nodes-connectable={String(nodesConnectable)}
23
+ data-delete-enabled={String(Boolean(deleteKeyCode))}
24
+ data-connection-mode={connectionMode}
25
+ data-max-zoom={String(maxZoom)}
26
+ data-node-outputs={JSON.stringify(
27
+ nodes?.map((node: any) => node.data.outputs),
28
+ )}
29
+ data-node-connectable={JSON.stringify(
30
+ nodes?.map((node: any) => node.connectable),
31
+ )}
32
+ onDrop={onDrop}
33
+ >
11
34
  {children}
12
35
  </div>
13
36
  ),
14
37
  ReactFlowProvider: ({ children }: any) => <>{children}</>,
15
38
  Background: () => null,
16
39
  Controls: () => null,
17
- MiniMap: () => null,
18
- ConnectionMode: { Loose: 'loose' },
40
+ Panel: ({ children }: any) => <>{children}</>,
41
+ MiniMap: () => <div data-testid="minimap" />,
42
+ ConnectionMode: { Loose: 'loose', Strict: 'strict' },
43
+ ConnectionLineType: { Bezier: 'bezier' },
19
44
  MarkerType: { ArrowClosed: 'arrow-closed' },
20
45
  useReactFlow: () => ({
21
46
  screenToFlowPosition: ({ x, y }: { x: number; y: number }) => ({ x, y }),
22
47
  setViewport: vi.fn(),
48
+ fitView: vi.fn(),
49
+ zoomTo: vi.fn(),
23
50
  }),
51
+ useViewport: () => ({ zoom: 1 }),
24
52
  applyNodeChanges: (_changes: unknown, nodes: unknown) => nodes,
25
53
  }));
26
54
 
27
- vi.mock('./InstanceRequiredDialog', () => ({
28
- InstanceRequiredDialog: ({ open, onInline }: any) =>
29
- open ? <button onClick={onInline}>use inline</button> : null,
30
- }));
31
-
32
55
  function nodeType(
33
56
  type:
34
57
  | 'code'
35
- | 'return_result'
36
58
  | 'http_request'
37
59
  | 'webhook_trigger'
38
- | 'external_wait',
60
+ | 'external_wait'
61
+ | 'manual_trigger',
39
62
  ): WorkflowNodeType {
40
63
  return {
41
64
  id: type,
42
65
  type,
43
- category: 'ACTION',
44
- label: type,
66
+ category: type === 'manual_trigger' ? 'TRIGGER' : 'ACTION',
67
+ label: type === 'manual_trigger' ? 'Manual Trigger' : type,
45
68
  icon: '',
46
69
  description: null,
47
70
  configSchema: {
@@ -49,24 +72,22 @@ function nodeType(
49
72
  properties:
50
73
  type === 'code'
51
74
  ? { code: { type: 'string' } }
52
- : type === 'return_result'
53
- ? {}
54
- : type === 'webhook_trigger'
75
+ : type === 'webhook_trigger'
76
+ ? {
77
+ method: { type: 'string' },
78
+ path: { type: 'string' },
79
+ secret: { type: 'string' },
80
+ }
81
+ : type === 'external_wait'
55
82
  ? {
83
+ callbackTokenBinding: { type: 'object' },
84
+ timeout: { type: 'object' },
85
+ }
86
+ : {
87
+ connectionRef: { type: 'string' },
56
88
  method: { type: 'string' },
57
89
  path: { type: 'string' },
58
- secret: { type: 'string' },
59
- }
60
- : type === 'external_wait'
61
- ? {
62
- callbackTokenBinding: { type: 'object' },
63
- timeout: { type: 'object' },
64
- }
65
- : {
66
- connectionRef: { type: 'string' },
67
- method: { type: 'string' },
68
- path: { type: 'string' },
69
- },
90
+ },
70
91
  },
71
92
  uiSchema: {},
72
93
  inputSchema: {},
@@ -75,9 +96,7 @@ function nodeType(
75
96
  runtimeKey: type,
76
97
  schemaVersion: 1,
77
98
  instancePolicy:
78
- type === 'return_result' ||
79
- type === 'webhook_trigger' ||
80
- type === 'external_wait'
99
+ type === 'webhook_trigger' || type === 'external_wait'
81
100
  ? 'INLINE_ONLY'
82
101
  : 'OPTIONAL',
83
102
  };
@@ -86,10 +105,10 @@ function nodeType(
86
105
  function dropNode(
87
106
  type:
88
107
  | 'code'
89
- | 'return_result'
90
108
  | 'http_request'
91
109
  | 'webhook_trigger'
92
- | 'external_wait',
110
+ | 'external_wait'
111
+ | 'manual_trigger',
93
112
  ) {
94
113
  fireEvent.drop(screen.getByTestId('react-flow'), {
95
114
  clientX: 100,
@@ -104,24 +123,63 @@ describe.each([
104
123
  ['FlowRenderer', FlowRenderer],
105
124
  ['EnhancedFlowRenderer', EnhancedFlowRenderer],
106
125
  ] as const)('%s new-node defaults', (_name, Renderer) => {
107
- it('creates a zero-config Finish and return node', () => {
126
+ it('uses the current interface language for a new node label', async () => {
127
+ await i18n.changeLanguage('zh_CN');
108
128
  const onDslChange = vi.fn();
109
129
  render(
110
130
  <Renderer dsl={{ nodes: [], edges: [] }} onDslChange={onDslChange} />,
111
131
  );
112
132
 
113
- dropNode('return_result');
133
+ dropNode('manual_trigger');
114
134
 
115
- expect(onDslChange).toHaveBeenCalledWith(
116
- expect.objectContaining({
117
- nodes: [
118
- expect.objectContaining({
119
- type: 'return_result',
120
- config: {},
121
- }),
122
- ],
123
- }),
135
+ expect(onDslChange.mock.calls[0][0].nodes[0]).toMatchObject({
136
+ type: 'manual_trigger',
137
+ label: '手动触发',
138
+ config: {
139
+ inputSchema: {
140
+ type: 'object',
141
+ properties: {},
142
+ required: [],
143
+ additionalProperties: false,
144
+ },
145
+ },
146
+ });
147
+ });
148
+
149
+ it('disables canvas mutations in read-only mode', () => {
150
+ render(
151
+ <Renderer
152
+ readonly
153
+ dsl={{ nodes: [], edges: [] }}
154
+ onDslChange={vi.fn()}
155
+ />,
156
+ );
157
+
158
+ expect(screen.getByTestId('react-flow')).toHaveAttribute(
159
+ 'data-nodes-draggable',
160
+ 'false',
161
+ );
162
+ expect(screen.getByTestId('react-flow')).toHaveAttribute(
163
+ 'data-nodes-connectable',
164
+ 'false',
124
165
  );
166
+ expect(screen.getByTestId('react-flow')).toHaveAttribute(
167
+ 'data-delete-enabled',
168
+ 'false',
169
+ );
170
+ });
171
+
172
+ it('uses a draggable 20–200% bar without a minimap', () => {
173
+ render(<Renderer dsl={{ nodes: [], edges: [] }} />);
174
+
175
+ expect(screen.getByRole('slider')).toHaveAttribute('aria-valuenow', '100');
176
+ expect(screen.getByRole('slider')).toHaveAttribute('aria-valuemin', '20');
177
+ expect(screen.getByRole('slider')).toHaveAttribute('aria-valuemax', '200');
178
+ expect(screen.getByTestId('react-flow')).toHaveAttribute(
179
+ 'data-max-zoom',
180
+ '2',
181
+ );
182
+ expect(screen.queryByTestId('minimap')).not.toBeInTheDocument();
125
183
  });
126
184
 
127
185
  it('gives a new HTTP Request direct value-source fields', () => {
@@ -131,10 +189,6 @@ describe.each([
131
189
  );
132
190
 
133
191
  dropNode('http_request');
134
- const inlineButton = screen.queryByRole('button', {
135
- name: 'use inline',
136
- });
137
- if (inlineButton) fireEvent.click(inlineButton);
138
192
 
139
193
  expect(onDslChange).toHaveBeenCalledWith(
140
194
  expect.objectContaining({
@@ -142,10 +196,13 @@ describe.each([
142
196
  expect.objectContaining({
143
197
  type: 'http_request',
144
198
  config: expect.objectContaining({
199
+ method: 'GET',
200
+ path: '/',
145
201
  queryBindings: {},
146
202
  headerBindings: {},
147
203
  bodyMode: 'FIELDS',
148
204
  bodyBindings: {},
205
+ timeoutSeconds: 30,
149
206
  }),
150
207
  }),
151
208
  ],
@@ -153,6 +210,24 @@ describe.each([
153
210
  );
154
211
  });
155
212
 
213
+ it('adds an instance-capable node immediately and selects it', () => {
214
+ const onDslChange = vi.fn();
215
+ const onNodeClick = vi.fn();
216
+ render(
217
+ <Renderer
218
+ dsl={{ nodes: [], edges: [] }}
219
+ onDslChange={onDslChange}
220
+ onNodeClick={onNodeClick}
221
+ />,
222
+ );
223
+
224
+ dropNode('http_request');
225
+
226
+ const createdNode = onDslChange.mock.calls[0][0].nodes[0];
227
+ expect(createdNode.instanceRef).toBeUndefined();
228
+ expect(onNodeClick).toHaveBeenCalledWith(createdNode.id);
229
+ });
230
+
156
231
  it('gives a new external request trigger a POST endpoint and secret', () => {
157
232
  const onDslChange = vi.fn();
158
233
  render(
@@ -168,11 +243,9 @@ describe.each([
168
243
  type: 'webhook_trigger',
169
244
  config: expect.objectContaining({
170
245
  method: 'POST',
171
- path: expect.stringMatching(/^external-/),
246
+ path: '',
172
247
  secret: expect.stringMatching(/^[a-f0-9]{64}$/),
173
248
  verificationMode: 'HMAC',
174
- responseMode: 'IMMEDIATE',
175
- responseTimeoutSeconds: 60,
176
249
  }),
177
250
  }),
178
251
  ],
@@ -212,3 +285,98 @@ describe.each([
212
285
  );
213
286
  });
214
287
  });
288
+
289
+ it('exposes canvas undo and redo actions', () => {
290
+ const onUndo = vi.fn();
291
+ const onRedo = vi.fn();
292
+ render(
293
+ <FlowRenderer
294
+ dsl={{ nodes: [], edges: [] }}
295
+ canUndo
296
+ canRedo
297
+ onUndo={onUndo}
298
+ onRedo={onRedo}
299
+ />,
300
+ );
301
+
302
+ fireEvent.click(screen.getByRole('button', { name: /撤销|Undo/ }));
303
+ fireEvent.click(screen.getByRole('button', { name: /重做|Redo/ }));
304
+
305
+ expect(onUndo).toHaveBeenCalledOnce();
306
+ expect(onRedo).toHaveBeenCalledOnce();
307
+ });
308
+
309
+ it('only connects output handles to input handles', () => {
310
+ render(<FlowRenderer dsl={{ nodes: [], edges: [] }} />);
311
+
312
+ expect(screen.getByTestId('react-flow')).toHaveAttribute(
313
+ 'data-connection-mode',
314
+ 'strict',
315
+ );
316
+ });
317
+
318
+ it('uses the compiled Switch snapshot in read-only mode', () => {
319
+ render(
320
+ <FlowRenderer
321
+ readonly
322
+ nodeTypeMap={{
323
+ switch: { category: 'CONDITION', icon: '', outputs: null },
324
+ }}
325
+ dsl={{
326
+ nodes: [
327
+ {
328
+ id: 'published-switch',
329
+ type: 'switch',
330
+ label: 'Published switch',
331
+ position: { x: 0, y: 0 },
332
+ config: { cases: [{ id: 'published', label: '发布时分支' }] },
333
+ instanceRef: {
334
+ instanceId: '7',
335
+ instanceCode: 'SWITCH_TEMPLATE',
336
+ },
337
+ },
338
+ ],
339
+ edges: [],
340
+ }}
341
+ />,
342
+ );
343
+
344
+ expect(screen.getByTestId('react-flow')).toHaveAttribute(
345
+ 'data-node-outputs',
346
+ JSON.stringify([['published', 'default']]),
347
+ );
348
+ });
349
+
350
+ it('locks dynamic template ports while their effective config is loading', () => {
351
+ render(
352
+ <FlowRenderer
353
+ referencedConfigStatus="loading"
354
+ nodeTypeMap={{
355
+ switch: { category: 'CONDITION', icon: '', outputs: null },
356
+ }}
357
+ dsl={{
358
+ nodes: [
359
+ {
360
+ id: 'switch',
361
+ type: 'switch',
362
+ label: 'Switch',
363
+ position: { x: 0, y: 0 },
364
+ config: { cases: [{ id: 'snapshot' }] },
365
+ configOverride: null as any,
366
+ instanceRef: {
367
+ instanceId: '7',
368
+ instanceCode: 'SWITCH_TEMPLATE',
369
+ },
370
+ },
371
+ ],
372
+ edges: [],
373
+ }}
374
+ />,
375
+ );
376
+
377
+ expect(screen.getByTestId('react-flow')).toHaveAttribute(
378
+ 'data-node-connectable',
379
+ JSON.stringify([false]),
380
+ );
381
+ expect(screen.getByText('正在同步节点模板配置')).toBeInTheDocument();
382
+ });
@@ -0,0 +1,260 @@
1
+ import { fireEvent, render, screen } from '@testing-library/react';
2
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
3
+ import i18n from '../../../i18n';
4
+ import type { WorkflowNode, WorkflowNodeType } from '../types';
5
+ import { NodeOutputSummary } from './NodeOutputSummary';
6
+
7
+ describe('NodeOutputSummary', () => {
8
+ beforeEach(async () => {
9
+ await i18n.changeLanguage('zh_CN');
10
+ Object.defineProperty(document, 'execCommand', {
11
+ configurable: true,
12
+ value: vi.fn(() => true),
13
+ });
14
+ });
15
+
16
+ it('shows the effective upstream output for a connected passthrough node', () => {
17
+ const query = node('query', 'db_execute', '查询订单');
18
+ const delay = node('delay', 'delay', '等待五分钟');
19
+ const nodeTypes = [
20
+ {
21
+ type: 'db_execute',
22
+ outputSchema: {
23
+ type: 'object',
24
+ properties: {
25
+ rows: { type: 'array' },
26
+ rowCount: { type: 'number' },
27
+ },
28
+ },
29
+ outputs: [],
30
+ },
31
+ {
32
+ type: 'delay',
33
+ outputSchema: { description: '原样传递上一个节点的完整结果' },
34
+ outputs: [],
35
+ },
36
+ ] as unknown as WorkflowNodeType[];
37
+
38
+ render(
39
+ <NodeOutputSummary
40
+ node={delay}
41
+ nodeType={nodeTypes[1]}
42
+ nodes={[query, delay]}
43
+ edges={[{ id: '1', source: 'query', target: 'delay', kind: 'FLOW' }]}
44
+ nodeTypes={nodeTypes}
45
+ />,
46
+ );
47
+
48
+ expect(screen.getByText('输出')).toHaveClass(
49
+ 'workflow-node-config__section-title',
50
+ );
51
+ expect(screen.getByText('原样传递自')).toBeInTheDocument();
52
+ expect(screen.getByText('查询订单')).toBeInTheDocument();
53
+ expect(screen.getByText('查询结果')).toBeInTheDocument();
54
+ expect(screen.getByText('结果行数')).toBeInTheDocument();
55
+ expect(screen.getByText('input.rows')).toBeInTheDocument();
56
+ expect(screen.getByText('input.rowCount')).toBeInTheDocument();
57
+ });
58
+
59
+ it('shows a concise description and root input path for dynamic output', () => {
60
+ const manual = node('trigger', 'manual_trigger', '手动触发');
61
+ const nodeType = {
62
+ type: 'manual_trigger',
63
+ outputSchema: { description: '旧的后端说明' },
64
+ outputs: [],
65
+ } as unknown as WorkflowNodeType;
66
+
67
+ render(<NodeOutputSummary node={manual} nodeType={nodeType} />);
68
+
69
+ expect(screen.getByText('手动运行时填写的数据')).toBeInTheDocument();
70
+ expect(screen.getByText('input')).toBeInTheDocument();
71
+ expect(screen.queryByText('旧的后端说明')).not.toBeInTheDocument();
72
+ });
73
+
74
+ it('shows the standard PostgreSQL change payload as readable input paths', () => {
75
+ const event = node('event', 'event_trigger', '订单更新');
76
+ event.config = {
77
+ registrationCode: 'order-lifecycle-updated',
78
+ processingMode: 'PARALLEL',
79
+ };
80
+ const nodeType = {
81
+ type: 'event_trigger',
82
+ outputSchema: {
83
+ type: 'object',
84
+ properties: {
85
+ operation: { type: 'string' },
86
+ primaryKey: { type: 'object' },
87
+ before: { type: ['object', 'null'] },
88
+ after: { type: ['object', 'null'] },
89
+ changedFields: { type: 'array' },
90
+ },
91
+ required: [
92
+ 'operation',
93
+ 'primaryKey',
94
+ 'before',
95
+ 'after',
96
+ 'changedFields',
97
+ ],
98
+ },
99
+ outputs: [],
100
+ } as unknown as WorkflowNodeType;
101
+
102
+ render(<NodeOutputSummary node={event} nodeType={nodeType} />);
103
+
104
+ expect(screen.getByText('input.operation')).toBeInTheDocument();
105
+ expect(screen.getByText('input.primaryKey')).toBeInTheDocument();
106
+ expect(screen.getByText('input.changedFields')).toBeInTheDocument();
107
+ expect(
108
+ screen.queryByText('触发本次运行的事件数据'),
109
+ ).not.toBeInTheDocument();
110
+ });
111
+
112
+ it('labels every external request output field', () => {
113
+ const webhook = node('webhook', 'webhook_trigger', '接收外部调用');
114
+ const nodeType = {
115
+ type: 'webhook_trigger',
116
+ outputSchema: {
117
+ type: 'object',
118
+ properties: {
119
+ body: {},
120
+ headers: { type: 'object' },
121
+ query: { type: 'object' },
122
+ receivedAt: { type: 'string' },
123
+ },
124
+ },
125
+ outputs: [],
126
+ } as unknown as WorkflowNodeType;
127
+
128
+ render(<NodeOutputSummary node={webhook} nodeType={nodeType} />);
129
+
130
+ expect(
131
+ screen.getByText('下个节点可直接使用这些 input 路径,点击即可复制'),
132
+ ).toBeInTheDocument();
133
+ expect(screen.queryByText('下个节点读取')).not.toBeInTheDocument();
134
+ expect(screen.queryByText('外部调用传入的内容')).not.toBeInTheDocument();
135
+ expect(screen.getByText('请求内容')).toBeInTheDocument();
136
+ expect(screen.getByText('请求头')).toBeInTheDocument();
137
+ expect(screen.getByText('查询参数')).toBeInTheDocument();
138
+ expect(screen.getByText('接收时间')).toBeInTheDocument();
139
+ expect(screen.getByText('input.receivedAt')).toBeInTheDocument();
140
+ const copyButtons = screen.getAllByRole('button', { name: '复制路径' });
141
+ expect(copyButtons).toHaveLength(4);
142
+ fireEvent.click(copyButtons[0]);
143
+ expect(screen.getByRole('button', { name: '已复制' })).toBeInTheDocument();
144
+ });
145
+
146
+ it('shows the aggregated Parallel output instead of canvas exits', () => {
147
+ const parallel = node('parallel', 'parallel', '并行执行');
148
+ parallel.config = {
149
+ branches: [
150
+ { id: 'first', label: '分支 A' },
151
+ { id: 'second', label: '分支 B' },
152
+ ],
153
+ };
154
+ const nodeType = {
155
+ type: 'parallel',
156
+ outputSchema: {
157
+ type: 'object',
158
+ properties: {
159
+ branch: { type: 'array' },
160
+ },
161
+ required: ['branch'],
162
+ },
163
+ outputs: [],
164
+ } as unknown as WorkflowNodeType;
165
+
166
+ const { container } = render(
167
+ <NodeOutputSummary node={parallel} nodeType={nodeType} />,
168
+ );
169
+
170
+ expect(screen.getByText('各分支结果')).toBeInTheDocument();
171
+ expect(screen.getByText('input.branch')).toBeInTheDocument();
172
+ expect(
173
+ screen.getByRole('tree', { name: '可读取字段' }),
174
+ ).toBeInTheDocument();
175
+ expect(
176
+ screen
177
+ .getByRole('tree', { name: '可读取字段' })
178
+ .querySelectorAll('.workflow-node-output__tree-node'),
179
+ ).toHaveLength(2);
180
+ expect(
181
+ container.querySelectorAll('.workflow-node-output__field'),
182
+ ).toHaveLength(1);
183
+ expect(screen.getByText('input.branch[0]')).toBeInTheDocument();
184
+ expect(screen.getByText('input.branch[1]')).toBeInTheDocument();
185
+ expect(screen.getByText('“分支 A”返回的完整结果')).toBeInTheDocument();
186
+ expect(screen.getByText('“分支 B”返回的完整结果')).toBeInTheDocument();
187
+ expect(screen.queryByText('input.received')).not.toBeInTheDocument();
188
+ expect(screen.queryByText('并行执行出口')).not.toBeInTheDocument();
189
+ expect(screen.queryByText('进入并行分支')).not.toBeInTheDocument();
190
+ expect(screen.queryByText('全部分支完成')).not.toBeInTheDocument();
191
+ });
192
+
193
+ it('keeps the field name and type together without narrowing its path', () => {
194
+ const execute = node('execute', 'db_execute', '数据库写入');
195
+ const nodeType = {
196
+ type: 'db_execute',
197
+ outputSchema: {
198
+ type: 'object',
199
+ properties: {
200
+ insertedId: { type: 'string' },
201
+ },
202
+ },
203
+ outputs: [],
204
+ } as unknown as WorkflowNodeType;
205
+
206
+ render(<NodeOutputSummary node={execute} nodeType={nodeType} />);
207
+
208
+ const fieldHead = screen
209
+ .getByText('新增记录 ID')
210
+ .closest('.workflow-node-output__field-head');
211
+ expect(fieldHead).toContainElement(screen.getByText('文本'));
212
+ expect(screen.getByText('input.insertedId')).toBeInTheDocument();
213
+ });
214
+
215
+ it('shows directly usable paths for nested object fields', () => {
216
+ const approval = node('approval', 'human_approval', '人工审批');
217
+ const nodeType = {
218
+ type: 'human_approval',
219
+ outputSchema: {
220
+ type: 'object',
221
+ properties: {
222
+ result: {
223
+ type: 'object',
224
+ properties: {
225
+ requestId: { type: 'string' },
226
+ result: { type: 'string' },
227
+ approved: { type: 'boolean' },
228
+ },
229
+ },
230
+ },
231
+ required: ['result'],
232
+ },
233
+ outputs: [],
234
+ } as unknown as WorkflowNodeType;
235
+
236
+ render(<NodeOutputSummary node={approval} nodeType={nodeType} />);
237
+
238
+ expect(
239
+ screen.getByRole('tree', { name: '可读取字段' }),
240
+ ).toBeInTheDocument();
241
+ expect(
242
+ screen
243
+ .getByRole('tree', { name: '可读取字段' })
244
+ .querySelectorAll('.workflow-node-output__tree-node'),
245
+ ).toHaveLength(3);
246
+ expect(
247
+ screen
248
+ .getByRole('tree', { name: '可读取字段' })
249
+ .querySelectorAll('.workflow-node-output__tree-connector'),
250
+ ).toHaveLength(3);
251
+ expect(screen.getByText('input.result.requestId')).toBeInTheDocument();
252
+ expect(screen.getByText('input.result.result')).toBeInTheDocument();
253
+ expect(screen.getByText('input.result.approved')).toBeInTheDocument();
254
+ expect(screen.getAllByRole('button', { name: '复制路径' })).toHaveLength(4);
255
+ });
256
+ });
257
+
258
+ function node(id: string, type: string, label: string): WorkflowNode {
259
+ return { id, type, label, position: { x: 0, y: 0 }, config: {} };
260
+ }