@@ -86,6 +86,9 @@ export default function Payments ({ user, userId, organization }: PaybuttonsProp
8686 const [ invoiceMode , setInvoiceMode ] = useState < 'create' | 'edit' | 'view' > ( 'create' )
8787 const [ isModalOpen , setIsModalOpen ] = useState ( false )
8888
89+ const [ startDate , setStartDate ] = useState < string > ( '' )
90+ const [ endDate , setEndDate ] = useState < string > ( '' )
91+
8992 const fetchNextInvoiceNumberByUserId = async ( ) : Promise < string > => {
9093 const response = await fetch ( '/api/invoices/invoiceNumber/' , {
9194 headers : {
@@ -136,7 +139,7 @@ export default function Payments ({ user, userId, organization }: PaybuttonsProp
136139 }
137140 useEffect ( ( ) => {
138141 setRefreshCount ( prev => prev + 1 )
139- } , [ selectedButtonIds , selectedTransactionYears ] )
142+ } , [ selectedButtonIds , selectedTransactionYears , endDate ] )
140143
141144 const fetchPaybuttons = async ( ) : Promise < any > => {
142145 const res = await fetch ( `/api/paybuttons?userId=${ user ?. userProfile . id } ` , {
@@ -193,19 +196,33 @@ export default function Payments ({ user, userId, organization }: PaybuttonsProp
193196 if ( selectedTransactionYears . length > 0 ) {
194197 url += `&years=${ selectedTransactionYears . join ( ',' ) } `
195198 }
199+ if ( startDate !== '' ) {
200+ url += `&startDate=${ startDate } `
201+ }
202+ if ( endDate !== '' ) {
203+ url += `&endDate=${ endDate } `
204+ }
196205
197- const paymentsResponse = await fetch ( url , {
198- headers : {
199- Timezone : moment . tz . guess ( )
200- }
201- } )
202206 let paymentsCountUrl = '/api/payments/count'
203207 if ( selectedButtonIds . length > 0 ) {
204208 paymentsCountUrl += `?buttonIds=${ selectedButtonIds . join ( ',' ) } `
205209 }
206210 if ( selectedTransactionYears . length > 0 ) {
207- paymentsCountUrl += `${ selectedButtonIds . length > 0 ? '&' : '?' } years=${ selectedTransactionYears . join ( ',' ) } `
211+ paymentsCountUrl += `${ paymentsCountUrl . includes ( '?' ) ? '&' : '?' } years=${ selectedTransactionYears . join ( ',' ) } `
212+ }
213+ if ( startDate !== '' ) {
214+ paymentsCountUrl += `${ paymentsCountUrl . includes ( '?' ) ? '&' : '?' } startDate=${ startDate } `
215+ }
216+ if ( endDate !== '' ) {
217+ paymentsCountUrl += `${ paymentsCountUrl . includes ( '?' ) ? '&' : '?' } endDate=${ endDate } `
208218 }
219+
220+ const paymentsResponse = await fetch ( url , {
221+ headers : {
222+ Timezone : moment . tz . guess ( )
223+ }
224+ } )
225+
209226 const paymentsCountResponse = await fetch (
210227 paymentsCountUrl ,
211228 { headers : { Timezone : timezone } }
@@ -390,8 +407,14 @@ export default function Payments ({ user, userId, organization }: PaybuttonsProp
390407 if ( selectedTransactionYears . length > 0 ) {
391408 url += `&years=${ selectedTransactionYears . join ( ',' ) } `
392409 }
393- const isCurrencyEmptyOrUndefined = ( value : string ) : boolean => ( value === '' || value === undefined )
410+ if ( startDate !== '' ) {
411+ url += `&startDate=${ startDate } `
412+ }
413+ if ( endDate !== '' ) {
414+ url += `&endDate=${ endDate } `
415+ }
394416
417+ const isCurrencyEmptyOrUndefined = ( value : string ) : boolean => ( value === '' || value === undefined )
395418 if ( ! isCurrencyEmptyOrUndefined ( currency ) ) {
396419 url += `&network=${ currency } `
397420 }
@@ -443,10 +466,13 @@ export default function Payments ({ user, userId, organization }: PaybuttonsProp
443466 const handleClearFilters = ( ) : void => {
444467 setSelectedButtonIds ( [ ] )
445468 setSelectedTransactionYears ( [ ] )
469+ setStartDate ( '' )
470+ setEndDate ( '' )
446471 }
472+
447473 return (
448474 < >
449- < TopBar title = "Payments" user = { user ?. stUser ?. email } />
475+ < TopBar title = "Payments" user = { user ?. stUser ?. email } />
450476 < div className = { style . filters_export_ctn } >
451477 < div className = { style . filter_btns } >
452478 < div
@@ -455,7 +481,7 @@ export default function Payments ({ user, userId, organization }: PaybuttonsProp
455481 >
456482 < Image src = { SettingsIcon } alt = "filters" width = { 15 } /> Filters
457483 </ div >
458- { ( selectedButtonIds . length > 0 || selectedTransactionYears . length > 0 ) &&
484+ { ( selectedButtonIds . length > 0 || selectedTransactionYears . length > 0 || startDate !== '' || endDate !== '' ) &&
459485 < div
460486 onClick = { ( ) => handleClearFilters ( ) }
461487 className = { style . show_filters_button }
@@ -524,11 +550,17 @@ export default function Payments ({ user, userId, organization }: PaybuttonsProp
524550 < div
525551 key = { y }
526552 onClick = { ( ) => {
527- setSelectedTransactionYears ( prev =>
528- prev . includes ( y )
553+ setSelectedTransactionYears ( prev => {
554+ const newYears = prev . includes ( y )
529555 ? prev . filter ( year => year !== y )
530556 : [ ...prev , y ]
531- )
557+
558+ if ( newYears . length > 0 ) {
559+ setStartDate ( '' )
560+ setEndDate ( '' )
561+ }
562+ return newYears
563+ } )
532564 } }
533565 className = { `${ style . filter_button } ${ selectedTransactionYears . includes ( y ) ? style . active : '' } ` }
534566 >
@@ -537,6 +569,38 @@ export default function Payments ({ user, userId, organization }: PaybuttonsProp
537569 ) ) }
538570 </ div >
539571 </ div >
572+ < div className = { style . showfilters_ctn } >
573+ < span > Filter by date range</ span >
574+ < div className = { style . filters_ctn } style = { { alignItems : 'center' } } >
575+ < input
576+ type = "date"
577+ value = { startDate }
578+ onChange = { ( e ) => {
579+ const newStartDate = e . target . value
580+ setStartDate ( newStartDate )
581+ if ( newStartDate !== '' ) {
582+ setSelectedTransactionYears ( [ ] )
583+ }
584+ setEndDate ( '' )
585+ } }
586+ className = { style . filter_input }
587+ />
588+ < span style = { { margin : '0 8px' } } > to</ span >
589+ < input
590+ type = "date"
591+ value = { endDate }
592+ onChange = { ( e ) => {
593+ const newEndDate = e . target . value
594+ setEndDate ( newEndDate )
595+ if ( newEndDate !== '' ) {
596+ setSelectedTransactionYears ( [ ] )
597+ }
598+ } }
599+ min = { startDate !== '' ? startDate : undefined }
600+ className = { style . filter_input }
601+ />
602+ </ div >
603+ </ div >
540604 </ div >
541605 ) }
542606 < TableContainerGetter
0 commit comments