@ -1,6 +1,6 @@
import React , { Component } from 'react' ;
import { withTranslation } from 'react-i18next' ;
import { resolve } from 'url' ;
import React , { Component } from "react" ;
import { withTranslation } from "react-i18next" ;
import { resolve } from "url" ;
import {
Container ,
Row ,
@ -9,12 +9,11 @@ import {
Card ,
CardHeader ,
CardBody ,
Table ,
} from 'reactstrap' ;
import { i18nGrades } from '../../Util' ;
import { AppContext } from '../../AppContext' ;
import { errorMessage , Error } from '../../Errors' ;
Table
} from "reactstrap" ;
import { i18nGrades } from "../../Util" ;
import { AppContext } from "../../AppContext" ;
import { errorMessage , Error } from "../../Errors" ;
class Result extends Component {
static contextType = AppContext ;
@ -34,7 +33,7 @@ class Result extends Component {
collapseGraphics : false ,
collapseProfiles : false ,
electionGrades : i18nGrades ( ) ,
errorMessage : '' ,
errorMessage : ""
} ;
}
@ -42,7 +41,7 @@ class Result extends Component {
if ( ! response . ok ) {
response . json ( ) . then ( response => {
this . setState ( state => ( {
errorMessage : errorMessage ( response , this . props . t ) ,
errorMessage : errorMessage ( response , this . props . t )
} ) ) ;
} ) ;
throw Error ( response ) ;
@ -55,22 +54,22 @@ class Result extends Component {
id : c . id ,
name : c . name ,
profile : c . profile ,
grade : c . grade ,
grade : c . grade
} ) ) ;
this . setState ( state => ( { candidates : candidates } ) ) ;
this . setState ( state => ( { candidates : candidates } ) ) ;
return response ;
} ;
detailsToState = response => {
const numGrades = response . num _grades ;
const colSizeGradeLg = Math . floor (
( 12 - this . state . colSizeCandidateLg ) / numGrades ,
( 12 - this . state . colSizeCandidateLg ) / numGrades
) ;
const colSizeGradeMd = Math . floor (
( 12 - this . state . colSizeCandidateMd ) / numGrades ,
( 12 - this . state . colSizeCandidateMd ) / numGrades
) ;
const colSizeGradeXs = Math . floor (
( 12 - this . state . colSizeCandidateXs ) / numGrades ,
( 12 - this . state . colSizeCandidateXs ) / numGrades
) ;
this . setState ( state => ( {
title : response . title ,
@ -90,7 +89,7 @@ class Result extends Component {
12 - colSizeGradeXs * numGrades > 0
? 12 - colSizeGradeXs * numGrades
: 12 ,
electionGrades : i18nGrades ( ) . slice ( 0 , numGrades ) ,
electionGrades : i18nGrades ( ) . slice ( 0 , numGrades )
} ) ) ;
return response ;
} ;
@ -98,38 +97,38 @@ class Result extends Component {
componentDidMount ( ) {
/ / g e t d e t a i l s o f t h e e l e c t i o n
const electionSlug = this . props . match . params . slug ;
if ( electionSlug === 'dev' ) {
if ( electionSlug === "dev" ) {
const dataTest = [
{
name : 'BB' ,
name : "BB" ,
id : 1 ,
score : 1.0 ,
profile : [ 1 , 1 , 0 , 0 , 0 , 0 , 0 ] ,
grade : 1 ,
grade : 1
} ,
{
name : 'CC' ,
name : "CC" ,
id : 2 ,
score : 1.0 ,
profile : [ 0 , 0 , 2 , 0 , 0 , 0 , 0 ] ,
grade : 2 ,
grade : 2
} ,
{
name : 'AA' ,
name : "AA" ,
id : 0 ,
score : 1.0 ,
profile : [ 1 , 1 , 0 , 0 , 0 , 0 , 0 ] ,
grade : 1 ,
} ,
grade : 1
}
] ;
this . setState ( { candidates : dataTest } ) ;
this . setState ( { candidates : dataTest } ) ;
} else {
const detailsEndpoint = resolve (
this . context . urlServer ,
this . context . routesServer . getElection . replace (
new RegExp ( ':slug' , 'g' ) ,
electionSlug ,
) ,
new RegExp ( ":slug" , "g" ) ,
electionSlug
)
) ;
fetch ( detailsEndpoint )
@ -142,9 +141,9 @@ class Result extends Component {
const resultsEndpoint = resolve (
this . context . urlServer ,
this . context . routesServer . getResultsElection . replace (
new RegExp ( ':slug' , 'g' ) ,
electionSlug ,
) ,
new RegExp ( ":slug" , "g" ) ,
electionSlug
)
) ;
fetch ( resultsEndpoint )
@ -156,21 +155,20 @@ class Result extends Component {
}
toggleGraphics = ( ) => {
this . setState ( state => ( { collapseGraphics : ! state . collapseGraphics } ) ) ;
this . setState ( state => ( { collapseGraphics : ! state . collapseGraphics } ) ) ;
} ;
toggleProfiles = ( ) => {
this . setState ( state => ( { collapseProfiles : ! state . collapseProfiles } ) ) ;
this . setState ( state => ( { collapseProfiles : ! state . collapseProfiles } ) ) ;
} ;
render ( ) {
const { errorMessage , candidates , electionGrades } = this . state ;
const { t } = this . props ;
const { errorMessage , candidates , electionGrades } = this . state ;
const { t } = this . props ;
const i18nGradesObject = i18nGrades ( ) ;
const offsetGrade = i18nGradesObject . length - ( this . state . numGrades ) ;
const offsetGrade = i18nGradesObject . length - this . state . numGrades ;
if ( errorMessage && errorMessage !== '' ) {
if ( errorMessage && errorMessage !== "" ) {
return < Error value = { errorMessage } / > ;
}
@ -192,26 +190,29 @@ class Result extends Component {
< Row className = "mt-5" >
< Col >
< h1 > { t ( 'Results of the election:' ) } < / h1 >
< h1 > { t ( "Results of the election:" ) } < / h1 >
< h5 >
< small >
{ t ( 'Number of votes:' ) }
{ ' ' + numVotes }
{ t ( "Number of votes:" ) }
{ " " + numVotes }
< / small >
< / h5 >
< hr className = "mb-5" / >
< ol >
{ candidates . map ( ( candidate , i ) => {
const gradeValue = candidate . grade + offsetGrade ;
const gradeValue = candidate . grade + offsetGrade ;
return (
< li key = { i } className = "mt-2" >
< span className = "mt-2 ml-2" > { candidate . name } < / span >
< span
className = "badge badge-light ml-2 mt-2"
style = { {
backgroundColor : electionGrades . slice ( 0 ) . reverse ( ) [ ( candidate . grade ) ] . color ,
color : '#fff' ,
} } >
backgroundColor : electionGrades . slice ( 0 ) . reverse ( ) [
candidate . grade
] . color ,
color : "#fff"
} }
>
{ i18nGradesObject . slice ( 0 ) . reverse ( ) [ gradeValue ] . label }
< / span >
{ / * < s p a n c l a s s N a m e = " b a d g e b a d g e - d a r k m t - 2 m l - 2 " >
@ -230,10 +231,11 @@ class Result extends Component {
< CardHeader className = "pointer" onClick = { this . toggleGraphics } >
< h4
className = {
'm-0 panel-title ' +
( this . state . collapseGraphics ? 'collapsed' : '' )
} >
{ t ( 'Graph' ) }
"m-0 panel-title " +
( this . state . collapseGraphics ? "collapsed" : "" )
}
>
{ t ( "Graph" ) }
< / h4 >
< / CardHeader >
< Collapse isOpen = { this . state . collapseGraphics } >
@ -241,42 +243,46 @@ class Result extends Component {
< div >
< div
className = "median"
style = { { height : candidates . length * 28 + 30 } }
style = { { height : candidates . length * 28 + 30 } }
/ >
< table style = { { width : '100%' } } >
< table style = { { width : "100%" } } >
< tbody >
{ candidates . map ( ( candidate , i ) => {
return (
< tr key = { i } >
< td style = { { width : '30px' } } > { i + 1 } < / td >
< td style = { { width : "30px" } } > { i + 1 } < / td >
{ /*candidate.label*/ }
< td >
< table style = { { width : '100%' } } >
< table style = { { width : "100%" } } >
< tbody >
< tr >
{ gradeIds . slice ( 0 ) . reverse ( ) . map ( ( id , i ) => {
const value = candidate . profile [ id ] ;
if ( value > 0 ) {
let percent =
( value * 100 ) / numVotes + '%' ;
if ( i === 0 ) {
percent = 'auto' ;
{ gradeIds
. slice ( 0 )
. reverse ( )
. map ( ( id , i ) => {
const value = candidate . profile [ id ] ;
if ( value > 0 ) {
let percent =
( value * 100 ) / numVotes + "%" ;
if ( i === 0 ) {
percent = "auto" ;
}
return (
< td
key = { i }
style = { {
width : percent ,
backgroundColor : this . state
. electionGrades [ i ] . color
} }
>
& nbsp ;
< / td >
) ;
} else {
return null ;
}
return (
< td
key = { i }
style = { {
width : percent ,
backgroundColor : this . state
. electionGrades [ i ] . color ,
} } >
& nbsp ;
< / td >
) ;
} else {
return null ;
}
} ) }
} ) }
< / tr >
< / tbody >
< / table >
@ -292,7 +298,7 @@ class Result extends Component {
{ candidates . map ( ( candidate , i ) => {
return (
< span key = { i } >
{ i > 0 ? ', ' : '' }
{ i > 0 ? ", " : "" }
< b > { i + 1 } < / b > : { candidate . name }
< / span >
) ;
@ -308,8 +314,9 @@ class Result extends Component {
className = "badge badge-light mr-2 mt-2"
style = { {
backgroundColor : grade . color ,
color : '#fff' ,
} } >
color : "#fff"
} }
>
{ grade . label }
< / span >
) ;
@ -327,10 +334,11 @@ class Result extends Component {
< CardHeader className = "pointer" onClick = { this . toggleProfiles } >
< h4
className = {
'm-0 panel-title ' +
( this . state . collapseProfiles ? 'collapsed' : '' )
} >
{ t ( 'Preference profile' ) }
"m-0 panel-title " +
( this . state . collapseProfiles ? "collapsed" : "" )
}
>
{ t ( "Preference profile" ) }
< / h4 >
< / CardHeader >
< Collapse isOpen = { this . state . collapseProfiles } >
@ -347,9 +355,10 @@ class Result extends Component {
className = "badge badge-light"
style = { {
backgroundColor : grade . color ,
color : '#fff' ,
} } >
{ grade . label } { ' ' }
color : "#fff"
} }
>
{ grade . label } { " " }
< / span >
< / th >
) ;
@ -361,14 +370,17 @@ class Result extends Component {
return (
< tr key = { i } >
< td > { i + 1 } < / td >
{ gradeIds . slice ( 0 ) . reverse ( ) . map ( ( id , i ) => {
const value = candidate . profile [ id ] ;
const percent = (
( value / numVotes ) *
100
) . toFixed ( 1 ) ;
return < td key = { i } > { percent } % < / td > ;
} ) }
{ gradeIds
. slice ( 0 )
. reverse ( )
. map ( ( id , i ) => {
const value = candidate . profile [ id ] ;
const percent = (
( value / numVotes ) *
100
) . toFixed ( 1 ) ;
return < td key = { i } > { percent } % < / td > ;
} ) }
< / tr >
) ;
} ) }
@ -379,7 +391,7 @@ class Result extends Component {
{ candidates . map ( ( candidate , i ) => {
return (
< span key = { i } >
{ i > 0 ? ', ' : '' }
{ i > 0 ? ", " : "" }
< b > { i + 1 } < / b > : { candidate . name }
< / span >
) ;