@@ -21,9 +21,15 @@ import PT from 'prop-types';
2121import _ from 'lodash' ;
2222import React , { Component } from 'react' ;
2323import { fixStyle } from 'utils/contentful' ;
24+ import { getRatingColor } from 'utils/tc' ;
2425import cn from 'classnames' ;
2526import { Scrollbars } from 'react-custom-scrollbars' ;
26- import './style.scss' ;
27+ import { config } from 'topcoder-react-utils' ;
28+ import { PrimaryButton } from 'topcoder-react-ui-kit' ;
29+ import tc from 'components/buttons/themed/tc.scss' ;
30+ import defaultStyles from './style.scss' ;
31+
32+ const DEFAULT_AVATAR_URL = 'https://images.ctfassets.net/b5f1djy59z3a/4PTwZVSf3W7qgs9WssqbVa/4c51312671a4b9acbdfd7f5e22320b62/default_avatar.svg' ;
2733
2834export default class MMLeaderboard extends Component {
2935 constructor ( props ) {
@@ -46,6 +52,8 @@ export default class MMLeaderboard extends Component {
4652 tableHeight,
4753 tableWidth,
4854 headerIndexCol,
55+ theme,
56+ challengeId,
4957 } = this . props ;
5058
5159 let {
@@ -76,6 +84,73 @@ export default class MMLeaderboard extends Component {
7684 }
7785
7886 const renderData = ( ) => {
87+ if ( data . length && theme && theme === 'Podium' ) {
88+ return (
89+ < div className = { defaultStyles . podiumTheme } >
90+ < div className = { defaultStyles . top3 } >
91+ < div className = { defaultStyles . swapper } >
92+ { _ . take ( data , 2 ) . map ( ( member , indx ) => (
93+ < div className = { defaultStyles [ `topMember${ indx + 1 } ` ] } >
94+ < div className = { defaultStyles . topMemberPhotoAndPlace } >
95+ < img src = { member . photoUrl || DEFAULT_AVATAR_URL } className = { defaultStyles . topMemberPhoto } alt = { `Avatar of ${ member . createdBy } ` } />
96+ < div className = { defaultStyles [ `topMemberRank${ indx + 1 } ` ] } > { member . rank } </ div >
97+ </ div >
98+ < div className = { defaultStyles . topMemberLink } >
99+ < a href = { `${ config . URL . BASE } /members/${ member . createdBy } ` } target = "_blank" rel = "noreferrer" style = { { color : getRatingColor ( member . rating ) } } > { member . createdBy } </ a >
100+ < p className = { defaultStyles . topMemberScore } > { member . score } </ p >
101+ </ div >
102+ </ div >
103+ ) ) }
104+ </ div >
105+ < div className = { defaultStyles . topMember3 } >
106+ < div className = { defaultStyles . topMemberPhotoAndPlace } >
107+ < img src = { data [ 2 ] . photoUrl || DEFAULT_AVATAR_URL } className = { defaultStyles . topMemberPhoto } alt = { `Avatar of ${ data [ 2 ] . createdBy } ` } />
108+ < div className = { defaultStyles . topMemberRank3 } > { data [ 2 ] . rank } </ div >
109+ </ div >
110+ < div className = { defaultStyles . topMemberLink } >
111+ < a href = { `${ config . URL . BASE } /members/${ data [ 2 ] . createdBy } ` } target = "_blank" rel = "noreferrer" style = { { color : getRatingColor ( data [ 2 ] . rating ) } } > { data [ 2 ] . createdBy } </ a >
112+ < p className = { defaultStyles . topMemberScore } > { data [ 2 ] . score } </ p >
113+ </ div >
114+ </ div >
115+ </ div >
116+ < div className = { defaultStyles . followers } >
117+ < div className = { defaultStyles . followersLeft } >
118+ { _ . slice ( data , 3 , 7 ) . map ( member => (
119+ < div className = { defaultStyles . follower } >
120+ < span > { member . rank } . </ span >
121+ < a href = { `${ config . URL . BASE } /members/${ member . createdBy } ` } target = "_blank" rel = "noreferrer" style = { { color : getRatingColor ( member . rating ) } } > { member . createdBy } </ a >
122+ < span className = { defaultStyles . followerScore } > { member . score } </ span >
123+ </ div >
124+ ) ) }
125+ </ div >
126+ {
127+ data . length > 7 && (
128+ < div className = { defaultStyles . followersRight } >
129+ { _ . slice ( data , 7 , 10 ) . map ( member => (
130+ < div className = { defaultStyles . follower } >
131+ < span > { member . rank } . </ span >
132+ < a href = { `${ config . URL . BASE } /members/${ member . createdBy } ` } target = "_blank" rel = "noreferrer" style = { { color : getRatingColor ( member . rating ) } } > { member . createdBy } </ a >
133+ < span className = { defaultStyles . followerScore } > { member . score } </ span >
134+ </ div >
135+ ) ) }
136+ {
137+ data . length > 10 && (
138+ < PrimaryButton
139+ to = { `${ config . URL . BASE } /challenges/${ challengeId } ?tab=submissions` }
140+ openNewTab
141+ theme = { {
142+ button : tc [ 'primary-green-sm' ] ,
143+ } }
144+ >
145+ See Full Leaderbord
146+ </ PrimaryButton >
147+ ) }
148+ </ div >
149+ ) }
150+ </ div >
151+ </ div >
152+ ) ;
153+ }
79154 if ( property ) {
80155 if ( data . length > 0 && data [ 0 ] [ property ] ) {
81156 if ( typeof data [ 0 ] [ property ] === 'string' ) {
@@ -107,17 +182,17 @@ export default class MMLeaderboard extends Component {
107182
108183 const header = cols => (
109184 < tr >
110- { countRows && ( < th styleName = " header-cell" > < span > { headerIndexCol } </ span > </ th > ) }
185+ { countRows && ( < th className = { defaultStyles [ ' header-cell' ] } > < span > { headerIndexCol } </ span > </ th > ) }
111186 {
112187 cols . map ( ( c ) => {
113188 const name = c . headerName ;
114189 const { styles } = c ;
115190 return name ? (
116- < th key = { name } style = { fixStyle ( styles ) } styleName = " header-cell" >
117- < div styleName = " header-table-content" >
191+ < th key = { name } style = { fixStyle ( styles ) } className = { defaultStyles [ ' header-cell' ] } >
192+ < div className = { defaultStyles [ ' header-table-content' ] } >
118193 < span > { name } </ span >
119194 < button
120- styleName = " sort-container"
195+ className = { defaultStyles [ ' sort-container' ] }
121196 onClick = { ( ) => {
122197 if ( ! sortParam . field || sortParam . field !== c . property ) {
123198 sortParam . field = c . property ;
@@ -147,7 +222,7 @@ export default class MMLeaderboard extends Component {
147222 ) ;
148223 const bodyRow = ( record , cols , i ) => (
149224 < tr key = { Object . values ( record ) } >
150- { ( countRows && ( limit <= 0 || i < limit ) ) ? < td styleName = " body-row" > { i + 1 } </ td > : ' ' }
225+ { ( countRows && ( limit <= 0 || i < limit ) ) ? < td className = { defaultStyles [ ' body-row' ] } > { i + 1 } </ td > : ' ' }
151226 {
152227 cols . map ( ( c ) => {
153228 const prop = c . property ;
@@ -169,8 +244,8 @@ export default class MMLeaderboard extends Component {
169244 }
170245 }
171246 return value ? (
172- < td key = { record [ prop ] } style = { fixStyle ( styles ) } title = { value } styleName = " body-row" >
173- { memberLinks ? ( < a styleName = " handle-link" href = { `${ window . origin } /members/${ value } ` } target = { `${ _ . includes ( window . origin , 'www' ) ? '_self' : '_blank' } ` } > { value } </ a > ) : value }
247+ < td key = { record [ prop ] } style = { fixStyle ( styles ) } title = { value } className = { defaultStyles [ ' body-row' ] } >
248+ { memberLinks ? ( < a className = { defaultStyles [ ' handle-link' ] } href = { `${ window . origin } /members/${ value } ` } target = { `${ _ . includes ( window . origin , 'www' ) ? '_self' : '_blank' } ` } > { value } </ a > ) : value }
174249 </ td >
175250 ) : null ;
176251 } )
@@ -179,10 +254,10 @@ export default class MMLeaderboard extends Component {
179254 ) ;
180255 return (
181256 < Scrollbars
182- styleName = " component-container"
257+ className = { defaultStyles [ ' component-container' ] }
183258 style = { { height : tableHeight , width : tableWidth } }
184259 >
185- < table styleName = " table-container" >
260+ < table className = { defaultStyles [ ' table-container' ] } >
186261 < thead >
187262 { header ( columns ) }
188263 </ thead >
@@ -221,7 +296,7 @@ export default class MMLeaderboard extends Component {
221296 } ;
222297 return (
223298 < React . Fragment >
224- { data . length ? renderData ( ) : < h4 styleName = " no-data-title" > No data available yet.</ h4 > }
299+ { data . length ? renderData ( ) : < h4 className = { defaultStyles [ ' no-data-title' ] } > No data available yet.</ h4 > }
225300 </ React . Fragment >
226301 ) ;
227302 }
@@ -236,6 +311,7 @@ MMLeaderboard.defaultProps = {
236311 tableHeight : '100%' ,
237312 tableWidth : '100%' ,
238313 headerIndexCol : '' ,
314+ theme : null ,
239315} ;
240316
241317MMLeaderboard . propTypes = {
@@ -257,4 +333,6 @@ MMLeaderboard.propTypes = {
257333 PT . func ,
258334 ] ) ,
259335 headerIndexCol : PT . string ,
336+ theme : PT . string ,
337+ challengeId : PT . string . isRequired ,
260338} ;
0 commit comments