diff --git a/src/apps/admin/src/admin-app.routes.tsx b/src/apps/admin/src/admin-app.routes.tsx index a6f0023dd..08e252429 100644 --- a/src/apps/admin/src/admin-app.routes.tsx +++ b/src/apps/admin/src/admin-app.routes.tsx @@ -1,3 +1,4 @@ +import { baseDetailPath, createBadgePath } from '~/apps/gamification-admin' import { AppSubdomain, ToolTitle } from '~/config' import { lazyLoad, @@ -9,9 +10,11 @@ import { import { billingAccountRouteId, + gamificationAdminRouteId, manageChallengeRouteId, manageReviewRouteId, permissionManagementRouteId, + platformRouteId, rootRoute, userManagementRouteId, } from './config/routes.config' @@ -107,6 +110,17 @@ const PermissionAddGroupMembersPage: LazyLoadedComponent = lazyLoad( 'PermissionAddGroupMembersPage', ) +const Platform: LazyLoadedComponent = lazyLoad(() => import('./platform/Platform')) +const BadgeDetailPage: LazyLoadedComponent = lazyLoad( + () => import('../../gamification-admin/src/pages/badge-detail/BadgeDetailPage'), +) +const BadgeListingPage: LazyLoadedComponent = lazyLoad( + () => import('../../gamification-admin/src/pages/badge-listing/BadgeListingPage'), +) +const CreateBadgePage: LazyLoadedComponent = lazyLoad( + () => import('../../gamification-admin/src/pages/create-badge/CreateBadgePage'), +) + export const toolTitle: string = ToolTitle.admin export const adminRoutes: ReadonlyArray = [ @@ -256,6 +270,29 @@ export const adminRoutes: ReadonlyArray = [ id: permissionManagementRouteId, route: permissionManagementRouteId, }, + { + children: [ + { + element: ( + + ), + route: gamificationAdminRouteId, + }, + { + element: , + route: `${gamificationAdminRouteId}${createBadgePath}`, + }, + { + element: , + route: `${gamificationAdminRouteId}${baseDetailPath}/:id`, + }, + ], + element: , + id: platformRouteId, + route: platformRouteId, + }, ], domain: AppSubdomain.admin, element: , diff --git a/src/apps/admin/src/config/routes.config.ts b/src/apps/admin/src/config/routes.config.ts index 080a79e7d..fe857eb00 100644 --- a/src/apps/admin/src/config/routes.config.ts +++ b/src/apps/admin/src/config/routes.config.ts @@ -13,3 +13,5 @@ export const manageReviewRouteId = 'review-management' export const userManagementRouteId = 'user-management' export const billingAccountRouteId = 'billing-account' export const permissionManagementRouteId = 'permission-management' +export const gamificationAdminRouteId = 'gamification-admin' +export const platformRouteId = 'platform' diff --git a/src/apps/admin/src/lib/components/common/Layout/Layout.module.scss b/src/apps/admin/src/lib/components/common/Layout/Layout.module.scss index 283bc6d49..a55421f07 100644 --- a/src/apps/admin/src/lib/components/common/Layout/Layout.module.scss +++ b/src/apps/admin/src/lib/components/common/Layout/Layout.module.scss @@ -13,6 +13,15 @@ @include ltelg { padding: $sp-4; } + + &.isPlatformPage { + padding: 0; + background-color: white; + + @include ltelg { + padding: 0; + } + } } } diff --git a/src/apps/admin/src/lib/components/common/Layout/Layout.tsx b/src/apps/admin/src/lib/components/common/Layout/Layout.tsx index 3e249d083..cfd77cf01 100644 --- a/src/apps/admin/src/lib/components/common/Layout/Layout.tsx +++ b/src/apps/admin/src/lib/components/common/Layout/Layout.tsx @@ -1,28 +1,41 @@ -import { FC, PropsWithChildren } from 'react' +import { FC, PropsWithChildren, useMemo } from 'react' +import { useLocation } from 'react-router-dom' +import classNames from 'classnames' +import { platformRouteId } from '~/apps/admin/src/config/routes.config' import { ContentLayout } from '~/libs/ui' import { SystemAdminTabs } from '../Tab' import styles from './Layout.module.scss' -export const NullLayout: FC = props => ( - <>{props.children} -) +export const NullLayout: FC = props => <>{props.children} -export const Layout: FC = props => ( - -
- +export const Layout: FC = props => { + const { pathname }: { pathname: string } = useLocation() + const isPlatformPage = useMemo( + () => pathname.indexOf(platformRouteId) >= 0, + [pathname], + ) -
- {props.children} + return ( + +
+ + +
+ {props.children} +
-
- -) + + ) +} export default Layout diff --git a/src/apps/admin/src/lib/components/common/Tab/config/system-admin-tabs-config.ts b/src/apps/admin/src/lib/components/common/Tab/config/system-admin-tabs-config.ts index fe9bbbeb2..a3075d886 100644 --- a/src/apps/admin/src/lib/components/common/Tab/config/system-admin-tabs-config.ts +++ b/src/apps/admin/src/lib/components/common/Tab/config/system-admin-tabs-config.ts @@ -3,9 +3,11 @@ import _ from 'lodash' import { TabsNavItem } from '~/libs/ui' import { billingAccountRouteId, + gamificationAdminRouteId, manageChallengeRouteId, manageReviewRouteId, permissionManagementRouteId, + platformRouteId, userManagementRouteId, } from '~/apps/admin/src/config/routes.config' @@ -50,6 +52,16 @@ export const SystemAdminTabsConfig: TabsNavItem[] = [ id: permissionManagementRouteId, title: 'Permission Management', }, + { + children: [ + { + id: `${platformRouteId}/${gamificationAdminRouteId}`, + title: 'Badges', + }, + ], + id: platformRouteId, + title: 'Platform', + }, ] export function getTabIdFromPathName(pathname: string): string { diff --git a/src/apps/admin/src/platform/Platform.tsx b/src/apps/admin/src/platform/Platform.tsx new file mode 100644 index 000000000..7990772f3 --- /dev/null +++ b/src/apps/admin/src/platform/Platform.tsx @@ -0,0 +1,37 @@ +/** + * Wrapper for permission managment + */ +import { FC, useContext, useMemo } from 'react' +import { Outlet, Routes } from 'react-router-dom' + +import { routerContext, RouterContextData } from '~/libs/core' + +import { adminRoutes } from '../admin-app.routes' +import { platformRouteId } from '../config/routes.config' + +/** + * The router outlet with layout. + */ +export const Platform: FC = () => { + const childRoutes = useChildRoutes() + + return ( + <> + + {childRoutes} + + ) +} + +function useChildRoutes(): Array | undefined { + const { getRouteElement }: RouterContextData = useContext(routerContext) + const childRoutes = useMemo( + () => adminRoutes[0].children + ?.find(r => r.id === platformRouteId) + ?.children?.map(getRouteElement), + [], // eslint-disable-line react-hooks/exhaustive-deps -- missing dependency: getRouteElement + ) + return childRoutes +} + +export default Platform diff --git a/src/apps/gamification-admin/src/GamificationAdmin.tsx b/src/apps/gamification-admin/src/GamificationAdmin.tsx deleted file mode 100644 index 956e8d21a..000000000 --- a/src/apps/gamification-admin/src/GamificationAdmin.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { FC, useContext } from 'react' -import { Outlet, Routes } from 'react-router-dom' -import { SWRConfig } from 'swr' - -import { ToolTitle } from '~/config' -import { routerContext, RouterContextData, xhrGetAsync } from '~/libs/core' - -export const toolTitle: string = ToolTitle.gamificationAdmin - -const GamificationAdmin: FC<{}> = () => { - - const { getChildRoutes }: RouterContextData = useContext(routerContext) - - return ( - xhrGetAsync(resource), - refreshInterval: 60000, // 1 min - }} - > - - - {getChildRoutes(toolTitle)} - - - ) -} - -export default GamificationAdmin diff --git a/src/apps/gamification-admin/src/game-lib/hooks/use-gamification-breadcrumb.hook.tsx b/src/apps/gamification-admin/src/game-lib/hooks/use-gamification-breadcrumb.hook.tsx deleted file mode 100644 index 4bcbae662..000000000 --- a/src/apps/gamification-admin/src/game-lib/hooks/use-gamification-breadcrumb.hook.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { BreadcrumbItemModel } from '~/libs/ui' - -import { toolTitle } from '../../GamificationAdmin' -import { rootRoute } from '../../gamification-admin.routes' - -export function useGamificationBreadcrumb(items: Array): Array { - - const breadcrumb: Array = [ - { - name: toolTitle, - url: rootRoute || '/', - }, - ...items, - ] - - return breadcrumb -} diff --git a/src/apps/gamification-admin/src/game-lib/index.ts b/src/apps/gamification-admin/src/game-lib/index.ts index f7cba96f4..dc15c5b7b 100644 --- a/src/apps/gamification-admin/src/game-lib/index.ts +++ b/src/apps/gamification-admin/src/game-lib/index.ts @@ -1,6 +1,5 @@ export * from './game-badge.model' export * from './hooks/use-get-game-badges-page.hook' -export * from './hooks/use-gamification-breadcrumb.hook' export * from './hooks/use-get-game-badge-details.hook' export * from './member-autocomplete' export * from './pagination' diff --git a/src/apps/gamification-admin/src/game-lib/modals/badge-created-modal/BadgeCreatedModal.tsx b/src/apps/gamification-admin/src/game-lib/modals/badge-created-modal/BadgeCreatedModal.tsx index bbfd48005..95ff0e600 100644 --- a/src/apps/gamification-admin/src/game-lib/modals/badge-created-modal/BadgeCreatedModal.tsx +++ b/src/apps/gamification-admin/src/game-lib/modals/badge-created-modal/BadgeCreatedModal.tsx @@ -12,6 +12,7 @@ export interface BadgeCreatedModalProps { badge: GameBadge isOpen: boolean onClose: () => void + rootPage: string; } const BadgeCreatedModal: FC = (props: BadgeCreatedModalProps) => { @@ -52,7 +53,7 @@ const BadgeCreatedModal: FC = (props: BadgeCreatedModalP label='View' primary size='lg' - to={badgeDetailPath(props.badge.id)} + to={badgeDetailPath(props.rootPage, props.badge.id)} />