Skip to content

Commit 1801b8d

Browse files
authored
Merge pull request #1308 from topcoder-platform/feat/v6
Marathon match submission management features
2 parents e1d150c + 1359f92 commit 1801b8d

File tree

16 files changed

+184
-35
lines changed

16 files changed

+184
-35
lines changed

src/apps/admin/src/config/busEvent.config.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
*/
44
import { v4 as uuidv4 } from 'uuid'
55

6+
import { EnvironmentConfig } from '~/config'
7+
68
import {
79
RequestBusAPI,
810
RequestBusAPIAVScan,
@@ -41,9 +43,9 @@ export const CREATE_BUS_EVENT_AV_RESCAN = (
4143
payload: RequestBusAPIAVScanPayload,
4244
): RequestBusAPIAVScan => ({
4345
'mime-type': 'application/json',
44-
originator: 'submission-processor',
46+
originator: 'review-api-v6',
4547
payload,
4648
timestamp: new Date()
4749
.toISOString(),
48-
topic: 'avscan.action.scan',
50+
topic: EnvironmentConfig.ADMIN.AVSCAN_TOPIC,
4951
})

src/apps/admin/src/lib/components/SubmissionTable/SubmissionTable.module.scss

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,25 @@
2424
vertical-align: middle;
2525
}
2626
}
27+
28+
.virusScanStatus {
29+
display: inline-flex;
30+
align-items: center;
31+
justify-content: center;
32+
min-height: 24px;
33+
min-width: 24px;
34+
color: $black-80;
35+
36+
svg {
37+
height: 20px;
38+
width: 20px;
39+
}
40+
}
41+
42+
.virusScanStatusSuccess {
43+
color: $green-120;
44+
}
45+
46+
.virusScanStatusFailed {
47+
color: $red-110;
48+
}

src/apps/admin/src/lib/components/SubmissionTable/SubmissionTable.tsx

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import _ from 'lodash'
66
import classNames from 'classnames'
77

88
import { useWindowSize, WindowSize } from '~/libs/shared'
9-
import { ConfirmModal, Table, TableColumn } from '~/libs/ui'
9+
import { ConfirmModal, IconOutline, Table, TableColumn } from '~/libs/ui'
1010
import { EnvironmentConfig } from '~/config'
1111
import { getRatingColor } from '~/libs/core'
1212

@@ -20,6 +20,40 @@ import SubmissionTableActions from './SubmissionTableActions'
2020
import SubmissionTableActionsNonMM from './SubmissionTableActionsNonMM'
2121
import styles from './SubmissionTable.module.scss'
2222

23+
const renderVirusScanStatus = (submission: Submission): JSX.Element => {
24+
if (submission.virusScan === true) {
25+
return (
26+
<span
27+
className={classNames(
28+
styles.virusScanStatus,
29+
styles.virusScanStatusSuccess,
30+
)}
31+
role='img'
32+
aria-label='Virus scan passed'
33+
>
34+
<IconOutline.CheckCircleIcon aria-hidden />
35+
</span>
36+
)
37+
}
38+
39+
if (submission.virusScan === false) {
40+
return (
41+
<span
42+
className={classNames(
43+
styles.virusScanStatus,
44+
styles.virusScanStatusFailed,
45+
)}
46+
role='img'
47+
aria-label='Virus scan failed'
48+
>
49+
<IconOutline.XCircleIcon aria-hidden />
50+
</span>
51+
)
52+
}
53+
54+
return <span className={styles.virusScanStatus}>--</span>
55+
}
56+
2357
interface Props {
2458
className?: string
2559
data: Submission[]
@@ -89,6 +123,11 @@ export const SubmissionTable: FC<Props> = (props: Props) => {
89123
propertyName: 'id',
90124
type: 'text',
91125
},
126+
{
127+
label: 'Virus Scan',
128+
renderer: renderVirusScanStatus,
129+
type: 'element',
130+
},
92131
{
93132
label: 'Submission date',
94133
propertyName: 'submittedDateString',
@@ -163,6 +202,10 @@ export const SubmissionTable: FC<Props> = (props: Props) => {
163202
isRemovingReviewSummations={
164203
props.isRemovingReviewSummations
165204
}
205+
isDownloading={props.isDownloading}
206+
downloadSubmission={props.downloadSubmission}
207+
isDoingAvScan={props.isDoingAvScan}
208+
doPostBusEventAvScan={props.doPostBusEventAvScan}
166209
setShowConfirmDeleteSubmissionDialog={
167210
setShowConfirmDeleteSubmissionDialog
168211
}
@@ -189,6 +232,11 @@ export const SubmissionTable: FC<Props> = (props: Props) => {
189232
propertyName: 'id',
190233
type: 'text',
191234
},
235+
{
236+
label: 'Virus Scan',
237+
renderer: renderVirusScanStatus,
238+
type: 'element',
239+
},
192240
{
193241
label: 'Time submitted',
194242
propertyName: 'submittedDateString',

src/apps/admin/src/lib/components/SubmissionTable/SubmissionTableActions.tsx

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ interface Props {
1717
isRunningTest: IsRemovingType
1818
isRemovingSubmission: IsRemovingType
1919
isRemovingReviewSummations: IsRemovingType
20+
isDownloading: IsRemovingType
21+
isDoingAvScan: IsRemovingType
22+
downloadSubmission: (submissionId: string) => void
23+
doPostBusEventAvScan: (submission: Submission) => void
2024
doPostBusEvent: DoPostBusEvent
2125
setShowConfirmDeleteSubmissionDialog: Dispatch<
2226
SetStateAction<Submission | undefined>
@@ -82,6 +86,28 @@ export const SubmissionTableActions: FC<Props> = (props: Props) => {
8286
>
8387
Run Provisional Test
8488
</li>
89+
<li
90+
className={classNames({
91+
disabled: props.isDownloading[props.data.id],
92+
})}
93+
onClick={function onClick() {
94+
setOpenDropdown(false)
95+
props.downloadSubmission(props.data.id)
96+
}}
97+
>
98+
Download
99+
</li>
100+
<li
101+
className={classNames({
102+
disabled: props.isDoingAvScan[props.data.id],
103+
})}
104+
onClick={function onClick() {
105+
setOpenDropdown(false)
106+
props.doPostBusEventAvScan(props.data)
107+
}}
108+
>
109+
AV Rescan
110+
</li>
85111
<li
86112
className={classNames({
87113
disabled: props.isRemovingSubmission[props.data.id],

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
@import '@libs/ui/styles/includes';
22
@import '../../../styles/includes';
33

4+
.contentLayout {
5+
width: 100%;
6+
}
7+
48
.layout {
59
position: relative;
610

src/apps/admin/src/lib/components/common/Layout/Layout.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export type LayoutProps = PropsWithChildren<{
2424

2525
export const Layout: FC<LayoutProps> = props => (
2626
<ContentLayout
27+
isFluid
2728
contentClass={cn(styles.contentLayout, props.classes?.contentClass)}
2829
innerClass={cn(styles.contentLayoutInner, props.classes?.innerClass)}
2930
outerClass={cn(styles.contentLayoutOuter, props.classes?.outerClass)}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
margin-top: $sp-4;
66

77
.inner {
8-
max-width: $xl-max;
9-
margin: 0 auto;
8+
width: 100%;
9+
margin: 0;
1010
background-color: $tc-white;
1111
border-radius: 8px;
1212
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
.inner {
88
display: flex;
99
flex-direction: column;
10-
margin: 0 auto;
10+
margin: 0;
1111
box-sizing: border-box;
12-
max-width: $xl-max;
12+
width: 100%;
1313
}
1414
}

src/apps/admin/src/lib/hooks/useManageChallengeSubmissions.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,11 @@ export function useManageChallengeSubmissions(
6363
index++
6464
) {
6565
const submission = memberSubmission.submissions[index]
66-
submission.hideToggleHistory = true
67-
results.push(submission)
66+
results.push({
67+
...submission,
68+
hideToggleHistory: true,
69+
isTheLatestSubmission: false,
70+
})
6871
}
6972
}
7073
})

src/apps/admin/src/lib/models/Submission.model.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,11 @@ export interface Submission {
4646
provisionalRank?: number // this field is calculated at frontend
4747
finalRank?: number // this field is calculated at frontend
4848
hideToggleHistory?: boolean // this field is calculated at frontend
49-
isTheLatestSubmission?: boolean // this field is calculated at frontend
50-
// Enriched fields from API (Admin/Copilot/M2M only)
51-
submitterHandle?: string
52-
submitterMaxRating?: number | null
49+
virusScan?: boolean
50+
isTheLatestSubmission?: boolean // this field is calculated at frontend
51+
// Enriched fields from API (Admin/Copilot/M2M only)
52+
submitterHandle?: string
53+
submitterMaxRating?: number | null
5354
}
5455

5556
/**

0 commit comments

Comments
 (0)