1
- import React , { useEffect , useRef , useState } from 'react' ;
1
+ import React , { forwardRef , useEffect , useState } from 'react' ;
2
2
import ReactDOM from 'react-dom' ;
3
3
import { useTheme } from 'styled-components' ;
4
4
import * as S from './TableModal.styled' ;
5
- import Picker from 'react-month-picker' ;
6
- import 'react-month-picker/css/month-picker.css' ;
7
5
8
6
// Deps
9
7
import { CSVLink } from 'react-csv' ;
@@ -50,6 +48,7 @@ import axios from '../../../Services/Axios';
50
48
import * as ChartHeaderStyles from '../../Charts/ChartSections/ChartHeader.styled' ;
51
49
import range from 'lodash.range' ;
52
50
import displayMissingPhrase from '../../../util/displayMissingData' ;
51
+ import DatePicker from 'react-datepicker' ;
53
52
54
53
const mapDatasetToChartName = {
55
54
STOPS : 'Traffic Stops By Percentage' ,
@@ -71,14 +70,6 @@ const mapDataSetToEnum = {
71
70
LIKELIHOOD_OF_SEARCH ,
72
71
} ;
73
72
74
- function MonthBox ( { value, _onClick } ) {
75
- return (
76
- < div className = "box" onClick = { _onClick } >
77
- < Button onClick = { ( ) => { } } > { value } </ Button >
78
- </ div >
79
- ) ;
80
- }
81
-
82
73
function getRangeValues ( ) {
83
74
const today = new Date ( ) ;
84
75
@@ -105,8 +96,9 @@ function TableModal({ chartState, dataSet, columns, isOpen, closeModal }) {
105
96
const [ rangeValue , setRangeValue ] = useState ( getRangeValues ) ;
106
97
const [ tableReloading , setReloading ] = useState ( false ) ;
107
98
const [ showDateRangePicker , setShowDateRagePicker ] = useState ( false ) ;
108
- const monthPickerRef = useRef ( null ) ;
109
99
const tableChartState = chartState ;
100
+ const [ startDate , setStartDate ] = useState ( new Date ( ) ) ;
101
+ const [ endDate , setEndDate ] = useState ( new Date ( ) ) ;
110
102
111
103
const _getEntityReference = ( ) => {
112
104
const agencyName = tableChartState . data [ AGENCY_DETAILS ] . name ;
@@ -144,8 +136,8 @@ function TableModal({ chartState, dataSet, columns, isOpen, closeModal }) {
144
136
setReloading ( true ) ;
145
137
const _fetchData = async ( ) => {
146
138
const getEndpoint = mapDatasetKeyToEndpoint ( tableDS ) ;
147
- const _from = `${ rangeValue . from . year } -${ rangeValue . from . month } -01` ;
148
- const _to = `${ rangeValue . to . year } -${ rangeValue . to . month } -01` ;
139
+ const _from = `${ rangeValue . from . year } -${ rangeValue . from . month . toString ( ) . padStart ( 2 , 0 ) } -01` ;
140
+ const _to = `${ rangeValue . to . year } -${ rangeValue . to . month . toString ( ) . padStart ( 2 , 0 ) } -01` ;
149
141
const url = `${ getEndpoint ( agencyId ) } ?from=${ _from } &to=${ _to } ` ;
150
142
yearRange = range ( rangeValue . from . year , rangeValue . to . year + 1 , 1 ) ;
151
143
try {
@@ -506,16 +498,6 @@ function TableModal({ chartState, dataSet, columns, isOpen, closeModal }) {
506
498
return '' ;
507
499
} ;
508
500
509
- const pickerLang = {
510
- months : [ 'Jan' , 'Feb' , 'Mar' , 'Apr' , 'May' , 'Jun' , 'Jul' , 'Aug' , 'Sep' , 'Oct' , 'Nov' , 'Dec' ] ,
511
- from : 'From' ,
512
- to : 'To' ,
513
- } ;
514
- const makeText = ( m ) => {
515
- if ( m && m . year && m . month ) return pickerLang . months [ m . month - 1 ] + '. ' + m . year ;
516
- return '?' ;
517
- } ;
518
-
519
501
const closeRangePicker = ( ) => {
520
502
setShowDateRagePicker ( false ) ;
521
503
setRangeValue ( getRangeValues ) ;
@@ -526,6 +508,34 @@ function TableModal({ chartState, dataSet, columns, isOpen, closeModal }) {
526
508
closeModal ( ) ;
527
509
} ;
528
510
511
+ const MonthPickerButton = forwardRef ( ( { value, onClick } , ref ) => (
512
+ < Button onClick = { onClick } ref = { ref } >
513
+ { value }
514
+ </ Button >
515
+ ) ) ;
516
+
517
+ const onDateRangeChange = ( dates ) => {
518
+ // eslint-disable-next-line prefer-const
519
+ let [ start , end ] = dates ;
520
+
521
+ setStartDate ( start ) ;
522
+
523
+ // Don't allow same month/year selected
524
+ if ( end && start . getDay ( ) === end . getDay ( ) ) {
525
+ end = new Date ( end . setMonth ( end . getMonth ( ) + 1 ) ) ;
526
+ } else {
527
+ setEndDate ( end ) ;
528
+ }
529
+
530
+ if ( start && end ) {
531
+ // Update range value on when valid start/end dates are selected
532
+ setRangeValue ( {
533
+ from : { month : start . getMonth ( ) + 1 , year : start . getFullYear ( ) } ,
534
+ to : { month : end . getMonth ( ) + 1 , year : end . getFullYear ( ) } ,
535
+ } ) ;
536
+ }
537
+ } ;
538
+
529
539
return ReactDOM . createPortal (
530
540
isOpen && (
531
541
< >
@@ -581,20 +591,21 @@ function TableModal({ chartState, dataSet, columns, isOpen, closeModal }) {
581
591
) }
582
592
{ showDateRangePicker && (
583
593
< div style = { { display : 'flex' , flexDirection : 'row' , marginTop : '10' } } >
584
- < Picker
585
- className = "MonthYearPicker"
586
- lang = { pickerLang . months }
587
- ref = { monthPickerRef }
588
- years = { { min : 2000 } }
589
- value = { rangeValue }
590
- theme = "light"
591
- onDismiss = { ( value ) => setRangeValue ( value ) }
592
- >
593
- < MonthBox
594
- value = { makeText ( rangeValue . from ) + ' ~ ' + makeText ( rangeValue . to ) }
595
- _onClick = { ( ) => monthPickerRef . current . show ( ) }
594
+ < div style = { { width : '200px' } } >
595
+ < DatePicker
596
+ selected = { startDate }
597
+ onChange = { onDateRangeChange }
598
+ startDate = { startDate }
599
+ endDate = { endDate }
600
+ maxDate = { new Date ( ) }
601
+ dateFormat = "MM/yyyy"
602
+ showMonthYearPicker
603
+ selectsRange
604
+ customInput = { < MonthPickerButton /> }
605
+ popperPlacement = "bottom-end"
606
+ monthClassName = { ( ) => 'fj-date-range-month' }
596
607
/>
597
- </ Picker >
608
+ </ div >
598
609
< Button
599
610
variant = "positive"
600
611
backgroundColor = "white"
0 commit comments