Skip to content

Commit e784a89

Browse files
committed
Merge branch 'dev' into diazz-challenge-30376220
2 parents 11f59af + 764f178 commit e784a89

38 files changed

+2174
-4
lines changed

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

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99

1010
import {
1111
manageChallengeRouteId,
12+
manageReviewRouteId,
1213
rootRoute,
1314
userManagementRouteId,
1415
} from './config/routes.config'
@@ -26,11 +27,21 @@ const ManageUserPage: LazyLoadedComponent = lazyLoad(
2627
() => import('./challenge-management/ManageUserPage'),
2728
'ManageUserPage',
2829
)
29-
3030
const UserManagementPage: LazyLoadedComponent = lazyLoad(
3131
() => import('./user-management/UserManagementPage'),
3232
'UserManagementPage',
3333
)
34+
const ReviewManagement: LazyLoadedComponent = lazyLoad(
35+
() => import('./review-management/ReviewManagement'),
36+
)
37+
const ReviewManagementPage: LazyLoadedComponent = lazyLoad(
38+
() => import('./review-management/ReviewManagementPage'),
39+
'ReviewManagementPage',
40+
)
41+
const ManageReviewerPage: LazyLoadedComponent = lazyLoad(
42+
() => import('./review-management/ManageReviewerPage'),
43+
'ManageReviewerPage',
44+
)
3445

3546
export const toolTitle: string = ToolTitle.admin
3647

@@ -67,6 +78,24 @@ export const adminRoutes: ReadonlyArray<PlatformRoute> = [
6778
id: userManagementRouteId,
6879
route: userManagementRouteId,
6980
},
81+
// Reviewer Management Module
82+
{
83+
children: [
84+
{
85+
element: <ReviewManagementPage />,
86+
id: 'review-management-page',
87+
route: '',
88+
},
89+
{
90+
element: <ManageReviewerPage />,
91+
id: 'manage-reviewer',
92+
route: ':challengeId/manage-reviewer',
93+
},
94+
],
95+
element: <ReviewManagement />,
96+
id: manageReviewRouteId,
97+
route: manageReviewRouteId,
98+
},
7099
],
71100
domain: AppSubdomain.admin,
72101
element: <AdminApp />,
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
.rejectPendingConfirmDialog {
2+
.actionButtons {
3+
display: flex;
4+
justify-content: flex-end;
5+
gap: 6px;
6+
padding-top: 32px;
7+
}
8+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { FC } from 'react'
2+
3+
import { BaseModal, Button } from '~/libs/ui'
4+
5+
import { useEventCallback } from '../../hooks'
6+
7+
import styles from './RejectPendingConfirmDialog.module.scss'
8+
9+
interface RejectPendingConfirmDialogProps {
10+
open: boolean
11+
reject: () => void
12+
setOpen: (isOpen: boolean) => void
13+
}
14+
15+
const RejectPendingConfirmDialog: FC<RejectPendingConfirmDialogProps> = props => {
16+
const handleClose = useEventCallback(() => props.setOpen(false))
17+
const handleRemove = useEventCallback(() => {
18+
props.setOpen(false)
19+
props.reject()
20+
})
21+
return (
22+
<BaseModal title='Reject Pending' onClose={handleClose} open={props.open}>
23+
<div className={styles.rejectPendingConfirmDialog}>
24+
<p>
25+
Are you sure? You want to reject pending?
26+
</p>
27+
<div className={styles.actionButtons}>
28+
<Button secondary size='lg' onClick={handleClose}>
29+
Cancel
30+
</Button>
31+
<Button primary size='lg' onClick={handleRemove}>
32+
OK
33+
</Button>
34+
</div>
35+
</div>
36+
</BaseModal>
37+
)
38+
}
39+
40+
export default RejectPendingConfirmDialog
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default as RejectPendingConfirmDialog } from './RejectPendingConfirmDialog'
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
@import '@libs/ui/styles/includes';
2+
@import '@libs/ui/styles/typography';
3+
4+
.mobileListView {
5+
> *:nth-child(odd) {
6+
background: $black-5;
7+
}
8+
}
9+
10+
.mobileListViewItemContainer {
11+
display: grid;
12+
grid-template-columns: 58px 1fr;
13+
padding: $sp-4;
14+
border-radius: $sp-2;
15+
margin-top: 16px;
16+
grid-template-columns: 1fr;
17+
18+
.rows {
19+
display: flex;
20+
flex-direction: column;
21+
gap: 16px;
22+
23+
.row1,
24+
.row2,
25+
.row3,
26+
.row4,
27+
.row5,
28+
.row6,
29+
.row7 {
30+
display: grid;
31+
gap: 16px 32px;
32+
align-items: center;
33+
}
34+
35+
.row1 {
36+
grid-template-columns: 1fr auto;
37+
38+
button {
39+
white-space: break-spaces;
40+
}
41+
}
42+
43+
.row2,
44+
.row3,
45+
.row4 {
46+
grid-template-columns: 1fr auto;
47+
}
48+
49+
.row5 {
50+
justify-content: flex-end;
51+
}
52+
}
53+
54+
@media (max-width: 567px) {
55+
gap: 8px;
56+
}
57+
}
58+
59+
.propertyElement {
60+
@extend .medium-subtitle;
61+
word-break: break-word;
62+
width: fit-content;
63+
}
64+
65+
.propertyElementLabel {
66+
color: $black-60;
67+
font-size: 11px;
68+
line-height: 14px;
69+
text-transform: uppercase;
70+
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import { FC } from 'react'
2+
3+
import { TableColumn } from '~/libs/ui/lib/components/table'
4+
5+
import { ReviewSummary } from '../../../models'
6+
7+
import styles from './MobileListView.module.scss'
8+
9+
type Property<T> = TableColumn<T>
10+
11+
export interface MobileListViewProps<T> {
12+
properties: ReadonlyArray<Property<T>>
13+
data: T[]
14+
}
15+
16+
const PropertyElement = <T, >(props: Property<T> & { data: T }): JSX.Element => {
17+
let item: JSX.Element | undefined
18+
switch (props.type) {
19+
case 'element': {
20+
item = props.renderer?.(props.data)
21+
break
22+
}
23+
24+
case 'action': {
25+
item = props.renderer?.(props.data)
26+
break
27+
}
28+
29+
case 'text':
30+
case 'number': {
31+
item = (
32+
<>
33+
{props.propertyName
34+
? (props.data as { [K: string]: unknown })[
35+
props.propertyName
36+
]
37+
: undefined}
38+
</>
39+
)
40+
break
41+
}
42+
43+
default: {
44+
item = undefined
45+
}
46+
}
47+
48+
return <div className={styles.propertyElement}>{item}</div>
49+
}
50+
51+
const MobileListView: FC<MobileListViewProps<ReviewSummary>> = props => {
52+
const renderListItem = (d: ReviewSummary): JSX.Element => {
53+
const propertyElements = props.properties.map(p => (
54+
<PropertyElement
55+
propertyName={p.propertyName}
56+
renderer={p.renderer}
57+
type={p.type}
58+
data={d}
59+
/>
60+
))
61+
62+
const propertyElementLabels = props.properties.map(p => (
63+
<div className={styles.propertyElementLabel}>{`${p.label}`}</div>
64+
))
65+
66+
return (
67+
<div className={styles.mobileListViewItemContainer} key={d.legacyChallengeId}>
68+
<div className={styles.rows}>
69+
<div className={styles.row1}>
70+
{/* Title */ propertyElements[1]}
71+
{/* Status */ propertyElements[4]}
72+
</div>
73+
<div className={styles.row2}>
74+
{/* Legacy ID */ propertyElements[2]}
75+
</div>
76+
<div className={styles.row3}>
77+
{propertyElementLabels[5]}
78+
{/* Open Review Opp' */ propertyElements[5]}
79+
</div>
80+
<div className={styles.row4}>
81+
{propertyElementLabels[6]}
82+
{/* Review Applications */ propertyElements[6]}
83+
</div>
84+
<div className={styles.row5}>
85+
{/* Action */ propertyElements[7]}
86+
</div>
87+
</div>
88+
</div>
89+
)
90+
}
91+
92+
return (
93+
<div className={styles.mobileListView}>
94+
{props.data.map(renderListItem)}
95+
</div>
96+
)
97+
}
98+
99+
export default MobileListView
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './MobileListView'
2+
export { default as MobileListView } from './MobileListView'
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
@import '@libs/ui/styles/includes';
2+
@import '../../styles';
3+
4+
.reviewSummaryList {
5+
padding: 0 15px;
6+
7+
table tbody tr td:nth-last-child(3) {
8+
text-align: center;
9+
}
10+
}
11+
12+
.challengeTitle {
13+
min-width: 200px;
14+
padding: 0;
15+
justify-content: flex-start;
16+
border-radius: 0;
17+
color: $body-color;
18+
line-height: 16px;
19+
white-space: break-spaces;
20+
21+
&:hover {
22+
color: $blue-110;
23+
}
24+
}
25+
26+
.rowActions {
27+
display: flex;
28+
align-items: center;
29+
gap: 5px;
30+
31+
> * {
32+
flex: none;
33+
}
34+
}

0 commit comments

Comments
 (0)