Skip to content

Commit 764f178

Browse files
authored
Merge pull request #1014 from stevenfrog/review-management-f2f
review management with merged dev
2 parents 26538ad + 420f144 commit 764f178

38 files changed

+2174
-4
lines changed

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,26 @@ const ManageUserPage: LazyLoadedComponent = lazyLoad(
2121
'ManageUserPage',
2222
)
2323

24+
const ReviewManagement: LazyLoadedComponent = lazyLoad(
25+
() => import('./review-management/ReviewManagement'),
26+
)
27+
const ReviewManagementPage: LazyLoadedComponent = lazyLoad(
28+
() => import('./review-management/ReviewManagementPage'),
29+
'ReviewManagementPage',
30+
)
31+
const ManageReviewerPage: LazyLoadedComponent = lazyLoad(
32+
() => import('./review-management/ManageReviewerPage'),
33+
'ManageReviewerPage',
34+
)
35+
2436
export const toolTitle: string = ToolTitle.admin
2537
export const rootRoute: string
2638
= EnvironmentConfig.SUBDOMAIN === AppSubdomain.admin
2739
? ''
2840
: `/${AppSubdomain.admin}`
2941

3042
export const manageChallengeRouteId = 'challenge-management'
43+
export const manageReviewRouteId = 'review-management'
3144

3245
export const adminRoutes: ReadonlyArray<PlatformRoute> = [
3346
// Admin App Root
@@ -56,6 +69,24 @@ export const adminRoutes: ReadonlyArray<PlatformRoute> = [
5669
id: manageChallengeRouteId,
5770
route: manageChallengeRouteId,
5871
},
72+
// Reviewer Management Module
73+
{
74+
children: [
75+
{
76+
element: <ReviewManagementPage />,
77+
id: 'review-management-page',
78+
route: '',
79+
},
80+
{
81+
element: <ManageReviewerPage />,
82+
id: 'manage-reviewer',
83+
route: ':challengeId/manage-reviewer',
84+
},
85+
],
86+
element: <ReviewManagement />,
87+
id: manageReviewRouteId,
88+
route: manageReviewRouteId,
89+
},
5990
],
6091
domain: AppSubdomain.admin,
6192
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)