@gadmin2n/schematics 0.0.139 → 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 +4 -1
  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
@@ -1,54 +1,309 @@
1
1
  import { RefineThemes } from '@refinedev/antd';
2
- import { ConfigProvider } from 'antd';
2
+ import { ConfigProvider, theme } from 'antd';
3
3
  import type { ThemeConfig } from 'antd';
4
- import { PropsWithChildren } from 'react';
4
+ import {
5
+ createContext,
6
+ useCallback,
7
+ useContext,
8
+ useEffect,
9
+ useMemo,
10
+ useState,
11
+ type PropsWithChildren,
12
+ } from 'react';
13
+ import { THEME_STYLES, type ThemeStyleKey } from './themeStyles';
5
14
 
6
- const themeConfig: ThemeConfig = {
7
- ...RefineThemes.Blue,
15
+ export type ThemePresetKey = 'blue' | 'teal' | 'purple' | 'orange';
16
+ export type ThemeMode = 'light' | 'dark';
17
+ /** 侧边栏配色:跟随全局明暗 / 强制深色(经典 admin) / 强制浅色。 */
18
+ export type SiderTheme = 'auto' | 'dark' | 'light';
19
+ /** 菜单组织:树形折叠 / 分组平铺(一级降级为分组标题)。 */
20
+ export type MenuLayoutMode = 'tree' | 'grouped';
21
+ /** 菜单选中态:整行填充 / 圆角药丸 / 左侧指示条。 */
22
+ export type MenuSelectionStyle = 'fill' | 'pill' | 'indicator';
23
+ /** 子菜单展开行为:手风琴单开 / 多组同开。 */
24
+ export type MenuExpandMode = 'accordion' | 'multiple';
25
+ export { THEME_STYLES, type ThemeStyleKey };
26
+
27
+ export interface ThemePreset {
28
+ key: ThemePresetKey;
29
+ colorPrimary: string;
30
+ zhLabel: string;
31
+ enLabel: string;
32
+ }
33
+
34
+ /**
35
+ * 主色预设。只切换 colorPrimary —— 背景、圆角、字体等基调保持一致,
36
+ * 语义色 (colorError 等) 也不跟随主题变化,避免"错误变成蓝色"这类语义错位。
37
+ */
38
+ export const THEME_PRESETS: ThemePreset[] = [
39
+ {
40
+ key: 'blue',
41
+ colorPrimary: '#1677FF',
42
+ zhLabel: '拂晓蓝',
43
+ enLabel: 'Daybreak',
44
+ },
45
+ { key: 'teal', colorPrimary: '#13A8A8', zhLabel: '青碧绿', enLabel: 'Cyan' },
46
+ {
47
+ key: 'purple',
48
+ colorPrimary: '#722ED1',
49
+ zhLabel: '酱紫',
50
+ enLabel: 'Purple',
51
+ },
52
+ {
53
+ key: 'orange',
54
+ colorPrimary: '#FA8C16',
55
+ zhLabel: '日暮橙',
56
+ enLabel: 'Sunset',
57
+ },
58
+ ];
59
+
60
+ const PRESET_STORAGE_KEY = 'gadmin-theme-preset';
61
+ const MODE_STORAGE_KEY = 'gadmin-theme-mode';
62
+ const STYLE_STORAGE_KEY = 'gadmin-theme-style';
63
+ const SIDER_THEME_STORAGE_KEY = 'gadmin-sider-theme';
64
+ const MENU_LAYOUT_STORAGE_KEY = 'gadmin-menu-layout';
65
+ const MENU_SELECTION_STORAGE_KEY = 'gadmin-menu-selection';
66
+ const MENU_EXPAND_STORAGE_KEY = 'gadmin-menu-expand';
67
+
68
+ const DEFAULT_PRESET: ThemePresetKey = 'blue';
69
+ const DEFAULT_MODE: ThemeMode = 'light';
70
+ const DEFAULT_STYLE: ThemeStyleKey = 'standard';
71
+ const DEFAULT_SIDER_THEME: SiderTheme = 'auto';
72
+ const DEFAULT_MENU_LAYOUT: MenuLayoutMode = 'tree';
73
+ const DEFAULT_MENU_SELECTION: MenuSelectionStyle = 'fill';
74
+ const DEFAULT_MENU_EXPAND: MenuExpandMode = 'accordion';
75
+
76
+ const readStorage = <T,>(
77
+ key: string,
78
+ isValid: (v: unknown) => v is T,
79
+ fallback: T,
80
+ ): T => {
81
+ try {
82
+ const saved = window.localStorage.getItem(key);
83
+ if (isValid(saved)) return saved;
84
+ } catch {
85
+ // localStorage 不可用 (隐私模式 / SSR),回落到默认。
86
+ }
87
+ return fallback;
88
+ };
89
+
90
+ const writeStorage = (key: string, value: string) => {
91
+ try {
92
+ window.localStorage.setItem(key, value);
93
+ } catch {
94
+ // 持久化失败不影响当次会话内的切换。
95
+ }
96
+ };
97
+
98
+ const isPreset = (v: unknown): v is ThemePresetKey =>
99
+ THEME_PRESETS.some((p) => p.key === v);
100
+ const isMode = (v: unknown): v is ThemeMode => v === 'light' || v === 'dark';
101
+ const isStyle = (v: unknown): v is ThemeStyleKey =>
102
+ THEME_STYLES.some((s) => s.key === v);
103
+ const isSiderTheme = (v: unknown): v is SiderTheme =>
104
+ v === 'auto' || v === 'dark' || v === 'light';
105
+ const isMenuLayout = (v: unknown): v is MenuLayoutMode =>
106
+ v === 'tree' || v === 'grouped';
107
+ const isMenuSelection = (v: unknown): v is MenuSelectionStyle =>
108
+ v === 'fill' || v === 'pill' || v === 'indicator';
109
+ const isMenuExpand = (v: unknown): v is MenuExpandMode =>
110
+ v === 'accordion' || v === 'multiple';
111
+
112
+ // 只保留与明暗无关的基调设置 (圆角/字体/语义色)。
113
+ // 背景色、文字色、组件底色等一律交给 antd algorithm 派生,
114
+ // 否则暗色模式下写死的浅色值会穿帮。
115
+ const baseThemeConfig: ThemeConfig = {
8
116
  token: {
9
117
  ...RefineThemes.Blue.token,
10
- colorPrimary: '#1677FF',
11
118
  colorError: '#fa541c',
12
- colorPrimaryText: 'rgba(0, 0, 0, 0.85)',
13
- colorTextSecondary: 'rgba(0, 0, 0, 0.65)',
14
- colorTextTertiary: 'rgba(0, 0, 0, 0.45)',
15
- colorBgContainer: '#F7F8F9',
16
- colorBgLayout: '#F0F2F5',
17
- colorBorderBg: '#E8E9EA',
18
119
  borderRadius: 6,
19
120
  fontFamily:
20
121
  "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'",
21
122
  },
22
123
  components: {
23
- Typography: {
24
- colorText: 'rgba(0, 0, 0, 0.85)',
25
- colorTextDescription: 'rgba(0, 0, 0, 0.65)',
26
- colorTextDisabled: 'rgba(0, 0, 0, 0.45)',
27
- },
28
- Card: {
29
- colorBgContainer: '#FFFFFF',
30
- headerBg: '#FAFAFA',
31
- },
32
- Table: {
33
- colorBgContainer: '#fff',
34
- },
35
- Input: {
36
- colorBgContainer: '#fff',
37
- },
38
- InputNumber: {
39
- colorBgContainer: '#fff',
40
- },
41
- Select: {
42
- colorBgContainer: '#fff',
43
- },
44
124
  Form: {
45
125
  labelFontSize: 14,
46
126
  },
47
127
  },
48
128
  };
49
129
 
130
+ interface AppearanceContextValue {
131
+ presetKey: ThemePresetKey;
132
+ setPresetKey: (key: ThemePresetKey) => void;
133
+ mode: ThemeMode;
134
+ setMode: (mode: ThemeMode) => void;
135
+ styleKey: ThemeStyleKey;
136
+ setStyleKey: (key: ThemeStyleKey) => void;
137
+ siderTheme: SiderTheme;
138
+ setSiderTheme: (next: SiderTheme) => void;
139
+ menuLayout: MenuLayoutMode;
140
+ setMenuLayout: (next: MenuLayoutMode) => void;
141
+ menuSelection: MenuSelectionStyle;
142
+ setMenuSelection: (next: MenuSelectionStyle) => void;
143
+ menuExpand: MenuExpandMode;
144
+ setMenuExpand: (next: MenuExpandMode) => void;
145
+ presets: ThemePreset[];
146
+ }
147
+
148
+ const AppearanceContext = createContext<AppearanceContextValue>({
149
+ presetKey: DEFAULT_PRESET,
150
+ setPresetKey: () => undefined,
151
+ mode: DEFAULT_MODE,
152
+ setMode: () => undefined,
153
+ styleKey: DEFAULT_STYLE,
154
+ setStyleKey: () => undefined,
155
+ siderTheme: DEFAULT_SIDER_THEME,
156
+ setSiderTheme: () => undefined,
157
+ menuLayout: DEFAULT_MENU_LAYOUT,
158
+ setMenuLayout: () => undefined,
159
+ menuSelection: DEFAULT_MENU_SELECTION,
160
+ setMenuSelection: () => undefined,
161
+ menuExpand: DEFAULT_MENU_EXPAND,
162
+ setMenuExpand: () => undefined,
163
+ presets: THEME_PRESETS,
164
+ });
165
+
166
+ export const useAppearance = () => useContext(AppearanceContext);
167
+
50
168
  export const ColorModeContextProvider: React.FC<PropsWithChildren> = ({
51
169
  children,
52
170
  }) => {
53
- return <ConfigProvider theme={themeConfig}>{children}</ConfigProvider>;
171
+ const [presetKey, setPresetKeyState] = useState<ThemePresetKey>(() =>
172
+ readStorage(PRESET_STORAGE_KEY, isPreset, DEFAULT_PRESET),
173
+ );
174
+ const [mode, setModeState] = useState<ThemeMode>(() =>
175
+ readStorage(MODE_STORAGE_KEY, isMode, DEFAULT_MODE),
176
+ );
177
+ const [styleKey, setStyleKeyState] = useState<ThemeStyleKey>(() =>
178
+ readStorage(STYLE_STORAGE_KEY, isStyle, DEFAULT_STYLE),
179
+ );
180
+ const [siderTheme, setSiderThemeState] = useState<SiderTheme>(() =>
181
+ readStorage(SIDER_THEME_STORAGE_KEY, isSiderTheme, DEFAULT_SIDER_THEME),
182
+ );
183
+ const [menuLayout, setMenuLayoutState] = useState<MenuLayoutMode>(() =>
184
+ readStorage(MENU_LAYOUT_STORAGE_KEY, isMenuLayout, DEFAULT_MENU_LAYOUT),
185
+ );
186
+ const [menuSelection, setMenuSelectionState] = useState<MenuSelectionStyle>(
187
+ () =>
188
+ readStorage(
189
+ MENU_SELECTION_STORAGE_KEY,
190
+ isMenuSelection,
191
+ DEFAULT_MENU_SELECTION,
192
+ ),
193
+ );
194
+ const [menuExpand, setMenuExpandState] = useState<MenuExpandMode>(() =>
195
+ readStorage(MENU_EXPAND_STORAGE_KEY, isMenuExpand, DEFAULT_MENU_EXPAND),
196
+ );
197
+
198
+ const setPresetKey = useCallback((key: ThemePresetKey) => {
199
+ setPresetKeyState(key);
200
+ writeStorage(PRESET_STORAGE_KEY, key);
201
+ }, []);
202
+ const setMode = useCallback((next: ThemeMode) => {
203
+ setModeState(next);
204
+ writeStorage(MODE_STORAGE_KEY, next);
205
+ }, []);
206
+ const setStyleKey = useCallback((key: ThemeStyleKey) => {
207
+ setStyleKeyState(key);
208
+ writeStorage(STYLE_STORAGE_KEY, key);
209
+ }, []);
210
+ const setSiderTheme = useCallback((next: SiderTheme) => {
211
+ setSiderThemeState(next);
212
+ writeStorage(SIDER_THEME_STORAGE_KEY, next);
213
+ }, []);
214
+ const setMenuLayout = useCallback((next: MenuLayoutMode) => {
215
+ setMenuLayoutState(next);
216
+ writeStorage(MENU_LAYOUT_STORAGE_KEY, next);
217
+ }, []);
218
+ const setMenuSelection = useCallback((next: MenuSelectionStyle) => {
219
+ setMenuSelectionState(next);
220
+ writeStorage(MENU_SELECTION_STORAGE_KEY, next);
221
+ }, []);
222
+ const setMenuExpand = useCallback((next: MenuExpandMode) => {
223
+ setMenuExpandState(next);
224
+ writeStorage(MENU_EXPAND_STORAGE_KEY, next);
225
+ }, []);
226
+
227
+ // 挂到 <html> 上,styles/theme-styles.css 里的风格质感规则
228
+ // (发光/毛玻璃/斑马纹/菜单选中态等) 以此为开关;data-mode 同时驱动
229
+ // styles/antd-theme-vars.css 的明暗变量切换,data-preset 驱动主色系列变量。
230
+ useEffect(() => {
231
+ const el = document.documentElement;
232
+ el.dataset.style = styleKey;
233
+ el.dataset.mode = mode;
234
+ el.dataset.preset = presetKey;
235
+ el.dataset.siderTheme = siderTheme;
236
+ el.dataset.menuLayout = menuLayout;
237
+ el.dataset.menuSelection = menuSelection;
238
+ }, [styleKey, mode, presetKey, siderTheme, menuLayout, menuSelection]);
239
+
240
+ const themeConfig = useMemo<ThemeConfig>(() => {
241
+ const colorPrimary =
242
+ THEME_PRESETS.find((p) => p.key === presetKey)?.colorPrimary ??
243
+ THEME_PRESETS[0].colorPrimary;
244
+ const pack =
245
+ THEME_STYLES.find((s) => s.key === styleKey) ?? THEME_STYLES[0];
246
+ const baseAlgorithm =
247
+ mode === 'dark' ? theme.darkAlgorithm : theme.defaultAlgorithm;
248
+ return {
249
+ ...baseThemeConfig,
250
+ // 不用 theme.cssVar:其按 provider 实例注入的 .css-var-* 规则在明暗来回
251
+ // 切换时存在清理竞态(表头/按钮残留暗色)。antd 组件按主题生成 hash 类
252
+ // 即可稳健切换;页面里的 var(--ant-*) 由 styles/antd-theme-vars.css 提供。
253
+ algorithm: baseAlgorithm,
254
+ token: {
255
+ ...baseThemeConfig.token,
256
+ ...pack.token,
257
+ ...(mode === 'dark' ? pack.darkToken : pack.lightToken),
258
+ // 主色始终来自色板预设,与风格包正交组合。
259
+ colorPrimary,
260
+ // 内容区背景: 亮色固定为项目约定的 #f0f2f5, 暗色交由 algorithm 派生,
261
+ // 页面通过 var(--ant-color-bg-layout) 引用以跟随明暗切换。
262
+ ...(mode === 'light' ? { colorBgLayout: '#f0f2f5' } : {}),
263
+ },
264
+ components: { ...baseThemeConfig.components, ...pack.components },
265
+ };
266
+ }, [presetKey, mode, styleKey]);
267
+
268
+ const ctx = useMemo(
269
+ () => ({
270
+ presetKey,
271
+ setPresetKey,
272
+ mode,
273
+ setMode,
274
+ styleKey,
275
+ setStyleKey,
276
+ siderTheme,
277
+ setSiderTheme,
278
+ menuLayout,
279
+ setMenuLayout,
280
+ menuSelection,
281
+ setMenuSelection,
282
+ menuExpand,
283
+ setMenuExpand,
284
+ presets: THEME_PRESETS,
285
+ }),
286
+ [
287
+ presetKey,
288
+ setPresetKey,
289
+ mode,
290
+ setMode,
291
+ styleKey,
292
+ setStyleKey,
293
+ siderTheme,
294
+ setSiderTheme,
295
+ menuLayout,
296
+ setMenuLayout,
297
+ menuSelection,
298
+ setMenuSelection,
299
+ menuExpand,
300
+ setMenuExpand,
301
+ ],
302
+ );
303
+
304
+ return (
305
+ <AppearanceContext.Provider value={ctx}>
306
+ <ConfigProvider theme={themeConfig}>{children}</ConfigProvider>
307
+ </AppearanceContext.Provider>
308
+ );
54
309
  };
@@ -0,0 +1,97 @@
1
+ import type { ThemeConfig } from 'antd';
2
+
3
+ export type ThemeStyleKey = 'standard' | 'minimal' | 'tech' | 'soft';
4
+
5
+ /**
6
+ * 界面风格包:在"主色预设"之外的第二个外观维度。
7
+ * 主色仍由 THEME_PRESETS 控制,风格包负责圆角/密度/字体/阴影/组件质感。
8
+ *
9
+ * token 分层:
10
+ * - token: 与明暗无关的基调 (圆角/字号/控件高度)
11
+ * - lightToken/darkToken: 依赖明暗的值 (边框色等),由 Provider 按 mode 挑选
12
+ * - components: 组件级覆写
13
+ * 更细腻的质感 (发光/毛玻璃等) 在 styles/theme-styles.css 里
14
+ * 用 html[data-style='xxx'] 实现,引用 --ant-* 变量以跟随明暗派生。
15
+ */
16
+ export interface ThemeStylePack {
17
+ key: ThemeStyleKey;
18
+ zhLabel: string;
19
+ enLabel: string;
20
+ zhDesc: string;
21
+ enDesc: string;
22
+ /** 抽屉里展示用的调性色块,仅作示意,不影响实际主色。 */
23
+ swatch: string;
24
+ token?: ThemeConfig['token'];
25
+ lightToken?: ThemeConfig['token'];
26
+ darkToken?: ThemeConfig['token'];
27
+ components?: ThemeConfig['components'];
28
+ }
29
+
30
+ export const THEME_STYLES: ThemeStylePack[] = [
31
+ {
32
+ key: 'standard',
33
+ zhLabel: '标准',
34
+ enLabel: 'Standard',
35
+ zhDesc: '默认均衡风格',
36
+ enDesc: 'Default balanced look',
37
+ swatch: '#1677FF',
38
+ },
39
+ {
40
+ key: 'minimal',
41
+ zhLabel: '简约现代',
42
+ enLabel: 'Minimal',
43
+ zhDesc: '大圆角 · 淡边框 · 去阴影大留白',
44
+ enDesc: 'Large radius, hairline borders, flat & airy',
45
+ swatch: '#5E6AD2',
46
+ token: {
47
+ borderRadius: 10,
48
+ borderRadiusLG: 14,
49
+ borderRadiusSM: 6,
50
+ controlHeight: 36,
51
+ paddingLG: 24,
52
+ },
53
+ lightToken: {
54
+ colorBorder: '#ECEEF1',
55
+ colorSplit: '#F2F3F5',
56
+ },
57
+ darkToken: {
58
+ colorBorder: 'rgba(255, 255, 255, 0.08)',
59
+ colorSplit: 'rgba(255, 255, 255, 0.05)',
60
+ },
61
+ components: {
62
+ Card: { boxShadowTertiary: 'none' },
63
+ },
64
+ },
65
+ {
66
+ key: 'tech',
67
+ zhLabel: '高科技感',
68
+ enLabel: 'Tech',
69
+ zhDesc: '等宽数字 · 霓虹发光 · 毛玻璃顶栏',
70
+ enDesc: 'Tabular numerals, neon glow, glass header',
71
+ swatch: '#00D4B1',
72
+ token: {
73
+ borderRadius: 4,
74
+ },
75
+ },
76
+ {
77
+ key: 'soft',
78
+ zhLabel: '柔和友好',
79
+ enLabel: 'Soft',
80
+ zhDesc: '超大圆角 · 胶囊按钮 · 弥散阴影',
81
+ enDesc: 'Extra round, pill buttons, diffused shadows',
82
+ swatch: '#7C3AED',
83
+ token: {
84
+ borderRadius: 12,
85
+ borderRadiusLG: 16,
86
+ borderRadiusSM: 8,
87
+ controlHeight: 36,
88
+ },
89
+ components: {
90
+ Button: {
91
+ borderRadius: 999,
92
+ borderRadiusSM: 999,
93
+ borderRadiusLG: 999,
94
+ },
95
+ },
96
+ },
97
+ ];
@@ -0,0 +1,251 @@
1
+ import React from 'react';
2
+ import { Drawer, Segmented, Space, Typography, theme } from 'antd';
3
+ import { useTranslation } from 'react-i18next';
4
+ import { useGetLocale } from '@refinedev/core';
5
+ import {
6
+ useAppearance,
7
+ THEME_STYLES,
8
+ type MenuExpandMode,
9
+ type MenuLayoutMode,
10
+ type MenuSelectionStyle,
11
+ type SiderTheme,
12
+ type ThemeMode,
13
+ } from 'components/contexts/color-mode';
14
+
15
+ const { Text } = Typography;
16
+ const { useToken } = theme;
17
+
18
+ interface SettingDrawerProps {
19
+ open: boolean;
20
+ onClose: () => void;
21
+ }
22
+
23
+ /** 一组设置项:标题 + 控件,纵向排布。 */
24
+ const Section: React.FC<React.PropsWithChildren<{ title: string }>> = ({
25
+ title,
26
+ children,
27
+ }) => (
28
+ <div style={{ marginBottom: 28 }}>
29
+ <Text type="secondary" style={{ fontSize: 12, letterSpacing: 0.4 }}>
30
+ {title}
31
+ </Text>
32
+ <div style={{ marginTop: 10 }}>{children}</div>
33
+ </div>
34
+ );
35
+
36
+ export const SettingDrawer: React.FC<SettingDrawerProps> = ({
37
+ open,
38
+ onClose,
39
+ }) => {
40
+ const { t } = useTranslation();
41
+ const { token } = useToken();
42
+ const locale = useGetLocale();
43
+ const isZh = locale() !== 'en';
44
+
45
+ const {
46
+ presetKey,
47
+ setPresetKey,
48
+ presets,
49
+ mode,
50
+ setMode,
51
+ styleKey,
52
+ setStyleKey,
53
+ siderTheme,
54
+ setSiderTheme,
55
+ menuLayout,
56
+ setMenuLayout,
57
+ menuSelection,
58
+ setMenuSelection,
59
+ menuExpand,
60
+ setMenuExpand,
61
+ } = useAppearance();
62
+
63
+ return (
64
+ <Drawer
65
+ title={t('header.settings', 'Appearance')}
66
+ placement="right"
67
+ width={300}
68
+ open={open}
69
+ onClose={onClose}
70
+ >
71
+ {/* 主题色:一排圆形色块点选 */}
72
+ <Section title={t('header.themeColor', 'Theme color')}>
73
+ <Space size={12}>
74
+ {presets.map((preset) => {
75
+ const active = preset.key === presetKey;
76
+ const label = isZh ? preset.zhLabel : preset.enLabel;
77
+ return (
78
+ <button
79
+ key={preset.key}
80
+ type="button"
81
+ role="radio"
82
+ aria-checked={active}
83
+ aria-label={label}
84
+ title={label}
85
+ onClick={() => setPresetKey(preset.key)}
86
+ style={{
87
+ width: 24,
88
+ height: 24,
89
+ padding: 0,
90
+ borderRadius: '50%',
91
+ border: 'none',
92
+ background: preset.colorPrimary,
93
+ cursor: 'pointer',
94
+ // 选中态: 底色间隙 + 同色描边环, 任意主题下都清晰。
95
+ boxShadow: active
96
+ ? `0 0 0 2px ${token.colorBgContainer}, 0 0 0 4px ${preset.colorPrimary}`
97
+ : 'none',
98
+ transform: active ? 'scale(1.05)' : 'none',
99
+ transition: 'transform 0.15s ease, box-shadow 0.15s ease',
100
+ }}
101
+ />
102
+ );
103
+ })}
104
+ </Space>
105
+ </Section>
106
+
107
+ {/* 界面风格:整体质感 (圆角/密度/阴影),与主题色正交 */}
108
+ <Section title={t('header.themeStyle', 'UI style')}>
109
+ <Space direction="vertical" size={8} style={{ width: '100%' }}>
110
+ {THEME_STYLES.map((style) => {
111
+ const active = style.key === styleKey;
112
+ return (
113
+ <button
114
+ key={style.key}
115
+ type="button"
116
+ role="radio"
117
+ aria-checked={active}
118
+ onClick={() => setStyleKey(style.key)}
119
+ style={{
120
+ display: 'flex',
121
+ alignItems: 'center',
122
+ gap: 10,
123
+ width: '100%',
124
+ padding: '8px 10px',
125
+ borderRadius: 8,
126
+ border: `1px solid ${
127
+ active ? token.colorPrimary : token.colorBorderSecondary
128
+ }`,
129
+ background: active
130
+ ? token.colorPrimaryBg
131
+ : token.colorBgContainer,
132
+ cursor: 'pointer',
133
+ textAlign: 'left',
134
+ transition: 'border-color 0.15s ease, background 0.15s ease',
135
+ }}
136
+ >
137
+ <span
138
+ style={{
139
+ width: 12,
140
+ height: 12,
141
+ borderRadius: '50%',
142
+ flexShrink: 0,
143
+ background: style.swatch,
144
+ }}
145
+ />
146
+ <span style={{ flex: 1, minWidth: 0 }}>
147
+ <span
148
+ style={{
149
+ display: 'block',
150
+ fontSize: 13,
151
+ color: token.colorText,
152
+ }}
153
+ >
154
+ {isZh ? style.zhLabel : style.enLabel}
155
+ </span>
156
+ <span
157
+ style={{
158
+ display: 'block',
159
+ fontSize: 12,
160
+ color: token.colorTextTertiary,
161
+ }}
162
+ >
163
+ {isZh ? style.zhDesc : style.enDesc}
164
+ </span>
165
+ </span>
166
+ </button>
167
+ );
168
+ })}
169
+ </Space>
170
+ </Section>
171
+
172
+ {/* 外观模式:浅色 / 深色 */}
173
+ <Section title={t('header.themeMode', 'Appearance mode')}>
174
+ <Segmented<ThemeMode>
175
+ block
176
+ value={mode}
177
+ onChange={setMode}
178
+ options={[
179
+ { label: t('header.modeLight', 'Light'), value: 'light' },
180
+ { label: t('header.modeDark', 'Dark'), value: 'dark' },
181
+ ]}
182
+ />
183
+ </Section>
184
+
185
+ {/* 侧边栏配色:跟随主题 / 深色 / 浅色 */}
186
+ <Section title={t('header.siderTheme', 'Sidebar color')}>
187
+ <Segmented<SiderTheme>
188
+ block
189
+ value={siderTheme}
190
+ onChange={setSiderTheme}
191
+ options={[
192
+ { label: t('header.siderAuto', 'Follow theme'), value: 'auto' },
193
+ { label: t('header.siderDark', 'Dark'), value: 'dark' },
194
+ { label: t('header.siderLight', 'Light'), value: 'light' },
195
+ ]}
196
+ />
197
+ </Section>
198
+
199
+ {/* 菜单组织:树形折叠 / 分组平铺 */}
200
+ <Section title={t('header.menuOrg', 'Menu organization')}>
201
+ <Segmented<MenuLayoutMode>
202
+ block
203
+ value={menuLayout}
204
+ onChange={setMenuLayout}
205
+ options={[
206
+ { label: t('header.menuTree', 'Collapsible tree'), value: 'tree' },
207
+ { label: t('header.menuGrouped', 'Flat groups'), value: 'grouped' },
208
+ ]}
209
+ />
210
+ </Section>
211
+
212
+ {/* 选中样式:填充 / 药丸 / 指示条 */}
213
+ <Section title={t('header.menuSelect', 'Selection style')}>
214
+ <Segmented<MenuSelectionStyle>
215
+ block
216
+ value={menuSelection}
217
+ onChange={setMenuSelection}
218
+ options={[
219
+ { label: t('header.selectFill', 'Fill'), value: 'fill' },
220
+ { label: t('header.selectPill', 'Pill'), value: 'pill' },
221
+ {
222
+ label: t('header.selectIndicator', 'Indicator'),
223
+ value: 'indicator',
224
+ },
225
+ ]}
226
+ />
227
+ </Section>
228
+
229
+ {/* 展开行为:仅树形折叠下有意义 (分组平铺永远全展开) */}
230
+ {menuLayout === 'tree' && (
231
+ <Section title={t('header.menuExpand', 'Expansion')}>
232
+ <Segmented<MenuExpandMode>
233
+ block
234
+ value={menuExpand}
235
+ onChange={setMenuExpand}
236
+ options={[
237
+ {
238
+ label: t('header.expandAccordion', 'Accordion'),
239
+ value: 'accordion',
240
+ },
241
+ {
242
+ label: t('header.expandMultiple', 'Multiple open'),
243
+ value: 'multiple',
244
+ },
245
+ ]}
246
+ />
247
+ </Section>
248
+ )}
249
+ </Drawer>
250
+ );
251
+ };