@gadmin2n/schematics 0.0.64 → 0.0.65

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 (222) hide show
  1. package/dist/lib/application/files/gadmin2-game-angle-demo/.dockerignore +2 -2
  2. package/dist/lib/application/files/gadmin2-game-angle-demo/Dockerfile +40 -26
  3. package/dist/lib/application/files/gadmin2-game-angle-demo/Jenkinsfile +30 -4
  4. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/example.prisma +33 -0
  5. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/system.prisma +163 -0
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Event.ts +70 -0
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Game.ts +6 -6
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/ITActivityDay.ts +70 -0
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Log.ts +2 -2
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Role.ts +2 -2
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/server/.env +20 -9
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/server/.env.local +1 -0
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/server/.eslintrc.js +1 -0
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/server/.prettierignore +1 -0
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/server/README.md +2 -18
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/server/gadmin-cli.json +1 -1
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/server/migrate-between-pg-schemas.js +1232 -0
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +65 -38
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/server/prisma/.generator.prisma +4 -3
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/server/prisma.config.ts +16 -0
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/games.ts +1 -71
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/index.ts +17 -21
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/permissions.ts +278 -0
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/seedDataMngtPages.ts +258 -0
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/users.ts +7 -0
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/alias.config.ts +7 -0
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/app.controller.ts +151 -11
  28. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/app.module.ts +29 -13
  29. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/app.service.ts +151 -12
  30. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/auth.guard.ts +87 -41
  31. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/http-cache.interceptor.ts +21 -0
  32. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/logger.ts +19 -0
  33. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/safe-log.util.ts +176 -0
  34. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/{yufuid.ts → taihu.ts} +49 -34
  35. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/tracing.ts +174 -0
  36. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/trim.pipe.ts +51 -0
  37. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/utils.ts +91 -0
  38. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/woaAuth.ts +25 -12
  39. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/main.ts +22 -12
  40. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.controller.spec.ts +20 -0
  41. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.controller.ts +190 -0
  42. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.module.ts +10 -0
  43. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.service.spec.ts +338 -0
  44. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.service.ts +83 -0
  45. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.controller.spec.ts +20 -0
  46. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.controller.ts +188 -0
  47. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.module.ts +10 -0
  48. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.service.spec.ts +18 -0
  49. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.service.ts +83 -0
  50. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.controller.spec.ts +20 -0
  51. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.controller.ts +250 -0
  52. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.module.ts +10 -0
  53. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.service.spec.ts +18 -0
  54. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.service.ts +1051 -0
  55. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.controller.spec.ts +20 -0
  56. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.controller.ts +196 -0
  57. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.module.ts +13 -0
  58. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.service.spec.ts +18 -0
  59. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.service.ts +219 -0
  60. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.controller.spec.ts +20 -0
  61. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.controller.ts +196 -0
  62. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.module.ts +10 -0
  63. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.service.spec.ts +18 -0
  64. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.service.ts +199 -0
  65. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.controller.spec.ts +20 -0
  66. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.controller.ts +210 -0
  67. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.module.ts +12 -0
  68. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.service.spec.ts +18 -0
  69. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.service.ts +849 -0
  70. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/roles-refresher.service.ts +133 -0
  71. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.controller.spec.ts +20 -0
  72. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.controller.ts +196 -0
  73. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.module.ts +10 -0
  74. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.service.spec.ts +18 -0
  75. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.service.ts +201 -0
  76. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.controller.spec.ts +20 -0
  77. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.controller.ts +196 -0
  78. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.module.ts +10 -0
  79. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.service.spec.ts +18 -0
  80. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.service.ts +216 -0
  81. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.controller.spec.ts +20 -0
  82. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.controller.ts +198 -0
  83. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.module.ts +10 -0
  84. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.service.spec.ts +18 -0
  85. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.service.ts +104 -0
  86. package/dist/lib/application/files/gadmin2-game-angle-demo/server/start-prod.sh +130 -0
  87. package/dist/lib/application/files/gadmin2-game-angle-demo/server/tsconfig.json +18 -3
  88. package/dist/lib/application/files/gadmin2-game-angle-demo/web/index.html +19 -0
  89. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +34 -42
  90. package/dist/lib/application/files/gadmin2-game-angle-demo/web/postcss.config.cjs +6 -0
  91. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/App.tsx +111 -185
  92. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/auditLogProvider.ts +5 -5
  93. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/index.tsx +49 -51
  94. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/custom-avatar.tsx +38 -0
  95. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/index.ts +4 -0
  96. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/{header/index.tsx → header.tsx} +22 -31
  97. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/index.ts +3 -1
  98. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/layout.tsx +32 -0
  99. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/logo.tsx +19 -0
  100. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/sider.tsx +331 -166
  101. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/title.tsx +61 -0
  102. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/pagination-total.tsx +21 -0
  103. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/tags/index.ts +1 -0
  104. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/tags/role-tag.tsx +44 -0
  105. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/text.tsx +74 -0
  106. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +258 -0
  107. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +16 -0
  108. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/enums/audit-log.enum.ts +13 -0
  109. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/enums/index.ts +1 -0
  110. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/login.ts +22 -4
  111. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +211 -0
  112. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useFetchData.ts +33 -0
  113. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useRoles.ts +30 -0
  114. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useUserPageAccess.ts +339 -0
  115. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/i18n.ts +8 -4
  116. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/index.tsx +3 -11
  117. package/dist/lib/application/files/gadmin2-game-angle-demo/web/{public → src}/locales/en/common.json +1 -1
  118. package/dist/lib/application/files/gadmin2-game-angle-demo/web/{public → src}/locales/zh_CN/common.json +1 -1
  119. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.css +3 -0
  120. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.tsx +134 -0
  121. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/create.tsx +113 -0
  122. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/edit.tsx +122 -0
  123. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.ts +8 -0
  124. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.tsx +6 -0
  125. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/list.tsx +213 -0
  126. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/show.tsx +61 -0
  127. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/AssignRolesModal.tsx +168 -0
  128. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/CreatePageModal.tsx +42 -0
  129. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/EditPageModal.tsx +42 -0
  130. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/PageDetailDrawer.tsx +101 -0
  131. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/PageFormModal.tsx +731 -0
  132. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/create.tsx +113 -0
  133. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/edit.tsx +122 -0
  134. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/hooks/usePageManagement.ts +36 -0
  135. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/index.ts +8 -0
  136. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/index.tsx +6 -0
  137. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/list.tsx +1113 -0
  138. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/queries.ts +17 -0
  139. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/show.tsx +61 -0
  140. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/types.ts +44 -0
  141. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/pageResource/create.tsx +113 -0
  142. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/pageResource/edit.tsx +122 -0
  143. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/pageResource/index.tsx +6 -0
  144. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/pageResource/list.tsx +243 -0
  145. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/pageResource/show.tsx +61 -0
  146. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/permission-readme/index.tsx +1088 -0
  147. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/CreateModal.tsx +25 -0
  148. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/EditModal.tsx +28 -0
  149. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/ResourceDetailDrawer.tsx +160 -0
  150. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/modal.tsx +202 -0
  151. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/create.tsx +113 -0
  152. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/edit.tsx +122 -0
  153. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/index.ts +9 -0
  154. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/index.tsx +6 -0
  155. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/list.tsx +184 -0
  156. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/queries.ts +10 -0
  157. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/show.tsx +61 -0
  158. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/types.ts +9 -0
  159. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/CreateModal.tsx +30 -0
  160. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/EditModal.tsx +47 -0
  161. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/RoleDetailDrawer.tsx +56 -0
  162. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/modal.tsx +302 -0
  163. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/create.tsx +113 -0
  164. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/edit.tsx +122 -0
  165. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/hooks/useRolePage.ts +35 -0
  166. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/index.ts +8 -0
  167. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/index.tsx +6 -0
  168. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/list.tsx +382 -0
  169. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/queries.ts +8 -0
  170. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/show.tsx +61 -0
  171. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/types.ts +8 -0
  172. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/rolePages/create.tsx +113 -0
  173. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/rolePages/edit.tsx +122 -0
  174. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/rolePages/index.tsx +6 -0
  175. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/rolePages/list.tsx +243 -0
  176. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/rolePages/show.tsx +61 -0
  177. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/roleResource/create.tsx +113 -0
  178. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/roleResource/edit.tsx +122 -0
  179. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/roleResource/index.tsx +6 -0
  180. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/roleResource/list.tsx +243 -0
  181. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/roleResource/show.tsx +61 -0
  182. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/create-modal.tsx +17 -0
  183. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/edit-modal.tsx +19 -0
  184. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/form-modal.tsx +188 -0
  185. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/index.ts +5 -0
  186. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/role-tag.tsx +48 -0
  187. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/show-drawer.tsx +140 -0
  188. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/create.tsx +113 -0
  189. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/edit.tsx +122 -0
  190. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/index.ts +8 -0
  191. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/index.tsx +6 -0
  192. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/list.tsx +342 -0
  193. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/queries.ts +14 -0
  194. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/show.tsx +61 -0
  195. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd.css +132 -0
  196. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/fc.css +58 -0
  197. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/index.css +128 -0
  198. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-drawer.module.css +18 -0
  199. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-page.module.css +21 -0
  200. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/audit-log.ts +1 -0
  201. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/index.ts +3 -0
  202. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/role.ts +7 -0
  203. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/user.ts +1 -0
  204. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/utilities/get-name-initials.ts +8 -0
  205. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/utilities/get-random-color.ts +27 -0
  206. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/utilities/index.ts +2 -0
  207. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/utilities/utils.tsx +5 -0
  208. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/vite-env.d.ts +1 -0
  209. package/dist/lib/application/files/gadmin2-game-angle-demo/web/tsconfig.json +3 -3
  210. package/dist/lib/application/files/gadmin2-game-angle-demo/web/vite.config.ts +31 -0
  211. package/package.json +1 -1
  212. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/sample.prisma +0 -65
  213. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Source.ts +0 -76
  214. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Tasklog.ts +0 -76
  215. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/roles.ts +0 -4
  216. package/dist/lib/application/files/gadmin2-game-angle-demo/web/craco.config.js +0 -27
  217. package/dist/lib/application/files/gadmin2-game-angle-demo/web/public/index.html +0 -53
  218. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/styles.ts +0 -10
  219. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/react-app-env.d.ts +0 -1
  220. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/reportWebVitals.ts +0 -15
  221. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd.less +0 -79
  222. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/VanillaJSONEditor/{index.js → index.jsx} +0 -0
@@ -0,0 +1,339 @@
1
+ import { useMemo, useState, useEffect, useRef, useCallback } from "react";
2
+ import { customRequest } from "helpers/login";
3
+ import type { Role } from "types/role";
4
+
5
+ const RoleCacheKey = "oiterproles";
6
+ const PagesCacheKey = "oiterpages";
7
+ const RolePagesCacheKey = "oiterprolepages";
8
+ const RolesDataCacheKey = "oiterprolesdatacache";
9
+
10
+ /**
11
+ * Base Hook: User Page Access Data
12
+ *
13
+ * This hook fetches and provides user's accessible page data.
14
+ * It's designed to be reused by:
15
+ * - useDynamicResources (for menu generation)
16
+ * - Any other component that needs page access info
17
+ *
18
+ * Data Flow:
19
+ * SessionStorage(roles) → Role IDs → RolePages → Accessible Page IDs → Page Codes
20
+ */
21
+
22
+ export interface Page {
23
+ id: number;
24
+ code: string;
25
+ name: string;
26
+ description?: string;
27
+ zhName?: string;
28
+ enName?: string;
29
+ iframeUrl?: string;
30
+ externalRedirectUrl?: string;
31
+ icon?: string;
32
+ path: string;
33
+ parentId?: number | null;
34
+ isVirtual?: boolean;
35
+ sortOrder: number;
36
+ }
37
+
38
+ interface RolePage {
39
+ id: number;
40
+ roleId: number;
41
+ pageId: number;
42
+ }
43
+
44
+ export interface UseUserPageAccessResult {
45
+ /** Set of page IDs the user can access */
46
+ accessiblePageIds: Set<number>;
47
+ /** Set of page codes the user can access */
48
+ accessiblePageCodes: Set<string>;
49
+ /** All pages data from backend */
50
+ pagesData: Page[] | null;
51
+ /** Role pages mapping data */
52
+ rolePagesData: RolePage[] | null;
53
+ /** Map of pageId -> Page object */
54
+ pageMap: Map<number, Page>;
55
+ /** Map of pageCode -> Page object */
56
+ pageCodeMap: Map<string, Page>;
57
+ /** User's role names */
58
+ roleNames: string[];
59
+ /** User's role IDs */
60
+ roleIds: number[];
61
+ /** Whether data is still loading */
62
+ isLoading: boolean;
63
+ /** Check if user can access a page by code */
64
+ canAccessPage: (pageCode: string) => boolean;
65
+ }
66
+
67
+ function readCache<T>(key: string): T | null {
68
+ try {
69
+ const raw = sessionStorage.getItem(key);
70
+ return raw ? (JSON.parse(raw) as T) : null;
71
+ } catch {
72
+ return null;
73
+ }
74
+ }
75
+
76
+ function writeCache(key: string, value: unknown): void {
77
+ try {
78
+ sessionStorage.setItem(key, JSON.stringify(value));
79
+ } catch {
80
+ // ignore quota errors
81
+ }
82
+ }
83
+
84
+ export const useUserPageAccess = (): UseUserPageAccessResult => {
85
+ // Role names — initialise from cache so first render is non-empty
86
+ const [roleNames, setRoleNames] = useState<string[]>(
87
+ () => readCache<string[]>(RoleCacheKey) ?? []
88
+ );
89
+ // isRoleLoading only stays true while we wait for the live /userinfo response
90
+ const [isRoleLoading, setIsRoleLoading] = useState(true);
91
+
92
+ // Data states — initialise from cache for instant first render
93
+ const [rolesData, setRolesData] = useState<Role[] | null>(
94
+ () => readCache<Role[]>(RolesDataCacheKey)
95
+ );
96
+ const [rolePagesData, setRolePagesData] = useState<RolePage[] | null>(
97
+ () => readCache<RolePage[]>(RolePagesCacheKey)
98
+ );
99
+ const [pagesData, setPagesData] = useState<Page[] | null>(
100
+ () => readCache<Page[]>(PagesCacheKey)
101
+ );
102
+
103
+ // Track previous roles to detect changes
104
+ const prevRolesRef = useRef<string>("");
105
+
106
+ // Function to update roles in state and sessionStorage
107
+ const updateRoles = useCallback((newRoles: string[]) => {
108
+ const rolesKey = JSON.stringify(newRoles.sort());
109
+ if (rolesKey !== prevRolesRef.current) {
110
+ console.log("[useUserPageAccess] Roles changed:", newRoles);
111
+ prevRolesRef.current = rolesKey;
112
+ setRoleNames(newRoles);
113
+ writeCache(RoleCacheKey, newRoles);
114
+ }
115
+ }, []);
116
+
117
+ // Step 1: Fetch roles directly from backend to ensure fresh data
118
+ useEffect(() => {
119
+ const fetchRolesFromBackend = async () => {
120
+ try {
121
+ const res = await customRequest<any>("userinfo", "GET", {});
122
+ const roles = res?.configPerms?.roles;
123
+ if (roles && Array.isArray(roles)) {
124
+ updateRoles(roles as string[]);
125
+ }
126
+ } catch (error) {
127
+ console.error("[useUserPageAccess] Failed to fetch roles from backend:", error);
128
+ // Fallback to sessionStorage if backend request fails
129
+ try {
130
+ const cached = readCache<string[]>(RoleCacheKey);
131
+ if (cached) {
132
+ updateRoles(cached);
133
+ }
134
+ } catch (e) {
135
+ console.error("[useUserPageAccess] Failed to parse cached roles:", e);
136
+ }
137
+ } finally {
138
+ setIsRoleLoading(false);
139
+ }
140
+ };
141
+
142
+ fetchRolesFromBackend();
143
+ }, [updateRoles]);
144
+
145
+ // Step 2: Fetch all page definitions
146
+ useEffect(() => {
147
+ const fetchPages = async () => {
148
+ try {
149
+ const res = await customRequest<any>("page/findMany", "post", {});
150
+ const pages = res?.data as Page[];
151
+ // Keep existing reference if page IDs haven't changed — prevents
152
+ // downstream memos (accessiblePageIds, dynamicResources, allResources)
153
+ // from rebuilding and giving Refine a new resources prop.
154
+ setPagesData(prev => {
155
+ if (prev && prev.length === pages.length &&
156
+ prev.every((p, i) => p.id === pages[i].id)) {
157
+ return prev;
158
+ }
159
+ writeCache(PagesCacheKey, pages);
160
+ return pages;
161
+ });
162
+ } catch (error) {
163
+ console.error("[useUserPageAccess] Failed to fetch pages:", error);
164
+ }
165
+ };
166
+ fetchPages();
167
+ }, []);
168
+
169
+ // Step 3: Fetch role IDs when roleNames are available
170
+ useEffect(() => {
171
+ if (roleNames.length === 0) {
172
+ setRolesData(null);
173
+ return;
174
+ }
175
+
176
+ const fetchRoles = async () => {
177
+ try {
178
+ const query = {
179
+ where: { name: { in: roleNames } },
180
+ select: { id: true, name: true },
181
+ };
182
+ const res = await customRequest<any>("role/findMany", "post", query);
183
+ const roles = res?.data as Role[];
184
+ setRolesData(roles);
185
+ writeCache(RolesDataCacheKey, roles);
186
+ } catch (error) {
187
+ console.error("[useUserPageAccess] Failed to fetch roles:", error);
188
+ }
189
+ };
190
+ fetchRoles();
191
+ }, [roleNames.join(",")]);
192
+
193
+ // Calculate roleIds
194
+ const roleIds = useMemo(() => {
195
+ if (!rolesData) return [];
196
+ return rolesData.map(role => role.id);
197
+ }, [rolesData]);
198
+
199
+ // Step 4: Fetch role-page relationships when roleIds are available
200
+ useEffect(() => {
201
+ if (roleIds.length === 0) {
202
+ setRolePagesData(null);
203
+ return;
204
+ }
205
+
206
+ const fetchRolePages = async () => {
207
+ try {
208
+ const query = { where: { roleId: { in: roleIds } } };
209
+ const res = await customRequest<any>("rolePages/findMany", "post", query);
210
+ const rolePages = res?.data as RolePage[];
211
+ // Same stable-reference trick: keep existing ref if content unchanged.
212
+ setRolePagesData(prev => {
213
+ if (prev && prev.length === rolePages.length &&
214
+ prev.every((rp, i) => rp.id === rolePages[i].id)) {
215
+ return prev;
216
+ }
217
+ writeCache(RolePagesCacheKey, rolePages);
218
+ return rolePages;
219
+ });
220
+ } catch (error) {
221
+ console.error("[useUserPageAccess] Failed to fetch rolePages:", error);
222
+ }
223
+ };
224
+
225
+ fetchRolePages();
226
+ }, [roleIds.join(",")]);
227
+
228
+ // Build page maps
229
+ const { pageMap, pageCodeMap } = useMemo(() => {
230
+ const idMap = new Map<number, Page>();
231
+ const codeMap = new Map<string, Page>();
232
+
233
+ if (pagesData) {
234
+ pagesData.forEach(page => {
235
+ idMap.set(page.id, page);
236
+ codeMap.set(page.code, page);
237
+ });
238
+ }
239
+
240
+ return { pageMap: idMap, pageCodeMap: codeMap };
241
+ }, [pagesData]);
242
+
243
+ // Track previous accessiblePageIds to prevent unnecessary reference changes
244
+ const prevAccessiblePageIdsRef = useRef<Set<number>>(new Set());
245
+
246
+ // Build accessible page IDs (with ancestor pages)
247
+ const accessiblePageIds = useMemo(() => {
248
+ const ids = new Set<number>();
249
+
250
+ if (!rolePagesData || !pagesData) {
251
+ return prevAccessiblePageIdsRef.current;
252
+ }
253
+
254
+ // Add directly accessible pages
255
+ rolePagesData.forEach(rolePage => {
256
+ ids.add(rolePage.pageId);
257
+ });
258
+
259
+ // Recursively add ancestor pages
260
+ const addAncestorPages = (pageId: number, visited: Set<number>) => {
261
+ if (visited.has(pageId)) return;
262
+ visited.add(pageId);
263
+
264
+ const page = pageMap.get(pageId);
265
+ if (!page) return;
266
+
267
+ if (page.parentId) {
268
+ ids.add(page.parentId);
269
+ addAncestorPages(page.parentId, visited);
270
+ }
271
+ };
272
+
273
+ const originalIds = Array.from(ids);
274
+ const visited = new Set<number>();
275
+ originalIds.forEach(pageId => {
276
+ addAncestorPages(pageId, visited);
277
+ });
278
+
279
+ // Keep existing reference if IDs haven't changed
280
+ const prev = prevAccessiblePageIdsRef.current;
281
+ if (prev.size === ids.size && Array.from(ids).every(id => prev.has(id))) {
282
+ return prev;
283
+ }
284
+
285
+ prevAccessiblePageIdsRef.current = ids;
286
+ return ids;
287
+ }, [rolePagesData, pagesData, pageMap]);
288
+
289
+ // Build accessible page codes
290
+ const accessiblePageCodes = useMemo(() => {
291
+ const codes = new Set<string>();
292
+
293
+ accessiblePageIds.forEach(pageId => {
294
+ const page = pageMap.get(pageId);
295
+ if (page) {
296
+ codes.add(page.code);
297
+ }
298
+ });
299
+
300
+ return codes;
301
+ }, [accessiblePageIds, pageMap]);
302
+
303
+ // Check if user can access a specific page
304
+ const canAccessPage = useMemo(() => {
305
+ return (pageCode: string): boolean => {
306
+ return accessiblePageCodes.has(pageCode);
307
+ };
308
+ }, [accessiblePageCodes]);
309
+
310
+ // Calculate loading state
311
+ // If we have cached data, isLoading is false even while background-refreshing
312
+ const hasCache = useMemo(
313
+ () => !!(readCache(PagesCacheKey) && readCache(RolePagesCacheKey)),
314
+ // eslint-disable-next-line react-hooks/exhaustive-deps
315
+ []
316
+ );
317
+
318
+ const isLoading = useMemo(() => {
319
+ // If cache was available on mount, never block rendering
320
+ if (hasCache && pagesData && rolePagesData) return false;
321
+ if (isRoleLoading) return true;
322
+ if (!pagesData) return true;
323
+ if (roleNames.length > 0 && roleIds.length > 0 && !rolePagesData) return true;
324
+ return false;
325
+ }, [isRoleLoading, pagesData, roleNames, roleIds, rolePagesData, hasCache]);
326
+
327
+ return {
328
+ accessiblePageIds,
329
+ accessiblePageCodes,
330
+ pagesData,
331
+ rolePagesData,
332
+ pageMap,
333
+ pageCodeMap,
334
+ roleNames,
335
+ roleIds,
336
+ isLoading,
337
+ canAccessPage,
338
+ };
339
+ };
@@ -1,19 +1,23 @@
1
1
  import i18n from "i18next";
2
2
  import { initReactI18next } from "react-i18next";
3
- import Backend from "i18next-xhr-backend";
4
3
  import detector from "i18next-browser-languagedetector";
4
+ import en from "./locales/en/common.json";
5
+ import zh_CN from "./locales/zh_CN/common.json";
5
6
 
6
7
  i18n
7
- .use(Backend)
8
8
  .use(detector)
9
9
  .use(initReactI18next)
10
10
  .init({
11
11
  supportedLngs: ["en", "zh_CN"],
12
- backend: {
13
- loadPath: "/locales/{{lng}}/{{ns}}.json",
12
+ resources: {
13
+ en: { common: en },
14
+ zh_CN: { common: zh_CN },
14
15
  },
15
16
  defaultNS: "common",
16
17
  fallbackLng: ["en", "zh_CN"],
18
+ react: {
19
+ useSuspense: false,
20
+ },
17
21
  });
18
22
 
19
23
  export default i18n;
@@ -1,7 +1,6 @@
1
1
  import React from 'react';
2
2
  import { createRoot } from 'react-dom/client';
3
3
 
4
- import reportWebVitals from './reportWebVitals';
5
4
  import App from './App';
6
5
  import './i18n';
7
6
 
@@ -14,15 +13,8 @@ if (!checkLogin()) {
14
13
  const root = createRoot(container);
15
14
 
16
15
  root.render(
17
- <React.StrictMode>
18
- <React.Suspense fallback='loading'>
19
- <App />
20
- </React.Suspense>
21
- </React.StrictMode>
16
+ <React.Suspense fallback='loading'>
17
+ <App />
18
+ </React.Suspense>
22
19
  );
23
20
  }
24
-
25
- // If you want to start measuring performance in your app, pass a function
26
- // to log results (for example: reportWebVitals(console.log))
27
- // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
28
- reportWebVitals();
@@ -15,7 +15,7 @@
15
15
  "buttons": {
16
16
  "submit": "Login",
17
17
  "forgotPassword": "Forgot password?",
18
- "noAccount": "Dont have an account?",
18
+ "noAccount": "Don't have an account?",
19
19
  "rememberMe": "Remember me"
20
20
  }
21
21
  },
@@ -15,7 +15,7 @@
15
15
  "buttons": {
16
16
  "submit": "Login",
17
17
  "forgotPassword": "Forgot password?",
18
- "noAccount": "Dont have an account?",
18
+ "noAccount": "Don't have an account?",
19
19
  "rememberMe": "Remember me"
20
20
  }
21
21
  },
@@ -0,0 +1,3 @@
1
+ .highlight-changed-row {
2
+ background-color: #fff2f0;
3
+ }
@@ -0,0 +1,134 @@
1
+ import { useState } from "react";
2
+
3
+ import { ZoomInOutlined } from "@ant-design/icons";
4
+ import { Button, Modal, Table } from "antd";
5
+ import type { ColumnsType } from "antd/es/table";
6
+
7
+ import { Text } from "components";
8
+ import { AuditLogActionEnum } from "enums";
9
+ import { AuditLog } from "types";
10
+ import { renderLongColumnValue } from "utilities/utils";
11
+
12
+ import "./action-cell.css";
13
+
14
+ export const ActionCell = ({ record }: { record: AuditLog }) => {
15
+ const [opened, setOpened] = useState(false);
16
+
17
+ const columns: ColumnsType<{
18
+ field: string;
19
+ from: any;
20
+ to: any;
21
+ }> = [
22
+ {
23
+ title: "Field",
24
+ dataIndex: "field",
25
+ key: "field",
26
+ render: (value) => <Text strong>{value}</Text>,
27
+ width: "20%",
28
+ },
29
+ ];
30
+
31
+ if (record.action === AuditLogActionEnum.update) {
32
+ columns.push({
33
+ title: "Old value",
34
+ dataIndex: "from",
35
+ key: "from",
36
+ width: "40%",
37
+ ellipsis: false,
38
+ render: (value) => {
39
+ if (value === null || value === undefined) {
40
+ return <Text type="secondary">-</Text>;
41
+ }
42
+ if (typeof value === "object") {
43
+ return renderLongColumnValue(JSON.stringify(value, null, 2));
44
+ }
45
+ return renderLongColumnValue(String(value));
46
+ },
47
+ });
48
+ }
49
+
50
+ columns.push({
51
+ title: "New value",
52
+ dataIndex: "to",
53
+ key: "to",
54
+ width: "40%",
55
+ ellipsis: false,
56
+ render: (value) => {
57
+ if (value === null || value === undefined) {
58
+ return <Text type="secondary">-</Text>;
59
+ }
60
+ if (typeof value === "object") {
61
+ return renderLongColumnValue(JSON.stringify(value, null, 2));
62
+ }
63
+ return renderLongColumnValue(String(value));
64
+ },
65
+ });
66
+
67
+ if (!record.data) {
68
+ return null;
69
+ }
70
+
71
+ const newData = JSON.parse(record.data || "{}");
72
+ const previousData = JSON.parse(record.previousData || "{}");
73
+ const changes = Object.entries(newData).map(([key, value]) => ({
74
+ field: key,
75
+ from: previousData[key],
76
+ to: value,
77
+ }));
78
+
79
+ return (
80
+ <div
81
+ style={{
82
+ display: "flex",
83
+ flexDirection: "column",
84
+ gap: "16px",
85
+ }}
86
+ >
87
+ <div
88
+ style={{
89
+ display: "flex",
90
+ alignItems: "center",
91
+ justifyContent: "space-between",
92
+ }}
93
+ >
94
+ <Button
95
+ size="small"
96
+ icon={<ZoomInOutlined />}
97
+ onClick={() => setOpened((prev) => !prev)}
98
+ >
99
+ Details
100
+ </Button>
101
+ </div>
102
+ {opened && (
103
+ <Modal
104
+ open={opened}
105
+ onOk={() => setOpened(false)}
106
+ onCancel={() => setOpened(false)}
107
+ style={{ minWidth: "60vw" }}
108
+ styles={{
109
+ body: {
110
+ maxHeight: "500px",
111
+ overflow: "auto",
112
+ },
113
+ }}
114
+ >
115
+ <Table
116
+ dataSource={changes}
117
+ pagination={false}
118
+ rowKey="field"
119
+ bordered
120
+ size="small"
121
+ columns={columns}
122
+ style={{ marginTop: "48px" }}
123
+ rowClassName={(row) => {
124
+ return record.action === AuditLogActionEnum.update &&
125
+ row.from !== row.to
126
+ ? "highlight-changed-row"
127
+ : "";
128
+ }}
129
+ />
130
+ </Modal>
131
+ )}
132
+ </div>
133
+ );
134
+ };
@@ -0,0 +1,113 @@
1
+
2
+ import {
3
+ FieldDataType,
4
+ handleInitialValues,
5
+ handleOnFinish,
6
+ ModelType,
7
+ produceModel,
8
+ } from '@gadmin2n/react-common';
9
+ import { Create, useFileUploadState, useForm } from "@refinedev/antd";
10
+ import { Form } from "antd";
11
+ import { IResourceComponentsProps, useApiUrl, useTranslate } from "@refinedev/core";
12
+ import React, { useContext, useState } from "react";
13
+ import { getFormItem, onFormValuesChange } from "../../helpers";
14
+ import { modelsMap, modelsEnum } from "../../generated/models.index";
15
+ import {
16
+ auditFormConfig as formConfig,
17
+ auditFormPrismaSelect as formPrismaSelect,
18
+ } from "../../generated/props/audit/config";
19
+ import {
20
+ auditModel,
21
+ useRelation,
22
+ } from "../../generated/props/audit/model";
23
+ import { Audit } from "../../generated/types/prisma.types";
24
+ import { AuditForm as transformClass } from "../../generated/props/audit/form.validator";
25
+ import { BusinessContext } from 'components/contexts/business';
26
+
27
+ export const AuditCreate: React.FC<IResourceComponentsProps> = () => {
28
+ const resourceName = "audit";
29
+ const t = useTranslate();
30
+
31
+
32
+
33
+ const [[fields, model]] = useState(() => {
34
+ const model: ModelType = produceModel(
35
+ auditModel,
36
+ {
37
+ // all formItem attrs surport, https://ant.design/components/form#formitem
38
+ // description : { component : <MDEditor data-color-mode="light" /> },
39
+ // status : { normalize : (value: any) => value ? "1" : "0" },
40
+ // cron: {validator: { validator: runCronValidator },},
41
+ },
42
+ transformClass
43
+ );
44
+
45
+ const fields: FieldDataType[] = formConfig.fields
46
+ .map((fieldName: string) => model[fieldName])
47
+ .filter((field: FieldDataType) => field);
48
+
49
+ return [fields, model] as const;
50
+ });
51
+
52
+ const { formProps, saveButtonProps, onFinish, form } =
53
+ useForm<Audit>({
54
+ meta: { select: formPrismaSelect},
55
+ });
56
+ if (formProps.initialValues || formConfig.initialValues) {
57
+ formProps.initialValues = handleInitialValues(
58
+ formProps.initialValues || formConfig.initialValues || {},
59
+ fields,
60
+ );
61
+ }
62
+
63
+ const apiUrl = useApiUrl();
64
+ const { isLoading, onChange } = useFileUploadState();
65
+ const relationSelectProps = useRelation(modelsMap);
66
+
67
+ return (
68
+ <Create
69
+ saveButtonProps={{
70
+ ...saveButtonProps,
71
+ disabled: isLoading,
72
+ }}
73
+ >
74
+ <Form
75
+ {...formProps}
76
+ validateTrigger="onBlur"
77
+ onFinish={(values) => {
78
+ onFinish(
79
+ handleOnFinish(
80
+ {
81
+ ...values,
82
+
83
+ },
84
+ fields
85
+ )
86
+ );
87
+ }}
88
+ layout="vertical"
89
+ form={form}
90
+ onValuesChange={onFormValuesChange(
91
+ form,
92
+ formConfig.reaction,
93
+ )}
94
+ >
95
+ {fields.map((field) => {
96
+ return getFormItem(
97
+ field,
98
+ resourceName,
99
+ t,
100
+ form,
101
+ formConfig.reaction,
102
+ modelsEnum,
103
+ model,
104
+ apiUrl,
105
+ relationSelectProps,
106
+ onChange
107
+ );
108
+ })}
109
+ </Form>
110
+ </Create>
111
+ );
112
+ };
113
+