@gadmin2n/schematics 0.0.143 → 0.0.145

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 (279) 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 +57 -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/seed/workflows.ts +224 -59
  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/src/modules/humanApproval/human-approval.external-decision.spec.ts +0 -183
  253. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/legacy-approval-config-migration.ts +0 -227
  254. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.spec.ts +0 -82
  255. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.ts +0 -111
  256. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.controller.spec.ts +0 -54
  257. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.controller.ts +0 -147
  258. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.module.ts +0 -10
  259. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.service.spec.ts +0 -350
  260. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.service.ts +0 -110
  261. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.ts +0 -1
  262. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/InstanceRequiredDialog.tsx +0 -106
  263. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.test.tsx +0 -45
  264. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.tsx +0 -43
  265. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeTypeBadge.tsx +0 -36
  266. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useNodeInstanceLibrary.ts +0 -41
  267. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.test.tsx +0 -47
  268. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.tsx +0 -182
  269. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.test.tsx +0 -34
  270. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.tsx +0 -16
  271. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.test.ts +0 -25
  272. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.ts +0 -42
  273. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.test.ts +0 -208
  274. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.ts +0 -246
  275. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/create.tsx +0 -111
  276. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/edit.tsx +0 -127
  277. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/index.tsx +0 -4
  278. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/list.tsx +0 -282
  279. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/show.tsx +0 -74
@@ -1,20 +1,13 @@
1
1
  import React, { useCallback, useEffect, useState } from 'react';
2
- import {
3
- Button,
4
- Card,
5
- Select,
6
- Space,
7
- Table,
8
- Tag,
9
- Tooltip,
10
- Typography,
11
- } from 'antd';
12
- import { ArrowLeftOutlined } from '@ant-design/icons';
2
+ import { Button, Card, Select, Table, Tag, Tooltip, message } from 'antd';
13
3
  import { useNavigate, useParams, useSearchParams } from 'react-router-dom';
14
4
  import { customRequest } from 'helpers/http';
15
- import { HEADER_CARD_PROPS, PAGE_WRAPPER_STYLE } from 'constants/layout';
5
+ import { PAGE_WRAPPER_STYLE } from 'constants/layout';
6
+ import { PageHeader } from 'components';
7
+ import { useTranslation } from 'react-i18next';
8
+ import { formatWorkflowUtcDateTime } from './utils/workflowDateTime';
9
+ import './workflow-ui.css';
16
10
 
17
- const { Title } = Typography;
18
11
  const PAGE_SIZE = 20;
19
12
 
20
13
  const STATUS_TAG: Record<string, { color: string; label: string }> = {
@@ -28,6 +21,7 @@ const STATUS_TAG: Record<string, { color: string; label: string }> = {
28
21
  interface WorkflowInstanceItem {
29
22
  id: string;
30
23
  status: string;
24
+ retryOfInstanceId: string | null;
31
25
  startedAt: string | null;
32
26
  finishedAt: string | null;
33
27
  creator: string;
@@ -46,6 +40,7 @@ function formatDuration(start: string | null, end: string | null): string {
46
40
  }
47
41
 
48
42
  export default function WorkflowInstancesPage() {
43
+ const { t } = useTranslation('workflow');
49
44
  const { workflowId } = useParams<{ workflowId: string }>();
50
45
  const navigate = useNavigate();
51
46
  const [searchParams, setSearchParams] = useSearchParams();
@@ -57,6 +52,7 @@ export default function WorkflowInstancesPage() {
57
52
  const [total, setTotal] = useState(0);
58
53
  const [loading, setLoading] = useState(false);
59
54
  const [workflowName, setWorkflowName] = useState('');
55
+ const [workflowNameError, setWorkflowNameError] = useState(false);
60
56
 
61
57
  const updateParams = useCallback(
62
58
  (updates: Record<string, string | undefined>) => {
@@ -78,8 +74,11 @@ export default function WorkflowInstancesPage() {
78
74
  useEffect(() => {
79
75
  if (!workflowId) return;
80
76
  customRequest<{ name: string }>(`workflow/${workflowId}`, 'GET')
81
- .then((wf) => setWorkflowName(wf.name))
82
- .catch(() => {});
77
+ .then((wf) => {
78
+ setWorkflowName(wf.name);
79
+ setWorkflowNameError(false);
80
+ })
81
+ .catch(() => setWorkflowNameError(true));
83
82
  }, [workflowId]);
84
83
 
85
84
  const fetchData = useCallback(async () => {
@@ -98,12 +97,12 @@ export default function WorkflowInstancesPage() {
98
97
  }>(`workflow/${workflowId}/instances`, 'GET', params);
99
98
  setItems(res.items);
100
99
  setTotal(res.total);
101
- } catch {
102
- // handled silently
100
+ } catch (error: any) {
101
+ message.error(error?.message ?? t('instances.loadFailed'));
103
102
  } finally {
104
103
  setLoading(false);
105
104
  }
106
- }, [workflowId, page, filterStatus]);
105
+ }, [workflowId, page, filterStatus, t]);
107
106
 
108
107
  useEffect(() => {
109
108
  fetchData();
@@ -117,58 +116,88 @@ export default function WorkflowInstancesPage() {
117
116
  width: 80,
118
117
  },
119
118
  {
120
- title: 'Status',
119
+ title: t('instances.status'),
121
120
  dataIndex: 'status',
122
121
  key: 'status',
123
122
  width: 110,
124
123
  render: (status: string) => {
125
124
  const cfg = STATUS_TAG[status] || { color: 'default', label: status };
126
- return <Tag color={cfg.color}>{cfg.label}</Tag>;
125
+ return (
126
+ <Tag color={cfg.color}>
127
+ {t(`instances.statuses.${status.toLowerCase()}`, {
128
+ defaultValue: cfg.label,
129
+ })}
130
+ </Tag>
131
+ );
127
132
  },
128
133
  },
129
134
  {
130
- title: 'Started',
135
+ title: t('instances.executionSource'),
136
+ key: 'executionSource',
137
+ width: 150,
138
+ render: (_: unknown, record: WorkflowInstanceItem) =>
139
+ record.retryOfInstanceId ? (
140
+ <Button
141
+ type="link"
142
+ size="small"
143
+ style={{ padding: 0 }}
144
+ onClick={() =>
145
+ navigate(
146
+ `/admin/workflow/instance/show/${record.retryOfInstanceId}`,
147
+ )
148
+ }
149
+ >
150
+ {t('instances.resumedFrom', { id: record.retryOfInstanceId })}
151
+ </Button>
152
+ ) : (
153
+ <span style={{ color: 'var(--ant-color-text-secondary)' }}>
154
+ {t('instances.initialRun')}
155
+ </span>
156
+ ),
157
+ },
158
+ {
159
+ title: t('instances.startedAt'),
131
160
  dataIndex: 'startedAt',
132
161
  key: 'startedAt',
133
162
  width: 160,
134
163
  render: (v: string | null) =>
135
164
  v ? (
136
- <Tooltip title={new Date(v).toLocaleString()}>
137
- <span>{new Date(v).toLocaleString()}</span>
165
+ <Tooltip title={formatWorkflowUtcDateTime(v)}>
166
+ <span>{formatWorkflowUtcDateTime(v)}</span>
138
167
  </Tooltip>
139
168
  ) : (
140
169
  <span style={{ color: '#d9d9d9' }}>—</span>
141
170
  ),
142
171
  },
143
172
  {
144
- title: 'Finished',
173
+ title: t('instances.finishedAt'),
145
174
  dataIndex: 'finishedAt',
146
175
  key: 'finishedAt',
147
176
  width: 160,
148
177
  render: (v: string | null) =>
149
178
  v ? (
150
- <Tooltip title={new Date(v).toLocaleString()}>
151
- <span>{new Date(v).toLocaleString()}</span>
179
+ <Tooltip title={formatWorkflowUtcDateTime(v)}>
180
+ <span>{formatWorkflowUtcDateTime(v)}</span>
152
181
  </Tooltip>
153
182
  ) : (
154
183
  <span style={{ color: '#d9d9d9' }}>—</span>
155
184
  ),
156
185
  },
157
186
  {
158
- title: 'Duration',
187
+ title: t('instances.duration'),
159
188
  key: 'duration',
160
189
  width: 100,
161
190
  render: (_: any, record: WorkflowInstanceItem) =>
162
191
  formatDuration(record.startedAt, record.finishedAt),
163
192
  },
164
193
  {
165
- title: 'Creator',
194
+ title: t('instances.creator'),
166
195
  dataIndex: 'creator',
167
196
  key: 'creator',
168
197
  width: 150,
169
198
  },
170
199
  {
171
- title: 'Actions',
200
+ title: t('list.actions'),
172
201
  key: 'actions',
173
202
  width: 100,
174
203
  render: (_: any, record: WorkflowInstanceItem) => (
@@ -177,48 +206,40 @@ export default function WorkflowInstancesPage() {
177
206
  size="small"
178
207
  onClick={() => navigate(`/admin/workflow/instance/show/${record.id}`)}
179
208
  >
180
- Detail
209
+ {t('instances.detail')}
181
210
  </Button>
182
211
  ),
183
212
  },
184
213
  ];
185
214
 
186
215
  return (
187
- <div style={PAGE_WRAPPER_STYLE}>
188
- <Card {...HEADER_CARD_PROPS}>
189
- <div
190
- style={{
191
- display: 'flex',
192
- justifyContent: 'space-between',
193
- alignItems: 'center',
194
- }}
195
- >
196
- <Space>
197
- <Button
198
- type="text"
199
- icon={<ArrowLeftOutlined />}
200
- onClick={() => navigate('/admin/workflow')}
201
- ></Button>
202
- <Title level={4} style={{ margin: 0 }}>
203
- {workflowName || 'Workflow'} — Execution History
204
- </Title>
205
- </Space>
216
+ <div className="workflow-page-stack" style={PAGE_WRAPPER_STYLE}>
217
+ <PageHeader
218
+ title={t('instances.title', {
219
+ name: workflowName || t('list.title'),
220
+ })}
221
+ subtitle={
222
+ workflowNameError
223
+ ? t('instances.workflowLoadFailed')
224
+ : t('instances.subtitle')
225
+ }
226
+ extra={
206
227
  <Select
207
- placeholder="All Statuses"
228
+ placeholder={t('instances.allStatuses')}
208
229
  allowClear
209
230
  value={filterStatus}
210
231
  onChange={(v) => updateParams({ status: v, page: undefined })}
211
232
  style={{ width: 140 }}
212
233
  options={[
213
- { value: 'PENDING', label: 'Pending' },
214
- { value: 'RUNNING', label: 'Running' },
215
- { value: 'COMPLETED', label: 'Completed' },
216
- { value: 'FAILED', label: 'Failed' },
217
- { value: 'CANCELLED', label: 'Cancelled' },
234
+ { value: 'PENDING', label: t('instances.statuses.pending') },
235
+ { value: 'RUNNING', label: t('instances.statuses.running') },
236
+ { value: 'COMPLETED', label: t('instances.statuses.completed') },
237
+ { value: 'FAILED', label: t('instances.statuses.failed') },
238
+ { value: 'CANCELLED', label: t('instances.statuses.cancelled') },
218
239
  ]}
219
240
  />
220
- </div>
221
- </Card>
241
+ }
242
+ />
222
243
 
223
244
  <Card className="card-table">
224
245
  <Table
@@ -232,7 +253,7 @@ export default function WorkflowInstancesPage() {
232
253
  total,
233
254
  onChange: (p) =>
234
255
  updateParams({ page: p > 1 ? String(p) : undefined }),
235
- showTotal: (t) => `Total ${t}`,
256
+ showTotal: (count) => t('list.total', { count }),
236
257
  }}
237
258
  size="small"
238
259
  />
@@ -11,62 +11,37 @@ import {
11
11
  message,
12
12
  } from 'antd';
13
13
  import { CheckCircleOutlined, LoadingOutlined } from '@ant-design/icons';
14
+ import { useTranslation } from 'react-i18next';
14
15
  import { useWorkflowAgent } from '../../hooks/useWorkflowAgent';
15
16
  import type { WorkflowNodeType, NodeInstanceAgentOutput } from '../../types';
17
+ import { WorkflowCodeEditor } from '../../components/WorkflowCodeEditor';
16
18
 
17
19
  const { Text } = Typography;
18
20
  const { TextArea } = Input;
19
21
 
20
22
  /**
21
- * Front-end hardcoded mapping: nodeType category → prompt placeholder & scenario hint.
23
+ * Front-end hardcoded mapping: nodeType category → scenario hint sent to the Agent.
24
+ * (User-facing placeholders live in i18n: nodeInstance.promptPlaceholders)
22
25
  */
23
- const CATEGORY_PROMPT_CONFIG: Record<
24
- string,
25
- { placeholder: string; scenarioHint: string }
26
- > = {
27
- TRIGGER: {
28
- placeholder: 'e.g. Trigger every weekday at 9am Shanghai time',
29
- scenarioHint:
30
- 'This is a trigger node. Generate config for defining when/how the workflow starts.',
31
- },
32
- ACTION: {
33
- placeholder:
34
- 'e.g. Send a POST request to https://api.example.com/notify with the order data',
35
- scenarioHint:
36
- 'This is an action node. Generate config for performing an operation (HTTP call, DB query, notification, etc.).',
37
- },
38
- CONDITION: {
39
- placeholder:
40
- 'e.g. Check if order.amount > 1000 AND order.status is "pending"',
41
- scenarioHint:
42
- 'This is a condition/branching node. Generate config for evaluating conditions to decide the flow path.',
43
- },
44
- FLOW_CONTROL: {
45
- placeholder:
46
- 'e.g. Wait 30 seconds, iterate over items, or run branches in parallel',
47
- scenarioHint:
48
- 'This is a flow control node. Generate config for waiting, iteration, or parallel execution.',
49
- },
50
- APPROVAL: {
51
- placeholder:
52
- 'e.g. Wait for manager@company.com to approve, timeout after 24 hours',
53
- scenarioHint:
54
- 'This is an approval node. Generate config for human approval gates with escalation rules.',
55
- },
56
- SUB_WORKFLOW: {
57
- placeholder:
58
- 'e.g. Call the "order-processing" Workflow and wait for its return value',
59
- scenarioHint: 'This node defines or performs an internal Workflow call.',
60
- },
26
+ const CATEGORY_SCENARIO_HINTS: Record<string, string> = {
27
+ TRIGGER:
28
+ 'This is a trigger node. Generate config for defining when/how the workflow starts.',
29
+ ACTION:
30
+ 'This is an action node. Generate config for performing an operation (HTTP call, DB query, notification, etc.).',
31
+ CONDITION:
32
+ 'This is a condition/branching node. Generate config for evaluating conditions to decide the flow path.',
33
+ FLOW_CONTROL:
34
+ 'This is a flow control node. Generate config for waiting, iteration, or parallel execution.',
35
+ APPROVAL:
36
+ 'This is an approval node. Generate config for human approval gates with escalation rules.',
37
+ SUB_WORKFLOW: 'This node defines or performs an internal Workflow call.',
61
38
  };
62
39
 
63
- const DEFAULT_PROMPT_CONFIG = {
64
- placeholder: 'Describe what this node instance should do...',
65
- scenarioHint: 'Generate appropriate configuration for this node type.',
66
- };
40
+ const DEFAULT_SCENARIO_HINT =
41
+ 'Generate appropriate configuration for this node type.';
67
42
 
68
- function getPromptConfig(category: string) {
69
- return CATEGORY_PROMPT_CONFIG[category] || DEFAULT_PROMPT_CONFIG;
43
+ function getScenarioHint(category: string) {
44
+ return CATEGORY_SCENARIO_HINTS[category] || DEFAULT_SCENARIO_HINT;
70
45
  }
71
46
 
72
47
  function tryParseNodeInstanceOutput(
@@ -105,6 +80,7 @@ export function CreateNodeInstanceModal({
105
80
  onClose,
106
81
  onApply,
107
82
  }: Props) {
83
+ const { t } = useTranslation('workflow');
108
84
  const [selectedNodeTypeId, setSelectedNodeTypeId] = useState<
109
85
  string | undefined
110
86
  >();
@@ -128,17 +104,20 @@ export function CreateNodeInstanceModal({
128
104
  [selectedNodeTypeId, nodeTypes],
129
105
  );
130
106
 
131
- const promptConfig = useMemo(
107
+ const promptPlaceholder = useMemo(
132
108
  () =>
133
109
  selectedNodeType
134
- ? getPromptConfig(selectedNodeType.category)
135
- : DEFAULT_PROMPT_CONFIG,
136
- [selectedNodeType],
110
+ ? t(
111
+ `nodeInstance.promptPlaceholders.${selectedNodeType.category}`,
112
+ t('nodeInstance.promptPlaceholderDefault'),
113
+ )
114
+ : t('nodeInstance.promptPlaceholderDefault'),
115
+ [selectedNodeType, t],
137
116
  );
138
117
 
139
118
  async function handleGenerate() {
140
119
  if (!prompt.trim()) {
141
- message.warning('Please describe what this node instance should do');
120
+ message.warning(t('nodeInstance.promptRequired'));
142
121
  return;
143
122
  }
144
123
  if (!selectedNodeType) return;
@@ -148,7 +127,7 @@ export function CreateNodeInstanceModal({
148
127
  action: 'create_node_instance',
149
128
  prompt: prompt.trim(),
150
129
  nodeType: selectedNodeType,
151
- scenarioHint: promptConfig.scenarioHint,
130
+ scenarioHint: getScenarioHint(selectedNodeType.category),
152
131
  });
153
132
 
154
133
  if (result && 'config' in result) {
@@ -165,9 +144,7 @@ export function CreateNodeInstanceModal({
165
144
  function handleApplyManualJson() {
166
145
  const parsed = tryParseNodeInstanceOutput(resultInput);
167
146
  if (!parsed) {
168
- message.error(
169
- 'Invalid JSON format. Expected: { "name": "...", "description": "...", "config": {...} }',
170
- );
147
+ message.error(t('nodeInstance.invalidJson'));
171
148
  return;
172
149
  }
173
150
  setGeneratedResult(parsed);
@@ -199,19 +176,72 @@ export function CreateNodeInstanceModal({
199
176
 
200
177
  return (
201
178
  <Modal
202
- title="AI Create Node Instance"
179
+ title={t('nodeInstance.aiCreate')}
203
180
  open={open}
204
181
  onCancel={handleClose}
205
- footer={null}
206
182
  destroyOnClose
207
183
  width={560}
184
+ styles={{ header: { borderBottom: 'none' } }}
185
+ footer={
186
+ <div style={{ textAlign: 'right' }}>
187
+ <Space>
188
+ <Button onClick={handleClose}>{t('common.cancel')}</Button>
189
+ {step === 'selectType' && (
190
+ <Button
191
+ type="primary"
192
+ disabled={!selectedNodeTypeId || !prompt.trim()}
193
+ loading={agentLoading}
194
+ onClick={handleGenerate}
195
+ >
196
+ {t('nodeInstance.generate')}
197
+ </Button>
198
+ )}
199
+ {step === 'generating' && (
200
+ <Button
201
+ type="primary"
202
+ disabled={!resultInput.trim()}
203
+ onClick={handleApplyManualJson}
204
+ >
205
+ {t('nodeInstance.applyJson')}
206
+ </Button>
207
+ )}
208
+ {step === 'done' && (
209
+ <>
210
+ <Button
211
+ onClick={() => {
212
+ setStep('selectType');
213
+ setGeneratedResult(null);
214
+ setResultInput('');
215
+ }}
216
+ >
217
+ {t('nodeInstance.regenerate')}
218
+ </Button>
219
+ <Button
220
+ type="primary"
221
+ onClick={() => {
222
+ const parsed = tryParseNodeInstanceOutput(resultInput);
223
+ if (parsed) {
224
+ setGeneratedResult(parsed);
225
+ handleConfirm();
226
+ } else {
227
+ message.error(t('nodeInstance.invalidJson'));
228
+ }
229
+ }}
230
+ >
231
+ {t('nodeInstance.confirmCreate')}
232
+ </Button>
233
+ </>
234
+ )}
235
+ </Space>
236
+ </div>
237
+ }
208
238
  >
209
239
  <Space direction="vertical" style={{ width: '100%' }} size="middle">
210
240
  {/* Node Type Select — always visible */}
211
241
  <div>
212
- <Text strong>Node Type</Text>
242
+ <Text strong>{t('nodeInstance.nodeType')}</Text>
213
243
  <Select
214
- placeholder="Select a node type"
244
+ placeholder={t('nodeInstance.selectNodeType')}
215
245
  value={selectedNodeTypeId}
216
246
  onChange={setSelectedNodeTypeId}
217
247
  disabled={step === 'generating'}
@@ -225,20 +255,20 @@ export function CreateNodeInstanceModal({
225
255
  />
226
256
  </div>
227
257
 
228
- {/* Prompt Input — visible once type is selected */}
229
- {selectedNodeTypeId && (
230
- <div>
231
- <Text strong>Describe your node instance</Text>
232
- <TextArea
233
- rows={4}
234
- placeholder={promptConfig.placeholder}
235
- value={prompt}
236
- onChange={(e) => setPrompt(e.target.value)}
237
- disabled={step === 'generating' || step === 'done'}
238
- style={{ marginTop: 4 }}
239
- />
240
- </div>
241
- )}
258
+ {/* Prompt Input — always visible, enabled once type is selected */}
259
+ <div>
260
+ <Text strong>{t('nodeInstance.describe')}</Text>
261
+ <TextArea
262
+ rows={4}
263
+ placeholder={promptPlaceholder}
264
+ value={prompt}
265
+ onChange={(e) => setPrompt(e.target.value)}
266
+ disabled={
267
+ !selectedNodeTypeId || step === 'generating' || step === 'done'
268
+ }
269
+ style={{ marginTop: 4 }}
270
+ />
271
+ </div>
242
272
 
243
273
  {/* Generating state */}
244
274
  {step === 'generating' && (
@@ -247,22 +277,20 @@ export function CreateNodeInstanceModal({
247
277
  type="info"
248
278
  icon={<Spin indicator={<LoadingOutlined />} size="small" />}
249
279
  showIcon
250
- message="Waiting for Agent..."
251
- description="Continue your conversation with the Agent in the chat panel. Once it outputs valid JSON, it will be captured automatically. Or paste JSON below manually."
280
+ message={t('nodeInstance.waitingAgent')}
281
+ description={t('nodeInstance.agentHint')}
252
282
  />
253
283
  <div>
254
- <Text strong>JSON Result</Text>
284
+ <Text strong>{t('nodeInstance.jsonResult')}</Text>
255
285
  <Text type="secondary" style={{ marginLeft: 8, fontSize: 12 }}>
256
- Auto-filled by Agent or paste manually
286
+ {t('nodeInstance.jsonPlaceholder')}
257
287
  </Text>
258
- <TextArea
259
- rows={6}
260
- placeholder={
261
- '{"name": "...", "description": "...", "config": {...}}'
262
- }
288
+ <WorkflowCodeEditor
289
+ language="json"
263
290
  value={resultInput}
264
- onChange={(e) => setResultInput(e.target.value)}
265
- style={{ marginTop: 4, fontFamily: 'monospace', fontSize: 12 }}
291
+ onChange={setResultInput}
292
+ height={220}
293
+ ariaLabel="JSON Result"
266
294
  />
267
295
  </div>
268
296
  </>
@@ -275,16 +303,20 @@ export function CreateNodeInstanceModal({
275
303
  type="success"
276
304
  icon={<CheckCircleOutlined />}
277
305
  showIcon
278
- message="Node instance config generated!"
279
- description={`Name: ${generatedResult.name}. Config has ${Object.keys(generatedResult.config).length} fields.`}
306
+ message={t('nodeInstance.generated')}
307
+ description={t('nodeInstance.generatedDetail', {
308
+ name: generatedResult.name,
309
+ count: Object.keys(generatedResult.config).length,
310
+ })}
280
311
  />
281
312
  <div>
282
- <Text strong>JSON Result</Text>
283
- <TextArea
284
- rows={6}
313
+ <Text strong>{t('nodeInstance.jsonResult')}</Text>
314
+ <WorkflowCodeEditor
315
+ language="json"
285
316
  value={resultInput}
286
- onChange={(e) => setResultInput(e.target.value)}
287
- style={{ marginTop: 4, fontFamily: 'monospace', fontSize: 12 }}
317
+ onChange={setResultInput}
318
+ height={220}
319
+ ariaLabel="JSON Result"
288
320
  />
289
321
  </div>
290
322
  </>
@@ -294,64 +326,11 @@ export function CreateNodeInstanceModal({
294
326
  {agentError && (
295
327
  <Alert
296
328
  type="error"
297
- message="Generation failed"
329
+ message={t('nodeInstance.generationFailed')}
298
330
  description={agentError}
299
331
  showIcon
300
332
  />
301
333
  )}
302
-
303
- {/* Action buttons */}
304
- <div style={{ textAlign: 'right' }}>
305
- <Space>
306
- <Button onClick={handleClose}>Cancel</Button>
307
- {step === 'selectType' && (
308
- <Button
309
- type="primary"
310
- disabled={!selectedNodeTypeId || !prompt.trim()}
311
- loading={agentLoading}
312
- onClick={handleGenerate}
313
- >
314
- Generate
315
- </Button>
316
- )}
317
- {step === 'generating' && (
318
- <Button
319
- type="primary"
320
- disabled={!resultInput.trim()}
321
- onClick={handleApplyManualJson}
322
- >
323
- Apply JSON
324
- </Button>
325
- )}
326
- {step === 'done' && (
327
- <>
328
- <Button
329
- onClick={() => {
330
- setStep('selectType');
331
- setGeneratedResult(null);
332
- setResultInput('');
333
- }}
334
- >
335
- Re-generate
336
- </Button>
337
- <Button
338
- type="primary"
339
- onClick={() => {
340
- const parsed = tryParseNodeInstanceOutput(resultInput);
341
- if (parsed) {
342
- setGeneratedResult(parsed);
343
- handleConfirm();
344
- } else {
345
- message.error('Invalid JSON format');
346
- }
347
- }}
348
- >
349
- Confirm &amp; Create
350
- </Button>
351
- </>
352
- )}
353
- </Space>
354
- </div>
355
334
  </Space>
356
335
  </Modal>
357
336
  );