@gadmin2n/schematics 0.0.138 → 0.0.140

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 (314) 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/gitignore +6 -5
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/readme.md +10 -3
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/server/migrate-between-pg-schemas.js +6 -4
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +5 -2
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/server/prisma.config.ts +12 -3
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/migrate-human-approval-configs.ts +86 -0
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts +682 -121
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow.seed.ts +110 -1
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/config/index.ts +28 -0
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/json-body-parser.spec.ts +61 -0
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/json-body-parser.ts +7 -0
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/structured-all-exceptions.filter.spec.ts +54 -0
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/structured-all-exceptions.filter.ts +86 -0
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/main.ts +9 -3
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.controller.ts +89 -0
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.dto.ts +68 -0
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.service.spec.ts +177 -0
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.service.ts +283 -0
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approvalChannel.module.ts +10 -0
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-executor.spec.ts +42 -0
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-executor.ts +108 -0
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.controller.ts +101 -0
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.dto.ts +29 -0
  28. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/codeRuntime.module.ts +21 -0
  29. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-handler.registry.ts +30 -0
  30. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-handler.ts +15 -0
  31. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.spec.ts +105 -0
  32. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.ts +96 -0
  33. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.dto.ts +78 -0
  34. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-signal-outbox.service.spec.ts +56 -0
  35. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-signal-outbox.service.ts +111 -0
  36. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-token.spec.ts +23 -0
  37. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-token.ts +18 -0
  38. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.spec.ts +240 -0
  39. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.ts +339 -0
  40. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.types.ts +74 -0
  41. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-wait.handler.ts +47 -0
  42. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/externalInteraction.module.ts +41 -0
  43. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/human-approval.handler.spec.ts +70 -0
  44. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/human-approval.handler.ts +76 -0
  45. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.controller.ts +12 -0
  46. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.service.spec.ts +227 -0
  47. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.service.ts +121 -0
  48. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.controller.ts +160 -0
  49. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.dto.ts +41 -0
  50. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.spec.ts +171 -0
  51. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.ts +245 -0
  52. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/httpRequest.module.ts +22 -0
  53. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-rule-evaluator.spec.ts +68 -0
  54. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-rule-evaluator.ts +126 -0
  55. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-rule.types.ts +34 -0
  56. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-signal-outbox.service.ts +115 -0
  57. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.spec.ts +45 -0
  58. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.ts +59 -0
  59. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.controller.ts +72 -0
  60. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.dto.ts +144 -0
  61. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.errors.ts +19 -0
  62. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.external-decision.spec.ts +350 -0
  63. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.service.ts +774 -0
  64. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/humanApproval.module.ts +46 -0
  65. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/legacy-approval-config-migration.ts +227 -0
  66. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/outbox-retry.util.ts +14 -0
  67. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.controller.ts +151 -0
  68. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.dto.ts +88 -0
  69. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/runtime-token.guard.ts +43 -0
  70. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/index.ts +21 -1
  71. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.controller.ts +77 -0
  72. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.dto.ts +98 -0
  73. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.service.ts +277 -0
  74. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-secret-cipher.spec.ts +14 -0
  75. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-secret-cipher.ts +59 -0
  76. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integrationConnection.module.ts +10 -0
  77. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/actor-context.util.ts +27 -0
  78. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/providers/user-group.provider.ts +208 -0
  79. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/providers/user.provider.ts +168 -0
  80. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.controller.spec.ts +157 -0
  81. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.controller.ts +176 -0
  82. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.dto.ts +21 -0
  83. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.errors.ts +78 -0
  84. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.registry.spec.ts +100 -0
  85. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.registry.ts +115 -0
  86. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.types.ts +97 -0
  87. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subjectProvider.module.ts +34 -0
  88. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.controller.spec.ts +89 -1
  89. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.controller.ts +4 -0
  90. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.controller.ts +119 -0
  91. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.dto.ts +91 -0
  92. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.errors.ts +34 -0
  93. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.service.spec.ts +161 -0
  94. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.service.ts +390 -0
  95. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/userGroup.module.ts +10 -0
  96. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.spec.ts +17 -0
  97. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.ts +8 -2
  98. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/parameter-binding.ts +93 -0
  99. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.spec.ts +158 -0
  100. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.ts +155 -0
  101. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.spec.ts +363 -0
  102. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.ts +354 -0
  103. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.types.ts +43 -0
  104. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.spec.ts +174 -0
  105. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.ts +149 -0
  106. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-dsl-comparison.ts +43 -0
  107. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-execution.dto.ts +1 -1
  108. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.dto.ts +4 -0
  109. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.service.ts +70 -28
  110. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-handle-validator.ts +128 -0
  111. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.ts +12 -1
  112. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.module.ts +18 -3
  113. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.spec.ts +369 -22
  114. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +319 -90
  115. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.spec.ts +79 -0
  116. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.ts +62 -0
  117. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/schema.types.ts +10 -0
  118. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.spec.ts +124 -0
  119. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.ts +236 -0
  120. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.spec.ts +49 -0
  121. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.ts +69 -0
  122. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/workflowConfig.module.ts +20 -0
  123. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/node-instance-config.util.spec.ts +15 -0
  124. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/node-instance-config.util.ts +25 -0
  125. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.controller.ts +103 -11
  126. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.dto.ts +98 -0
  127. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.module.ts +3 -0
  128. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.spec.ts +72 -62
  129. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.ts +148 -11
  130. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +13 -9
  131. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/App.tsx +5 -2
  132. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/authProvider.ts +2 -2
  133. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/BulkActions.tsx +0 -5
  134. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/SearchBar.tsx +26 -18
  135. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/eventList/index.tsx +2 -2
  136. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/logButton/index.tsx +24 -17
  137. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/logList/index.tsx +7 -18
  138. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/modalDiffViewer/index.tsx +2 -2
  139. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/index.tsx +288 -33
  140. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/themeStyles.ts +97 -0
  141. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/SettingDrawer.tsx +251 -0
  142. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/header.tsx +47 -19
  143. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/layout.tsx +18 -9
  144. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/menuRenderer.tsx +155 -0
  145. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/sider.tsx +123 -129
  146. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +16 -0
  147. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +2 -1
  148. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddDataModal.tsx +98 -3
  149. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddPageModal.tsx +101 -0
  150. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +8 -0
  151. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/style.css +51 -0
  152. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/form.tsx +1 -1
  153. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/list.tsx +1 -1
  154. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/login.ts +40 -1
  155. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/show.tsx +5 -5
  156. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +16 -1
  157. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useListPageState.ts +10 -7
  158. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/i18n.ts +4 -2
  159. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +26 -2
  160. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/workflow.json +556 -0
  161. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +26 -2
  162. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/workflow.json +556 -0
  163. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/plugins/devShellPlugin.ts +152 -2
  164. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/index.tsx +6 -1
  165. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/show.tsx +41 -9
  166. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/edit.tsx +1 -1
  167. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/list.tsx +10 -8
  168. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/show.tsx +3 -3
  169. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.css +1 -1
  170. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/edit.tsx +1 -1
  171. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/show.tsx +3 -6
  172. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasCell.css +3 -0
  173. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasCell.tsx +45 -13
  174. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasComponentLibrary.tsx +45 -22
  175. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +168 -101
  176. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasPage.tsx +248 -74
  177. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasToolbar.tsx +33 -18
  178. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CodeFloatWindow.tsx +16 -10
  179. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/PublishModal.tsx +1 -1
  180. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasContextMenuRegistry.tsx +31 -0
  181. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasDefaults.ts +15 -0
  182. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/BarChartDataSourceModal.tsx +16 -11
  183. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/CanvasAiModal.tsx +25 -21
  184. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/ExportModal.tsx +6 -1
  185. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/LineChartDataSourceModal.tsx +9 -10
  186. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/MultiChartConfigModal.tsx +4 -7
  187. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/MultiChartDataSourceModal.tsx +23 -9
  188. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/NumCardDataSourceModal.tsx +16 -11
  189. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/PromptModal.tsx +2 -5
  190. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/RadarChartDataSourceModal.tsx +16 -11
  191. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/TableConfigModal.tsx +2 -9
  192. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/TableDataSourceModal.tsx +23 -12
  193. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/canvasModalProps.ts +2 -17
  194. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/sectionCompactor.test.ts +149 -0
  195. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/sectionCompactor.ts +111 -17
  196. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/types.ts +1 -0
  197. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/whiteboardLayout.test.ts +83 -0
  198. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/whiteboardLayout.ts +118 -0
  199. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/whiteboardName.test.ts +26 -0
  200. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas-page/index.tsx +9 -1
  201. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/edit.tsx +1 -1
  202. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/list.tsx +10 -8
  203. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/show.tsx +3 -6
  204. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/DecisionModal.tsx +71 -0
  205. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/inbox.tsx +216 -0
  206. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/AssignRolesModal.tsx +6 -1
  207. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/permissionReadme/index.tsx +8 -8
  208. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/modal.tsx +1 -1
  209. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/list.tsx +5 -5
  210. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/modal.tsx +1 -1
  211. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/show-drawer.tsx +1 -1
  212. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/ApprovalChannelModal.test.tsx +84 -0
  213. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/ApprovalChannelModal.tsx +141 -0
  214. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/approval-channel.types.ts +16 -0
  215. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/index.tsx +208 -0
  216. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CreateNodeInstanceDrawer.tsx +154 -0
  217. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.tsx +194 -5
  218. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DeletableEdge.tsx +76 -0
  219. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DslView.tsx +1 -1
  220. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/EnhancedFlowRenderer.tsx +176 -22
  221. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.test.tsx +62 -0
  222. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.tsx +94 -5
  223. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExportModal.tsx +15 -10
  224. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/FlowRenderer.tsx +251 -70
  225. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ImportModal.tsx +18 -24
  226. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/InstanceRequiredDialog.tsx +106 -0
  227. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.test.tsx +45 -0
  228. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.tsx +43 -0
  229. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NewNodeDefaults.test.tsx +279 -0
  230. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeEditModal.tsx +6 -7
  231. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.test.tsx +335 -0
  232. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.tsx +433 -237
  233. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ParameterBindingEditor.tsx +179 -0
  234. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/RunWorkflowModal.tsx +18 -16
  235. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/StatusCards.tsx +20 -16
  236. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/VersionPanel.tsx +6 -4
  237. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/ConnectionModal.test.tsx +68 -0
  238. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/ConnectionModal.tsx +367 -0
  239. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/connection.types.ts +21 -0
  240. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/index.tsx +171 -0
  241. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.tsx +38 -22
  242. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useNodeInstanceLibrary.ts +41 -0
  243. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useWorkflowAgent.ts +6 -0
  244. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/index.tsx +27 -20
  245. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instance-detail.tsx +8 -11
  246. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instances.tsx +6 -1
  247. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/NodeInstanceForm.tsx +56 -23
  248. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/create.tsx +21 -6
  249. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/edit.tsx +17 -20
  250. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/index.tsx +6 -1
  251. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaField.tsx +311 -0
  252. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaForm.test.tsx +218 -0
  253. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaForm.tsx +83 -0
  254. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/default-widgets.tsx +135 -0
  255. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/schema-defaults.ts +36 -0
  256. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/schema.types.ts +32 -0
  257. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/widget-registry.test.tsx +23 -0
  258. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/widget-registry.tsx +52 -0
  259. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/show.tsx +9 -13
  260. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRequestTriggerConfigEditor.tsx +39 -0
  261. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRuleEditor.test.tsx +20 -0
  262. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRuleEditor.tsx +72 -0
  263. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.test.tsx +47 -0
  264. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.tsx +185 -0
  265. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CallableInputParametersEditor.test.tsx +102 -0
  266. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CallableInputParametersEditor.tsx +150 -0
  267. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CodeConfigEditor.tsx +103 -0
  268. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.test.tsx +93 -0
  269. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.tsx +196 -0
  270. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalWaitConfigEditor.tsx +303 -0
  271. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.test.tsx +189 -0
  272. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.tsx +706 -0
  273. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.test.tsx +86 -0
  274. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.tsx +458 -0
  275. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.test.tsx +53 -0
  276. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.tsx +91 -0
  277. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubjectPicker.test.tsx +61 -0
  278. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubjectPicker.tsx +266 -0
  279. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubmitApprovalResultConfigEditor.tsx +104 -0
  280. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubmitExternalResultConfigEditor.tsx +98 -0
  281. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupCreateModal.tsx +70 -0
  282. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupEditModal.tsx +138 -0
  283. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.test.ts +25 -0
  284. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.ts +42 -0
  285. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/subject-provider.api.ts +95 -0
  286. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/show.tsx +15 -11
  287. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/temporal-tenant/index.tsx +49 -8
  288. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types/parameter-binding.ts +49 -0
  289. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types.ts +31 -2
  290. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.test.ts +208 -0
  291. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.ts +246 -0
  292. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/newNodeConfig.ts +73 -0
  293. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/removeWorkflowEdges.test.ts +34 -0
  294. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/removeWorkflowEdges.ts +18 -0
  295. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveLookupPorts.ts +66 -0
  296. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.test.ts +39 -0
  297. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.ts +48 -0
  298. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveWorkflowDisplay.test.ts +51 -0
  299. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveWorkflowDisplay.ts +32 -0
  300. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/edit.tsx +1 -1
  301. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/list.tsx +10 -8
  302. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/show.tsx +3 -3
  303. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd-theme-vars.css +93 -0
  304. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd.css +8 -8
  305. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/fc.css +4 -4
  306. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/index.css +20 -5
  307. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-drawer.module.css +3 -3
  308. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-page.module.css +3 -3
  309. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/theme-styles.css +81 -0
  310. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/test/setup.ts +5 -0
  311. package/dist/lib/application/files/gadmin2-game-angle-demo/web/vite.config.ts +1 -7
  312. package/dist/lib/application/files/gadmin2-game-angle-demo/web/vitest.config.ts +12 -0
  313. package/package.json +1 -1
  314. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/DynamicConfigForm.tsx +0 -154
@@ -0,0 +1,149 @@
1
+ import type { LayoutItem } from 'react-grid-layout';
2
+ import { createSectionCompactor } from './sectionCompactor';
3
+ import type { CanvasItem } from './types';
4
+
5
+ const items: CanvasItem[] = [
6
+ { id: 'board', componentType: 'Whiteboard', code: '' },
7
+ {
8
+ id: 'chart',
9
+ componentType: 'MultiChart',
10
+ code: '',
11
+ parentId: 'board',
12
+ },
13
+ ];
14
+
15
+ describe('Whiteboard compaction', () => {
16
+ it('keeps a nested component at its freely chosen y position', () => {
17
+ const compactor = createSectionCompactor(() => items);
18
+ const layout: LayoutItem[] = [
19
+ { i: 'board', x: 0, y: 0, w: 30, h: 30 },
20
+ { i: 'chart', x: 4, y: 10, w: 8, h: 6 },
21
+ ];
22
+
23
+ const compacted = compactor.compact(layout, 48);
24
+
25
+ expect(compacted.find((entry) => entry.i === 'chart')).toMatchObject({
26
+ x: 4,
27
+ y: 10,
28
+ });
29
+ });
30
+
31
+ it('restores normal canvas compaction while dragging a child outside its whiteboard', () => {
32
+ const compactor = createSectionCompactor(
33
+ () => items,
34
+ () => 'chart',
35
+ () => null,
36
+ );
37
+ const layout: LayoutItem[] = [
38
+ { i: 'board', x: 0, y: 0, w: 30, h: 30 },
39
+ { i: 'chart', x: 34, y: 35, w: 8, h: 6 },
40
+ ];
41
+
42
+ const compacted = compactor.compact(layout, 48);
43
+
44
+ expect(compacted.find((entry) => entry.i === 'chart')).toMatchObject({
45
+ x: 34,
46
+ y: 0,
47
+ });
48
+ });
49
+
50
+ it('prevents an outside child from partially overlapping its whiteboard', () => {
51
+ const compactor = createSectionCompactor(
52
+ () => items,
53
+ () => 'chart',
54
+ () => null,
55
+ );
56
+ const layout: LayoutItem[] = [
57
+ { i: 'board', x: 0, y: 0, w: 30, h: 30 },
58
+ { i: 'chart', x: 28, y: 5, w: 8, h: 6 },
59
+ ];
60
+
61
+ const compacted = compactor.compact(layout, 48);
62
+
63
+ expect(compacted.find((entry) => entry.i === 'chart')).toMatchObject({
64
+ x: 28,
65
+ y: 30,
66
+ });
67
+ });
68
+
69
+ it('keeps free positioning while dragging a child inside its whiteboard', () => {
70
+ const compactor = createSectionCompactor(
71
+ () => items,
72
+ () => 'chart',
73
+ () => 'board',
74
+ );
75
+ const layout: LayoutItem[] = [
76
+ { i: 'board', x: 0, y: 0, w: 30, h: 30 },
77
+ { i: 'chart', x: 4, y: 10, w: 8, h: 6 },
78
+ ];
79
+
80
+ const compacted = compactor.compact(layout, 48);
81
+
82
+ expect(compacted.find((entry) => entry.i === 'chart')).toMatchObject({
83
+ x: 4,
84
+ y: 10,
85
+ });
86
+ });
87
+
88
+ it('keeps existing children stable while another component enters the whiteboard', () => {
89
+ const boardItems: CanvasItem[] = [
90
+ { id: 'board', componentType: 'Whiteboard', code: '' },
91
+ {
92
+ id: 'existing-chart',
93
+ componentType: 'MultiChart',
94
+ code: '',
95
+ parentId: 'board',
96
+ },
97
+ { id: 'incoming-chart', componentType: 'MultiChart', code: '' },
98
+ ];
99
+ const originLayout: LayoutItem[] = [
100
+ { i: 'board', x: 0, y: 0, w: 30, h: 30 },
101
+ { i: 'existing-chart', x: 4, y: 10, w: 8, h: 6 },
102
+ { i: 'incoming-chart', x: 34, y: 0, w: 8, h: 6 },
103
+ ];
104
+ const compactor = createSectionCompactor(
105
+ () => boardItems,
106
+ () => 'incoming-chart',
107
+ () => 'board',
108
+ () => ({ id: 'incoming-chart', originLayout }),
109
+ );
110
+ const collisionLayout: LayoutItem[] = [
111
+ { i: 'board', x: 0, y: 0, w: 30, h: 30 },
112
+ { i: 'existing-chart', x: 4, y: 4, w: 8, h: 6 },
113
+ { i: 'incoming-chart', x: 4, y: 10, w: 8, h: 6 },
114
+ ];
115
+
116
+ const compacted = compactor.compact(collisionLayout, 48);
117
+
118
+ expect(
119
+ compacted.find((entry) => entry.i === 'existing-chart'),
120
+ ).toMatchObject({
121
+ x: 4,
122
+ y: 10,
123
+ });
124
+ });
125
+
126
+ it('moves nested components by the same offset while dragging their whiteboard', () => {
127
+ const originLayout: LayoutItem[] = [
128
+ { i: 'board', x: 0, y: 0, w: 30, h: 30 },
129
+ { i: 'chart', x: 2, y: 5, w: 8, h: 6 },
130
+ ];
131
+ const compactor = createSectionCompactor(
132
+ () => items,
133
+ () => 'board',
134
+ () => null,
135
+ () => ({ id: 'board', originLayout }),
136
+ );
137
+ const layout: LayoutItem[] = [
138
+ { i: 'board', x: 5, y: 0, w: 30, h: 30 },
139
+ { i: 'chart', x: 2, y: 5, w: 8, h: 6 },
140
+ ];
141
+
142
+ const compacted = compactor.compact(layout, 48);
143
+
144
+ expect(compacted.find((entry) => entry.i === 'chart')).toMatchObject({
145
+ x: 7,
146
+ y: 5,
147
+ });
148
+ });
149
+ });
@@ -1,22 +1,29 @@
1
1
  import { verticalCompactor } from 'react-grid-layout';
2
- import type { Compactor } from 'react-grid-layout';
2
+ import type { Compactor, LayoutItem } from 'react-grid-layout';
3
3
  import type { CanvasItem } from './types';
4
+ import { WHITEBOARD_COMPONENT_TYPE } from './whiteboardLayout';
5
+
6
+ interface DragSnapshot {
7
+ id: string;
8
+ originLayout: LayoutItem[];
9
+ }
4
10
 
5
11
  /**
6
- * 创建支持 Section 分层重叠的自定义 compactor。
12
+ * 创建支持 Section / Whiteboard 分层重叠的自定义 compactor。
7
13
  *
8
14
  * 碰撞规则:
9
- * - Section 与 Section:正常碰撞(不能重叠)
15
+ * - 背景容器之间:正常碰撞(不能重叠)
10
16
  * - 普通组件与普通组件:正常碰撞(不能重叠)
11
17
  * - Section 与普通组件:允许重叠
12
18
  *
13
- * 实现:将 layout 分为两层分别 compact,然后合并。
14
- * - Section 层:只包含 Section item,独立 compact
15
- * - 普通层:只包含普通 item,独立 compact
16
- * 由于两层独立 compact,它们之间自然不会互相推挤。
19
+ * 实现:只压缩背景容器和处于 Canvas 模式的组件。
20
+ * Whiteboard 子组件以及仍在白板内拖拽的组件保持用户选择的自由坐标。
17
21
  */
18
22
  export function createSectionCompactor(
19
23
  getItems: () => CanvasItem[],
24
+ getDraggingItemId: () => string | null = () => null,
25
+ getActiveWhiteboardId: () => string | null = () => null,
26
+ getDragSnapshot: () => DragSnapshot | null = () => null,
20
27
  ): Compactor {
21
28
  return {
22
29
  type: 'vertical',
@@ -24,22 +31,109 @@ export function createSectionCompactor(
24
31
 
25
32
  compact(layout, cols) {
26
33
  const items = getItems();
27
- const sectionIds = new Set(
34
+ const draggingItemId = getDraggingItemId();
35
+ const dragSnapshot = getDragSnapshot();
36
+ const keepDraggingPosition = !!getActiveWhiteboardId();
37
+ const dragOriginLayout =
38
+ draggingItemId && dragSnapshot?.id === draggingItemId
39
+ ? dragSnapshot.originLayout
40
+ : null;
41
+ const whiteboardIds = new Set(
42
+ items
43
+ .filter((item) => item.componentType === WHITEBOARD_COMPONENT_TYPE)
44
+ .map((item) => item.id),
45
+ );
46
+ const backgroundIds = new Set(
47
+ items
48
+ .filter(
49
+ (item) =>
50
+ item.componentType === 'Section' ||
51
+ item.componentType === WHITEBOARD_COMPONENT_TYPE,
52
+ )
53
+ .map((item) => item.id),
54
+ );
55
+ const nestedIds = new Set(
28
56
  items
29
- .filter((item) => item.componentType === 'Section')
57
+ .filter(
58
+ (item) =>
59
+ !!item.parentId &&
60
+ item.componentType !== WHITEBOARD_COMPONENT_TYPE &&
61
+ item.id !== draggingItemId,
62
+ )
30
63
  .map((item) => item.id),
31
64
  );
32
65
 
33
- // 分两层
34
- const sectionLayout = layout.filter((l) => sectionIds.has(l.i));
35
- const normalLayout = layout.filter((l) => !sectionIds.has(l.i));
66
+ const backgroundLayout = layout.filter((entry) =>
67
+ backgroundIds.has(entry.i),
68
+ );
69
+ const freeLayout = layout.filter(
70
+ (entry) =>
71
+ !backgroundIds.has(entry.i) &&
72
+ !nestedIds.has(entry.i) &&
73
+ (entry.i !== draggingItemId || !keepDraggingPosition) &&
74
+ entry.i !== '__dropping-elem__',
75
+ );
76
+ const interactiveLayout = layout.filter(
77
+ (entry) =>
78
+ !backgroundIds.has(entry.i) &&
79
+ ((entry.i === draggingItemId && keepDraggingPosition) ||
80
+ entry.i === '__dropping-elem__'),
81
+ );
82
+
83
+ const compactedBackgrounds = verticalCompactor.compact(
84
+ backgroundLayout,
85
+ cols,
86
+ );
87
+ const whiteboardObstacles = compactedBackgrounds
88
+ .filter((entry) => whiteboardIds.has(entry.i))
89
+ .map((entry) => ({ ...entry, static: true }));
90
+ const compactedFreeItems = verticalCompactor
91
+ .compact([...whiteboardObstacles, ...freeLayout], cols)
92
+ .filter((entry) => !whiteboardIds.has(entry.i));
93
+ const compactedNestedItems = items
94
+ .filter((item) => item.componentType === WHITEBOARD_COMPONENT_TYPE)
95
+ .flatMap((whiteboard) => {
96
+ const whiteboardLayout = compactedBackgrounds.find(
97
+ (entry) => entry.i === whiteboard.id,
98
+ );
99
+ const previousWhiteboardLayout = layout.find(
100
+ (entry) => entry.i === whiteboard.id,
101
+ );
102
+ if (!whiteboardLayout || !previousWhiteboardLayout) return [];
103
+
104
+ const originWhiteboardLayout = dragOriginLayout
105
+ ? dragOriginLayout.find((entry) => entry.i === whiteboard.id)
106
+ : previousWhiteboardLayout;
107
+ if (!originWhiteboardLayout) return [];
36
108
 
37
- // 各自独立 compact
38
- const compactedSections = verticalCompactor.compact(sectionLayout, cols);
39
- const compactedNormals = verticalCompactor.compact(normalLayout, cols);
109
+ const childIds = new Set(
110
+ items
111
+ .filter(
112
+ (item) =>
113
+ item.parentId === whiteboard.id &&
114
+ item.componentType !== WHITEBOARD_COMPONENT_TYPE &&
115
+ item.id !== draggingItemId,
116
+ )
117
+ .map((item) => item.id),
118
+ );
119
+ const offsetX = whiteboardLayout.x - originWhiteboardLayout.x;
120
+ const offsetY = whiteboardLayout.y - originWhiteboardLayout.y;
121
+ const childLayout = dragOriginLayout ?? layout;
122
+ return childLayout
123
+ .filter((entry) => childIds.has(entry.i))
124
+ .map((entry) => ({
125
+ ...entry,
126
+ x: entry.x + offsetX,
127
+ y: entry.y + offsetY,
128
+ }));
129
+ });
40
130
 
41
- // 合并
42
- return [...compactedSections, ...compactedNormals];
131
+ return [
132
+ ...compactedBackgrounds,
133
+ ...compactedFreeItems,
134
+ ...compactedNestedItems,
135
+ ...interactiveLayout,
136
+ ];
43
137
  },
44
138
  };
45
139
  }
@@ -29,6 +29,7 @@ export interface CanvasItem {
29
29
  id: string; // nanoid 生成的唯一 ID
30
30
  componentType: string; // "PieChart" | "BarChart" | "NumCard" | ...
31
31
  code: string; // 当前 TSX 代码
32
+ parentId?: string; // 所属 Whiteboard;Whiteboard 自身永远没有 parentId
32
33
  }
33
34
 
34
35
  // ─── Multi-Canvas ────────────────────────────────────────────────────────
@@ -0,0 +1,83 @@
1
+ import type { LayoutItem } from 'react-grid-layout';
2
+ import type { CanvasItem } from './types';
3
+ import {
4
+ findContainingWhiteboard,
5
+ moveWhiteboardChildren,
6
+ } from './whiteboardLayout';
7
+
8
+ const items: CanvasItem[] = [
9
+ { id: 'outer', componentType: 'Whiteboard', code: '' },
10
+ { id: 'inner-board', componentType: 'Whiteboard', code: '' },
11
+ { id: 'chart', componentType: 'MultiChart', code: '' },
12
+ ];
13
+
14
+ const layout: LayoutItem[] = [
15
+ { i: 'outer', x: 0, y: 0, w: 30, h: 30 },
16
+ { i: 'inner-board', x: 2, y: 2, w: 12, h: 12 },
17
+ { i: 'chart', x: 20, y: 4, w: 8, h: 8 },
18
+ ];
19
+
20
+ describe('findContainingWhiteboard', () => {
21
+ it('assigns a regular component fully inside a whiteboard', () => {
22
+ expect(findContainingWhiteboard('chart', items, layout)).toBe('outer');
23
+ });
24
+
25
+ it('keeps a component inside when it is flush with the whiteboard edges', () => {
26
+ const edgeAlignedLayout: LayoutItem[] = [
27
+ { i: 'outer', x: 0, y: 0, w: 30, h: 30 },
28
+ { i: 'inner-board', x: 32, y: 0, w: 12, h: 12 },
29
+ { i: 'chart', x: 0, y: 0, w: 30, h: 30 },
30
+ ];
31
+
32
+ expect(findContainingWhiteboard('chart', items, edgeAlignedLayout)).toBe(
33
+ 'outer',
34
+ );
35
+ });
36
+
37
+ it('never assigns a whiteboard to another whiteboard', () => {
38
+ expect(findContainingWhiteboard('inner-board', items, layout)).toBe(
39
+ undefined,
40
+ );
41
+ });
42
+ });
43
+
44
+ describe('moveWhiteboardChildren', () => {
45
+ it('moves direct children by the same grid offset as their whiteboard', () => {
46
+ const nestedItems = [
47
+ { id: 'board', componentType: 'Whiteboard', code: '' },
48
+ {
49
+ id: 'nested-chart',
50
+ componentType: 'MultiChart',
51
+ code: '',
52
+ parentId: 'board',
53
+ },
54
+ { id: 'free-chart', componentType: 'MultiChart', code: '' },
55
+ ] as CanvasItem[];
56
+ const previousLayout: LayoutItem[] = [
57
+ { i: 'board', x: 0, y: 0, w: 24, h: 20 },
58
+ { i: 'nested-chart', x: 2, y: 3, w: 8, h: 6 },
59
+ { i: 'free-chart', x: 30, y: 3, w: 8, h: 6 },
60
+ ];
61
+ const draggedLayout: LayoutItem[] = [
62
+ { i: 'board', x: 5, y: 7, w: 24, h: 20 },
63
+ { i: 'nested-chart', x: 2, y: 3, w: 8, h: 6 },
64
+ { i: 'free-chart', x: 30, y: 3, w: 8, h: 6 },
65
+ ];
66
+
67
+ const moved = moveWhiteboardChildren(
68
+ 'board',
69
+ previousLayout,
70
+ draggedLayout,
71
+ nestedItems,
72
+ );
73
+
74
+ expect(moved.find((entry) => entry.i === 'nested-chart')).toMatchObject({
75
+ x: 7,
76
+ y: 10,
77
+ });
78
+ expect(moved.find((entry) => entry.i === 'free-chart')).toMatchObject({
79
+ x: 30,
80
+ y: 3,
81
+ });
82
+ });
83
+ });
@@ -0,0 +1,118 @@
1
+ import type { LayoutItem } from 'react-grid-layout';
2
+ import type { CanvasItem } from './types';
3
+
4
+ export const WHITEBOARD_COMPONENT_TYPE = 'Whiteboard';
5
+ export const WHITEBOARD_INSET_X = 0;
6
+ export const WHITEBOARD_INSET_Y = 0;
7
+
8
+ const WHITEBOARD_TITLE_EXPRESSION = /title\s*=\s*\{\s*("(?:\\.|[^"\\])*")\s*\}/;
9
+ const WHITEBOARD_TITLE_LITERAL = /title\s*=\s*"([^"]*)"/;
10
+
11
+ export function readWhiteboardName(code: string): string {
12
+ const expressionMatch = code.match(WHITEBOARD_TITLE_EXPRESSION);
13
+ if (expressionMatch) {
14
+ try {
15
+ return JSON.parse(expressionMatch[1]);
16
+ } catch {
17
+ return '白板';
18
+ }
19
+ }
20
+
21
+ return code.match(WHITEBOARD_TITLE_LITERAL)?.[1] ?? '白板';
22
+ }
23
+
24
+ export function writeWhiteboardName(code: string, name: string): string {
25
+ const titleProp = `title={${JSON.stringify(name)}}`;
26
+ if (WHITEBOARD_TITLE_EXPRESSION.test(code)) {
27
+ return code.replace(WHITEBOARD_TITLE_EXPRESSION, titleProp);
28
+ }
29
+ if (WHITEBOARD_TITLE_LITERAL.test(code)) {
30
+ return code.replace(WHITEBOARD_TITLE_LITERAL, titleProp);
31
+ }
32
+ if (/testId\s*=/.test(code)) {
33
+ return code.replace(/([ \t]*)(testId\s*=)/, `$1${titleProp}\n$1$2`);
34
+ }
35
+ return code.replace(/\/>/, ` ${titleProp}\n/>`);
36
+ }
37
+
38
+ export function normalizeLegacyWhiteboardName(code: string): string {
39
+ return readWhiteboardName(code) === '大白板'
40
+ ? writeWhiteboardName(code, '白板')
41
+ : code;
42
+ }
43
+
44
+ export function findContainingWhiteboard(
45
+ itemId: string,
46
+ items: CanvasItem[],
47
+ layout: readonly LayoutItem[],
48
+ ): string | undefined {
49
+ const item = items.find((candidate) => candidate.id === itemId);
50
+ const itemLayout = layout.find((candidate) => candidate.i === itemId);
51
+ if (
52
+ !item ||
53
+ !itemLayout ||
54
+ item.componentType === WHITEBOARD_COMPONENT_TYPE
55
+ ) {
56
+ return undefined;
57
+ }
58
+
59
+ return items
60
+ .filter(
61
+ (candidate) => candidate.componentType === WHITEBOARD_COMPONENT_TYPE,
62
+ )
63
+ .map((candidate) => layout.find((entry) => entry.i === candidate.id))
64
+ .filter(
65
+ (candidate): candidate is LayoutItem =>
66
+ !!candidate &&
67
+ itemLayout.x >= candidate.x + WHITEBOARD_INSET_X &&
68
+ itemLayout.y >= candidate.y + WHITEBOARD_INSET_Y &&
69
+ itemLayout.x + itemLayout.w <=
70
+ candidate.x + candidate.w - WHITEBOARD_INSET_X &&
71
+ itemLayout.y + itemLayout.h <= candidate.y + candidate.h,
72
+ )
73
+ .sort((a, b) => a.w * a.h - b.w * b.h)[0]?.i;
74
+ }
75
+
76
+ export function moveWhiteboardChildren(
77
+ whiteboardId: string,
78
+ previousLayout: readonly LayoutItem[],
79
+ nextLayout: readonly LayoutItem[],
80
+ items: CanvasItem[],
81
+ ): LayoutItem[] {
82
+ const previousWhiteboard = previousLayout.find(
83
+ (entry) => entry.i === whiteboardId,
84
+ );
85
+ const nextWhiteboard = nextLayout.find((entry) => entry.i === whiteboardId);
86
+ if (!previousWhiteboard || !nextWhiteboard) {
87
+ return nextLayout.map((entry) => ({ ...entry }));
88
+ }
89
+
90
+ const offsetX = nextWhiteboard.x - previousWhiteboard.x;
91
+ const offsetY = nextWhiteboard.y - previousWhiteboard.y;
92
+ if (offsetX === 0 && offsetY === 0) {
93
+ return nextLayout.map((entry) => ({ ...entry }));
94
+ }
95
+
96
+ const childIds = new Set(
97
+ items
98
+ .filter((item) => item.parentId === whiteboardId)
99
+ .map((item) => item.id),
100
+ );
101
+
102
+ return nextLayout.map((entry) =>
103
+ childIds.has(entry.i)
104
+ ? { ...entry, x: entry.x + offsetX, y: entry.y + offsetY }
105
+ : entry,
106
+ );
107
+ }
108
+
109
+ export function updateWhiteboardParent(
110
+ itemId: string,
111
+ items: CanvasItem[],
112
+ layout: readonly LayoutItem[],
113
+ ): CanvasItem[] {
114
+ const parentId = findContainingWhiteboard(itemId, items, layout);
115
+ return items.map((item) =>
116
+ item.id === itemId ? { ...item, parentId } : item,
117
+ );
118
+ }
@@ -0,0 +1,26 @@
1
+ import {
2
+ normalizeLegacyWhiteboardName,
3
+ readWhiteboardName,
4
+ writeWhiteboardName,
5
+ } from './whiteboardLayout';
6
+
7
+ describe('whiteboard name', () => {
8
+ it('writes names with quotes without breaking the component code', () => {
9
+ const code = '<Section title="白板" testId="canvas-whiteboard" />';
10
+
11
+ const renamed = writeWhiteboardName(code, '销售 "白板"');
12
+
13
+ expect(renamed).toBe(
14
+ '<Section title={"销售 \\"白板\\""} testId="canvas-whiteboard" />',
15
+ );
16
+ expect(readWhiteboardName(renamed)).toBe('销售 "白板"');
17
+ });
18
+
19
+ it('displays the legacy default name as 白板', () => {
20
+ const code = '<Section title="大白板" testId="canvas-whiteboard" />';
21
+
22
+ expect(normalizeLegacyWhiteboardName(code)).toBe(
23
+ '<Section title={"白板"} testId="canvas-whiteboard" />',
24
+ );
25
+ });
26
+ });
@@ -50,7 +50,7 @@ export default function CanvasViewPage() {
50
50
  flex: 1,
51
51
  overflow: 'visible',
52
52
  position: 'relative',
53
- background: '#f0f2f5',
53
+ background: 'var(--ant-color-bg-layout)',
54
54
  }}
55
55
  >
56
56
  {loading ? (
@@ -86,8 +86,16 @@ export default function CanvasViewPage() {
86
86
  {data.items.map((item) => (
87
87
  <CanvasCell
88
88
  key={item.id}
89
+ style={{
90
+ zIndex:
91
+ item.componentType === 'Section' ||
92
+ item.componentType === 'Whiteboard'
93
+ ? 0
94
+ : 1,
95
+ }}
89
96
  code={item.code}
90
97
  componentType={item.componentType}
98
+ isWhiteboardChild={!!item.parentId}
91
99
  selected={false}
92
100
  isPreview={true}
93
101
  onClick={() => {}}
@@ -77,7 +77,7 @@ export const GameEdit: React.FC<IResourceComponentsProps> = () => {
77
77
  headerButtons={
78
78
  <>
79
79
  <ListButton />
80
- <RefreshButton meta={{ select: formPrismaSelect }} />
80
+ <RefreshButton />
81
81
  </>
82
82
  }
83
83
  >
@@ -87,10 +87,10 @@ export const GameList: React.FC<IResourceComponentsProps> = () => {
87
87
  const {
88
88
  tableProps,
89
89
  sorters: sorter,
90
- setCurrent,
90
+ setCurrentPage,
91
91
  setFilters,
92
92
  filters,
93
- tableQueryResult,
93
+ tableQuery,
94
94
  searchFormProps,
95
95
  } = useTable<Game, HttpError>({
96
96
  meta: { transformQFn: getSearchFilters, select: prismaSelect },
@@ -102,22 +102,24 @@ export const GameList: React.FC<IResourceComponentsProps> = () => {
102
102
  // onFinish: 将表单值转换为 CrudFilters 并更新筛选条件
103
103
  // 有 createdAt 字段的模型(默认)
104
104
  searchFormProps.initialValues = getSearchFormInitialValues(parsedFilters);
105
- searchFormProps.onFinish = createSearchFormOnFinish(setCurrent, setFilters);
105
+ searchFormProps.onFinish = createSearchFormOnFinish(
106
+ setCurrentPage,
107
+ setFilters,
108
+ );
106
109
 
107
110
  // 没有 createdAt 字段的模型
108
111
  // searchFormProps.initialValues = getSearchFormInitialValues(parsedFilters, { dateField: null });
109
- // searchFormProps.onFinish = createSearchFormOnFinish(setCurrent, setFilters, { dateField: null });
110
-
112
+ // searchFormProps.onFinish = createSearchFormOnFinish(setCurrentPage, setFilters, { dateField: null });
111
113
  // 使用其他日期字段(如 updatedAt)
112
114
  // searchFormProps.initialValues = getSearchFormInitialValues(parsedFilters, { dateField: 'updatedAt' });
113
- // searchFormProps.onFinish = createSearchFormOnFinish(setCurrent, setFilters, { dateField: 'updatedAt' });
115
+ // searchFormProps.onFinish = createSearchFormOnFinish(setCurrentPage, setFilters, { dateField: 'updatedAt' });
114
116
 
115
117
  // Batch operations (selection, update, delete)
116
118
  const batchOps = useBatchOperations({
117
119
  resourceName,
118
120
  apiUrl,
119
121
  requestHeaders,
120
- onSuccess: () => tableQueryResult.refetch(),
122
+ onSuccess: () => tableQuery.refetch(),
121
123
  t,
122
124
  });
123
125
 
@@ -187,7 +189,7 @@ export const GameList: React.FC<IResourceComponentsProps> = () => {
187
189
  importProps={importProps}
188
190
  onExport={triggerExport}
189
191
  exportLoading={exportLoading}
190
- onRefresh={() => tableQueryResult.refetch()}
192
+ onRefresh={() => tableQuery.refetch()}
191
193
  resourceName={resourceName}
192
194
  />
193
195
  ),
@@ -27,10 +27,10 @@ export const GameShow: React.FC<IResourceComponentsProps> = () => {
27
27
  const resourceName = 'game';
28
28
  const t = useTranslate();
29
29
 
30
- const { queryResult } = useShow<Game>({
30
+ const { query } = useShow<Game>({
31
31
  meta: { select: showPrismaSelect },
32
32
  });
33
- const { data, isLoading } = queryResult;
33
+ const { data, isLoading } = query;
34
34
  const record = data?.data;
35
35
 
36
36
  const [[fields, model]] = useState(() => {
@@ -59,10 +59,7 @@ export const GameShow: React.FC<IResourceComponentsProps> = () => {
59
59
  <EditButton recordItemId={record?.id} />
60
60
  <CloneButton recordItemId={record?.id} />
61
61
  <DeleteButton recordItemId={record?.id} />
62
- <RefreshButton
63
- recordItemId={record?.id}
64
- meta={{ select: showPrismaSelect }}
65
- />
62
+ <RefreshButton recordItemId={record?.id} />
66
63
  </div>
67
64
  }
68
65
  >