@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
@@ -0,0 +1,71 @@
1
+ import { fireEvent, render, screen, waitFor } from '@testing-library/react';
2
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
3
+ import { startWorkflowAction } from 'helpers/workflowAction';
4
+ import { WorkflowActionButton } from './WorkflowActionButton';
5
+
6
+ vi.mock('helpers/workflowAction', () => ({
7
+ startWorkflowAction: vi.fn(),
8
+ }));
9
+
10
+ vi.mock('antd', () => {
11
+ return {
12
+ Button: ({ children, loading, onClick, disabled }: any) => (
13
+ <button disabled={loading || disabled} onClick={onClick}>
14
+ {children}
15
+ </button>
16
+ ),
17
+ message: { success: vi.fn(), error: vi.fn() },
18
+ };
19
+ });
20
+
21
+ describe('WorkflowActionButton', () => {
22
+ beforeEach(() => {
23
+ vi.clearAllMocks();
24
+ vi.stubGlobal('crypto', {
25
+ randomUUID: vi
26
+ .fn()
27
+ .mockReturnValueOnce('request-key-1')
28
+ .mockReturnValueOnce('request-key-2'),
29
+ });
30
+ });
31
+
32
+ it('reuses the same key when retrying the same failed action', async () => {
33
+ vi.mocked(startWorkflowAction)
34
+ .mockRejectedValueOnce(new Error('network failed'))
35
+ .mockResolvedValueOnce({
36
+ instanceId: '21',
37
+ status: 'PENDING',
38
+ });
39
+
40
+ render(
41
+ <WorkflowActionButton
42
+ workflowCode="approve-order"
43
+ workflowData={{ orderId: 'O-1' }}
44
+ >
45
+ 提交审批
46
+ </WorkflowActionButton>,
47
+ );
48
+
49
+ fireEvent.click(screen.getByRole('button', { name: '提交审批' }));
50
+ await waitFor(() => expect(startWorkflowAction).toHaveBeenCalledTimes(1));
51
+ await waitFor(() =>
52
+ expect(screen.getByRole('button', { name: '提交审批' })).toBeEnabled(),
53
+ );
54
+
55
+ fireEvent.click(screen.getByRole('button', { name: '提交审批' }));
56
+ await waitFor(() => expect(startWorkflowAction).toHaveBeenCalledTimes(2));
57
+
58
+ expect(startWorkflowAction).toHaveBeenNthCalledWith(
59
+ 1,
60
+ 'approve-order',
61
+ { orderId: 'O-1' },
62
+ 'request-key-1',
63
+ );
64
+ expect(startWorkflowAction).toHaveBeenNthCalledWith(
65
+ 2,
66
+ 'approve-order',
67
+ { orderId: 'O-1' },
68
+ 'request-key-1',
69
+ );
70
+ });
71
+ });
@@ -0,0 +1,89 @@
1
+ import { Button, message } from 'antd';
2
+ import type { ButtonProps } from 'antd';
3
+ import { useRef, useState } from 'react';
4
+ import {
5
+ startWorkflowAction,
6
+ type WorkflowActionResult,
7
+ } from 'helpers/workflowAction';
8
+
9
+ export interface WorkflowActionButtonProps extends Omit<
10
+ ButtonProps,
11
+ 'loading' | 'onClick'
12
+ > {
13
+ workflowCode: string;
14
+ workflowData:
15
+ | Record<string, unknown>
16
+ | (() => Record<string, unknown> | Promise<Record<string, unknown>>);
17
+ onStarted?: (result: WorkflowActionResult) => void;
18
+ successMessage?: string;
19
+ }
20
+
21
+ export function WorkflowActionButton({
22
+ workflowCode,
23
+ workflowData,
24
+ onStarted,
25
+ successMessage = '操作已提交',
26
+ children = '执行',
27
+ ...buttonProps
28
+ }: WorkflowActionButtonProps) {
29
+ const [loading, setLoading] = useState(false);
30
+ const inFlightRef = useRef(false);
31
+ const retryRef = useRef<{
32
+ input: string;
33
+ idempotencyKey: string;
34
+ } | null>(null);
35
+
36
+ const execute = async () => {
37
+ if (inFlightRef.current) return;
38
+ inFlightRef.current = true;
39
+ setLoading(true);
40
+ try {
41
+ const data =
42
+ typeof workflowData === 'function'
43
+ ? await workflowData()
44
+ : workflowData;
45
+ const input = stableJson(data);
46
+ const idempotencyKey =
47
+ retryRef.current?.input === input
48
+ ? retryRef.current.idempotencyKey
49
+ : crypto.randomUUID();
50
+ retryRef.current = { input, idempotencyKey };
51
+
52
+ const result = await startWorkflowAction(
53
+ workflowCode,
54
+ data,
55
+ idempotencyKey,
56
+ );
57
+ retryRef.current = null;
58
+ message.success(successMessage);
59
+ onStarted?.(result);
60
+ } catch (error: any) {
61
+ message.error(error?.message || '操作失败,请重试');
62
+ } finally {
63
+ inFlightRef.current = false;
64
+ setLoading(false);
65
+ }
66
+ };
67
+
68
+ return (
69
+ <Button type="primary" {...buttonProps} loading={loading} onClick={execute}>
70
+ {children}
71
+ </Button>
72
+ );
73
+ }
74
+
75
+ function stableJson(value: unknown): string {
76
+ if (Array.isArray(value)) return `[${value.map(stableJson).join(',')}]`;
77
+ if (value && typeof value === 'object') {
78
+ return `{${Object.keys(value as Record<string, unknown>)
79
+ .sort()
80
+ .map(
81
+ (key) =>
82
+ `${JSON.stringify(key)}:${stableJson(
83
+ (value as Record<string, unknown>)[key],
84
+ )}`,
85
+ )
86
+ .join(',')}}`;
87
+ }
88
+ return JSON.stringify(value) ?? 'null';
89
+ }
@@ -7,3 +7,4 @@ export * from './custom-avatar';
7
7
  export * from './pagination-total';
8
8
  export * from './tags';
9
9
  export * from './text';
10
+ export * from './WorkflowActionButton';
@@ -1,5 +1,10 @@
1
1
  import React, { useMemo, useState } from 'react';
2
- import { useGetLocale, useSetLocale, useGetIdentity } from '@refinedev/core';
2
+ import {
3
+ useGetLocale,
4
+ useSetLocale,
5
+ useGetIdentity,
6
+ useLogout,
7
+ } from '@refinedev/core';
3
8
  import {
4
9
  Layout,
5
10
  Space,
@@ -9,7 +14,11 @@ import {
9
14
  Typography,
10
15
  theme,
11
16
  } from 'antd';
12
- import { DownOutlined, SettingOutlined } from '@ant-design/icons';
17
+ import {
18
+ DownOutlined,
19
+ LogoutOutlined,
20
+ SettingOutlined,
21
+ } from '@ant-design/icons';
13
22
  import { useTranslation } from 'react-i18next';
14
23
  import type { MenuProps } from 'antd';
15
24
  import { agentAttrs } from 'components/agentPanel/agentAttributes';
@@ -35,6 +44,7 @@ export const HeaderActions: React.FC = () => {
35
44
  const changeLanguage = useSetLocale();
36
45
  const { token } = useToken();
37
46
  const { data: user } = useGetIdentity<IUser>();
47
+ const { mutate: logout } = useLogout();
38
48
  const [settingsOpen, setSettingsOpen] = useState(false);
39
49
 
40
50
  const currentLocale = locale();
@@ -59,17 +69,37 @@ export const HeaderActions: React.FC = () => {
59
69
 
60
70
  const currentLanguageLabel = currentLocale === 'en' ? 'English' : '中文';
61
71
 
72
+ const userMenu = useMemo<MenuProps>(
73
+ () => ({
74
+ items: [
75
+ // 外观设置为 dev 专属功能,prod 不展示该项
76
+ ...(import.meta.env.DEV
77
+ ? [
78
+ {
79
+ key: 'appearance',
80
+ icon: <SettingOutlined />,
81
+ label: t('header.settings', 'Appearance'),
82
+ },
83
+ { type: 'divider' as const },
84
+ ]
85
+ : []),
86
+ {
87
+ key: 'logout',
88
+ icon: <LogoutOutlined />,
89
+ danger: true,
90
+ label: t('buttons.logout', 'Logout'),
91
+ },
92
+ ],
93
+ onClick: ({ key }) => {
94
+ if (key === 'appearance') setSettingsOpen(true);
95
+ if (key === 'logout') logout();
96
+ },
97
+ }),
98
+ [t, logout],
99
+ );
100
+
62
101
  return (
63
102
  <>
64
- {import.meta.env.DEV && (
65
- <Button
66
- type="text"
67
- icon={<SettingOutlined />}
68
- aria-label={t('header.settings', 'Appearance')}
69
- onClick={() => setSettingsOpen(true)}
70
- />
71
- )}
72
-
73
103
  <Dropdown
74
104
  menu={langMenu}
75
105
  placement="bottomRight"
@@ -97,7 +127,17 @@ export const HeaderActions: React.FC = () => {
97
127
  <Space size="middle" style={{ marginLeft: 16 }}>
98
128
  {user?.name && <Text strong>{user.name}</Text>}
99
129
  {user?.avatar && (
100
- <Avatar src={user.avatar} alt={user?.name ?? 'User avatar'} />
130
+ <Dropdown
131
+ menu={userMenu}
132
+ placement="bottomRight"
133
+ trigger={['hover', 'click']}
134
+ >
135
+ <Avatar
136
+ src={user.avatar}
137
+ alt={user?.name ?? 'User avatar'}
138
+ style={{ cursor: 'pointer' }}
139
+ />
140
+ </Dropdown>
101
141
  )}
102
142
  </Space>
103
143
  )}
@@ -373,6 +373,18 @@ export const routeRegistry: Record<string, RouteEntry> = {
373
373
  () => import('routes/workflow/connections'),
374
374
  ),
375
375
  },
376
+ workflow_event_catalog: {
377
+ path: 'business-events',
378
+ component: lazyWithReload(
379
+ () => import('routes/workflow/business-events'),
380
+ ),
381
+ },
382
+ businessEventDetail: {
383
+ path: 'business-events/show/:registrationCode',
384
+ component: lazyWithReload(
385
+ () => import('routes/workflow/business-events/detail'),
386
+ ),
387
+ },
376
388
  approval_tasks: {
377
389
  path: 'approval-tasks',
378
390
  component: lazyWithReload(
@@ -49,10 +49,10 @@ export const PAGE_WRAPPER_STYLE = {
49
49
  /** 卡片纵向间距:每张内容卡自带 marginBottom: 16 */
50
50
  export const CARD_GAP_STYLE = { marginBottom: 16 } as const;
51
51
 
52
- /** Header Card:压扁的页面头部卡(配合 PageHeader 使用) */
52
+ /** Header Card:页面头部卡(纵向 padding 18px,与 Refine CRUD 页头高度对齐,约 64px) */
53
53
  export const HEADER_CARD_PROPS = {
54
54
  style: { marginBottom: 16 },
55
- styles: { body: { padding: '12px 24px' } },
55
+ styles: { body: { padding: '18px 24px' } },
56
56
  } as const;
57
57
 
58
58
  /** Search Card:压扁的搜索条卡(只有一行输入/筛选,不需要默认 24px 上下留白) */
@@ -1,4 +1,5 @@
1
1
  import React, { useState } from 'react';
2
+ import { useReferenceUpload } from 'hooks';
2
3
 
3
4
  interface Props {
4
5
  onConfirm: (prompt: string) => void;
@@ -64,36 +65,16 @@ export default function AddDataModal({ onConfirm, onCancel }: Props) {
64
65
  const [freeText, setFreeText] = useState('');
65
66
  const [answers, setAnswers] = useState<Record<string, string>>({});
66
67
  // ── 以文件为参考 ──
67
- const [refFile, setRefFile] = useState<File | null>(null);
68
- const [uploadedPath, setUploadedPath] = useState<string | null>(null);
69
- const [uploading, setUploading] = useState(false);
70
- const [uploadError, setUploadError] = useState<string | null>(null);
68
+ const {
69
+ file: refFile,
70
+ uploadedPath,
71
+ uploading,
72
+ error: uploadError,
73
+ select: selectRefFile,
74
+ upload: handleUpload,
75
+ } = useReferenceUpload();
71
76
  const [extraInfo, setExtraInfo] = useState('');
72
77
 
73
- async function handleUpload() {
74
- if (!refFile || uploading) return;
75
- setUploading(true);
76
- setUploadError(null);
77
- try {
78
- const resp = await fetch(
79
- `/dev-shell/upload-reference?filename=${encodeURIComponent(
80
- refFile.name,
81
- )}`,
82
- { method: 'POST', body: refFile },
83
- );
84
- const data = await resp.json().catch(() => ({}));
85
- if (!resp.ok || !data?.path) {
86
- throw new Error(data?.error || `上传失败(${resp.status})`);
87
- }
88
- setUploadedPath(data.path);
89
- } catch (err: any) {
90
- setUploadedPath(null);
91
- setUploadError(err?.message || '上传失败,请重试');
92
- } finally {
93
- setUploading(false);
94
- }
95
- }
96
-
97
78
  function handleConfirm() {
98
79
  if (activeTab === 'free') {
99
80
  const text = freeText.trim();
@@ -202,11 +183,7 @@ export default function AddDataModal({ onConfirm, onCancel }: Props) {
202
183
  type="file"
203
184
  accept=".csv,.xlsx,.xls"
204
185
  className="add-data-file-input"
205
- onChange={(e) => {
206
- setRefFile(e.target.files?.[0] ?? null);
207
- setUploadedPath(null);
208
- setUploadError(null);
209
- }}
186
+ onChange={(e) => selectRefFile(e.target.files?.[0] ?? null)}
210
187
  />
211
188
  <button
212
189
  className="add-data-btn-upload"
@@ -1,5 +1,6 @@
1
1
  import { findMany } from 'helpers/http';
2
2
  import { buildPageTree } from 'helpers/page-tree';
3
+ import { useReferenceUpload } from 'hooks';
3
4
  import React, { useEffect, useMemo, useState } from 'react';
4
5
  import { TreeSelect } from 'antd';
5
6
 
@@ -41,35 +42,15 @@ export default function AddPageModal({
41
42
  const [selectedRoles, setSelectedRoles] = useState<string[]>([]);
42
43
  const [loadError, setLoadError] = useState(false);
43
44
  // ── 页面参考图(可选,仅一张)──
44
- const [imgFile, setImgFile] = useState<File | null>(null);
45
- const [imgPreviewUrl, setImgPreviewUrl] = useState<string | null>(null);
46
- const [uploadedImgPath, setUploadedImgPath] = useState<string | null>(null);
47
- const [imgUploading, setImgUploading] = useState(false);
48
- const [imgUploadError, setImgUploadError] = useState<string | null>(null);
49
-
50
- async function handleImgUpload() {
51
- if (!imgFile || imgUploading) return;
52
- setImgUploading(true);
53
- setImgUploadError(null);
54
- try {
55
- const resp = await fetch(
56
- `/dev-shell/upload-reference?filename=${encodeURIComponent(
57
- imgFile.name,
58
- )}`,
59
- { method: 'POST', body: imgFile },
60
- );
61
- const data = await resp.json().catch(() => ({}));
62
- if (!resp.ok || !data?.path) {
63
- throw new Error(data?.error || `上传失败(${resp.status})`);
64
- }
65
- setUploadedImgPath(data.path);
66
- } catch (err: any) {
67
- setUploadedImgPath(null);
68
- setImgUploadError(err?.message || '上传失败,请重试');
69
- } finally {
70
- setImgUploading(false);
71
- }
72
- }
45
+ const {
46
+ file: imgFile,
47
+ previewUrl: imgPreviewUrl,
48
+ uploadedPath: uploadedImgPath,
49
+ uploading: imgUploading,
50
+ error: imgUploadError,
51
+ select: selectImgFile,
52
+ upload: handleImgUpload,
53
+ } = useReferenceUpload({ withPreview: true });
73
54
 
74
55
  const pageTreeData = useMemo(() => {
75
56
  const tree = buildPageTree(
@@ -300,14 +281,9 @@ export default function AddPageModal({
300
281
  type="file"
301
282
  accept=".png,.jpg,.jpeg,.webp,.gif"
302
283
  className="add-data-file-input"
303
- onChange={(e) => {
304
- const f = e.target.files?.[0] ?? null;
305
- setImgFile(f);
306
- setUploadedImgPath(null);
307
- setImgUploadError(null);
308
- if (imgPreviewUrl) URL.revokeObjectURL(imgPreviewUrl);
309
- setImgPreviewUrl(f ? URL.createObjectURL(f) : null);
310
- }}
284
+ onChange={(e) =>
285
+ selectImgFile(e.target.files?.[0] ?? null)
286
+ }
311
287
  />
312
288
  <button
313
289
  className="add-data-btn-upload"
@@ -53,7 +53,10 @@ function buildContextValue(ctx: PageContext | null): string | null {
53
53
  }
54
54
 
55
55
  const PAGE_CONTEXT_KEY = 'current-page';
56
- const AGENT_PANEL_WIDTH = 480;
56
+ const PANEL_WIDTH_KEY = 'gadmin-agent-panel-width';
57
+ const DEFAULT_PANEL_WIDTH = 480;
58
+ const MIN_PANEL_WIDTH = 360;
59
+ const maxPanelWidth = () => Math.floor(window.innerWidth * 0.6);
57
60
 
58
61
  export type ModalType =
59
62
  | 'addData'
@@ -86,6 +89,11 @@ function DevShellInner() {
86
89
  const sdkRef = useRef<any>(null);
87
90
 
88
91
  const [agentVisible, setAgentVisible] = useState(true);
92
+ const [panelWidth, setPanelWidth] = useState(() => {
93
+ const saved = Number(localStorage.getItem(PANEL_WIDTH_KEY));
94
+ return saved >= MIN_PANEL_WIDTH ? saved : DEFAULT_PANEL_WIDTH;
95
+ });
96
+ const [isResizing, setIsResizing] = useState(false);
89
97
  const [isInspecting, setIsInspecting] = useState(false);
90
98
  const [skillMenuOpen, setSkillMenuOpen] = useState(false);
91
99
  const [modal, setModal] = useState<ModalType>(null);
@@ -365,11 +373,35 @@ function DevShellInner() {
365
373
  return () => document.removeEventListener('keydown', handleKeyDown);
366
374
  }, [isInspecting]);
367
375
 
368
- const btnRight = agentVisible ? AGENT_PANEL_WIDTH + 12 : 12;
369
- const menuPopupRight = agentVisible ? AGENT_PANEL_WIDTH + 56 : 56;
370
- const iframeWidth = agentVisible
371
- ? `calc(100% - ${AGENT_PANEL_WIDTH}px)`
372
- : '100%';
376
+ // ── panel width resize ───────────────────────────────────────────────────
377
+ useEffect(() => {
378
+ if (!isResizing) return;
379
+ function handleMouseMove(e: MouseEvent) {
380
+ const w = Math.min(
381
+ Math.max(window.innerWidth - e.clientX, MIN_PANEL_WIDTH),
382
+ maxPanelWidth(),
383
+ );
384
+ setPanelWidth(w);
385
+ }
386
+ function handleMouseUp(e: MouseEvent) {
387
+ setIsResizing(false);
388
+ const w = Math.min(
389
+ Math.max(window.innerWidth - e.clientX, MIN_PANEL_WIDTH),
390
+ maxPanelWidth(),
391
+ );
392
+ localStorage.setItem(PANEL_WIDTH_KEY, String(w));
393
+ }
394
+ document.addEventListener('mousemove', handleMouseMove);
395
+ document.addEventListener('mouseup', handleMouseUp);
396
+ return () => {
397
+ document.removeEventListener('mousemove', handleMouseMove);
398
+ document.removeEventListener('mouseup', handleMouseUp);
399
+ };
400
+ }, [isResizing]);
401
+
402
+ const btnRight = agentVisible ? panelWidth + 12 : 12;
403
+ const menuPopupRight = agentVisible ? panelWidth + 56 : 56;
404
+ const iframeWidth = agentVisible ? `calc(100% - ${panelWidth}px)` : '100%';
373
405
 
374
406
  const getPageContext = () => pageContextRef.current;
375
407
 
@@ -381,7 +413,12 @@ function DevShellInner() {
381
413
  id="app-iframe"
382
414
  src="/app"
383
415
  title="Gadmin App"
384
- style={{ width: iframeWidth }}
416
+ style={{
417
+ width: iframeWidth,
418
+ // 拖拽时禁用过渡和 iframe 鼠标事件,避免拖影和 mousemove 被 iframe 吞掉
419
+ transition: isResizing ? 'none' : undefined,
420
+ pointerEvents: isResizing ? 'none' : undefined,
421
+ }}
385
422
  />
386
423
 
387
424
  {/* Agent panel */}
@@ -389,8 +426,19 @@ function DevShellInner() {
389
426
  ref={agentPanelRef}
390
427
  id="agent-panel"
391
428
  className={agentVisible ? 'visible' : ''}
429
+ style={{ width: panelWidth }}
392
430
  />
393
431
 
432
+ {/* Resize handle */}
433
+ {agentVisible && (
434
+ <div
435
+ id="agent-panel-resizer"
436
+ className={isResizing ? 'dragging' : ''}
437
+ style={{ right: panelWidth }}
438
+ onMouseDown={() => setIsResizing(true)}
439
+ />
440
+ )}
441
+
394
442
  {/* Toggle agent button */}
395
443
  <Tooltip title="Coding Agent" placement="left">
396
444
  <button
@@ -40,6 +40,20 @@ body {
40
40
  pointer-events: auto;
41
41
  }
42
42
 
43
+ #agent-panel-resizer {
44
+ position: fixed;
45
+ top: 0;
46
+ width: 6px;
47
+ height: 100vh;
48
+ cursor: col-resize;
49
+ z-index: 1001;
50
+ }
51
+
52
+ #agent-panel-resizer:hover,
53
+ #agent-panel-resizer.dragging {
54
+ background: rgba(22, 119, 255, 0.35);
55
+ }
56
+
43
57
  #toggle-btn {
44
58
  position: fixed;
45
59
  z-index: 9999;
@@ -98,6 +98,16 @@ export async function customRequest<T>(
98
98
  urlPath: string,
99
99
  method: string,
100
100
  params?: Record<string, any>,
101
+ options?: { headers?: Record<string, string> },
101
102
  ) {
103
+ if (options) {
104
+ const response = await axiosInstance.request<T>({
105
+ url: `${apiUrl}/${urlPath}`,
106
+ method,
107
+ ...(method.toLowerCase() === 'get' ? { params } : { data: params }),
108
+ headers: options.headers,
109
+ });
110
+ return response.data;
111
+ }
102
112
  return baseCustomRequest<T>(axiosInstance, apiUrl, urlPath, method, params);
103
113
  }
@@ -50,6 +50,7 @@ export function actionsToShowFlags(
50
50
  showExport: set.has('EXPORT'),
51
51
  showDetail: set.has('DETAIL'),
52
52
  showClone: set.has('CLONE'),
53
+ showHistory: set.has('HISTORY'),
53
54
  showImport: set.has('IMPORT'),
54
55
  showRefresh: set.has('REFRESH'),
55
56
  };
@@ -0,0 +1,19 @@
1
+ import { customRequest } from './http';
2
+
3
+ export interface WorkflowActionResult {
4
+ instanceId: string;
5
+ status: string;
6
+ }
7
+
8
+ export function startWorkflowAction(
9
+ workflowCode: string,
10
+ workflowData: Record<string, unknown>,
11
+ idempotencyKey: string,
12
+ ): Promise<WorkflowActionResult> {
13
+ return customRequest<WorkflowActionResult>(
14
+ `workflow/actions/${encodeURIComponent(workflowCode)}/execute`,
15
+ 'POST',
16
+ { workflow: workflowData },
17
+ { headers: { 'Idempotency-Key': idempotencyKey } },
18
+ );
19
+ }
@@ -5,3 +5,4 @@ export * from './useBatchDelete';
5
5
  export * from './useBatchOperations';
6
6
  export * from './useBatchOperationsCore';
7
7
  export * from './useListPageState';
8
+ export * from './useReferenceUpload';
@@ -44,7 +44,9 @@ export interface RowAction {
44
44
  | 'INSERT'
45
45
  | 'JUMP'
46
46
  | 'EDIT'
47
- | 'DETAIL';
47
+ | 'DETAIL'
48
+ | 'CLONE'
49
+ | 'HISTORY';
48
50
  desc: string;
49
51
  values?: Record<string, any>;
50
52
  when?: Record<string, any> | '*' | ((record: any) => boolean);
@@ -1,5 +1,4 @@
1
- import { useMemo, useRef } from 'react';
2
- import type { IResourceItem, ResourceProps } from '@refinedev/core';
1
+ import type { IResourceItem } from '@refinedev/core';
3
2
  import {
4
3
  DashboardOutlined,
5
4
  SettingOutlined,
@@ -7,8 +6,6 @@ import {
7
6
  BgColorsOutlined,
8
7
  ScheduleOutlined,
9
8
  ApartmentOutlined,
10
- SafetyOutlined,
11
- FileSearchOutlined,
12
9
  } from '@ant-design/icons';
13
10
  import { getRoutePath } from 'config/routeRegistry';
14
11
  import { useUserPageAccess } from './useUserPageAccess';
@@ -49,8 +46,6 @@ export const iconMapping: Record<string, React.ReactNode> = {
49
46
  canvas: <BgColorsOutlined />,
50
47
  agenda: <ScheduleOutlined />,
51
48
  workflow: <ApartmentOutlined />,
52
- permission: <SafetyOutlined />,
53
- audits: <FileSearchOutlined />,
54
49
  };
55
50
 
56
51
  // Pages whose children are tabs (not separate menu items)