@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
@@ -2,6 +2,7 @@ import React, { useCallback, useMemo, useState } from 'react';
2
2
  import {
3
3
  Button,
4
4
  Card,
5
+ Empty,
5
6
  Form,
6
7
  Input,
7
8
  Modal,
@@ -11,6 +12,12 @@ import {
11
12
  } from 'antd';
12
13
  import { ArrowLeftOutlined, RobotOutlined } from '@ant-design/icons';
13
14
  import type { FormInstance } from 'antd';
15
+ import {
16
+ CARD_GAP_STYLE,
17
+ HEADER_CARD_PROPS,
18
+ PAGE_WRAPPER_STYLE,
19
+ } from 'constants/layout';
20
+ import { useIsAgentAllowed } from 'config/agentAllowed';
14
21
  import { SchemaForm } from '../schema-form/SchemaForm';
15
22
  import {
16
23
  CreateNodeInstanceModal,
@@ -19,9 +26,11 @@ import {
19
26
  import type { WorkflowNodeType } from '../../types';
20
27
  import { useTranslation } from 'react-i18next';
21
28
  import '../node-config.css';
29
+ import '../../workflow-ui.css';
30
+ import './node-instance-form.css';
31
+ import { useWorkflowFormValidation } from '../../useWorkflowFormValidation';
22
32
 
23
- const { Title } = Typography;
24
- import { useIsAgentAllowed } from 'config/agentAllowed';
33
+ const { Text, Title } = Typography;
25
34
 
26
35
  interface NodeInstanceFormProps {
27
36
  form: FormInstance;
@@ -47,6 +56,7 @@ export function NodeInstanceForm({
47
56
  const [aiModalOpen, setAiModalOpen] = useState(false);
48
57
  const [schemaError, setSchemaError] = useState<Error | null>(null);
49
58
  const { t } = useTranslation('workflow');
59
+ const formValidation = useWorkflowFormValidation();
50
60
  const isDev = useIsAgentAllowed();
51
61
  const allowAiGeneration = isDev && !disableNodeType;
52
62
 
@@ -59,6 +69,17 @@ export function NodeInstanceForm({
59
69
  );
60
70
  }, [selectedNodeTypeId, nodeTypes]);
61
71
 
72
+ const selectedNodeTypeLabel = selectedNodeType
73
+ ? t(`nodeTypes.${selectedNodeType.type}`, {
74
+ defaultValue: selectedNodeType.label,
75
+ })
76
+ : '';
77
+ const hasConfiguration = Boolean(
78
+ selectedNodeType &&
79
+ ((selectedNodeType.uiSchema as any)?.widget ||
80
+ Object.keys(selectedNodeType.configSchema?.properties ?? {}).length > 0),
81
+ );
82
+
62
83
  const handleSchemaError = useCallback((error: Error | null) => {
63
84
  setSchemaError(error);
64
85
  }, []);
@@ -97,33 +118,33 @@ export function NodeInstanceForm({
97
118
 
98
119
  return (
99
120
  <div
100
- className="workflow-node-config"
101
- style={{
102
- background: 'var(--ant-color-bg-layout)',
103
- minHeight: 'calc(100vh - 64px)',
104
- }}
121
+ className="workflow-node-config node-instance-form"
122
+ style={PAGE_WRAPPER_STYLE}
105
123
  >
106
- <Card style={{ marginBottom: 12 }}>
107
- <div
108
- style={{
109
- display: 'flex',
110
- alignItems: 'center',
111
- justifyContent: 'space-between',
112
- }}
113
- >
114
- <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>
124
+ <Card {...HEADER_CARD_PROPS}>
125
+ <div className="node-instance-form__header">
126
+ <div className="node-instance-form__header-main">
115
127
  <Button
116
128
  type="text"
117
129
  icon={<ArrowLeftOutlined />}
130
+ aria-label={t('common.back')}
118
131
  onClick={onBack}
119
- ></Button>
120
- <Title level={4} style={{ margin: 0 }}>
121
- {title}
122
- </Title>
132
+ />
133
+ <div>
134
+ <Title level={4} style={{ margin: 0 }}>
135
+ {title}
136
+ </Title>
137
+ <Text type="secondary" style={{ fontSize: 12 }}>
138
+ {t(
139
+ disableNodeType
140
+ ? 'nodeInstance.editDescription'
141
+ : 'nodeInstance.createDescription',
142
+ )}
143
+ </Text>
144
+ </div>
123
145
  </div>
124
146
  {allowAiGeneration && (
125
147
  <Button
126
- type="primary"
127
148
  icon={<RobotOutlined />}
128
149
  onClick={() => setAiModalOpen(true)}
129
150
  >
@@ -133,96 +154,146 @@ export function NodeInstanceForm({
133
154
  </div>
134
155
  </Card>
135
156
 
136
- <Card styles={{ body: { padding: '20px 24px' } }}>
137
- <Form form={form} layout="vertical" style={{ maxWidth: 720 }}>
138
- <Form.Item
139
- name="nodeTypeId"
140
- label={t('nodeInstance.nodeType')}
141
- rules={[
142
- {
143
- required: true,
144
- message: t('nodeInstance.nodeTypeRequired'),
145
- },
146
- ]}
147
- >
148
- <Select
149
- placeholder={t('nodeInstance.selectNodeType')}
150
- disabled={disableNodeType}
151
- showSearch
152
- optionFilterProp="label"
153
- options={nodeTypes.map((nt) => ({
154
- label: `${nt.label} (${nt.category})`,
155
- value: String(nt.id),
156
- }))}
157
- />
158
- </Form.Item>
157
+ <Form
158
+ form={form}
159
+ layout="vertical"
160
+ className="node-instance-form__content"
161
+ onFinish={onSubmit}
162
+ {...formValidation}
163
+ >
164
+ <Card style={CARD_GAP_STYLE}>
165
+ <div className="node-instance-form__section-heading">
166
+ <Title level={5}>{t('nodeInstance.basicInfo')}</Title>
167
+ <Text type="secondary">
168
+ {t('nodeInstance.basicInfoDescription')}
169
+ </Text>
170
+ </div>
159
171
 
160
- {disableNodeType && (
161
- <Typography.Paragraph
162
- type="secondary"
163
- style={{ marginTop: -16, marginBottom: 24 }}
172
+ <div className="node-instance-form__node-type">
173
+ <Form.Item
174
+ name="nodeTypeId"
175
+ label={t('nodeInstance.nodeType')}
176
+ rules={[
177
+ {
178
+ required: true,
179
+ message: t('nodeInstance.nodeTypeRequired'),
180
+ },
181
+ ]}
164
182
  >
165
- {t('nodeInstance.typeImmutable')}
166
- </Typography.Paragraph>
167
- )}
183
+ <Select
184
+ size="large"
185
+ placeholder={t('nodeInstance.selectNodeType')}
186
+ disabled={disableNodeType}
187
+ showSearch
188
+ optionFilterProp="label"
189
+ options={nodeTypes.map((nt) => ({
190
+ label: `${t(`nodeTypes.${nt.type}`, {
191
+ defaultValue: nt.label,
192
+ })} · ${t(`nodeCategories.${nt.category}`, {
193
+ defaultValue: nt.category,
194
+ })}`,
195
+ value: String(nt.id),
196
+ }))}
197
+ />
198
+ </Form.Item>
199
+ {disableNodeType && (
200
+ <Text type="secondary" className="node-instance-form__field-hint">
201
+ {t('nodeInstance.typeImmutable')}
202
+ </Text>
203
+ )}
204
+ </div>
205
+
206
+ <div className="node-instance-form__fields">
207
+ <Form.Item
208
+ name="name"
209
+ label={t('nodeInstance.instanceNameLabel')}
210
+ rules={[
211
+ {
212
+ required: true,
213
+ whitespace: true,
214
+ message: t('nodeInstance.nameRequired'),
215
+ },
216
+ ]}
217
+ >
218
+ <Input placeholder={t('nodeInstance.instanceNameExample')} />
219
+ </Form.Item>
220
+
221
+ <Form.Item
222
+ name="isEnabled"
223
+ label={t('common.enabled')}
224
+ valuePropName="checked"
225
+ initialValue
226
+ >
227
+ <Switch
228
+ checkedChildren={t('common.enabled')}
229
+ unCheckedChildren={t('common.disabled')}
230
+ />
231
+ </Form.Item>
232
+
233
+ <Form.Item
234
+ name="description"
235
+ label={t('common.description')}
236
+ className="node-instance-form__description"
237
+ >
238
+ <Input.TextArea
239
+ autoSize={{ minRows: 3, maxRows: 5 }}
240
+ placeholder={t('common.optionalDescription')}
241
+ />
242
+ </Form.Item>
243
+ </div>
244
+ </Card>
168
245
 
169
- <Form.Item
170
- name="name"
171
- label={t('nodeInstance.instanceNameLabel')}
172
- rules={[
173
- { required: true, message: t('nodeInstance.nameRequired') },
174
- ]}
175
- >
176
- <Input placeholder={t('nodeInstance.instanceNameExample')} />
177
- </Form.Item>
178
-
179
- <Form.Item name="description" label={t('common.description')}>
180
- <Input.TextArea
181
- autoSize={{ minRows: 2, maxRows: 4 }}
182
- placeholder={t('common.optionalDescription')}
246
+ <Card style={CARD_GAP_STYLE}>
247
+ <div className="node-instance-form__section-heading">
248
+ <Title level={5}>{t('editor.parameters')}</Title>
249
+ <Text type="secondary">
250
+ {selectedNodeType
251
+ ? t('nodeInstance.parametersDescription', {
252
+ name: selectedNodeTypeLabel,
253
+ })
254
+ : t('nodeInstance.parametersPendingDescription')}
255
+ </Text>
256
+ </div>
257
+
258
+ {!selectedNodeType ? (
259
+ <Empty
260
+ image={Empty.PRESENTED_IMAGE_SIMPLE}
261
+ className="node-instance-form__empty"
262
+ description={t('nodeInstance.parametersPending')}
263
+ />
264
+ ) : hasConfiguration ? (
265
+ <div className="node-instance-form__configuration">
266
+ <SchemaForm
267
+ schema={selectedNodeType.configSchema ?? null}
268
+ uiSchema={selectedNodeType.uiSchema ?? null}
269
+ disabled={submitting}
270
+ validate={false}
271
+ onSchemaError={handleSchemaError}
272
+ />
273
+ </div>
274
+ ) : (
275
+ <Empty
276
+ image={Empty.PRESENTED_IMAGE_SIMPLE}
277
+ className="node-instance-form__empty"
278
+ description={t('nodeInstance.noConfiguration')}
183
279
  />
184
- </Form.Item>
185
-
186
- <Form.Item
187
- name="isEnabled"
188
- label={t('common.enabled')}
189
- valuePropName="checked"
190
- >
191
- <Switch />
192
- </Form.Item>
193
-
194
- {selectedNodeType?.configSchema && (
195
- <Title level={5} style={{ margin: '4px 0 12px', fontSize: 14 }}>
196
- {t('editor.parameters')}
197
- </Title>
198
280
  )}
199
- <SchemaForm
200
- schema={selectedNodeType?.configSchema ?? null}
201
- uiSchema={selectedNodeType?.uiSchema ?? null}
202
- disabled={submitting}
203
- onSchemaError={handleSchemaError}
204
- />
205
-
206
- <div
207
- style={{
208
- marginTop: 20,
209
- display: 'flex',
210
- justifyContent: 'flex-end',
211
- gap: 8,
212
- }}
213
- >
214
- <Button onClick={onBack}>{t('common.cancel')}</Button>
281
+
282
+ <div className="node-instance-form__actions">
283
+ <Button disabled={submitting} onClick={onBack}>
284
+ {t('common.cancel')}
285
+ </Button>
215
286
  <Button
216
287
  type="primary"
288
+ htmlType="submit"
217
289
  loading={submitting}
218
290
  disabled={Boolean(schemaError)}
219
- onClick={onSubmit}
220
291
  >
221
292
  {submitText}
222
293
  </Button>
223
294
  </div>
224
- </Form>
225
- </Card>
295
+ </Card>
296
+ </Form>
226
297
 
227
298
  {!disableNodeType && (
228
299
  <CreateNodeInstanceModal
@@ -0,0 +1,91 @@
1
+ .node-instance-form__header {
2
+ display: flex;
3
+ align-items: center;
4
+ justify-content: space-between;
5
+ flex-wrap: wrap;
6
+ gap: 12px;
7
+ }
8
+
9
+ .node-instance-form__header-main {
10
+ display: flex;
11
+ min-width: 0;
12
+ align-items: center;
13
+ gap: 8px;
14
+ }
15
+
16
+ .node-instance-form__content {
17
+ width: 100%;
18
+ }
19
+
20
+ .node-instance-form__section-heading {
21
+ display: flex;
22
+ flex-direction: column;
23
+ gap: 2px;
24
+ margin-bottom: 20px;
25
+ }
26
+
27
+ .node-instance-form__section-heading .ant-typography {
28
+ margin: 0;
29
+ }
30
+
31
+ .node-instance-form__section-heading > .ant-typography:first-child {
32
+ font-size: var(--workflow-content-title-size, 18px);
33
+ font-weight: 600;
34
+ line-height: 28px;
35
+ }
36
+
37
+ .node-instance-form__node-type {
38
+ max-width: 720px;
39
+ margin-bottom: 20px;
40
+ }
41
+
42
+ .node-instance-form__field-hint {
43
+ display: block;
44
+ margin-top: -4px;
45
+ font-size: 12px;
46
+ }
47
+
48
+ .node-instance-form__fields {
49
+ display: grid;
50
+ grid-template-columns: minmax(0, 1fr) 180px;
51
+ column-gap: 16px;
52
+ }
53
+
54
+ .node-instance-form__description {
55
+ grid-column: 1 / -1;
56
+ }
57
+
58
+ .node-instance-form__configuration {
59
+ padding-top: 4px;
60
+ }
61
+
62
+ .node-instance-form__empty {
63
+ margin: 8px 0 24px;
64
+ padding: 24px 0;
65
+ border: 1px dashed var(--ant-color-border-secondary);
66
+ border-radius: 8px;
67
+ background: var(--ant-color-fill-quaternary);
68
+ }
69
+
70
+ .node-instance-form__actions {
71
+ display: flex;
72
+ justify-content: flex-end;
73
+ gap: 8px;
74
+ margin-top: 8px;
75
+ padding-top: 20px;
76
+ border-top: 1px solid var(--ant-color-border-secondary);
77
+ }
78
+
79
+ @media (max-width: 767px) {
80
+ .node-instance-form__fields {
81
+ grid-template-columns: 1fr;
82
+ }
83
+
84
+ .node-instance-form__description {
85
+ grid-column: auto;
86
+ }
87
+
88
+ .node-instance-form__header {
89
+ align-items: flex-start;
90
+ }
91
+ }
@@ -24,6 +24,12 @@ import { customRequest } from 'helpers/http';
24
24
  import { PageHeader } from 'components';
25
25
  import { PAGE_WRAPPER_STYLE, SEARCH_CARD_PROPS } from 'constants/layout';
26
26
  import type { WorkflowNodeType } from '../types';
27
+ import { useTranslation } from 'react-i18next';
28
+ import {
29
+ formatWorkflowUtcDate,
30
+ formatWorkflowUtcDateTime,
31
+ } from '../utils/workflowDateTime';
32
+ import '../workflow-ui.css';
27
33
 
28
34
  const PAGE_SIZE = 20;
29
35
 
@@ -41,6 +47,7 @@ interface NodeInstance {
41
47
  }
42
48
 
43
49
  export default function NodeInstanceListPage() {
50
+ const { t } = useTranslation('workflow');
44
51
  const navigate = useNavigate();
45
52
  const [data, setData] = useState<NodeInstance[]>([]);
46
53
  const [total, setTotal] = useState(0);
@@ -91,11 +98,11 @@ export default function NodeInstanceListPage() {
91
98
  setData(res.data);
92
99
  setTotal(res.meta.itemCount);
93
100
  } catch (e: any) {
94
- message.error(e?.message ?? 'Failed to fetch data');
101
+ message.error(e?.message ?? t('nodeInstance.loadFailed'));
95
102
  } finally {
96
103
  setLoading(false);
97
104
  }
98
- }, [page, filterNodeType, filterName]);
105
+ }, [page, filterNodeType, filterName, t]);
99
106
 
100
107
  useEffect(() => {
101
108
  fetchData();
@@ -105,8 +112,8 @@ export default function NodeInstanceListPage() {
105
112
  useEffect(() => {
106
113
  customRequest<WorkflowNodeType[]>('workflow-node-types', 'GET')
107
114
  .then(setNodeTypes)
108
- .catch(() => {});
109
- }, []);
115
+ .catch(() => message.error(t('editor.nodeTypesLoadFailed')));
116
+ }, [t]);
110
117
 
111
118
  async function handleToggleEnabled(record: NodeInstance) {
112
119
  try {
@@ -117,20 +124,24 @@ export default function NodeInstanceListPage() {
117
124
  isEnabled: !record.isEnabled,
118
125
  },
119
126
  );
120
- message.success(record.isEnabled ? 'Disabled' : 'Enabled');
127
+ message.success(
128
+ record.isEnabled
129
+ ? t('nodeInstance.disabled')
130
+ : t('nodeInstance.enabled'),
131
+ );
121
132
  fetchData();
122
133
  } catch (e: any) {
123
- message.error(e?.message ?? 'Update failed');
134
+ message.error(e?.message ?? t('nodeInstance.updateFailed'));
124
135
  }
125
136
  }
126
137
 
127
138
  async function handleDelete(id: string) {
128
139
  try {
129
140
  await customRequest(`workflowNodeInstance/deleteUnique/${id}`, 'DELETE');
130
- message.success('Deleted');
141
+ message.success(t('nodeInstance.deleted'));
131
142
  fetchData();
132
143
  } catch (e: any) {
133
- message.error(e?.message ?? 'Delete failed');
144
+ message.error(e?.message ?? t('nodeInstance.deleteFailed'));
134
145
  }
135
146
  }
136
147
 
@@ -143,18 +154,20 @@ export default function NodeInstanceListPage() {
143
154
  render: (val: boolean, record: NodeInstance) => (
144
155
  <Popconfirm
145
156
  title={
146
- val ? 'Disable this node instance?' : 'Enable this node instance?'
157
+ val
158
+ ? t('nodeInstance.disableConfirm')
159
+ : t('nodeInstance.enableConfirm')
147
160
  }
148
161
  onConfirm={() => handleToggleEnabled(record)}
149
- okText="Confirm"
150
- cancelText="Cancel"
162
+ okText={t('common.confirm')}
163
+ cancelText={t('common.cancel')}
151
164
  >
152
165
  <Switch size="small" checked={val} />
153
166
  </Popconfirm>
154
167
  ),
155
168
  },
156
169
  {
157
- title: 'Name',
170
+ title: t('common.name'),
158
171
  dataIndex: 'name',
159
172
  key: 'name',
160
173
  render: (name: string, record: NodeInstance) => (
@@ -168,30 +181,30 @@ export default function NodeInstanceListPage() {
168
181
  ),
169
182
  },
170
183
  {
171
- title: 'Node Type',
184
+ title: t('nodeInstance.nodeType'),
172
185
  key: 'nodeType',
173
186
  render: (_: any, record: NodeInstance) => (
174
187
  <Tag>{record.nodeType?.label ?? '—'}</Tag>
175
188
  ),
176
189
  },
177
190
  {
178
- title: 'Updated',
191
+ title: t('list.updatedAt'),
179
192
  dataIndex: 'updatedAt',
180
193
  key: 'updatedAt',
181
194
  width: 150,
182
195
  render: (v: string) => (
183
- <Tooltip title={new Date(v).toLocaleString()}>
184
- <span>{new Date(v).toLocaleDateString()}</span>
196
+ <Tooltip title={formatWorkflowUtcDateTime(v)}>
197
+ <span>{formatWorkflowUtcDate(v)}</span>
185
198
  </Tooltip>
186
199
  ),
187
200
  },
188
201
  {
189
- title: 'Actions',
202
+ title: t('list.actions'),
190
203
  key: 'actions',
191
204
  width: 120,
192
205
  render: (_: any, record: NodeInstance) => (
193
206
  <Space>
194
- <Tooltip title="View">
207
+ <Tooltip title={t('common.view')}>
195
208
  <Button
196
209
  size="small"
197
210
  icon={<EyeOutlined />}
@@ -200,7 +213,7 @@ export default function NodeInstanceListPage() {
200
213
  }
201
214
  />
202
215
  </Tooltip>
203
- <Tooltip title="Edit">
216
+ <Tooltip title={t('common.edit')}>
204
217
  <Button
205
218
  size="small"
206
219
  icon={<EditOutlined />}
@@ -210,14 +223,19 @@ export default function NodeInstanceListPage() {
210
223
  />
211
224
  </Tooltip>
212
225
  <Popconfirm
213
- title="Delete this instance?"
214
- okText="Delete"
215
- cancelText="Cancel"
226
+ title={t('nodeInstance.deleteConfirm')}
227
+ okText={t('common.delete')}
228
+ cancelText={t('common.cancel')}
216
229
  okButtonProps={{ danger: true }}
217
230
  onConfirm={() => handleDelete(record.id)}
218
231
  >
219
- <Tooltip title="Delete">
220
- <Button size="small" danger icon={<DeleteOutlined />} />
232
+ <Tooltip title={t('common.delete')}>
233
+ <Button
234
+ type="primary"
235
+ size="small"
236
+ danger
237
+ icon={<DeleteOutlined />}
238
+ />
221
239
  </Tooltip>
222
240
  </Popconfirm>
223
241
  </Space>
@@ -226,9 +244,10 @@ export default function NodeInstanceListPage() {
226
244
  ];
227
245
 
228
246
  return (
229
- <div style={PAGE_WRAPPER_STYLE}>
247
+ <div className="workflow-page-stack" style={PAGE_WRAPPER_STYLE}>
230
248
  <PageHeader
231
- title="Node instance mgnts"
249
+ title={t('nodeInstance.management')}
250
+ subtitle={t('nodeInstance.managementDescription')}
232
251
  extra={
233
252
  <Space>
234
253
  <Button
@@ -236,7 +255,7 @@ export default function NodeInstanceListPage() {
236
255
  icon={<PlusOutlined />}
237
256
  onClick={() => navigate('/admin/workflow/node-instances/create')}
238
257
  >
239
- New Instance
258
+ {t('nodeInstance.new')}
240
259
  </Button>
241
260
  <Button icon={<ReloadOutlined />} onClick={fetchData} />
242
261
  </Space>
@@ -246,7 +265,7 @@ export default function NodeInstanceListPage() {
246
265
  <Card {...SEARCH_CARD_PROPS}>
247
266
  <Space wrap>
248
267
  <Select
249
- placeholder="Node Type"
268
+ placeholder={t('nodeInstance.nodeType')}
250
269
  allowClear
251
270
  value={filterNodeType}
252
271
  onChange={(v) => updateParams({ nodeTypeId: v, page: undefined })}
@@ -254,12 +273,16 @@ export default function NodeInstanceListPage() {
254
273
  showSearch
255
274
  optionFilterProp="label"
256
275
  options={nodeTypes.map((nt) => ({
257
- label: `${nt.label} (${nt.category})`,
276
+ label: `${t(`nodeTypes.${nt.type}`, {
277
+ defaultValue: nt.label,
278
+ })} (${t(`nodeCategories.${nt.category}`, {
279
+ defaultValue: nt.category,
280
+ })})`,
258
281
  value: String(nt.id),
259
282
  }))}
260
283
  />
261
284
  <Input
262
- placeholder="Search by name"
285
+ placeholder={t('nodeInstance.searchPlaceholder')}
263
286
  allowClear
264
287
  defaultValue={filterName}
265
288
  onChange={(e) => {
@@ -287,7 +310,7 @@ export default function NodeInstanceListPage() {
287
310
  total,
288
311
  onChange: (p) =>
289
312
  updateParams({ page: p > 1 ? String(p) : undefined }),
290
- showTotal: (t) => `Total ${t}`,
313
+ showTotal: (count) => t('list.total', { count }),
291
314
  }}
292
315
  size="small"
293
316
  />