@gadmin2n/schematics 0.0.69 → 0.0.70

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 (223) hide show
  1. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/canvas.prisma +45 -0
  2. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/example.prisma +24 -23
  3. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/system.prisma +93 -90
  4. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Audit.ts +70 -0
  5. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Event.ts +3 -3
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Page.ts +70 -0
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/PageResource.ts +70 -0
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Resource.ts +70 -0
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/RolePages.ts +70 -0
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/RoleResource.ts +70 -0
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/SavedQuery.ts +70 -0
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/User.ts +70 -0
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/readme.md +95 -2
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/server/.eslintrc.js +4 -2
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/server/.prettierignore +7 -1
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/server/config/index.ts +1 -3
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/server/gadmin-cli.json +1 -1
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +6 -5
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/lib/page-helpers.ts +157 -0
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/page-manage.ts +290 -0
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/permission-manage.ts +184 -0
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/prismaModels.ts +143 -0
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/sync-resources.ts +100 -0
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/syncDataMngtPages.ts +119 -0
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/index.ts +1 -3
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/permissions.ts +109 -143
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/main.ts +5 -2
  28. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.controller.spec.ts +20 -0
  29. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.controller.ts +81 -0
  30. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.dto.ts +49 -0
  31. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.module.ts +11 -0
  32. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.service.spec.ts +334 -0
  33. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.service.ts +249 -0
  34. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/index.ts +2 -1
  35. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.service.ts +2 -2
  36. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.service.ts +17 -4
  37. package/dist/lib/application/files/gadmin2-game-angle-demo/server/yarn.lock +7737 -0
  38. package/dist/lib/application/files/gadmin2-game-angle-demo/web/.env +1 -0
  39. package/dist/lib/application/files/gadmin2-game-angle-demo/web/.eslintrc.json +38 -0
  40. package/dist/lib/application/files/gadmin2-game-angle-demo/web/.prettierignore +2 -0
  41. package/dist/lib/application/files/gadmin2-game-angle-demo/web/dev-shell-entry.html +49 -0
  42. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +13 -2
  43. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/App.tsx +137 -111
  44. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/auditLogProvider.ts +46 -44
  45. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/authProvider.ts +32 -12
  46. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/BulkActions.tsx +74 -23
  47. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/ListPageHeader.tsx +9 -9
  48. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/RowActions.tsx +57 -31
  49. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/SearchBar.tsx +53 -24
  50. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/SqlModal.tsx +148 -72
  51. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/AgentContext.tsx +190 -16
  52. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/ElementInspector.tsx +914 -63
  53. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/agentAttributes.ts +17 -8
  54. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/index.ts +0 -10
  55. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/inspectorActions.ts +969 -46
  56. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/pagePathUtils.ts +66 -0
  57. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/promptGenerator.ts +85 -25
  58. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/propPatcher.ts +84 -0
  59. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/eventList/index.tsx +16 -20
  60. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/index.ts +4 -4
  61. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/logButton/index.tsx +13 -13
  62. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/logList/index.tsx +15 -16
  63. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/modalDiffViewer/index.tsx +15 -15
  64. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/index.tsx +2 -2
  65. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/BarChart/index.tsx +896 -0
  66. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/ChartSwitcher/index.tsx +219 -0
  67. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/ChartViewer/index.tsx +159 -0
  68. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Filter/index.tsx +192 -0
  69. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/LineChart/index.tsx +1034 -0
  70. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumCard/NumCard.module.css +8 -0
  71. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumCard/index.tsx +509 -0
  72. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumLineCard/index.tsx +66 -0
  73. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/PieChart/index.tsx +552 -0
  74. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/RadarChart/index.tsx +263 -0
  75. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Section/index.tsx +35 -0
  76. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Table/index.tsx +207 -0
  77. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/TreemapChart/index.tsx +382 -0
  78. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/WorldMap/index.tsx +135 -0
  79. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/chart-constants.ts +53 -0
  80. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/icon/InfoIcon.tsx +8 -0
  81. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/icon/index.ts +1 -0
  82. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/config.ts +31 -0
  83. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/nameMap.json +9 -0
  84. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/world.geo.json +39349 -0
  85. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/metric-info-tooltip/index.tsx +19 -0
  86. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/business/index.tsx +12 -12
  87. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/index.tsx +22 -26
  88. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/custom-avatar.tsx +13 -9
  89. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/index.ts +4 -4
  90. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/header.tsx +22 -37
  91. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/index.ts +4 -4
  92. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/layout.tsx +10 -10
  93. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/logo.tsx +1 -1
  94. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/sider.tsx +113 -65
  95. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/title.tsx +14 -14
  96. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/offLayoutArea/index.tsx +1 -1
  97. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/pagination-total.tsx +2 -2
  98. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/tags/index.ts +1 -1
  99. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/tags/role-tag.tsx +21 -21
  100. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/text.tsx +17 -13
  101. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/http.ts +26 -5
  102. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +221 -51
  103. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +3 -3
  104. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddDataModal.tsx +199 -0
  105. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddPageModal.tsx +335 -0
  106. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DeleteDataConfirm.tsx +56 -0
  107. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +401 -0
  108. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/EditDataModal.tsx +129 -0
  109. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/SkillMenu.tsx +202 -0
  110. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/UndoConfirm.tsx +36 -0
  111. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/index.tsx +8 -0
  112. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/style.css +835 -0
  113. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/enums/audit-log.enum.ts +8 -8
  114. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/enums/index.ts +1 -1
  115. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/form.tsx +120 -70
  116. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/get-name-initials.ts +3 -3
  117. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/get-random-color.ts +11 -11
  118. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/http.ts +16 -19
  119. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/index.tsx +1 -1
  120. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/list.tsx +99 -73
  121. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/login.ts +22 -27
  122. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/page-tree.ts +74 -0
  123. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/show.tsx +95 -51
  124. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/utils.tsx +7 -3
  125. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/types.ts +15 -15
  126. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useBatchDelete.ts +10 -10
  127. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useBatchOperations.ts +8 -7
  128. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useBatchOperationsCore.ts +10 -10
  129. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useBatchUpdate.ts +10 -10
  130. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +36 -27
  131. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useECharts.tsx +144 -0
  132. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useFetchData.ts +4 -4
  133. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useListPageState.ts +34 -34
  134. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useRoles.ts +8 -4
  135. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useRowSelection.ts +1 -1
  136. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useUserPageAccess.ts +55 -41
  137. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/i18n.ts +8 -8
  138. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/index.tsx +9 -2
  139. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +193 -0
  140. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +194 -0
  141. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/plugins/devShellPlugin.ts +81 -0
  142. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.tsx +37 -37
  143. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/create.tsx +23 -31
  144. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/edit.tsx +34 -35
  145. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.ts +1 -1
  146. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.tsx +4 -6
  147. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/list.tsx +41 -34
  148. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/show.tsx +33 -20
  149. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasCell.tsx +87 -0
  150. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasEditPage.tsx +192 -0
  151. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +409 -0
  152. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasPage.tsx +1372 -0
  153. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasToolbar.tsx +384 -0
  154. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CodeFloatWindow.tsx +476 -0
  155. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/ComponentThumbnail.tsx +135 -0
  156. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/IsolatedLivePreview.tsx +101 -0
  157. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/LivePreview.tsx +236 -0
  158. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/PublishModal.tsx +200 -0
  159. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasApi.ts +92 -0
  160. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasConfigRegistry.tsx +25 -0
  161. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasContextMenuRegistry.tsx +875 -0
  162. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasDefaults.ts +126 -0
  163. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasI18n.ts +11 -0
  164. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/BarChartDataSourceModal.tsx +115 -0
  165. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/ChartViewerConfigModal.tsx +217 -0
  166. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/LineChartDataSourceModal.tsx +153 -0
  167. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/NumCardDataSourceModal.tsx +211 -0
  168. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/PromptModal.tsx +90 -0
  169. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/RadarChartDataSourceModal.tsx +87 -0
  170. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/TableDataSourceModal.tsx +204 -0
  171. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/demos.ts +1153 -0
  172. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/index.tsx +2 -0
  173. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/sectionCompactor.ts +45 -0
  174. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/types.ts +45 -0
  175. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas-page/index.tsx +108 -0
  176. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/create.tsx +105 -0
  177. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/edit.tsx +121 -0
  178. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/index.tsx +4 -0
  179. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/list.tsx +237 -0
  180. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/show.tsx +74 -0
  181. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/AssignRolesModal.tsx +29 -20
  182. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/CreatePageModal.tsx +3 -3
  183. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/EditPageModal.tsx +7 -3
  184. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/PageDetailDrawer.tsx +58 -23
  185. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/PageFormModal.tsx +206 -122
  186. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/hooks/usePageManagement.ts +8 -4
  187. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/index.ts +1 -1
  188. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/list.tsx +345 -190
  189. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/types.ts +1 -1
  190. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/permissionReadme/index.tsx +341 -340
  191. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/CreateModal.tsx +2 -2
  192. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/EditModal.tsx +2 -2
  193. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/ResourceDetailDrawer.tsx +41 -24
  194. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/modal.tsx +64 -36
  195. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/index.ts +2 -2
  196. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/list.tsx +78 -40
  197. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/CreateModal.tsx +3 -3
  198. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/EditModal.tsx +4 -4
  199. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/RoleDetailDrawer.tsx +19 -9
  200. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/modal.tsx +45 -47
  201. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/hooks/useRolePage.ts +4 -4
  202. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/index.ts +1 -1
  203. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/list.tsx +121 -147
  204. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/types.ts +1 -1
  205. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/create-modal.tsx +2 -2
  206. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/edit-modal.tsx +2 -2
  207. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/form-modal.tsx +25 -19
  208. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/index.ts +5 -5
  209. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/role-tag.tsx +10 -10
  210. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/show-drawer.tsx +31 -26
  211. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/index.ts +1 -1
  212. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/list.tsx +76 -71
  213. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/setupTests.ts +1 -1
  214. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/audit-log.ts +1 -1
  215. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/index.ts +3 -3
  216. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/role.ts +1 -1
  217. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/user.ts +1 -1
  218. package/dist/lib/application/files/gadmin2-game-angle-demo/web/vite.config.ts +42 -25
  219. package/dist/lib/application/files/gadmin2-game-angle-demo/web/yarn.lock +1193 -32
  220. package/package.json +1 -1
  221. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/seedDataMngtPages.ts +0 -258
  222. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/AgentPanel.tsx +0 -497
  223. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/skills.ts +0 -464
@@ -4,7 +4,7 @@ import {
4
4
  I18N_T,
5
5
  ModelsFieldsTypeMap,
6
6
  convertPrismaDecimal,
7
- } from "@gadmin2n/react-common";
7
+ } from '@gadmin2n/react-common';
8
8
  import {
9
9
  TextField,
10
10
  DateField,
@@ -17,10 +17,10 @@ import {
17
17
  UrlField,
18
18
  ShowButton,
19
19
  TagField,
20
- } from "@refinedev/antd";
21
- import { CheckCircleTwoTone, CloseCircleTwoTone } from "@ant-design/icons";
22
- import { FilterDropdownProps } from "antd/lib/table/interface";
23
- import { Select, Table, Space, SelectProps } from "antd";
20
+ } from '@refinedev/antd';
21
+ import { CheckCircleTwoTone, CloseCircleTwoTone } from '@ant-design/icons';
22
+ import { FilterDropdownProps } from 'antd/lib/table/interface';
23
+ import { Select, Table, Space, SelectProps } from 'antd';
24
24
  import {
25
25
  CrudSorting,
26
26
  CrudFilters,
@@ -28,10 +28,10 @@ import {
28
28
  getDefaultSortOrder,
29
29
  getDefaultFilter,
30
30
  stringifyTableParams,
31
- } from "@refinedev/core";
32
- import { DefaultOptionType } from "antd/es/select";
33
- import { ModelConfig } from "generated/types/config.types";
34
- import { agentAttrs } from "../components/agentPanel/agentAttributes";
31
+ } from '@refinedev/core';
32
+ import { DefaultOptionType } from 'antd/es/select';
33
+ import { ModelConfig } from 'generated/types/config.types';
34
+ import { agentAttrs } from '../components/agentPanel/agentAttributes';
35
35
  import dayjs from 'dayjs';
36
36
 
37
37
  export function getTableParams(filters: Record<string, string> = {}) {
@@ -40,7 +40,7 @@ export function getTableParams(filters: Record<string, string> = {}) {
40
40
  sorters: [],
41
41
  filters: Object.entries(filters).map(([field, value]) => ({
42
42
  field,
43
- operator: "eq",
43
+ operator: 'eq',
44
44
  value: encodeURIComponent(value),
45
45
  })),
46
46
  });
@@ -55,7 +55,7 @@ export interface TableColumnContext {
55
55
  model: ModelType;
56
56
  modelsEnum: Record<string, Record<string, string>>;
57
57
  modelsMap: ModelsFieldsTypeMap;
58
- tableConfig: ModelConfig["table"];
58
+ tableConfig: ModelConfig['table'];
59
59
  sorter: CrudSorting | undefined;
60
60
  filters: CrudFilters | undefined;
61
61
  relationSelectProps: Record<
@@ -83,13 +83,13 @@ export function getTableColumn(
83
83
  model: ModelType,
84
84
  modelsEnum: Record<string, Record<string, string>>,
85
85
  modelsMap: ModelsFieldsTypeMap,
86
- tableConfig: ModelConfig["table"],
86
+ tableConfig: ModelConfig['table'],
87
87
  sorter: CrudSorting | undefined,
88
88
  filters: CrudFilters | undefined,
89
89
  relationSelectProps: Record<
90
90
  string,
91
91
  SelectProps<{ value: string; label: string }, DefaultOptionType>
92
- >
92
+ >,
93
93
  ) {
94
94
  return getTableColumnV2({
95
95
  col,
@@ -126,19 +126,19 @@ export function getTableColumnV2({ col, context }: GetTableColumnParams) {
126
126
  const { type: fieldType, args } = col.uiType.formItem;
127
127
  const fieldName = col.name;
128
128
  const props: any = {
129
- dataIndex: fieldName.includes(".") ? fieldName.split(".") : fieldName,
129
+ dataIndex: fieldName.includes('.') ? fieldName.split('.') : fieldName,
130
130
  key: fieldName,
131
131
  title: t(`resources.${resourceName}.fields.${fieldName}`, fieldName),
132
132
  render: (value: any) => <TextField value={value} />,
133
133
  };
134
134
 
135
- if (col.kind === "object" && !col.isList && !fieldName.includes(".")) {
136
- const entityName = model[fieldName]?.type || "";
137
- props.dataIndex = [fieldName, "id"];
135
+ if (col.kind === 'object' && !col.isList && !fieldName.includes('.')) {
136
+ const entityName = model[fieldName]?.type || '';
137
+ props.dataIndex = [fieldName, 'id'];
138
138
  props.key = `${fieldName}.id`;
139
139
  props.title = t(
140
140
  `resources.${resourceName}.fields.${fieldName}`,
141
- t(`resources.${entityName.toLowerCase()}.name`, entityName)
141
+ t(`resources.${entityName.toLowerCase()}.name`, entityName),
142
142
  );
143
143
  props.render = (_: any, record: any) =>
144
144
  record?.[fieldName]?.id !== undefined ? (
@@ -149,43 +149,47 @@ export function getTableColumnV2({ col, context }: GetTableColumnParams) {
149
149
  resource={entityName.toLowerCase()}
150
150
  recordItemId={record[fieldName].id}
151
151
  >
152
- {record[fieldName][modelsMap[entityName]?.meta?.nameKeys?.[0] || "id"]}
152
+ {
153
+ record[fieldName][
154
+ modelsMap[entityName]?.meta?.nameKeys?.[0] || 'id'
155
+ ]
156
+ }
153
157
  </ShowButton>
154
158
  ) : null;
155
- } else if (fieldName.startsWith("_count.")) {
156
- const entityName = model[fieldName.split(".")[1]]?.type || "";
159
+ } else if (fieldName.startsWith('_count.')) {
160
+ const entityName = model[fieldName.split('.')[1]]?.type || '';
157
161
  props.title = t(
158
162
  `resources.${resourceName}.fields.${fieldName}`,
159
- "Count " + t(`resources.${entityName.toLowerCase()}.name`, entityName)
163
+ 'Count ' + t(`resources.${entityName.toLowerCase()}.name`, entityName),
160
164
  );
161
- } else if (fieldType === "DateTime") {
165
+ } else if (fieldType === 'DateTime') {
162
166
  props.render = (value: any) => {
163
167
  return <DateField value={value} format="YYYY-MM-DD HH:mm:ss" />;
164
168
  };
165
- } else if (["Int", "BigInt", "Float", "Decimal"].includes(fieldType)) {
169
+ } else if (['Int', 'BigInt', 'Float', 'Decimal'].includes(fieldType)) {
166
170
  props.render = (value: any) => {
167
171
  // Handle Prisma Decimal objects (which have {s, e, d} keys from decimal.js)
168
172
  const displayValue = convertPrismaDecimal(value);
169
173
  if (
170
- fieldName !== "id" &&
174
+ fieldName !== 'id' &&
171
175
  displayValue !== undefined &&
172
176
  displayValue !== null &&
173
177
  !isNaN(Number(displayValue))
174
178
  ) {
175
- return <NumberField value={displayValue ?? ""} />;
179
+ return <NumberField value={displayValue ?? ''} />;
176
180
  } else {
177
181
  return <TextField value={displayValue} />;
178
182
  }
179
183
  };
180
- } else if (fieldType === "Url") {
184
+ } else if (fieldType === 'Url') {
181
185
  props.render = (value: any) => {
182
186
  return <UrlField value={value} />;
183
187
  };
184
- } else if (fieldType === "Email") {
188
+ } else if (fieldType === 'Email') {
185
189
  props.render = (value: any) => {
186
190
  return <EmailField value={value} />;
187
191
  };
188
- } else if (fieldType === "Boolean") {
192
+ } else if (fieldType === 'Boolean') {
189
193
  props.render = (value: any) => {
190
194
  return (
191
195
  <BooleanField
@@ -195,44 +199,44 @@ export function getTableColumnV2({ col, context }: GetTableColumnParams) {
195
199
  />
196
200
  );
197
201
  };
198
- } else if (fieldType === "Radio" || col.kind === "enum") {
202
+ } else if (fieldType === 'Radio' || col.kind === 'enum') {
199
203
  props.render = (value: any) => {
200
204
  return (
201
205
  <TagField
202
206
  value={t(
203
207
  `resources.${resourceName}.enums.${fieldName}.${value}`,
204
- String(value)
208
+ String(value),
205
209
  )}
206
210
  />
207
211
  );
208
212
  };
209
- } else if (fieldType === "CheckBox") {
213
+ } else if (fieldType === 'CheckBox') {
210
214
  props.render = (value: any) => {
211
215
  return (
212
216
  <Space>
213
- {JSON.parse(value || "[]")?.map?.((v: string, index: number) => (
217
+ {JSON.parse(value || '[]')?.map?.((v: string, index: number) => (
214
218
  <TagField
215
219
  key={index}
216
220
  value={t(
217
221
  `resources.${resourceName}.enums.${fieldName}.${v}`,
218
- String(v)
222
+ String(v),
219
223
  )}
220
224
  />
221
225
  ))}
222
226
  </Space>
223
227
  );
224
228
  };
225
- } else if (fieldType === "Select") {
226
- if (["multiple", "tags"].includes((args as any).mode)) {
229
+ } else if (fieldType === 'Select') {
230
+ if (['multiple', 'tags'].includes((args as any).mode)) {
227
231
  props.render = (value: any) => {
228
232
  return (
229
233
  <Space>
230
- {JSON.parse(value || "[]")?.map?.((v: string, index: number) => (
234
+ {JSON.parse(value || '[]')?.map?.((v: string, index: number) => (
231
235
  <TagField
232
236
  key={index}
233
237
  value={t(
234
238
  `resources.${resourceName}.enums.${fieldName}.${v}`,
235
- String(v)
239
+ String(v),
236
240
  )}
237
241
  />
238
242
  ))}
@@ -245,17 +249,17 @@ export function getTableColumnV2({ col, context }: GetTableColumnParams) {
245
249
  <TagField
246
250
  value={t(
247
251
  `resources.${resourceName}.enums.${fieldName}.${value}`,
248
- String(value)
252
+ String(value),
249
253
  )}
250
254
  />
251
255
  );
252
256
  };
253
257
  }
254
- } else if (fieldType === "Image") {
258
+ } else if (fieldType === 'Image') {
255
259
  props.render = (value: any) => {
256
260
  return (
257
261
  <Space wrap>
258
- {JSON.parse(value || "[]")?.map?.((img: any) => (
262
+ {JSON.parse(value || '[]')?.map?.((img: any) => (
259
263
  <ImageField
260
264
  key={img?.response?.name}
261
265
  value={img?.thumbUrl}
@@ -266,11 +270,11 @@ export function getTableColumnV2({ col, context }: GetTableColumnParams) {
266
270
  </Space>
267
271
  );
268
272
  };
269
- } else if (fieldType === "File") {
273
+ } else if (fieldType === 'File') {
270
274
  props.render = (value: any) => {
271
275
  return (
272
276
  <Space wrap>
273
- {JSON.parse((value as any) || "[]")?.map?.((file: any) => (
277
+ {JSON.parse((value as any) || '[]')?.map?.((file: any) => (
274
278
  <FileField
275
279
  key={file?.response?.name}
276
280
  src={file?.thumbUrl}
@@ -292,11 +296,11 @@ export function getTableColumnV2({ col, context }: GetTableColumnParams) {
292
296
  const { type: fieldType, args } = col.uiType.formItem;
293
297
 
294
298
  if (
295
- field.kind === "enum" ||
296
- ["Radio", "Select", "CheckBox"].includes(fieldType)
299
+ field.kind === 'enum' ||
300
+ ['Radio', 'Select', 'CheckBox'].includes(fieldType)
297
301
  ) {
298
302
  let options = {};
299
- if (field.kind === "enum") {
303
+ if (field.kind === 'enum') {
300
304
  options = (modelsEnum as any)[field.type];
301
305
  } else {
302
306
  options = (args as any).options.reduce(
@@ -304,7 +308,7 @@ export function getTableColumnV2({ col, context }: GetTableColumnParams) {
304
308
  acc[cur] = cur;
305
309
  return acc;
306
310
  },
307
- {}
311
+ {},
308
312
  );
309
313
  }
310
314
  props.filterDropdown = (p: FilterDropdownProps) => {
@@ -322,21 +326,21 @@ export function getTableColumnV2({ col, context }: GetTableColumnParams) {
322
326
  mode="multiple"
323
327
  placeholder={t(
324
328
  `resources.${resourceName}.filters.${fieldName}`,
325
- "Select value"
329
+ 'Select value',
326
330
  )}
327
331
  options={Object.entries(options).map(([k, v]) => ({
328
332
  value: v,
329
333
  label: t(
330
334
  `resources.${resourceName}.enums.${fieldName}.${k}`,
331
- String(k)
335
+ String(k),
332
336
  ),
333
337
  }))}
334
338
  />
335
339
  </FilterDropdown>
336
340
  );
337
341
  };
338
- props.defaultFilteredValue = getDefaultFilter(fieldName, filters, "in");
339
- } else if (field.kind === "object") {
342
+ props.defaultFilteredValue = getDefaultFilter(fieldName, filters, 'in');
343
+ } else if (field.kind === 'object') {
340
344
  props.filterDropdown = (p: FilterDropdownProps) => {
341
345
  const { setSelectedKeys, confirm } = p;
342
346
  return (
@@ -355,7 +359,7 @@ export function getTableColumnV2({ col, context }: GetTableColumnParams) {
355
359
  mode="multiple"
356
360
  placeholder={t(
357
361
  `resources.${field.type.toLowerCase()}.name`,
358
- String(field.type)
362
+ String(field.type),
359
363
  )}
360
364
  {...relationSelectProps[field.name]}
361
365
  />
@@ -365,13 +369,13 @@ export function getTableColumnV2({ col, context }: GetTableColumnParams) {
365
369
  props.defaultFilteredValue = getDefaultFilter(
366
370
  `${field.name}.id`,
367
371
  filters,
368
- "in"
372
+ 'in',
369
373
  );
370
374
  }
371
375
  }
372
376
 
373
377
  const agentHeaderAttrs = agentAttrs({
374
- type: 'table-column',
378
+ type: 'list-column',
375
379
  field: fieldName,
376
380
  resource: resourceName,
377
381
  meta: {
@@ -381,27 +385,29 @@ export function getTableColumnV2({ col, context }: GetTableColumnParams) {
381
385
  },
382
386
  });
383
387
 
388
+ const { key: colKey, ...restProps } = props;
389
+
384
390
  return (
385
391
  <Table.Column
386
- {...props}
392
+ key={colKey}
393
+ {...restProps}
387
394
  {...col}
388
395
  onHeaderCell={() => agentHeaderAttrs}
389
396
  />
390
397
  );
391
398
  }
392
399
 
393
-
394
400
  interface SearchFormOptions {
395
401
  /** 日期字段名,设为 null 则不使用日期筛选,默认 'createdAt' */
396
402
  dateField?: string | null;
397
403
  }
398
404
 
399
- /**
400
- * 从 parsedFilters 生成搜索表单的 initialValues
405
+ /**
406
+ * 从 parsedFilters 生成搜索表单的 initialValues
401
407
  */
402
408
  export function getSearchFormInitialValues(
403
409
  parsedFilters: any[],
404
- options: SearchFormOptions = {}
410
+ options: SearchFormOptions = {},
405
411
  ) {
406
412
  const { dateField = 'createdAt' } = options;
407
413
 
@@ -409,30 +415,38 @@ export function getSearchFormInitialValues(
409
415
  q: parsedFilters.find((f: any) => f.field === 'q')?.value,
410
416
  };
411
417
 
412
- // 仅当 dateField 存在时才处理日期筛选
418
+ // 仅当 dateField 存在时才处理日期筛选
413
419
  if (dateField) {
414
420
  const hasDateFilter = parsedFilters.find(
415
- (f: any) => f.field === dateField && f.operator === 'gte'
421
+ (f: any) => f.field === dateField && f.operator === 'gte',
416
422
  );
417
423
 
418
424
  initialValues[dateField] = hasDateFilter
419
425
  ? [
420
- dayjs(parsedFilters.find((f: any) => f.field === dateField && f.operator === 'gte')?.value),
421
- dayjs(parsedFilters.find((f: any) => f.field === dateField && f.operator === 'lte')?.value),
422
- ]
426
+ dayjs(
427
+ parsedFilters.find(
428
+ (f: any) => f.field === dateField && f.operator === 'gte',
429
+ )?.value,
430
+ ),
431
+ dayjs(
432
+ parsedFilters.find(
433
+ (f: any) => f.field === dateField && f.operator === 'lte',
434
+ )?.value,
435
+ ),
436
+ ]
423
437
  : [undefined, undefined];
424
438
  }
425
439
 
426
440
  return initialValues;
427
441
  }
428
442
 
429
- /**
430
- * 创建搜索表单的 onFinish 处理函数
443
+ /**
444
+ * 创建搜索表单的 onFinish 处理函数
431
445
  */
432
446
  export function createSearchFormOnFinish(
433
447
  setCurrent: (page: number) => void,
434
448
  setFilters: (fn: (prev: CrudFilters) => CrudFilters) => void,
435
- options: SearchFormOptions = {}
449
+ options: SearchFormOptions = {},
436
450
  ) {
437
451
  const { dateField = 'createdAt' } = options;
438
452
  const filterFields = dateField ? ['q', dateField] : ['q'];
@@ -441,25 +455,37 @@ export function createSearchFormOnFinish(
441
455
  const fs: CrudFilters = [];
442
456
  const trimedQ = (values.q || '').trim();
443
457
 
444
- // 处理日期筛选
458
+ // 处理日期筛选
445
459
  if (dateField) {
446
460
  const dateValue = values[dateField];
447
461
  if (dateValue && dateValue[0]) {
448
462
  fs.push(
449
- { field: dateField, operator: 'gte', value: dateValue[0]?.toISOString?.() },
450
- { field: dateField, operator: 'lte', value: dateValue[1]?.toISOString?.() }
463
+ {
464
+ field: dateField,
465
+ operator: 'gte',
466
+ value: dateValue[0]?.toISOString?.(),
467
+ },
468
+ {
469
+ field: dateField,
470
+ operator: 'lte',
471
+ value: dateValue[1]?.toISOString?.(),
472
+ },
451
473
  );
452
474
  }
453
475
  }
454
476
 
455
- // 处理关键词筛选
477
+ // 处理关键词筛选
456
478
  if (trimedQ) {
457
479
  fs.push({ field: 'q', operator: 'eq', value: trimedQ });
458
480
  }
459
481
 
460
482
  setCurrent(1);
461
483
  setFilters((prevFilters) =>
462
- unionFilters([], fs, prevFilters.filter((item: any) => !filterFields.includes(item.field)))
484
+ unionFilters(
485
+ [],
486
+ fs,
487
+ prevFilters.filter((item: any) => !filterFields.includes(item.field)),
488
+ ),
463
489
  );
464
490
  };
465
- }
491
+ }
@@ -1,15 +1,18 @@
1
- import Cookies from "js-cookie";
2
- import { getApiUrl } from "config/http";
1
+ import Cookies from 'js-cookie';
2
+ import { getApiUrl } from 'config/http';
3
3
 
4
- export const GAdminTokenName = "gadmin-token";
4
+ export const GAdminTokenName = 'gadmin-token';
5
5
 
6
6
  export function getUrlParams(search = window.location.search) {
7
- const hashes = search.slice(search.indexOf("?") + 1).split("&");
8
- return hashes.reduce((acc, hash) => {
9
- const [key, val] = hash.split("=");
10
- if (val) acc[key] = decodeURIComponent(val);
11
- return acc;
12
- }, {} as Record<string, string>);
7
+ const hashes = search.slice(search.indexOf('?') + 1).split('&');
8
+ return hashes.reduce(
9
+ (acc, hash) => {
10
+ const [key, val] = hash.split('=');
11
+ if (val) acc[key] = decodeURIComponent(val);
12
+ return acc;
13
+ },
14
+ {} as Record<string, string>,
15
+ );
13
16
  }
14
17
 
15
18
  type LoginCookie = {
@@ -19,15 +22,10 @@ type LoginCookie = {
19
22
  // ─── 认证 / 会话 ──────────────────────────────────────────────────────────────
20
23
 
21
24
  export function login() {
22
- // woa域名直接刷新页面
23
- if (window.location.hostname.endsWith(".woa.com")) {
24
- window.location.reload();
25
- return;
26
- }
27
25
  clearLoginCookie();
28
26
  const apiUrl = getApiUrl();
29
27
  window.location.href = `${apiUrl}/login?redirect_url=${encodeURIComponent(
30
- window.location.href
28
+ window.location.href,
31
29
  )}`;
32
30
  }
33
31
 
@@ -35,7 +33,7 @@ export function logout() {
35
33
  clearLoginCookie();
36
34
  const apiUrl = getApiUrl();
37
35
  window.location.href = `${apiUrl}/logout?redirect_url=${encodeURIComponent(
38
- window.location.origin
36
+ window.location.origin,
39
37
  )}`;
40
38
  }
41
39
 
@@ -43,14 +41,7 @@ export function logout() {
43
41
  * 通过cookie检测是否登录及参数转cookie(for dev)
44
42
  */
45
43
  export function checkLogin(): boolean {
46
- if (window.location.hostname.endsWith(".woa.com")) {
47
- return true;
48
- }
49
-
50
- if (Cookies.get(GAdminTokenName)) {
51
- return true;
52
- }
53
-
44
+ // 优先处理 URL 参数中的 token,确保 token 被写入 cookie(任何域名下都需要)
54
45
  const params = getUrlParams();
55
46
  const gadminToken = params[GAdminTokenName];
56
47
  if (gadminToken) {
@@ -58,6 +49,10 @@ export function checkLogin(): boolean {
58
49
  return true;
59
50
  }
60
51
 
52
+ if (Cookies.get(GAdminTokenName)) {
53
+ return true;
54
+ }
55
+
61
56
  return false;
62
57
  }
63
58
 
@@ -72,12 +67,12 @@ export function clearLoginCookie() {
72
67
 
73
68
  export function requestHeaders() {
74
69
  const gadminToken = Cookies.get(GAdminTokenName);
75
- const business = JSON.parse(Cookies.get("Business") || "{}");
70
+ const business = JSON.parse(Cookies.get('Business') || '{}');
76
71
  return {
77
- "X-Requested-With": "XMLHttpRequest",
72
+ 'X-Requested-With': 'XMLHttpRequest',
78
73
  // 防止 business.name 含中文等非 ASCII 字符导致 HTTP header 500
79
74
  ...(Object.keys(business).length > 0 && {
80
- "X-Gadmin-Business": JSON.stringify({
75
+ 'X-Gadmin-Business': JSON.stringify({
81
76
  ...business,
82
77
  name: encodeURIComponent(business.name),
83
78
  }),
@@ -0,0 +1,74 @@
1
+ export interface PageTreeNode {
2
+ title: string;
3
+ value: string;
4
+ key: string;
5
+ children?: PageTreeNode[];
6
+ }
7
+
8
+ interface RawPage {
9
+ id: number | string;
10
+ parentId?: number | string | null;
11
+ sortOrder?: number | null;
12
+ [key: string]: any;
13
+ }
14
+
15
+ /**
16
+ * 将平铺的 page 列表构建成 TreeSelect 所需的树结构。
17
+ *
18
+ * @param pages 后端返回的平铺 page 数组
19
+ * @param getTitle 从单条 page 记录提取显示文本的函数(支持多语言/自定义逻辑)
20
+ */
21
+ export function buildPageTree(
22
+ pages: RawPage[],
23
+ getTitle: (page: RawPage) => string,
24
+ ): PageTreeNode[] {
25
+ const nodeMap = new Map<
26
+ string,
27
+ { node: PageTreeNode; parentId: string | null; sortOrder: number | null }
28
+ >();
29
+
30
+ pages.forEach((page) => {
31
+ const id = String(page.id);
32
+ const parentId = page.parentId != null ? String(page.parentId) : null;
33
+ const sortOrder = page.sortOrder ?? null;
34
+ nodeMap.set(id, {
35
+ node: { title: getTitle(page), value: id, key: id, children: [] },
36
+ parentId,
37
+ sortOrder,
38
+ });
39
+ });
40
+
41
+ const roots: PageTreeNode[] = [];
42
+ nodeMap.forEach(({ node, parentId }) => {
43
+ if (parentId !== null && nodeMap.has(parentId)) {
44
+ nodeMap.get(parentId)!.node.children!.push(node);
45
+ } else {
46
+ roots.push(node);
47
+ }
48
+ });
49
+
50
+ const sortOrderMap = new Map<string, number | null>();
51
+ nodeMap.forEach(({ sortOrder }, id) => sortOrderMap.set(id, sortOrder));
52
+
53
+ const sortNodes = (nodes: PageTreeNode[]) => {
54
+ nodes.sort((a, b) => {
55
+ const orderA = sortOrderMap.get(a.key) ?? Infinity;
56
+ const orderB = sortOrderMap.get(b.key) ?? Infinity;
57
+ return (orderA as number) - (orderB as number);
58
+ });
59
+ nodes.forEach((n) => {
60
+ if (n.children?.length) sortNodes(n.children);
61
+ });
62
+ };
63
+
64
+ const pruneEmptyChildren = (nodes: PageTreeNode[]): PageTreeNode[] =>
65
+ nodes.map((n) => {
66
+ if (n.children?.length)
67
+ return { ...n, children: pruneEmptyChildren(n.children) };
68
+ const { children, ...rest } = n;
69
+ return rest as PageTreeNode;
70
+ });
71
+
72
+ sortNodes(roots);
73
+ return pruneEmptyChildren(roots);
74
+ }