@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
@@ -0,0 +1,86 @@
1
+ import { fireEvent, render, screen, waitFor } from '@testing-library/react';
2
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
3
+ import { customRequest } from 'helpers/http';
4
+ import i18n from '../../../../i18n';
5
+ import { HumanApprovalConfigEditor } from './HumanApprovalConfigEditor';
6
+
7
+ vi.mock('helpers/http', () => ({ customRequest: vi.fn() }));
8
+ vi.mock('./SubjectPicker', () => ({
9
+ SubjectPicker: () => <div data-testid="subject-picker" />,
10
+ }));
11
+ vi.mock('./ApproverSourceEditor', () => ({
12
+ ApproverSourceEditor: () => <div data-testid="approver-source-editor" />,
13
+ }));
14
+
15
+ Object.defineProperty(window, 'matchMedia', {
16
+ writable: true,
17
+ value: () => ({
18
+ matches: false,
19
+ addListener: () => undefined,
20
+ removeListener: () => undefined,
21
+ addEventListener: () => undefined,
22
+ removeEventListener: () => undefined,
23
+ dispatchEvent: () => false,
24
+ }),
25
+ });
26
+
27
+ describe('HumanApprovalConfigEditor', () => {
28
+ beforeEach(async () => {
29
+ await i18n.changeLanguage('zh_CN');
30
+ vi.mocked(customRequest).mockResolvedValue([
31
+ {
32
+ code: 'myoa',
33
+ name: 'MyOA',
34
+ isEnabled: true,
35
+ inputParameters: [
36
+ { key: 'title', label: '单据标题', required: true },
37
+ { key: 'content', label: '审批内容', required: true },
38
+ ],
39
+ },
40
+ ] as never);
41
+ });
42
+
43
+ it('shows the selected channel contract and stores AP argument bindings', async () => {
44
+ const onChange = vi.fn();
45
+
46
+ render(
47
+ <HumanApprovalConfigEditor
48
+ value={{
49
+ channelRef: 'myoa',
50
+ channelInputBindings: {
51
+ title: { source: 'WORKFLOW', path: 'requestTitle' },
52
+ content: { source: 'INPUT', path: 'description' },
53
+ },
54
+ approverSources: [],
55
+ subjects: [],
56
+ approvalRule: { mode: 'ANY' },
57
+ rejectionRule: { mode: 'ANY' },
58
+ timeout: { durationSeconds: 0, action: 'REJECTED' },
59
+ }}
60
+ onChange={onChange}
61
+ schema={{ type: 'object' }}
62
+ />,
63
+ );
64
+
65
+ await waitFor(() =>
66
+ expect(screen.getByText('单据信息')).toBeInTheDocument(),
67
+ );
68
+ expect(screen.getByText('单据标题')).toBeInTheDocument();
69
+ expect(screen.getByText('审批内容')).toBeInTheDocument();
70
+ expect(screen.getByLabelText('单据标题的字段路径')).toHaveValue(
71
+ 'requestTitle',
72
+ );
73
+
74
+ fireEvent.change(screen.getByLabelText('单据标题的字段路径'), {
75
+ target: { value: 'approval.title' },
76
+ });
77
+
78
+ expect(onChange).toHaveBeenLastCalledWith(
79
+ expect.objectContaining({
80
+ channelInputBindings: expect.objectContaining({
81
+ title: { source: 'WORKFLOW', path: 'approval.title' },
82
+ }),
83
+ }),
84
+ );
85
+ });
86
+ });
@@ -0,0 +1,458 @@
1
+ import React, { useEffect, useMemo, useState } from 'react';
2
+ import {
3
+ Alert,
4
+ Button,
5
+ Card,
6
+ Divider,
7
+ InputNumber,
8
+ Radio,
9
+ Select,
10
+ Space,
11
+ Tag,
12
+ Typography,
13
+ } from 'antd';
14
+ import { ApiOutlined, DeleteOutlined, TeamOutlined } from '@ant-design/icons';
15
+ import type { WidgetProps } from '../schema-form/widget-registry';
16
+ import { useTranslation } from 'react-i18next';
17
+ import { customRequest } from 'helpers/http';
18
+ import { ApprovalRuleEditor } from './ApprovalRuleEditor';
19
+ import { SubjectPicker, type SubjectSelection } from './SubjectPicker';
20
+ import { ApproverSourceEditor } from './ApproverSourceEditor';
21
+ import type { ApproverSourceConfig } from './approver-source';
22
+ import { ParameterBindingEditor } from '../../components/ParameterBindingEditor';
23
+ import type { ParameterBinding } from '../../types/parameter-binding';
24
+
25
+ type Provider = 'USER' | 'USER_GROUP';
26
+ type SubjectSource =
27
+ | { source: 'STATIC'; provider: Provider; refs: string[] }
28
+ | { source: 'DYNAMIC'; provider: Provider; inputKey: string };
29
+ type Rule = {
30
+ mode: 'ANY' | 'ALL' | 'COUNT' | 'PERCENTAGE';
31
+ count?: number;
32
+ percentage?: number;
33
+ };
34
+ type ApprovalConfig = {
35
+ channelRef?: string;
36
+ channelInputBindings?: Record<string, ParameterBinding>;
37
+ approverSources?: ApproverSourceConfig[];
38
+ subjects: SubjectSource[];
39
+ approvalRule: Rule;
40
+ rejectionRule: Rule;
41
+ timeout: { durationSeconds: number; action: 'APPROVED' | 'REJECTED' };
42
+ };
43
+
44
+ type ApprovalChannelOption = {
45
+ code: string;
46
+ name: string;
47
+ isEnabled: boolean;
48
+ inputParameters: Array<{
49
+ key: string;
50
+ label?: string;
51
+ required?: boolean;
52
+ }>;
53
+ };
54
+
55
+ const RULE_SCHEMA = {
56
+ type: 'object' as const,
57
+ default: { mode: 'ANY' },
58
+ };
59
+
60
+ export function HumanApprovalConfigEditor({
61
+ value,
62
+ onChange,
63
+ disabled,
64
+ schema,
65
+ }: WidgetProps<ApprovalConfig | undefined>) {
66
+ const { t } = useTranslation('workflow');
67
+ const [channels, setChannels] = useState<ApprovalChannelOption[]>([]);
68
+ const config: ApprovalConfig = {
69
+ channelRef: value?.channelRef,
70
+ channelInputBindings: value?.channelInputBindings ?? {},
71
+ approverSources: value?.approverSources ?? [],
72
+ subjects: value?.subjects ?? [],
73
+ approvalRule: value?.approvalRule ?? { mode: 'ANY' },
74
+ rejectionRule: value?.rejectionRule ?? { mode: 'ANY' },
75
+ timeout: value?.timeout ?? { durationSeconds: 0, action: 'REJECTED' },
76
+ };
77
+ useEffect(() => {
78
+ customRequest<ApprovalChannelOption[]>('approval-channels', 'GET')
79
+ .then((items) => setChannels(items.filter((item) => item.isEnabled)))
80
+ .catch(() => setChannels([]));
81
+ }, []);
82
+ const staticSelections = useMemo<SubjectSelection[]>(() => {
83
+ const grouped = new Map<string, string[]>();
84
+ for (const subject of config.subjects) {
85
+ if (subject.source !== 'STATIC') continue;
86
+ grouped.set(subject.provider, [
87
+ ...new Set([...(grouped.get(subject.provider) ?? []), ...subject.refs]),
88
+ ]);
89
+ }
90
+ return [...grouped].map(([provider, refs]) => ({ provider, refs }));
91
+ }, [config.subjects]);
92
+ const dynamicSources = config.subjects.filter(
93
+ (subject): subject is Extract<SubjectSource, { source: 'DYNAMIC' }> =>
94
+ subject.source === 'DYNAMIC',
95
+ );
96
+ const selectedChannel = channels.find(
97
+ (channel) => channel.code === config.channelRef,
98
+ );
99
+
100
+ function update(patch: Partial<ApprovalConfig>) {
101
+ onChange({ ...config, ...patch });
102
+ }
103
+
104
+ function updateStatic(next: SubjectSelection[]) {
105
+ update({
106
+ subjects: [
107
+ ...next.map((subject) => ({
108
+ source: 'STATIC' as const,
109
+ provider: subject.provider as Provider,
110
+ refs: subject.refs,
111
+ })),
112
+ ...dynamicSources,
113
+ ],
114
+ });
115
+ }
116
+
117
+ function removeDynamic(inputKey: string) {
118
+ update({
119
+ subjects: config.subjects.filter(
120
+ (subject) =>
121
+ subject.source !== 'DYNAMIC' || subject.inputKey !== inputKey,
122
+ ),
123
+ });
124
+ }
125
+
126
+ return (
127
+ <Space direction="vertical" size={16} style={{ width: '100%' }}>
128
+ <Card
129
+ size="small"
130
+ title={
131
+ <Space>
132
+ <TeamOutlined />
133
+ <span>{t('approval.whoCanApprove')}</span>
134
+ </Space>
135
+ }
136
+ >
137
+ <Typography.Paragraph type="secondary">
138
+ {t('approval.description')}
139
+ </Typography.Paragraph>
140
+ <Typography.Text strong>{t('approval.fixedApprovers')}</Typography.Text>
141
+ <div style={{ marginTop: 8 }}>
142
+ <SubjectPicker
143
+ value={staticSelections}
144
+ onChange={updateStatic}
145
+ disabled={disabled}
146
+ schema={schema}
147
+ />
148
+ </div>
149
+
150
+ {dynamicSources.length > 0 && (
151
+ <Space direction="vertical" size={8} style={{ width: '100%' }}>
152
+ <Divider />
153
+ <Alert
154
+ type="info"
155
+ showIcon
156
+ message={t('approval.directLookup')}
157
+ description={t('approval.directLookupHint')}
158
+ />
159
+ {dynamicSources.map((source) => {
160
+ const isUser = source.provider === 'USER';
161
+ return (
162
+ <div
163
+ key={source.inputKey}
164
+ style={{
165
+ display: 'flex',
166
+ alignItems: 'center',
167
+ justifyContent: 'space-between',
168
+ gap: 12,
169
+ padding: '10px 12px',
170
+ border: '1px solid #91caff',
171
+ borderRadius: 8,
172
+ background: '#f5faff',
173
+ }}
174
+ >
175
+ <Space>
176
+ <ApiOutlined style={{ color: '#1677ff' }} />
177
+ <div>
178
+ <Typography.Text strong>
179
+ {isUser
180
+ ? t('approval.userIds')
181
+ : t('approval.groupIds')}
182
+ </Typography.Text>
183
+ <Typography.Text
184
+ type="secondary"
185
+ style={{ display: 'block', fontSize: 12 }}
186
+ >
187
+ {t('approval.lookupDescription')}
188
+ </Typography.Text>
189
+ </div>
190
+ </Space>
191
+ <Space>
192
+ <Tag color="blue">
193
+ {t('approval.lookup')}: {source.inputKey}
194
+ </Tag>
195
+ <Button
196
+ type="text"
197
+ danger
198
+ aria-label={t('approval.remove', {
199
+ name: source.inputKey,
200
+ })}
201
+ icon={<DeleteOutlined />}
202
+ disabled={disabled}
203
+ onClick={() => removeDynamic(source.inputKey)}
204
+ />
205
+ </Space>
206
+ </div>
207
+ );
208
+ })}
209
+ </Space>
210
+ )}
211
+
212
+ <Divider />
213
+
214
+ <ApproverSourceEditor
215
+ value={config.approverSources ?? []}
216
+ disabled={disabled}
217
+ onChange={(approverSources) => update({ approverSources })}
218
+ />
219
+ </Card>
220
+
221
+ <Card size="small" title={t('approval.decisionRules')}>
222
+ <Space direction="vertical" size={14} style={{ width: '100%' }}>
223
+ <div>
224
+ <Typography.Text strong>
225
+ {t('approval.approveWhen')}
226
+ </Typography.Text>
227
+ <div style={{ marginTop: 6 }}>
228
+ <ApprovalRuleEditor
229
+ value={config.approvalRule}
230
+ onChange={(approvalRule) => update({ approvalRule })}
231
+ disabled={disabled}
232
+ schema={RULE_SCHEMA}
233
+ />
234
+ </div>
235
+ </div>
236
+ <div>
237
+ <Typography.Text strong>{t('approval.rejectWhen')}</Typography.Text>
238
+ <div style={{ marginTop: 6 }}>
239
+ <ApprovalRuleEditor
240
+ value={config.rejectionRule}
241
+ onChange={(rejectionRule) => update({ rejectionRule })}
242
+ disabled={disabled}
243
+ schema={RULE_SCHEMA}
244
+ />
245
+ </div>
246
+ </div>
247
+ </Space>
248
+ </Card>
249
+
250
+ <Card
251
+ size="small"
252
+ title={
253
+ <Space>
254
+ <ApiOutlined />
255
+ <span>{t('approval.channel')}</span>
256
+ </Space>
257
+ }
258
+ >
259
+ <Typography.Paragraph type="secondary">
260
+ {t('approval.channelDescription')}
261
+ </Typography.Paragraph>
262
+ <Select
263
+ allowClear
264
+ showSearch
265
+ optionFilterProp="label"
266
+ disabled={disabled}
267
+ value={config.channelRef}
268
+ placeholder={t('approval.builtInInbox')}
269
+ options={channels.map((channel) => ({
270
+ value: channel.code,
271
+ label: channel.name,
272
+ }))}
273
+ onChange={(channelRef) => {
274
+ const channel = channels.find((item) => item.code === channelRef);
275
+ update({
276
+ channelRef,
277
+ channelInputBindings: channel
278
+ ? Object.fromEntries(
279
+ channel.inputParameters.map((parameter) => [
280
+ parameter.key,
281
+ config.channelInputBindings?.[parameter.key] ?? {
282
+ source: 'WORKFLOW',
283
+ path: parameter.key,
284
+ },
285
+ ]),
286
+ )
287
+ : {},
288
+ });
289
+ }}
290
+ style={{ width: '100%' }}
291
+ />
292
+ <Typography.Text
293
+ type="secondary"
294
+ style={{ display: 'block', fontSize: 12, marginTop: 8 }}
295
+ >
296
+ {config.channelRef
297
+ ? t('approval.externalChannelHint')
298
+ : t('approval.builtInInboxHint')}
299
+ </Typography.Text>
300
+ {selectedChannel && selectedChannel.inputParameters.length > 0 && (
301
+ <>
302
+ <Divider />
303
+ <Typography.Text strong>
304
+ {t('approval.channelInputs')}
305
+ </Typography.Text>
306
+ <Typography.Paragraph
307
+ type="secondary"
308
+ style={{ marginTop: 4, marginBottom: 12 }}
309
+ >
310
+ {t('approval.channelInputsDescription')}
311
+ </Typography.Paragraph>
312
+ <Space direction="vertical" size={14} style={{ width: '100%' }}>
313
+ {selectedChannel.inputParameters.map((parameter) => {
314
+ const name = parameter.label?.trim() || parameter.key;
315
+ return (
316
+ <div key={parameter.key}>
317
+ <Space size={6} style={{ marginBottom: 6 }}>
318
+ <Typography.Text strong>{name}</Typography.Text>
319
+ {parameter.required && (
320
+ <Tag color="blue">{t('approval.required')}</Tag>
321
+ )}
322
+ </Space>
323
+ <ParameterBindingEditor
324
+ name={name}
325
+ defaultPath={parameter.key}
326
+ value={config.channelInputBindings?.[parameter.key]}
327
+ disabled={disabled}
328
+ onChange={(binding) =>
329
+ update({
330
+ channelInputBindings: {
331
+ ...config.channelInputBindings,
332
+ [parameter.key]: binding,
333
+ },
334
+ })
335
+ }
336
+ />
337
+ </div>
338
+ );
339
+ })}
340
+ </Space>
341
+ </>
342
+ )}
343
+ </Card>
344
+
345
+ <TimeoutSection
346
+ value={config.timeout}
347
+ disabled={disabled}
348
+ onChange={(timeout) => update({ timeout })}
349
+ />
350
+ </Space>
351
+ );
352
+ }
353
+
354
+ type TimeoutUnit = 'MINUTES' | 'HOURS' | 'DAYS';
355
+
356
+ function TimeoutSection({
357
+ value,
358
+ disabled,
359
+ onChange,
360
+ }: {
361
+ value: ApprovalConfig['timeout'];
362
+ disabled?: boolean;
363
+ onChange(value: ApprovalConfig['timeout']): void;
364
+ }) {
365
+ const { t } = useTranslation('workflow');
366
+ const [unit, setUnit] = useState<TimeoutUnit>(() => preferredUnit(value));
367
+ const never = value.durationSeconds === 0;
368
+ const factor = unit === 'DAYS' ? 86400 : unit === 'HOURS' ? 3600 : 60;
369
+ const amount = never ? 1 : Math.max(1, value.durationSeconds / factor);
370
+
371
+ return (
372
+ <Card size="small" title={t('approval.timeout')}>
373
+ <Radio.Group
374
+ value={never ? 'NEVER' : 'AFTER'}
375
+ disabled={disabled}
376
+ onChange={(event) =>
377
+ onChange({
378
+ ...value,
379
+ durationSeconds: event.target.value === 'NEVER' ? 0 : factor,
380
+ })
381
+ }
382
+ >
383
+ <Radio value="NEVER">{t('approval.neverTimeout')}</Radio>
384
+ <Radio value="AFTER">{t('approval.timeoutAfter')}</Radio>
385
+ </Radio.Group>
386
+
387
+ {!never && (
388
+ <Space
389
+ direction="vertical"
390
+ size={12}
391
+ style={{ width: '100%', marginTop: 16 }}
392
+ >
393
+ <Space.Compact style={{ width: '100%' }}>
394
+ <InputNumber
395
+ aria-label={t('approval.timeoutAmount')}
396
+ min={1}
397
+ precision={0}
398
+ value={amount}
399
+ disabled={disabled}
400
+ onChange={(next) =>
401
+ onChange({
402
+ ...value,
403
+ durationSeconds: Math.max(1, next ?? 1) * factor,
404
+ })
405
+ }
406
+ style={{ width: '100%' }}
407
+ />
408
+ <Select
409
+ aria-label={t('approval.timeoutUnit')}
410
+ value={unit}
411
+ disabled={disabled}
412
+ options={[
413
+ { label: t('approval.minutes'), value: 'MINUTES' },
414
+ { label: t('approval.hours'), value: 'HOURS' },
415
+ { label: t('approval.days'), value: 'DAYS' },
416
+ ]}
417
+ onChange={(next: TimeoutUnit) => {
418
+ setUnit(next);
419
+ }}
420
+ style={{ width: 130 }}
421
+ />
422
+ </Space.Compact>
423
+ <div>
424
+ <Typography.Text strong>
425
+ {t('approval.whenTimeRunsOut')}
426
+ </Typography.Text>
427
+ <Select
428
+ aria-label={t('approval.timeoutAction')}
429
+ value={value.action}
430
+ disabled={disabled}
431
+ options={[
432
+ { label: t('approval.autoReject'), value: 'REJECTED' },
433
+ { label: t('approval.autoApprove'), value: 'APPROVED' },
434
+ ]}
435
+ onChange={(action) => onChange({ ...value, action })}
436
+ style={{ width: '100%', marginTop: 6 }}
437
+ />
438
+ </div>
439
+ </Space>
440
+ )}
441
+ {never && (
442
+ <Typography.Paragraph
443
+ type="secondary"
444
+ style={{ marginTop: 12, marginBottom: 0 }}
445
+ >
446
+ {t('approval.waitHint')}
447
+ </Typography.Paragraph>
448
+ )}
449
+ </Card>
450
+ );
451
+ }
452
+
453
+ function preferredUnit(timeout: ApprovalConfig['timeout']): TimeoutUnit {
454
+ const seconds = timeout.durationSeconds;
455
+ if (seconds > 0 && seconds % 86400 === 0) return 'DAYS';
456
+ if (seconds > 0 && seconds % 3600 === 0) return 'HOURS';
457
+ return 'MINUTES';
458
+ }
@@ -0,0 +1,81 @@
1
+ import { fireEvent, render, screen } from '@testing-library/react';
2
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
3
+ import i18n from '../../../../i18n';
4
+ import { ReturnResultConfigEditor } from './ReturnResultConfigEditor';
5
+
6
+ const schema = { type: 'object' as const };
7
+
8
+ describe('ReturnResultConfigEditor', () => {
9
+ beforeEach(async () => {
10
+ await i18n.changeLanguage('en');
11
+ });
12
+
13
+ it('uses the connected previous node by default without asking for a path', () => {
14
+ const onChange = vi.fn();
15
+ render(
16
+ <ReturnResultConfigEditor
17
+ value={undefined}
18
+ onChange={onChange}
19
+ schema={schema}
20
+ />,
21
+ );
22
+
23
+ expect(
24
+ screen.getByText('Return the previous node result'),
25
+ ).toBeInTheDocument();
26
+ expect(screen.queryByLabelText('Workflow data field')).toBeNull();
27
+ expect(onChange).toHaveBeenCalledWith({
28
+ resultType: 'JSON',
29
+ sourceMode: 'INPUT',
30
+ httpStatusCode: 200,
31
+ httpHeaders: {},
32
+ });
33
+ });
34
+
35
+ it('can return a field from the original Workflow data', () => {
36
+ const onChange = vi.fn();
37
+ render(
38
+ <ReturnResultConfigEditor
39
+ value={{
40
+ resultType: 'APPROVAL_SUBJECTS',
41
+ sourceMode: 'WORKFLOW',
42
+ path: 'approvers',
43
+ }}
44
+ onChange={onChange}
45
+ schema={schema}
46
+ />,
47
+ );
48
+
49
+ expect(screen.getByLabelText('Workflow data field')).toHaveValue(
50
+ 'approvers',
51
+ );
52
+ fireEvent.click(
53
+ screen.getByRole('radio', { name: 'Return the previous node result' }),
54
+ );
55
+ expect(onChange).toHaveBeenLastCalledWith({
56
+ resultType: 'APPROVAL_SUBJECTS',
57
+ sourceMode: 'INPUT',
58
+ });
59
+ });
60
+
61
+ it('configures ordinary data with an HTTP status for external callers', () => {
62
+ const onChange = vi.fn();
63
+ render(
64
+ <ReturnResultConfigEditor
65
+ value={{
66
+ resultType: 'JSON',
67
+ sourceMode: 'INPUT',
68
+ httpStatusCode: 201,
69
+ httpHeaders: {},
70
+ }}
71
+ onChange={onChange}
72
+ schema={schema}
73
+ />,
74
+ );
75
+
76
+ expect(screen.getByRole('radio', { name: 'Ordinary data' })).toBeChecked();
77
+ expect(
78
+ screen.getByRole('spinbutton', { name: 'HTTP status code' }),
79
+ ).toHaveValue('201');
80
+ });
81
+ });