@@ -21,6 +21,7 @@ import { MobileTableColumn } from '~/apps/admin/src/lib/models/MobileTableColumn
2121import { EnvironmentConfig } from '~/config'
2222import { copyTextToClipboard , handleError , useWindowSize , WindowSize } from '~/libs/shared'
2323import { IconOutline , Table , TableColumn , Tooltip } from '~/libs/ui'
24+ import { getRatingColor } from '~/libs/core'
2425
2526import { APPROVAL , REVIEWER , WITHOUT_APPEAL } from '../../../config/index.config'
2627import { ChallengeDetailContext , ReviewAppContext } from '../../contexts'
@@ -67,6 +68,24 @@ type SubmissionRow = SubmissionInfo & {
6768 aggregated ?: AggregatedSubmissionReviews
6869}
6970
71+ const resolveRatingValue = ( value : number | string | null | undefined ) : number | undefined => {
72+ if ( typeof value === 'number' && Number . isFinite ( value ) ) {
73+ return value
74+ }
75+
76+ if ( typeof value === 'string' ) {
77+ const trimmed = value . trim ( )
78+ if ( ! trimmed . length ) {
79+ return undefined
80+ }
81+
82+ const parsed = Number . parseFloat ( trimmed )
83+ return Number . isFinite ( parsed ) ? parsed : undefined
84+ }
85+
86+ return undefined
87+ }
88+
7089function createReopenActionButtons (
7190 submission : SubmissionRow ,
7291 aggregatedReviews : AggregatedReviewDetail [ ] | undefined ,
@@ -529,7 +548,7 @@ export const TableReviewAppeals: FC<Props> = (props: Props) => {
529548 // eslint-disable-next-line complexity
530549 const columns = useMemo < TableColumn < SubmissionRow > [ ] > ( ( ) => {
531550 const submissionColumn : TableColumn < SubmissionRow > = {
532- className : classNames ( styles . textBlue , styles . submissionColumn ) ,
551+ className : styles . submissionColumn ,
533552 columnId : 'submission-id' ,
534553 label : 'Submission ID' ,
535554 propertyName : 'id' ,
@@ -550,7 +569,7 @@ export const TableReviewAppeals: FC<Props> = (props: Props) => {
550569
551570 downloadSubmission ( data . id )
552571 } }
553- className = { classNames ( styles . textBlue , styles . linkButton ) }
572+ className = { styles . textBlue }
554573 disabled = { isButtonDisabled }
555574 type = 'button'
556575 >
@@ -614,19 +633,32 @@ export const TableReviewAppeals: FC<Props> = (props: Props) => {
614633 columnId : 'handle-aggregated' ,
615634 label : 'Handle' ,
616635 propertyName : 'handle' ,
617- renderer : ( data : SubmissionRow ) => (
618- < a
619- href = { getHandleUrl ( data . userInfo ) }
620- target = '_blank'
621- rel = 'noreferrer'
622- style = { { color : data . aggregated ?. submitterHandleColor } }
623- onClick = { function onClick ( ) {
624- window . open ( getHandleUrl ( data . userInfo ) , '_blank' )
625- } }
626- >
627- { data . aggregated ?. submitterHandle ?? data . userInfo ?. memberHandle ?? '' }
628- </ a >
629- ) ,
636+ renderer : ( data : SubmissionRow ) => {
637+ const aggregatedRating = resolveRatingValue ( data . aggregated ?. submitterMaxRating )
638+ const reviewRating = resolveRatingValue ( data . review ?. submitterMaxRating )
639+ const userRating = resolveRatingValue ( data . userInfo ?. maxRating )
640+ const computedColor = data . aggregated ?. submitterHandleColor
641+ ?? data . review ?. submitterHandleColor
642+ ?? ( aggregatedRating !== undefined ? getRatingColor ( aggregatedRating ) : undefined )
643+ ?? ( reviewRating !== undefined ? getRatingColor ( reviewRating ) : undefined )
644+ ?? data . userInfo ?. handleColor
645+ ?? ( userRating !== undefined ? getRatingColor ( userRating ) : undefined )
646+ ?? '#2a2a2a'
647+
648+ return (
649+ < a
650+ href = { getHandleUrl ( data . userInfo ) }
651+ target = '_blank'
652+ rel = 'noreferrer'
653+ style = { { color : computedColor } }
654+ onClick = { function onClick ( ) {
655+ window . open ( getHandleUrl ( data . userInfo ) , '_blank' )
656+ } }
657+ >
658+ { data . aggregated ?. submitterHandle ?? data . userInfo ?. memberHandle ?? '' }
659+ </ a >
660+ )
661+ } ,
630662 type : 'element' ,
631663 }
632664
@@ -771,9 +803,6 @@ export const TableReviewAppeals: FC<Props> = (props: Props) => {
771803 }
772804
773805 const totalAppeals = reviewDetail ?. totalAppeals ?? 0
774- const finishedAppeals = reviewDetail ?. finishedAppeals ?? 0
775- const unresolvedAppeals = reviewDetail ?. unresolvedAppeals
776- ?? Math . max ( totalAppeals - finishedAppeals , 0 )
777806 if ( ! totalAppeals && ( reviewInfo . status ?? '' ) . toUpperCase ( ) !== 'COMPLETED' ) {
778807 return (
779808 < span className = { styles . notReviewed } >
@@ -793,22 +822,12 @@ export const TableReviewAppeals: FC<Props> = (props: Props) => {
793822 )
794823 }
795824
796- const primaryAppealsCount = unresolvedAppeals
797-
798825 return (
799826 < Link
800827 to = { `./../review/${ reviewInfo . id } ` }
801828 className = { styles . appealsLink }
802829 >
803- [
804- { ' ' }
805- < span className = { styles . textBlue } > { primaryAppealsCount } </ span >
806- { ' ' }
807- /
808- { ' ' }
809830 < span className = { styles . textBlue } > { totalAppeals } </ span >
810- { ' ' }
811- ]
812831 </ Link >
813832 )
814833 }
@@ -1009,24 +1028,34 @@ export const TableReviewAppeals: FC<Props> = (props: Props) => {
10091028 columnId : 'handle' ,
10101029 label : 'Handle' ,
10111030 propertyName : 'handle' ,
1012- renderer : ( data : SubmissionRow ) => (
1013- < a
1014- href = { getHandleUrl ( data . userInfo ) }
1015- target = '_blank'
1016- rel = 'noreferrer'
1017- style = { {
1018- color : data . userInfo ?. handleColor ,
1019- } }
1020- onClick = { function onClick ( ) {
1021- window . open (
1022- getHandleUrl ( data . userInfo ) ,
1023- '_blank' ,
1024- )
1025- } }
1026- >
1027- { data . userInfo ?. memberHandle ?? '' }
1028- </ a >
1029- ) ,
1031+ renderer : ( data : SubmissionRow ) => {
1032+ const reviewRating = resolveRatingValue ( data . review ?. submitterMaxRating )
1033+ const userRating = resolveRatingValue ( data . userInfo ?. maxRating )
1034+ const computedColor = data . review ?. submitterHandleColor
1035+ ?? data . userInfo ?. handleColor
1036+ ?? ( reviewRating !== undefined ? getRatingColor ( reviewRating ) : undefined )
1037+ ?? ( userRating !== undefined ? getRatingColor ( userRating ) : undefined )
1038+ ?? '#2a2a2a'
1039+
1040+ return (
1041+ < a
1042+ href = { getHandleUrl ( data . userInfo ) }
1043+ target = '_blank'
1044+ rel = 'noreferrer'
1045+ style = { {
1046+ color : computedColor ,
1047+ } }
1048+ onClick = { function onClick ( ) {
1049+ window . open (
1050+ getHandleUrl ( data . userInfo ) ,
1051+ '_blank' ,
1052+ )
1053+ } }
1054+ >
1055+ { data . userInfo ?. memberHandle ?? '' }
1056+ </ a >
1057+ )
1058+ } ,
10301059 type : 'element' ,
10311060 }
10321061
@@ -1351,22 +1380,14 @@ export const TableReviewAppeals: FC<Props> = (props: Props) => {
13511380 }
13521381
13531382 return (
1354- < >
1355- [
1356- < Link
1357- to = { `./../review/${ reviewId } ` }
1358- className = { styles . appealsLink }
1359- >
1360- < span className = { styles . textBlue } > { appealInfo . finishAppeals } </ span >
1361- { ' ' }
1362- /
1363- { ' ' }
1364- < span className = { styles . textBlue } >
1365- { appealInfo . totalAppeals }
1366- </ span >
1367- </ Link >
1368- ]
1369- </ >
1383+ < Link
1384+ to = { `./../review/${ reviewId } ` }
1385+ className = { styles . appealsLink }
1386+ >
1387+ < span className = { styles . textBlue } >
1388+ { appealInfo . totalAppeals }
1389+ </ span >
1390+ </ Link >
13701391 )
13711392 } ,
13721393 type : 'element' ,
0 commit comments