added table filter

This commit was merged in pull request #30.
This commit is contained in:
victorAnumudu
2025-05-26 11:07:33 +01:00
parent b3a73942bc
commit 2a5d6b5b39
9 changed files with 253 additions and 100 deletions
+63 -19
View File
@@ -1,13 +1,9 @@
import React, { useState } from 'react'
import { useQuery } from "@tanstack/react-query";
import { useEffect, useState } from 'react'
import {Link} from 'react-router-dom'
import BreadcrumbCom from '../breadcrumb/BreadcrumbCom'
import TablePaginatedWrapper from '../tableWrapper/TablePaginatedWrapper'
import Icons from '../Icons'
import Avatar from '../../assets/user_avatar.jpg'
import queryKeys from '../../services/queryKeys'
import { getTransactions } from '../../services/siteServices'
import getDateFromDateString from '../../helpers/GetDateFromDateString';
import getTimeFromDateString from '../../helpers/GetTimeFromDateString';
@@ -17,29 +13,76 @@ import RouteLinks from '../../RouteLinks';
export default function TransactionsCom() {
const [page, setPage] = useState(1)
const [allTransactions, setAllTransaction] = useState({loading:true, error:'', data:{}})
const {data, isFetching, isError, error, isPlaceholderData, isPending} = useQuery({
queryKey: [...queryKeys.transactions, page],
queryFn: () => getTransactions({page}),
staleTime: 0,
// placeholderData: keepPreviousData,
})
const [willFilter, setWillFilter] = useState(false)
const [filter, setFilter] = useState({transaction_id: '', account_id: ''})
const handleFilter = ({target:{name, value}}) => {
setFilter(prev => ({...prev, [name]:value}))
}
const transactions = data?.data?.transactions // TRANSACTIONS LIST
const pagination = data?.data?.pagination
const handleFilterByParams = () => {
setPage(1)
setWillFilter(prev => !prev)
}
const transactions = allTransactions?.data?.transactions // TRANSACTIONS LIST
const pagination = allTransactions?.data?.pagination
const isFetching = allTransactions?.loading
const isError = allTransactions?.error
useEffect(()=>{
setAllTransaction(prev => ({...prev, loading:true}))
getTransactions({...filter, page}).then(res => {
if(res?.status != 200){
setAllTransaction(prev => ({...prev, loading:false}))
return
}
setAllTransaction({loading:false, error:'', data:res?.data})
}).catch(err => {
setAllTransaction({loading:false, error:'error occurred', data:{}})
console.log('ERR', err)
})
},[page, willFilter])
return (
<div className='w-full flex flex-col gap-8'>
<BreadcrumbCom title='Transactions' paths={['Dashboard', 'Transactions']} />
<div className='box bg-white dark:bg-black-box text-black-body dark:text-white-body'>
{isFetching ?
<>
<p className='text-slate-800'>Loading...</p>
</>
: isError ?
<p className='text-red-500'>{error.message}</p>
{ isError ?
<p className='text-red-500'>{allTransactions?.error}</p>
:
<>
{/* filter section */}
<div className='px-2 py-2 mb-4 flex flex-col sm:flex-row flex-wrap sm:items-center gap-2'>
<Icons name='filter' className='text-3xl' />
<div className='w-full sm:max-w-48'>
<p>Transaction ID</p>
<select name='transaction_id' value={filter?.transaction_id} className='h-10 w-full p-2 rounded-md' onChange={handleFilter}>
<option value=''>All</option>
<>
{transactions?.map((item, index) => (
<option key={index} value={item?.transaction_id}>{item?.transaction_id}</option>
))}
</>
</select>
</div>
<div className='w-full sm:max-w-48'>
<p>Account ID</p>
<select name='account_id' value={filter?.account_id} className='h-10 w-full p-2 rounded-md' onChange={handleFilter}>
<option value=''>All</option>
<>
{transactions?.map((item, index) => (
<option key={index} value={item?.account_id}>{item?.account_id}</option>
))}
</>
</select>
</div>
<button onClick={handleFilterByParams} className={`h-10 bg-primary px-2 py-1 rounded-md text-white font-medium sm:self-end`}>Submit</button>
</div>
{/* end of filter section */}
<TablePaginatedWrapper data={transactions} isFetching={isFetching} setPage={setPage} itemsPerPage={pagination?.limit} pagination={pagination}>
{({ data }) => (
<>
@@ -111,6 +154,7 @@ export default function TransactionsCom() {
</>
)}
</TablePaginatedWrapper>
</>
}
</div>
</div>