@gadmin2n/schematics 0.0.70 → 0.0.71

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 (474) hide show
  1. package/dist/lib/application/files/gadmin2-game-angle-demo/web/.npmrc +1 -0
  2. package/package.json +1 -1
  3. package/src/lib/application/application.schema.d.ts +59 -0
  4. package/src/lib/application/files/gadmin2-game-angle-demo/.dockerignore +33 -0
  5. package/src/lib/application/files/gadmin2-game-angle-demo/.gitignore +46 -0
  6. package/src/lib/application/files/gadmin2-game-angle-demo/.husky/_/.gitignore +1 -0
  7. package/src/lib/application/files/gadmin2-game-angle-demo/.husky/_/husky.sh +36 -0
  8. package/src/lib/application/files/gadmin2-game-angle-demo/.husky/pre-commit +10 -0
  9. package/src/lib/application/files/gadmin2-game-angle-demo/Dockerfile +63 -0
  10. package/src/lib/application/files/gadmin2-game-angle-demo/Jenkinsfile +70 -0
  11. package/src/lib/application/files/gadmin2-game-angle-demo/config/.types.d.ts +143 -0
  12. package/src/lib/application/files/gadmin2-game-angle-demo/config/prisma/canvas.prisma +45 -0
  13. package/src/lib/application/files/gadmin2-game-angle-demo/config/prisma/example.prisma +34 -0
  14. package/src/lib/application/files/gadmin2-game-angle-demo/config/prisma/system.prisma +173 -0
  15. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/Audit.ts +70 -0
  16. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/Event.ts +70 -0
  17. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/Game.ts +58 -0
  18. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/ITActivityDay.ts +70 -0
  19. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/Log.ts +56 -0
  20. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/Page.ts +70 -0
  21. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/PageResource.ts +70 -0
  22. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/Resource.ts +70 -0
  23. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/Role.ts +58 -0
  24. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/RolePages.ts +70 -0
  25. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/RoleResource.ts +70 -0
  26. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/SavedQuery.ts +70 -0
  27. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/User.ts +70 -0
  28. package/src/lib/application/files/gadmin2-game-angle-demo/config/ui/_common.ts +16 -0
  29. package/src/lib/application/files/gadmin2-game-angle-demo/readme.md +142 -0
  30. package/src/lib/application/files/gadmin2-game-angle-demo/server/.env +31 -0
  31. package/src/lib/application/files/gadmin2-game-angle-demo/server/.env.local +1 -0
  32. package/src/lib/application/files/gadmin2-game-angle-demo/server/.eslintrc.js +28 -0
  33. package/src/lib/application/files/gadmin2-game-angle-demo/server/.prettierignore +7 -0
  34. package/src/lib/application/files/gadmin2-game-angle-demo/server/.prettierrc +4 -0
  35. package/src/lib/application/files/gadmin2-game-angle-demo/server/README.md +55 -0
  36. package/src/lib/application/files/gadmin2-game-angle-demo/server/config/ac.config.ts +24 -0
  37. package/src/lib/application/files/gadmin2-game-angle-demo/server/config/index.ts +58 -0
  38. package/src/lib/application/files/gadmin2-game-angle-demo/server/gadmin-cli.json +25 -0
  39. package/src/lib/application/files/gadmin2-game-angle-demo/server/migrate-between-pg-schemas.js +1232 -0
  40. package/src/lib/application/files/gadmin2-game-angle-demo/server/package.json +143 -0
  41. package/src/lib/application/files/gadmin2-game-angle-demo/server/prisma/.generator.prisma +34 -0
  42. package/src/lib/application/files/gadmin2-game-angle-demo/server/prisma.config.ts +16 -0
  43. package/src/lib/application/files/gadmin2-game-angle-demo/server/scripts/lib/page-helpers.ts +157 -0
  44. package/src/lib/application/files/gadmin2-game-angle-demo/server/scripts/page-manage.ts +290 -0
  45. package/src/lib/application/files/gadmin2-game-angle-demo/server/scripts/permission-manage.ts +184 -0
  46. package/src/lib/application/files/gadmin2-game-angle-demo/server/scripts/prismaModels.ts +143 -0
  47. package/src/lib/application/files/gadmin2-game-angle-demo/server/scripts/sync-resources.ts +100 -0
  48. package/src/lib/application/files/gadmin2-game-angle-demo/server/scripts/syncDataMngtPages.ts +119 -0
  49. package/src/lib/application/files/gadmin2-game-angle-demo/server/seed/games.ts +1 -0
  50. package/src/lib/application/files/gadmin2-game-angle-demo/server/seed/index.ts +21 -0
  51. package/src/lib/application/files/gadmin2-game-angle-demo/server/seed/permissions.ts +244 -0
  52. package/src/lib/application/files/gadmin2-game-angle-demo/server/seed/users.ts +7 -0
  53. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/alias.config.ts +7 -0
  54. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/app.controller.spec.ts +22 -0
  55. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/app.controller.ts +192 -0
  56. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/app.module.ts +91 -0
  57. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/app.service.ts +189 -0
  58. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/lib/auth.guard.ts +154 -0
  59. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/lib/http-cache.interceptor.ts +21 -0
  60. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/lib/logger.ts +19 -0
  61. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/lib/roles.guard.ts +47 -0
  62. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/lib/safe-log.util.ts +176 -0
  63. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/lib/taihu.ts +175 -0
  64. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/lib/tracing.ts +174 -0
  65. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/lib/trim.pipe.ts +51 -0
  66. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/lib/utils.ts +145 -0
  67. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/lib/woaAuth.ts +95 -0
  68. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/main.ts +132 -0
  69. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.controller.spec.ts +20 -0
  70. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.controller.ts +190 -0
  71. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.module.ts +10 -0
  72. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.service.spec.ts +338 -0
  73. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.service.ts +83 -0
  74. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.controller.spec.ts +20 -0
  75. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.controller.ts +81 -0
  76. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.dto.ts +49 -0
  77. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.module.ts +11 -0
  78. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.service.spec.ts +334 -0
  79. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.service.ts +249 -0
  80. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.controller.spec.ts +20 -0
  81. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.controller.ts +188 -0
  82. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.module.ts +10 -0
  83. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.service.spec.ts +18 -0
  84. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.service.ts +83 -0
  85. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/index.ts +4 -0
  86. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.controller.spec.ts +20 -0
  87. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.controller.ts +250 -0
  88. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.module.ts +10 -0
  89. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.service.spec.ts +18 -0
  90. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.service.ts +1051 -0
  91. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.controller.spec.ts +20 -0
  92. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.controller.ts +196 -0
  93. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.module.ts +13 -0
  94. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.service.spec.ts +18 -0
  95. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.service.ts +219 -0
  96. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.controller.spec.ts +20 -0
  97. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.controller.ts +196 -0
  98. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.module.ts +10 -0
  99. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.service.spec.ts +18 -0
  100. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.service.ts +199 -0
  101. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.controller.spec.ts +20 -0
  102. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.controller.ts +210 -0
  103. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.module.ts +12 -0
  104. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.service.spec.ts +18 -0
  105. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.service.ts +862 -0
  106. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/roles-refresher.service.ts +133 -0
  107. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.controller.spec.ts +20 -0
  108. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.controller.ts +196 -0
  109. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.module.ts +10 -0
  110. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.service.spec.ts +18 -0
  111. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.service.ts +201 -0
  112. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.controller.spec.ts +20 -0
  113. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.controller.ts +196 -0
  114. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.module.ts +10 -0
  115. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.service.spec.ts +18 -0
  116. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.service.ts +216 -0
  117. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.controller.spec.ts +20 -0
  118. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.controller.ts +198 -0
  119. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.module.ts +10 -0
  120. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.service.spec.ts +18 -0
  121. package/src/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.service.ts +104 -0
  122. package/src/lib/application/files/gadmin2-game-angle-demo/server/start-prod.sh +130 -0
  123. package/src/lib/application/files/gadmin2-game-angle-demo/server/test/app.e2e-spec.ts +24 -0
  124. package/src/lib/application/files/gadmin2-game-angle-demo/server/test/jest-e2e.json +9 -0
  125. package/src/lib/application/files/gadmin2-game-angle-demo/server/tsconfig.build.json +4 -0
  126. package/src/lib/application/files/gadmin2-game-angle-demo/server/tsconfig.json +36 -0
  127. package/src/lib/application/files/gadmin2-game-angle-demo/server/yarn.lock +7737 -0
  128. package/src/lib/application/files/gadmin2-game-angle-demo/web/.env +2 -0
  129. package/src/lib/application/files/gadmin2-game-angle-demo/web/.eslintrc.json +38 -0
  130. package/src/lib/application/files/gadmin2-game-angle-demo/web/.npmrc +1 -0
  131. package/src/lib/application/files/gadmin2-game-angle-demo/web/.prettierignore +2 -0
  132. package/src/lib/application/files/gadmin2-game-angle-demo/web/.prettierrc +4 -0
  133. package/src/lib/application/files/gadmin2-game-angle-demo/web/README.MD +48 -0
  134. package/src/lib/application/files/gadmin2-game-angle-demo/web/dev-shell-entry.html +49 -0
  135. package/src/lib/application/files/gadmin2-game-angle-demo/web/index.html +19 -0
  136. package/src/lib/application/files/gadmin2-game-angle-demo/web/package.json +92 -0
  137. package/src/lib/application/files/gadmin2-game-angle-demo/web/postcss.config.cjs +6 -0
  138. package/src/lib/application/files/gadmin2-game-angle-demo/web/public/favicon.ico +0 -0
  139. package/src/lib/application/files/gadmin2-game-angle-demo/web/public/images/flags/en.svg +1 -0
  140. package/src/lib/application/files/gadmin2-game-angle-demo/web/public/images/flags/zh_CN.svg +11 -0
  141. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/App.tsx +137 -0
  142. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/auditLogProvider.ts +89 -0
  143. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/authProvider.ts +144 -0
  144. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/BulkActions.tsx +287 -0
  145. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/ListPageHeader.tsx +56 -0
  146. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/RowActions.tsx +318 -0
  147. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/SearchBar.tsx +323 -0
  148. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/SqlModal.tsx +495 -0
  149. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/VanillaJSONEditor/index.css +10 -0
  150. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/VanillaJSONEditor/index.jsx +53 -0
  151. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/AgentContext.tsx +375 -0
  152. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/ElementInspector.tsx +1133 -0
  153. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/agentAttributes.ts +70 -0
  154. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/index.ts +8 -0
  155. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/inspectorActions.ts +1034 -0
  156. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/pagePathUtils.ts +66 -0
  157. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/promptGenerator.ts +135 -0
  158. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/propPatcher.ts +84 -0
  159. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/eventList/index.tsx +58 -0
  160. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/index.ts +4 -0
  161. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/logButton/index.tsx +96 -0
  162. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/logList/index.tsx +72 -0
  163. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/modalDiffViewer/index.tsx +104 -0
  164. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/index.tsx +2 -0
  165. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/BarChart/index.tsx +896 -0
  166. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/ChartSwitcher/index.tsx +219 -0
  167. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/ChartViewer/index.tsx +159 -0
  168. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Filter/index.tsx +192 -0
  169. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/LineChart/index.tsx +1034 -0
  170. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumCard/NumCard.module.css +8 -0
  171. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumCard/index.tsx +509 -0
  172. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumLineCard/index.tsx +66 -0
  173. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/PieChart/index.tsx +552 -0
  174. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/RadarChart/index.tsx +263 -0
  175. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Section/index.tsx +35 -0
  176. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Table/index.tsx +207 -0
  177. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/TreemapChart/index.tsx +382 -0
  178. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/WorldMap/index.tsx +135 -0
  179. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/chart-constants.ts +53 -0
  180. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/icon/InfoIcon.tsx +8 -0
  181. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/icon/index.ts +1 -0
  182. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/config.ts +31 -0
  183. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/nameMap.json +9 -0
  184. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/world.geo.json +39349 -0
  185. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/metric-info-tooltip/index.tsx +19 -0
  186. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/business/index.tsx +65 -0
  187. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/index.tsx +54 -0
  188. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/custom-avatar.tsx +42 -0
  189. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/index.ts +8 -0
  190. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/header.tsx +106 -0
  191. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/index.ts +4 -0
  192. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/layout.tsx +32 -0
  193. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/logo.tsx +19 -0
  194. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/sider.tsx +431 -0
  195. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/title.tsx +61 -0
  196. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/offLayoutArea/index.tsx +5 -0
  197. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/pagination-total.tsx +21 -0
  198. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/tags/index.ts +1 -0
  199. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/tags/role-tag.tsx +44 -0
  200. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/components/text.tsx +78 -0
  201. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/config/http.ts +49 -0
  202. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +428 -0
  203. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +16 -0
  204. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddDataModal.tsx +199 -0
  205. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddPageModal.tsx +335 -0
  206. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DeleteDataConfirm.tsx +56 -0
  207. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +401 -0
  208. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/EditDataModal.tsx +129 -0
  209. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/SkillMenu.tsx +202 -0
  210. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/UndoConfirm.tsx +36 -0
  211. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/index.tsx +8 -0
  212. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/style.css +835 -0
  213. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/enums/audit-log.enum.ts +13 -0
  214. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/enums/index.ts +1 -0
  215. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/form.tsx +471 -0
  216. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/get-name-initials.ts +8 -0
  217. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/get-random-color.ts +27 -0
  218. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/http.ts +84 -0
  219. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/index.tsx +8 -0
  220. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/list.tsx +491 -0
  221. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/login.ts +82 -0
  222. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/page-tree.ts +74 -0
  223. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/show.tsx +226 -0
  224. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/utils.tsx +9 -0
  225. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/index.ts +7 -0
  226. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/types.ts +138 -0
  227. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useBatchDelete.ts +191 -0
  228. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useBatchOperations.ts +153 -0
  229. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useBatchOperationsCore.ts +193 -0
  230. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useBatchUpdate.ts +182 -0
  231. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +220 -0
  232. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useECharts.tsx +144 -0
  233. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useFetchData.ts +33 -0
  234. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useListPageState.ts +303 -0
  235. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useRoles.ts +34 -0
  236. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useRowSelection.ts +38 -0
  237. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useUserPageAccess.ts +353 -0
  238. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/i18n.ts +23 -0
  239. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/index.tsx +27 -0
  240. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +321 -0
  241. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +324 -0
  242. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/meta.json +4 -0
  243. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/plugins/devShellPlugin.ts +81 -0
  244. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.css +3 -0
  245. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.tsx +134 -0
  246. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/create.tsx +105 -0
  247. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/edit.tsx +121 -0
  248. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.ts +8 -0
  249. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.tsx +4 -0
  250. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/list.tsx +220 -0
  251. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/show.tsx +74 -0
  252. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasCell.tsx +87 -0
  253. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasEditPage.tsx +192 -0
  254. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +409 -0
  255. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasPage.tsx +1372 -0
  256. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasToolbar.tsx +384 -0
  257. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CodeFloatWindow.tsx +476 -0
  258. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/ComponentThumbnail.tsx +137 -0
  259. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/IsolatedLivePreview.tsx +101 -0
  260. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/LivePreview.tsx +236 -0
  261. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/PublishModal.tsx +200 -0
  262. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasApi.ts +92 -0
  263. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasConfigRegistry.tsx +25 -0
  264. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasContextMenuRegistry.tsx +875 -0
  265. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasDefaults.ts +126 -0
  266. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasI18n.ts +11 -0
  267. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/BarChartDataSourceModal.tsx +115 -0
  268. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/ChartViewerConfigModal.tsx +217 -0
  269. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/LineChartDataSourceModal.tsx +153 -0
  270. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/NumCardDataSourceModal.tsx +211 -0
  271. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/PromptModal.tsx +90 -0
  272. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/RadarChartDataSourceModal.tsx +87 -0
  273. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/TableDataSourceModal.tsx +204 -0
  274. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/demos.ts +1153 -0
  275. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/index.tsx +2 -0
  276. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/sectionCompactor.ts +45 -0
  277. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/types.ts +45 -0
  278. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas-page/index.tsx +108 -0
  279. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/create.tsx +105 -0
  280. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/edit.tsx +121 -0
  281. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/index.tsx +4 -0
  282. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/list.tsx +237 -0
  283. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/show.tsx +74 -0
  284. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/AssignRolesModal.tsx +177 -0
  285. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/CreatePageModal.tsx +42 -0
  286. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/EditPageModal.tsx +46 -0
  287. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/PageDetailDrawer.tsx +136 -0
  288. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/PageFormModal.tsx +815 -0
  289. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/hooks/usePageManagement.ts +40 -0
  290. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/index.ts +1 -0
  291. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/list.tsx +1370 -0
  292. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/queries.ts +17 -0
  293. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/types.ts +45 -0
  294. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/permissionReadme/index.tsx +1090 -0
  295. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/CreateModal.tsx +25 -0
  296. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/EditModal.tsx +28 -0
  297. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/ResourceDetailDrawer.tsx +177 -0
  298. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/modal.tsx +230 -0
  299. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/index.ts +2 -0
  300. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/list.tsx +250 -0
  301. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/queries.ts +10 -0
  302. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/types.ts +9 -0
  303. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/CreateModal.tsx +30 -0
  304. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/EditModal.tsx +47 -0
  305. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/RoleDetailDrawer.tsx +66 -0
  306. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/modal.tsx +300 -0
  307. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/hooks/useRolePage.ts +35 -0
  308. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/index.ts +1 -0
  309. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/list.tsx +405 -0
  310. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/queries.ts +8 -0
  311. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/types.ts +8 -0
  312. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/create-modal.tsx +17 -0
  313. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/edit-modal.tsx +19 -0
  314. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/form-modal.tsx +194 -0
  315. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/index.ts +5 -0
  316. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/role-tag.tsx +48 -0
  317. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/show-drawer.tsx +145 -0
  318. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/index.ts +1 -0
  319. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/list.tsx +377 -0
  320. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/queries.ts +14 -0
  321. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/setupTests.ts +5 -0
  322. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd.css +132 -0
  323. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/styles/fc.css +58 -0
  324. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/styles/index.css +128 -0
  325. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-drawer.module.css +18 -0
  326. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-page.module.css +21 -0
  327. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/types/audit-log.ts +1 -0
  328. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/types/index.ts +3 -0
  329. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/types/role.ts +7 -0
  330. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/types/user.ts +1 -0
  331. package/src/lib/application/files/gadmin2-game-angle-demo/web/src/vite-env.d.ts +13 -0
  332. package/src/lib/application/files/gadmin2-game-angle-demo/web/tsconfig.json +28 -0
  333. package/src/lib/application/files/gadmin2-game-angle-demo/web/vite.config.ts +48 -0
  334. package/src/lib/application/files/gadmin2-game-angle-demo/web/yarn.lock +9482 -0
  335. package/src/lib/class/class.schema.d.ts +32 -0
  336. package/src/lib/class/files/js/__name__.js +1 -0
  337. package/src/lib/class/files/js/__name__.spec.js +7 -0
  338. package/src/lib/class/files/ts/__name__.spec.ts +7 -0
  339. package/src/lib/class/files/ts/__name__.ts +1 -0
  340. package/src/lib/client-app/angular/angular.schema.d.ts +32 -0
  341. package/src/lib/client-app/angular/files/angular.constants.ts +4 -0
  342. package/src/lib/client-app/angular/files/angular.module.ts +41 -0
  343. package/src/lib/client-app/angular/files/angular.providers.ts +27 -0
  344. package/src/lib/client-app/angular/files/angular.utils.ts +19 -0
  345. package/src/lib/client-app/angular/files/interfaces/angular-options.interface.ts +87 -0
  346. package/src/lib/client-app/angular/files/loaders/abstract.loader.ts +16 -0
  347. package/src/lib/client-app/angular/files/loaders/express.loader.ts +25 -0
  348. package/src/lib/client-app/angular/files/loaders/fastify.loader.ts +34 -0
  349. package/src/lib/client-app/angular/files/loaders/noop.loader.ts +12 -0
  350. package/src/lib/configuration/configuration.schema.d.ts +18 -0
  351. package/src/lib/configuration/files/js/nest-cli.json +6 -0
  352. package/src/lib/configuration/files/ts/nest-cli.json +5 -0
  353. package/src/lib/controller/controller.schema.d.ts +45 -0
  354. package/src/lib/controller/files/js/__name__.controller.js +4 -0
  355. package/src/lib/controller/files/js/__name__.controller.spec.js +18 -0
  356. package/src/lib/controller/files/ts/__name__.controller.spec.ts +18 -0
  357. package/src/lib/controller/files/ts/__name__.controller.ts +137 -0
  358. package/src/lib/decorator/decorator.schema.d.ts +24 -0
  359. package/src/lib/decorator/files/js/__name__.decorator.js +3 -0
  360. package/src/lib/decorator/files/ts/__name__.decorator.ts +3 -0
  361. package/src/lib/filter/files/js/__name__.filter.js +6 -0
  362. package/src/lib/filter/files/js/__name__.filter.spec.js +7 -0
  363. package/src/lib/filter/files/ts/__name__.filter.spec.ts +7 -0
  364. package/src/lib/filter/files/ts/__name__.filter.ts +6 -0
  365. package/src/lib/filter/filter.schema.d.ts +28 -0
  366. package/src/lib/gateway/files/js/__name__.gateway.js +9 -0
  367. package/src/lib/gateway/files/js/__name__.gateway.spec.js +18 -0
  368. package/src/lib/gateway/files/ts/__name__.gateway.spec.ts +18 -0
  369. package/src/lib/gateway/files/ts/__name__.gateway.ts +9 -0
  370. package/src/lib/gateway/gateway.schema.d.ts +36 -0
  371. package/src/lib/guard/files/js/__name__.guard.js +8 -0
  372. package/src/lib/guard/files/js/__name__.guard.spec.js +7 -0
  373. package/src/lib/guard/files/ts/__name__.guard.spec.ts +7 -0
  374. package/src/lib/guard/files/ts/__name__.guard.ts +11 -0
  375. package/src/lib/guard/guard.schema.d.ts +28 -0
  376. package/src/lib/interceptor/files/js/__name__.interceptor.js +8 -0
  377. package/src/lib/interceptor/files/js/__name__.interceptor.spec.js +7 -0
  378. package/src/lib/interceptor/files/ts/default/__name__.interceptor.spec.ts +7 -0
  379. package/src/lib/interceptor/files/ts/default/__name__.interceptor.ts +9 -0
  380. package/src/lib/interceptor/files/ts/generated/__name__.interceptor.spec.ts +7 -0
  381. package/src/lib/interceptor/files/ts/generated/__name__.interceptor.ts +13 -0
  382. package/src/lib/interceptor/interceptor.schema.d.ts +35 -0
  383. package/src/lib/interface/files/__name__.interface.ts +1 -0
  384. package/src/lib/interface/interface.schema.d.ts +20 -0
  385. package/src/lib/library/files/js/.babelrc +4 -0
  386. package/src/lib/library/files/js/jsconfig.json +9 -0
  387. package/src/lib/library/files/js/src/__name__.module.js +8 -0
  388. package/src/lib/library/files/js/src/__name__.service.js +4 -0
  389. package/src/lib/library/files/js/src/__name__.service.spec.js +18 -0
  390. package/src/lib/library/files/js/src/index.js +2 -0
  391. package/src/lib/library/files/ts/src/__name__.module.ts +8 -0
  392. package/src/lib/library/files/ts/src/__name__.service.spec.ts +18 -0
  393. package/src/lib/library/files/ts/src/__name__.service.ts +4 -0
  394. package/src/lib/library/files/ts/src/index.ts +2 -0
  395. package/src/lib/library/files/ts/tsconfig.lib.json +9 -0
  396. package/src/lib/library/library.schema.d.ts +24 -0
  397. package/src/lib/middleware/files/js/__name__.middleware.js +8 -0
  398. package/src/lib/middleware/files/js/__name__.middleware.spec.js +7 -0
  399. package/src/lib/middleware/files/ts/__name__.middleware.spec.ts +7 -0
  400. package/src/lib/middleware/files/ts/__name__.middleware.ts +8 -0
  401. package/src/lib/middleware/middleware.schema.d.ts +28 -0
  402. package/src/lib/module/files/js/__name__.module.js +4 -0
  403. package/src/lib/module/files/ts/__name__.module.ts +4 -0
  404. package/src/lib/module/module.schema.d.ts +40 -0
  405. package/src/lib/pipe/files/js/__name__.pipe.js +8 -0
  406. package/src/lib/pipe/files/js/__name__.pipe.spec.js +7 -0
  407. package/src/lib/pipe/files/ts/__name__.pipe.spec.ts +7 -0
  408. package/src/lib/pipe/files/ts/__name__.pipe.ts +8 -0
  409. package/src/lib/pipe/pipe.schema.d.ts +28 -0
  410. package/src/lib/prisma-resource/files/ts/__name__.controller.spec.ts +20 -0
  411. package/src/lib/prisma-resource/files/ts/__name__.controller.ts +63 -0
  412. package/src/lib/prisma-resource/files/ts/__name__.module.ts +9 -0
  413. package/src/lib/prisma-resource/files/ts/__name__.service.spec.ts +18 -0
  414. package/src/lib/prisma-resource/files/ts/__name__.service.ts +28 -0
  415. package/src/lib/prisma-resource/files/ts/dto/create-__name@singular__.dto.ts +1 -0
  416. package/src/lib/prisma-resource/files/ts/dto/create-__name@singular__.input.ts +7 -0
  417. package/src/lib/prisma-resource/files/ts/dto/update-__name@singular__.dto.ts +6 -0
  418. package/src/lib/prisma-resource/files/ts/dto/update-__name@singular__.input.ts +13 -0
  419. package/src/lib/prisma-resource/files/ts/entities/__name@singular@ent__.ts +7 -0
  420. package/src/lib/prisma-resource/prisma-resource.schema.d.ts +57 -0
  421. package/src/lib/provider/files/js/__name__.js +4 -0
  422. package/src/lib/provider/files/js/__name__.spec.js +18 -0
  423. package/src/lib/provider/files/ts/__name__.spec.ts +18 -0
  424. package/src/lib/provider/files/ts/__name__.ts +4 -0
  425. package/src/lib/provider/provider.schema.d.ts +48 -0
  426. package/src/lib/resolver/files/js/__name__.resolver.js +4 -0
  427. package/src/lib/resolver/files/js/__name__.resolver.spec.js +18 -0
  428. package/src/lib/resolver/files/ts/__name__.resolver.spec.ts +18 -0
  429. package/src/lib/resolver/files/ts/__name__.resolver.ts +4 -0
  430. package/src/lib/resolver/resolver.schema.d.ts +36 -0
  431. package/src/lib/resource/files/ts/__name__.controller.spec.ts +20 -0
  432. package/src/lib/resource/files/ts/__name__.controller.ts +63 -0
  433. package/src/lib/resource/files/ts/__name__.gateway.spec.ts +19 -0
  434. package/src/lib/resource/files/ts/__name__.gateway.ts +34 -0
  435. package/src/lib/resource/files/ts/__name__.graphql +24 -0
  436. package/src/lib/resource/files/ts/__name__.module.ts +9 -0
  437. package/src/lib/resource/files/ts/__name__.resolver.spec.ts +19 -0
  438. package/src/lib/resource/files/ts/__name__.resolver.ts +60 -0
  439. package/src/lib/resource/files/ts/__name__.service.spec.ts +18 -0
  440. package/src/lib/resource/files/ts/__name__.service.ts +28 -0
  441. package/src/lib/resource/files/ts/dto/create-__name@singular__.dto.ts +1 -0
  442. package/src/lib/resource/files/ts/dto/create-__name@singular__.input.ts +7 -0
  443. package/src/lib/resource/files/ts/dto/update-__name@singular__.dto.ts +6 -0
  444. package/src/lib/resource/files/ts/dto/update-__name@singular__.input.ts +13 -0
  445. package/src/lib/resource/files/ts/entities/__name@singular@ent__.ts +7 -0
  446. package/src/lib/resource/resource.schema.d.ts +57 -0
  447. package/src/lib/service/files/js/__name__.service.js +4 -0
  448. package/src/lib/service/files/js/__name__.service.spec.js +18 -0
  449. package/src/lib/service/files/ts/__name__.service.spec.ts +18 -0
  450. package/src/lib/service/files/ts/__name__.service.ts +4 -0
  451. package/src/lib/service/service.schema.d.ts +44 -0
  452. package/src/lib/sub-app/files/js/.babelrc +4 -0
  453. package/src/lib/sub-app/files/js/index.js +2 -0
  454. package/src/lib/sub-app/files/js/jsconfig.json +10 -0
  455. package/src/lib/sub-app/files/js/src/app.controller.js +15 -0
  456. package/src/lib/sub-app/files/js/src/app.controller.spec.js +22 -0
  457. package/src/lib/sub-app/files/js/src/app.module.js +10 -0
  458. package/src/lib/sub-app/files/js/src/app.service.js +8 -0
  459. package/src/lib/sub-app/files/js/src/main.js +8 -0
  460. package/src/lib/sub-app/files/js/test/app.e2e-spec.js +23 -0
  461. package/src/lib/sub-app/files/js/test/jest-e2e.json +5 -0
  462. package/src/lib/sub-app/files/ts/src/__name__.controller.spec.ts +22 -0
  463. package/src/lib/sub-app/files/ts/src/__name__.controller.ts +12 -0
  464. package/src/lib/sub-app/files/ts/src/__name__.module.ts +10 -0
  465. package/src/lib/sub-app/files/ts/src/__name__.service.ts +8 -0
  466. package/src/lib/sub-app/files/ts/src/main.ts +8 -0
  467. package/src/lib/sub-app/files/ts/test/app.e2e-spec.ts +24 -0
  468. package/src/lib/sub-app/files/ts/test/jest-e2e.json +9 -0
  469. package/src/lib/sub-app/files/ts/tsconfig.app.json +9 -0
  470. package/src/lib/sub-app/sub-app.schema.d.ts +21 -0
  471. package/src/lib/sub-app/workspace/js/.babelrc +4 -0
  472. package/src/lib/sub-app/workspace/js/index.js +2 -0
  473. package/src/lib/sub-app/workspace/js/jsconfig.json +10 -0
  474. package/src/lib/sub-app/workspace/ts/tsconfig.app.json +9 -0
@@ -0,0 +1,1034 @@
1
+ import React, { useMemo, useEffect } from 'react';
2
+ import { Spin, Empty } from 'antd';
3
+ import * as echarts from 'echarts';
4
+ import { useECharts } from '@/hooks/useECharts';
5
+ import { LEGEND_BASE, GRID_VERTICAL, GRID_DUAL_Y } from '../chart-constants';
6
+
7
+ // ─── Types ────────────────────────────────────────────────────────────────────
8
+
9
+ export type LineChartVariant =
10
+ | 'line'
11
+ | 'stackLine' // 向后兼容别名 → line
12
+ | 'stackArea' // 向后兼容别名 → line + stacked + area
13
+ | 'simpleLine' // 向后兼容别名 → line + smooth + area + showGrid=false
14
+ | 'mulAreaLine'
15
+ | 'dualYAxis';
16
+
17
+ /** line / simpleLine 单系列数据 */
18
+ export type LineDataSingle = { name: string; value: number | null }[];
19
+
20
+ /** stackLine 多系列数据 */
21
+ export interface LineDataMulti {
22
+ xData: string[];
23
+ series: {
24
+ name: string;
25
+ data: (number | null)[];
26
+ [key: string]: any;
27
+ }[];
28
+ }
29
+
30
+ /**
31
+ * mulAreaLine 复合面积折线图数据(BG/云厂商 etc.)
32
+ * outerKeyList: 外层 key(决定面积色),innerKeyList: 内层 key(决定虚线色)
33
+ * series[].name = "outerKey-innerKey",series[].areaColor = outerKey色,series[].lineColor = innerKey色
34
+ */
35
+ export interface LineDataMulAreaLine extends LineDataMulti {
36
+ outerKeyList?: string[];
37
+ innerKeyList?: string[];
38
+ originData?: any;
39
+ }
40
+
41
+ /**
42
+ * dualYAxis 双 Y 轴混合图(折线 + 柱状)数据。
43
+ * yData[0] 对应 Y 轴左侧,yData[1] 对应 Y 轴右侧。
44
+ * series[].yAxisIndex 决定数据挂在哪条 Y 轴,series[].type 可为 "line" | "bar"。
45
+ */
46
+ export interface LineDataDualYAxis {
47
+ xData: string[];
48
+ yData: [
49
+ { name: string; unit: string; max?: number },
50
+ { name: string; unit: string; max?: number },
51
+ ];
52
+ series: {
53
+ name: string;
54
+ data: (number | null)[];
55
+ type: 'line' | 'bar';
56
+ yAxisIndex: 0 | 1;
57
+ [key: string]: any;
58
+ }[];
59
+ }
60
+
61
+ export type LineChartData =
62
+ | LineDataSingle
63
+ | LineDataMulti
64
+ | LineDataMulAreaLine
65
+ | LineDataDualYAxis;
66
+
67
+ /** 标注线配置:在指定 Y 轴值处绘制水平红色参考线 */
68
+ export interface MarkLineConfig {
69
+ value: number;
70
+ /** 线条颜色,默认 #fd0100 */
71
+ color?: string;
72
+ }
73
+
74
+ export interface LineChartProps {
75
+ // ── 核心 ──────────────────────────────────────────────────────────────────
76
+ /** 折线数据,line / simpleLine 用 LineDataSingle,stackLine 用 LineDataMulti,dualYAxis 用 LineDataDualYAxis */
77
+ data: LineChartData;
78
+ /** 视觉变体:line = 单系列;stackLine = 多系列;stackArea = 多系列面积堆叠(每条线带颜色填充);simpleLine = 迷你趋势线(无轴标签);dualYAxis = 双 Y 轴混合图 */
79
+ variant?: LineChartVariant;
80
+ /**
81
+ * 图表标题,渲染在图表上方。
82
+ * - 字符串:套默认样式(居中、12px、bold、#515151)
83
+ * - ReactNode:直接渲染,样式由调用方控制
84
+ * height 只指图表区域高度,标题额外占空间。
85
+ */
86
+ title?: React.ReactNode;
87
+ /** Y 轴单位,line / stackLine 显示在 tooltip 和 Y 轴 label 中(dualYAxis 使用 yData 中的 unit) */
88
+ unit?: string;
89
+
90
+ // ── 布局 ──────────────────────────────────────────────────────────────────
91
+ /** 图表容器高度,默认 300 */
92
+ height?: number | string;
93
+ /** 是否显示图例,多系列默认 true,单系列默认 false */
94
+ legendShow?: boolean;
95
+
96
+ // ── 配置覆盖 ──────────────────────────────────────────────────────────────
97
+ /**
98
+ * 透传至 ECharts option 的配置(yAxis、xAxis、grid 等),与基准配置浅合并。
99
+ * simpleLine 支持 seriesProps 字段(覆盖 series 级配置,如主题色 lineStyle / areaStyle)。
100
+ */
101
+ chartProps?: Record<string, any>;
102
+
103
+ // ── 高级功能 ──────────────────────────────────────────────────────────────
104
+ /**
105
+ * 仅对 variant="line" 生效。
106
+ * 开启后 label 只在 x 轴可见刻度对应的数据点上显示(每隔一个刻度显示一次),
107
+ * 避免密集数据时标签重叠。
108
+ */
109
+ smartLabel?: boolean;
110
+
111
+ /**
112
+ * 智能 Y 轴模式(默认 false)。
113
+ * 开启后自动分析数据最小值/最大值,计算合理的轴范围(两侧加 30% padding),
114
+ * 让折线起伏清晰可见,而不是从 0 起始。
115
+ * 适用于 variant="line" / "stackLine"。
116
+ * 若数据集内所有值相同,或已通过 chartProps.yAxis.min/max 手动指定范围,则 smartYAxis 无效。
117
+ */
118
+ smartYAxis?: boolean;
119
+
120
+ /**
121
+ * 标注线配置,在 Y 轴指定值处绘制水平参考线(红色虚线)。
122
+ * 适用于 variant="stackLine",如带宽利用率 80% 阈值、网络延迟 100ms 阈值。
123
+ */
124
+ markLine?: MarkLineConfig;
125
+
126
+ // ── 样式开关 ──────────────────────────────────────────────────────────────
127
+ /** 是否堆叠(多系列时生效),默认 false */
128
+ stacked?: boolean;
129
+ /** 是否显示面积填充,默认 false */
130
+ area?: boolean;
131
+ /** 是否显示网格线(Y轴 splitLine),默认 true */
132
+ showGrid?: boolean;
133
+ /** 是否显示数据点标记(symbol),默认 false */
134
+ showDots?: boolean;
135
+ /** 是否显示坐标点数据标签(需 showDots 开启),默认 false */
136
+ showLabel?: boolean;
137
+ /** 是否使用平滑拟合曲线,默认 false */
138
+ smooth?: boolean;
139
+ /** 是否显示横纵坐标轴(轴标签+刻度),默认 true */
140
+ showAxis?: boolean;
141
+
142
+ // ── 状态 ──────────────────────────────────────────────────────────────────
143
+ /** 显示 Spin 加载态 */
144
+ loading?: boolean;
145
+ /** 强制显示空态。未传时根据数据是否为空自动判断 */
146
+ empty?: boolean;
147
+
148
+ // ── 样式 / 测试 ──────────────────────────────────────────────────────────
149
+ style?: React.CSSProperties;
150
+ className?: string;
151
+ /** data-testid */
152
+ testId: string;
153
+ /**
154
+ * 图表实例就绪回调,回传 ECharts 实例(销毁时传 null)。
155
+ * 用于 PieChart ↔ LineChart 联动(如 useChartLink)。
156
+ */
157
+ onChartReady?: (instance: import('echarts').ECharts | null) => void;
158
+ /**
159
+ * ECharts 事件绑定(如 click、mouseover),与 useECharts onEvents 对应。
160
+ */
161
+ onEvents?: Record<
162
+ string,
163
+ (params: any, chart: import('echarts').ECharts) => void
164
+ >;
165
+ }
166
+
167
+ // ─── 公共常量 ─────────────────────────────────────────────────────────────────
168
+
169
+ // LEGEND_BASE, GRID_VERTICAL, GRID_DUAL_Y 来自 ../chart-constants
170
+ const DEFAULT_GRID = { left: 60, right: 60 };
171
+
172
+ // ─── 空态判断 ─────────────────────────────────────────────────────────────────
173
+
174
+ function checkEmpty(data: LineChartData, variant: LineChartVariant): boolean {
175
+ if (
176
+ variant === 'stackLine' ||
177
+ variant === 'stackArea' ||
178
+ variant === 'mulAreaLine' ||
179
+ variant === 'dualYAxis'
180
+ ) {
181
+ const d = data as LineDataMulti;
182
+ return !d?.xData?.length && !d?.series?.length;
183
+ }
184
+ // variant='line' 可能是单系列(数组)或多系列(对象)
185
+ if (variant === 'line') {
186
+ if (Array.isArray(data)) {
187
+ return !(data as LineDataSingle)?.length;
188
+ }
189
+ const d = data as LineDataMulti;
190
+ return !d?.xData?.length && !d?.series?.length;
191
+ }
192
+ return !(data as LineDataSingle)?.length;
193
+ }
194
+
195
+ // ─── Smart Y Axis ─────────────────────────────────────────────────────────────
196
+
197
+ /**
198
+ * 根据数据值自动计算合理的 Y 轴 min/max,避免从 0 起始导致起伏不可见。
199
+ * 逻辑:找到数据最小/最大值,在两侧各加 30% padding,再取美观整数边界。
200
+ */
201
+ function computeSmartYAxis(
202
+ values: (number | null)[],
203
+ ): { min: number; max: number } | null {
204
+ const nums = values.filter(
205
+ (v): v is number => typeof v === 'number' && isFinite(v),
206
+ );
207
+ if (nums.length < 2) return null;
208
+
209
+ const dataMin = Math.min(...nums);
210
+ const dataMax = Math.max(...nums);
211
+ const range = dataMax - dataMin;
212
+
213
+ if (range === 0) return null; // 所有值相同,让 ECharts 自动处理
214
+
215
+ // 两侧各加 30% padding
216
+ const padding = range * 0.3;
217
+ const rawMin = dataMin - padding;
218
+ const rawMax = dataMax + padding;
219
+
220
+ // 按 range 量级取整,保证轴刻度美观
221
+ const mag = Math.pow(10, Math.floor(Math.log10(range)));
222
+ const niceMag = mag >= 1 ? mag : 1;
223
+
224
+ const min = Math.floor(rawMin / niceMag) * niceMag;
225
+ const max = Math.ceil(rawMax / niceMag) * niceMag;
226
+
227
+ return { min, max };
228
+ }
229
+
230
+ // ─── markLine ECharts 配置构建 ─────────────────────────────────────────────────
231
+
232
+ function buildMarkLineData(markLine?: MarkLineConfig) {
233
+ if (!markLine) return undefined;
234
+ return {
235
+ silent: true,
236
+ symbol: 'none',
237
+ label: { show: false },
238
+ lineStyle: {
239
+ color: markLine.color ?? '#fd0100',
240
+ type: 'solid',
241
+ },
242
+ data: [{ yAxis: markLine.value }],
243
+ };
244
+ }
245
+
246
+ // ─── Unified Line Option 构建 ────────────────────────────────────────────────
247
+
248
+ function isMultiData(
249
+ data: LineDataSingle | LineDataMulti,
250
+ ): data is LineDataMulti {
251
+ return !Array.isArray(data) && 'xData' in (data as any);
252
+ }
253
+
254
+ function buildUnifiedLineOption(
255
+ data: LineDataSingle | LineDataMulti,
256
+ unit: string,
257
+ chartProps: Record<string, any>,
258
+ options: {
259
+ stacked?: boolean;
260
+ area?: boolean;
261
+ showGrid?: boolean;
262
+ showDots?: boolean;
263
+ showLabel?: boolean;
264
+ smooth?: boolean;
265
+ showAxis?: boolean;
266
+ smartLabel?: boolean;
267
+ smartYAxis?: boolean;
268
+ markLine?: MarkLineConfig;
269
+ },
270
+ ): echarts.EChartsCoreOption {
271
+ const {
272
+ yAxis,
273
+ xAxis,
274
+ grid = {},
275
+ legend = {},
276
+ tooltip = {},
277
+ seriesProps = {},
278
+ } = chartProps;
279
+ const {
280
+ stacked,
281
+ area,
282
+ showGrid = true,
283
+ showDots,
284
+ showLabel,
285
+ smooth,
286
+ showAxis = true,
287
+ smartLabel,
288
+ smartYAxis,
289
+ markLine,
290
+ } = options;
291
+ const markLineData = buildMarkLineData(markLine);
292
+
293
+ if (isMultiData(data)) {
294
+ // ── 多系列模式 ──
295
+ const allValues = data?.series?.flatMap((s) => s.data) ?? [];
296
+ const smartY =
297
+ smartYAxis && !yAxis?.min && !yAxis?.max
298
+ ? computeSmartYAxis(allValues)
299
+ : null;
300
+
301
+ return {
302
+ tooltip: {
303
+ trigger: 'axis' as const,
304
+ valueFormatter: (value: number) => `${value}${unit}`,
305
+ ...tooltip,
306
+ },
307
+ legend: {
308
+ ...LEGEND_BASE,
309
+ data: data?.series?.map((item) => item?.name),
310
+ ...legend,
311
+ },
312
+ xAxis: {
313
+ type: 'category' as const,
314
+ boundaryGap: false,
315
+ axisTick: { show: false },
316
+ axisLine: { show: false },
317
+ data: data?.xData,
318
+ axisLabel: { show: showAxis, fontSize: '10px', hideOverlap: true },
319
+ ...xAxis,
320
+ },
321
+ grid: { ...GRID_VERTICAL, ...grid },
322
+ yAxis: {
323
+ position: 'left' as const,
324
+ type: 'value' as const,
325
+ axisLabel: {
326
+ show: showAxis,
327
+ fontSize: '10px',
328
+ formatter: (value: number) => `${value}${unit}`,
329
+ },
330
+ axisLine: { show: false },
331
+ splitLine: { show: showGrid },
332
+ ...(smartY ?? {}),
333
+ ...yAxis,
334
+ },
335
+ series: data?.series?.map(
336
+ ({
337
+ name,
338
+ data: seriesData,
339
+ color,
340
+ lineStyle,
341
+ areaStyle: seriesAreaStyle,
342
+ stack,
343
+ }) => ({
344
+ type: 'line' as const,
345
+ smooth: smooth ?? false,
346
+ showSymbol: showDots ?? false,
347
+ label: {
348
+ show: !!(showDots && showLabel),
349
+ position: 'top' as const,
350
+ fontSize: 10,
351
+ },
352
+ name,
353
+ data: seriesData,
354
+ ...(stacked
355
+ ? { stack: stack ?? 'stack' }
356
+ : stack !== undefined
357
+ ? { stack }
358
+ : {}),
359
+ ...(color !== undefined && { color }),
360
+ ...(lineStyle !== undefined && { lineStyle }),
361
+ ...(area
362
+ ? {
363
+ areaStyle: { color: color ?? null, ...(seriesAreaStyle ?? {}) },
364
+ }
365
+ : seriesAreaStyle !== undefined
366
+ ? { areaStyle: seriesAreaStyle }
367
+ : {}),
368
+ ...(stacked && area
369
+ ? {
370
+ itemStyle: { color: color ?? null },
371
+ lineStyle: { color: color ?? null, ...(lineStyle ?? {}) },
372
+ emphasis: {
373
+ focus: 'series' as const,
374
+ blurScope: 'global' as const,
375
+ },
376
+ }
377
+ : {}),
378
+ ...seriesProps,
379
+ ...(markLineData !== undefined && { markLine: markLineData }),
380
+ }),
381
+ ),
382
+ };
383
+ }
384
+
385
+ // ── 单系列模式 ──
386
+ const smartY =
387
+ smartYAxis && !yAxis?.min && !yAxis?.max
388
+ ? computeSmartYAxis(data.map((d) => d?.value))
389
+ : null;
390
+
391
+ const labelFormatter = smartLabel
392
+ ? function (params: any) {
393
+ return params.dataIndex % 3 === 0 ? `${params.value}${unit}` : '';
394
+ }
395
+ : `{c}${unit}`;
396
+
397
+ return {
398
+ legend: { ...LEGEND_BASE, show: false },
399
+ tooltip: {
400
+ trigger: 'axis' as const,
401
+ formatter: (ctx: any) => {
402
+ if (ctx[0]) {
403
+ const { name, data: val, marker } = ctx[0];
404
+ return val !== null
405
+ ? `${marker || ''}${name}: ${val}${unit}`
406
+ : `${name}`;
407
+ }
408
+ return '';
409
+ },
410
+ ...tooltip,
411
+ },
412
+ xAxis: {
413
+ type: 'category' as const,
414
+ axisTick: { show: false },
415
+ axisLabel: {
416
+ show: showAxis,
417
+ fontSize: 10,
418
+ interval: 0,
419
+ hideOverlap: true,
420
+ margin: 15,
421
+ },
422
+ data: data.map((item) => item?.name),
423
+ ...xAxis,
424
+ },
425
+ yAxis: {
426
+ position: 'left' as const,
427
+ type: 'value' as const,
428
+ axisLabel: { show: showAxis, fontSize: 10 },
429
+ splitLine: { show: showGrid },
430
+ ...(smartY ?? {}),
431
+ ...yAxis,
432
+ },
433
+ grid: { ...DEFAULT_GRID, bottom: 30, top: 30, ...grid },
434
+ series: [
435
+ {
436
+ data: data.map((item) => item?.value),
437
+ type: 'line' as const,
438
+ smooth: smooth ?? false,
439
+ showSymbol: showDots ?? false,
440
+ label: {
441
+ show: !!(showDots && showLabel),
442
+ position: 'top' as const,
443
+ fontSize: 10,
444
+ formatter: labelFormatter,
445
+ },
446
+ ...(area
447
+ ? {
448
+ areaStyle: {
449
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
450
+ { offset: 0, color: 'rgba(56, 137, 243, 0.5)' },
451
+ { offset: 1, color: 'rgba(56, 137, 243, 0)' },
452
+ ]),
453
+ },
454
+ }
455
+ : {}),
456
+ ...seriesProps,
457
+ },
458
+ ],
459
+ };
460
+ }
461
+
462
+ // ─── GCD helpers for dualYAxis ────────────────────────────────────────────────
463
+
464
+ function multipleArrayAdd(...arrays: (number | null)[][]): number[] {
465
+ const length = arrays[0].length;
466
+ const result: number[] = [];
467
+ for (let i = 0; i < length; i++) {
468
+ let sum = 0;
469
+ for (const arr of arrays) {
470
+ sum += arr[i] ?? 0;
471
+ }
472
+ result.push(sum);
473
+ }
474
+ return result;
475
+ }
476
+
477
+ function gcdFunc(a: number, b: number): number {
478
+ a = Math.abs(a);
479
+ b = Math.abs(b);
480
+ const c = 5;
481
+ while (b !== 0) {
482
+ const temp = b;
483
+ b = a % b;
484
+ a = temp;
485
+ }
486
+ let result = a;
487
+ let temp = c;
488
+ while (temp !== 0) {
489
+ const tempValue = temp;
490
+ temp = result % temp;
491
+ result = tempValue;
492
+ }
493
+ return result;
494
+ }
495
+
496
+ function getHighestDigitAndOrder(num: number) {
497
+ num = Math.ceil(num);
498
+ const order = Math.pow(10, String(num).length - 1);
499
+ const highestDigit = Math.ceil(num / order);
500
+ return { highestDigit, order };
501
+ }
502
+
503
+ function getMaxValue(
504
+ series: LineDataDualYAxis['series'],
505
+ yAxisIndex: number,
506
+ ): number {
507
+ const seriesArr = series.filter((s) => s.yAxisIndex === yAxisIndex);
508
+ if (seriesArr.length && seriesArr.every((s) => s.type === 'bar')) {
509
+ const arr = multipleArrayAdd(...seriesArr.map((s) => s.data));
510
+ return Math.max(...arr, 0);
511
+ }
512
+ return Math.max(
513
+ ...seriesArr
514
+ .flatMap((s) => s.data)
515
+ .filter((v): v is number => typeof v === 'number'),
516
+ 0,
517
+ );
518
+ }
519
+
520
+ // ─── Option 构建函数 ──────────────────────────────────────────────────────────
521
+
522
+ // buildLineOption, buildStackLineOption, buildStackAreaOption 已合并为 buildUnifiedLineOption(见上方)
523
+
524
+ function buildMulAreaLineOption(
525
+ data: LineDataMulAreaLine,
526
+ unit: string,
527
+ chartProps: Record<string, any>,
528
+ ): echarts.EChartsCoreOption {
529
+ const { grid = {} } = chartProps;
530
+ const {
531
+ series = [],
532
+ xData = [],
533
+ outerKeyList = [],
534
+ innerKeyList = [],
535
+ } = data;
536
+
537
+ // Sort series: by outerKeyList order then innerKeyList order (mirrors getMulStackLineOption)
538
+ const outkeyGroup = series.reduce((acc: any, cur: any) => {
539
+ const outerKey = cur?.name?.split('-')?.[0] || cur?.name;
540
+ acc[outerKey] ? acc[outerKey].push(cur) : (acc[outerKey] = [cur]);
541
+ return acc;
542
+ }, {});
543
+ let sortedSeries: any[] = outerKeyList.map((outerKey: string) => {
544
+ return (outkeyGroup[outerKey] || []).sort((a: any, b: any) => {
545
+ const aInner = a?.name?.split('-')?.[1] || '';
546
+ const bInner = b?.name?.split('-')?.[1] || '';
547
+ return innerKeyList.indexOf(aInner) - innerKeyList.indexOf(bInner);
548
+ });
549
+ });
550
+ sortedSeries = sortedSeries.flat();
551
+ // 补上不在 outerKeyList(小份额)里的 series,避免丢失
552
+ const includedNames = new Set(sortedSeries.map((s: any) => s.name));
553
+ const remainder = series.filter((s: any) => !includedNames.has(s.name));
554
+ sortedSeries = [...sortedSeries, ...remainder];
555
+ if (sortedSeries.length === 0) sortedSeries = series;
556
+
557
+ return {
558
+ tooltip: { show: false },
559
+ legend: { ...LEGEND_BASE, show: false },
560
+ grid: { ...DEFAULT_GRID, top: 30, bottom: 45, ...grid },
561
+ xAxis: {
562
+ type: 'category' as const,
563
+ boundaryGap: false,
564
+ data: xData,
565
+ axisTick: { show: false },
566
+ axisLine: { show: false },
567
+ axisLabel: { fontSize: '10px', hideOverlap: true },
568
+ },
569
+ yAxis: {
570
+ position: 'left' as const,
571
+ type: 'value' as const,
572
+ axisLabel: {
573
+ formatter: (value: number) => value.toLocaleString(),
574
+ fontSize: '10px',
575
+ },
576
+ axisLine: { show: false },
577
+ splitNumber: 5,
578
+ },
579
+ series: sortedSeries.map((item: any, index: number) => {
580
+ const [outerKey, innerKey] = (item?.name || '').split('-');
581
+ const areaColor = item?.areaColor ?? null;
582
+ const lineColor = item?.lineColor ?? null;
583
+ return {
584
+ name: item?.name,
585
+ type: 'line' as const,
586
+ stack: 'stack',
587
+ data: item?.data,
588
+ smooth: false,
589
+ symbol: 'none',
590
+ triggerLineEvent: true, // 让面积/线条区域可触发 mouseover 等标准事件
591
+ lineStyle: {
592
+ type: 'dashed' as const,
593
+ dash: [5 + index, 5 + index],
594
+ color: lineColor,
595
+ width: 1,
596
+ opacity: 0.6,
597
+ },
598
+ areaStyle: {
599
+ color: areaColor,
600
+ opacity: 0.6,
601
+ },
602
+ };
603
+ }),
604
+ };
605
+ }
606
+
607
+ // buildSimpleLineOption 已废弃,simpleLine 功能由 buildUnifiedLineOption + smooth + area 覆盖
608
+
609
+ function buildDualYAxisOption(
610
+ data: LineDataDualYAxis,
611
+ chartProps: Record<string, any>,
612
+ ): echarts.EChartsCoreOption {
613
+ const { grid = {} } = chartProps;
614
+ const { xData, yData, series } = data;
615
+ const [y0, y1] = yData || [];
616
+
617
+ const maxY0val = getMaxValue(series, 0);
618
+ const maxY1val = getMaxValue(series, 1);
619
+
620
+ const { highestDigit: highestDigitY0, order: order0 } =
621
+ getHighestDigitAndOrder(maxY0val);
622
+ const { highestDigit: highestDigitY1, order: order1 } =
623
+ getHighestDigitAndOrder(maxY1val);
624
+
625
+ const gcdNum = gcdFunc(highestDigitY0, highestDigitY1);
626
+ const gcdMax = Math.max(highestDigitY0 / gcdNum, highestDigitY1 / gcdNum);
627
+ const max = Math.max(highestDigitY0, highestDigitY1);
628
+ let max0 = gcdMax * order0 > maxY0val ? gcdMax * order0 : max * order0;
629
+ let max1 = gcdMax * order1 > maxY1val ? gcdMax * order1 : max * order1;
630
+ max0 = y0?.max ?? max0;
631
+ max1 = y1?.max ?? max1;
632
+
633
+ const y0SeriesCount = series.filter((s) => s.yAxisIndex === 0).length;
634
+
635
+ return {
636
+ tooltip: {
637
+ trigger: 'axis' as const,
638
+ formatter: (params: any) => {
639
+ let result = `${params[0].name}<br/>`;
640
+ params.forEach((item: any, index: number) => {
641
+ const isY0 = index < y0SeriesCount;
642
+ const unit = isY0 ? (y0?.unit ?? '') : (y1?.unit ?? '');
643
+ const unitStr = unit ? `${unit}` : '';
644
+ result += `${item.marker} ${item.seriesName}: ${item.value?.toLocaleString?.() ?? item.value}${unitStr}<br/>`;
645
+ });
646
+ return result;
647
+ },
648
+ },
649
+ grid: { ...GRID_DUAL_Y, ...grid },
650
+ legend: { ...LEGEND_BASE },
651
+ xAxis: [
652
+ {
653
+ type: 'category' as const,
654
+ data: xData,
655
+ boundaryGap: false,
656
+ axisTick: { show: false },
657
+ axisLine: { show: false },
658
+ axisLabel: {
659
+ fontSize: 10,
660
+ interval: 0,
661
+ hideOverlap: true,
662
+ margin: 15,
663
+ },
664
+ },
665
+ ],
666
+ yAxis: [
667
+ {
668
+ type: 'value' as const,
669
+ alignTicks: false,
670
+ name: y0?.name + (y0?.unit ? `(${y0?.unit})` : ''),
671
+ axisLabel: {
672
+ fontSize: 10,
673
+ formatter: (value: number) =>
674
+ `${value?.toLocaleString?.() ?? value}${y0?.unit ?? ''}`,
675
+ },
676
+ max: max0,
677
+ min: 0,
678
+ },
679
+ {
680
+ type: 'value' as const,
681
+ alignTicks: false,
682
+ name: y1?.name + (y1?.unit ? `(${y1?.unit})` : ''),
683
+ axisLabel: {
684
+ fontSize: 10,
685
+ formatter: (value: number) => `${value}${y1?.unit ?? ''}`,
686
+ },
687
+ max: max1,
688
+ min: 0,
689
+ },
690
+ ],
691
+ series,
692
+ };
693
+ }
694
+
695
+ // ─── 组件 ─────────────────────────────────────────────────────────────────────
696
+
697
+ export const LineChart: React.FC<LineChartProps> = ({
698
+ data,
699
+ variant = 'line',
700
+ title = '',
701
+ unit = '',
702
+ height = 300,
703
+ legendShow: legendShowProp,
704
+ chartProps = {},
705
+ smartLabel = false,
706
+ smartYAxis = false,
707
+ markLine,
708
+ stacked: stackedProp,
709
+ area: areaProp,
710
+ showGrid: showGridProp,
711
+ showDots: showDotsProp,
712
+ showLabel: showLabelProp,
713
+ smooth: smoothProp,
714
+ showAxis: showAxisProp,
715
+ loading = false,
716
+ empty,
717
+ style,
718
+ className,
719
+ testId,
720
+ onChartReady,
721
+ onEvents,
722
+ }) => {
723
+ const isEmpty = empty ?? checkEmpty(data, variant);
724
+
725
+ const titleNode = title ? (
726
+ typeof title === 'string' ? (
727
+ <div
728
+ style={{
729
+ textAlign: 'center',
730
+ fontSize: 13,
731
+ fontWeight: 'bold',
732
+ color: '#515151',
733
+ marginTop: 12,
734
+ marginBottom: 4,
735
+ }}
736
+ >
737
+ {title}
738
+ </div>
739
+ ) : (
740
+ title
741
+ )
742
+ ) : null;
743
+
744
+ const mergedOption = useMemo(() => {
745
+ // 向后兼容别名
746
+ let effectiveVariant = variant;
747
+ let stacked = stackedProp;
748
+ let area = areaProp;
749
+ let smooth = smoothProp;
750
+ let showAxis = showAxisProp;
751
+ if (variant === 'stackLine') {
752
+ effectiveVariant = 'line';
753
+ } else if (variant === 'stackArea') {
754
+ effectiveVariant = 'line';
755
+ stacked = stacked ?? true;
756
+ area = area ?? true;
757
+ } else if (variant === 'simpleLine') {
758
+ effectiveVariant = 'line';
759
+ smooth = smooth ?? true;
760
+ area = area ?? true;
761
+ showAxis = showAxis ?? false;
762
+ }
763
+
764
+ switch (effectiveVariant) {
765
+ case 'line':
766
+ return buildUnifiedLineOption(
767
+ data as LineDataSingle | LineDataMulti,
768
+ unit,
769
+ chartProps,
770
+ {
771
+ stacked,
772
+ area,
773
+ showGrid: showGridProp,
774
+ showDots: showDotsProp,
775
+ showLabel: showLabelProp,
776
+ smooth,
777
+ showAxis,
778
+ smartLabel,
779
+ smartYAxis,
780
+ markLine,
781
+ },
782
+ );
783
+ case 'dualYAxis':
784
+ return buildDualYAxisOption(data as LineDataDualYAxis, chartProps);
785
+ case 'mulAreaLine':
786
+ return buildMulAreaLineOption(
787
+ data as LineDataMulAreaLine,
788
+ unit,
789
+ chartProps,
790
+ );
791
+ default:
792
+ return buildUnifiedLineOption(
793
+ data as LineDataSingle | LineDataMulti,
794
+ unit,
795
+ chartProps,
796
+ {
797
+ stacked,
798
+ area,
799
+ showGrid: showGridProp,
800
+ showDots: showDotsProp,
801
+ showLabel: showLabelProp,
802
+ smooth,
803
+ showAxis,
804
+ smartLabel,
805
+ smartYAxis,
806
+ markLine,
807
+ },
808
+ );
809
+ }
810
+ }, [
811
+ data,
812
+ variant,
813
+ unit,
814
+ chartProps,
815
+ smartLabel,
816
+ smartYAxis,
817
+ markLine,
818
+ stackedProp,
819
+ areaProp,
820
+ showGridProp,
821
+ showDotsProp,
822
+ showLabelProp,
823
+ smoothProp,
824
+ showAxisProp,
825
+ ]);
826
+
827
+ // legendShow 覆盖
828
+ const finalOption = useMemo(() => {
829
+ if (legendShowProp === undefined) return mergedOption;
830
+ return {
831
+ ...mergedOption,
832
+ legend: { ...(mergedOption as any).legend, show: legendShowProp },
833
+ };
834
+ }, [mergedOption, legendShowProp]);
835
+
836
+ // ── mulAreaLine 分组高亮:hover 子类时同父类其他子类稍淡,其他父类全透明 ──
837
+ const mulSeriesMetaRef = React.useRef<
838
+ { name: string; areaColor: any; lineColor: any }[]
839
+ >([]);
840
+ const mulActiveRef = React.useRef<string | null>(null);
841
+ if (variant === 'mulAreaLine') {
842
+ const mulData = data as LineDataMulAreaLine;
843
+ mulSeriesMetaRef.current =
844
+ mulData.series?.map((s) => ({
845
+ name: s.name,
846
+ areaColor: s.areaColor ?? null,
847
+ lineColor: s.lineColor ?? null,
848
+ })) ?? [];
849
+ }
850
+
851
+ const applyMulOpacity = React.useCallback(
852
+ (chart: any, hoveredName: string | null) => {
853
+ const meta = mulSeriesMetaRef.current;
854
+ if (!meta.length || !chart) return;
855
+
856
+ if (!hoveredName) {
857
+ chart.setOption({
858
+ series: meta.map((s) => ({
859
+ areaStyle: { color: s.areaColor, opacity: 0.6 },
860
+ lineStyle: { color: s.lineColor, opacity: 0.6 },
861
+ })),
862
+ });
863
+ return;
864
+ }
865
+
866
+ const outerKey = hoveredName.split('-')[0];
867
+ chart.setOption({
868
+ series: meta.map((s) => {
869
+ const sOuterKey = s.name.split('-')[0];
870
+ let opacity: number;
871
+ if (s.name === hoveredName) {
872
+ opacity = 0.9;
873
+ } else if (sOuterKey === outerKey) {
874
+ opacity = 0.35;
875
+ } else {
876
+ opacity = 0.05;
877
+ }
878
+ return {
879
+ areaStyle: { color: s.areaColor, opacity },
880
+ lineStyle: { color: s.lineColor, opacity },
881
+ };
882
+ }),
883
+ });
884
+ },
885
+ [],
886
+ );
887
+
888
+ const { domRef, chartRef } = useECharts({ option: finalOption, onEvents });
889
+
890
+ // 监听 ECharts 标准事件 + 外部 highlight/downplay(sunburst 联动)
891
+ // 必须在 useECharts 之后,保证 chartRef.current 已初始化
892
+ useEffect(() => {
893
+ if (variant !== 'mulAreaLine' || !chartRef.current) return;
894
+ const chart = chartRef.current;
895
+
896
+ const onMouseOver = (params: any) => {
897
+ const name = params.seriesName;
898
+ if (name && name !== mulActiveRef.current) {
899
+ mulActiveRef.current = name;
900
+ applyMulOpacity(chart, name);
901
+ }
902
+ };
903
+
904
+ const onMouseOut = () => {
905
+ if (mulActiveRef.current !== null) {
906
+ mulActiveRef.current = null;
907
+ applyMulOpacity(chart, null);
908
+ }
909
+ };
910
+
911
+ // 外部 dispatchAction highlight(如 sunburst 联动)
912
+ const onHighlight = (params: any) => {
913
+ const batch = params.batch ?? [params];
914
+ const meta = mulSeriesMetaRef.current;
915
+ let targetName: string | null = null;
916
+
917
+ for (const item of batch) {
918
+ if (item.seriesName) {
919
+ targetName = item.seriesName;
920
+ break;
921
+ }
922
+ if (item.seriesIndex != null && meta[item.seriesIndex]) {
923
+ targetName = meta[item.seriesIndex].name;
924
+ break;
925
+ }
926
+ }
927
+
928
+ if (targetName && targetName !== mulActiveRef.current) {
929
+ mulActiveRef.current = targetName;
930
+ applyMulOpacity(chart, targetName);
931
+ }
932
+ };
933
+
934
+ const onDownplay = () => {
935
+ if (mulActiveRef.current !== null) {
936
+ mulActiveRef.current = null;
937
+ applyMulOpacity(chart, null);
938
+ }
939
+ };
940
+
941
+ chart.on('mouseover', onMouseOver);
942
+ chart.on('mouseout', onMouseOut);
943
+ chart.on('highlight', onHighlight);
944
+ chart.on('downplay', onDownplay);
945
+
946
+ return () => {
947
+ chart.off('mouseover', onMouseOver);
948
+ chart.off('mouseout', onMouseOut);
949
+ chart.off('highlight', onHighlight);
950
+ chart.off('downplay', onDownplay);
951
+ };
952
+ }, [variant, finalOption, applyMulOpacity]);
953
+
954
+ // 回调 ECharts 实例(onChartReady)
955
+ useEffect(() => {
956
+ if (onChartReady) {
957
+ onChartReady(chartRef.current);
958
+ }
959
+ }, [chartRef.current]);
960
+
961
+ // 组件卸载时通知 null
962
+ useEffect(() => {
963
+ return () => {
964
+ if (onChartReady) onChartReady(null);
965
+ };
966
+ }, []);
967
+
968
+ // 数据到来后强制 resize,确保容器已有实际尺寸时图表正确渲染
969
+ useEffect(() => {
970
+ if (!isEmpty && chartRef.current) {
971
+ requestAnimationFrame(() => {
972
+ chartRef.current?.resize();
973
+ });
974
+ }
975
+ }, [isEmpty, mergedOption]);
976
+
977
+ return (
978
+ <div
979
+ style={{
980
+ position: 'relative',
981
+ width: '100%',
982
+ height,
983
+ ...(titleNode ? { display: 'flex', flexDirection: 'column' } : {}),
984
+ ...style,
985
+ }}
986
+ >
987
+ {titleNode}
988
+ <div
989
+ style={{
990
+ position: 'relative',
991
+ width: '100%',
992
+ ...(titleNode ? { flex: 1, minHeight: 0 } : { height: '100%' }),
993
+ }}
994
+ >
995
+ <div
996
+ ref={domRef}
997
+ className={className}
998
+ style={{ position: 'absolute', inset: 0 }}
999
+ data-testid={testId}
1000
+ />
1001
+ {isEmpty && !loading && (
1002
+ <div
1003
+ style={{
1004
+ position: 'absolute',
1005
+ inset: 0,
1006
+ display: 'flex',
1007
+ justifyContent: 'center',
1008
+ alignItems: 'center',
1009
+ }}
1010
+ >
1011
+ <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description="NO DATA" />
1012
+ </div>
1013
+ )}
1014
+ {loading && (
1015
+ <div
1016
+ style={{
1017
+ position: 'absolute',
1018
+ inset: 0,
1019
+ display: 'flex',
1020
+ justifyContent: 'center',
1021
+ alignItems: 'center',
1022
+ background: 'rgba(255,255,255,0.6)',
1023
+ zIndex: 1,
1024
+ }}
1025
+ >
1026
+ <Spin />
1027
+ </div>
1028
+ )}
1029
+ </div>
1030
+ </div>
1031
+ );
1032
+ };
1033
+
1034
+ export default LineChart;