Skip to content

Commit a39a297

Browse files
authored
Merge pull request #1027 from topcoder-platform/dev
[PROD RELEASE] - Q2
2 parents b6974c0 + 70c8f4a commit a39a297

File tree

897 files changed

+29977
-22239
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

897 files changed

+29977
-22239
lines changed

.circleci/config.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ workflows:
221221
- dev
222222
- LVT-256
223223
- CORE-635
224+
- feat/system-admin
224225

225226
- deployQa:
226227
context: org-global

.github/workflows/code_reviewer.yml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
name: AI PR Reviewer
2+
3+
on:
4+
pull_request:
5+
types:
6+
- opened
7+
- synchronize
8+
permissions:
9+
pull-requests: write
10+
jobs:
11+
tc-ai-pr-review:
12+
runs-on: ubuntu-latest
13+
steps:
14+
- name: Checkout Repo
15+
uses: actions/checkout@v3
16+
17+
- name: TC AI PR Reviewer
18+
uses: topcoder-platform/tc-ai-pr-reviewer@master
19+
with:
20+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # The GITHUB_TOKEN is there by default so you just need to keep it like it is and not necessarily need to add it as secret as it will throw an error. [More Details](https://docs.github.com/en/actions/security-guides/automatic-token-authentication#about-the-github_token-secret)
21+
LAB45_API_KEY: ${{ secrets.LAB45_API_KEY }}
22+
exclude: '**/*.json, **/*.md, **/*.jpg, **/*.png, **/*.jpeg, **/*.bmp, **/*.webp' # Optional: exclude patterns separated by commas

package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
"dependencies": {
2222
"@datadog/browser-logs": "^4.21.2",
2323
"@heroicons/react": "^1.0.6",
24+
"@hookform/resolvers": "^4.1.2",
2425
"@popperjs/core": "^2.11.8",
2526
"@sprig-technologies/sprig-browser": "^2.20.1",
2627
"@storybook/addon-actions": "7.6.10",
@@ -71,6 +72,7 @@
7172
"react-elastic-carousel": "^0.11.5",
7273
"react-gtm-module": "^2.0.11",
7374
"react-helmet": "^6.1.0",
75+
"react-hook-form": "^7.54.2",
7476
"react-markdown": "8.0.6",
7577
"react-otp-input": "^3.1.1",
7678
"react-popper": "^2.3.0",
@@ -101,7 +103,8 @@
101103
"tc-auth-lib": "topcoder-platform/tc-auth-lib#1.0.27",
102104
"typescript": "^4.8.4",
103105
"universal-navigation": "https://github.com/topcoder-platform/universal-navigation#9fc50d938be7182",
104-
"uuid": "^9.0.0"
106+
"uuid": "^11.1.0",
107+
"yup": "^1.6.1"
105108
},
106109
"devDependencies": {
107110
"@babel/core": "^7.19.3",
File renamed without changes.

src/apps/admin/src/AdminApp.tsx

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { FC, useContext, useEffect, useMemo } from 'react'
2+
import { Outlet, Routes } from 'react-router-dom'
3+
4+
import { routerContext, RouterContextData } from '~/libs/core'
5+
6+
import { AdminAppContextProvider, Layout, SWRConfigProvider } from './lib'
7+
import { toolTitle } from './admin-app.routes'
8+
import './lib/styles/index.scss'
9+
10+
/**
11+
* The admin app.
12+
*/
13+
const AdminApp: FC = () => {
14+
const { getChildRoutes }: RouterContextData = useContext(routerContext)
15+
// eslint-disable-next-line react-hooks/exhaustive-deps -- missing dependency: getChildRoutes
16+
const childRoutes = useMemo(() => getChildRoutes(toolTitle), [])
17+
18+
useEffect(() => {
19+
document.body.classList.add('admin-app')
20+
return () => {
21+
document.body.classList.remove('admin-app')
22+
}
23+
}, [])
24+
25+
return (
26+
<div>
27+
<AdminAppContextProvider>
28+
<SWRConfigProvider>
29+
<Layout>
30+
<Outlet />
31+
<Routes>{childRoutes}</Routes>
32+
</Layout>
33+
</SWRConfigProvider>
34+
</AdminAppContextProvider>
35+
</div>
36+
)
37+
}
38+
39+
export default AdminApp
Lines changed: 267 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,267 @@
1+
import { AppSubdomain, ToolTitle } from '~/config'
2+
import {
3+
lazyLoad,
4+
LazyLoadedComponent,
5+
PlatformRoute,
6+
Rewrite,
7+
UserRole,
8+
} from '~/libs/core'
9+
10+
import {
11+
billingAccountRouteId,
12+
manageChallengeRouteId,
13+
manageReviewRouteId,
14+
permissionManagementRouteId,
15+
rootRoute,
16+
userManagementRouteId,
17+
} from './config/routes.config'
18+
19+
const AdminApp: LazyLoadedComponent = lazyLoad(() => import('./AdminApp'))
20+
21+
const ChallengeManagement: LazyLoadedComponent = lazyLoad(
22+
() => import('./challenge-management/ChallengeManagement'),
23+
)
24+
const ChallengeManagementPage: LazyLoadedComponent = lazyLoad(
25+
() => import('./challenge-management/ChallengeManagementPage'),
26+
'ChallengeManagementPage',
27+
)
28+
const ManageUserPage: LazyLoadedComponent = lazyLoad(
29+
() => import('./challenge-management/ManageUserPage'),
30+
'ManageUserPage',
31+
)
32+
const ManageSubmissionPage: LazyLoadedComponent = lazyLoad(
33+
() => import('./challenge-management/ManageSubmissionPage'),
34+
'ManageSubmissionPage',
35+
)
36+
const UserManagementPage: LazyLoadedComponent = lazyLoad(
37+
() => import('./user-management/UserManagementPage'),
38+
'UserManagementPage',
39+
)
40+
const ReviewManagement: LazyLoadedComponent = lazyLoad(
41+
() => import('./review-management/ReviewManagement'),
42+
)
43+
const ReviewManagementPage: LazyLoadedComponent = lazyLoad(
44+
() => import('./review-management/ReviewManagementPage'),
45+
'ReviewManagementPage',
46+
)
47+
const ManageReviewerPage: LazyLoadedComponent = lazyLoad(
48+
() => import('./review-management/ManageReviewerPage'),
49+
'ManageReviewerPage',
50+
)
51+
const BillingAccount: LazyLoadedComponent = lazyLoad(
52+
() => import('./billing-account/BillingAccount'),
53+
)
54+
const BillingAccountsPage: LazyLoadedComponent = lazyLoad(
55+
() => import('./billing-account/BillingAccountsPage'),
56+
'BillingAccountsPage',
57+
)
58+
const BillingAccountNewPage: LazyLoadedComponent = lazyLoad(
59+
() => import('./billing-account/BillingAccountNewPage'),
60+
'BillingAccountNewPage',
61+
)
62+
const BillingAccountDetailsPage: LazyLoadedComponent = lazyLoad(
63+
() => import('./billing-account/BillingAccountDetailsPage'),
64+
'BillingAccountDetailsPage',
65+
)
66+
const BillingAccountResourcesPage: LazyLoadedComponent = lazyLoad(
67+
() => import('./billing-account/BillingAccountResourcesPage'),
68+
'BillingAccountResourcesPage',
69+
)
70+
const BillingAccountResourceNewPage: LazyLoadedComponent = lazyLoad(
71+
() => import('./billing-account/BillingAccountResourceNewPage'),
72+
'BillingAccountResourceNewPage',
73+
)
74+
const ClientsPage: LazyLoadedComponent = lazyLoad(
75+
() => import('./billing-account/ClientsPage'),
76+
'ClientsPage',
77+
)
78+
const ClientEditPage: LazyLoadedComponent = lazyLoad(
79+
() => import('./billing-account/ClientEditPage'),
80+
'ClientEditPage',
81+
)
82+
const PermissionManagement: LazyLoadedComponent = lazyLoad(
83+
() => import('./permission-management/PermissionManagement'),
84+
)
85+
const PermissionRolesPage: LazyLoadedComponent = lazyLoad(
86+
() => import('./permission-management/PermissionRolesPage'),
87+
'PermissionRolesPage',
88+
)
89+
const PermissionRoleMembersPage: LazyLoadedComponent = lazyLoad(
90+
() => import('./permission-management/PermissionRoleMembersPage'),
91+
'PermissionRoleMembersPage',
92+
)
93+
const PermissionAddRoleMembersPage: LazyLoadedComponent = lazyLoad(
94+
() => import('./permission-management/PermissionAddRoleMembersPage'),
95+
'PermissionAddRoleMembersPage',
96+
)
97+
const PermissionGroupsPage: LazyLoadedComponent = lazyLoad(
98+
() => import('./permission-management/PermissionGroupsPage'),
99+
'PermissionGroupsPage',
100+
)
101+
const PermissionGroupMembersPage: LazyLoadedComponent = lazyLoad(
102+
() => import('./permission-management/PermissionGroupMembersPage'),
103+
'PermissionGroupMembersPage',
104+
)
105+
const PermissionAddGroupMembersPage: LazyLoadedComponent = lazyLoad(
106+
() => import('./permission-management/PermissionAddGroupMembersPage'),
107+
'PermissionAddGroupMembersPage',
108+
)
109+
110+
export const toolTitle: string = ToolTitle.admin
111+
112+
export const adminRoutes: ReadonlyArray<PlatformRoute> = [
113+
// Admin App Root
114+
{
115+
authRequired: true,
116+
children: [
117+
{
118+
element: <Rewrite to={manageChallengeRouteId} />,
119+
route: '',
120+
},
121+
// Challenge Management Module
122+
{
123+
children: [
124+
{
125+
element: <ChallengeManagementPage />,
126+
id: 'challenge-management-page',
127+
route: '',
128+
},
129+
{
130+
element: <ManageUserPage />,
131+
id: 'manage-user',
132+
route: ':challengeId/manage-user',
133+
},
134+
{
135+
element: <ManageSubmissionPage />,
136+
id: 'manage-resource',
137+
route: ':challengeId/manage-submission',
138+
},
139+
],
140+
element: <ChallengeManagement />,
141+
id: manageChallengeRouteId,
142+
route: manageChallengeRouteId,
143+
},
144+
// User Management Module
145+
{
146+
element: <UserManagementPage />,
147+
id: userManagementRouteId,
148+
route: userManagementRouteId,
149+
},
150+
// Reviewer Management Module
151+
{
152+
children: [
153+
{
154+
element: <ReviewManagementPage />,
155+
id: 'review-management-page',
156+
route: '',
157+
},
158+
{
159+
element: <ManageReviewerPage />,
160+
id: 'manage-reviewer',
161+
route: ':challengeId/manage-reviewer',
162+
},
163+
],
164+
element: <ReviewManagement />,
165+
id: manageReviewRouteId,
166+
route: manageReviewRouteId,
167+
},
168+
// Billing Account Module
169+
{
170+
children: [
171+
{
172+
element: <BillingAccountsPage />,
173+
id: 'billing-accounts-page',
174+
route: 'billing-accounts',
175+
},
176+
{
177+
element: <BillingAccountNewPage />,
178+
id: 'billing-account-new-page',
179+
route: 'billing-accounts/new',
180+
},
181+
{
182+
element: <BillingAccountDetailsPage />,
183+
id: 'billing-account-details-page',
184+
route: 'billing-accounts/:accountId/details',
185+
},
186+
{
187+
element: <BillingAccountResourcesPage />,
188+
id: 'billing-account-resources-page',
189+
route: 'billing-accounts/:accountId/resources',
190+
},
191+
{
192+
element: <BillingAccountNewPage />,
193+
id: 'billing-account-resources-page',
194+
route: 'billing-accounts/:accountId/edit',
195+
},
196+
{
197+
element: <BillingAccountResourceNewPage />,
198+
id: 'billing-account-resource-new-page',
199+
route: 'billing-accounts/:accountId/resources/new',
200+
},
201+
{
202+
element: <ClientsPage />,
203+
id: 'billing-account-clients-page',
204+
route: 'clients',
205+
},
206+
{
207+
element: <ClientEditPage />,
208+
id: 'billing-account-client-edit-page',
209+
route: 'clients/:clientId/edit',
210+
},
211+
{
212+
element: <ClientEditPage />,
213+
id: 'billing-account-client-edit-page',
214+
route: 'clients/new',
215+
},
216+
],
217+
element: <BillingAccount />,
218+
id: billingAccountRouteId,
219+
route: billingAccountRouteId,
220+
},
221+
// Permission Management Module
222+
{
223+
children: [
224+
{
225+
element: <PermissionRolesPage />,
226+
id: 'permission-roles-page',
227+
route: 'roles',
228+
},
229+
{
230+
element: <PermissionRoleMembersPage />,
231+
id: 'permission-role-members-page',
232+
route: 'roles/:roleId/role-members',
233+
},
234+
{
235+
element: <PermissionAddRoleMembersPage />,
236+
id: 'permission-add-role-members-page',
237+
route: 'roles/:roleId/role-members/add',
238+
},
239+
{
240+
element: <PermissionGroupsPage />,
241+
id: 'permission-groups-page',
242+
route: 'groups',
243+
},
244+
{
245+
element: <PermissionGroupMembersPage />,
246+
id: 'permission-group-members-page',
247+
route: 'groups/:groupId/group-members',
248+
},
249+
{
250+
element: <PermissionAddGroupMembersPage />,
251+
id: 'permission-add-group-members-page',
252+
route: 'groups/:groupId/group-members/add',
253+
},
254+
],
255+
element: <PermissionManagement />,
256+
id: permissionManagementRouteId,
257+
route: permissionManagementRouteId,
258+
},
259+
],
260+
domain: AppSubdomain.admin,
261+
element: <AdminApp />,
262+
id: toolTitle,
263+
rolesRequired: [UserRole.administrator],
264+
route: rootRoute,
265+
title: toolTitle,
266+
},
267+
]

0 commit comments

Comments
 (0)