@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,19 @@
1
+ import React from "react";
2
+
3
+ export const Logo = (props: React.SVGProps<SVGSVGElement>) => (
4
+ <svg
5
+ xmlns="http://www.w3.org/2000/svg"
6
+ width={24}
7
+ height={24}
8
+ viewBox="0 0 24 24"
9
+ fill="none"
10
+ {...props}
11
+ >
12
+ <path
13
+ fill="#1677FF"
14
+ fillRule="evenodd"
15
+ d="M12 24c6.627 0 12-5.373 12-12S18.627 0 12 0 0 5.373 0 12s5.373 12 12 12Zm3.744-18.41c.182-.647-.446-1.03-1.02-.621l-8.008 5.705c-.622.443-.524 1.326.147 1.326h2.109v-.016h4.11l-3.35 1.181-1.476 5.245c-.182.647.446 1.03 1.02.621l8.008-5.705c.622-.443.524-1.326-.147-1.326H13.94l1.805-6.41Z"
16
+ clipRule="evenodd"
17
+ />
18
+ </svg>
19
+ );
@@ -1,162 +1,341 @@
1
- import React, { useState } from "react";
1
+ import React, { useMemo, useEffect, useRef, useCallback, type CSSProperties } from "react";
2
+
3
+ import { useThemedLayoutContext } from "@refinedev/antd";
2
4
  import {
3
- ITreeMenu,
4
- CanAccess,
5
- useIsExistAuthentication,
6
- useTranslate,
7
- useLogout,
8
- useMenu,
9
- useWarnAboutChange,
5
+ type ITreeMenu,
6
+ pickNotDeprecated,
7
+ useLink,
8
+ useMenu,
9
+ useNavigation,
10
+ useGo,
10
11
  } from "@refinedev/core";
11
- import { Link } from "react-router-dom";
12
- import { Sider, ThemedTitle } from "@refinedev/antd";
13
- import { Layout as AntdLayout, Menu, Grid, theme, Button } from "antd";
12
+ import { useTranslation } from "react-i18next";
13
+
14
14
  import {
15
- LogoutOutlined,
16
- UnorderedListOutlined,
17
- RightOutlined,
18
- LeftOutlined,
15
+ BarsOutlined,
16
+ LeftOutlined,
17
+ RightOutlined,
18
+ UnorderedListOutlined,
19
19
  } from "@ant-design/icons";
20
- import { antLayoutSider, antLayoutSiderMobile } from "./styles";
20
+ import { Button, Drawer, Grid, Layout, Menu, theme, type MenuProps } from "antd";
21
+ import { Title } from "./title";
22
+
23
+ const drawerButtonStyles: CSSProperties = {
24
+ borderTopLeftRadius: 0,
25
+ borderBottomLeftRadius: 0,
26
+ position: "fixed",
27
+ top: 64,
28
+ zIndex: 1001,
29
+ };
30
+
31
+ let reRouteNum = 0;
21
32
 
33
+ const { SubMenu } = Menu;
22
34
  const { useToken } = theme;
23
35
 
24
- export const CustomSider: typeof Sider = ({ render }) => {
36
+ const getParentKeysFromMenuTree = (
37
+ items: ITreeMenu[],
38
+ targetKey: string,
39
+ parentKeys: string[] = [],
40
+ ): string[] | null => {
41
+ for (const item of items) {
42
+ const currentKey = item.key || "";
43
+
44
+ if (currentKey === targetKey) {
45
+ return parentKeys;
46
+ }
47
+
48
+ if (item.children && item.children.length > 0) {
49
+ const found = getParentKeysFromMenuTree(item.children, targetKey, [
50
+ ...parentKeys,
51
+ currentKey,
52
+ ]);
53
+ if (found) {
54
+ return found;
55
+ }
56
+ }
57
+ }
58
+ return null;
59
+ };
60
+
61
+ const getMenuLabel = (name: string, meta: Record<string, any>, locale: string): string => {
62
+ const isZh = locale === "zh_CN" || locale === "zh";
63
+ if (isZh && meta?.zhLabel) return meta.zhLabel;
64
+ if (!isZh && meta?.enLabel) return meta.enLabel;
65
+ return meta?.label || name;
66
+ };
67
+
68
+ export const Sider: React.FC = () => {
25
69
  const { token } = useToken();
26
- const [collapsed, setCollapsed] = useState<boolean>(false);
27
- const isExistAuthentication = useIsExistAuthentication();
28
- const { warnWhen, setWarnWhen } = useWarnAboutChange();
29
- const { mutate: mutateLogout } = useLogout();
30
- const translate = useTranslate();
31
70
  const { menuItems, selectedKey, defaultOpenKeys } = useMenu();
32
- const { SubMenu } = Menu;
71
+ const { t, i18n } = useTranslation();
72
+ const currentLocale = i18n.language;
33
73
 
34
- const breakpoint = Grid.useBreakpoint();
74
+ const [openKeys, setOpenKeys] = React.useState<string[]>(defaultOpenKeys);
35
75
 
36
- const isMobile =
37
- typeof breakpoint.lg === "undefined" ? false : !breakpoint.lg;
38
-
39
- const renderTreeView = (tree: ITreeMenu[], selectedKey: string) => {
40
- return tree.map((item: ITreeMenu) => {
41
- const { name, children, meta, key, list } = item;
42
-
43
- const icon = meta?.icon;
44
- const label = meta?.label ?? name;
45
- const parent = meta?.parent;
46
- const route =
47
- typeof list === "string"
48
- ? list
49
- : typeof list !== "function"
50
- ? list?.path
51
- : key;
52
-
53
- if (children.length > 0) {
54
- return (
55
- <SubMenu
56
- key={route}
57
- icon={icon ?? <UnorderedListOutlined />}
58
- title={label}
59
- style={{
60
- textTransform: "capitalize",
61
- }}
62
- >
63
- {renderTreeView(children, selectedKey)}
64
- </SubMenu>
65
- );
66
- }
67
- //console.log(route , selectedKey, defaultOpenKeys)
68
- const isSelected = route === selectedKey;
69
- const isRoute = !(parent !== undefined && children.length === 0);
70
- return (
71
- <CanAccess
72
- key={route}
73
- resource={name.toLowerCase()}
74
- action="list"
75
- params={{ resource: item }}
76
- >
77
- <Menu.Item
78
- key={route}
79
- style={{
80
- textTransform: "capitalize",
81
- }}
82
- icon={icon ?? (isRoute && <UnorderedListOutlined />)}
83
- >
84
- {route ? (
85
- <Link
86
- to={`${route}${meta?.listInitParams || ""}`}
87
- >
88
- {label}
89
- </Link>
90
- ) : (
91
- label
92
- )}
93
- {!collapsed && isSelected && (
94
- <div className="ant-menu-tree-arrow" />
95
- )}
96
- </Menu.Item>
97
- </CanAccess>
98
- );
99
- });
100
- };
76
+ const lastSelectedKeyRef = useRef<string | undefined>(undefined);
77
+
78
+ useEffect(() => {
79
+ if (selectedKey && selectedKey !== lastSelectedKeyRef.current && menuItems.length > 0) {
80
+ lastSelectedKeyRef.current = selectedKey;
101
81
 
102
- const handleLogout = () => {
103
- if (warnWhen) {
104
- const confirm = window.confirm(
105
- translate(
106
- "warnWhenUnsavedChanges",
107
- "Are you sure you want to leave? You have unsaved changes."
108
- )
109
- );
110
-
111
- if (confirm) {
112
- setWarnWhen(false);
113
- mutateLogout();
82
+ const parentKeys = getParentKeysFromMenuTree(menuItems, selectedKey);
83
+
84
+ if (parentKeys !== null) {
85
+ setOpenKeys(parentKeys);
114
86
  }
115
- } else {
116
- mutateLogout();
117
87
  }
118
- };
88
+ }, [selectedKey, menuItems]);
89
+
90
+ const { siderCollapsed, setSiderCollapsed, mobileSiderOpen, setMobileSiderOpen } =
91
+ useThemedLayoutContext();
92
+
93
+ const Link = useLink();
94
+ const go = useGo();
95
+
96
+ const breakpoint = Grid.useBreakpoint();
97
+ const { listUrl } = useNavigation();
98
+
99
+ const isMobile = typeof breakpoint.lg === "undefined" ? false : !breakpoint.lg;
100
+
101
+ const renderTreeView = useCallback(
102
+ (tree: ITreeMenu[], currentSelectedKey?: string): MenuProps["items"] => {
103
+ return tree
104
+ .map((item: ITreeMenu) => {
105
+ const { key, name, children, meta = {}, list } = item;
106
+ const { icon, parent: parentName } = meta;
107
+
108
+ const route = typeof list === "string" ? list : listUrl(name);
109
+
110
+ if (children.length > 0) {
111
+ return {
112
+ key: item.key || Math.random().toString(),
113
+ label: getMenuLabel(name, meta, currentLocale),
114
+ icon: icon ?? <UnorderedListOutlined />,
115
+ children: renderTreeView(children, currentSelectedKey),
116
+ };
117
+ }
119
118
 
120
- const logout = isExistAuthentication && (
121
- <Menu.Item key="logout" onClick={handleLogout} icon={<LogoutOutlined />}>
122
- {translate("buttons.logout", "Logout")}
123
- </Menu.Item>
119
+ const menuItemKey = item.key || Math.random().toString();
120
+ const isSelected = menuItemKey === currentSelectedKey;
121
+ const isRoute = !(
122
+ pickNotDeprecated(meta?.parent, meta?.parent, parentName) !== undefined &&
123
+ children.length === 0
124
+ );
125
+
126
+ return {
127
+ key: menuItemKey,
128
+ label: (
129
+ <>
130
+ <Link to={route ?? ""}>{getMenuLabel(name, meta, currentLocale)}</Link>
131
+ {!siderCollapsed && isSelected && <div className="ant-menu-tree-arrow" />}
132
+ </>
133
+ ),
134
+ icon: icon ?? (isRoute && <UnorderedListOutlined />),
135
+ };
136
+ })
137
+ .filter(Boolean);
138
+ },
139
+ [listUrl, Link, siderCollapsed, currentLocale],
124
140
  );
125
141
 
126
- const items = renderTreeView(menuItems, selectedKey);
142
+ const items = useMemo(() => {
143
+ return renderTreeView(menuItems, selectedKey)?.filter(Boolean);
144
+ }, [menuItems, selectedKey, renderTreeView]);
145
+
146
+ // Auto-redirect to first available menu item if current selectedKey is not in the menu
147
+ useEffect(() => {
148
+ if (reRouteNum > 5) return;
149
+
150
+ const isKeyInMenuItems = (menuItems: MenuProps["items"], key: string): boolean => {
151
+ if (!menuItems) return false;
152
+ for (const item of menuItems) {
153
+ if (!item) continue;
154
+ if (item.key === key) return true;
155
+ if ("children" in item && item.children) {
156
+ if (isKeyInMenuItems(item.children as MenuProps["items"], key)) return true;
157
+ }
158
+ }
159
+ return false;
160
+ };
161
+
162
+ // If selectedKey is in the menu, no need to redirect
163
+ if (selectedKey && isKeyInMenuItems(items, selectedKey)) {
164
+ return;
165
+ }
127
166
 
128
- const renderSider = () => {
129
- if (render) {
130
- return render({
131
- dashboard: null,
132
- items,
133
- logout,
134
- collapsed,
135
- });
167
+ // Skip auto-redirect for CRUD detail pages (edit/show/create)
168
+ // These pages are not in the menu but are valid navigation targets
169
+ if (selectedKey && (
170
+ selectedKey.includes('/edit/') ||
171
+ selectedKey.includes('/show/') ||
172
+ selectedKey.endsWith('/create')
173
+ )) {
174
+ return;
136
175
  }
176
+
177
+ const timer = setTimeout(() => {
178
+ reRouteNum++;
179
+
180
+ const firstKey = items?.[0]?.key;
181
+ if (firstKey && firstKey !== "/dashboard") {
182
+ setOpenKeys([String(firstKey)]);
183
+ const firstItem = items?.find(item => item?.key === firstKey) as any;
184
+ if (firstItem?.children?.length > 0) {
185
+ let childItem = firstItem?.children?.find(
186
+ (item: any) => selectedKey.indexOf(item?.key) !== -1,
187
+ );
188
+ if (!childItem) {
189
+ childItem = firstItem?.children?.[0];
190
+ }
191
+ const childKey = childItem?.key;
192
+ if (childItem?.children?.length > 0) {
193
+ setOpenKeys([String(firstKey), String(childKey)]);
194
+ const grandsonItem = childItem?.children?.find(
195
+ (item: any) => selectedKey.indexOf(item?.key) !== -1,
196
+ );
197
+ const grandsonKey = grandsonItem?.key || firstItem?.children?.[0]?.children?.[0]?.key;
198
+ go({ to: grandsonKey, type: "replace" });
199
+ } else {
200
+ go({ to: childKey, type: "replace" });
201
+ }
202
+ } else {
203
+ go({ to: String(firstKey), type: "replace" });
204
+ }
205
+ }
206
+ }, 300);
207
+
208
+ return () => clearTimeout(timer);
209
+ }, [items, selectedKey, go]);
210
+
211
+ const handleOpenChange = useCallback(
212
+ (keys: string[]) => {
213
+ const latestOpenKey = keys.find(key => !openKeys.includes(key));
214
+
215
+ if (latestOpenKey) {
216
+ const parentKeys = getParentKeysFromMenuTree(menuItems, latestOpenKey) || [];
217
+ setOpenKeys([...parentKeys, latestOpenKey]);
218
+ } else {
219
+ setOpenKeys(keys);
220
+ }
221
+ },
222
+ [openKeys, menuItems],
223
+ );
224
+
225
+ const handleMenuClick = useCallback(
226
+ ({ key }: { key: string }) => {
227
+ const clickedItem = menuItems.find(item => item.key === key);
228
+ if (clickedItem && clickedItem.children.length === 0) {
229
+ setOpenKeys([]);
230
+ }
231
+ setMobileSiderOpen(false);
232
+ },
233
+ [menuItems, setMobileSiderOpen],
234
+ );
235
+
236
+ const renderMenu = useCallback(() => {
237
+ return (
238
+ <Menu
239
+ selectedKeys={selectedKey ? [selectedKey] : []}
240
+ defaultOpenKeys={defaultOpenKeys}
241
+ openKeys={openKeys}
242
+ onOpenChange={handleOpenChange}
243
+ mode="inline"
244
+ items={items}
245
+ style={{
246
+ paddingTop: "8px",
247
+ border: "none",
248
+ overflow: "auto",
249
+ height: "calc(100% - 72px)",
250
+ background: "transparent",
251
+ }}
252
+ onClick={handleMenuClick}
253
+ ></Menu>
254
+ );
255
+ }, [selectedKey, defaultOpenKeys, openKeys, handleOpenChange, items, handleMenuClick]);
256
+
257
+ const renderDrawerSider = () => {
137
258
  return (
138
259
  <>
139
- {items}
260
+ <Drawer
261
+ open={mobileSiderOpen}
262
+ onClose={() => setMobileSiderOpen(false)}
263
+ placement="left"
264
+ closable={false}
265
+ width={256}
266
+ styles={{
267
+ body: {
268
+ padding: 0,
269
+ },
270
+ }}
271
+ maskClosable={true}
272
+ >
273
+ <Layout>
274
+ <Layout.Sider
275
+ width={500}
276
+ style={{
277
+ height: "100vh",
278
+ backgroundColor: token.colorBgContainer,
279
+ borderRight: `1px solid ${token.colorBorderBg}`,
280
+ }}
281
+ >
282
+ <div
283
+ style={{
284
+ width: "256px",
285
+ padding: "0 16px",
286
+ display: "flex",
287
+ justifyContent: "flex-start",
288
+ alignItems: "center",
289
+ height: "64px",
290
+ backgroundColor: token.colorBgElevated,
291
+ borderBottom: "none",
292
+ }}
293
+ >
294
+ <Title collapsed={false} />
295
+ </div>
296
+ {renderMenu()}
297
+ </Layout.Sider>
298
+ </Layout>
299
+ </Drawer>
300
+ <Button
301
+ style={drawerButtonStyles}
302
+ size="large"
303
+ onClick={() => setMobileSiderOpen(true)}
304
+ icon={<BarsOutlined />}
305
+ />
140
306
  </>
141
307
  );
142
308
  };
143
309
 
144
- const siderStyle = isMobile ? antLayoutSiderMobile : antLayoutSider;
310
+ if (isMobile) {
311
+ return renderDrawerSider();
312
+ }
313
+
314
+ const siderStyles: React.CSSProperties = {
315
+ backgroundColor: token.colorBgContainer,
316
+ borderRight: `1px solid ${token.colorBorderBg}`,
317
+ position: "sticky",
318
+ top: 0,
319
+ left: 0,
320
+ height: "100vh",
321
+ zIndex: 999,
322
+ };
145
323
 
146
324
  return (
147
- <AntdLayout.Sider
148
- collapsible
149
- collapsedWidth={isMobile ? 0 : 80}
150
- collapsed={collapsed}
151
- breakpoint="lg"
152
- onCollapse={(collapsed: boolean): void => setCollapsed(collapsed)}
153
- style={{
154
- ...siderStyle,
155
- backgroundColor: token.colorBgContainer,
156
- borderRight: `1px solid ${token.colorBgElevated}`,
157
- }}
158
- trigger={
159
- !isMobile && (
325
+ <>
326
+ <Layout.Sider
327
+ style={siderStyles}
328
+ width={256}
329
+ collapsible
330
+ collapsed={siderCollapsed}
331
+ onCollapse={(collapsed, type) => {
332
+ if (type === "clickTrigger") {
333
+ setSiderCollapsed(collapsed);
334
+ }
335
+ }}
336
+ collapsedWidth={80}
337
+ breakpoint="lg"
338
+ trigger={
160
339
  <Button
161
340
  type="text"
162
341
  style={{
@@ -164,9 +343,10 @@ export const CustomSider: typeof Sider = ({ render }) => {
164
343
  height: "100%",
165
344
  width: "100%",
166
345
  backgroundColor: token.colorBgElevated,
346
+ borderRight: `1px solid ${token.colorBorderBg}`,
167
347
  }}
168
348
  >
169
- {collapsed ? (
349
+ {siderCollapsed ? (
170
350
  <RightOutlined
171
351
  style={{
172
352
  color: token.colorPrimary,
@@ -180,39 +360,24 @@ export const CustomSider: typeof Sider = ({ render }) => {
180
360
  />
181
361
  )}
182
362
  </Button>
183
- )
184
- }
185
- >
186
- <div
187
- style={{
188
- width: collapsed ? "80px" : "200px",
189
- padding: collapsed ? "0" : "0 16px",
190
- display: "flex",
191
- justifyContent: collapsed ? "center" : "flex-start",
192
- alignItems: "center",
193
- height: "64px",
194
- backgroundColor: token.colorBgElevated,
195
- fontSize: "14px",
196
- }}
363
+ }
197
364
  >
198
- <ThemedTitle collapsed={collapsed} text='Opinions admin'/>
199
- </div>
200
- <Menu
201
- defaultOpenKeys={defaultOpenKeys}
202
- selectedKeys={[selectedKey]}
203
- mode="inline"
204
- style={{
205
- marginTop: "8px",
206
- border: "none",
207
- }}
208
- onClick={() => {
209
- if (!breakpoint.lg) {
210
- setCollapsed(true);
211
- }
212
- }}
213
- >
214
- {renderSider()}
215
- </Menu>
216
- </AntdLayout.Sider>
365
+ <div
366
+ style={{
367
+ width: siderCollapsed ? "80px" : "256px",
368
+ padding: siderCollapsed ? "0" : "0 16px",
369
+ display: "flex",
370
+ justifyContent: siderCollapsed ? "center" : "flex-start",
371
+ alignItems: "center",
372
+ height: "64px",
373
+ backgroundColor: token.colorBgElevated,
374
+ fontSize: "14px",
375
+ }}
376
+ >
377
+ <Title collapsed={siderCollapsed} />
378
+ </div>
379
+ {renderMenu()}
380
+ </Layout.Sider>
381
+ </>
217
382
  );
218
383
  };
@@ -0,0 +1,61 @@
1
+ import React from "react";
2
+
3
+ import type { RefineLayoutThemedTitleProps } from "@refinedev/antd";
4
+ import { useLink } from "@refinedev/core";
5
+
6
+ import { Space, theme, Typography } from "antd";
7
+
8
+ import { Logo } from "./logo";
9
+
10
+ const { useToken } = theme;
11
+
12
+ const name = "Opinions admin";
13
+
14
+ export const Title: React.FC<RefineLayoutThemedTitleProps> = ({
15
+ collapsed,
16
+ wrapperStyles,
17
+ }) => {
18
+ const { token } = useToken();
19
+ const Link = useLink();
20
+
21
+ return (
22
+ <Link
23
+ to="/"
24
+ style={{
25
+ display: "inline-block",
26
+ textDecoration: "none",
27
+ }}
28
+ >
29
+ <Space
30
+ style={{
31
+ display: "flex",
32
+ alignItems: "center",
33
+ fontSize: "inherit",
34
+ ...wrapperStyles,
35
+ }}
36
+ >
37
+ <div
38
+ style={{
39
+ height: "24px",
40
+ width: "24px",
41
+ color: token.colorPrimary,
42
+ }}
43
+ >
44
+ <Logo />
45
+ </div>
46
+
47
+ {!collapsed && (
48
+ <Typography.Title
49
+ style={{
50
+ fontSize: "inherit",
51
+ marginBottom: 0,
52
+ fontWeight: 700,
53
+ }}
54
+ >
55
+ {name}
56
+ </Typography.Title>
57
+ )}
58
+ </Space>
59
+ </Link>
60
+ );
61
+ };
@@ -0,0 +1,21 @@
1
+ import React from "react";
2
+
3
+ type PaginationTotalProps = {
4
+ total: number;
5
+ entityName: string;
6
+ };
7
+
8
+ export const PaginationTotal: React.FC<PaginationTotalProps> = ({
9
+ total,
10
+ entityName,
11
+ }) => {
12
+ return (
13
+ <span
14
+ style={{
15
+ marginLeft: "16px",
16
+ }}
17
+ >
18
+ <span className="ant-text secondary">{total}</span> {entityName} in total
19
+ </span>
20
+ );
21
+ };
@@ -0,0 +1,44 @@
1
+ import React from "react";
2
+
3
+ import { Tag } from "antd";
4
+
5
+ // Color mapping for different roles
6
+ const roleColorMap: Record<string, string> = {
7
+ OFFICE: "green",
8
+ CES: "blue",
9
+ INFRA: "purple",
10
+ FIT: "green",
11
+ SECURITY: "green",
12
+ COST: "gold",
13
+ HR: "orange",
14
+ HR_AMER: "coral",
15
+ HR_APAC: "khaki",
16
+ HR_EMEA: "amber",
17
+ HR_MALAYSIA: "pink",
18
+ HR_SINGAPORE: "lightblue",
19
+ OMC: "magenta",
20
+ PRODUCT: "cyan",
21
+ SYSTEM_ADMIN: "red",
22
+ FEATURE_IOA_DEVICE_IP: "green",
23
+ BUSINESS_TRIP: "teal",
24
+ };
25
+
26
+ type Props = {
27
+ role: string;
28
+ };
29
+
30
+ export const RoleStatusTag: React.FC<Props> = ({ role }) => {
31
+ const color = roleColorMap[role] || "blue";
32
+
33
+ return (
34
+ <Tag
35
+ style={{
36
+ textTransform: "capitalize",
37
+ }}
38
+ color={color}
39
+ title={role}
40
+ >
41
+ {role.toLowerCase()}
42
+ </Tag>
43
+ );
44
+ };