@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
@@ -12,7 +12,7 @@ import { seedNodeTypes } from './workflow-node-types';
12
12
  * Workflow 模块 seed
13
13
  *
14
14
  * 一站式负责 workflow 模块所有 seed:
15
- * 1. 菜单结构:workflow 父分组 + 2 个 leaf (workflow_list / workflow_node_instance)
15
+ * 1. 菜单结构:workflow 父分组及其管理、审批任务页面
16
16
  * 2. resource: workflow / workflowNodeInstance
17
17
  * 3. PageResource 绑定与 SYSTEM_ADMIN 授权
18
18
  * 4. 业务数据:node-types / workflows / event-trigger function & index
@@ -66,27 +66,58 @@ export async function seedWorkflowModule(prisma: PrismaClient): Promise<void> {
66
66
  resourceCode: 'workflowNodeInstance',
67
67
  resourceDescription: 'Workflow node instance management',
68
68
  },
69
+ {
70
+ code: 'workflow_connections',
71
+ zhName: '连接管理',
72
+ enName: 'Connections',
73
+ sortOrder: 3,
74
+ resourceCode: 'integrationConnection',
75
+ resourceDescription: 'Reusable external system connections',
76
+ },
69
77
  {
70
78
  code: 'workflow_temporal_tenant',
71
79
  zhName: '服务注册',
72
80
  enName: 'Service Registration',
73
- sortOrder: 3,
81
+ sortOrder: 4,
74
82
  resourceCode: 'temporalTenantConfig',
75
83
  resourceDescription: 'Temporal tenant config management',
76
84
  },
85
+ {
86
+ code: 'workflow_approval_channels',
87
+ zhName: '审批通道',
88
+ enName: 'Approval Channels',
89
+ sortOrder: 5,
90
+ resourceCode: 'approvalChannel',
91
+ resourceDescription:
92
+ 'Reusable dispatch and callback workflows for external approvals',
93
+ },
94
+ {
95
+ code: 'approval_tasks',
96
+ zhName: '审批任务',
97
+ enName: 'Approval Tasks',
98
+ sortOrder: 6,
99
+ resourceCode: 'humanApproval',
100
+ resourceDescription: 'Read and decide assigned Human Approval tasks',
101
+ },
77
102
  ];
78
103
 
79
104
  const allPages = [{ id: workflowPage.id, code: workflowPage.code }];
80
105
 
81
106
  for (const def of leafDefs) {
82
- const p = await upsertPage(prisma, {
83
- code: def.code,
84
- name: def.code,
85
- zhName: def.zhName,
86
- enName: def.enName,
87
- sortOrder: def.sortOrder,
88
- parentId: workflowPage.id,
89
- });
107
+ const p = await upsertPage(
108
+ prisma,
109
+ {
110
+ code: def.code,
111
+ name: def.code,
112
+ zhName: def.zhName,
113
+ enName: def.enName,
114
+ sortOrder: def.sortOrder,
115
+ parentId: workflowPage.id,
116
+ },
117
+ def.code === 'approval_tasks'
118
+ ? { parentId: workflowPage.id, sortOrder: def.sortOrder }
119
+ : {},
120
+ );
90
121
  allPages.push({ id: p.id, code: p.code });
91
122
  console.log(`[workflow] Page: ${p.code} (id=${p.id})`);
92
123
 
@@ -97,6 +128,26 @@ export async function seedWorkflowModule(prisma: PrismaClient): Promise<void> {
97
128
  def.resourceDescription,
98
129
  );
99
130
  console.log(`[workflow] PageResource: ${def.code} ↔ ${def.resourceCode}`);
131
+
132
+ // Provider actions live inside the existing Node Instance page. Resolve is
133
+ // seeded now for the later publish/runtime call path; it has no HTTP route yet.
134
+ if (def.code === 'workflow_node_instance') {
135
+ const providerResources = [
136
+ ['userGroup:read', 'Search and preview reusable user groups'],
137
+ ['userGroup:create', 'Create and maintain reusable user groups'],
138
+ ['subjectProviderSearch', 'Search subject provider resources'],
139
+ ['subjectProviderCreate', 'Create subject provider resources'],
140
+ ['subjectProviderPreview', 'Preview and validate subject references'],
141
+ [
142
+ 'subjectProviderResolve',
143
+ 'Resolve subjects during workflow execution',
144
+ ],
145
+ ] as const;
146
+ for (const [code, description] of providerResources) {
147
+ await bindResourceToPage(prisma, p.id, code, description);
148
+ console.log(`[workflow] PageResource: ${def.code} ↔ ${code}`);
149
+ }
150
+ }
100
151
  }
101
152
 
102
153
  // ── SYSTEM_ADMIN 授权 ──────────────────────────────────────────────────────
@@ -108,6 +159,70 @@ export async function seedWorkflowModule(prisma: PrismaClient): Promise<void> {
108
159
  );
109
160
  }
110
161
 
162
+ // 审批任务是所有业务角色的个人待办入口;移动到 Workflow 下不改变权限。
163
+ const approvalTasksPage = allPages.find(
164
+ (page) => page.code === 'approval_tasks',
165
+ );
166
+ if (approvalTasksPage) {
167
+ const resourceIds = await getPageResourceIds(prisma, approvalTasksPage.id);
168
+ for (const eligibleRole of await prisma.role.findMany()) {
169
+ await grantRoleAccess(
170
+ prisma,
171
+ eligibleRole.id,
172
+ approvalTasksPage.id,
173
+ resourceIds,
174
+ );
175
+ }
176
+ }
177
+
178
+ // Connection management is part of creating and maintaining reusable Node
179
+ // Templates. Keep its page access aligned with the existing Node Template
180
+ // page instead of limiting it to SYSTEM_ADMIN on installations that already
181
+ // granted workflow authoring to other roles.
182
+ const nodeTemplatePage = allPages.find(
183
+ (page) => page.code === 'workflow_node_instance',
184
+ );
185
+ const connectionsPage = allPages.find(
186
+ (page) => page.code === 'workflow_connections',
187
+ );
188
+ const approvalChannelsPage = allPages.find(
189
+ (page) => page.code === 'workflow_approval_channels',
190
+ );
191
+ if (nodeTemplatePage && connectionsPage && approvalChannelsPage) {
192
+ const authorRoles = await prisma.rolePages.findMany({
193
+ where: { pageId: nodeTemplatePage.id },
194
+ select: { roleId: true },
195
+ });
196
+ const connectionResourceIds = await getPageResourceIds(
197
+ prisma,
198
+ connectionsPage.id,
199
+ );
200
+ const approvalChannelResourceIds = await getPageResourceIds(
201
+ prisma,
202
+ approvalChannelsPage.id,
203
+ );
204
+ for (const { roleId } of authorRoles) {
205
+ await grantRoleAccess(
206
+ prisma,
207
+ roleId,
208
+ connectionsPage.id,
209
+ connectionResourceIds,
210
+ );
211
+ console.log(
212
+ `[workflow] Grant: role#${roleId} → workflow_connections (inherits Node Template access)`,
213
+ );
214
+ await grantRoleAccess(
215
+ prisma,
216
+ roleId,
217
+ approvalChannelsPage.id,
218
+ approvalChannelResourceIds,
219
+ );
220
+ console.log(
221
+ `[workflow] Grant: role#${roleId} → workflow_approval_channels (inherits Node Template access)`,
222
+ );
223
+ }
224
+ }
225
+
111
226
  // ── 业务数据 ───────────────────────────────────────────────────────────────
112
227
  await seedNodeTypes(prisma);
113
228
  await seedWorkflowEventTrigger(prisma);
@@ -53,6 +53,34 @@ const config: Record<string, any> = {
53
53
  address: 'http://127.0.0.1:3000/upload/',
54
54
  maxSize: 1024 * 1024 * 10,
55
55
  },
56
+ humanApprovalRuntime: runtimeConfig(),
57
+ workflow: {
58
+ publicBaseUrl: process.env.WORKFLOW_PUBLIC_BASE_URL ?? '',
59
+ publicHost: process.env.WORKFLOW_PUBLIC_HOST ?? '',
60
+ },
61
+ integration: {
62
+ secretKey: process.env.INTEGRATION_SECRET_KEY ?? '',
63
+ },
56
64
  };
57
65
 
66
+ function runtimeConfig() {
67
+ const rawEnabled =
68
+ process.env.WORKFLOW_RUNTIME_ENABLED ??
69
+ process.env.HUMAN_APPROVAL_RUNTIME_ENABLED;
70
+ if (rawEnabled !== undefined && !['true', 'false'].includes(rawEnabled))
71
+ throw new Error('WORKFLOW_RUNTIME_ENABLED must be exactly true or false');
72
+ const enabled = rawEnabled === 'true';
73
+ const token = process.env.WORKFLOW_RUNTIME_TOKEN ?? '';
74
+ if (enabled && token.length < 32)
75
+ throw new Error(
76
+ 'WORKFLOW_RUNTIME_TOKEN must contain at least 32 characters when Workflow runtime is enabled',
77
+ );
78
+ const tenantNamespace = process.env.GADMIN_TENANT_NAMESPACE ?? '';
79
+ if (enabled && !tenantNamespace)
80
+ throw new Error(
81
+ 'GADMIN_TENANT_NAMESPACE is required when Workflow runtime is enabled',
82
+ );
83
+ return { enabled, token, tenantNamespace };
84
+ }
85
+
58
86
  export default () => config;
@@ -0,0 +1,61 @@
1
+ import { Body, Controller, Module, Post, Req } from '@nestjs/common';
2
+ import { NestFactory } from '@nestjs/core';
3
+ import { NestExpressApplication } from '@nestjs/platform-express';
4
+ import { Request } from 'express';
5
+ import * as request from 'supertest';
6
+ import { configureJsonBodyParser } from './json-body-parser';
7
+
8
+ type RequestWithRawBody = Request & { rawBody?: Buffer };
9
+
10
+ @Controller()
11
+ class JsonBodyProbeController {
12
+ @Post('/probe')
13
+ probe(@Body() body: unknown, @Req() req: RequestWithRawBody) {
14
+ return {
15
+ body,
16
+ rawBodyLength: req.rawBody?.length ?? 0,
17
+ };
18
+ }
19
+ }
20
+
21
+ @Module({ controllers: [JsonBodyProbeController] })
22
+ class JsonBodyProbeModule {}
23
+
24
+ describe('configureJsonBodyParser', () => {
25
+ let app: NestExpressApplication;
26
+
27
+ beforeAll(async () => {
28
+ app = await NestFactory.create<NestExpressApplication>(
29
+ JsonBodyProbeModule,
30
+ {
31
+ logger: false,
32
+ rawBody: true,
33
+ },
34
+ );
35
+ configureJsonBodyParser(app);
36
+ await app.init();
37
+ });
38
+
39
+ afterAll(async () => {
40
+ await app.close();
41
+ });
42
+
43
+ it.each(['application/json', 'application/problem+json', 'text/json'])(
44
+ 'parses %s and preserves its raw body',
45
+ async (contentType) => {
46
+ const payload = {
47
+ adminUrl: 'http://127.0.0.1:8081',
48
+ namespace: 'test-namespace',
49
+ };
50
+
51
+ const response = await request(app.getHttpServer())
52
+ .post('/probe')
53
+ .set('Content-Type', contentType)
54
+ .send(JSON.stringify(payload))
55
+ .expect(201);
56
+
57
+ expect(response.body.body).toEqual(payload);
58
+ expect(response.body.rawBodyLength).toBeGreaterThan(0);
59
+ },
60
+ );
61
+ });
@@ -0,0 +1,7 @@
1
+ import { NestExpressApplication } from '@nestjs/platform-express';
2
+
3
+ export function configureJsonBodyParser(app: NestExpressApplication): void {
4
+ app.useBodyParser('json', {
5
+ type: ['application/json', 'application/*+json', 'text/json'],
6
+ });
7
+ }
@@ -0,0 +1,54 @@
1
+ import { ArgumentsHost, BadRequestException } from '@nestjs/common';
2
+ import { StructuredAllExceptionsFilter } from './structured-all-exceptions.filter';
3
+
4
+ function httpHost(url = '/api/workflowNodeInstance') {
5
+ const response = {
6
+ status: jest.fn().mockReturnThis(),
7
+ json: jest.fn(),
8
+ };
9
+ const host = {
10
+ switchToHttp: () => ({
11
+ getResponse: () => response,
12
+ getRequest: () => ({ url }),
13
+ }),
14
+ } as ArgumentsHost;
15
+ return { host, response };
16
+ }
17
+
18
+ describe('StructuredAllExceptionsFilter', () => {
19
+ it('preserves controlled response fields without expanding unknown errors', () => {
20
+ const filter = new StructuredAllExceptionsFilter();
21
+ const structured = httpHost();
22
+
23
+ filter.catch(
24
+ new BadRequestException({
25
+ code: 'SUBJECT_REF_INVALID',
26
+ issues: [{ code: 'NOT_FOUND', ref: 'group:missing' }],
27
+ }),
28
+ structured.host,
29
+ );
30
+
31
+ expect(structured.response.status).toHaveBeenCalledWith(400);
32
+ expect(structured.response.json).toHaveBeenCalledWith({
33
+ code: 'SUBJECT_REF_INVALID',
34
+ issues: [{ code: 'NOT_FOUND', ref: 'group:missing' }],
35
+ statusCode: 400,
36
+ message: 'Bad Request Exception',
37
+ error: 'BadRequestException',
38
+ path: '/api/workflowNodeInstance',
39
+ });
40
+
41
+ const unknown = httpHost();
42
+ filter.catch(
43
+ Object.assign(new Error('password=secret'), { token: 'must-not-leak' }),
44
+ unknown.host,
45
+ );
46
+
47
+ expect(unknown.response.json).toHaveBeenCalledWith({
48
+ statusCode: 500,
49
+ message: 'Internal server error.',
50
+ error: 'Error',
51
+ path: '/api/workflowNodeInstance',
52
+ });
53
+ });
54
+ });
@@ -0,0 +1,86 @@
1
+ import {
2
+ ArgumentsHost,
3
+ Catch,
4
+ ExceptionFilter,
5
+ HttpStatus,
6
+ } from '@nestjs/common';
7
+
8
+ interface ControlledException {
9
+ getStatus?: () => number;
10
+ getResponse?: () => unknown;
11
+ name?: string;
12
+ message?: string;
13
+ }
14
+
15
+ @Catch()
16
+ export class StructuredAllExceptionsFilter implements ExceptionFilter {
17
+ catch(exception: unknown, host: ArgumentsHost): void {
18
+ const context = host.switchToHttp();
19
+ const response = context.getResponse();
20
+ const request = context.getRequest<{ url?: string }>();
21
+ const controlled = this.asControlledException(exception);
22
+ const statusCode = this.statusFrom(controlled);
23
+ const payload = this.responseFrom(controlled);
24
+ const error = controlled?.name ?? 'Error';
25
+ const path = request.url ?? '';
26
+
27
+ if (isRecord(payload)) {
28
+ response.status(statusCode).json({
29
+ ...payload,
30
+ statusCode,
31
+ message: payload.message ?? controlled?.message ?? error,
32
+ error: payload.error ?? error,
33
+ path,
34
+ });
35
+ return;
36
+ }
37
+
38
+ response.status(statusCode).json({
39
+ statusCode,
40
+ message:
41
+ typeof payload === 'string'
42
+ ? payload
43
+ : statusCode === HttpStatus.INTERNAL_SERVER_ERROR
44
+ ? 'Internal server error.'
45
+ : controlled?.message ?? error,
46
+ error,
47
+ path,
48
+ });
49
+ }
50
+
51
+ private asControlledException(
52
+ exception: unknown,
53
+ ): ControlledException | undefined {
54
+ return exception !== null &&
55
+ (typeof exception === 'object' || typeof exception === 'function')
56
+ ? (exception as ControlledException)
57
+ : undefined;
58
+ }
59
+
60
+ private statusFrom(exception?: ControlledException): number {
61
+ if (typeof exception?.getStatus !== 'function') {
62
+ return HttpStatus.INTERNAL_SERVER_ERROR;
63
+ }
64
+ try {
65
+ const status = exception.getStatus();
66
+ return Number.isInteger(status)
67
+ ? status
68
+ : HttpStatus.INTERNAL_SERVER_ERROR;
69
+ } catch {
70
+ return HttpStatus.INTERNAL_SERVER_ERROR;
71
+ }
72
+ }
73
+
74
+ private responseFrom(exception?: ControlledException): unknown {
75
+ if (typeof exception?.getResponse !== 'function') return undefined;
76
+ try {
77
+ return exception.getResponse();
78
+ } catch {
79
+ return undefined;
80
+ }
81
+ }
82
+ }
83
+
84
+ function isRecord(value: unknown): value is Record<string, unknown> {
85
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
86
+ }
@@ -3,7 +3,7 @@ import './lib/tracing'; // OpenTelemetry Prisma instrumentation - 必须第一
3
3
  // 非终端环境禁用 ANSI 颜色,避免日志收集时出现裸转义码
4
4
  if (!process.stdout.isTTY) process.env.NO_COLOR = '1';
5
5
 
6
- import { AllExceptionsFilter, UserType } from '@gadmin2n/nest-common';
6
+ import { UserType } from '@gadmin2n/nest-common';
7
7
  import {
8
8
  ClassSerializerInterceptor,
9
9
  UnauthorizedException,
@@ -13,6 +13,7 @@ import './alias.config';
13
13
 
14
14
  import { ConfigService } from '@nestjs/config';
15
15
  import { HttpAdapterHost, NestFactory, Reflector } from '@nestjs/core';
16
+ import { NestExpressApplication } from '@nestjs/platform-express';
16
17
  import {
17
18
  DocumentBuilder,
18
19
  SwaggerDocumentOptions,
@@ -22,7 +23,9 @@ import 'dotenv/config';
22
23
  import { PrismaClientExceptionFilter, PrismaService } from 'nestjs-prisma';
23
24
  import { AppModule } from './app.module';
24
25
  import AuthGuard from './lib/auth.guard';
26
+ import { configureJsonBodyParser } from './lib/json-body-parser';
25
27
  import RolesGuard from './lib/roles.guard';
28
+ import { StructuredAllExceptionsFilter } from './lib/structured-all-exceptions.filter';
26
29
  import { UserService } from './modules/user/user.service';
27
30
  import cookieParser = require('cookie-parser');
28
31
 
@@ -37,10 +40,13 @@ JSON.stringify = (value: any, _: any, space: string | number | undefined) => {
37
40
  };
38
41
 
39
42
  async function bootstrap() {
40
- const app = await NestFactory.create(AppModule, {
43
+ const app = await NestFactory.create<NestExpressApplication>(AppModule, {
41
44
  cors: true,
42
45
  rawBody: true, // Required for HMAC verification on /api/workflow/webhook/:path
43
46
  });
47
+ // MyOA may deliver callback JSON as text/json instead of application/json.
48
+ // Keep the raw bytes so the same parser also remains usable for signed webhooks.
49
+ configureJsonBodyParser(app);
44
50
  // 添加全局前缀 '/api'
45
51
  app.setGlobalPrefix(`${process.env.DEPLOY_NAME || ''}/api`);
46
52
 
@@ -100,7 +106,7 @@ async function bootstrap() {
100
106
  const { httpAdapter } = app.get(HttpAdapterHost);
101
107
  app.useGlobalFilters(
102
108
  new PrismaClientExceptionFilter(httpAdapter),
103
- new AllExceptionsFilter(),
109
+ new StructuredAllExceptionsFilter(),
104
110
  );
105
111
 
106
112
  // Swagger Api
@@ -0,0 +1,89 @@
1
+ import { ACGuard } from '@gadmin2n/nest-common';
2
+ import {
3
+ Body,
4
+ Controller,
5
+ Get,
6
+ Param,
7
+ Patch,
8
+ Post,
9
+ Query,
10
+ Req,
11
+ UseGuards,
12
+ } from '@nestjs/common';
13
+ import { ApiTags } from '@nestjs/swagger';
14
+ import { UseRoles } from 'nest-access-control';
15
+ import {
16
+ actorContextFromRequest,
17
+ AuthenticatedActorRequest,
18
+ } from '../subjectProvider/actor-context.util';
19
+ import {
20
+ CreateApprovalChannelDto,
21
+ UpdateApprovalChannelDto,
22
+ } from './approval-channel.dto';
23
+ import { ApprovalChannelService } from './approval-channel.service';
24
+
25
+ @ApiTags('approval-channels')
26
+ @UseGuards(ACGuard)
27
+ @Controller('approval-channels')
28
+ export class ApprovalChannelController {
29
+ constructor(private readonly service: ApprovalChannelService) {}
30
+
31
+ @Get()
32
+ @UseRoles({
33
+ resource: 'approvalChannel',
34
+ action: 'read',
35
+ possession: 'any',
36
+ })
37
+ list(@Query('q') query?: string) {
38
+ return this.service.list(query?.trim() ?? '');
39
+ }
40
+
41
+ @Get('dispatch-workflows')
42
+ @UseRoles({
43
+ resource: 'approvalChannel',
44
+ action: 'read',
45
+ possession: 'any',
46
+ })
47
+ listDispatchWorkflows(
48
+ @Query('includeWorkflowId') includeWorkflowId?: string,
49
+ ) {
50
+ return this.service.listDispatchWorkflows(includeWorkflowId?.trim());
51
+ }
52
+
53
+ @Get(':code')
54
+ @UseRoles({
55
+ resource: 'approvalChannel',
56
+ action: 'read',
57
+ possession: 'any',
58
+ })
59
+ get(@Param('code') code: string) {
60
+ return this.service.get(code);
61
+ }
62
+
63
+ @Post()
64
+ @UseRoles({
65
+ resource: 'approvalChannel',
66
+ action: 'create',
67
+ possession: 'any',
68
+ })
69
+ create(
70
+ @Body() input: CreateApprovalChannelDto,
71
+ @Req() request: AuthenticatedActorRequest,
72
+ ) {
73
+ return this.service.create(input, actorContextFromRequest(request));
74
+ }
75
+
76
+ @Patch(':code')
77
+ @UseRoles({
78
+ resource: 'approvalChannel',
79
+ action: 'update',
80
+ possession: 'any',
81
+ })
82
+ update(
83
+ @Param('code') code: string,
84
+ @Body() input: UpdateApprovalChannelDto,
85
+ @Req() request: AuthenticatedActorRequest,
86
+ ) {
87
+ return this.service.update(code, input, actorContextFromRequest(request));
88
+ }
89
+ }
@@ -0,0 +1,68 @@
1
+ import { Type } from 'class-transformer';
2
+ import {
3
+ IsBoolean,
4
+ IsInt,
5
+ IsNotEmpty,
6
+ IsOptional,
7
+ IsString,
8
+ Matches,
9
+ MaxLength,
10
+ Min,
11
+ } from 'class-validator';
12
+
13
+ const CHANNEL_CODE_PATTERN = /^[a-z0-9]+(?:[-_][a-z0-9]+)*$/;
14
+ const POSITIVE_BIGINT_PATTERN = /^[1-9]\d*$/;
15
+
16
+ export class CreateApprovalChannelDto {
17
+ @IsOptional()
18
+ @IsString()
19
+ @IsNotEmpty()
20
+ @MaxLength(64)
21
+ @Matches(CHANNEL_CODE_PATTERN)
22
+ code?: string;
23
+
24
+ @IsString()
25
+ @IsNotEmpty()
26
+ @MaxLength(128)
27
+ name!: string;
28
+
29
+ @IsOptional()
30
+ @IsString()
31
+ @MaxLength(512)
32
+ description?: string;
33
+
34
+ @IsString()
35
+ @Matches(POSITIVE_BIGINT_PATTERN)
36
+ dispatchWorkflowId!: string;
37
+
38
+ @IsOptional()
39
+ @IsBoolean()
40
+ isEnabled?: boolean;
41
+ }
42
+
43
+ export class UpdateApprovalChannelDto {
44
+ @Type(() => Number)
45
+ @IsInt()
46
+ @Min(1)
47
+ expectedRevision!: number;
48
+
49
+ @IsOptional()
50
+ @IsString()
51
+ @IsNotEmpty()
52
+ @MaxLength(128)
53
+ name?: string;
54
+
55
+ @IsOptional()
56
+ @IsString()
57
+ @MaxLength(512)
58
+ description?: string | null;
59
+
60
+ @IsOptional()
61
+ @IsString()
62
+ @Matches(POSITIVE_BIGINT_PATTERN)
63
+ dispatchWorkflowId?: string;
64
+
65
+ @IsOptional()
66
+ @IsBoolean()
67
+ isEnabled?: boolean;
68
+ }