@@ -72,6 +72,9 @@ export default function Payments ({ user, userId, organization }: PaybuttonsProp
7272 const timezone = user ?. userProfile . preferredTimezone === '' ? moment . tz . guess ( ) : user ?. userProfile ?. preferredTimezone
7373 const [ selectedCurrencyCSV , setSelectedCurrencyCSV ] = useState < string > ( '' )
7474 const [ paybuttonNetworks , setPaybuttonNetworks ] = useState < Set < number > > ( new Set ( ) )
75+ const [ transactionYears , setTransactionYears ] = useState < number [ ] > ( [ ] )
76+ const [ selectedTransactionYears , setSelectedTransactionYears ] = useState < number [ ] > ( [ ] )
77+
7578 const [ loading , setLoading ] = useState ( false )
7679 const [ buttons , setButtons ] = useState < any [ ] > ( [ ] )
7780 const [ selectedButtonIds , setSelectedButtonIds ] = useState < any [ ] > ( [ ] )
@@ -133,7 +136,7 @@ export default function Payments ({ user, userId, organization }: PaybuttonsProp
133136 }
134137 useEffect ( ( ) => {
135138 setRefreshCount ( prev => prev + 1 )
136- } , [ selectedButtonIds ] )
139+ } , [ selectedButtonIds , selectedTransactionYears ] )
137140
138141 const fetchPaybuttons = async ( ) : Promise < any > => {
139142 const res = await fetch ( `/api/paybuttons?userId=${ user ?. userProfile . id } ` , {
@@ -144,8 +147,21 @@ export default function Payments ({ user, userId, organization }: PaybuttonsProp
144147 }
145148 }
146149
150+ const fetchTransactionYears = async ( ) : Promise < any > => {
151+ const res = await fetch ( '/api/transaction/years' , {
152+ method : 'GET'
153+ } )
154+ if ( res . status === 200 ) {
155+ const data = await res . json ( )
156+ return data . years
157+ } else {
158+ console . error ( 'Failed to fetch transaction years:' , res . statusText )
159+ return [ ]
160+ }
161+ }
147162 const getDataAndSetUpCurrencyCSV = async ( ) : Promise < void > => {
148163 const paybuttons = await fetchPaybuttons ( )
164+ const years = await fetchTransactionYears ( )
149165 const networkIds : Set < number > = new Set ( )
150166 setButtons ( paybuttons )
151167
@@ -154,6 +170,7 @@ export default function Payments ({ user, userId, organization }: PaybuttonsProp
154170 } )
155171
156172 setPaybuttonNetworks ( networkIds )
173+ setTransactionYears ( years )
157174 }
158175
159176 useEffect ( ( ) => {
@@ -173,10 +190,24 @@ export default function Payments ({ user, userId, organization }: PaybuttonsProp
173190 if ( selectedButtonIds . length > 0 ) {
174191 url += `&buttonIds=${ selectedButtonIds . join ( ',' ) } `
175192 }
193+ if ( selectedTransactionYears . length > 0 ) {
194+ url += `&years=${ selectedTransactionYears . join ( ',' ) } `
195+ }
176196
177- const paymentsResponse = await fetch ( url )
197+ const paymentsResponse = await fetch ( url , {
198+ headers : {
199+ Timezone : moment . tz . guess ( )
200+ }
201+ } )
202+ let paymentsCountUrl = '/api/payments/count'
203+ if ( selectedButtonIds . length > 0 ) {
204+ paymentsCountUrl += `?buttonIds=${ selectedButtonIds . join ( ',' ) } `
205+ }
206+ if ( selectedTransactionYears . length > 0 ) {
207+ paymentsCountUrl += `${ selectedButtonIds . length > 0 ? '&' : '?' } years=${ selectedTransactionYears . join ( ',' ) } `
208+ }
178209 const paymentsCountResponse = await fetch (
179- `/api/payments/count ${ selectedButtonIds . length > 0 ? `?buttonIds= ${ selectedButtonIds . join ( ',' ) } ` : '' } ` ,
210+ paymentsCountUrl ,
180211 { headers : { Timezone : timezone } }
181212 )
182213
@@ -312,7 +343,7 @@ export default function Payments ({ user, userId, organization }: PaybuttonsProp
312343
313344 < Image src = { Plus } alt = 'create invoice' width = { 14 } height = { 14 } />
314345 </ button >
315- < div className = { style . tooltiptext } > New button </ div >
346+ < div className = { style . tooltiptext } > New Invoice </ div >
316347 </ div >
317348 )
318349 : (
@@ -356,6 +387,9 @@ export default function Payments ({ user, userId, organization }: PaybuttonsProp
356387 if ( selectedButtonIds . length > 0 ) {
357388 url += `&buttonIds=${ selectedButtonIds . join ( ',' ) } `
358389 }
390+ if ( selectedTransactionYears . length > 0 ) {
391+ url += `&years=${ selectedTransactionYears . join ( ',' ) } `
392+ }
359393 const isCurrencyEmptyOrUndefined = ( value : string ) : boolean => ( value === '' || value === undefined )
360394
361395 if ( ! isCurrencyEmptyOrUndefined ( currency ) ) {
@@ -406,7 +440,10 @@ export default function Payments ({ user, userId, organization }: PaybuttonsProp
406440 setSelectedCurrencyCSV ( currencyParam )
407441 void downloadCSV ( userId , user ?. userProfile , currencyParam )
408442 }
409-
443+ const handleClearFilters = ( ) : void => {
444+ setSelectedButtonIds ( [ ] )
445+ setSelectedTransactionYears ( [ ] )
446+ }
410447 return (
411448 < >
412449 < TopBar title = "Payments" user = { user ?. stUser ?. email } />
@@ -418,9 +455,9 @@ export default function Payments ({ user, userId, organization }: PaybuttonsProp
418455 >
419456 < Image src = { SettingsIcon } alt = "filters" width = { 15 } /> Filters
420457 </ div >
421- { selectedButtonIds . length > 0 &&
458+ { ( selectedButtonIds . length > 0 || selectedTransactionYears . length > 0 ) &&
422459 < div
423- onClick = { ( ) => setSelectedButtonIds ( [ ] ) }
460+ onClick = { ( ) => handleClearFilters ( ) }
424461 className = { style . show_filters_button }
425462 >
426463 Clear
@@ -459,6 +496,7 @@ export default function Payments ({ user, userId, organization }: PaybuttonsProp
459496 </ Button > ) }
460497 </ div >
461498 { showFilters && (
499+ < div >
462500 < div className = { style . showfilters_ctn } >
463501 < span > Filter by button</ span >
464502 < div className = { style . filters_ctn } >
@@ -479,6 +517,27 @@ export default function Payments ({ user, userId, organization }: PaybuttonsProp
479517 ) ) }
480518 </ div >
481519 </ div >
520+ < div className = { style . showfilters_ctn } >
521+ < span > Filter by year</ span >
522+ < div className = { style . filters_ctn } >
523+ { transactionYears . map ( ( y ) => (
524+ < div
525+ key = { y }
526+ onClick = { ( ) => {
527+ setSelectedTransactionYears ( prev =>
528+ prev . includes ( y )
529+ ? prev . filter ( year => year !== y )
530+ : [ ...prev , y ]
531+ )
532+ } }
533+ className = { `${ style . filter_button } ${ selectedTransactionYears . includes ( y ) ? style . active : '' } ` }
534+ >
535+ { y }
536+ </ div >
537+ ) ) }
538+ </ div >
539+ </ div >
540+ </ div >
482541 ) }
483542 < TableContainerGetter
484543 columns = { columns }
0 commit comments