11/* eslint-disable react/jsx-props-no-spreading */
22import React , { useState , useEffect } from 'react' ;
3+ import PropTypes from 'prop-types' ;
34import {
45 Table as ReactTable ,
56 Container ,
67 Row ,
78 Badge ,
9+ Progress ,
810 NavLink ,
911 Button ,
1012 Modal ,
@@ -13,6 +15,7 @@ import {
1315} from 'reactstrap' ;
1416import Toggle from 'react-toggle' ;
1517import ReactTooltip from 'react-tooltip' ;
18+ import { PieChart } from 'react-minimal-pie-chart' ;
1619import { useTable , useFilters , useSortBy } from 'react-table' ;
1720import {
1821 FaLock ,
@@ -75,10 +78,16 @@ const Table = () => {
7578 }
7679 }
7780
78- const difficultyMap = { Easy : 0 , Medium : 0 , Hard : 0 } ;
79- const totalDifficultyCount = { Easy : 0 , Medium : 0 , Hard : 0 } ;
81+ const difficultyMap = { Easy : 0 , Medium : 0 , Hard : 0 , Total : 0 } ;
82+ const totalDifficultyCount = {
83+ Easy : 0 ,
84+ Medium : 0 ,
85+ Hard : 0 ,
86+ Total : questions . length ,
87+ } ;
8088 for ( let i = 0 ; i < questions . length ; i += 1 ) {
8189 difficultyMap [ questions [ i ] . difficulty ] += checkedList [ questions [ i ] . id ] ;
90+ difficultyMap . Total += checkedList [ questions [ i ] . id ] ;
8291 totalDifficultyCount [ questions [ i ] . difficulty ] += 1 ;
8392 }
8493
@@ -109,7 +118,7 @@ const Table = () => {
109118 const resetHandler = ( ) => {
110119 setChecked ( new Array ( checked . length ) . fill ( false ) ) ;
111120 setDifficultyCount ( ( ) => {
112- return { Easy : 0 , Medium : 0 , Hard : 0 } ;
121+ return { Easy : 0 , Medium : 0 , Hard : 0 , Total : 0 } ;
113122 } ) ;
114123 const count = resetCount + 1 ;
115124 setResetCount ( count ) ;
@@ -128,51 +137,30 @@ const Table = () => {
128137 } ;
129138
130139 return (
131- < span >
132- < Badge className = "" pill >
133- < span
134- data-tip = { `You've completed ${ difficultyCount . Easy +
135- difficultyCount . Medium +
136- difficultyCount . Hard } /${ totalDifficultyCount . Easy +
137- totalDifficultyCount . Medium +
138- totalDifficultyCount . Hard } total questions`}
139- >
140- Total:{ ' ' }
141- { difficultyCount . Easy +
142- difficultyCount . Medium +
143- difficultyCount . Hard }
144- /
145- { totalDifficultyCount . Easy +
146- totalDifficultyCount . Medium +
147- totalDifficultyCount . Hard }
148- </ span >
149- </ Badge >
150- < br />
151- < Badge className = "easy" pill >
152- < span
153- data-tip = { `You've completed ${ difficultyCount . Easy } /${ totalDifficultyCount . Easy } easy questions` }
154- >
155- Easy: { difficultyCount . Easy } /{ totalDifficultyCount . Easy }
156- </ span >
157- </ Badge >
158- < br />
159- < Badge className = "medium" pill >
160- < span
161- data-tip = { `You've completed ${ difficultyCount . Medium } /${ totalDifficultyCount . Medium } medium questions` }
162- >
163- Medium: { difficultyCount . Medium } /
164- { totalDifficultyCount . Medium }
165- </ span >
166- </ Badge >
167- < br />
168- < Badge className = "hard" pill >
169- < span
170- data-tip = { `You've completed ${ difficultyCount . Hard } /${ totalDifficultyCount . Hard } hard questions` }
171- >
172- Hard: { difficultyCount . Hard } /{ totalDifficultyCount . Hard }
173- </ span >
174- </ Badge >
175- < br />
140+ < span className = "d-flex flex-column justify-content-between" >
141+ < PieChart
142+ data = { [
143+ {
144+ title : 'One' ,
145+ value : difficultyCount . Total ,
146+ color : '#ffa929' ,
147+ } ,
148+ ] }
149+ totalValue = { totalDifficultyCount . Total }
150+ label = { ( ) =>
151+ `${ difficultyCount . Total } /
152+ ${ totalDifficultyCount . Total } `
153+ }
154+ labelPosition = { 0 }
155+ labelStyle = { {
156+ // Needed for Dark Reader to work
157+ fill : 'black' ,
158+ } }
159+ startAngle = { - 90 }
160+ lineWidth = { 12 }
161+ className = "progress-pie"
162+ background = "#e9ecef"
163+ />
176164 < Button
177165 className = "reset-button"
178166 outline
@@ -226,6 +214,7 @@ const Table = () => {
226214 difficultyCount [
227215 cellInfo . row . original . difficulty
228216 ] += additive ;
217+ difficultyCount . Total += additive ;
229218 setDifficultyCount ( difficultyCount ) ;
230219 setChecked ( [ ...checked ] ) ;
231220 setData ( filteredByCheckbox ( ) ) ;
@@ -249,6 +238,27 @@ const Table = () => {
249238 } ;
250239 return (
251240 < >
241+ < div id = "difficultyProgress" >
242+ < ProgressBar
243+ style = { { marginBottom : 10 } }
244+ name = "Easy"
245+ value = { difficultyCount . Easy }
246+ total = { totalDifficultyCount . Easy }
247+ barClassName = "easy"
248+ />
249+ < ProgressBar
250+ name = "Medium"
251+ value = { difficultyCount . Medium }
252+ total = { totalDifficultyCount . Medium }
253+ barClassName = "medium"
254+ />
255+ < ProgressBar
256+ name = "Hard"
257+ value = { difficultyCount . Hard }
258+ total = { totalDifficultyCount . Hard }
259+ barClassName = "hard"
260+ />
261+ </ div >
252262 < div
253263 style = { { whiteSpace : 'nowrap' , display : 'inline-block' } }
254264 >
@@ -525,4 +535,35 @@ const Table = () => {
525535 ) ;
526536} ;
527537
538+ const ProgressBar = ( { name, value, total, className, barClassName } ) => {
539+ return (
540+ < div >
541+ < div className = "d-flex justify-content-between" >
542+ < div > { name } </ div >
543+ < div >
544+ { value } /{ total }
545+ </ div >
546+ </ div >
547+ < Progress
548+ className = { className }
549+ barClassName = { barClassName }
550+ value = { ( value / total ) * 100 }
551+ />
552+ </ div >
553+ ) ;
554+ } ;
555+
556+ ProgressBar . propTypes = {
557+ name : PropTypes . string . isRequired ,
558+ value : PropTypes . number . isRequired ,
559+ total : PropTypes . number . isRequired ,
560+ className : PropTypes . string ,
561+ barClassName : PropTypes . string ,
562+ } ;
563+
564+ ProgressBar . defaultProps = {
565+ className : 'progress-bar-sm' ,
566+ barClassName : null ,
567+ } ;
568+
528569export default Table ;
0 commit comments