@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
@@ -7,8 +7,6 @@ import React, {
7
7
  } from 'react';
8
8
  import {
9
9
  Button,
10
- Card,
11
- Descriptions,
12
10
  Input,
13
11
  message,
14
12
  Modal,
@@ -17,10 +15,11 @@ import {
17
15
  Space,
18
16
  Spin,
19
17
  Tag,
20
- Typography,
18
+ Tooltip,
21
19
  } from 'antd';
22
20
  import {
23
- ArrowLeftOutlined,
21
+ ApartmentOutlined,
22
+ CodeOutlined,
24
23
  CopyOutlined,
25
24
  DiffOutlined,
26
25
  EditOutlined,
@@ -32,37 +31,64 @@ import { useNavigate, useParams } from 'react-router-dom';
32
31
  import ReactDiffViewer, { DiffMethod } from 'react-diff-viewer-continued';
33
32
  import { customRequest } from 'helpers/http';
34
33
  import { FlowRenderer } from './components/FlowRenderer';
34
+ import { ReadonlyNodePanel } from './components/ReadonlyNodePanel';
35
+ import { WorkflowWorkspaceHeader } from './components/WorkflowWorkspaceHeader';
35
36
  import { DslView, type DslViewHandle } from './components/DslView';
36
37
  import { RunWorkflowModal } from './components/RunWorkflowModal';
37
38
  import { resolveWorkflowDisplay } from './utils/resolveWorkflowDisplay';
39
+ import { workflowPublishErrorMessage } from './utils/workflowPublishError';
40
+ import { buildWorkflowSkillPrompt } from './utils/workflowSkillPrompt';
41
+ import { useReferencedNodeInstanceConfigs } from './hooks/useReferencedNodeInstanceConfigs';
38
42
  import type {
39
43
  Workflow,
40
44
  WorkflowDSL,
41
45
  WorkflowNodeType,
42
46
  WorkflowVersion,
43
47
  } from './types';
44
-
45
- const { Title } = Typography;
48
+ import { useTranslation } from 'react-i18next';
49
+ import './workflow-ui.css';
46
50
 
47
51
  const STATUS_COLOR: Record<string, string> = {
48
52
  DRAFT: 'default',
49
53
  PUBLISHED: 'success',
54
+ DELETING: 'warning',
55
+ };
56
+
57
+ const SCHEDULE_STATUS_COLOR: Record<string, string> = {
58
+ ACTIVE: 'success',
59
+ PAUSED: 'default',
60
+ MISSING: 'error',
61
+ UNAVAILABLE: 'warning',
50
62
  };
51
63
 
52
64
  import { useIsAgentAllowed } from 'config/agentAllowed';
53
65
 
54
66
  export default function WorkflowShowPage() {
67
+ const { t } = useTranslation('workflow');
55
68
  const { id } = useParams<{ id: string }>();
56
69
  const navigate = useNavigate();
57
70
 
58
71
  const [workflow, setWorkflow] = useState<Workflow | null>(null);
59
72
  const [versions, setVersions] = useState<WorkflowVersion[]>([]);
60
73
  const [nodeTypes, setNodeTypes] = useState<WorkflowNodeType[]>([]);
74
+ const [nodeTypesError, setNodeTypesError] = useState(false);
61
75
  const [loading, setLoading] = useState(true);
62
76
  const isDev = useIsAgentAllowed();
63
77
 
64
78
  const [dsl, setDsl] = useState<WorkflowDSL | null>(null);
65
79
  const [currentVersion, setCurrentVersion] = useState<number | null>(null);
80
+ const viewingDraft =
81
+ Boolean(workflow?.hasUnpublishedChanges) && currentVersion === null;
82
+ const hasDraftToPublish = Boolean(
83
+ workflow?.hasUnpublishedChanges && workflow.dsl,
84
+ );
85
+ const isDeleting = workflow?.status === 'DELETING';
86
+ const isManualWorkflow = Boolean(
87
+ dsl?.nodes.some((node) => node.type === 'manual_trigger'),
88
+ );
89
+ const referencedNodeConfigs = useReferencedNodeInstanceConfigs(
90
+ viewingDraft ? dsl : null,
91
+ );
66
92
  const [viewMode, setViewMode] = useState<'canvas' | 'dsl'>('canvas');
67
93
  const dslViewRef = useRef<DslViewHandle>(null);
68
94
 
@@ -99,15 +125,33 @@ export default function WorkflowShowPage() {
99
125
 
100
126
  const selectedNode = useMemo(() => {
101
127
  if (!selectedNodeId || !dsl) return null;
102
- return dsl.nodes.find((n) => n.id === selectedNodeId) || null;
103
- }, [selectedNodeId, dsl]);
128
+ const node = dsl.nodes.find((item) => item.id === selectedNodeId) || null;
129
+ if (!node || !viewingDraft || !node.instanceRef) return node;
130
+ const config =
131
+ node.configOverride ??
132
+ referencedNodeConfigs.configs[node.instanceRef.instanceId] ??
133
+ node.config;
134
+ return { ...node, config };
135
+ }, [dsl, referencedNodeConfigs.configs, selectedNodeId, viewingDraft]);
104
136
 
105
- useEffect(() => {
106
- customRequest<WorkflowNodeType[]>('workflow-node-types', 'GET')
107
- .then(setNodeTypes)
108
- .catch(() => {});
137
+ const selectedNodeType = useMemo(
138
+ () => nodeTypes.find((nodeType) => nodeType.type === selectedNode?.type),
139
+ [nodeTypes, selectedNode?.type],
140
+ );
141
+
142
+ const loadNodeTypes = useCallback(async () => {
143
+ try {
144
+ setNodeTypes(
145
+ await customRequest<WorkflowNodeType[]>('workflow-node-types', 'GET'),
146
+ );
147
+ setNodeTypesError(false);
148
+ } catch {
149
+ setNodeTypesError(true);
150
+ }
109
151
  }, []);
110
152
 
153
+ useEffect(() => void loadNodeTypes(), [loadNodeTypes]);
154
+
111
155
  useEffect(() => {
112
156
  if (!id) return;
113
157
  setLoading(true);
@@ -133,6 +177,12 @@ export default function WorkflowShowPage() {
133
177
  const handleSelectVersion = useCallback(
134
178
  async (version: number) => {
135
179
  if (!id) return;
180
+ if (version === 0 && workflow?.dsl) {
181
+ setDsl(workflow.dsl);
182
+ setCurrentVersion(null);
183
+ setSelectedNodeId(null);
184
+ return;
185
+ }
136
186
  try {
137
187
  const v = await customRequest<WorkflowVersion>(
138
188
  `workflow/${id}/versions/${version}`,
@@ -144,7 +194,7 @@ export default function WorkflowShowPage() {
144
194
  message.error(e?.message ?? 'Failed to load version');
145
195
  }
146
196
  },
147
- [id],
197
+ [id, workflow?.dsl],
148
198
  );
149
199
 
150
200
  const handleOpenDiff = useCallback(() => {
@@ -191,6 +241,14 @@ export default function WorkflowShowPage() {
191
241
 
192
242
  const handlePublish = useCallback(async () => {
193
243
  if (!id) return;
244
+ if (referencedNodeConfigs.status !== 'ready') {
245
+ message.error(
246
+ referencedNodeConfigs.status === 'error'
247
+ ? t('editor.templateConfigLoadFailedHint')
248
+ : t('editor.templateConfigLoading'),
249
+ );
250
+ return;
251
+ }
194
252
  setPublishLoading(true);
195
253
  try {
196
254
  await customRequest(`workflow/${id}/publish`, 'POST', {
@@ -210,18 +268,26 @@ export default function WorkflowShowPage() {
210
268
  setDsl(display.dsl);
211
269
  setCurrentVersion(display.version);
212
270
  } catch (e: any) {
213
- message.error(e?.message ?? 'Failed to publish workflow');
271
+ message.error(
272
+ workflowPublishErrorMessage(e, t('list.publishFailedHint')),
273
+ 8,
274
+ );
214
275
  } finally {
215
276
  setPublishLoading(false);
216
277
  }
217
- }, [id, publishSummary]);
278
+ }, [id, publishSummary, referencedNodeConfigs.status, t]);
218
279
 
219
280
  const handleAiExplainDiff = useCallback(() => {
220
281
  if (!diffLeftDsl || !diffRightDsl) {
221
282
  message.warning('请先选择两个版本');
222
283
  return;
223
284
  }
224
- const prompt = `请对比以下两个版本的 Workflow DSL JSON,用中文解读主要变更内容(新增/删除/修改了哪些节点、连线、配置等)。
285
+ const skillContext = buildWorkflowSkillPrompt(
286
+ nodeTypes.map((nodeType) => nodeType.type),
287
+ );
288
+ const prompt = `${skillContext}
289
+
290
+ 请对比以下两个版本的 Workflow DSL JSON,用中文解读主要变更内容(新增/删除/修改了哪些节点、连线、配置等)。
225
291
 
226
292
  版本 v${diffLeft}(旧):
227
293
  \`\`\`json
@@ -240,7 +306,7 @@ ${diffRightDsl}
240
306
  '*',
241
307
  );
242
308
  message.success('已发送给 AI,请到右侧的Coding Agent对话窗口查看结果');
243
- }, [diffLeftDsl, diffRightDsl, diffLeft, diffRight]);
309
+ }, [diffLeftDsl, diffRightDsl, diffLeft, diffRight, nodeTypes]);
244
310
 
245
311
  if (loading) {
246
312
  return (
@@ -258,50 +324,55 @@ ${diffRightDsl}
258
324
  }
259
325
 
260
326
  return (
261
- <div
262
- style={{
263
- height: 'calc(100vh - 96px)',
264
- display: 'flex',
265
- flexDirection: 'column',
266
- background: 'var(--ant-color-bg-layout)',
267
- overflow: 'hidden',
268
- }}
269
- >
270
- {/* Header */}
271
- <Card style={{ marginBottom: 16, flexShrink: 0 }}>
272
- <div
273
- style={{
274
- display: 'flex',
275
- justifyContent: 'space-between',
276
- alignItems: 'center',
277
- }}
278
- >
279
- <Space>
280
- <Button
281
- type="text"
282
- icon={<ArrowLeftOutlined />}
283
- onClick={() => navigate('/admin/workflow')}
284
- ></Button>
285
- <Title level={4} style={{ margin: 0 }}>
286
- {workflow?.name || 'Workflow'}
287
- </Title>
288
- {workflow?.status && (
289
- <Tag color={STATUS_COLOR[workflow.status]}>{workflow.status}</Tag>
290
- )}
291
- </Space>
292
- <Space>
327
+ <div className="workflow-workspace">
328
+ <WorkflowWorkspaceHeader
329
+ eyebrow={t('viewer.workspaceEyebrow')}
330
+ title={workflow?.name || 'Workflow'}
331
+ status={
332
+ workflow?.status ? (
333
+ <Space size={4}>
334
+ <Tag color={STATUS_COLOR[workflow.status]}>
335
+ {t(`workflowStatus.${workflow.status.toLowerCase()}`, {
336
+ defaultValue: workflow.status,
337
+ })}
338
+ </Tag>
339
+ {workflow.scheduleStatus &&
340
+ workflow.scheduleStatus !== 'NOT_APPLICABLE' && (
341
+ <Tag color={SCHEDULE_STATUS_COLOR[workflow.scheduleStatus]}>
342
+ {t(
343
+ `viewer.scheduleStatus.${workflow.scheduleStatus.toLowerCase()}`,
344
+ )}
345
+ </Tag>
346
+ )}
347
+ </Space>
348
+ ) : null
349
+ }
350
+ onBack={() => navigate('/admin/workflow')}
351
+ backLabel={t('common.back')}
352
+ actions={
353
+ <Space wrap={false}>
293
354
  {versions.length > 0 && (
294
355
  <Select
295
- value={currentVersion ?? undefined}
356
+ value={viewingDraft ? 0 : (currentVersion ?? undefined)}
296
357
  onChange={handleSelectVersion}
297
358
  style={{ width: 200 }}
298
359
  placeholder={
299
- workflow?.status === 'DRAFT' ? 'Saved draft' : '选择版本'
360
+ workflow?.hasUnpublishedChanges ? 'Saved draft' : '选择版本'
300
361
  }
301
- options={versions.map((v) => ({
302
- label: `v${v.version} - ${v.changeSummary?.slice(0, 20) || 'Saved'}`,
303
- value: v.version,
304
- }))}
362
+ options={[
363
+ ...(workflow?.hasUnpublishedChanges && workflow.dsl
364
+ ? [
365
+ {
366
+ label: t('viewer.savedDraft'),
367
+ value: 0,
368
+ },
369
+ ]
370
+ : []),
371
+ ...versions.map((v) => ({
372
+ label: `v${v.version} - ${v.changeSummary?.slice(0, 20) || 'Saved'}`,
373
+ value: v.version,
374
+ })),
375
+ ]}
305
376
  />
306
377
  )}
307
378
  <Button
@@ -309,138 +380,164 @@ ${diffRightDsl}
309
380
  onClick={handleOpenDiff}
310
381
  disabled={versions.length < 2}
311
382
  >
312
- Diff
383
+ {t('viewer.compareVersions')}
313
384
  </Button>
314
- {workflow?.status === 'DRAFT' && (
315
- <Button
316
- icon={<SendOutlined />}
317
- onClick={() => setPublishModalOpen(true)}
318
- >
319
- Publish
320
- </Button>
321
- )}
322
- {workflow?.status === 'PUBLISHED' && workflow?.isEnabled && (
323
- <RunWorkflowModal
324
- workflowId={id!}
325
- workflowName={workflow.name}
326
- onSuccess={(instanceId) =>
327
- navigate(`/admin/workflow/instance/show/${instanceId}`)
328
- }
329
- />
330
- )}
385
+ <Tooltip
386
+ title={
387
+ !hasDraftToPublish
388
+ ? t('viewer.noChangesToPublish')
389
+ : !viewingDraft
390
+ ? t('viewer.publishSavedDraft')
391
+ : undefined
392
+ }
393
+ >
394
+ <span>
395
+ <Button
396
+ icon={<SendOutlined />}
397
+ onClick={() => setPublishModalOpen(true)}
398
+ disabled={
399
+ !hasDraftToPublish ||
400
+ isDeleting ||
401
+ referencedNodeConfigs.status !== 'ready'
402
+ }
403
+ >
404
+ {t('list.publish')}
405
+ </Button>
406
+ </span>
407
+ </Tooltip>
408
+ {workflow?.status === 'PUBLISHED' &&
409
+ workflow?.isEnabled &&
410
+ !viewingDraft &&
411
+ isManualWorkflow && (
412
+ <RunWorkflowModal
413
+ workflowCode={workflow.code}
414
+ workflowName={workflow.name}
415
+ onSuccess={(instanceId) =>
416
+ navigate(`/admin/workflow/instance/show/${instanceId}`)
417
+ }
418
+ />
419
+ )}
331
420
  <Button
332
421
  icon={<HistoryOutlined />}
333
422
  onClick={() => navigate(`/admin/workflow/instances/show/${id}`)}
334
423
  >
335
- History
424
+ {t('list.runHistory')}
336
425
  </Button>
337
426
  <Button
338
427
  type="primary"
339
428
  icon={<EditOutlined />}
340
- onClick={() => navigate(`/admin/workflow/edit/${id}`)}
429
+ disabled={isDeleting}
430
+ onClick={() =>
431
+ navigate(
432
+ currentVersion === null
433
+ ? `/admin/workflow/edit/${id}`
434
+ : `/admin/workflow/edit/${id}?version=${currentVersion}`,
435
+ )
436
+ }
341
437
  >
342
- Edit
438
+ {t('common.edit')}
343
439
  </Button>
344
440
  </Space>
345
- </div>
346
- </Card>
441
+ }
442
+ />
347
443
 
348
444
  {/* View toggle row + DSL actions */}
349
- <div
350
- style={{
351
- marginBottom: 12,
352
- flexShrink: 0,
353
- display: 'flex',
354
- alignItems: 'center',
355
- justifyContent: 'space-between',
356
- }}
357
- >
358
- <Segmented
359
- value={viewMode}
360
- onChange={(v) => setViewMode(v as 'canvas' | 'dsl')}
361
- options={[
362
- { label: '画布', value: 'canvas' },
363
- { label: 'DSL', value: 'dsl' },
364
- ]}
365
- />
366
- {viewMode === 'dsl' && (
367
- <Button
368
- icon={<CopyOutlined />}
369
- onClick={() => dslViewRef.current?.copy()}
370
- >
371
- Copy
372
- </Button>
373
- )}
445
+ <div className="workflow-workspace__toolbar">
446
+ <div className="workflow-workspace__view-switcher">
447
+ <Segmented
448
+ className="workflow-workspace__segmented"
449
+ aria-label={t('editor.viewMode')}
450
+ value={viewMode}
451
+ onChange={(v) => setViewMode(v as 'canvas' | 'dsl')}
452
+ options={[
453
+ {
454
+ label: t('editor.canvas'),
455
+ value: 'canvas',
456
+ icon: <ApartmentOutlined />,
457
+ },
458
+ {
459
+ label: t('editor.dsl'),
460
+ value: 'dsl',
461
+ icon: <CodeOutlined />,
462
+ },
463
+ ]}
464
+ />
465
+ </div>
466
+ <Space className="workflow-workspace__toolbar-actions" size={8}>
467
+ {nodeTypesError && (
468
+ <span className="workflow-inline-error">
469
+ {t('editor.nodeTypesLoadFailed')}{' '}
470
+ <Button type="link" size="small" onClick={loadNodeTypes}>
471
+ {t('common.retry')}
472
+ </Button>
473
+ </span>
474
+ )}
475
+ {viewingDraft && referencedNodeConfigs.status === 'loading' && (
476
+ <span className="workflow-template-sync-state">
477
+ <Spin size="small" />
478
+ {t('editor.templateConfigLoading')}
479
+ </span>
480
+ )}
481
+ {viewingDraft && referencedNodeConfigs.status === 'error' && (
482
+ <span className="workflow-inline-error">
483
+ {t('editor.templateConfigLoadFailed')}{' '}
484
+ <Button
485
+ type="link"
486
+ size="small"
487
+ onClick={referencedNodeConfigs.retry}
488
+ >
489
+ {t('common.retry')}
490
+ </Button>
491
+ </span>
492
+ )}
493
+ {viewMode === 'dsl' && (
494
+ <Button
495
+ className="workflow-workspace__toolbar-action"
496
+ type="text"
497
+ icon={<CopyOutlined />}
498
+ onClick={() => dslViewRef.current?.copy()}
499
+ >
500
+ {t('viewer.copyDsl')}
501
+ </Button>
502
+ )}
503
+ </Space>
374
504
  </div>
375
505
 
376
506
  {/* Canvas + Node Detail Panel */}
377
- <div style={{ flex: 1, display: 'flex', minHeight: 0 }}>
507
+ <div className="workflow-workspace__body">
378
508
  {viewMode === 'canvas' ? (
379
509
  <>
380
- <div style={{ flex: 1, position: 'relative' }}>
510
+ <div className="workflow-workspace__canvas">
381
511
  <FlowRenderer
382
512
  dsl={dsl}
383
513
  nodeTypeMap={nodeTypeMap}
384
514
  selectedNodeId={selectedNodeId}
385
515
  readonly
516
+ fitViewOnLoad
517
+ referencedConfigs={
518
+ viewingDraft ? referencedNodeConfigs.configs : undefined
519
+ }
520
+ referencedConfigStatus={
521
+ viewingDraft ? referencedNodeConfigs.status : 'ready'
522
+ }
523
+ onRetryReferencedConfigs={
524
+ viewingDraft ? referencedNodeConfigs.retry : undefined
525
+ }
386
526
  onNodeClick={(nodeId) => setSelectedNodeId(nodeId || null)}
387
527
  />
388
528
  </div>
389
- {selectedNode && (
390
- <div
391
- style={{
392
- width: 320,
393
- flexShrink: 0,
394
- borderLeft: '1px solid var(--ant-color-border-secondary)',
395
- background: 'var(--ant-color-bg-container)',
396
- overflowY: 'auto',
397
- padding: 16,
398
- }}
399
- >
400
- <Title level={5} style={{ marginTop: 0 }}>
401
- {selectedNode.label}
402
- </Title>
403
- <Descriptions column={1} size="small" bordered>
404
- <Descriptions.Item label="ID">
405
- <Typography.Text copyable style={{ fontSize: 12 }}>
406
- {selectedNode.id}
407
- </Typography.Text>
408
- </Descriptions.Item>
409
- <Descriptions.Item label="类型">
410
- {selectedNode.type}
411
- </Descriptions.Item>
412
- <Descriptions.Item label="分类">
413
- <Tag>
414
- {nodeTypeMap[selectedNode.type]?.category || 'ACTION'}
415
- </Tag>
416
- </Descriptions.Item>
417
- {selectedNode.instanceRef && (
418
- <Descriptions.Item label="节点实例">
419
- {selectedNode.instanceRef.instanceCode}
420
- </Descriptions.Item>
421
- )}
422
- </Descriptions>
423
- {selectedNode.config &&
424
- Object.keys(selectedNode.config).length > 0 && (
425
- <>
426
- <Title level={5} style={{ marginTop: 16 }}>
427
- 配置
428
- </Title>
429
- <Descriptions column={1} size="small" bordered>
430
- {Object.entries(selectedNode.config).map(
431
- ([key, value]) => (
432
- <Descriptions.Item key={key} label={key}>
433
- {typeof value === 'object'
434
- ? JSON.stringify(value, null, 2)
435
- : String(value ?? '')}
436
- </Descriptions.Item>
437
- ),
438
- )}
439
- </Descriptions>
440
- </>
441
- )}
442
- </div>
443
- )}
529
+ {selectedNode &&
530
+ (!viewingDraft || referencedNodeConfigs.status === 'ready') && (
531
+ <ReadonlyNodePanel
532
+ key={selectedNode.id}
533
+ node={selectedNode}
534
+ nodeType={selectedNodeType}
535
+ nodes={dsl?.nodes ?? []}
536
+ edges={dsl?.edges ?? []}
537
+ nodeTypes={nodeTypes}
538
+ currentWorkflowId={id}
539
+ />
540
+ )}
444
541
  </>
445
542
  ) : (
446
543
  <DslView ref={dslViewRef} dsl={dsl} readonly />
@@ -449,7 +546,7 @@ ${diffRightDsl}
449
546
 
450
547
  {/* Diff Modal */}
451
548
  <Modal
452
- title="版本对比"
549
+ title={t('viewer.versionComparison')}
453
550
  open={diffModalOpen}
454
551
  onCancel={() => setDiffModalOpen(false)}
455
552
  footer={null}
@@ -461,7 +558,7 @@ ${diffRightDsl}
461
558
  value={diffLeft}
462
559
  onChange={(v) => setDiffLeft(v)}
463
560
  style={{ width: 200 }}
464
- placeholder="选择左侧版本"
561
+ placeholder={t('viewer.selectOlderVersion')}
465
562
  options={versions.map((v) => ({
466
563
  label: `v${v.version} - ${v.changeSummary?.slice(0, 20) || 'Saved'}`,
467
564
  value: v.version,
@@ -472,7 +569,7 @@ ${diffRightDsl}
472
569
  value={diffRight}
473
570
  onChange={(v) => setDiffRight(v)}
474
571
  style={{ width: 200 }}
475
- placeholder="选择右侧版本"
572
+ placeholder={t('viewer.selectNewerVersion')}
476
573
  options={versions.map((v) => ({
477
574
  label: `v${v.version} - ${v.changeSummary?.slice(0, 20) || 'Saved'}`,
478
575
  value: v.version,
@@ -485,7 +582,7 @@ ${diffRightDsl}
485
582
  onClick={handleAiExplainDiff}
486
583
  disabled={!diffLeftDsl || !diffRightDsl}
487
584
  >
488
- AI 解读
585
+ {t('viewer.aiExplain')}
489
586
  </Button>
490
587
  )}
491
588
  </Space>
@@ -507,16 +604,16 @@ ${diffRightDsl}
507
604
 
508
605
  {/* Publish Modal */}
509
606
  <Modal
510
- title="Publish Workflow"
607
+ title={t('list.publishTitle')}
511
608
  open={publishModalOpen}
512
609
  onCancel={() => setPublishModalOpen(false)}
513
610
  onOk={handlePublish}
514
611
  confirmLoading={publishLoading}
515
- okText="Publish"
612
+ okText={t('list.publish')}
516
613
  >
517
614
  <Input.TextArea
518
615
  rows={3}
519
- placeholder="Version description (changeSummary)"
616
+ placeholder={t('list.publishPlaceholder')}
520
617
  value={publishSummary}
521
618
  onChange={(e) => setPublishSummary(e.target.value)}
522
619
  />
@@ -31,6 +31,8 @@ import { HEADER_CARD_PROPS, PAGE_WRAPPER_STYLE } from 'constants/layout';
31
31
  import { customRequest } from 'helpers/http';
32
32
  import { useCallback, useEffect, useState } from 'react';
33
33
  import { useNavigate } from 'react-router-dom';
34
+ import '../workflow-ui.css';
35
+ import { useWorkflowFormValidation } from '../useWorkflowFormValidation';
34
36
 
35
37
  const { Paragraph, Text, Title } = Typography;
36
38
 
@@ -107,7 +109,7 @@ function SensitiveValue({
107
109
  whiteSpace: 'normal',
108
110
  }}
109
111
  >
110
- {visible ? value : maskedValue ?? maskSecret(value)}
112
+ {visible ? value : (maskedValue ?? maskSecret(value))}
111
113
  </Text>
112
114
  <Button
113
115
  type="text"
@@ -123,6 +125,7 @@ function SensitiveValue({
123
125
  export default function TemporalTenantPage() {
124
126
  const navigate = useNavigate();
125
127
  const [form] = Form.useForm<TenantConfigFormValues>();
128
+ const formValidation = useWorkflowFormValidation();
126
129
  const { token } = theme.useToken();
127
130
  const { data: identity } = useGetIdentity<any>();
128
131
  const isAdmin = (identity?.configPerms?.roles || []).includes('SYSTEM_ADMIN');
@@ -267,7 +270,7 @@ export default function TemporalTenantPage() {
267
270
  }
268
271
 
269
272
  return (
270
- <div style={PAGE_WRAPPER_STYLE}>
273
+ <div className="workflow-page-stack" style={PAGE_WRAPPER_STYLE}>
271
274
  <Card {...HEADER_CARD_PROPS}>
272
275
  <div
273
276
  style={{
@@ -429,13 +432,6 @@ export default function TemporalTenantPage() {
429
432
  />
430
433
  </Descriptions.Item>
431
434
  </Descriptions>
432
-
433
- <Alert
434
- type="info"
435
- showIcon
436
- message="保存修改后,Temporal Worker 会自动加载本 GAdmin 的最新连接配置。"
437
- style={{ marginTop: 20 }}
438
- />
439
435
  </>
440
436
  ) : (
441
437
  <Empty
@@ -511,6 +507,7 @@ export default function TemporalTenantPage() {
511
507
  layout="vertical"
512
508
  onFinish={handleSave}
513
509
  requiredMark="optional"
510
+ {...formValidation}
514
511
  >
515
512
  <Title level={5}>Temporal 管理连接</Title>
516
513
  <Form.Item