Skip to content

Commit d6b74cc

Browse files
authored
Merge pull request #1120 from nqviet/feat/system-admin
Consolidate Skills Manager
2 parents c84f82c + 74b1fd0 commit d6b74cc

File tree

83 files changed

+194
-151
lines changed

Some content is hidden

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

83 files changed

+194
-151
lines changed

src/apps/admin/src/AdminApp.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { Outlet, Routes } from 'react-router-dom'
33

44
import { routerContext, RouterContextData } from '~/libs/core'
55

6-
import { AdminAppContextProvider, Layout, SWRConfigProvider } from './lib'
6+
import { AdminAppContextProvider, LayoutProps, SWRConfigProvider, useLayout } from './lib'
77
import { toolTitle } from './admin-app.routes'
88
import './lib/styles/index.scss'
99

@@ -14,6 +14,7 @@ const AdminApp: FC = () => {
1414
const { getChildRoutes }: RouterContextData = useContext(routerContext)
1515
// eslint-disable-next-line react-hooks/exhaustive-deps -- missing dependency: getChildRoutes
1616
const childRoutes = useMemo(() => getChildRoutes(toolTitle), [])
17+
const { Layout }: { Layout: FC<LayoutProps> } = useLayout()
1718

1819
useEffect(() => {
1920
document.body.classList.add('admin-app')

src/apps/admin/src/admin-app.routes.tsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {
1818
rootRoute,
1919
userManagementRouteId,
2020
} from './config/routes.config'
21+
import { platformSkillRouteId } from './platform/routes.config'
2122

2223
const AdminApp: LazyLoadedComponent = lazyLoad(() => import('./AdminApp'))
2324

@@ -111,6 +112,13 @@ const PermissionAddGroupMembersPage: LazyLoadedComponent = lazyLoad(
111112
)
112113

113114
const Platform: LazyLoadedComponent = lazyLoad(() => import('./platform/Platform'))
115+
const SkillManagement: LazyLoadedComponent = lazyLoad(
116+
() => import('./platform/skill-management/SkillManagement'),
117+
)
118+
const SkillManagementLandingPage: LazyLoadedComponent = lazyLoad(
119+
() => import('./platform/skill-management/LandingPage'),
120+
'LandingPage',
121+
)
114122
const BadgeDetailPage: LazyLoadedComponent = lazyLoad(
115123
() => import('../../gamification-admin/src/pages/badge-detail/BadgeDetailPage'),
116124
)
@@ -270,8 +278,22 @@ export const adminRoutes: ReadonlyArray<PlatformRoute> = [
270278
id: permissionManagementRouteId,
271279
route: permissionManagementRouteId,
272280
},
281+
282+
// Platform Management Module
273283
{
274284
children: [
285+
{
286+
children: [
287+
{
288+
element: <SkillManagementLandingPage />,
289+
id: 'skills-landing-page',
290+
route: '',
291+
},
292+
],
293+
element: <SkillManagement />,
294+
id: platformSkillRouteId,
295+
route: platformSkillRouteId,
296+
},
275297
{
276298
element: (
277299
<BadgeListingPage

src/apps/admin/src/lib/components/common/Layout/Layout.module.scss

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,24 @@
2929
margin: $sp-8 auto !important;
3030
}
3131

32-
.contantentLayoutInner {
32+
.contentLayoutInner {
3333
box-sizing: border-box;
3434
width: 100%;
3535
}
36+
37+
/* --- PLATFORM SKILLS LAYOUT --- */
38+
39+
.platformSkillsContentLayout {
40+
color: $black-100;
41+
42+
.layout {
43+
.main {
44+
padding: 0 0 $sp-6;
45+
background-color: $tc-white;
46+
47+
@include ltelg {
48+
padding: $sp-4 0;
49+
}
50+
}
51+
}
52+
}
Lines changed: 66 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,80 @@
1-
import { FC, PropsWithChildren, useMemo } from 'react'
2-
import { useLocation } from 'react-router-dom'
3-
import classNames from 'classnames'
1+
import { FC, PropsWithChildren, useContext } from 'react'
2+
import cn from 'classnames'
43

54
import { platformRouteId } from '~/apps/admin/src/config/routes.config'
65
import { ContentLayout } from '~/libs/ui'
6+
import { routerContext, RouterContextData } from '~/libs/core'
7+
import { platformSkillRouteId } from '~/apps/admin/src/platform/routes.config'
8+
import { AppSubdomain, EnvironmentConfig } from '~/config'
79

810
import { SystemAdminTabs } from '../Tab'
911

1012
import styles from './Layout.module.scss'
1113

1214
export const NullLayout: FC<PropsWithChildren> = props => <>{props.children}</>
1315

14-
export const Layout: FC<PropsWithChildren> = props => {
15-
const { pathname }: { pathname: string } = useLocation()
16-
const isPlatformPage = useMemo(
17-
() => pathname.indexOf(platformRouteId) >= 0,
18-
[pathname],
19-
)
20-
21-
return (
22-
<ContentLayout
23-
innerClass={styles.contantentLayoutInner}
24-
outerClass={styles.contentLayoutOuter}
25-
>
26-
<div className={styles.layout}>
27-
<SystemAdminTabs />
28-
29-
<div
30-
className={classNames(styles.main, {
31-
[styles.isPlatformPage]: isPlatformPage,
32-
})}
33-
>
34-
{props.children}
35-
</div>
16+
export type LayoutProps = PropsWithChildren<{
17+
classes?: { // eslint-disable-line react/no-unused-prop-types -- it's actually used
18+
contentClass?: string
19+
innerClass?: string
20+
outerClass?: string
21+
layoutClass?: string
22+
mainClass?: string
23+
}
24+
}>
25+
26+
export const Layout: FC<LayoutProps> = props => (
27+
<ContentLayout
28+
contentClass={cn(styles.contentLayout, props.classes?.contentClass)}
29+
innerClass={cn(styles.contentLayoutInner, props.classes?.innerClass)}
30+
outerClass={cn(styles.contentLayoutOuter, props.classes?.outerClass)}
31+
>
32+
<div className={cn(styles.layout, props.classes?.layoutClass)}>
33+
<SystemAdminTabs />
34+
35+
<div className={cn(styles.main, props.classes?.mainClass)}>
36+
{props.children}
3637
</div>
37-
</ContentLayout>
38-
)
38+
</div>
39+
</ContentLayout>
40+
)
41+
42+
export const PlatformLayout: FC<LayoutProps> = props => (
43+
<Layout classes={{ mainClass: styles.isPlatformPage }}>
44+
{props.children}
45+
</Layout>
46+
)
47+
48+
export const PlatformSkillsLayout: FC<LayoutProps> = props => (
49+
<Layout classes={{ contentClass: styles.platformSkillsContentLayout }}>
50+
{props.children}
51+
</Layout>
52+
)
53+
54+
export function useLayout(): { Layout: FC<LayoutProps> } {
55+
const routerContextData: RouterContextData = useContext(routerContext)
56+
57+
if (!routerContextData.initialized) return { Layout }
58+
59+
const platformBaseRouteId = EnvironmentConfig.SUBDOMAIN === AppSubdomain.admin
60+
? `/${platformRouteId}`
61+
: `/${AppSubdomain.admin}/${platformRouteId}`
62+
63+
const skillManagementRouteId = EnvironmentConfig.SUBDOMAIN === AppSubdomain.admin
64+
? `/${platformRouteId}/${platformSkillRouteId}`
65+
: `/${AppSubdomain.admin}/${platformRouteId}/${platformSkillRouteId}`
66+
67+
if (window.location.pathname.toLowerCase()
68+
.startsWith(skillManagementRouteId.toLowerCase())) {
69+
return { Layout: PlatformSkillsLayout }
70+
}
71+
72+
if (window.location.pathname.toLowerCase()
73+
.startsWith(platformBaseRouteId.toLowerCase())) {
74+
return { Layout: PlatformLayout }
75+
}
76+
77+
return { Layout }
3978
}
4079

4180
export default Layout

src/apps/admin/src/lib/components/common/Tab/config/system-admin-tabs-config.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
platformRouteId,
1111
userManagementRouteId,
1212
} from '~/apps/admin/src/config/routes.config'
13+
import { platformSkillRouteId } from '~/apps/admin/src/platform/routes.config'
1314

1415
export const SystemAdminTabsConfig: TabsNavItem[] = [
1516
{
@@ -54,9 +55,15 @@ export const SystemAdminTabsConfig: TabsNavItem[] = [
5455
},
5556
{
5657
children: [
58+
{
59+
60+
id: `${platformRouteId}/${platformSkillRouteId}`,
61+
title: 'Skills',
62+
},
5763
{
5864
id: `${platformRouteId}/${gamificationAdminRouteId}`,
5965
title: 'Badges',
66+
6067
},
6168
],
6269
id: platformRouteId,
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { FC, useContext, useMemo } from 'react'
2+
import { Outlet, Routes } from 'react-router-dom'
3+
4+
import { routerContext, RouterContextData } from '~/libs/core'
5+
6+
import { adminRoutes } from '../admin-app.routes'
7+
import { platformRouteId } from '../config/routes.config'
8+
9+
/**
10+
* The router outlet.
11+
*/
12+
export const PlatformManagement: FC = () => {
13+
const childRoutes = useChildRoutes()
14+
15+
return (
16+
<>
17+
<Outlet />
18+
<Routes>{childRoutes}</Routes>
19+
</>
20+
)
21+
}
22+
23+
function useChildRoutes(): Array<JSX.Element> | undefined {
24+
const { getRouteElement }: RouterContextData = useContext(routerContext)
25+
const childRoutes = useMemo(
26+
() => adminRoutes[0].children
27+
?.find(r => r.id === platformRouteId)
28+
?.children?.map(getRouteElement),
29+
[], // eslint-disable-line react-hooks/exhaustive-deps -- missing dependency: getRouteElement
30+
)
31+
return childRoutes
32+
}
33+
34+
export default PlatformManagement
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const platformSkillRouteId = 'skills'

src/apps/skills-manager/src/skills-manager/landing-page/LandingPage.tsx renamed to src/apps/admin/src/platform/skill-management/LandingPage/LandingPage.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
import { FC } from 'react'
22

3-
import { ContentLayout, InputCheckbox, PageTitle } from '~/libs/ui'
3+
import { InputCheckbox, PageTitle } from '~/libs/ui'
44

5-
import { SkillsManagerContextValue, useSkillsManagerContext } from '../context'
5+
import { SkillsManagerContextValue, useSkillsManagerContext } from '../lib/context'
66
import {
77
CategoriesAccordion,
88
CategoryModal,
99
MoreActionsMenu,
1010
PageHeader,
1111
SearchInput,
1212
SkillModal,
13-
} from '../components'
14-
import { BulkEditor } from '../components/bulk-editor'
13+
} from '../lib/components'
14+
import { BulkEditor } from '../lib/components/bulk-editor'
1515

1616
import styles from './LandingPage.module.scss'
1717

@@ -30,7 +30,7 @@ const LandingPage: FC<{}> = () => {
3030
}: SkillsManagerContextValue = useSkillsManagerContext()
3131

3232
return (
33-
<ContentLayout innerClass={styles.contentWrap}>
33+
<div className={styles.contentWrap}>
3434
<PageTitle>Skills Manager | Admin</PageTitle>
3535
<PageHeader title='Skills Manager'>
3636
<InputCheckbox
@@ -63,7 +63,7 @@ const LandingPage: FC<{}> = () => {
6363
)}
6464

6565
{!!showSkillModal && <SkillModal skill={showSkillModal} />}
66-
</ContentLayout>
66+
</div>
6767
)
6868
}
6969

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { FC, useContext, useMemo } from 'react'
2+
import { Outlet, Routes } from 'react-router-dom'
3+
4+
import { routerContext, RouterContextData } from '~/libs/core'
5+
6+
import { adminRoutes } from '../../admin-app.routes'
7+
import { platformRouteId } from '../../config/routes.config'
8+
import { platformSkillRouteId } from '../routes.config'
9+
10+
import { SkillsManagerContext } from './lib/context'
11+
12+
/**
13+
* The router outlet.
14+
*/
15+
export const PlatformManagement: FC = () => {
16+
const childRoutes = useChildRoutes()
17+
18+
return (
19+
<SkillsManagerContext>
20+
<Outlet />
21+
<Routes>{childRoutes}</Routes>
22+
</SkillsManagerContext>
23+
)
24+
}
25+
26+
function useChildRoutes(): Array<JSX.Element> | undefined {
27+
const { getRouteElement }: RouterContextData = useContext(routerContext)
28+
const childRoutes = useMemo(
29+
() => adminRoutes[0].children
30+
?.find(r => r.id === platformRouteId)
31+
?.children?.find(r => r.id === platformSkillRouteId)
32+
?.children?.map(getRouteElement),
33+
[], // eslint-disable-line react-hooks/exhaustive-deps -- missing dependency: getRouteElement
34+
)
35+
return childRoutes
36+
}
37+
38+
export default PlatformManagement

src/apps/platform/src/platform.routes.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import { profilesRoutes } from '~/apps/profiles'
66
import { talentSearchRoutes } from '~/apps/talent-search'
77
import { accountsRoutes } from '~/apps/accounts'
88
import { onboardingRoutes } from '~/apps/onboarding'
9-
import { skillsManagerRoutes } from '~/apps/skills-manager'
109
import { walletRoutes } from '~/apps/wallet'
1110
import { walletAdminRoutes } from '~/apps/wallet-admin'
1211
import { copilotsRoutes } from '~/apps/copilots'
@@ -38,7 +37,6 @@ export const platformRoutes: Array<PlatformRoute> = [
3837
...walletRoutes,
3938
...walletAdminRoutes,
4039
...accountsRoutes,
41-
...skillsManagerRoutes,
4240
...homeRoutes,
4341
...adminRoutes,
4442
]

src/apps/skills-manager/README.md

Lines changed: 0 additions & 1 deletion
This file was deleted.

src/apps/skills-manager/index.tsx

Lines changed: 0 additions & 1 deletion
This file was deleted.

src/apps/skills-manager/src/SkillsManagerApp.tsx

Lines changed: 0 additions & 22 deletions
This file was deleted.

src/apps/skills-manager/src/index.ts

Lines changed: 0 additions & 4 deletions
This file was deleted.

0 commit comments

Comments
 (0)