@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,218 @@
1
+ import React from 'react';
2
+ import { fireEvent, render, screen, waitFor } from '@testing-library/react';
3
+ import { Form } from 'antd';
4
+ import type { FormInstance } from 'antd';
5
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
6
+ import i18n from '../../../../i18n';
7
+ import { SchemaForm } from './SchemaForm';
8
+ import { WidgetRegistry, type WidgetProps } from './widget-registry';
9
+
10
+ Object.defineProperty(window, 'matchMedia', {
11
+ writable: true,
12
+ value: () => ({
13
+ matches: false,
14
+ addListener: () => undefined,
15
+ removeListener: () => undefined,
16
+ addEventListener: () => undefined,
17
+ removeEventListener: () => undefined,
18
+ dispatchEvent: () => false,
19
+ }),
20
+ });
21
+
22
+ describe('SchemaForm', () => {
23
+ beforeEach(async () => {
24
+ await i18n.changeLanguage('en');
25
+ });
26
+
27
+ it('renders nested primitives and addable array fields under config', async () => {
28
+ let form!: FormInstance;
29
+ function TestForm() {
30
+ [form] = Form.useForm();
31
+ return (
32
+ <Form
33
+ form={form}
34
+ initialValues={{
35
+ config: { timeout: { duration: 30 }, subjects: ['alice'] },
36
+ }}
37
+ >
38
+ <SchemaForm
39
+ schema={{
40
+ type: 'object',
41
+ required: ['requiredSettings'],
42
+ properties: {
43
+ timeout: {
44
+ type: 'object',
45
+ properties: {
46
+ duration: { type: 'integer', title: 'Duration' },
47
+ },
48
+ },
49
+ subjects: {
50
+ type: 'array',
51
+ title: 'Subjects',
52
+ items: { type: 'string', title: 'Subject' },
53
+ },
54
+ requiredSettings: {
55
+ type: 'object',
56
+ title: 'Required settings',
57
+ properties: {},
58
+ },
59
+ optionalSettings: {
60
+ type: 'object',
61
+ title: 'Optional settings',
62
+ properties: {},
63
+ },
64
+ },
65
+ }}
66
+ />
67
+ </Form>
68
+ );
69
+ }
70
+ render(<TestForm />);
71
+
72
+ expect(screen.getByLabelText('Duration')).toHaveValue('30');
73
+ expect(screen.getByLabelText('Subject 1')).toHaveValue('alice');
74
+
75
+ fireEvent.click(screen.getByRole('button', { name: 'Add Subjects' }));
76
+ expect(screen.getByLabelText('Subject 2')).toBeInTheDocument();
77
+
78
+ fireEvent.click(screen.getByRole('button', { name: 'Remove Subject 1' }));
79
+ expect(screen.queryByDisplayValue('alice')).not.toBeInTheDocument();
80
+
81
+ await expect(form.validateFields()).rejects.toBeDefined();
82
+ form.setFieldValue(['config', 'requiredSettings'], {});
83
+ await expect(form.validateFields()).resolves.toBeDefined();
84
+ });
85
+
86
+ it('resolves a custom widget only from uiSchema and passes its value', () => {
87
+ const registry = new WidgetRegistry();
88
+ const receivedValues: unknown[] = [];
89
+ function SubjectPicker({ value }: WidgetProps) {
90
+ receivedValues.push(value);
91
+ return <div data-testid="subject-picker">{JSON.stringify(value)}</div>;
92
+ }
93
+ registry.register('subject-picker', SubjectPicker);
94
+
95
+ render(
96
+ <Form initialValues={{ config: { subjects: ['group:ops'] } }}>
97
+ <SchemaForm
98
+ registry={registry}
99
+ schema={{
100
+ type: 'object',
101
+ properties: {
102
+ subjects: {
103
+ type: 'array',
104
+ title: 'Subjects',
105
+ items: { type: 'string' },
106
+ },
107
+ },
108
+ }}
109
+ uiSchema={{
110
+ fields: { subjects: { widget: 'subject-picker' } },
111
+ }}
112
+ />
113
+ </Form>,
114
+ );
115
+
116
+ expect(screen.getByTestId('subject-picker')).toHaveTextContent(
117
+ '["group:ops"]',
118
+ );
119
+ expect(receivedValues).toContainEqual(['group:ops']);
120
+ });
121
+
122
+ it('reports and renders an unknown widget, then clears the error', async () => {
123
+ const onSchemaError = vi.fn();
124
+ const schema = {
125
+ type: 'object' as const,
126
+ properties: { subject: { type: 'string' as const } },
127
+ };
128
+ const { rerender } = render(
129
+ <Form>
130
+ <SchemaForm
131
+ schema={schema}
132
+ uiSchema={{ fields: { subject: { widget: 'missing-picker' } } }}
133
+ registry={new WidgetRegistry()}
134
+ onSchemaError={onSchemaError}
135
+ />
136
+ </Form>,
137
+ );
138
+
139
+ expect(
140
+ screen.getByText('Unsupported widget: missing-picker'),
141
+ ).toBeVisible();
142
+ await waitFor(() =>
143
+ expect(onSchemaError).toHaveBeenLastCalledWith(expect.any(Error)),
144
+ );
145
+
146
+ rerender(
147
+ <Form>
148
+ <SchemaForm
149
+ schema={{
150
+ type: 'object',
151
+ properties: { subjects: { type: 'array' } },
152
+ }}
153
+ uiSchema={{
154
+ fields: {
155
+ subjects: { items: { widget: 'missing-item-widget' } },
156
+ },
157
+ }}
158
+ registry={new WidgetRegistry()}
159
+ onSchemaError={onSchemaError}
160
+ />
161
+ </Form>,
162
+ );
163
+ await waitFor(() =>
164
+ expect(onSchemaError).toHaveBeenLastCalledWith(expect.any(Error)),
165
+ );
166
+ expect(onSchemaError.mock.calls.at(-1)?.[0]?.message).toBe(
167
+ 'Unsupported widget: missing-item-widget',
168
+ );
169
+
170
+ rerender(
171
+ <Form>
172
+ <SchemaForm
173
+ schema={schema}
174
+ uiSchema={{
175
+ fields: {
176
+ subject: {},
177
+ missingSchemaField: { widget: 'missing-field-widget' },
178
+ },
179
+ subject: { widget: 'shadowed-widget' },
180
+ options: { widget: 'options-widget' },
181
+ }}
182
+ registry={new WidgetRegistry()}
183
+ onSchemaError={onSchemaError}
184
+ />
185
+ </Form>,
186
+ );
187
+
188
+ await waitFor(() => expect(onSchemaError).toHaveBeenLastCalledWith(null));
189
+ expect(screen.queryByText(/Unsupported widget:/)).not.toBeInTheDocument();
190
+
191
+ rerender(
192
+ <Form>
193
+ <SchemaForm
194
+ schema={schema}
195
+ uiSchema={{ fields: { subject: { widget: 'missing-picker' } } }}
196
+ registry={new WidgetRegistry()}
197
+ onSchemaError={onSchemaError}
198
+ />
199
+ </Form>,
200
+ );
201
+ await waitFor(() =>
202
+ expect(onSchemaError).toHaveBeenLastCalledWith(expect.any(Error)),
203
+ );
204
+
205
+ rerender(
206
+ <Form>
207
+ <SchemaForm
208
+ schema={null}
209
+ uiSchema={{ fields: { subject: { widget: 'missing-picker' } } }}
210
+ registry={new WidgetRegistry()}
211
+ onSchemaError={onSchemaError}
212
+ />
213
+ </Form>,
214
+ );
215
+ await waitFor(() => expect(onSchemaError).toHaveBeenLastCalledWith(null));
216
+ expect(screen.queryByText(/Unsupported widget:/)).not.toBeInTheDocument();
217
+ });
218
+ });
@@ -0,0 +1,83 @@
1
+ import React, { useEffect, useMemo } from 'react';
2
+ import type { JsonSchema, UiSchema } from './schema.types';
3
+ import {
4
+ defaultWidgetRegistry,
5
+ registerDefaultWidgets,
6
+ } from './default-widgets';
7
+ import { resolveChildUiSchema, SchemaField } from './SchemaField';
8
+ import type { WidgetRegistry } from './widget-registry';
9
+
10
+ interface SchemaFormProps {
11
+ schema: JsonSchema | null;
12
+ uiSchema?: UiSchema | null;
13
+ disabled?: boolean;
14
+ registry?: WidgetRegistry;
15
+ onSchemaError?: (error: Error | null) => void;
16
+ }
17
+
18
+ function findUnsupportedWidget(
19
+ schema: JsonSchema | null,
20
+ uiSchema: UiSchema | null | undefined,
21
+ registry: WidgetRegistry,
22
+ ): string | null {
23
+ if (!schema) return null;
24
+ if (uiSchema?.widget) {
25
+ return registry.has(uiSchema.widget) ? null : uiSchema.widget;
26
+ }
27
+
28
+ if (schema.type === 'object' || schema.properties) {
29
+ for (const [key, childSchema] of Object.entries(schema.properties ?? {})) {
30
+ const unsupported = findUnsupportedWidget(
31
+ childSchema,
32
+ resolveChildUiSchema(uiSchema ?? undefined, key),
33
+ registry,
34
+ );
35
+ if (unsupported) return unsupported;
36
+ }
37
+ } else if (schema.type === 'array') {
38
+ return findUnsupportedWidget(
39
+ schema.items ?? { type: 'string' },
40
+ uiSchema?.items,
41
+ registry,
42
+ );
43
+ }
44
+
45
+ return null;
46
+ }
47
+
48
+ export function SchemaForm({
49
+ schema,
50
+ uiSchema,
51
+ disabled,
52
+ registry = defaultWidgetRegistry,
53
+ onSchemaError,
54
+ }: SchemaFormProps) {
55
+ registerDefaultWidgets(registry);
56
+ const unsupportedWidget = useMemo(
57
+ () => findUnsupportedWidget(schema, uiSchema, registry),
58
+ [registry, schema, uiSchema],
59
+ );
60
+ const schemaError = useMemo(
61
+ () =>
62
+ unsupportedWidget
63
+ ? new Error(`Unsupported widget: ${unsupportedWidget}`)
64
+ : null,
65
+ [unsupportedWidget],
66
+ );
67
+
68
+ useEffect(() => {
69
+ onSchemaError?.(schemaError);
70
+ }, [onSchemaError, schemaError]);
71
+
72
+ if (!schema) return null;
73
+ return (
74
+ <SchemaField
75
+ schema={schema}
76
+ uiSchema={uiSchema ?? undefined}
77
+ name={['config']}
78
+ registry={registry}
79
+ disabled={disabled}
80
+ root
81
+ />
82
+ );
83
+ }
@@ -0,0 +1,135 @@
1
+ import { Input, InputNumber, Select, Switch } from 'antd';
2
+ import { ApprovalRequestTriggerConfigEditor } from '../widgets/ApprovalRequestTriggerConfigEditor';
3
+ import { ApprovalRuleEditor } from '../widgets/ApprovalRuleEditor';
4
+ import { CallableInputParametersEditor } from '../widgets/CallableInputParametersEditor';
5
+ import { CodeConfigEditor } from '../widgets/CodeConfigEditor';
6
+ import { ExternalRequestConfigEditor } from '../widgets/ExternalRequestConfigEditor';
7
+ import { ExternalWaitConfigEditor } from '../widgets/ExternalWaitConfigEditor';
8
+ import { HttpRequestConfigEditor } from '../widgets/HttpRequestConfigEditor';
9
+ import { HumanApprovalConfigEditor } from '../widgets/HumanApprovalConfigEditor';
10
+ import { ReturnResultConfigEditor } from '../widgets/ReturnResultConfigEditor';
11
+ import { SubjectPicker } from '../widgets/SubjectPicker';
12
+ import { SubmitApprovalResultConfigEditor } from '../widgets/SubmitApprovalResultConfigEditor';
13
+ import { SubmitExternalResultConfigEditor } from '../widgets/SubmitExternalResultConfigEditor';
14
+ import {
15
+ widgetRegistry,
16
+ type WidgetComponent,
17
+ type WidgetProps,
18
+ type WidgetRegistry,
19
+ } from './widget-registry';
20
+
21
+ function TextWidget({ id, value, onChange, disabled }: WidgetProps<string>) {
22
+ return (
23
+ <Input
24
+ id={id}
25
+ value={value}
26
+ onChange={(event) => onChange(event.target.value)}
27
+ disabled={disabled}
28
+ />
29
+ );
30
+ }
31
+
32
+ function TextareaWidget({
33
+ id,
34
+ value,
35
+ onChange,
36
+ disabled,
37
+ }: WidgetProps<string>) {
38
+ return (
39
+ <Input.TextArea
40
+ id={id}
41
+ rows={3}
42
+ value={value}
43
+ onChange={(event) => onChange(event.target.value)}
44
+ disabled={disabled}
45
+ />
46
+ );
47
+ }
48
+
49
+ function NumberWidget({
50
+ id,
51
+ value,
52
+ onChange,
53
+ disabled,
54
+ schema,
55
+ }: WidgetProps<number | null>) {
56
+ return (
57
+ <InputNumber
58
+ id={id}
59
+ value={value}
60
+ onChange={onChange}
61
+ disabled={disabled}
62
+ precision={schema.type === 'integer' ? 0 : undefined}
63
+ style={{ width: '100%' }}
64
+ />
65
+ );
66
+ }
67
+
68
+ function BooleanWidget({
69
+ id,
70
+ value,
71
+ onChange,
72
+ disabled,
73
+ }: WidgetProps<boolean>) {
74
+ return (
75
+ <Switch
76
+ id={id}
77
+ checked={Boolean(value)}
78
+ onChange={onChange}
79
+ disabled={disabled}
80
+ />
81
+ );
82
+ }
83
+
84
+ function SelectWidget({
85
+ id,
86
+ value,
87
+ onChange,
88
+ disabled,
89
+ schema,
90
+ }: WidgetProps<unknown>) {
91
+ return (
92
+ <Select
93
+ id={id}
94
+ value={value}
95
+ onChange={onChange}
96
+ disabled={disabled}
97
+ allowClear
98
+ options={(schema.enum ?? []).map((option) => ({
99
+ label: String(option),
100
+ value: option,
101
+ }))}
102
+ />
103
+ );
104
+ }
105
+
106
+ const DEFAULT_WIDGETS = {
107
+ text: TextWidget,
108
+ textarea: TextareaWidget,
109
+ number: NumberWidget,
110
+ boolean: BooleanWidget,
111
+ select: SelectWidget,
112
+ 'subject-picker': SubjectPicker,
113
+ 'approval-rule-editor': ApprovalRuleEditor,
114
+ 'human-approval-config': HumanApprovalConfigEditor,
115
+ 'http-request-config': HttpRequestConfigEditor,
116
+ 'code-config': CodeConfigEditor,
117
+ 'callable-input-parameters': CallableInputParametersEditor,
118
+ 'return-result-config': ReturnResultConfigEditor,
119
+ 'approval-request-trigger-config': ApprovalRequestTriggerConfigEditor,
120
+ 'external-request-config': ExternalRequestConfigEditor,
121
+ 'submit-approval-result-config': SubmitApprovalResultConfigEditor,
122
+ 'submit-external-result-config': SubmitExternalResultConfigEditor,
123
+ 'external-wait-config': ExternalWaitConfigEditor,
124
+ } as const;
125
+
126
+ export function registerDefaultWidgets(
127
+ registry: WidgetRegistry,
128
+ ): WidgetRegistry {
129
+ for (const [name, widget] of Object.entries(DEFAULT_WIDGETS)) {
130
+ if (!registry.has(name)) registry.register(name, widget as WidgetComponent);
131
+ }
132
+ return registry;
133
+ }
134
+
135
+ export const defaultWidgetRegistry = registerDefaultWidgets(widgetRegistry);
@@ -0,0 +1,36 @@
1
+ import type { JsonSchema } from './schema.types';
2
+
3
+ function cloneDefault(value: unknown): unknown {
4
+ if (Array.isArray(value)) return value.map(cloneDefault);
5
+ if (value && typeof value === 'object') {
6
+ return Object.fromEntries(
7
+ Object.entries(value).map(([key, child]) => [key, cloneDefault(child)]),
8
+ );
9
+ }
10
+ return value;
11
+ }
12
+
13
+ export function schemaDefaultValue(schema: JsonSchema): unknown {
14
+ if (schema.default !== undefined) return cloneDefault(schema.default);
15
+
16
+ if (schema.type === 'object' || schema.properties) {
17
+ const value: Record<string, unknown> = {};
18
+ for (const [key, childSchema] of Object.entries(schema.properties ?? {})) {
19
+ const childDefault = schemaDefaultValue(childSchema);
20
+ if (childDefault !== undefined) value[key] = childDefault;
21
+ }
22
+ return value;
23
+ }
24
+
25
+ return undefined;
26
+ }
27
+
28
+ export function schemaConfigDefaults(
29
+ schema: JsonSchema | null | undefined,
30
+ ): Record<string, unknown> {
31
+ if (!schema) return {};
32
+ const value = schemaDefaultValue(schema);
33
+ return value && typeof value === 'object' && !Array.isArray(value)
34
+ ? (value as Record<string, unknown>)
35
+ : {};
36
+ }
@@ -0,0 +1,32 @@
1
+ export type JsonSchemaType =
2
+ | 'object'
3
+ | 'array'
4
+ | 'string'
5
+ | 'number'
6
+ | 'integer'
7
+ | 'boolean'
8
+ | 'null';
9
+
10
+ export interface JsonSchema {
11
+ type?: JsonSchemaType;
12
+ title?: string;
13
+ description?: string;
14
+ properties?: Record<string, JsonSchema>;
15
+ required?: string[];
16
+ items?: JsonSchema;
17
+ enum?: unknown[];
18
+ default?: unknown;
19
+ }
20
+
21
+ export type UiOptions = Record<string, unknown>;
22
+
23
+ /**
24
+ * UI schemas mirror the config schema's property tree. Reserved keys are typed;
25
+ * all other keys are child UI-schema nodes.
26
+ */
27
+ export type UiSchema = Record<string, unknown> & {
28
+ widget?: string;
29
+ options?: UiOptions;
30
+ fields?: Record<string, UiSchema>;
31
+ items?: UiSchema;
32
+ };
@@ -0,0 +1,23 @@
1
+ import type { ComponentType } from 'react';
2
+ import { describe, expect, it } from 'vitest';
3
+ import { type WidgetProps, WidgetRegistry } from './widget-registry';
4
+
5
+ const TextWidget: ComponentType<WidgetProps> = () => null;
6
+
7
+ describe('WidgetRegistry', () => {
8
+ it('registers and returns a widget', () => {
9
+ const registry = new WidgetRegistry();
10
+
11
+ registry.register('text', TextWidget);
12
+
13
+ expect(registry.get('text')).toBe(TextWidget);
14
+ });
15
+
16
+ it('reports an unknown widget with a stable error', () => {
17
+ const registry = new WidgetRegistry();
18
+
19
+ expect(() => registry.get('subject-picker')).toThrow(
20
+ 'Widget not registered: subject-picker',
21
+ );
22
+ });
23
+ });
@@ -0,0 +1,52 @@
1
+ import type { ComponentType } from 'react';
2
+ import type { JsonSchema, UiOptions } from './schema.types';
3
+
4
+ export interface WidgetProps<T = unknown> {
5
+ id?: string;
6
+ value: T;
7
+ onChange(value: T): void;
8
+ disabled?: boolean;
9
+ schema: JsonSchema;
10
+ uiOptions?: UiOptions;
11
+ }
12
+
13
+ export type WidgetComponent<T = unknown> = ComponentType<WidgetProps<T>>;
14
+
15
+ export class WidgetRegistry {
16
+ private readonly widgets = new Map<string, WidgetComponent>();
17
+
18
+ register<T>(name: string, widget: WidgetComponent<T>): void {
19
+ if (!name.trim()) {
20
+ throw new Error('Widget name is required');
21
+ }
22
+ if (this.widgets.has(name)) {
23
+ throw new Error(`Widget already registered: ${name}`);
24
+ }
25
+ this.widgets.set(name, widget as WidgetComponent);
26
+ }
27
+
28
+ has(name: string): boolean {
29
+ return this.widgets.has(name);
30
+ }
31
+
32
+ get<T = unknown>(name: string): WidgetComponent<T> {
33
+ const widget = this.widgets.get(name);
34
+ if (!widget) {
35
+ throw new Error(`Widget not registered: ${name}`);
36
+ }
37
+ return widget as WidgetComponent<T>;
38
+ }
39
+ }
40
+
41
+ export const widgetRegistry = new WidgetRegistry();
42
+
43
+ export function registerWidget<T>(
44
+ name: string,
45
+ component: WidgetComponent<T>,
46
+ ): void {
47
+ widgetRegistry.register(name, component);
48
+ }
49
+
50
+ export function getWidget<T = unknown>(name: string): WidgetComponent<T> {
51
+ return widgetRegistry.get<T>(name);
52
+ }
@@ -28,8 +28,8 @@ interface NodeInstance {
28
28
  nodeTypeId: string;
29
29
  name: string;
30
30
  description: string | null;
31
- config: Record<string, any>;
32
31
  isEnabled: boolean;
32
+ config: Record<string, unknown>;
33
33
  creator: string;
34
34
  createdAt: string;
35
35
  updatedAt: string;
@@ -67,8 +67,8 @@ export default function NodeInstanceShowPage() {
67
67
  nodeTypeId: true,
68
68
  name: true,
69
69
  description: true,
70
- config: true,
71
70
  isEnabled: true,
71
+ config: true,
72
72
  creator: true,
73
73
  createdAt: true,
74
74
  updatedAt: true,
@@ -124,19 +124,15 @@ export default function NodeInstanceShowPage() {
124
124
 
125
125
  const configSchema = record.nodeType?.configSchema as any;
126
126
  const configProperties = configSchema?.properties ?? {};
127
- const configData: Record<string, any> =
128
- typeof record.config === 'string'
129
- ? (() => {
130
- try {
131
- return JSON.parse(record.config);
132
- } catch {
133
- return {};
134
- }
135
- })()
136
- : (record.config ?? {});
127
+ const configData = record.config;
137
128
 
138
129
  return (
139
- <div style={{ background: '#f0f2f5', minHeight: 'calc(100vh - 64px)' }}>
130
+ <div
131
+ style={{
132
+ background: 'var(--ant-color-bg-layout)',
133
+ minHeight: 'calc(100vh - 64px)',
134
+ }}
135
+ >
140
136
  <Card style={{ marginBottom: 16 }}>
141
137
  <div
142
138
  style={{
@@ -0,0 +1,39 @@
1
+ import { Alert, Space, Typography } from 'antd';
2
+ import { useTranslation } from 'react-i18next';
3
+ import type { WidgetProps } from '../schema-form/widget-registry';
4
+
5
+ const WORKFLOW_FIELDS = [
6
+ 'requestId',
7
+ 'channelRef',
8
+ 'dispatchKey',
9
+ 'candidates',
10
+ 'businessData',
11
+ 'expiresAt',
12
+ ] as const;
13
+
14
+ export function ApprovalRequestTriggerConfigEditor(
15
+ _props: WidgetProps<Record<string, never>>,
16
+ ) {
17
+ const { t } = useTranslation('workflow');
18
+
19
+ return (
20
+ <Space direction="vertical" size={12} style={{ width: '100%' }}>
21
+ <Alert
22
+ type="info"
23
+ showIcon
24
+ message={t('approvalRequestTrigger.title')}
25
+ description={t('approvalRequestTrigger.description')}
26
+ />
27
+ <Typography.Text strong>
28
+ {t('approvalRequestTrigger.availableFields')}
29
+ </Typography.Text>
30
+ <Space direction="vertical" size={4}>
31
+ {WORKFLOW_FIELDS.map((field) => (
32
+ <Typography.Text code key={field}>
33
+ workflow.{field}
34
+ </Typography.Text>
35
+ ))}
36
+ </Space>
37
+ </Space>
38
+ );
39
+ }
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ import { render, waitFor } from '@testing-library/react';
3
+ import { describe, expect, it, vi } from 'vitest';
4
+ import { ApprovalRuleEditor } from './ApprovalRuleEditor';
5
+
6
+ describe('ApprovalRuleEditor', () => {
7
+ it('materializes the visible ANY default into the form value', async () => {
8
+ const onChange = vi.fn();
9
+
10
+ render(
11
+ <ApprovalRuleEditor
12
+ value={undefined as never}
13
+ onChange={onChange}
14
+ schema={{ type: 'object', default: { mode: 'ANY' } }}
15
+ />,
16
+ );
17
+
18
+ await waitFor(() => expect(onChange).toHaveBeenCalledWith({ mode: 'ANY' }));
19
+ });
20
+ });