@gadmin2n/schematics 0.0.68 → 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 +2 -2
  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
@@ -1,7 +1,23 @@
1
- import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
2
- import { DeleteButton, EditButton, useTable } from "@refinedev/antd";
3
- import { useGetIdentity } from "@refinedev/core";
4
- import { Table, Button, Space, Tooltip, Tag, Alert, Modal, message, Tabs } from "antd";
1
+ import React, {
2
+ useCallback,
3
+ useEffect,
4
+ useMemo,
5
+ useRef,
6
+ useState,
7
+ } from 'react';
8
+ import { DeleteButton, EditButton, useTable } from '@refinedev/antd';
9
+ import { useGetIdentity } from '@refinedev/core';
10
+ import {
11
+ Table,
12
+ Button,
13
+ Space,
14
+ Tooltip,
15
+ Tag,
16
+ Alert,
17
+ Modal,
18
+ message,
19
+ Tabs,
20
+ } from 'antd';
5
21
  import {
6
22
  SaveOutlined,
7
23
  UndoOutlined,
@@ -12,7 +28,7 @@ import {
12
28
  EyeOutlined,
13
29
  TeamOutlined,
14
30
  CodeOutlined,
15
- } from "@ant-design/icons";
31
+ } from '@ant-design/icons';
16
32
  import {
17
33
  DndContext,
18
34
  closestCenter,
@@ -22,32 +38,32 @@ import {
22
38
  useSensors,
23
39
  DragEndEvent,
24
40
  DragOverEvent,
25
- } from "@dnd-kit/core";
41
+ } from '@dnd-kit/core';
26
42
  import {
27
43
  SortableContext,
28
44
  arrayMove,
29
45
  sortableKeyboardCoordinates,
30
46
  useSortable,
31
47
  verticalListSortingStrategy,
32
- } from "@dnd-kit/sortable";
33
- import { CSS } from "@dnd-kit/utilities";
34
- import { restrictToVerticalAxis } from "@dnd-kit/modifiers";
48
+ } from '@dnd-kit/sortable';
49
+ import { CSS } from '@dnd-kit/utilities';
50
+ import { restrictToVerticalAxis } from '@dnd-kit/modifiers';
35
51
 
36
- import { customRequest } from "@/helpers/http";
52
+ import { customRequest } from '@/helpers/http';
37
53
 
38
- import { AssignRolesModal } from "./Components/AssignRolesModal";
39
- import { EditPageModal } from "./Components/EditPageModal";
40
- import { CreatePageModal } from "./Components/CreatePageModal";
41
- import { PageDetailDrawer } from "./Components/PageDetailDrawer";
54
+ import { AssignRolesModal } from './Components/AssignRolesModal';
55
+ import { EditPageModal } from './Components/EditPageModal';
56
+ import { CreatePageModal } from './Components/CreatePageModal';
57
+ import { PageDetailDrawer } from './Components/PageDetailDrawer';
42
58
  import type {
43
59
  PageMenuTreeNode,
44
60
  PageResourceAssignment,
45
61
  PageResourcePermissionSummary,
46
62
  ResourceDefinition,
47
- } from "./types";
48
- import { usePageManagement } from "./hooks/usePageManagement";
49
- import { useTranslation } from "react-i18next";
50
- import { SqlModal, generatePageSql } from "../../components/SqlModal";
63
+ } from './types';
64
+ import { usePageManagement } from './hooks/usePageManagement';
65
+ import { useTranslation } from 'react-i18next';
66
+ import { SqlModal, generatePageSql } from '../../components/SqlModal';
51
67
 
52
68
  const RESOURCE_NAME_DISPLAY_TRUNCATION_LIMIT = 40;
53
69
 
@@ -59,14 +75,14 @@ const updatePageOrder = async (
59
75
  pageId: number,
60
76
  updateData: { sortOrder?: number; parentId?: number | null },
61
77
  ): Promise<any> => {
62
- return customRequest(`page/updateUnique/${pageId}`, "PATCH", updateData);
78
+ return customRequest(`page/updateUnique/${pageId}`, 'PATCH', updateData);
63
79
  };
64
80
 
65
81
  const safelyConvertToNumber = (value: unknown): number | null => {
66
- if (typeof value === "number" && !Number.isNaN(value)) {
82
+ if (typeof value === 'number' && !Number.isNaN(value)) {
67
83
  return value;
68
84
  }
69
- if (typeof value === "string" && value.trim().length > 0) {
85
+ if (typeof value === 'string' && value.trim().length > 0) {
70
86
  const parsedNumericValue = Number(value);
71
87
  return Number.isNaN(parsedNumericValue) ? null : parsedNumericValue;
72
88
  }
@@ -80,24 +96,26 @@ const extractPermissionActionsFromAssociation = (
80
96
  const aggregatedPermissionActions = new Set<string>();
81
97
 
82
98
  const associationActions =
83
- associationRecord?.actions ?? associationRecord?.actionList ?? associationRecord?.permissions;
99
+ associationRecord?.actions ??
100
+ associationRecord?.actionList ??
101
+ associationRecord?.permissions;
84
102
 
85
103
  if (Array.isArray(associationActions)) {
86
104
  associationActions.forEach((action: any) => {
87
- if (typeof action === "string" && action) {
105
+ if (typeof action === 'string' && action) {
88
106
  aggregatedPermissionActions.add(action);
89
- } else if (typeof action === "object" && action?.name) {
107
+ } else if (typeof action === 'object' && action?.name) {
90
108
  aggregatedPermissionActions.add(action.name);
91
- } else if (typeof action === "object" && action?.code) {
109
+ } else if (typeof action === 'object' && action?.code) {
92
110
  aggregatedPermissionActions.add(action.code);
93
111
  }
94
112
  });
95
- } else if (typeof associationActions === "string") {
113
+ } else if (typeof associationActions === 'string') {
96
114
  associationActions
97
- .split(",")
115
+ .split(',')
98
116
  .map((action: string) => action.trim())
99
117
  .filter(Boolean)
100
- .forEach(action => aggregatedPermissionActions.add(action));
118
+ .forEach((action) => aggregatedPermissionActions.add(action));
101
119
  }
102
120
 
103
121
  return Array.from(aggregatedPermissionActions);
@@ -105,41 +123,48 @@ const extractPermissionActionsFromAssociation = (
105
123
 
106
124
  // Draggable row component for dnd-kit
107
125
  interface DraggableRowProps extends React.HTMLAttributes<HTMLTableRowElement> {
108
- "data-row-key": string;
126
+ 'data-row-key': string;
109
127
  }
110
128
 
111
129
  const DraggableRow: React.FC<DraggableRowProps> = ({ children, ...props }) => {
112
- const id = props["data-row-key"];
113
- const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({
130
+ const id = props['data-row-key'];
131
+ const {
132
+ attributes,
133
+ listeners,
134
+ setNodeRef,
135
+ transform,
136
+ transition,
137
+ isDragging,
138
+ } = useSortable({
114
139
  id,
115
140
  });
116
141
 
117
142
  const style: React.CSSProperties = {
118
143
  ...props.style,
119
144
  transform: CSS.Transform.toString(transform && { ...transform, scaleY: 1 }),
120
- transition: transition ?? "transform 200ms ease",
145
+ transition: transition ?? 'transform 200ms ease',
121
146
  ...(isDragging
122
147
  ? {
123
- position: "relative",
148
+ position: 'relative',
124
149
  zIndex: 9999,
125
- background: "#bae0ff",
126
- boxShadow: "0 8px 24px rgba(22, 119, 255, 0.25)",
127
- borderLeft: "3px solid #1677ff",
150
+ background: '#bae0ff',
151
+ boxShadow: '0 8px 24px rgba(22, 119, 255, 0.25)',
152
+ borderLeft: '3px solid #1677ff',
128
153
  opacity: 0.95,
129
- outline: "1px solid #1677ff",
154
+ outline: '1px solid #1677ff',
130
155
  }
131
156
  : {}),
132
157
  };
133
158
 
134
159
  return (
135
160
  <tr {...props} ref={setNodeRef} style={style} {...attributes}>
136
- {React.Children.map(children, child => {
137
- if ((child as React.ReactElement).key === "drag-handle") {
161
+ {React.Children.map(children, (child) => {
162
+ if ((child as React.ReactElement).key === 'drag-handle') {
138
163
  return React.cloneElement(child as React.ReactElement, {
139
164
  children: (
140
165
  <HolderOutlined
141
166
  {...listeners}
142
- style={{ cursor: "grab", color: "#999", touchAction: "none" }}
167
+ style={{ cursor: 'grab', color: '#999', touchAction: 'none' }}
143
168
  />
144
169
  ),
145
170
  });
@@ -154,7 +179,7 @@ export const PageManagementListPage: React.FC = () => {
154
179
  const { i18n } = useTranslation();
155
180
  const { data: identity } = useGetIdentity<any>();
156
181
  const { tableProps } = useTable({
157
- resource: "page",
182
+ resource: 'page',
158
183
  pagination: {
159
184
  pageSize: 20,
160
185
  },
@@ -172,7 +197,9 @@ export const PageManagementListPage: React.FC = () => {
172
197
  pageResourceAssociationRequestQuery,
173
198
  } = usePageManagement();
174
199
 
175
- const resourceLookupByIdMap = useMemo<Record<number, ResourceDefinition>>(() => {
200
+ const resourceLookupByIdMap = useMemo<
201
+ Record<number, ResourceDefinition>
202
+ >(() => {
176
203
  const resourcesArray: any[] = Array.isArray(availableResourcesData?.data)
177
204
  ? availableResourcesData.data
178
205
  : [];
@@ -199,20 +226,26 @@ export const PageManagementListPage: React.FC = () => {
199
226
  }, [resourceLookupByIdMap]);
200
227
 
201
228
  const pageMenuTreeOptionsData = useMemo<PageMenuTreeNode[]>(() => {
202
- const pagesArray: any[] = Array.isArray(pageListData?.data) ? pageListData.data : [];
229
+ const pagesArray: any[] = Array.isArray(pageListData?.data)
230
+ ? pageListData.data
231
+ : [];
203
232
  const nodeMapByPageId = new Map<
204
233
  number,
205
234
  { treeNode: PageMenuTreeNode; parentPageId: number | null }
206
235
  >();
207
236
 
208
237
  pagesArray.forEach((page: any) => {
209
- const pageId = safelyConvertToNumber(page?.id ?? page?.pageId ?? page?.page_id);
238
+ const pageId = safelyConvertToNumber(
239
+ page?.id ?? page?.pageId ?? page?.page_id,
240
+ );
210
241
  if (pageId === null) {
211
242
  return;
212
243
  }
213
244
 
214
245
  const parentPageId =
215
- safelyConvertToNumber(page?.parentId ?? page?.parent_id ?? page?.parent?.id) ?? null;
246
+ safelyConvertToNumber(
247
+ page?.parentId ?? page?.parent_id ?? page?.parent?.id,
248
+ ) ?? null;
216
249
  const pageDisplayTitle = page?.name || page?.code || `Page ${pageId}`;
217
250
 
218
251
  nodeMapByPageId.set(pageId, {
@@ -238,19 +271,23 @@ export const PageManagementListPage: React.FC = () => {
238
271
 
239
272
  const sortTreeNodesAlphabetically = (nodes: PageMenuTreeNode[]) => {
240
273
  nodes.sort((nodeA, nodeB) => {
241
- const titleA = typeof nodeA.title === "string" ? nodeA.title : String(nodeA.key);
242
- const titleB = typeof nodeB.title === "string" ? nodeB.title : String(nodeB.key);
274
+ const titleA =
275
+ typeof nodeA.title === 'string' ? nodeA.title : String(nodeA.key);
276
+ const titleB =
277
+ typeof nodeB.title === 'string' ? nodeB.title : String(nodeB.key);
243
278
  return titleA.localeCompare(titleB);
244
279
  });
245
- nodes.forEach(node => {
280
+ nodes.forEach((node) => {
246
281
  if (node.children && node.children.length) {
247
282
  sortTreeNodesAlphabetically(node.children);
248
283
  }
249
284
  });
250
285
  };
251
286
 
252
- const removeEmptyChildrenArrays = (nodes: PageMenuTreeNode[]): PageMenuTreeNode[] =>
253
- nodes.map(node => {
287
+ const removeEmptyChildrenArrays = (
288
+ nodes: PageMenuTreeNode[],
289
+ ): PageMenuTreeNode[] =>
290
+ nodes.map((node) => {
254
291
  if (node.children && node.children.length) {
255
292
  return {
256
293
  ...node,
@@ -268,10 +305,13 @@ export const PageManagementListPage: React.FC = () => {
268
305
  const pageResourcePermissionSummaryMap = useMemo<
269
306
  Record<number, PageResourcePermissionSummary>
270
307
  >(() => {
271
- const associationsArray: any[] = Array.isArray(pageResourceAssociationsData?.data)
308
+ const associationsArray: any[] = Array.isArray(
309
+ pageResourceAssociationsData?.data,
310
+ )
272
311
  ? pageResourceAssociationsData.data
273
312
  : [];
274
- const summaryMapByPageId: Record<number, PageResourcePermissionSummary> = {};
313
+ const summaryMapByPageId: Record<number, PageResourcePermissionSummary> =
314
+ {};
275
315
 
276
316
  associationsArray.forEach((association: any) => {
277
317
  const pageId = safelyConvertToNumber(association?.pageId);
@@ -295,21 +335,31 @@ export const PageManagementListPage: React.FC = () => {
295
335
  pageSummary.resourceIds.push(resourceId);
296
336
  }
297
337
 
298
- const resourceRecord = association?.resource ?? resourceLookupByIdMap[resourceId];
338
+ const resourceRecord =
339
+ association?.resource ?? resourceLookupByIdMap[resourceId];
299
340
  const resourceDisplayName =
300
- resourceRecord?.name || resourceRecord?.code || `Resource ${resourceId}`;
301
-
302
- if (resourceDisplayName && !pageSummary.resourceNames.includes(resourceDisplayName)) {
341
+ resourceRecord?.name ||
342
+ resourceRecord?.code ||
343
+ `Resource ${resourceId}`;
344
+
345
+ if (
346
+ resourceDisplayName &&
347
+ !pageSummary.resourceNames.includes(resourceDisplayName)
348
+ ) {
303
349
  pageSummary.resourceNames.push(resourceDisplayName);
304
350
  }
305
351
 
306
- extractPermissionActionsFromAssociation(association, resourceRecord).forEach(
307
- permissionAction => {
308
- if (permissionAction && !pageSummary.allPermissionActions.includes(permissionAction)) {
309
- pageSummary.allPermissionActions.push(permissionAction);
310
- }
311
- },
312
- );
352
+ extractPermissionActionsFromAssociation(
353
+ association,
354
+ resourceRecord,
355
+ ).forEach((permissionAction) => {
356
+ if (
357
+ permissionAction &&
358
+ !pageSummary.allPermissionActions.includes(permissionAction)
359
+ ) {
360
+ pageSummary.allPermissionActions.push(permissionAction);
361
+ }
362
+ });
313
363
  });
314
364
 
315
365
  return summaryMapByPageId;
@@ -318,11 +368,13 @@ export const PageManagementListPage: React.FC = () => {
318
368
  const getPageResourceAssignmentsForModal = useCallback(
319
369
  (pageId: number): PageResourceAssignment[] => {
320
370
  console.log(
321
- "Getting resource assignments for page ID:",
371
+ 'Getting resource assignments for page ID:',
322
372
  pageId,
323
373
  pageResourceAssociationsData,
324
374
  );
325
- const associationsArray: any[] = Array.isArray(pageResourceAssociationsData?.data)
375
+ const associationsArray: any[] = Array.isArray(
376
+ pageResourceAssociationsData?.data,
377
+ )
326
378
  ? pageResourceAssociationsData.data
327
379
  : [];
328
380
 
@@ -336,14 +388,20 @@ export const PageManagementListPage: React.FC = () => {
336
388
  return;
337
389
  }
338
390
 
339
- const resourceRecord = association?.resource ?? resourceLookupByIdMap[resourceId];
391
+ const resourceRecord =
392
+ association?.resource ?? resourceLookupByIdMap[resourceId];
340
393
  const resourceDisplayName =
341
- resourceRecord?.name || resourceRecord?.code || `Resource ${resourceId}`;
394
+ resourceRecord?.name ||
395
+ resourceRecord?.code ||
396
+ `Resource ${resourceId}`;
342
397
 
343
398
  pageAssignments.push({
344
399
  resourceId,
345
400
  resourceName: resourceDisplayName,
346
- assignedPermissions: extractPermissionActionsFromAssociation(association, resourceRecord),
401
+ assignedPermissions: extractPermissionActionsFromAssociation(
402
+ association,
403
+ resourceRecord,
404
+ ),
347
405
  });
348
406
  });
349
407
 
@@ -353,7 +411,7 @@ export const PageManagementListPage: React.FC = () => {
353
411
  );
354
412
 
355
413
  const [activeModalState, setActiveModalState] = useState<{
356
- modalType: "view" | "edit" | "create" | null;
414
+ modalType: 'view' | 'edit' | 'create' | null;
357
415
  targetPageId: number | null;
358
416
  defaultParentId?: number | null;
359
417
  defaultPathPrefix?: string;
@@ -361,7 +419,7 @@ export const PageManagementListPage: React.FC = () => {
361
419
  modalType: null,
362
420
  targetPageId: null,
363
421
  defaultParentId: null,
364
- defaultPathPrefix: "",
422
+ defaultPathPrefix: '',
365
423
  });
366
424
 
367
425
  // State for draggable table
@@ -383,65 +441,107 @@ export const PageManagementListPage: React.FC = () => {
383
441
  } | null>(null);
384
442
 
385
443
  // State for active tab
386
- const [activeTab, setActiveTab] = useState<string>("regular");
444
+ const [activeTab, setActiveTab] = useState<string>('regular');
387
445
 
388
446
  // State for SQL modal
389
447
  const [sqlModal, setSqlModal] = useState<{
390
448
  open: boolean;
391
449
  title: string;
392
450
  sql: string;
393
- }>({ open: false, title: "", sql: "" });
394
-
395
- const handleShowSql = useCallback((record: any, hasChildren: boolean) => {
396
- const pagesArray: any[] = Array.isArray(pageListData?.data) ? pageListData.data : [];
451
+ }>({ open: false, title: '', sql: '' });
397
452
 
398
- // Build pageResources for the given page
399
- const buildPageResources = (pageId: number) => {
400
- const associationsArray: any[] = Array.isArray(pageResourceAssociationsData?.data)
401
- ? pageResourceAssociationsData.data
453
+ const handleShowSql = useCallback(
454
+ (record: any, hasChildren: boolean) => {
455
+ const pagesArray: any[] = Array.isArray(pageListData?.data)
456
+ ? pageListData.data
402
457
  : [];
403
- return associationsArray
404
- .filter((assoc: any) => safelyConvertToNumber(assoc?.pageId) === pageId)
405
- .map((assoc: any) => {
406
- const resourceId = safelyConvertToNumber(assoc?.resourceId);
407
- // Prefer nested resource object, then fall back to the id-keyed lookup map (which includes code).
408
- // The final fallback `String(resourceId)` should never be reached if availableResourcesData is loaded.
409
- const resourceRecord = assoc?.resource ?? (resourceId !== null ? resourceLookupByIdMap[resourceId] : null);
410
- const resourceCode = resourceRecord?.code ?? (resourceId !== null ? String(resourceId) : "unknown");
411
- const resourceName = resourceRecord?.name || resourceRecord?.code || `Resource ${resourceId}`;
412
- const actions = extractPermissionActionsFromAssociation(assoc, resourceRecord);
413
- return { resourceCode, resourceName, actions };
414
- });
415
- };
416
458
 
417
- const pageResources = buildPageResources(record.id);
459
+ // Build pageResources for the given page
460
+ const buildPageResources = (pageId: number) => {
461
+ const associationsArray: any[] = Array.isArray(
462
+ pageResourceAssociationsData?.data,
463
+ )
464
+ ? pageResourceAssociationsData.data
465
+ : [];
466
+ return associationsArray
467
+ .filter(
468
+ (assoc: any) => safelyConvertToNumber(assoc?.pageId) === pageId,
469
+ )
470
+ .map((assoc: any) => {
471
+ const resourceId = safelyConvertToNumber(assoc?.resourceId);
472
+ // Prefer nested resource object, then fall back to the id-keyed lookup map (which includes code).
473
+ // The final fallback `String(resourceId)` should never be reached if availableResourcesData is loaded.
474
+ const resourceRecord =
475
+ assoc?.resource ??
476
+ (resourceId !== null ? resourceLookupByIdMap[resourceId] : null);
477
+ const resourceCode =
478
+ resourceRecord?.code ??
479
+ (resourceId !== null ? String(resourceId) : 'unknown');
480
+ const resourceName =
481
+ resourceRecord?.name ||
482
+ resourceRecord?.code ||
483
+ `Resource ${resourceId}`;
484
+ const actions = extractPermissionActionsFromAssociation(
485
+ assoc,
486
+ resourceRecord,
487
+ );
488
+ return { resourceCode, resourceName, actions };
489
+ });
490
+ };
418
491
 
419
- // Collect child pages if this is a parent
420
- const children: Array<{ page: any; pageResources: Array<{ resourceCode: string; resourceName: string; actions: string[] }> }> = [];
421
- if (hasChildren) {
422
- const childPages = pagesArray.filter(
423
- (p: any) => safelyConvertToNumber(p?.parentId ?? p?.parent_id) === record.id,
424
- );
425
- for (const child of childPages) {
426
- const childId = safelyConvertToNumber(child?.id);
427
- if (childId === null) continue;
428
- children.push({
429
- page: child,
430
- pageResources: buildPageResources(childId),
431
- });
492
+ const pageResources = buildPageResources(record.id);
493
+
494
+ // Collect child pages if this is a parent
495
+ const children: Array<{
496
+ page: any;
497
+ pageResources: Array<{
498
+ resourceCode: string;
499
+ resourceName: string;
500
+ actions: string[];
501
+ }>;
502
+ }> = [];
503
+ if (hasChildren) {
504
+ const childPages = pagesArray.filter(
505
+ (p: any) =>
506
+ safelyConvertToNumber(p?.parentId ?? p?.parent_id) === record.id,
507
+ );
508
+ for (const child of childPages) {
509
+ const childId = safelyConvertToNumber(child?.id);
510
+ if (childId === null) continue;
511
+ children.push({
512
+ page: child,
513
+ pageResources: buildPageResources(childId),
514
+ });
515
+ }
432
516
  }
433
- }
434
517
 
435
- // Resolve parent's code from the in-memory page list so the SQL uses a
436
- // portable subquery (SELECT id … WHERE code = '…') instead of a raw
437
- // numeric parentId that differs between environments.
438
- const parentId = safelyConvertToNumber(record?.parentId ?? record?.parent_id);
439
- const parentPage = parentId !== null ? pagesArray.find((p: any) => safelyConvertToNumber(p?.id) === parentId) : null;
440
- const recordWithParentCode = { ...record, parentCode: parentPage?.code ?? null };
518
+ // Resolve parent's code from the in-memory page list so the SQL uses a
519
+ // portable subquery (SELECT id … WHERE code = '…') instead of a raw
520
+ // numeric parentId that differs between environments.
521
+ const parentId = safelyConvertToNumber(
522
+ record?.parentId ?? record?.parent_id,
523
+ );
524
+ const parentPage =
525
+ parentId !== null
526
+ ? pagesArray.find(
527
+ (p: any) => safelyConvertToNumber(p?.id) === parentId,
528
+ )
529
+ : null;
530
+ const recordWithParentCode = {
531
+ ...record,
532
+ parentCode: parentPage?.code ?? null,
533
+ };
441
534
 
442
- const sql = generatePageSql(recordWithParentCode, pageResources, children, { authorId: identity?.userid, authorName: identity?.username });
443
- setSqlModal({ open: true, title: `SQL — Page: ${record.name}`, sql });
444
- }, [pageListData, pageResourceAssociationsData, resourceLookupByIdMap]);
535
+ const sql = generatePageSql(
536
+ recordWithParentCode,
537
+ pageResources,
538
+ children,
539
+ { authorId: identity?.userid, authorName: identity?.username },
540
+ );
541
+ setSqlModal({ open: true, title: `SQL — Page: ${record.name}`, sql });
542
+ },
543
+ [pageListData, pageResourceAssociationsData, resourceLookupByIdMap],
544
+ );
445
545
 
446
546
  // Ref for expand button click/double-click disambiguation
447
547
  const expandClickTimer = useRef<number | null>(null);
@@ -464,7 +564,7 @@ export const PageManagementListPage: React.FC = () => {
464
564
  modalType: null,
465
565
  targetPageId: null,
466
566
  defaultParentId: null,
467
- defaultPathPrefix: "",
567
+ defaultPathPrefix: '',
468
568
  });
469
569
  }, []);
470
570
 
@@ -477,7 +577,9 @@ export const PageManagementListPage: React.FC = () => {
477
577
  const calculateNewSortOrder = useCallback(
478
578
  (siblings: any[], dropIndex: number, dragNodeId: number): number => {
479
579
  // Filter out the dragged node from siblings
480
- const filteredSiblings = siblings.filter(s => safelyConvertToNumber(s.id) !== dragNodeId);
580
+ const filteredSiblings = siblings.filter(
581
+ (s) => safelyConvertToNumber(s.id) !== dragNodeId,
582
+ );
481
583
 
482
584
  if (filteredSiblings.length === 0) {
483
585
  // First item in this parent
@@ -502,7 +604,8 @@ export const PageManagementListPage: React.FC = () => {
502
604
  const prevSibling = filteredSiblings[dropIndex - 1];
503
605
  const nextSibling = filteredSiblings[dropIndex];
504
606
  const prevOrder = prevSibling?.sortOrder ?? 0;
505
- const nextOrder = nextSibling?.sortOrder ?? prevOrder + SORT_ORDER_GAP * 2;
607
+ const nextOrder =
608
+ nextSibling?.sortOrder ?? prevOrder + SORT_ORDER_GAP * 2;
506
609
 
507
610
  // Calculate middle value
508
611
  const newOrder = Math.floor((prevOrder + nextOrder) / 2);
@@ -521,7 +624,7 @@ export const PageManagementListPage: React.FC = () => {
521
624
 
522
625
  // Toggle expand/collapse for a node
523
626
  const handleToggleExpand = useCallback((pageId: number) => {
524
- setExpandedKeys(prev => {
627
+ setExpandedKeys((prev) => {
525
628
  const newSet = new Set(prev);
526
629
  if (newSet.has(pageId)) {
527
630
  newSet.delete(pageId);
@@ -534,7 +637,9 @@ export const PageManagementListPage: React.FC = () => {
534
637
 
535
638
  // Separate regular pages and virtual pages
536
639
  const { regularPagesData, virtualPagesData } = useMemo(() => {
537
- const pagesArray: any[] = Array.isArray(pageListData?.data) ? pageListData.data : [];
640
+ const pagesArray: any[] = Array.isArray(pageListData?.data)
641
+ ? pageListData.data
642
+ : [];
538
643
  const regular: any[] = [];
539
644
  const virtual: any[] = [];
540
645
 
@@ -561,7 +666,9 @@ export const PageManagementListPage: React.FC = () => {
561
666
  const pendingChange = pendingChanges.get(pageId);
562
667
  const sortOrder = pendingChange?.sortOrder ?? page.sortOrder;
563
668
  const parentId =
564
- pendingChange?.parentId !== undefined ? pendingChange.parentId : (page.parentId ?? null);
669
+ pendingChange?.parentId !== undefined
670
+ ? pendingChange.parentId
671
+ : (page.parentId ?? null);
565
672
 
566
673
  nodeMapById.set(pageId, {
567
674
  ...page,
@@ -574,7 +681,7 @@ export const PageManagementListPage: React.FC = () => {
574
681
 
575
682
  // Second pass: build tree structure
576
683
  const rootNodes: any[] = [];
577
- nodeMapById.forEach(node => {
684
+ nodeMapById.forEach((node) => {
578
685
  const parentId = node.parentId;
579
686
  if (parentId !== null && nodeMapById.has(parentId)) {
580
687
  nodeMapById.get(parentId).children.push(node);
@@ -585,8 +692,10 @@ export const PageManagementListPage: React.FC = () => {
585
692
 
586
693
  // Sort children by sortOrder
587
694
  const sortNodes = (nodes: any[]) => {
588
- nodes.sort((a, b) => (a.sortOrder ?? Infinity) - (b.sortOrder ?? Infinity));
589
- nodes.forEach(node => {
695
+ nodes.sort(
696
+ (a, b) => (a.sortOrder ?? Infinity) - (b.sortOrder ?? Infinity),
697
+ );
698
+ nodes.forEach((node) => {
590
699
  if (node.children?.length > 0) {
591
700
  sortNodes(node.children);
592
701
  }
@@ -597,7 +706,7 @@ export const PageManagementListPage: React.FC = () => {
597
706
  // Flatten tree to array with depth info (respecting expanded state)
598
707
  const result: any[] = [];
599
708
  const flatten = (nodes: any[], depth: number, parentExpanded: boolean) => {
600
- nodes.forEach(node => {
709
+ nodes.forEach((node) => {
601
710
  // Only show node if its parent is expanded (or it's a root node)
602
711
  if (!parentExpanded && depth > 0) return;
603
712
 
@@ -625,7 +734,7 @@ export const PageManagementListPage: React.FC = () => {
625
734
 
626
735
  // Get sortable item IDs for dnd-kit
627
736
  const sortableIds = useMemo(() => {
628
- return flattenedTableData.map(item => String(item.id));
737
+ return flattenedTableData.map((item) => String(item.id));
629
738
  }, [flattenedTableData]);
630
739
 
631
740
  // Live-reordered IDs during drag (for visual feedback)
@@ -652,7 +761,7 @@ export const PageManagementListPage: React.FC = () => {
652
761
  const handleDragOver = useCallback((event: DragOverEvent) => {
653
762
  const { active, over } = event;
654
763
  if (!over || active.id === over.id) return;
655
- setActiveSortableIds(prev => {
764
+ setActiveSortableIds((prev) => {
656
765
  const oldIndex = prev.indexOf(String(active.id));
657
766
  const newIndex = prev.indexOf(String(over.id));
658
767
  if (oldIndex === -1 || newIndex === -1) return prev;
@@ -672,9 +781,15 @@ export const PageManagementListPage: React.FC = () => {
672
781
 
673
782
  if (draggedId === null || overId === null) return;
674
783
 
675
- const pagesArray: any[] = Array.isArray(pageListData?.data) ? pageListData.data : [];
676
- const draggedPage = pagesArray.find(p => safelyConvertToNumber(p.id) === draggedId);
677
- const overPage = pagesArray.find(p => safelyConvertToNumber(p.id) === overId);
784
+ const pagesArray: any[] = Array.isArray(pageListData?.data)
785
+ ? pageListData.data
786
+ : [];
787
+ const draggedPage = pagesArray.find(
788
+ (p) => safelyConvertToNumber(p.id) === draggedId,
789
+ );
790
+ const overPage = pagesArray.find(
791
+ (p) => safelyConvertToNumber(p.id) === overId,
792
+ );
678
793
 
679
794
  if (!draggedPage || !overPage) return;
680
795
 
@@ -698,7 +813,7 @@ export const PageManagementListPage: React.FC = () => {
698
813
  // Get all siblings at the target parent level (with pending changes)
699
814
  const getSiblingsWithPendingChanges = (parentId: number | null) => {
700
815
  return pagesArray
701
- .map(page => {
816
+ .map((page) => {
702
817
  const pageId = safelyConvertToNumber(page.id);
703
818
  if (pageId === null) return null;
704
819
  const pending = pendingChanges.get(pageId);
@@ -706,12 +821,15 @@ export const PageManagementListPage: React.FC = () => {
706
821
  ...page,
707
822
  id: pageId,
708
823
  parentId:
709
- pending?.parentId !== undefined ? pending.parentId : (page.parentId ?? null),
824
+ pending?.parentId !== undefined
825
+ ? pending.parentId
826
+ : (page.parentId ?? null),
710
827
  sortOrder: pending?.sortOrder ?? page.sortOrder ?? 0,
711
828
  };
712
829
  })
713
830
  .filter(
714
- (page): page is NonNullable<typeof page> => page !== null && page.parentId === parentId,
831
+ (page): page is NonNullable<typeof page> =>
832
+ page !== null && page.parentId === parentId,
715
833
  )
716
834
  .sort((a, b) => a.sortOrder - b.sortOrder);
717
835
  };
@@ -719,8 +837,8 @@ export const PageManagementListPage: React.FC = () => {
719
837
  const siblings = getSiblingsWithPendingChanges(newParentId);
720
838
 
721
839
  // Find the position of the over item in siblings
722
- const overIndex = siblings.findIndex(s => s.id === overId);
723
- const dragIndex = siblings.findIndex(s => s.id === draggedId);
840
+ const overIndex = siblings.findIndex((s) => s.id === overId);
841
+ const dragIndex = siblings.findIndex((s) => s.id === draggedId);
724
842
 
725
843
  // Calculate drop index
726
844
  let dropIndex: number;
@@ -736,17 +854,22 @@ export const PageManagementListPage: React.FC = () => {
736
854
  }
737
855
 
738
856
  // Calculate new sort order
739
- const newSortOrder = calculateNewSortOrder(siblings, dropIndex, draggedId);
857
+ const newSortOrder = calculateNewSortOrder(
858
+ siblings,
859
+ dropIndex,
860
+ draggedId,
861
+ );
740
862
 
741
863
  // Check if anything changed
742
864
  const parentChanged = newParentId !== currentParentId;
743
865
  const orderChanged =
744
- newSortOrder !== (draggedPendingChange?.sortOrder ?? draggedPage.sortOrder ?? 0);
866
+ newSortOrder !==
867
+ (draggedPendingChange?.sortOrder ?? draggedPage.sortOrder ?? 0);
745
868
 
746
869
  if (!parentChanged && !orderChanged) return;
747
870
 
748
871
  // Update pending changes
749
- setPendingChanges(prev => {
872
+ setPendingChanges((prev) => {
750
873
  const newChanges = new Map(prev);
751
874
  const existingChange = newChanges.get(draggedId) || {};
752
875
 
@@ -759,7 +882,9 @@ export const PageManagementListPage: React.FC = () => {
759
882
  return newChanges;
760
883
  });
761
884
 
762
- message.info(`Page "${draggedPage.name}" moved. Click "Save Order" to apply changes.`);
885
+ message.info(
886
+ `Page "${draggedPage.name}" moved. Click "Save Order" to apply changes.`,
887
+ );
763
888
  },
764
889
  [pageListData, pendingChanges, calculateNewSortOrder],
765
890
  );
@@ -769,14 +894,14 @@ export const PageManagementListPage: React.FC = () => {
769
894
  if (pendingChanges.size === 0) return;
770
895
 
771
896
  Modal.confirm({
772
- title: "Discard Changes",
897
+ title: 'Discard Changes',
773
898
  content: `Are you sure you want to discard ${pendingChanges.size} pending change(s)?`,
774
- okText: "Discard",
775
- okType: "danger",
776
- styles: { body: { padding: "16px 24px" } },
899
+ okText: 'Discard',
900
+ okType: 'danger',
901
+ styles: { body: { padding: '16px 24px' } },
777
902
  onOk: () => {
778
903
  setPendingChanges(new Map());
779
- message.success("Changes discarded");
904
+ message.success('Changes discarded');
780
905
  },
781
906
  });
782
907
  }, [pendingChanges]);
@@ -784,7 +909,7 @@ export const PageManagementListPage: React.FC = () => {
784
909
  // Save all pending changes
785
910
  const handleSaveOrder = useCallback(async () => {
786
911
  if (pendingChanges.size === 0) {
787
- message.info("No changes to save");
912
+ message.info('No changes to save');
788
913
  return;
789
914
  }
790
915
 
@@ -814,8 +939,8 @@ export const PageManagementListPage: React.FC = () => {
814
939
  setPendingChanges(new Map());
815
940
  refreshAllPageRelatedData();
816
941
  } catch (error) {
817
- console.error("Failed to save order:", error);
818
- message.error("Failed to save some changes. Please try again.");
942
+ console.error('Failed to save order:', error);
943
+ message.error('Failed to save some changes. Please try again.');
819
944
  } finally {
820
945
  setIsSavingOrder(false);
821
946
  }
@@ -829,7 +954,9 @@ export const PageManagementListPage: React.FC = () => {
829
954
  if (pageId === null) continue;
830
955
  const pendingChange = pendingChanges.get(pageId);
831
956
  const parentId =
832
- pendingChange?.parentId !== undefined ? pendingChange.parentId : (page.parentId ?? null);
957
+ pendingChange?.parentId !== undefined
958
+ ? pendingChange.parentId
959
+ : (page.parentId ?? null);
833
960
  if (!childrenOf.has(parentId)) childrenOf.set(parentId, []);
834
961
  childrenOf.get(parentId)!.push(pageId);
835
962
  }
@@ -878,10 +1005,10 @@ export const PageManagementListPage: React.FC = () => {
878
1005
  const permissionSummary = pageResourcePermissionSummaryMap[record.id];
879
1006
 
880
1007
  if (!permissionSummary?.resourceNames.length) {
881
- return <span style={{ color: "#999" }}>No resources assigned</span>;
1008
+ return <span style={{ color: '#999' }}>No resources assigned</span>;
882
1009
  }
883
1010
 
884
- const joinedResourceNames = permissionSummary.resourceNames.join(", ");
1011
+ const joinedResourceNames = permissionSummary.resourceNames.join(', ');
885
1012
  const shouldTruncateDisplay =
886
1013
  joinedResourceNames.length > RESOURCE_NAME_DISPLAY_TRUNCATION_LIMIT;
887
1014
  const truncatedDisplayValue = shouldTruncateDisplay
@@ -899,12 +1026,12 @@ export const PageManagementListPage: React.FC = () => {
899
1026
  const permissionSummary = pageResourcePermissionSummaryMap[record.id];
900
1027
 
901
1028
  if (!permissionSummary?.allPermissionActions.length) {
902
- return <span style={{ color: "#999" }}>-</span>;
1029
+ return <span style={{ color: '#999' }}>-</span>;
903
1030
  }
904
1031
 
905
1032
  return (
906
1033
  <Space size={[4, 4]} wrap>
907
- {permissionSummary.allPermissionActions.map(permissionAction => (
1034
+ {permissionSummary.allPermissionActions.map((permissionAction) => (
908
1035
  <Tag key={`${record.id}-${permissionAction}`} color="blue">
909
1036
  {permissionAction}
910
1037
  </Tag>
@@ -915,10 +1042,10 @@ export const PageManagementListPage: React.FC = () => {
915
1042
 
916
1043
  // Handle click on add child page button
917
1044
  const handleAddChildPage = useCallback((parentPage: any) => {
918
- const parentPath = parentPage.path || "";
919
- const pathPrefix = parentPath.endsWith("/") ? parentPath : `${parentPath}/`;
1045
+ const parentPath = parentPage.path || '';
1046
+ const pathPrefix = parentPath.endsWith('/') ? parentPath : `${parentPath}/`;
920
1047
  setActiveModalState({
921
- modalType: "create",
1048
+ modalType: 'create',
922
1049
  targetPageId: null,
923
1050
  defaultParentId: parentPage.id,
924
1051
  defaultPathPrefix: pathPrefix,
@@ -939,7 +1066,9 @@ export const PageManagementListPage: React.FC = () => {
939
1066
  hideText
940
1067
  size="small"
941
1068
  recordItemId={record.id}
942
- onClick={() => setActiveModalState({ modalType: "edit", targetPageId: record.id })}
1069
+ onClick={() =>
1070
+ setActiveModalState({ modalType: 'edit', targetPageId: record.id })
1071
+ }
943
1072
  />
944
1073
  <Tooltip title="Generate SQL">
945
1074
  <Button
@@ -957,7 +1086,12 @@ export const PageManagementListPage: React.FC = () => {
957
1086
  type="default"
958
1087
  size="small"
959
1088
  icon={<TeamOutlined />}
960
- onClick={() => setAssignRolesTarget({ pageId: record.id, pageName: record.name })}
1089
+ onClick={() =>
1090
+ setAssignRolesTarget({
1091
+ pageId: record.id,
1092
+ pageName: record.name,
1093
+ })
1094
+ }
961
1095
  />
962
1096
  </Tooltip>
963
1097
  <Tooltip title="View details">
@@ -987,10 +1121,14 @@ export const PageManagementListPage: React.FC = () => {
987
1121
  <Tooltip title="Click: expand 2 levels / Double-click: expand all">
988
1122
  <Button
989
1123
  onClick={() => {
990
- expandClickTimer.current = window.setTimeout(() => handleExpandLevels(1), 200);
1124
+ expandClickTimer.current = window.setTimeout(
1125
+ () => handleExpandLevels(1),
1126
+ 200,
1127
+ );
991
1128
  }}
992
1129
  onDoubleClick={() => {
993
- if (expandClickTimer.current) clearTimeout(expandClickTimer.current);
1130
+ if (expandClickTimer.current)
1131
+ clearTimeout(expandClickTimer.current);
994
1132
  handleExpandAll();
995
1133
  }}
996
1134
  >
@@ -1006,9 +1144,14 @@ export const PageManagementListPage: React.FC = () => {
1006
1144
  onClick={handleSaveOrder}
1007
1145
  loading={isSavingOrder}
1008
1146
  >
1009
- Save Order ({pendingChanges.size} change{pendingChanges.size > 1 ? "s" : ""})
1147
+ Save Order ({pendingChanges.size} change
1148
+ {pendingChanges.size > 1 ? 's' : ''})
1010
1149
  </Button>
1011
- <Button icon={<UndoOutlined />} onClick={handleDiscardChanges} disabled={isSavingOrder}>
1150
+ <Button
1151
+ icon={<UndoOutlined />}
1152
+ onClick={handleDiscardChanges}
1153
+ disabled={isSavingOrder}
1154
+ >
1012
1155
  Discard Changes
1013
1156
  </Button>
1014
1157
  </>
@@ -1032,7 +1175,10 @@ export const PageManagementListPage: React.FC = () => {
1032
1175
  onDragOver={handleDragOver}
1033
1176
  onDragEnd={handleDragEnd}
1034
1177
  >
1035
- <SortableContext items={activeSortableIds} strategy={verticalListSortingStrategy}>
1178
+ <SortableContext
1179
+ items={activeSortableIds}
1180
+ strategy={verticalListSortingStrategy}
1181
+ >
1036
1182
  <Table
1037
1183
  {...tableProps}
1038
1184
  rowKey="id"
@@ -1053,21 +1199,21 @@ export const PageManagementListPage: React.FC = () => {
1053
1199
  <span
1054
1200
  style={{
1055
1201
  paddingLeft: record._depth * 20,
1056
- display: "inline-flex",
1057
- alignItems: "center",
1202
+ display: 'inline-flex',
1203
+ alignItems: 'center',
1058
1204
  }}
1059
1205
  >
1060
1206
  {record._hasChildren ? (
1061
1207
  <span
1062
- onClick={e => {
1208
+ onClick={(e) => {
1063
1209
  e.stopPropagation();
1064
1210
  handleToggleExpand(record.id);
1065
1211
  }}
1066
1212
  style={{
1067
- cursor: "pointer",
1213
+ cursor: 'pointer',
1068
1214
  marginRight: 8,
1069
- display: "inline-flex",
1070
- alignItems: "center",
1215
+ display: 'inline-flex',
1216
+ alignItems: 'center',
1071
1217
  }}
1072
1218
  >
1073
1219
  {record._isExpanded ? (
@@ -1079,7 +1225,9 @@ export const PageManagementListPage: React.FC = () => {
1079
1225
  ) : (
1080
1226
  <span style={{ width: 18 }} />
1081
1227
  )}
1082
- {i18n.language === "zh_CN" ? record.zhName || text : record.enName || text}
1228
+ {i18n.language === 'zh_CN'
1229
+ ? record.zhName || text
1230
+ : record.enName || text}
1083
1231
  {record._isModified && (
1084
1232
  <Tag color="orange" style={{ marginLeft: 8, fontSize: 10 }}>
1085
1233
  Modified
@@ -1098,7 +1246,9 @@ export const PageManagementListPage: React.FC = () => {
1098
1246
  <Table.Column dataIndex="creator" title="Creator" />
1099
1247
  <Table.Column
1100
1248
  title="Actions"
1101
- render={(_, record: any) => renderActionsColumn(record, record._hasChildren)}
1249
+ render={(_, record: any) =>
1250
+ renderActionsColumn(record, record._hasChildren)
1251
+ }
1102
1252
  />
1103
1253
  </Table>
1104
1254
  </SortableContext>
@@ -1108,7 +1258,11 @@ export const PageManagementListPage: React.FC = () => {
1108
1258
 
1109
1259
  // Render virtual pages table (simple table without drag-drop and tree structure)
1110
1260
  const renderVirtualPagesTable = () => (
1111
- <Table rowKey="id" dataSource={virtualPagesData} pagination={{ pageSize: 20 }}>
1261
+ <Table
1262
+ rowKey="id"
1263
+ dataSource={virtualPagesData}
1264
+ pagination={{ pageSize: 20 }}
1265
+ >
1112
1266
  <Table.Column dataIndex="name" title="Page Name" />
1113
1267
  <Table.Column dataIndex="creator" title="Creator" />
1114
1268
  <Table.Column
@@ -1131,7 +1285,7 @@ export const PageManagementListPage: React.FC = () => {
1131
1285
  type="primary"
1132
1286
  onClick={() =>
1133
1287
  setActiveModalState({
1134
- modalType: "create",
1288
+ modalType: 'create',
1135
1289
  targetPageId: null,
1136
1290
  })
1137
1291
  }
@@ -1145,31 +1299,32 @@ export const PageManagementListPage: React.FC = () => {
1145
1299
  onChange={setActiveTab}
1146
1300
  items={[
1147
1301
  {
1148
- key: "regular",
1302
+ key: 'regular',
1149
1303
  label: `Regular Pages (${regularPagesData.length})`,
1150
1304
  children: renderRegularPagesTable(),
1151
1305
  },
1152
1306
  {
1153
- key: "virtual",
1307
+ key: 'virtual',
1154
1308
  label: `Virtual Pages (${virtualPagesData.length})`,
1155
1309
  children: renderVirtualPagesTable(),
1156
1310
  },
1157
1311
  ]}
1158
1312
  />
1159
1313
 
1160
- {activeModalState.modalType === "edit" && activeModalState.targetPageId && (
1161
- <EditPageModal
1162
- pageIdToEdit={activeModalState.targetPageId}
1163
- onModalClose={handleModalClose}
1164
- onPageEditSuccess={handleModalOperationSuccess}
1165
- parentPageTreeOptions={pageMenuTreeOptionsData}
1166
- allAvailableResources={availableResourcesListForModal}
1167
- currentPageResourceAssignments={getPageResourceAssignmentsForModal(
1168
- activeModalState.targetPageId,
1169
- )}
1170
- allPagesData={pageListData?.data || []}
1171
- />
1172
- )}
1314
+ {activeModalState.modalType === 'edit' &&
1315
+ activeModalState.targetPageId && (
1316
+ <EditPageModal
1317
+ pageIdToEdit={activeModalState.targetPageId}
1318
+ onModalClose={handleModalClose}
1319
+ onPageEditSuccess={handleModalOperationSuccess}
1320
+ parentPageTreeOptions={pageMenuTreeOptionsData}
1321
+ allAvailableResources={availableResourcesListForModal}
1322
+ currentPageResourceAssignments={getPageResourceAssignmentsForModal(
1323
+ activeModalState.targetPageId,
1324
+ )}
1325
+ allPagesData={pageListData?.data || []}
1326
+ />
1327
+ )}
1173
1328
 
1174
1329
  {drawerPage && (
1175
1330
  <PageDetailDrawer
@@ -1192,7 +1347,7 @@ export const PageManagementListPage: React.FC = () => {
1192
1347
  />
1193
1348
  )}
1194
1349
 
1195
- {activeModalState.modalType === "create" && (
1350
+ {activeModalState.modalType === 'create' && (
1196
1351
  <CreatePageModal
1197
1352
  onModalClose={handleModalClose}
1198
1353
  onPageCreationSuccess={handleModalOperationSuccess}
@@ -1206,7 +1361,7 @@ export const PageManagementListPage: React.FC = () => {
1206
1361
 
1207
1362
  <SqlModal
1208
1363
  open={sqlModal.open}
1209
- onClose={() => setSqlModal({ open: false, title: "", sql: "" })}
1364
+ onClose={() => setSqlModal({ open: false, title: '', sql: '' })}
1210
1365
  title={sqlModal.title}
1211
1366
  sql={sqlModal.sql}
1212
1367
  />