import React, { Component } from "react"; import { withTranslation } from "react-i18next"; import { resolve } from "url"; import { Container, Row, Col, Collapse, Card, CardHeader, CardBody, Table } from "reactstrap"; import { i18nGrades } from "../../Util"; import { AppContext } from "../../AppContext"; import { errorMessage, Error } from "../../Errors"; class Result extends Component { static contextType = AppContext; constructor(props) { super(props); this.state = { candidates: [], title: null, numGrades: 0, colSizeCandidateLg: 4, colSizeCandidateMd: 6, colSizeCandidateXs: 12, colSizeGradeLg: 1, colSizeGradeMd: 1, colSizeGradeXs: 1, collapseGraphics: false, collapseProfiles: false, electionGrades: i18nGrades(), errorMessage: "" }; } handleErrors = response => { if (!response.ok) { response.json().then(response => { this.setState(state => ({ errorMessage: errorMessage(response, this.props.t) })); }); throw Error(response); } return response; }; resultsToState = response => { const candidates = response.map(c => ({ id: c.id, name: c.name, profile: c.profile, grade: c.grade })); this.setState(state => ({ candidates: candidates })); return response; }; detailsToState = response => { const numGrades = response.num_grades; const colSizeGradeLg = Math.floor( (12 - this.state.colSizeCandidateLg) / numGrades ); const colSizeGradeMd = Math.floor( (12 - this.state.colSizeCandidateMd) / numGrades ); const colSizeGradeXs = Math.floor( (12 - this.state.colSizeCandidateXs) / numGrades ); this.setState(state => ({ title: response.title, numGrades: numGrades, colSizeGradeLg: colSizeGradeLg, colSizeGradeMd: colSizeGradeMd, colSizeGradeXs: colSizeGradeXs, colSizeCandidateLg: 12 - colSizeGradeLg * numGrades > 0 ? 12 - colSizeGradeLg * numGrades : 12, colSizeCandidateMd: 12 - colSizeGradeMd * numGrades > 0 ? 12 - colSizeGradeMd * numGrades : 12, colSizeCandidateXs: 12 - colSizeGradeXs * numGrades > 0 ? 12 - colSizeGradeXs * numGrades : 12, electionGrades: i18nGrades().slice(0, numGrades) })); return response; }; componentDidMount() { // get details of the election const electionSlug = this.props.match.params.slug; if (electionSlug === "dev") { const dataTest = [ { name: "BB", id: 1, score: 1.0, profile: [1, 1, 0, 0, 0, 0, 0], grade: 1 }, { name: "CC", id: 2, score: 1.0, profile: [0, 0, 2, 0, 0, 0, 0], grade: 2 }, { name: "AA", id: 0, score: 1.0, profile: [1, 1, 0, 0, 0, 0, 0], grade: 1 } ]; this.setState({ candidates: dataTest }); } else { const detailsEndpoint = resolve( this.context.urlServer, this.context.routesServer.getElection.replace( new RegExp(":slug", "g"), electionSlug ) ); fetch(detailsEndpoint) .then(this.handleErrors) .then(response => response.json()) .then(this.detailsToState) .catch(error => console.log(error)); // get results of the election const resultsEndpoint = resolve( this.context.urlServer, this.context.routesServer.getResultsElection.replace( new RegExp(":slug", "g"), electionSlug ) ); fetch(resultsEndpoint) .then(this.handleErrors) .then(response => response.json()) .then(this.resultsToState) .catch(error => console.log(error)); } } toggleGraphics = () => { this.setState(state => ({ collapseGraphics: !state.collapseGraphics })); }; toggleProfiles = () => { this.setState(state => ({ collapseProfiles: !state.collapseProfiles })); }; render() { const { errorMessage, candidates, electionGrades } = this.state; const { t } = this.props; const i18nGradesObject = i18nGrades(); const offsetGrade = i18nGradesObject.length - this.state.numGrades; if (errorMessage && errorMessage !== "") { return ; } const sum = seq => Object.values(seq).reduce((a, b) => a + b, 0); const numVotes = candidates && candidates.length > 0 ? sum(candidates[0].profile) : 1; const gradeIds = candidates && candidates.length > 0 ? Object.keys(candidates[0].profile) : []; return (

{this.state.title}

{t("Results of the election:")}

{t("Number of votes:")} {" " + numVotes}

    {candidates.map((candidate, i) => { const gradeValue = candidate.grade + offsetGrade; return (
  1. {candidate.name} {i18nGradesObject.slice(0).reverse()[gradeValue].label} {/* {(100 * candidate.score).toFixed(1)}% */}
  2. ); })}

{t("Graph")}

{candidates.map((candidate, i) => { return ( {/*candidate.label*/} ); })}
{i + 1} {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 ( ); } else { return null; } })}
 
{candidates.map((candidate, i) => { return ( {i > 0 ? ", " : ""} {i + 1}: {candidate.name} ); })}
{electionGrades.map((grade, i) => { return ( {grade.label} ); })}

{t("Preference profile")}

{electionGrades.map((grade, i) => { return ( ); })} {candidates.map((candidate, i) => { return ( {gradeIds .slice(0) .reverse() .map((id, i) => { const value = candidate.profile[id]; const percent = ( (value / numVotes) * 100 ).toFixed(1); return ; })} ); })}
# {grade.label}{" "}
{i + 1}{percent} %
{candidates.map((candidate, i) => { return ( {i > 0 ? ", " : ""} {i + 1}: {candidate.name} ); })}
); } } export default withTranslation()(Result);