@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.
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/canvas.prisma +45 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/example.prisma +24 -23
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/system.prisma +93 -90
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Audit.ts +70 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Event.ts +3 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Page.ts +70 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/PageResource.ts +70 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Resource.ts +70 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/RolePages.ts +70 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/RoleResource.ts +70 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/SavedQuery.ts +70 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/User.ts +70 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/readme.md +95 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/.eslintrc.js +4 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/.prettierignore +7 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/config/index.ts +1 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/gadmin-cli.json +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +6 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/lib/page-helpers.ts +157 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/page-manage.ts +290 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/permission-manage.ts +184 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/prismaModels.ts +143 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/sync-resources.ts +100 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/syncDataMngtPages.ts +119 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/index.ts +1 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/permissions.ts +109 -143
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/main.ts +5 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.controller.spec.ts +20 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.controller.ts +81 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.dto.ts +49 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.module.ts +11 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.service.spec.ts +334 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.service.ts +249 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/index.ts +2 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.service.ts +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.service.ts +17 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/yarn.lock +7737 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/.env +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/.eslintrc.json +38 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/.prettierignore +2 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/dev-shell-entry.html +49 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +13 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/App.tsx +137 -111
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/auditLogProvider.ts +46 -44
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/authProvider.ts +32 -12
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/BulkActions.tsx +74 -23
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/ListPageHeader.tsx +9 -9
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/RowActions.tsx +57 -31
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/SearchBar.tsx +53 -24
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/SqlModal.tsx +148 -72
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/AgentContext.tsx +190 -16
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/ElementInspector.tsx +914 -63
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/agentAttributes.ts +17 -8
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/index.ts +0 -10
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/inspectorActions.ts +969 -46
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/pagePathUtils.ts +66 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/promptGenerator.ts +85 -25
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/propPatcher.ts +84 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/eventList/index.tsx +16 -20
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/index.ts +4 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/logButton/index.tsx +13 -13
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/logList/index.tsx +15 -16
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/modalDiffViewer/index.tsx +15 -15
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/index.tsx +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/BarChart/index.tsx +896 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/ChartSwitcher/index.tsx +219 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/ChartViewer/index.tsx +159 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Filter/index.tsx +192 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/LineChart/index.tsx +1034 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumCard/NumCard.module.css +8 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumCard/index.tsx +509 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumLineCard/index.tsx +66 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/PieChart/index.tsx +552 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/RadarChart/index.tsx +263 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Section/index.tsx +35 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Table/index.tsx +207 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/TreemapChart/index.tsx +382 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/WorldMap/index.tsx +135 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/chart-constants.ts +53 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/icon/InfoIcon.tsx +8 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/icon/index.ts +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/config.ts +31 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/nameMap.json +9 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/world.geo.json +39349 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/metric-info-tooltip/index.tsx +19 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/business/index.tsx +12 -12
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/index.tsx +22 -26
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/custom-avatar.tsx +13 -9
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/index.ts +4 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/header.tsx +22 -37
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/index.ts +4 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/layout.tsx +10 -10
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/logo.tsx +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/sider.tsx +113 -65
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/title.tsx +14 -14
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/offLayoutArea/index.tsx +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/pagination-total.tsx +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/tags/index.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/tags/role-tag.tsx +21 -21
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/text.tsx +17 -13
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/http.ts +26 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +221 -51
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +3 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddDataModal.tsx +199 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddPageModal.tsx +335 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DeleteDataConfirm.tsx +56 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +401 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/EditDataModal.tsx +129 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/SkillMenu.tsx +202 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/UndoConfirm.tsx +36 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/index.tsx +8 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/style.css +835 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/enums/audit-log.enum.ts +8 -8
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/enums/index.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/form.tsx +120 -70
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/get-name-initials.ts +3 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/get-random-color.ts +11 -11
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/http.ts +16 -19
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/index.tsx +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/list.tsx +99 -73
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/login.ts +22 -27
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/page-tree.ts +74 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/show.tsx +95 -51
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/utils.tsx +7 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/types.ts +15 -15
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useBatchDelete.ts +10 -10
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useBatchOperations.ts +8 -7
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useBatchOperationsCore.ts +10 -10
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useBatchUpdate.ts +10 -10
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +36 -27
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useECharts.tsx +144 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useFetchData.ts +4 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useListPageState.ts +34 -34
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useRoles.ts +8 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useRowSelection.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useUserPageAccess.ts +55 -41
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/i18n.ts +8 -8
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/index.tsx +9 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +193 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +194 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/plugins/devShellPlugin.ts +81 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.tsx +37 -37
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/create.tsx +23 -31
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/edit.tsx +34 -35
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.tsx +4 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/list.tsx +41 -34
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/show.tsx +33 -20
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasCell.tsx +87 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasEditPage.tsx +192 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +409 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasPage.tsx +1372 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasToolbar.tsx +384 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CodeFloatWindow.tsx +476 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/ComponentThumbnail.tsx +135 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/IsolatedLivePreview.tsx +101 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/LivePreview.tsx +236 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/PublishModal.tsx +200 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasApi.ts +92 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasConfigRegistry.tsx +25 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasContextMenuRegistry.tsx +875 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasDefaults.ts +126 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasI18n.ts +11 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/BarChartDataSourceModal.tsx +115 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/ChartViewerConfigModal.tsx +217 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/LineChartDataSourceModal.tsx +153 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/NumCardDataSourceModal.tsx +211 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/PromptModal.tsx +90 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/RadarChartDataSourceModal.tsx +87 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/TableDataSourceModal.tsx +204 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/demos.ts +1153 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/index.tsx +2 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/sectionCompactor.ts +45 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/types.ts +45 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas-page/index.tsx +108 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/create.tsx +105 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/edit.tsx +121 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/index.tsx +4 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/list.tsx +237 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/show.tsx +74 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/AssignRolesModal.tsx +29 -20
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/CreatePageModal.tsx +3 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/EditPageModal.tsx +7 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/PageDetailDrawer.tsx +58 -23
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/PageFormModal.tsx +206 -122
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/hooks/usePageManagement.ts +8 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/index.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/list.tsx +345 -190
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/types.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/permissionReadme/index.tsx +341 -340
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/CreateModal.tsx +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/EditModal.tsx +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/ResourceDetailDrawer.tsx +41 -24
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/modal.tsx +64 -36
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/index.ts +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/list.tsx +78 -40
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/CreateModal.tsx +3 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/EditModal.tsx +4 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/RoleDetailDrawer.tsx +19 -9
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/modal.tsx +45 -47
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/hooks/useRolePage.ts +4 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/index.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/list.tsx +121 -147
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/types.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/create-modal.tsx +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/edit-modal.tsx +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/form-modal.tsx +25 -19
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/index.ts +5 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/role-tag.tsx +10 -10
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/show-drawer.tsx +31 -26
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/index.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/list.tsx +76 -71
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/setupTests.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/audit-log.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/index.ts +3 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/role.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/user.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/vite.config.ts +42 -25
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/yarn.lock +1193 -32
- package/package.json +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/seedDataMngtPages.ts +0 -258
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/AgentPanel.tsx +0 -497
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/skills.ts +0 -464
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
import React, { useEffect, useMemo, useState } from
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import React, { useEffect, useMemo, useState } from 'react';
|
|
2
|
+
import type {
|
|
3
|
+
PageMenuTreeNode,
|
|
4
|
+
PageResourceAssignment,
|
|
5
|
+
ResourceDefinition,
|
|
6
|
+
} from '../types';
|
|
7
|
+
import { useModalForm } from '@refinedev/antd';
|
|
8
|
+
import { type HttpError, type RedirectAction } from '@refinedev/core';
|
|
5
9
|
import {
|
|
6
10
|
Form,
|
|
7
11
|
Input,
|
|
@@ -14,9 +18,9 @@ import {
|
|
|
14
18
|
Checkbox,
|
|
15
19
|
Table,
|
|
16
20
|
Divider,
|
|
17
|
-
} from
|
|
18
|
-
import type { TransferProps } from
|
|
19
|
-
import { PageFieldSelector } from
|
|
21
|
+
} from 'antd';
|
|
22
|
+
import type { TransferProps } from 'antd';
|
|
23
|
+
import { PageFieldSelector } from '../queries';
|
|
20
24
|
|
|
21
25
|
type PageFormFieldValues = {
|
|
22
26
|
name?: string;
|
|
@@ -33,12 +37,17 @@ type PageFormFieldValues = {
|
|
|
33
37
|
resourcePermissionAssignments?: Record<number, string[]>;
|
|
34
38
|
};
|
|
35
39
|
|
|
36
|
-
const AVAILABLE_PERMISSION_ACTIONS = [
|
|
40
|
+
const AVAILABLE_PERMISSION_ACTIONS = [
|
|
41
|
+
'readAny',
|
|
42
|
+
'createAny',
|
|
43
|
+
'updateAny',
|
|
44
|
+
'deleteAny',
|
|
45
|
+
];
|
|
37
46
|
|
|
38
47
|
const SPECIAL_CHARACTER_VALIDATION_PATTERN = /[^\u4e00-\u9fa5a-zA-Z0-9\s\-_/]/;
|
|
39
48
|
|
|
40
49
|
interface PageFormModalProps {
|
|
41
|
-
formActionType:
|
|
50
|
+
formActionType: 'create' | 'edit';
|
|
42
51
|
editingPageId?: number;
|
|
43
52
|
redirectAfterSubmit?: RedirectAction;
|
|
44
53
|
onFormSubmitSuccess?: () => void;
|
|
@@ -57,7 +66,7 @@ const buildPageTreeNodeLookupMap = (
|
|
|
57
66
|
const nodeLookupMap = new Map<string, PageMenuTreeNode>();
|
|
58
67
|
|
|
59
68
|
const traverseAndAddToMap = (nodes?: PageMenuTreeNode[]) => {
|
|
60
|
-
nodes?.forEach(node => {
|
|
69
|
+
nodes?.forEach((node) => {
|
|
61
70
|
nodeLookupMap.set(String(node.value), node);
|
|
62
71
|
if (node.children?.length) {
|
|
63
72
|
traverseAndAddToMap(node.children);
|
|
@@ -80,14 +89,14 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
80
89
|
currentResourceAssignments = [],
|
|
81
90
|
allPagesData = [],
|
|
82
91
|
defaultParentId,
|
|
83
|
-
defaultPathPrefix =
|
|
92
|
+
defaultPathPrefix = '',
|
|
84
93
|
}) => {
|
|
85
94
|
const { formProps, modalProps, onFinish, close } = useModalForm<
|
|
86
95
|
any,
|
|
87
96
|
HttpError,
|
|
88
97
|
PageFormFieldValues
|
|
89
98
|
>({
|
|
90
|
-
resource:
|
|
99
|
+
resource: 'page',
|
|
91
100
|
action: formActionType,
|
|
92
101
|
id: editingPageId,
|
|
93
102
|
defaultVisible: true,
|
|
@@ -101,37 +110,44 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
101
110
|
});
|
|
102
111
|
|
|
103
112
|
// Watch form values for conditional field visibility
|
|
104
|
-
const isVirtual = Form.useWatch(
|
|
105
|
-
const iframeUrl = Form.useWatch(
|
|
106
|
-
const externalRedirectUrl = Form.useWatch(
|
|
113
|
+
const isVirtual = Form.useWatch('isVirtual', formProps.form);
|
|
114
|
+
const iframeUrl = Form.useWatch('iframeUrl', formProps.form);
|
|
115
|
+
const externalRedirectUrl = Form.useWatch(
|
|
116
|
+
'externalRedirectUrl',
|
|
117
|
+
formProps.form,
|
|
118
|
+
);
|
|
107
119
|
const hasExternalUrl = !!(
|
|
108
120
|
(iframeUrl && /^(https?:\/\/|\/\w)/.test(iframeUrl.trim())) ||
|
|
109
121
|
(externalRedirectUrl && /^https?:\/\//.test(externalRedirectUrl.trim()))
|
|
110
122
|
);
|
|
111
123
|
|
|
112
124
|
const [selectedResourceIds, setSelectedResourceIds] = useState<string[]>([]);
|
|
113
|
-
const [resourcePermissionMap, setResourcePermissionMap] = useState<
|
|
114
|
-
|
|
125
|
+
const [resourcePermissionMap, setResourcePermissionMap] = useState<
|
|
126
|
+
Record<number, string[]>
|
|
127
|
+
>({});
|
|
128
|
+
const [permissionValidationError, setPermissionValidationError] =
|
|
129
|
+
useState<string>('');
|
|
115
130
|
const [initialResourceAssignments, setInitialResourceAssignments] = useState<{
|
|
116
131
|
resourceIds: string[];
|
|
117
132
|
permissionMap: Record<number, string[]>;
|
|
118
133
|
}>({ resourceIds: [], permissionMap: {} });
|
|
119
|
-
const [initialFormValues, setInitialFormValues] =
|
|
134
|
+
const [initialFormValues, setInitialFormValues] =
|
|
135
|
+
useState<PageFormFieldValues>({});
|
|
120
136
|
const [isCodeManuallyEdited, setIsCodeManuallyEdited] = useState(false);
|
|
121
137
|
const [isPathManuallyEdited, setIsPathManuallyEdited] = useState(false);
|
|
122
138
|
|
|
123
139
|
// Set default values for create mode with parent
|
|
124
140
|
useEffect(() => {
|
|
125
|
-
if (formActionType ===
|
|
141
|
+
if (formActionType === 'create' && formProps.form) {
|
|
126
142
|
const initialValues: Partial<PageFormFieldValues> = {};
|
|
127
|
-
|
|
143
|
+
|
|
128
144
|
if (defaultParentId) {
|
|
129
145
|
initialValues.parentId = defaultParentId;
|
|
130
146
|
}
|
|
131
147
|
if (defaultPathPrefix) {
|
|
132
148
|
initialValues.path = defaultPathPrefix;
|
|
133
149
|
}
|
|
134
|
-
|
|
150
|
+
|
|
135
151
|
if (Object.keys(initialValues).length > 0) {
|
|
136
152
|
formProps.form.setFieldsValue(initialValues);
|
|
137
153
|
}
|
|
@@ -139,15 +155,17 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
139
155
|
}, [formActionType, defaultParentId, defaultPathPrefix, formProps.form]);
|
|
140
156
|
|
|
141
157
|
useEffect(() => {
|
|
142
|
-
if (formActionType ===
|
|
143
|
-
const initialSelectedIds = currentResourceAssignments.map(assignment =>
|
|
158
|
+
if (formActionType === 'edit' && currentResourceAssignments.length > 0) {
|
|
159
|
+
const initialSelectedIds = currentResourceAssignments.map((assignment) =>
|
|
144
160
|
String(assignment.resourceId),
|
|
145
161
|
);
|
|
146
162
|
setSelectedResourceIds(initialSelectedIds);
|
|
147
163
|
|
|
148
164
|
const initialPermissionMap: Record<number, string[]> = {};
|
|
149
|
-
currentResourceAssignments.forEach(assignment => {
|
|
150
|
-
initialPermissionMap[assignment.resourceId] = [
|
|
165
|
+
currentResourceAssignments.forEach((assignment) => {
|
|
166
|
+
initialPermissionMap[assignment.resourceId] = [
|
|
167
|
+
...assignment.assignedPermissions,
|
|
168
|
+
];
|
|
151
169
|
});
|
|
152
170
|
setResourcePermissionMap(initialPermissionMap);
|
|
153
171
|
|
|
@@ -161,7 +179,7 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
161
179
|
|
|
162
180
|
// Store initial form values when form is loaded in edit mode
|
|
163
181
|
useEffect(() => {
|
|
164
|
-
if (formActionType ===
|
|
182
|
+
if (formActionType === 'edit' && formProps.form) {
|
|
165
183
|
const currentValues = formProps.form.getFieldsValue();
|
|
166
184
|
setInitialFormValues({
|
|
167
185
|
name: currentValues.name,
|
|
@@ -179,26 +197,28 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
179
197
|
}, [formActionType, formProps.form, formProps.initialValues]);
|
|
180
198
|
|
|
181
199
|
const resourceTransferDataSource = useMemo(() => {
|
|
182
|
-
return allAvailableResources.map(resource => ({
|
|
200
|
+
return allAvailableResources.map((resource) => ({
|
|
183
201
|
key: String(resource.id),
|
|
184
202
|
title: resource.name,
|
|
185
|
-
description: resource.description ||
|
|
203
|
+
description: resource.description || '',
|
|
186
204
|
}));
|
|
187
205
|
}, [allAvailableResources]);
|
|
188
206
|
|
|
189
|
-
const handleResourceTransferChange: TransferProps[
|
|
207
|
+
const handleResourceTransferChange: TransferProps['onChange'] = (
|
|
208
|
+
newTargetKeys,
|
|
209
|
+
) => {
|
|
190
210
|
setSelectedResourceIds(newTargetKeys as string[]);
|
|
191
211
|
|
|
192
|
-
const newResourceIds = new Set(newTargetKeys.map(key => Number(key)));
|
|
193
|
-
setResourcePermissionMap(prevMap => {
|
|
212
|
+
const newResourceIds = new Set(newTargetKeys.map((key) => Number(key)));
|
|
213
|
+
setResourcePermissionMap((prevMap) => {
|
|
194
214
|
const updatedMap: Record<number, string[]> = {};
|
|
195
|
-
Object.keys(prevMap).forEach(resourceIdStr => {
|
|
215
|
+
Object.keys(prevMap).forEach((resourceIdStr) => {
|
|
196
216
|
const resourceId = Number(resourceIdStr);
|
|
197
217
|
if (newResourceIds.has(resourceId)) {
|
|
198
218
|
updatedMap[resourceId] = prevMap[resourceId];
|
|
199
219
|
}
|
|
200
220
|
});
|
|
201
|
-
newTargetKeys.forEach(key => {
|
|
221
|
+
newTargetKeys.forEach((key) => {
|
|
202
222
|
const resourceId = Number(key);
|
|
203
223
|
if (!updatedMap[resourceId]) {
|
|
204
224
|
updatedMap[resourceId] = []; // Initialize with empty array, user must select at least one permission
|
|
@@ -209,7 +229,7 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
209
229
|
|
|
210
230
|
// Clear validation error when user changes resource selection
|
|
211
231
|
if (permissionValidationError) {
|
|
212
|
-
setPermissionValidationError(
|
|
232
|
+
setPermissionValidationError('');
|
|
213
233
|
}
|
|
214
234
|
};
|
|
215
235
|
|
|
@@ -218,14 +238,16 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
218
238
|
permissionAction: string,
|
|
219
239
|
isChecked: boolean,
|
|
220
240
|
) => {
|
|
221
|
-
setResourcePermissionMap(prevMap => {
|
|
241
|
+
setResourcePermissionMap((prevMap) => {
|
|
222
242
|
const currentPermissions = prevMap[resourceId] || [];
|
|
223
243
|
let updatedPermissions: string[];
|
|
224
244
|
|
|
225
245
|
if (isChecked) {
|
|
226
246
|
updatedPermissions = [...currentPermissions, permissionAction];
|
|
227
247
|
} else {
|
|
228
|
-
updatedPermissions = currentPermissions.filter(
|
|
248
|
+
updatedPermissions = currentPermissions.filter(
|
|
249
|
+
(action) => action !== permissionAction,
|
|
250
|
+
);
|
|
229
251
|
}
|
|
230
252
|
|
|
231
253
|
return {
|
|
@@ -236,28 +258,32 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
236
258
|
|
|
237
259
|
// Clear validation error when user makes changes
|
|
238
260
|
if (permissionValidationError) {
|
|
239
|
-
setPermissionValidationError(
|
|
261
|
+
setPermissionValidationError('');
|
|
240
262
|
}
|
|
241
263
|
};
|
|
242
264
|
|
|
243
265
|
const filteredParentPageTreeOptions = useMemo(() => {
|
|
244
|
-
if (formActionType !==
|
|
266
|
+
if (formActionType !== 'edit' || !editingPageId || !parentPageTreeOptions) {
|
|
245
267
|
return parentPageTreeOptions;
|
|
246
268
|
}
|
|
247
269
|
|
|
248
|
-
const filterOutCurrentPage = (
|
|
270
|
+
const filterOutCurrentPage = (
|
|
271
|
+
nodes: PageMenuTreeNode[],
|
|
272
|
+
): PageMenuTreeNode[] => {
|
|
249
273
|
return nodes
|
|
250
|
-
.filter(node => String(node.value) !== String(editingPageId))
|
|
251
|
-
.map(node => ({
|
|
274
|
+
.filter((node) => String(node.value) !== String(editingPageId))
|
|
275
|
+
.map((node) => ({
|
|
252
276
|
...node,
|
|
253
|
-
children: node.children
|
|
277
|
+
children: node.children
|
|
278
|
+
? filterOutCurrentPage(node.children)
|
|
279
|
+
: undefined,
|
|
254
280
|
}));
|
|
255
281
|
};
|
|
256
282
|
|
|
257
283
|
return filterOutCurrentPage(parentPageTreeOptions);
|
|
258
284
|
}, [parentPageTreeOptions, formActionType, editingPageId]);
|
|
259
285
|
|
|
260
|
-
formProps.onFinish = values => {
|
|
286
|
+
formProps.onFinish = (values) => {
|
|
261
287
|
// Clear path when external URL is configured (iframe or redirect)
|
|
262
288
|
if (!hasExternalUrl) {
|
|
263
289
|
values.path = null;
|
|
@@ -265,24 +291,26 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
265
291
|
|
|
266
292
|
// Validate that each selected resource has at least one permission
|
|
267
293
|
const resourcesWithoutPermissions: string[] = [];
|
|
268
|
-
selectedResourceIds.forEach(resourceIdStr => {
|
|
294
|
+
selectedResourceIds.forEach((resourceIdStr) => {
|
|
269
295
|
const resourceId = Number(resourceIdStr);
|
|
270
296
|
const permissions = resourcePermissionMap[resourceId] || [];
|
|
271
297
|
if (permissions.length === 0) {
|
|
272
|
-
const resource = allAvailableResources.find(r => r.id === resourceId);
|
|
273
|
-
resourcesWithoutPermissions.push(
|
|
298
|
+
const resource = allAvailableResources.find((r) => r.id === resourceId);
|
|
299
|
+
resourcesWithoutPermissions.push(
|
|
300
|
+
resource?.name || `Resource ${resourceId}`,
|
|
301
|
+
);
|
|
274
302
|
}
|
|
275
303
|
});
|
|
276
304
|
|
|
277
305
|
if (resourcesWithoutPermissions.length > 0) {
|
|
278
306
|
setPermissionValidationError(
|
|
279
|
-
`The following resources must have at least one permission selected: ${resourcesWithoutPermissions.join(
|
|
307
|
+
`The following resources must have at least one permission selected: ${resourcesWithoutPermissions.join(', ')}`,
|
|
280
308
|
);
|
|
281
309
|
return;
|
|
282
310
|
}
|
|
283
311
|
|
|
284
312
|
// In edit mode, check if anything has changed
|
|
285
|
-
if (formActionType ===
|
|
313
|
+
if (formActionType === 'edit') {
|
|
286
314
|
// Check if form fields have changed
|
|
287
315
|
const formFieldsChanged =
|
|
288
316
|
values.name !== initialFormValues.name ||
|
|
@@ -298,8 +326,11 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
298
326
|
|
|
299
327
|
// Check if resource assignments have changed
|
|
300
328
|
const resourceIdsChanged =
|
|
301
|
-
selectedResourceIds.length !==
|
|
302
|
-
|
|
329
|
+
selectedResourceIds.length !==
|
|
330
|
+
initialResourceAssignments.resourceIds.length ||
|
|
331
|
+
selectedResourceIds.some(
|
|
332
|
+
(id) => !initialResourceAssignments.resourceIds.includes(id),
|
|
333
|
+
);
|
|
303
334
|
|
|
304
335
|
let permissionsChanged = false;
|
|
305
336
|
if (!resourceIdsChanged) {
|
|
@@ -307,11 +338,12 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
307
338
|
for (const resourceIdStr of selectedResourceIds) {
|
|
308
339
|
const resourceId = Number(resourceIdStr);
|
|
309
340
|
const currentPermissions = resourcePermissionMap[resourceId] || [];
|
|
310
|
-
const initialPermissions =
|
|
341
|
+
const initialPermissions =
|
|
342
|
+
initialResourceAssignments.permissionMap[resourceId] || [];
|
|
311
343
|
|
|
312
344
|
if (
|
|
313
345
|
currentPermissions.length !== initialPermissions.length ||
|
|
314
|
-
currentPermissions.some(p => !initialPermissions.includes(p))
|
|
346
|
+
currentPermissions.some((p) => !initialPermissions.includes(p))
|
|
315
347
|
) {
|
|
316
348
|
permissionsChanged = true;
|
|
317
349
|
break;
|
|
@@ -322,9 +354,9 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
322
354
|
// If nothing has changed, don't submit
|
|
323
355
|
if (!formFieldsChanged && !resourceIdsChanged && !permissionsChanged) {
|
|
324
356
|
Modal.info({
|
|
325
|
-
title:
|
|
357
|
+
title: 'No Changes Detected',
|
|
326
358
|
content:
|
|
327
|
-
|
|
359
|
+
'No changes have been made to the form. The form will be closed without submitting.',
|
|
328
360
|
});
|
|
329
361
|
close();
|
|
330
362
|
return;
|
|
@@ -338,28 +370,36 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
338
370
|
|
|
339
371
|
// Only include resourceAssignments if they changed
|
|
340
372
|
if (resourceIdsChanged || permissionsChanged) {
|
|
341
|
-
formattedValuesForSubmit.resourceAssignments = selectedResourceIds.map(
|
|
373
|
+
formattedValuesForSubmit.resourceAssignments = selectedResourceIds.map(
|
|
374
|
+
(resourceIdStr) => {
|
|
375
|
+
const resourceId = Number(resourceIdStr);
|
|
376
|
+
const resource = allAvailableResources.find(
|
|
377
|
+
(r) => r.id === resourceId,
|
|
378
|
+
);
|
|
379
|
+
return {
|
|
380
|
+
resourceId,
|
|
381
|
+
resourceName: resource?.name || '',
|
|
382
|
+
assignedPermissions: resourcePermissionMap[resourceId] || [],
|
|
383
|
+
};
|
|
384
|
+
},
|
|
385
|
+
);
|
|
386
|
+
}
|
|
387
|
+
onFinish(formattedValuesForSubmit);
|
|
388
|
+
} else {
|
|
389
|
+
// In create mode, always submit all data
|
|
390
|
+
const resourceAssignmentsForSubmit = selectedResourceIds.map(
|
|
391
|
+
(resourceIdStr) => {
|
|
342
392
|
const resourceId = Number(resourceIdStr);
|
|
343
|
-
const resource = allAvailableResources.find(
|
|
393
|
+
const resource = allAvailableResources.find(
|
|
394
|
+
(r) => r.id === resourceId,
|
|
395
|
+
);
|
|
344
396
|
return {
|
|
345
397
|
resourceId,
|
|
346
|
-
resourceName: resource?.name ||
|
|
398
|
+
resourceName: resource?.name || '',
|
|
347
399
|
assignedPermissions: resourcePermissionMap[resourceId] || [],
|
|
348
400
|
};
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
onFinish(formattedValuesForSubmit);
|
|
352
|
-
} else {
|
|
353
|
-
// In create mode, always submit all data
|
|
354
|
-
const resourceAssignmentsForSubmit = selectedResourceIds.map(resourceIdStr => {
|
|
355
|
-
const resourceId = Number(resourceIdStr);
|
|
356
|
-
const resource = allAvailableResources.find(r => r.id === resourceId);
|
|
357
|
-
return {
|
|
358
|
-
resourceId,
|
|
359
|
-
resourceName: resource?.name || "",
|
|
360
|
-
assignedPermissions: resourcePermissionMap[resourceId] || [],
|
|
361
|
-
};
|
|
362
|
-
});
|
|
401
|
+
},
|
|
402
|
+
);
|
|
363
403
|
|
|
364
404
|
const formattedValuesForSubmit = {
|
|
365
405
|
...values,
|
|
@@ -373,21 +413,26 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
373
413
|
|
|
374
414
|
const resourcePermissionTableColumns = [
|
|
375
415
|
{
|
|
376
|
-
title:
|
|
377
|
-
dataIndex:
|
|
378
|
-
key:
|
|
379
|
-
width:
|
|
416
|
+
title: 'Resource Name',
|
|
417
|
+
dataIndex: 'resourceName',
|
|
418
|
+
key: 'resourceName',
|
|
419
|
+
width: '30%',
|
|
380
420
|
},
|
|
381
421
|
{
|
|
382
|
-
title:
|
|
383
|
-
key:
|
|
384
|
-
render: (
|
|
422
|
+
title: 'Permissions',
|
|
423
|
+
key: 'permissions',
|
|
424
|
+
render: (
|
|
425
|
+
_: any,
|
|
426
|
+
record: { resourceId: number; resourceName: string },
|
|
427
|
+
) => (
|
|
385
428
|
<Space>
|
|
386
|
-
{AVAILABLE_PERMISSION_ACTIONS.map(permissionAction => (
|
|
429
|
+
{AVAILABLE_PERMISSION_ACTIONS.map((permissionAction) => (
|
|
387
430
|
<Checkbox
|
|
388
431
|
key={`${record.resourceId}-${permissionAction}`}
|
|
389
|
-
checked={resourcePermissionMap[record.resourceId]?.includes(
|
|
390
|
-
|
|
432
|
+
checked={resourcePermissionMap[record.resourceId]?.includes(
|
|
433
|
+
permissionAction,
|
|
434
|
+
)}
|
|
435
|
+
onChange={(e) =>
|
|
391
436
|
handleResourcePermissionChange(
|
|
392
437
|
record.resourceId,
|
|
393
438
|
permissionAction,
|
|
@@ -404,9 +449,9 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
404
449
|
];
|
|
405
450
|
|
|
406
451
|
const selectedResourcesForPermissionTable = useMemo(() => {
|
|
407
|
-
return selectedResourceIds.map(resourceIdStr => {
|
|
452
|
+
return selectedResourceIds.map((resourceIdStr) => {
|
|
408
453
|
const resourceId = Number(resourceIdStr);
|
|
409
|
-
const resource = allAvailableResources.find(r => r.id === resourceId);
|
|
454
|
+
const resource = allAvailableResources.find((r) => r.id === resourceId);
|
|
410
455
|
return {
|
|
411
456
|
resourceId,
|
|
412
457
|
resourceName: resource?.name || `Resource ${resourceId}`,
|
|
@@ -425,19 +470,22 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
425
470
|
}
|
|
426
471
|
close();
|
|
427
472
|
}}
|
|
428
|
-
title={formActionType ===
|
|
473
|
+
title={formActionType === 'create' ? 'Create New Page' : 'Edit Page'}
|
|
429
474
|
>
|
|
430
475
|
<Form {...formProps} layout="vertical">
|
|
431
476
|
<Form.Item
|
|
432
477
|
rules={[
|
|
433
|
-
{ required: true, message:
|
|
478
|
+
{ required: true, message: 'Page name is required' },
|
|
434
479
|
{
|
|
435
480
|
validator: (_, value) => {
|
|
436
|
-
if (
|
|
481
|
+
if (
|
|
482
|
+
!value ||
|
|
483
|
+
!SPECIAL_CHARACTER_VALIDATION_PATTERN.test(value)
|
|
484
|
+
) {
|
|
437
485
|
return Promise.resolve();
|
|
438
486
|
}
|
|
439
487
|
return Promise.reject(
|
|
440
|
-
new Error(
|
|
488
|
+
new Error('Special characters are not allowed in page name.'),
|
|
441
489
|
);
|
|
442
490
|
},
|
|
443
491
|
},
|
|
@@ -452,10 +500,12 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
452
500
|
// Check if page name already exists (case-insensitive)
|
|
453
501
|
const isDuplicate = allPagesData.some((page: any) => {
|
|
454
502
|
// Skip current page when editing
|
|
455
|
-
if (formActionType ===
|
|
503
|
+
if (formActionType === 'edit' && page.id === editingPageId) {
|
|
456
504
|
return false;
|
|
457
505
|
}
|
|
458
|
-
return
|
|
506
|
+
return (
|
|
507
|
+
page.name?.toLowerCase() === trimmedValue.toLowerCase()
|
|
508
|
+
);
|
|
459
509
|
});
|
|
460
510
|
|
|
461
511
|
if (isDuplicate) {
|
|
@@ -475,24 +525,28 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
475
525
|
>
|
|
476
526
|
<Input
|
|
477
527
|
placeholder="Enter the page name (e.g., User Management)."
|
|
478
|
-
onChange={e => {
|
|
528
|
+
onChange={(e) => {
|
|
479
529
|
const nameValue = e.target.value;
|
|
480
530
|
// Auto-generate code from name if code hasn't been manually edited
|
|
481
531
|
if (!isCodeManuallyEdited && nameValue) {
|
|
482
532
|
const generatedCode = nameValue
|
|
483
533
|
.trim()
|
|
484
534
|
.toLowerCase()
|
|
485
|
-
.replace(/[\s-]+/g,
|
|
486
|
-
.replace(/[^a-z0-9_]/g,
|
|
535
|
+
.replace(/[\s-]+/g, '_') // Replace spaces and hyphens with underscores
|
|
536
|
+
.replace(/[^a-z0-9_]/g, ''); // Remove invalid characters
|
|
487
537
|
formProps.form?.setFieldsValue({ code: generatedCode });
|
|
488
538
|
}
|
|
489
539
|
// Auto-generate path from name if path hasn't been manually edited (only in create mode)
|
|
490
|
-
if (
|
|
540
|
+
if (
|
|
541
|
+
!isPathManuallyEdited &&
|
|
542
|
+
nameValue &&
|
|
543
|
+
formActionType === 'create'
|
|
544
|
+
) {
|
|
491
545
|
const generatedPathSegment = nameValue
|
|
492
546
|
.trim()
|
|
493
547
|
.toLowerCase()
|
|
494
|
-
.replace(/[\s_]+/g,
|
|
495
|
-
.replace(/[^a-z0-9-/]/g,
|
|
548
|
+
.replace(/[\s_]+/g, '-') // Replace spaces and underscores with hyphens
|
|
549
|
+
.replace(/[^a-z0-9-/]/g, ''); // Remove invalid characters
|
|
496
550
|
const newPath = defaultPathPrefix + generatedPathSegment;
|
|
497
551
|
formProps.form?.setFieldsValue({ path: newPath });
|
|
498
552
|
}
|
|
@@ -501,10 +555,11 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
501
555
|
</Form.Item>
|
|
502
556
|
<Form.Item
|
|
503
557
|
rules={[
|
|
504
|
-
{ required: true, message:
|
|
558
|
+
{ required: true, message: 'Page Code is required' },
|
|
505
559
|
{
|
|
506
560
|
pattern: /^[a-zA-Z0-9_]+$/,
|
|
507
|
-
message:
|
|
561
|
+
message:
|
|
562
|
+
'Page Code can only contain letters, numbers and underscores',
|
|
508
563
|
},
|
|
509
564
|
{
|
|
510
565
|
validator: async (_, value) => {
|
|
@@ -517,15 +572,19 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
517
572
|
// Check if page code already exists (case-insensitive)
|
|
518
573
|
const isDuplicate = allPagesData.some((page: any) => {
|
|
519
574
|
// Skip current page when editing
|
|
520
|
-
if (formActionType ===
|
|
575
|
+
if (formActionType === 'edit' && page.id === editingPageId) {
|
|
521
576
|
return false;
|
|
522
577
|
}
|
|
523
|
-
return
|
|
578
|
+
return (
|
|
579
|
+
page.code?.toLowerCase() === trimmedValue.toLowerCase()
|
|
580
|
+
);
|
|
524
581
|
});
|
|
525
582
|
|
|
526
583
|
if (isDuplicate) {
|
|
527
584
|
return Promise.reject(
|
|
528
|
-
new Error(
|
|
585
|
+
new Error(
|
|
586
|
+
'Page Code already exists. Please use a different code.',
|
|
587
|
+
),
|
|
529
588
|
);
|
|
530
589
|
}
|
|
531
590
|
|
|
@@ -554,7 +613,7 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
554
613
|
<Form.Item name="parentId" label="Parent Page (Menu Position)">
|
|
555
614
|
{filteredParentPageTreeOptions?.length ? (
|
|
556
615
|
<TreeSelect
|
|
557
|
-
style={{ width:
|
|
616
|
+
style={{ width: '100%' }}
|
|
558
617
|
treeData={filteredParentPageTreeOptions}
|
|
559
618
|
treeDefaultExpandAll
|
|
560
619
|
allowClear
|
|
@@ -563,7 +622,8 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
563
622
|
) : (
|
|
564
623
|
<>
|
|
565
624
|
<Typography.Text type="secondary">
|
|
566
|
-
No parent pages available. This page will be created at root
|
|
625
|
+
No parent pages available. This page will be created at root
|
|
626
|
+
level.
|
|
567
627
|
</Typography.Text>
|
|
568
628
|
<Input type="hidden" />
|
|
569
629
|
</>
|
|
@@ -585,7 +645,7 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
585
645
|
</Form.Item>
|
|
586
646
|
<Form.Item
|
|
587
647
|
name="iframeUrl"
|
|
588
|
-
label={
|
|
648
|
+
label={'Iframe URL'}
|
|
589
649
|
tooltip={{
|
|
590
650
|
title: (
|
|
591
651
|
<div>
|
|
@@ -597,7 +657,7 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
597
657
|
</p>
|
|
598
658
|
<ul style={{ margin: 0, paddingLeft: 16 }}>
|
|
599
659
|
<li>
|
|
600
|
-
<code>{
|
|
660
|
+
<code>{'{{locale}}'}</code> → 当前语言 (en/zh_CN)
|
|
601
661
|
</li>
|
|
602
662
|
</ul>
|
|
603
663
|
<p style={{ marginTop: 8 }}>
|
|
@@ -607,12 +667,16 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
607
667
|
),
|
|
608
668
|
overlayStyle: { maxWidth: 320 },
|
|
609
669
|
}}
|
|
610
|
-
dependencies={[
|
|
670
|
+
dependencies={['externalRedirectUrl']}
|
|
611
671
|
rules={[
|
|
612
672
|
{
|
|
613
673
|
validator: (_, value) => {
|
|
614
674
|
if (value?.trim() && externalRedirectUrl?.trim()) {
|
|
615
|
-
return Promise.reject(
|
|
675
|
+
return Promise.reject(
|
|
676
|
+
new Error(
|
|
677
|
+
'不能同时填写 Iframe URL 和 External Redirect URL,请只填其中一个',
|
|
678
|
+
),
|
|
679
|
+
);
|
|
616
680
|
}
|
|
617
681
|
return Promise.resolve();
|
|
618
682
|
},
|
|
@@ -623,21 +687,29 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
623
687
|
</Form.Item>
|
|
624
688
|
<Form.Item
|
|
625
689
|
name="externalRedirectUrl"
|
|
626
|
-
dependencies={[
|
|
627
|
-
label={
|
|
690
|
+
dependencies={['iframeUrl']}
|
|
691
|
+
label={'External Redirect URL'}
|
|
628
692
|
tooltip={{
|
|
629
|
-
title:
|
|
693
|
+
title: (
|
|
694
|
+
<p style={{ marginBottom: 8 }}>
|
|
695
|
+
设置后,页面将打开一个新标签并跳转到指定的外部链接。
|
|
696
|
+
</p>
|
|
697
|
+
),
|
|
630
698
|
overlayStyle: { maxWidth: 320 },
|
|
631
699
|
}}
|
|
632
700
|
rules={[
|
|
633
701
|
{
|
|
634
|
-
type:
|
|
635
|
-
message:
|
|
702
|
+
type: 'url',
|
|
703
|
+
message: 'Please enter a valid URL',
|
|
636
704
|
},
|
|
637
705
|
{
|
|
638
706
|
validator: (_, value) => {
|
|
639
707
|
if (value?.trim() && iframeUrl?.trim()) {
|
|
640
|
-
return Promise.reject(
|
|
708
|
+
return Promise.reject(
|
|
709
|
+
new Error(
|
|
710
|
+
'不能同时填写 Iframe URL 和 External Redirect URL,请只填其中一个',
|
|
711
|
+
),
|
|
712
|
+
);
|
|
641
713
|
}
|
|
642
714
|
return Promise.resolve();
|
|
643
715
|
},
|
|
@@ -651,11 +723,16 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
651
723
|
rules={[
|
|
652
724
|
{
|
|
653
725
|
validator: (_, value) => {
|
|
654
|
-
if (
|
|
726
|
+
if (
|
|
727
|
+
!value ||
|
|
728
|
+
!SPECIAL_CHARACTER_VALIDATION_PATTERN.test(value)
|
|
729
|
+
) {
|
|
655
730
|
return Promise.resolve();
|
|
656
731
|
}
|
|
657
732
|
return Promise.reject(
|
|
658
|
-
new Error(
|
|
733
|
+
new Error(
|
|
734
|
+
'Special characters are not allowed in path.',
|
|
735
|
+
),
|
|
659
736
|
);
|
|
660
737
|
},
|
|
661
738
|
},
|
|
@@ -678,16 +755,19 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
678
755
|
</>
|
|
679
756
|
)}
|
|
680
757
|
<Form.Item name="description" label="Page Description">
|
|
681
|
-
<Input.TextArea
|
|
758
|
+
<Input.TextArea
|
|
759
|
+
rows={2}
|
|
760
|
+
placeholder="Enter a brief description of this page's purpose"
|
|
761
|
+
/>
|
|
682
762
|
</Form.Item>
|
|
683
763
|
<Divider>Resource Assignment & Permissions</Divider>
|
|
684
764
|
<Form.Item label="Select Resources to Assign">
|
|
685
765
|
<Transfer
|
|
686
766
|
dataSource={resourceTransferDataSource}
|
|
687
|
-
titles={[
|
|
767
|
+
titles={['Available Resources', 'Assigned Resources']}
|
|
688
768
|
targetKeys={selectedResourceIds}
|
|
689
769
|
onChange={handleResourceTransferChange}
|
|
690
|
-
render={item => item.title}
|
|
770
|
+
render={(item) => item.title}
|
|
691
771
|
showSearch
|
|
692
772
|
filterOption={(inputValue, item) =>
|
|
693
773
|
item.title.toLowerCase().includes(inputValue.toLowerCase()) ||
|
|
@@ -699,8 +779,8 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
699
779
|
{selectedResourceIds.length > 0 && (
|
|
700
780
|
<Form.Item
|
|
701
781
|
label="Configure Permissions for Each Resource"
|
|
702
|
-
validateStatus={permissionValidationError ?
|
|
703
|
-
help={permissionValidationError ||
|
|
782
|
+
validateStatus={permissionValidationError ? 'error' : ''}
|
|
783
|
+
help={permissionValidationError || ''}
|
|
704
784
|
>
|
|
705
785
|
<Table
|
|
706
786
|
dataSource={selectedResourcesForPermissionTable}
|
|
@@ -712,12 +792,16 @@ export const PageFormModal: React.FC<PageFormModalProps> = ({
|
|
|
712
792
|
/>
|
|
713
793
|
</Form.Item>
|
|
714
794
|
)}
|
|
715
|
-
{formActionType ===
|
|
795
|
+
{formActionType === 'edit' && currentResourceAssignments.length > 0 && (
|
|
716
796
|
<Form.Item label="Current Permission Overview">
|
|
717
797
|
<Space wrap>
|
|
718
798
|
{Array.from(
|
|
719
|
-
new Set(
|
|
720
|
-
|
|
799
|
+
new Set(
|
|
800
|
+
currentResourceAssignments.flatMap(
|
|
801
|
+
(a) => a.assignedPermissions,
|
|
802
|
+
),
|
|
803
|
+
),
|
|
804
|
+
).map((permissionAction) => (
|
|
721
805
|
<Tag key={permissionAction} color="blue">
|
|
722
806
|
{permissionAction}
|
|
723
807
|
</Tag>
|