@gadmin2n/schematics 0.0.139 → 0.0.141

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 (329) hide show
  1. package/dist/lib/application/files/gadmin2-game-angle-demo/Jenkinsfile +6 -34
  2. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/approval.prisma +199 -0
  3. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/system.prisma +9 -0
  4. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/workflow.prisma +191 -14
  5. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Event.ts +1 -1
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/gitignore +6 -5
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/readme.md +10 -3
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/server/migrate-between-pg-schemas.js +6 -4
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +5 -2
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/server/prisma.config.ts +12 -3
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/gen-jwt.ts +8 -1
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/migrate-human-approval-configs.ts +86 -0
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts +710 -121
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow.seed.ts +125 -10
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/config/index.ts +28 -0
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/json-body-parser.spec.ts +61 -0
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/json-body-parser.ts +7 -0
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/structured-all-exceptions.filter.spec.ts +54 -0
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/structured-all-exceptions.filter.ts +86 -0
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/main.ts +9 -3
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.controller.ts +89 -0
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.dto.ts +68 -0
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.service.spec.ts +177 -0
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.service.ts +283 -0
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approvalChannel.module.ts +10 -0
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-executor.spec.ts +42 -0
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-executor.ts +108 -0
  28. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.controller.ts +101 -0
  29. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.dto.ts +29 -0
  30. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/codeRuntime.module.ts +21 -0
  31. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-handler.registry.ts +30 -0
  32. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-handler.ts +15 -0
  33. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.spec.ts +105 -0
  34. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.ts +96 -0
  35. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.dto.ts +78 -0
  36. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-signal-outbox.service.spec.ts +56 -0
  37. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-signal-outbox.service.ts +111 -0
  38. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-token.spec.ts +23 -0
  39. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-token.ts +18 -0
  40. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.spec.ts +240 -0
  41. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.ts +339 -0
  42. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.types.ts +74 -0
  43. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-wait.handler.ts +47 -0
  44. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/externalInteraction.module.ts +41 -0
  45. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/human-approval.handler.spec.ts +70 -0
  46. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/human-approval.handler.ts +76 -0
  47. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.controller.ts +12 -0
  48. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.service.spec.ts +227 -0
  49. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.service.ts +121 -0
  50. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.controller.ts +160 -0
  51. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.dto.ts +41 -0
  52. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.spec.ts +171 -0
  53. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.ts +245 -0
  54. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/httpRequest.module.ts +22 -0
  55. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-rule-evaluator.spec.ts +68 -0
  56. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-rule-evaluator.ts +126 -0
  57. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-rule.types.ts +34 -0
  58. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-signal-outbox.service.ts +115 -0
  59. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.spec.ts +45 -0
  60. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.ts +59 -0
  61. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.controller.ts +72 -0
  62. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.dto.ts +144 -0
  63. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.errors.ts +19 -0
  64. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.external-decision.spec.ts +350 -0
  65. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.service.ts +774 -0
  66. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/humanApproval.module.ts +46 -0
  67. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/legacy-approval-config-migration.ts +227 -0
  68. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/outbox-retry.util.ts +14 -0
  69. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.controller.ts +151 -0
  70. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.dto.ts +88 -0
  71. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/runtime-token.guard.ts +43 -0
  72. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/index.ts +21 -1
  73. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.controller.ts +77 -0
  74. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.dto.ts +98 -0
  75. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.service.ts +277 -0
  76. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-secret-cipher.spec.ts +14 -0
  77. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-secret-cipher.ts +59 -0
  78. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integrationConnection.module.ts +10 -0
  79. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/actor-context.util.ts +27 -0
  80. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/providers/user-group.provider.ts +208 -0
  81. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/providers/user.provider.ts +168 -0
  82. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.controller.spec.ts +157 -0
  83. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.controller.ts +176 -0
  84. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.dto.ts +21 -0
  85. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.errors.ts +78 -0
  86. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.registry.spec.ts +100 -0
  87. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.registry.ts +115 -0
  88. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.types.ts +97 -0
  89. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subjectProvider.module.ts +34 -0
  90. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.controller.spec.ts +89 -1
  91. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.controller.ts +4 -0
  92. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.controller.ts +119 -0
  93. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.dto.ts +91 -0
  94. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.errors.ts +34 -0
  95. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.service.spec.ts +161 -0
  96. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.service.ts +390 -0
  97. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/userGroup.module.ts +10 -0
  98. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.spec.ts +17 -0
  99. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.ts +8 -2
  100. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/parameter-binding.ts +93 -0
  101. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.spec.ts +34 -1
  102. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.ts +26 -0
  103. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.spec.ts +158 -0
  104. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.ts +155 -0
  105. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.spec.ts +512 -0
  106. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.ts +368 -0
  107. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.types.ts +43 -0
  108. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.spec.ts +174 -0
  109. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.ts +149 -0
  110. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-dsl-comparison.ts +43 -0
  111. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-execution.dto.ts +1 -1
  112. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.dto.ts +4 -0
  113. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.service.ts +70 -28
  114. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-handle-validator.ts +128 -0
  115. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.spec.ts +85 -0
  116. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.ts +157 -0
  117. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.spec.ts +59 -0
  118. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.ts +27 -5
  119. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.module.ts +18 -3
  120. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.spec.ts +493 -21
  121. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +426 -90
  122. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.spec.ts +79 -0
  123. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.ts +62 -0
  124. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/schema.types.ts +10 -0
  125. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.spec.ts +124 -0
  126. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.ts +236 -0
  127. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.spec.ts +49 -0
  128. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.ts +69 -0
  129. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/workflowConfig.module.ts +20 -0
  130. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/node-instance-config.util.spec.ts +15 -0
  131. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/node-instance-config.util.ts +25 -0
  132. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.controller.ts +103 -11
  133. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.dto.ts +98 -0
  134. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.module.ts +3 -0
  135. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.spec.ts +72 -62
  136. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.ts +148 -11
  137. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +13 -9
  138. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/App.tsx +5 -2
  139. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/authProvider.ts +2 -2
  140. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/BulkActions.tsx +0 -5
  141. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/PageHeader.tsx +46 -0
  142. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/SearchBar.tsx +26 -18
  143. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/eventList/index.tsx +2 -2
  144. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/logButton/index.tsx +24 -17
  145. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/logList/index.tsx +7 -18
  146. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/modalDiffViewer/index.tsx +2 -2
  147. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/index.tsx +288 -33
  148. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/themeStyles.ts +97 -0
  149. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/index.ts +1 -0
  150. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/SettingDrawer.tsx +251 -0
  151. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/header.tsx +47 -19
  152. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/layout.tsx +18 -9
  153. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/menuRenderer.tsx +155 -0
  154. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/sider.tsx +123 -129
  155. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.test.ts +10 -0
  156. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +18 -0
  157. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +32 -3
  158. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddDataModal.tsx +98 -3
  159. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddPageModal.tsx +101 -0
  160. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +8 -0
  161. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/style.css +51 -0
  162. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/form.tsx +1 -1
  163. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/list.tsx +1 -1
  164. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/login.ts +40 -1
  165. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/show.tsx +5 -5
  166. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +16 -1
  167. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useListPageState.ts +10 -7
  168. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/i18n.ts +4 -2
  169. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +26 -2
  170. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/workflow.json +575 -0
  171. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +26 -2
  172. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/workflow.json +575 -0
  173. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/plugins/devShellPlugin.ts +152 -2
  174. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/index.tsx +9 -15
  175. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/show.tsx +41 -9
  176. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/edit.tsx +1 -1
  177. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/list.tsx +10 -8
  178. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/show.tsx +3 -3
  179. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.css +1 -1
  180. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/edit.tsx +1 -1
  181. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/list.tsx +141 -138
  182. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/show.tsx +3 -6
  183. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasCell.css +3 -0
  184. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasCell.tsx +45 -13
  185. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasComponentLibrary.tsx +45 -22
  186. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +175 -119
  187. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasPage.tsx +248 -74
  188. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasToolbar.tsx +33 -18
  189. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CodeFloatWindow.tsx +16 -10
  190. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/PublishModal.tsx +1 -1
  191. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasContextMenuRegistry.tsx +31 -0
  192. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasDefaults.ts +15 -0
  193. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/BarChartDataSourceModal.tsx +16 -11
  194. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/CanvasAiModal.tsx +25 -21
  195. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/ExportModal.tsx +6 -1
  196. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/LineChartDataSourceModal.tsx +9 -10
  197. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/MultiChartConfigModal.tsx +4 -7
  198. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/MultiChartDataSourceModal.tsx +23 -9
  199. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/NumCardDataSourceModal.tsx +16 -11
  200. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/PromptModal.tsx +2 -5
  201. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/RadarChartDataSourceModal.tsx +16 -11
  202. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/TableConfigModal.tsx +2 -9
  203. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/TableDataSourceModal.tsx +23 -12
  204. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/canvasModalProps.ts +2 -17
  205. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/sectionCompactor.test.ts +149 -0
  206. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/sectionCompactor.ts +111 -17
  207. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/types.ts +1 -0
  208. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/whiteboardLayout.test.ts +83 -0
  209. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/whiteboardLayout.ts +118 -0
  210. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/whiteboardName.test.ts +26 -0
  211. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas-page/index.tsx +9 -1
  212. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/edit.tsx +1 -1
  213. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/list.tsx +10 -8
  214. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/show.tsx +3 -6
  215. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/DecisionModal.tsx +71 -0
  216. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/inbox.tsx +209 -0
  217. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/AssignRolesModal.tsx +6 -1
  218. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/list.tsx +47 -150
  219. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/permissionReadme/index.tsx +21 -20
  220. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/modal.tsx +1 -1
  221. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/list.tsx +115 -118
  222. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/modal.tsx +1 -1
  223. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/list.tsx +61 -64
  224. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/show-drawer.tsx +1 -1
  225. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/list.tsx +187 -200
  226. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/ApprovalChannelModal.test.tsx +84 -0
  227. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/ApprovalChannelModal.tsx +141 -0
  228. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/approval-channel.types.ts +16 -0
  229. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/index.tsx +210 -0
  230. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CreateNodeInstanceDrawer.tsx +154 -0
  231. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.tsx +194 -5
  232. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DeletableEdge.tsx +76 -0
  233. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DslView.tsx +1 -1
  234. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/EnhancedFlowRenderer.tsx +176 -22
  235. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.test.tsx +62 -0
  236. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.tsx +94 -5
  237. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExportModal.tsx +15 -10
  238. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/FlowRenderer.tsx +251 -70
  239. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ImportModal.tsx +18 -24
  240. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/InstanceRequiredDialog.tsx +106 -0
  241. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.test.tsx +45 -0
  242. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.tsx +43 -0
  243. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NewNodeDefaults.test.tsx +283 -0
  244. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeEditModal.tsx +6 -7
  245. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.test.tsx +335 -0
  246. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.tsx +433 -237
  247. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ParameterBindingEditor.tsx +179 -0
  248. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/RunWorkflowModal.tsx +18 -16
  249. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/StatusCards.tsx +20 -16
  250. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/VersionPanel.tsx +6 -4
  251. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/ConnectionModal.test.tsx +68 -0
  252. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/ConnectionModal.tsx +367 -0
  253. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/connection.types.ts +21 -0
  254. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/index.tsx +180 -0
  255. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.tsx +38 -22
  256. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useNodeInstanceLibrary.ts +41 -0
  257. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useWorkflowAgent.ts +6 -0
  258. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/index.tsx +29 -35
  259. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instance-detail.tsx +8 -11
  260. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instances.tsx +4 -3
  261. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/NodeInstanceForm.tsx +56 -23
  262. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/create.tsx +21 -6
  263. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/edit.tsx +17 -20
  264. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/index.tsx +9 -17
  265. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaField.tsx +311 -0
  266. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaForm.test.tsx +218 -0
  267. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaForm.tsx +83 -0
  268. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/default-widgets.tsx +135 -0
  269. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/schema-defaults.ts +36 -0
  270. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/schema.types.ts +32 -0
  271. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/widget-registry.test.tsx +23 -0
  272. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/widget-registry.tsx +52 -0
  273. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/show.tsx +9 -13
  274. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRequestTriggerConfigEditor.tsx +39 -0
  275. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRuleEditor.test.tsx +20 -0
  276. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRuleEditor.tsx +72 -0
  277. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.test.tsx +47 -0
  278. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.tsx +185 -0
  279. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CallableInputParametersEditor.test.tsx +102 -0
  280. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CallableInputParametersEditor.tsx +150 -0
  281. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CodeConfigEditor.tsx +103 -0
  282. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.test.tsx +135 -0
  283. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.tsx +273 -0
  284. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalWaitConfigEditor.tsx +303 -0
  285. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.test.tsx +189 -0
  286. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.tsx +706 -0
  287. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.test.tsx +86 -0
  288. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.tsx +458 -0
  289. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.test.tsx +81 -0
  290. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.tsx +281 -0
  291. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubjectPicker.test.tsx +61 -0
  292. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubjectPicker.tsx +266 -0
  293. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubmitApprovalResultConfigEditor.tsx +104 -0
  294. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubmitExternalResultConfigEditor.tsx +98 -0
  295. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupCreateModal.tsx +70 -0
  296. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupEditModal.tsx +138 -0
  297. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.test.ts +25 -0
  298. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.ts +42 -0
  299. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/subject-provider.api.ts +95 -0
  300. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/show.tsx +15 -11
  301. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/temporal-tenant/index.test.tsx +152 -0
  302. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/temporal-tenant/index.tsx +438 -141
  303. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types/parameter-binding.ts +49 -0
  304. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types.ts +31 -2
  305. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.test.ts +208 -0
  306. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.ts +246 -0
  307. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/newNodeConfig.ts +77 -0
  308. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/removeWorkflowEdges.test.ts +34 -0
  309. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/removeWorkflowEdges.ts +18 -0
  310. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveLookupPorts.ts +66 -0
  311. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.test.ts +39 -0
  312. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.ts +48 -0
  313. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveWorkflowDisplay.test.ts +51 -0
  314. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveWorkflowDisplay.ts +32 -0
  315. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/edit.tsx +1 -1
  316. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/list.tsx +10 -8
  317. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/show.tsx +3 -3
  318. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd-theme-vars.css +93 -0
  319. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd.css +8 -8
  320. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/fc.css +4 -4
  321. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/index.css +40 -5
  322. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-drawer.module.css +3 -3
  323. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-page.module.css +3 -3
  324. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/theme-styles.css +81 -0
  325. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/test/setup.ts +5 -0
  326. package/dist/lib/application/files/gadmin2-game-angle-demo/web/vite.config.ts +1 -7
  327. package/dist/lib/application/files/gadmin2-game-angle-demo/web/vitest.config.ts +12 -0
  328. package/package.json +1 -1
  329. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/DynamicConfigForm.tsx +0 -154
@@ -1,7 +1,15 @@
1
- import React, { useEffect, useState } from 'react';
1
+ import {
2
+ DeleteOutlined,
3
+ DisconnectOutlined,
4
+ LinkOutlined,
5
+ MinusCircleOutlined,
6
+ PlusOutlined,
7
+ SendOutlined,
8
+ } from '@ant-design/icons';
2
9
  import {
3
10
  Button,
4
11
  Checkbox,
12
+ Form,
5
13
  Input,
6
14
  InputNumber,
7
15
  message,
@@ -14,16 +22,17 @@ import {
14
22
  Tooltip,
15
23
  Typography,
16
24
  } from 'antd';
17
- import {
18
- DeleteOutlined,
19
- DisconnectOutlined,
20
- LinkOutlined,
21
- MinusCircleOutlined,
22
- PlusOutlined,
23
- SendOutlined,
24
- } from '@ant-design/icons';
25
25
  import { customRequest } from 'helpers/http';
26
- import type { WorkflowNode, WorkflowNodeType } from '../types';
26
+ import { useEffect, useState } from 'react';
27
+ import { useTranslation } from 'react-i18next';
28
+ import { SchemaForm } from '../node-instances/schema-form/SchemaForm';
29
+ import type {
30
+ WorkflowNode,
31
+ WorkflowNodeInstance,
32
+ WorkflowNodeType,
33
+ } from '../types';
34
+ import type { ParameterBinding } from '../types/parameter-binding';
35
+ import { ParameterBindingEditor } from './ParameterBindingEditor';
27
36
 
28
37
  const { Text, Title } = Typography;
29
38
  const { TextArea } = Input;
@@ -55,7 +64,7 @@ const TEXTAREA_FIELDS = new Set([
55
64
  'condition',
56
65
  'body',
57
66
  'headers',
58
- 'inputMapping',
67
+ 'inputBindings',
59
68
  'script',
60
69
  'rawSql',
61
70
  'data',
@@ -63,6 +72,21 @@ const TEXTAREA_FIELDS = new Set([
63
72
  'fallbackExpression',
64
73
  ]);
65
74
 
75
+ function hasUiSchemaWidget(value: unknown): boolean {
76
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
77
+ return false;
78
+ }
79
+
80
+ const schema = value as Record<string, unknown>;
81
+ if (typeof schema.widget === 'string' && schema.widget.trim()) {
82
+ return true;
83
+ }
84
+
85
+ return Object.entries(schema).some(
86
+ ([key, child]) => key !== 'options' && hasUiSchemaWidget(child),
87
+ );
88
+ }
89
+
66
90
  // Rich tooltip content for node types (hardcoded)
67
91
  const NODE_TOOLTIPS: Record<string, string> = {
68
92
  cron_trigger:
@@ -82,10 +106,14 @@ const NODE_TOOLTIPS: Record<string, string> = {
82
106
  'Temporal: 事件总线收到事件后调用 WorkflowClient.start() 启动新 Workflow,或通过 Signal 唤醒等待中的 Workflow\n\n' +
83
107
  '通常后端会有一个事件总线(如 Redis Pub/Sub、NATS、Kafka、或简单的内存 EventEmitter),当业务代码 emit("order.paid", payload)时,事件中间件查找所有订阅了该事件的 active workflow 定义,并启动对应的 Temporal Workflow。',
84
108
  webhook_trigger:
85
- '通过 HTTP 请求触发工作流\n' +
109
+ '接收外部 HTTP 请求并启动 Workflow\n' +
86
110
  '━━━━━━━━━━━━━━━━━━━━\n' +
87
111
  '示例: 第三方支付回调、GitHub Webhook、表单提交\n' +
88
- 'Temporal: HTTP 网关接收请求后调用 WorkflowClient.start(),支持同步等待结果或异步返回',
112
+ '收到的请求体、查询参数和请求头分别放在 workflow.body、workflow.query 和 workflow.headers',
113
+ submit_approval_result:
114
+ '提交外部审批结果\n' +
115
+ '━━━━━━━━━━━━━━━━━━━━\n' +
116
+ '把 requestId、审批人和审批决定提交给正在等待的人工审核节点',
89
117
  manual_trigger:
90
118
  '手动触发,用于调试或一次性执行\n' +
91
119
  '━━━━━━━━━━━━━━━━━━━━\n' +
@@ -115,12 +143,12 @@ const NODE_TOOLTIPS: Record<string, string> = {
115
143
  '执行自定义 JavaScript 代码\n' +
116
144
  '━━━━━━━━━━━━━━━━━━━━\n' +
117
145
  '示例: 数据格式转换、复杂计算、JSON 结构重组、条件逻辑\n' +
118
- 'Temporal: 封装为 Activity,在 Worker 中通过 VM2 沙箱执行',
146
+ 'Temporal: 封装为 Activity,通过应用侧受限 Code Runtime 执行',
119
147
  set_variable:
120
148
  '设置、转换或重命名工作流变量\n' +
121
149
  '━━━━━━━━━━━━━━━━━━━━\n' +
122
150
  '示例: 提取嵌套字段、重命名 API 返回字段、构造下游所需结构\n' +
123
- 'Temporal: 在 Workflow 代码中直接操作 context 对象',
151
+ 'Temporal: 读取 input,并把结果传给下一个节点',
124
152
  if_else:
125
153
  '根据条件走不同分支\n' +
126
154
  '━━━━━━━━━━━━━━━━━━━━\n' +
@@ -197,6 +225,7 @@ interface Props {
197
225
  updates: {
198
226
  label?: string;
199
227
  config?: Record<string, any>;
228
+ configOverride?: Record<string, any> | null;
200
229
  instanceRef?: WorkflowNode['instanceRef'] | null;
201
230
  },
202
231
  ) => void;
@@ -218,22 +247,24 @@ export function NodePropertyPanel({
218
247
  onAbort,
219
248
  aiLoading,
220
249
  }: Props) {
250
+ const { t } = useTranslation('workflow');
221
251
  const [label, setLabel] = useState('');
222
252
  const [config, setConfig] = useState<Record<string, any>>({});
223
253
  const [prompt, setPrompt] = useState('');
224
254
  const [dirty, setDirty] = useState(false);
225
255
  const [activeTab, setActiveTab] = useState<'config' | 'ai'>('config');
226
256
  const [workflowOptions, setWorkflowOptions] = useState<
227
- { label: string; value: string }[]
228
- >([]);
229
- const [instances, setInstances] = useState<
230
257
  {
231
- id: string;
232
- name: string;
233
- description: string | null;
234
- config: Record<string, any>;
258
+ label: string;
259
+ value: string;
260
+ inputParameters: Array<{
261
+ key: string;
262
+ label?: string;
263
+ required?: boolean;
264
+ }>;
235
265
  }[]
236
266
  >([]);
267
+ const [instances, setInstances] = useState<WorkflowNodeInstance[]>([]);
237
268
  const [selectedInstanceId, setSelectedInstanceId] = useState<string | null>(
238
269
  null,
239
270
  );
@@ -242,27 +273,79 @@ export function NodePropertyPanel({
242
273
  const [newInstanceDesc, setNewInstanceDesc] = useState('');
243
274
  const [saveAsLoading, setSaveAsLoading] = useState(false);
244
275
  const [alsoSaveAsInstance, setAlsoSaveAsInstance] = useState(false);
276
+ const [configForm] = Form.useForm();
245
277
 
246
278
  // Find configSchema for current node type
247
279
  const currentNodeType = nodeTypes.find((nt) => nt.type === node?.type);
248
280
  const configSchema = (currentNodeType?.configSchema || {}) as any;
249
281
  const requiredFields: string[] = configSchema.required || [];
250
282
  const properties: Record<string, any> = configSchema.properties || {};
251
-
283
+ const currentUiSchema =
284
+ currentNodeType?.uiSchema &&
285
+ typeof currentNodeType.uiSchema === 'object' &&
286
+ !Array.isArray(currentNodeType.uiSchema)
287
+ ? (currentNodeType.uiSchema as Record<string, any>)
288
+ : {};
289
+ const effectiveUiSchema = (() => {
290
+ if (currentNodeType?.type === 'callable_trigger') {
291
+ return {
292
+ ...currentUiSchema,
293
+ fields: {
294
+ ...(currentUiSchema.fields ?? {}),
295
+ inputParameters: {
296
+ ...(currentUiSchema.fields?.inputParameters ?? {}),
297
+ widget: 'callable-input-parameters',
298
+ },
299
+ },
300
+ };
301
+ }
302
+ if (currentNodeType?.type === 'return_result') {
303
+ return {
304
+ ...currentUiSchema,
305
+ widget: 'return-result-config',
306
+ };
307
+ }
308
+ if (currentNodeType?.type === 'webhook_trigger') {
309
+ return {
310
+ ...currentUiSchema,
311
+ widget: 'external-request-config',
312
+ };
313
+ }
314
+ if (currentNodeType?.type === 'submit_approval_result') {
315
+ return {
316
+ ...currentUiSchema,
317
+ widget: 'submit-approval-result-config',
318
+ };
319
+ }
320
+ if (currentNodeType?.type === 'submit_external_result') {
321
+ return {
322
+ ...currentUiSchema,
323
+ widget: 'submit-external-result-config',
324
+ };
325
+ }
326
+ if (currentNodeType?.type === 'external_wait') {
327
+ return {
328
+ ...currentUiSchema,
329
+ widget: 'external-wait-config',
330
+ };
331
+ }
332
+ return currentNodeType?.uiSchema;
333
+ })();
334
+ const usesCustomConfigEditor = hasUiSchemaWidget(effectiveUiSchema);
335
+ const referencedInstance = instances.find(
336
+ (instance) => instance.id === node?.instanceRef?.instanceId,
337
+ );
338
+ const effectiveNodeConfig =
339
+ node?.configOverride ?? referencedInstance?.config ?? node?.config ?? {};
252
340
  useEffect(() => {
253
341
  if (node) {
254
342
  setLabel(node.label);
255
343
  // Merge existing config with schema defaults
256
344
  const mergedConfig: Record<string, any> = {};
257
345
  for (const [key, prop] of Object.entries<any>(properties)) {
258
- const existingValue = node.config?.[key];
346
+ const existingValue = effectiveNodeConfig[key];
259
347
  if (existingValue !== undefined) {
260
- mergedConfig[key] =
261
- key === 'approvers' && Array.isArray(existingValue)
262
- ? existingValue.map((a: any) =>
263
- typeof a === 'string' ? { type: 'user', id: a } : a,
264
- )
265
- : existingValue;
348
+ mergedConfig[key] = existingValue;
266
349
  } else if (prop.type === 'string') {
267
350
  mergedConfig[key] = '';
268
351
  } else if (prop.type === 'number') {
@@ -275,9 +358,15 @@ export function NodePropertyPanel({
275
358
  mergedConfig[key] = {};
276
359
  }
277
360
  }
361
+ if (node.type === 'webhook_trigger') {
362
+ mergedConfig.method = 'POST';
363
+ }
278
364
  setConfig(mergedConfig);
365
+ configForm.resetFields();
366
+ configForm.setFieldsValue({ config: mergedConfig });
279
367
  setDirty(false);
280
368
  setPrompt('');
369
+ setAlsoSaveAsInstance(false);
281
370
  }
282
371
  }, [node?.id, currentNodeType]);
283
372
 
@@ -287,7 +376,7 @@ export function NodePropertyPanel({
287
376
  setLabel(node.label);
288
377
  const mergedConfig: Record<string, any> = {};
289
378
  for (const [key, prop] of Object.entries<any>(properties)) {
290
- const existingValue = node.config?.[key];
379
+ const existingValue = effectiveNodeConfig[key];
291
380
  if (existingValue !== undefined) {
292
381
  mergedConfig[key] = existingValue;
293
382
  } else if (prop.type === 'string') {
@@ -303,19 +392,27 @@ export function NodePropertyPanel({
303
392
  }
304
393
  }
305
394
  setConfig(mergedConfig);
395
+ configForm.resetFields();
396
+ configForm.setFieldsValue({ config: mergedConfig });
306
397
  // eslint-disable-next-line react-hooks/exhaustive-deps
307
- }, [node?.label, JSON.stringify(node?.config)]);
398
+ }, [node?.label, JSON.stringify(effectiveNodeConfig)]);
308
399
 
309
400
  // Load workflow list for Sub Workflow node
310
401
  useEffect(() => {
311
402
  if (node?.type === 'sub_workflow') {
312
- customRequest<{ data: any[] }>('workflow', 'GET')
403
+ customRequest<any[]>('workflow/callable', 'GET')
313
404
  .then((res) => {
314
- const list = Array.isArray(res) ? res : res?.data || [];
405
+ const list = Array.isArray(res) ? res : [];
315
406
  setWorkflowOptions(
316
407
  list
317
408
  .filter((w: any) => String(w.id) !== currentWorkflowId)
318
- .map((w: any) => ({ label: w.name, value: String(w.id) })),
409
+ .map((w: any) => ({
410
+ label: w.name,
411
+ value: String(w.id),
412
+ inputParameters: Array.isArray(w.inputParameters)
413
+ ? w.inputParameters
414
+ : [],
415
+ })),
319
416
  );
320
417
  })
321
418
  .catch(() => {});
@@ -324,7 +421,10 @@ export function NodePropertyPanel({
324
421
 
325
422
  // Load instances for current node type
326
423
  useEffect(() => {
327
- if (!currentNodeType?.id) {
424
+ if (
425
+ !currentNodeType?.id ||
426
+ currentNodeType.instancePolicy === 'INLINE_ONLY'
427
+ ) {
328
428
  setInstances([]);
329
429
  return;
330
430
  }
@@ -335,18 +435,11 @@ export function NodePropertyPanel({
335
435
  })
336
436
  .then((res) => {
337
437
  const list = Array.isArray(res) ? res : res?.data || [];
338
- setInstances(
339
- list.map((item: any) => ({
340
- id: String(item.id),
341
- name: item.name,
342
- description: item.description,
343
- config: item.config ?? {},
344
- })),
345
- );
438
+ setInstances(list);
346
439
  })
347
440
  .catch(() => setInstances([]))
348
441
  .finally(() => setInstanceLoading(false));
349
- }, [currentNodeType?.id]);
442
+ }, [currentNodeType?.id, currentNodeType?.instancePolicy]);
350
443
 
351
444
  // Reset selection when node changes
352
445
  useEffect(() => {
@@ -365,21 +458,23 @@ export function NodePropertyPanel({
365
458
  flexDirection: 'column',
366
459
  alignItems: 'center',
367
460
  justifyContent: 'center',
368
- borderLeft: '1px solid #f0f0f0',
369
- background: '#fff',
461
+ borderLeft: '1px solid var(--ant-color-border-secondary)',
462
+ background: 'var(--ant-color-bg-container)',
370
463
  gap: 16,
371
464
  padding: 32,
372
465
  }}
373
466
  >
374
467
  <Spin size="large" />
375
- <Title level={5} style={{ margin: 0, color: '#595959' }}>
376
- AI is generating workflow…
468
+ <Title
469
+ level={5}
470
+ style={{ margin: 0, color: 'var(--ant-color-text-secondary)' }}
471
+ >
472
+ {t('editor.aiGenerating')}
377
473
  </Title>
378
474
  <Text type="secondary" style={{ textAlign: 'center', fontSize: 13 }}>
379
- Please wait, the workflow will be updated on the canvas
380
- automatically.
475
+ {t('editor.aiGeneratingHint')}
381
476
  </Text>
382
- <Button onClick={() => onAbort?.()}>Cancel</Button>
477
+ <Button onClick={() => onAbort?.()}>{t('common.cancel')}</Button>
383
478
  </div>
384
479
  );
385
480
  }
@@ -390,8 +485,8 @@ export function NodePropertyPanel({
390
485
  width: 320,
391
486
  display: 'flex',
392
487
  flexDirection: 'column',
393
- borderLeft: '1px solid #f0f0f0',
394
- background: '#fff',
488
+ borderLeft: '1px solid var(--ant-color-border-secondary)',
489
+ background: 'var(--ant-color-bg-container)',
395
490
  overflow: 'hidden',
396
491
  }}
397
492
  >
@@ -404,12 +499,18 @@ export function NodePropertyPanel({
404
499
  拖拽节点到左侧画布
405
500
  </Text>
406
501
  {Object.entries(
407
- nodeTypes.reduce<Record<string, WorkflowNodeType[]>>((acc, nt) => {
408
- const cat = nt.category || 'ACTION';
409
- if (!acc[cat]) acc[cat] = [];
410
- acc[cat].push(nt);
411
- return acc;
412
- }, {}),
502
+ nodeTypes
503
+ .filter(
504
+ (nt) =>
505
+ nt.type !== 'approval_request_trigger' &&
506
+ nt.type !== 'submit_approval_result',
507
+ )
508
+ .reduce<Record<string, WorkflowNodeType[]>>((acc, nt) => {
509
+ const cat = nt.category || 'ACTION';
510
+ if (!acc[cat]) acc[cat] = [];
511
+ acc[cat].push(nt);
512
+ return acc;
513
+ }, {}),
413
514
  ).map(([category, types]) => {
414
515
  const colors = CATEGORY_COLORS[category] || CATEGORY_COLORS.ACTION;
415
516
  return (
@@ -418,7 +519,7 @@ export function NodePropertyPanel({
418
519
  strong
419
520
  style={{
420
521
  fontSize: 12,
421
- color: '#595959',
522
+ color: 'var(--ant-color-text-secondary)',
422
523
  display: 'block',
423
524
  marginBottom: 6,
424
525
  }}
@@ -463,7 +564,9 @@ export function NodePropertyPanel({
463
564
  userSelect: 'none',
464
565
  }}
465
566
  >
466
- {nt.label}
567
+ {t(`nodeTypes.${nt.type}`, {
568
+ defaultValue: nt.label,
569
+ })}
467
570
  </div>
468
571
  </Tooltip>
469
572
  ))}
@@ -490,13 +593,20 @@ export function NodePropertyPanel({
490
593
 
491
594
  async function handleSave() {
492
595
  if (!node) return;
596
+ const currentConfig = usesCustomConfigEditor
597
+ ? (configForm.getFieldValue('config') ?? {})
598
+ : config;
493
599
  // Clean undefined values
494
600
  const cleanConfig: Record<string, any> = {};
495
- for (const [k, v] of Object.entries(config)) {
601
+ for (const [k, v] of Object.entries(currentConfig)) {
496
602
  if (v !== undefined && v !== '') cleanConfig[k] = v;
497
603
  }
498
-
499
- if (alsoSaveAsInstance && currentNodeType && newInstanceName.trim()) {
604
+ if (
605
+ !node.instanceRef &&
606
+ alsoSaveAsInstance &&
607
+ currentNodeType &&
608
+ newInstanceName.trim()
609
+ ) {
500
610
  // Save node AND create a new instance, then reference it
501
611
  setSaveAsLoading(true);
502
612
  try {
@@ -511,24 +621,18 @@ export function NodePropertyPanel({
511
621
  isEnabled: true,
512
622
  },
513
623
  );
514
- const newId = String(res.id);
624
+ const created = res;
625
+ const newId = String(created.id);
515
626
  onSave(node.id, {
516
627
  label,
517
- config: {},
628
+ config: created.config,
629
+ configOverride: null,
518
630
  instanceRef: {
519
631
  instanceId: newId,
520
- instanceName: newInstanceName.trim(),
632
+ instanceCode: created.code,
521
633
  },
522
634
  });
523
- setInstances((prev) => [
524
- ...prev,
525
- {
526
- id: newId,
527
- name: newInstanceName.trim(),
528
- description: newInstanceDesc.trim() || null,
529
- config: cleanConfig,
530
- },
531
- ]);
635
+ setInstances((prev) => [...prev, created]);
532
636
  setAlsoSaveAsInstance(false);
533
637
  setNewInstanceName('');
534
638
  setNewInstanceDesc('');
@@ -539,7 +643,11 @@ export function NodePropertyPanel({
539
643
  setSaveAsLoading(false);
540
644
  }
541
645
  } else {
542
- onSave(node.id, { label, config: cleanConfig });
646
+ onSave(node.id, {
647
+ label,
648
+ config: cleanConfig,
649
+ ...(node.instanceRef && { configOverride: cleanConfig }),
650
+ });
543
651
  message.success('节点已保存');
544
652
  }
545
653
  setDirty(false);
@@ -557,8 +665,12 @@ export function NodePropertyPanel({
557
665
  if (!inst) return;
558
666
  onSave(node.id, {
559
667
  label: inst.name,
560
- config: {},
561
- instanceRef: { instanceId: inst.id, instanceName: inst.name },
668
+ config: inst.config,
669
+ configOverride: null,
670
+ instanceRef: {
671
+ instanceId: inst.id,
672
+ instanceCode: inst.code,
673
+ },
562
674
  });
563
675
  setLabel(inst.name);
564
676
  setSelectedInstanceId(null);
@@ -580,9 +692,11 @@ export function NodePropertyPanel({
580
692
 
581
693
  function handleDetachReference() {
582
694
  if (!node) return;
583
- const inst = instances.find((i) => i.id === node.instanceRef?.instanceId);
584
- const resolvedConfig = inst?.config ?? {};
585
- onSave(node.id, { config: resolvedConfig, instanceRef: null });
695
+ onSave(node.id, {
696
+ config: effectiveNodeConfig,
697
+ configOverride: null,
698
+ instanceRef: null,
699
+ });
586
700
  }
587
701
 
588
702
  // Render a config field based on its schema
@@ -590,6 +704,14 @@ export function NodePropertyPanel({
590
704
  const isRequired = requiredFields.includes(key);
591
705
  const value = config[key];
592
706
  const placeholder = FIELD_PLACEHOLDERS[key] || '';
707
+ const fieldLabel =
708
+ node?.type === 'sub_workflow'
709
+ ? ({
710
+ workflowId: '调用哪个 Workflow',
711
+ waitForCompletion: '等待它运行完成',
712
+ timeout: '最长等待时间(秒)',
713
+ }[key] ?? key)
714
+ : key;
593
715
 
594
716
  // Special: workflowId → Select with workflow list
595
717
  if (key === 'workflowId') {
@@ -600,11 +722,26 @@ export function NodePropertyPanel({
600
722
  style={{ fontSize: 13, display: 'block', marginBottom: 2 }}
601
723
  >
602
724
  {isRequired && <span style={{ color: '#ff4d4f' }}>* </span>}
603
- {key}
725
+ {fieldLabel}
604
726
  </Text>
605
727
  <Select
606
728
  value={value || undefined}
607
- onChange={(v) => handleConfigChange(key, v)}
729
+ onChange={(v) => {
730
+ const selected = workflowOptions.find(
731
+ (workflow) => workflow.value === v,
732
+ );
733
+ setConfig((current) => ({
734
+ ...current,
735
+ workflowId: v,
736
+ inputBindings: Object.fromEntries(
737
+ (selected?.inputParameters ?? []).map((parameter) => [
738
+ parameter.key,
739
+ { source: 'WORKFLOW', path: parameter.key },
740
+ ]),
741
+ ),
742
+ }));
743
+ setDirty(true);
744
+ }}
608
745
  placeholder="选择子流程"
609
746
  options={workflowOptions}
610
747
  style={{ width: '100%' }}
@@ -618,6 +755,66 @@ export function NodePropertyPanel({
618
755
  );
619
756
  }
620
757
 
758
+ if (key === 'inputBindings' && node?.type === 'sub_workflow') {
759
+ const selected = workflowOptions.find(
760
+ (workflow) => workflow.value === config.workflowId,
761
+ );
762
+ if (!selected) {
763
+ return (
764
+ <Text key={key} type="secondary">
765
+ 请先选择要调用的 Workflow
766
+ </Text>
767
+ );
768
+ }
769
+ if (selected.inputParameters.length === 0) {
770
+ return (
771
+ <Text key={key} type="secondary">
772
+ 这个 Workflow 不需要调用参数
773
+ </Text>
774
+ );
775
+ }
776
+ const bindings =
777
+ config.inputBindings &&
778
+ typeof config.inputBindings === 'object' &&
779
+ !Array.isArray(config.inputBindings)
780
+ ? (config.inputBindings as Record<string, ParameterBinding>)
781
+ : {};
782
+ return (
783
+ <Space
784
+ key={key}
785
+ direction="vertical"
786
+ size={12}
787
+ style={{ width: '100%' }}
788
+ >
789
+ <Text strong>调用参数</Text>
790
+ {selected.inputParameters.map((parameter) => (
791
+ <div key={parameter.key}>
792
+ <Text style={{ display: 'block', marginBottom: 6 }}>
793
+ {parameter.label ?? parameter.key}
794
+ {parameter.required ? ' *' : ''}
795
+ </Text>
796
+ <ParameterBindingEditor
797
+ name={parameter.label ?? parameter.key}
798
+ defaultPath={parameter.key}
799
+ value={
800
+ bindings[parameter.key] ?? {
801
+ source: 'WORKFLOW',
802
+ path: parameter.key,
803
+ }
804
+ }
805
+ onChange={(binding) =>
806
+ handleConfigChange('inputBindings', {
807
+ ...bindings,
808
+ [parameter.key]: binding,
809
+ })
810
+ }
811
+ />
812
+ </div>
813
+ ))}
814
+ </Space>
815
+ );
816
+ }
817
+
621
818
  // String with enum → Select
622
819
  if (schema.type === 'string' && schema.enum) {
623
820
  return (
@@ -627,12 +824,12 @@ export function NodePropertyPanel({
627
824
  style={{ fontSize: 13, display: 'block', marginBottom: 2 }}
628
825
  >
629
826
  {isRequired && <span style={{ color: '#ff4d4f' }}>* </span>}
630
- {key}
827
+ {fieldLabel}
631
828
  </Text>
632
829
  <Select
633
830
  value={value || undefined}
634
831
  onChange={(v) => handleConfigChange(key, v)}
635
- placeholder={`选择 ${key}`}
832
+ placeholder={`选择 ${fieldLabel}`}
636
833
  options={schema.enum.map((e: string) => ({ label: e, value: e }))}
637
834
  style={{ width: '100%' }}
638
835
  />
@@ -650,7 +847,7 @@ export function NodePropertyPanel({
650
847
  style={{ fontSize: 13, display: 'block', marginBottom: 2 }}
651
848
  >
652
849
  {isRequired && <span style={{ color: '#ff4d4f' }}>* </span>}
653
- {key}
850
+ {fieldLabel}
654
851
  </Text>
655
852
  {useTextArea ? (
656
853
  <TextArea
@@ -679,7 +876,7 @@ export function NodePropertyPanel({
679
876
  style={{ fontSize: 13, display: 'block', marginBottom: 2 }}
680
877
  >
681
878
  {isRequired && <span style={{ color: '#ff4d4f' }}>* </span>}
682
- {key}
879
+ {fieldLabel}
683
880
  </Text>
684
881
  <InputNumber
685
882
  value={value}
@@ -705,7 +902,7 @@ export function NodePropertyPanel({
705
902
  >
706
903
  <Text type="secondary" style={{ fontSize: 13 }}>
707
904
  {isRequired && <span style={{ color: '#ff4d4f' }}>* </span>}
708
- {key}
905
+ {fieldLabel}
709
906
  </Text>
710
907
  <Switch
711
908
  checked={!!value}
@@ -725,7 +922,7 @@ export function NodePropertyPanel({
725
922
  style={{ fontSize: 13, display: 'block', marginBottom: 2 }}
726
923
  >
727
924
  {isRequired && <span style={{ color: '#ff4d4f' }}>* </span>}
728
- {key}
925
+ {fieldLabel}
729
926
  </Text>
730
927
  <Select
731
928
  mode="tags"
@@ -750,7 +947,7 @@ export function NodePropertyPanel({
750
947
  style={{ fontSize: 13, display: 'block', marginBottom: 4 }}
751
948
  >
752
949
  {isRequired && <span style={{ color: '#ff4d4f' }}>* </span>}
753
- {key}
950
+ {fieldLabel}
754
951
  </Text>
755
952
  {items.map((item, idx) => (
756
953
  <div
@@ -820,7 +1017,7 @@ export function NodePropertyPanel({
820
1017
  style={{ fontSize: 13, display: 'block', marginBottom: 2 }}
821
1018
  >
822
1019
  {isRequired && <span style={{ color: '#ff4d4f' }}>* </span>}
823
- {key}
1020
+ {fieldLabel}
824
1021
  <Text type="secondary" style={{ fontSize: 11 }}>
825
1022
  {' '}
826
1023
  (JSON)
@@ -852,7 +1049,7 @@ export function NodePropertyPanel({
852
1049
  style={{ fontSize: 13, display: 'block', marginBottom: 2 }}
853
1050
  >
854
1051
  {isRequired && <span style={{ color: '#ff4d4f' }}>* </span>}
855
- {key}
1052
+ {fieldLabel}
856
1053
  </Text>
857
1054
  <Input
858
1055
  value={
@@ -868,9 +1065,9 @@ export function NodePropertyPanel({
868
1065
  return (
869
1066
  <div
870
1067
  style={{
871
- width: 320,
872
- borderLeft: '1px solid #f0f0f0',
873
- background: '#fff',
1068
+ width: usesCustomConfigEditor ? 520 : 320,
1069
+ borderLeft: '1px solid var(--ant-color-border-secondary)',
1070
+ background: 'var(--ant-color-bg-container)',
874
1071
  display: 'flex',
875
1072
  flexDirection: 'column',
876
1073
  overflow: 'hidden',
@@ -880,7 +1077,7 @@ export function NodePropertyPanel({
880
1077
  <div
881
1078
  style={{
882
1079
  padding: '16px 16px 12px',
883
- borderBottom: '1px solid #f0f0f0',
1080
+ borderBottom: '1px solid var(--ant-color-border-secondary)',
884
1081
  display: 'flex',
885
1082
  justifyContent: 'space-between',
886
1083
  alignItems: 'flex-start',
@@ -903,7 +1100,10 @@ export function NodePropertyPanel({
903
1100
 
904
1101
  {/* Tab Switcher */}
905
1102
  <div
906
- style={{ padding: '12px 16px 0', borderBottom: '1px solid #f0f0f0' }}
1103
+ style={{
1104
+ padding: '12px 16px 0',
1105
+ borderBottom: '1px solid var(--ant-color-border-secondary)',
1106
+ }}
907
1107
  >
908
1108
  <Segmented
909
1109
  value={activeTab}
@@ -922,66 +1122,69 @@ export function NodePropertyPanel({
922
1122
  {activeTab === 'config' && (
923
1123
  <Space direction="vertical" size={12} style={{ width: '100%' }}>
924
1124
  {/* Instance Selector / Reference Banner */}
925
- {!node.instanceRef && (
926
- <div
927
- style={{
928
- padding: 12,
929
- background: '#fafafa',
930
- borderRadius: 6,
931
- }}
932
- >
933
- <Text
934
- type="secondary"
935
- style={{ fontSize: 12, display: 'block', marginBottom: 6 }}
1125
+ {currentNodeType?.instancePolicy !== 'INLINE_ONLY' &&
1126
+ !node.instanceRef && (
1127
+ <div
1128
+ style={{
1129
+ padding: 12,
1130
+ background: 'var(--ant-color-fill-quaternary)',
1131
+ borderRadius: 6,
1132
+ }}
936
1133
  >
937
- 复用已有实例
938
- </Text>
939
- <Select
940
- value={selectedInstanceId ?? undefined}
941
- onChange={(v) => setSelectedInstanceId(v)}
942
- placeholder={
943
- instanceLoading
944
- ? '加载中...'
945
- : instances.length === 0
946
- ? '暂无可用实例'
947
- : '选择实例...'
948
- }
949
- options={instances.map((i) => ({
950
- label: i.name,
951
- value: i.id,
952
- }))}
953
- style={{ width: '100%', marginBottom: 8 }}
954
- allowClear
955
- showSearch
956
- loading={instanceLoading}
957
- disabled={instances.length === 0 && !instanceLoading}
958
- filterOption={(input, option) =>
959
- (option?.label ?? '')
960
- .toLowerCase()
961
- .includes(input.toLowerCase())
962
- }
963
- />
964
- {selectedInstanceId && (
965
- <Space size={8}>
966
- <Button
967
- size="small"
968
- icon={<LinkOutlined />}
969
- onClick={handleReferenceInstance}
970
- >
971
- 引用(动态)
972
- </Button>
973
- <Button size="small" onClick={handleCopyAsTemplate}>
974
- 复制为模板
975
- </Button>
976
- </Space>
977
- )}
978
- </div>
979
- )}
1134
+ <Text
1135
+ type="secondary"
1136
+ style={{ fontSize: 12, display: 'block', marginBottom: 6 }}
1137
+ >
1138
+ 复用已有实例
1139
+ </Text>
1140
+ <Select
1141
+ value={selectedInstanceId ?? undefined}
1142
+ onChange={(v) => setSelectedInstanceId(v)}
1143
+ placeholder={
1144
+ instanceLoading
1145
+ ? '加载中...'
1146
+ : instances.length === 0
1147
+ ? '暂无可用实例'
1148
+ : '选择实例...'
1149
+ }
1150
+ options={instances.map((i) => ({
1151
+ label: i.name,
1152
+ value: i.id,
1153
+ }))}
1154
+ style={{ width: '100%', marginBottom: 8 }}
1155
+ allowClear
1156
+ showSearch
1157
+ loading={instanceLoading}
1158
+ disabled={instances.length === 0 && !instanceLoading}
1159
+ filterOption={(input, option) =>
1160
+ (option?.label ?? '')
1161
+ .toLowerCase()
1162
+ .includes(input.toLowerCase())
1163
+ }
1164
+ />
1165
+ {selectedInstanceId && (
1166
+ <Space size={8}>
1167
+ <Button
1168
+ size="small"
1169
+ icon={<LinkOutlined />}
1170
+ onClick={handleReferenceInstance}
1171
+ >
1172
+ 引用实例
1173
+ </Button>
1174
+ {currentNodeType?.instancePolicy === 'OPTIONAL' && (
1175
+ <Button size="small" onClick={handleCopyAsTemplate}>
1176
+ 复制为模板
1177
+ </Button>
1178
+ )}
1179
+ </Space>
1180
+ )}
1181
+ </div>
1182
+ )}
980
1183
  {node.instanceRef && (
981
1184
  <div
982
1185
  style={{
983
1186
  padding: '10px 12px',
984
- background: '#e6f7ff',
1187
+ background: 'var(--ant-color-primary-bg)',
985
1188
  borderRadius: 6,
986
1189
  display: 'flex',
987
1190
  alignItems: 'center',
@@ -989,17 +1192,24 @@ export function NodePropertyPanel({
989
1192
  }}
990
1193
  >
991
1194
  <Text style={{ fontSize: 13 }}>
992
- 🔗 引用: {node.instanceRef.instanceName}
1195
+ 🔗 引用实例: {node.instanceRef.instanceCode}
993
1196
  </Text>
994
- <Button
995
- size="small"
996
- icon={<DisconnectOutlined />}
997
- onClick={handleDetachReference}
998
- >
999
- 解除引用
1000
- </Button>
1197
+ {currentNodeType?.instancePolicy === 'OPTIONAL' && (
1198
+ <Button
1199
+ size="small"
1200
+ icon={<DisconnectOutlined />}
1201
+ onClick={handleDetachReference}
1202
+ >
1203
+ 解除引用
1204
+ </Button>
1205
+ )}
1001
1206
  </div>
1002
1207
  )}
1208
+ {node.instanceRef && (
1209
+ <Text type="secondary" style={{ fontSize: 12 }}>
1210
+ 修改只会保存在当前 Workflow,不会修改 Node Template。
1211
+ </Text>
1212
+ )}
1003
1213
 
1004
1214
  {/* Label */}
1005
1215
  <div>
@@ -1007,7 +1217,7 @@ export function NodePropertyPanel({
1007
1217
  strong
1008
1218
  style={{ fontSize: 14, display: 'block', marginBottom: 4 }}
1009
1219
  >
1010
- Label
1220
+ {t('editor.label')}
1011
1221
  </Text>
1012
1222
  <Input
1013
1223
  value={label}
@@ -1022,43 +1232,22 @@ export function NodePropertyPanel({
1022
1232
  strong
1023
1233
  style={{ fontSize: 14, display: 'block', marginBottom: 8 }}
1024
1234
  >
1025
- Config
1235
+ {t('editor.config')}
1026
1236
  </Text>
1027
- {node.instanceRef ? (
1028
- <Space
1029
- direction="vertical"
1030
- size={8}
1031
- style={{ width: '100%' }}
1237
+ {usesCustomConfigEditor ? (
1238
+ <Form
1239
+ form={configForm}
1240
+ layout="vertical"
1241
+ onValuesChange={(_, values) => {
1242
+ setConfig(values.config ?? {});
1243
+ setDirty(true);
1244
+ }}
1032
1245
  >
1033
- {(() => {
1034
- const inst = instances.find(
1035
- (i) => i.id === node.instanceRef?.instanceId,
1036
- );
1037
- const refConfig = inst?.config ?? {};
1038
- return Object.entries(properties).map(([key]) => (
1039
- <div key={key}>
1040
- <Text
1041
- type="secondary"
1042
- style={{
1043
- fontSize: 13,
1044
- display: 'block',
1045
- marginBottom: 2,
1046
- }}
1047
- >
1048
- {key}
1049
- </Text>
1050
- <Text style={{ fontSize: 13, color: '#595959' }}>
1051
- {refConfig[key] !== undefined &&
1052
- refConfig[key] !== ''
1053
- ? typeof refConfig[key] === 'object'
1054
- ? JSON.stringify(refConfig[key])
1055
- : String(refConfig[key])
1056
- : '—'}
1057
- </Text>
1058
- </div>
1059
- ));
1060
- })()}
1061
- </Space>
1246
+ <SchemaForm
1247
+ schema={currentNodeType?.configSchema ?? null}
1248
+ uiSchema={effectiveUiSchema ?? null}
1249
+ />
1250
+ </Form>
1062
1251
  ) : (
1063
1252
  <Space
1064
1253
  direction="vertical"
@@ -1074,46 +1263,53 @@ export function NodePropertyPanel({
1074
1263
  )}
1075
1264
 
1076
1265
  {/* Save section */}
1077
- {!node.instanceRef && (
1078
- <div>
1079
- <Checkbox
1080
- checked={alsoSaveAsInstance}
1081
- onChange={(e) => setAlsoSaveAsInstance(e.target.checked)}
1082
- style={{ marginBottom: 8 }}
1083
- >
1084
- <Text style={{ fontSize: 13 }}>同时保存为实例(模版)</Text>
1085
- </Checkbox>
1086
- {alsoSaveAsInstance && (
1087
- <Space
1088
- direction="vertical"
1089
- size={6}
1090
- style={{ width: '100%', marginBottom: 8 }}
1091
- >
1092
- <Input
1093
- value={newInstanceName}
1094
- onChange={(e) => setNewInstanceName(e.target.value)}
1095
- placeholder="实例名称(必填)"
1096
- size="small"
1097
- />
1098
- <Input
1099
- value={newInstanceDesc}
1100
- onChange={(e) => setNewInstanceDesc(e.target.value)}
1101
- placeholder="描述(可选)"
1102
- size="small"
1103
- />
1104
- </Space>
1266
+ <div>
1267
+ {!node.instanceRef &&
1268
+ currentNodeType?.instancePolicy !== 'REQUIRED' && (
1269
+ <>
1270
+ <Checkbox
1271
+ checked={alsoSaveAsInstance}
1272
+ onChange={(e) => setAlsoSaveAsInstance(e.target.checked)}
1273
+ style={{ marginBottom: 8 }}
1274
+ >
1275
+ <Text style={{ fontSize: 13 }}>同时保存为实例(模版)</Text>
1276
+ </Checkbox>
1277
+ {alsoSaveAsInstance && (
1278
+ <Space
1279
+ direction="vertical"
1280
+ size={6}
1281
+ style={{ width: '100%', marginBottom: 8 }}
1282
+ >
1283
+ <Input
1284
+ value={newInstanceName}
1285
+ onChange={(e) => setNewInstanceName(e.target.value)}
1286
+ placeholder="实例名称(必填)"
1287
+ size="small"
1288
+ />
1289
+ <Input
1290
+ value={newInstanceDesc}
1291
+ onChange={(e) => setNewInstanceDesc(e.target.value)}
1292
+ placeholder="描述(可选)"
1293
+ size="small"
1294
+ />
1295
+ </Space>
1296
+ )}
1297
+ </>
1105
1298
  )}
1106
- <Button
1107
- type="primary"
1108
- block
1109
- loading={saveAsLoading}
1110
- disabled={alsoSaveAsInstance && !newInstanceName.trim()}
1111
- onClick={handleSave}
1112
- >
1113
- 保存修改
1114
- </Button>
1115
- </div>
1116
- )}
1299
+ <Button
1300
+ type="primary"
1301
+ block
1302
+ loading={saveAsLoading}
1303
+ disabled={
1304
+ !node.instanceRef &&
1305
+ alsoSaveAsInstance &&
1306
+ !newInstanceName.trim()
1307
+ }
1308
+ onClick={handleSave}
1309
+ >
1310
+ {t('editor.saveChanges')}
1311
+ </Button>
1312
+ </div>
1117
1313
  </Space>
1118
1314
  )}
1119
1315