Compare commits

..

1 Commits

Author SHA1 Message Date
victorAnumudu 0e0066fec3 list pagination modified 2024-05-10 11:49:31 +01:00
7 changed files with 165 additions and 210 deletions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

+22 -36
View File
@@ -1,23 +1,18 @@
import clsx from 'clsx'; import clsx from 'clsx'
import { KTIcon, toAbsoluteUrl } from '../../../helpers'; import {KTIcon, toAbsoluteUrl} from '../../../helpers'
import { import {HeaderNotificationsMenu, HeaderUserMenu, Search, ThemeModeSwitcher} from '../../../partials'
HeaderNotificationsMenu, import {useLayout} from '../../core'
HeaderUserMenu,
Search,
ThemeModeSwitcher,
} from '../../../partials';
import { useLayout } from '../../core';
const itemClass = 'ms-1 ms-md-4'; const itemClass = 'ms-1 ms-md-4'
const btnClass = const btnClass =
'btn btn-icon btn-custom btn-icon-muted btn-active-light btn-active-color-primary w-35px h-35px'; 'btn btn-icon btn-custom btn-icon-muted btn-active-light btn-active-color-primary w-35px h-35px'
const userAvatarClass = 'symbol-35px'; const userAvatarClass = 'symbol-35px'
const btnIconClass = 'fs-2'; const btnIconClass = 'fs-2'
const Navbar = () => { const Navbar = () => {
const { config } = useLayout(); const {config} = useLayout()
return ( return (
<div className="app-navbar flex-shrink-0"> <div className='app-navbar flex-shrink-0'>
{/* <div className={clsx('app-navbar-item align-items-stretch', itemClass)}> {/* <div className={clsx('app-navbar-item align-items-stretch', itemClass)}>
<Search /> <Search />
</div> */} </div> */}
@@ -48,42 +43,33 @@ const Navbar = () => {
</div> */} </div> */}
<div className={clsx('app-navbar-item', itemClass)}> <div className={clsx('app-navbar-item', itemClass)}>
<ThemeModeSwitcher <ThemeModeSwitcher toggleBtnClass={clsx('btn-active-light-primary btn-custom')} />
toggleBtnClass={clsx('btn-active-light-primary btn-custom')}
/>
</div> </div>
<div className={clsx('app-navbar-item', itemClass)}> <div className={clsx('app-navbar-item', itemClass)}>
<div <div
className={clsx('cursor-pointer symbol', userAvatarClass)} className={clsx('cursor-pointer symbol', userAvatarClass)}
data-kt-menu-trigger="{default: 'click'}" data-kt-menu-trigger="{default: 'click'}"
data-kt-menu-attach="parent" data-kt-menu-attach='parent'
data-kt-menu-placement="bottom-end" data-kt-menu-placement='bottom-end'
> >
<img <img src={toAbsoluteUrl('media/avatars/300-3.jpg')} alt='' />
src={toAbsoluteUrl('media/avatars/300-3.jpg')}
alt=""
style={{ cursor: 'auto' }}
/>
</div> </div>
{/* <HeaderUserMenu /> */} <HeaderUserMenu />
</div> </div>
{config.app?.header?.default?.menu?.display && ( {config.app?.header?.default?.menu?.display && (
<div <div className='app-navbar-item d-lg-none ms-2 me-n3' title='Show header menu'>
className="app-navbar-item d-lg-none ms-2 me-n3"
title="Show header menu"
>
<div <div
className="btn btn-icon btn-active-color-primary w-35px h-35px" className='btn btn-icon btn-active-color-primary w-35px h-35px'
id="kt_app_header_menu_toggle" id='kt_app_header_menu_toggle'
> >
<KTIcon iconName="text-align-left" className={btnIconClass} /> <KTIcon iconName='text-align-left' className={btnIconClass} />
</div> </div>
</div> </div>
)} )}
</div> </div>
); )
}; }
export { Navbar }; export {Navbar}
@@ -57,7 +57,7 @@ export default function RecentBVNList({
},[itemsPerPage]) },[itemsPerPage])
return ( return (
<div className="w-full d-flex flex-column h-100"> <div className="w-full">
<h1 className={`text-2xl mb-5 font-semibold ${titleClass && titleClass}`}>{tableTitle}</h1> <h1 className={`text-2xl mb-5 font-semibold ${titleClass && titleClass}`}>{tableTitle}</h1>
{data.length > 0 && filterItem && ( {data.length > 0 && filterItem && (
@@ -86,7 +86,7 @@ export default function RecentBVNList({
{/* show prev and next button if data exist */} {/* show prev and next button if data exist */}
{(data.length > 0 && data.length > itemsPerPage) && ( {(data.length > 0 && data.length > itemsPerPage) && (
<div className="w-full h-100 d-flex gap-4 justify-content-center align-items-end"> <div className="mt-2 mt-sm-5 w-full d-flex gap-4 justify-content-center align-items-center">
<button <button
onClick={handlePrev} onClick={handlePrev}
className={`text-sm md:text-lg d-flex justify-content-center align-items-center border-1 transition-all duration-300 ${ className={`text-sm md:text-lg d-flex justify-content-center align-items-center border-1 transition-all duration-300 ${
@@ -94,7 +94,6 @@ export default function RecentBVNList({
? "text-slate-400 border-slate-400 dark:text-slate-400 dark:border-slate-400 pe-none" ? "text-slate-400 border-slate-400 dark:text-slate-400 dark:border-slate-400 pe-none"
: "text-slate-600 border-slate-600 dark:text-white dark:border-white" : "text-slate-600 border-slate-600 dark:text-white dark:border-white"
}`} }`}
disabled={currentPage == 0}
// style={{width:'30px', height:'30px'}} // style={{width:'30px', height:'30px'}}
> >
&lt; Previous &lt; Previous
@@ -107,12 +106,11 @@ export default function RecentBVNList({
<button <button
key={index} key={index}
onClick={handleNext} onClick={handleNext}
className={`text-sm md:text-lg rounded-circle d-flex justify-content-center align-items-center border-1 transition-all duration-300 ${ className={`text-sm md:text-lg d-flex justify-content-center align-items-center border-1 transition-all duration-300 ${
currentPage != index currentPage != index
? "text-slate-400 border-slate-400 dark:text-slate-400 dark:border-slate-400" ? "text-slate-400 border-slate-400 dark:text-slate-400 dark:border-slate-400"
: "text-slate-600 border-slate-600 dark:text-white dark:border-white pe-none" : "text-slate-600 border-slate-600 dark:text-white dark:border-white pe-none"
}`} }`}
disabled={currentPage != index}
style={{width:'30px', height:'30px'}} style={{width:'30px', height:'30px'}}
> >
{index/itemsPerPage +1} {index/itemsPerPage +1}
@@ -128,10 +126,9 @@ export default function RecentBVNList({
? "text-slate-400 border-slate-400 dark:text-slate-400 dark:border-slate-400 pe-none" ? "text-slate-400 border-slate-400 dark:text-slate-400 dark:border-slate-400 pe-none"
: "text-slate-600 border-slate-600 dark:text-white dark:border-white" : "text-slate-600 border-slate-600 dark:text-white dark:border-white"
}`} }`}
disabled={currentPage + numberOfSelection >= data.length}
// style={{width:'30px', height:'30px'}} // style={{width:'30px', height:'30px'}}
> >
Next &gt; Next &gt;
</button> </button>
</div> </div>
)} )}
@@ -57,7 +57,7 @@ export default function RecentLoanAppList({
},[itemsPerPage]) },[itemsPerPage])
return ( return (
<div className="w-full d-flex flex-column h-100"> <div className="w-full">
<h1 className={`text-2xl mb-5 font-semibold ${titleClass && titleClass}`}>{tableTitle}</h1> <h1 className={`text-2xl mb-5 font-semibold ${titleClass && titleClass}`}>{tableTitle}</h1>
{data.length > 0 && filterItem && ( {data.length > 0 && filterItem && (
@@ -86,7 +86,7 @@ export default function RecentLoanAppList({
{/* show prev and next button if data exist */} {/* show prev and next button if data exist */}
{(data.length > 0 && data.length > itemsPerPage) && ( {(data.length > 0 && data.length > itemsPerPage) && (
<div className="w-full h-100 d-flex gap-4 justify-content-center align-items-end"> <div className="mt-2 mt-sm-5 w-full d-flex gap-4 justify-content-center align-items-center">
<button <button
onClick={handlePrev} onClick={handlePrev}
className={`text-sm md:text-lg d-flex justify-content-center align-items-center border-1 transition-all duration-300 ${ className={`text-sm md:text-lg d-flex justify-content-center align-items-center border-1 transition-all duration-300 ${
@@ -94,7 +94,6 @@ export default function RecentLoanAppList({
? "text-slate-400 border-slate-400 dark:text-slate-400 dark:border-slate-400 pe-none" ? "text-slate-400 border-slate-400 dark:text-slate-400 dark:border-slate-400 pe-none"
: "text-slate-600 border-slate-600 dark:text-white dark:border-white" : "text-slate-600 border-slate-600 dark:text-white dark:border-white"
}`} }`}
disabled={currentPage == 0}
// style={{width:'30px', height:'30px'}} // style={{width:'30px', height:'30px'}}
> >
&lt; Previous &lt; Previous
@@ -112,7 +111,6 @@ export default function RecentLoanAppList({
? "text-slate-400 border-slate-400 dark:text-slate-400 dark:border-slate-400" ? "text-slate-400 border-slate-400 dark:text-slate-400 dark:border-slate-400"
: "text-slate-600 border-slate-600 dark:text-white dark:border-white pe-none" : "text-slate-600 border-slate-600 dark:text-white dark:border-white pe-none"
}`} }`}
disabled={currentPage != index}
style={{width:'30px', height:'30px'}} style={{width:'30px', height:'30px'}}
> >
{index/itemsPerPage +1} {index/itemsPerPage +1}
@@ -128,7 +126,6 @@ export default function RecentLoanAppList({
? "text-slate-400 border-slate-400 dark:text-slate-400 dark:border-slate-400 pe-none" ? "text-slate-400 border-slate-400 dark:text-slate-400 dark:border-slate-400 pe-none"
: "text-slate-600 border-slate-600 dark:text-white dark:border-white" : "text-slate-600 border-slate-600 dark:text-white dark:border-white"
}`} }`}
disabled={currentPage + numberOfSelection >= data.length}
// style={{width:'30px', height:'30px'}} // style={{width:'30px', height:'30px'}}
> >
Next &gt; Next &gt;
-24
View File
@@ -1,24 +0,0 @@
// FUNCTION TO RETURN AMOUNT TO TWO DECIMAL PLACES
export const AmountTo2DP = (
amount = "00",
) => {
// Convert the number to a string
let numStr = String(amount);
// Split the string into integer and decimal parts
let parts = numStr.split(".");
let integerPart = parts[0] || "";
let decimalPart = parts[1] || "";
// Add thousands separators to the integer part
let formattedInteger = integerPart.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
// Truncate or pad the decimal part to two decimal points
let formattedDecimal = decimalPart.slice(0, 2).padEnd(2, "0");
// Combine the formatted integer and decimal parts
let formattedNumber = formattedInteger + '.' + formattedDecimal;
// return formattedNumber;
return formattedNumber;
};
@@ -17,9 +17,9 @@ const ListsWidget3: React.FC<Props> = ({dashData, className}) => {
{/* begin::Header */} {/* begin::Header */}
<div className='card-header border-0'> <div className='card-header border-0'>
<h3 className='card-title fw-bold text-gray-900'>BVN Verification</h3> <h3 className='card-title fw-bold text-gray-900'>BVN Verification</h3>
{/* begin::Menu */} <div className='card-toolbar'>
{/* <div className='card-toolbar'> {/* begin::Menu */}
<button {/* <button
type='button' type='button'
className='btn btn-sm btn-icon btn-color-primary btn-active-light-primary' className='btn btn-sm btn-icon btn-color-primary btn-active-light-primary'
data-kt-menu-trigger='click' data-kt-menu-trigger='click'
@@ -27,43 +27,43 @@ const ListsWidget3: React.FC<Props> = ({dashData, className}) => {
data-kt-menu-flip='top-end' data-kt-menu-flip='top-end'
> >
<KTIcon iconName='category' className='fs-2' /> <KTIcon iconName='category' className='fs-2' />
</button> </button> */}
<Dropdown1 /> {/* <Dropdown1 /> */}
</div> */} {/* end::Menu */}
{/* end::Menu */} </div>
</div> </div>
{/* end::Header */} {/* end::Header */}
{/* begin::Body */} {/* begin::Body */}
<div className='card-body pt-0'> <div className='card-body pt-2'>
{dashData?.loading ? {dashData?.loading ?
null null
: :
dashData?.data?.recent_bvn && dashData?.data?.recent_bvn.length ? dashData?.data?.recent_bvn && dashData?.data?.recent_bvn.length ?
<RecentBVNList <RecentBVNList
data = {dashData?.data?.recent_bvn} data = {dashData?.data?.recent_bvn}
itemsPerPage={7} itemsPerPage={5}
> >
{(data:RecentBVNProps) => ( {(data:RecentBVNProps) => (
<> <>
{data?.map(item => ( {data?.map(item => (
<div key={item?.uid} className='d-flex align-items-center mb-8'> <div key={item?.uid} className='d-flex align-items-center mb-8'>
{/* begin::Bullet */} {/* begin::Bullet */}
<span className='bullet bullet-vertical h-40px bg-primary me-5'></span> <span className='bullet bullet-vertical h-40px bg-primary'></span>
{/* end::Bullet */} {/* end::Bullet */}
{/* begin::Checkbox */} {/* begin::Checkbox */}
{/* <div className='form-check form-check-custom form-check-solid mx-5'> <div className='form-check form-check-custom form-check-solid mx-5'>
<input className='form-check-input' type='checkbox' value='' /> <input className='form-check-input' type='checkbox' value='' />
</div> */} </div>
{/* end::Checkbox */} {/* end::Checkbox */}
{/* begin::Description */} {/* begin::Description */}
<div className='flex-grow-1'> <div className='flex-grow-1'>
<span className='text-gray-800 fw-bold fs-6'> <a href='#' className='text-gray-800 text-hover-primary fw-bold fs-6'>
{item?.bvn} {item?.bvn}
</span> </a>
<span className='text-muted fw-semibold d-block'>{NewDateTimeFormatter(item?.added)}</span> <span className='text-muted fw-semibold d-block'>{NewDateTimeFormatter(item?.added)}</span>
</div> </div>
{/* end::Description */} {/* end::Description */}
<span className='badge badge-light-primary fs-8 fw-bold'>status: {item?.status}</span> <span className='badge badge-light-primary fs-8 fw-bold'>New</span>
</div> </div>
))} ))}
</> </>
@@ -1,10 +1,10 @@
import { FC } from 'react' import { FC } from 'react'
import {KTIcon, toAbsoluteUrl} from '../../../helpers' import {KTIcon, toAbsoluteUrl} from '../../../helpers'
import { DashDataProps } from '../../../../app/pages/dashboard/model' import { DashDataProps, RecentApplicationsProps } from '../../../../app/pages/dashboard/model'
import { NewDateTimeFormatter } from '../../../lib/NewDateTimeFormatter' import { NewDateTimeFormatter } from '../../../lib/NewDateTimeFormatter'
import { Link } from 'react-router-dom' import RecentLoanAppList from '../../../layout/components/paginatedListing/RecentLoanAppList'
import { AmountTo2DP } from '../../../lib/AmountFormatter'
type Props = { type Props = {
className: string className: string
@@ -15,12 +15,11 @@ const TablesWidget10: FC<Props> = ({className, dashData}) => {
return ( return (
<div className={`card ${className}`}> <div className={`card ${className}`}>
{/* begin::Header */} {/* begin::Header */}
<div className='card-header border-0'> <div className='card-header border-0 pt-5'>
<h3 className='card-title fw-bold text-gray-900'>Recent Loan Application</h3> <h3 className='card-title align-items-start flex-column'>
{/* <h3 className='card-title align-items-start flex-column'> <span className='card-label fw-bold fs-3 mb-1'>Recent Loan Application</span>
<span className='card-label fw-bold fs-3'>Recent Loan Application</span> {/* <span className='text-muted mt-1 fw-semibold fs-7'>Over 500 members</span> */}
<span className='text-muted mt-1 fw-semibold fs-7'>Over 500 members</span> </h3>
</h3> */}
{/* <div {/* <div
className='card-toolbar' className='card-toolbar'
data-bs-toggle='tooltip' data-bs-toggle='tooltip'
@@ -43,124 +42,124 @@ const TablesWidget10: FC<Props> = ({className, dashData}) => {
{dashData?.loading ? {dashData?.loading ?
null null
: dashData?.data?.recent_applications ? : dashData?.data?.recent_applications ?
<> <RecentLoanAppList
<div className='card-body py-0'> data={dashData?.data?.recent_applications}
{/* begin::Table container */} itemsPerPage={5}
<div className='table-responsive'> >
{/* begin::Table */} {(data:RecentApplicationsProps)=>(
<table className='table table-row-dashed table-row-gray-300 align-middle gs-0 gy-4'> <>
{/* begin::Table head */} <div className='card-body py-3'>
<thead> {/* begin::Table container */}
<tr className='fw-bold text-muted'> <div className='table-responsive'>
<th className='w-25px'> {/* begin::Table */}
<div className='form-check form-check-sm form-check-custom form-check-solid'> <table className='table table-row-dashed table-row-gray-300 align-middle gs-0 gy-4'>
<input {/* begin::Table head */}
className='form-check-input' <thead>
type='checkbox' <tr className='fw-bold text-muted'>
value='1' <th className='w-25px'>
data-kt-check='true' <div className='form-check form-check-sm form-check-custom form-check-solid'>
data-kt-check-target='.widget-9-check' <input
/> className='form-check-input'
</div> type='checkbox'
</th> value='1'
<th className='min-w-150px'>Authors</th> data-kt-check='true'
<th className='min-w-140px'>Amount (NGN)</th> data-kt-check-target='.widget-9-check'
<th className='min-w-120px'>Progress</th> />
<th className='min-w-100px text-end'>Actions</th> </div>
</tr> </th>
</thead> <th className='min-w-150px'>Authors</th>
{/* end::Table head */} <th className='min-w-140px'>Amount</th>
{/* begin::Table body */} <th className='min-w-120px'>Progress</th>
<tbody> <th className='min-w-100px text-end'>Actions</th>
{dashData?.data?.recent_applications && dashData?.data?.recent_applications.length ? </tr>
dashData?.data?.recent_applications.map((item, index:any) => { </thead>
if(index < 6){ {/* end::Table head */}
return ( {/* begin::Table body */}
<tr key={item?.uid}> <tbody>
<td> {data && data.length ?
<div className='form-check form-check-sm form-check-custom form-check-solid'> data.map(item => (
<input className='form-check-input widget-9-check' type='checkbox' value='1' /> <tr key={item?.uid}>
<td>
<div className='form-check form-check-sm form-check-custom form-check-solid'>
<input className='form-check-input widget-9-check' type='checkbox' value='1' />
</div>
</td>
<td>
<div className='d-flex align-items-center'>
<div className='symbol symbol-45px me-5'>
<img src={toAbsoluteUrl('media/avatars/300-14.jpg')} alt='' />
</div> </div>
</td> <div className='d-flex justify-content-start flex-column'>
<td> <a href='#' className='text-gray-900 fw-bold text-hover-primary fs-6'>
<div className='d-flex align-items-center'> {item?.firstname} {item?.lastname}
<div className='symbol symbol-45px me-5'>
<img src={toAbsoluteUrl('media/avatars/avatar1.jpg')} alt='' />
</div>
<div className='d-flex justify-content-start flex-column'>
<span className='text-gray-900 fw-bold fs-6'>
{item?.firstname} {item?.lastname}
</span>
<span className='text-muted fw-semibold text-muted d-block fs-7'>
{NewDateTimeFormatter(item?.added)}
</span>
</div>
</div>
</td>
<td>
<span className='text-gray-900 fw-bold d-block fs-6'>
{AmountTo2DP(item.loan_amount)}
</span>
<span className='text-muted fw-semibold text-muted d-block fs-7'>
{item?.sales_agent? `Agent: ${item?.sales_agent}` : ``}
</span>
</td>
<td className='text-end'>
<div className='d-flex flex-column w-100 me-2'>
<div className='d-flex flex-stack mb-2'>
<span className='text-muted me-2 fs-7 fw-semibold'>50%</span>
</div>
<div className='progress h-6px w-100'>
<div
className='progress-bar bg-primary'
role='progressbar'
style={{width: '50%'}}
></div>
</div>
</div>
</td>
<td>
<div className='d-flex justify-content-end flex-shrink-0'>
<a
href='#'
className='btn btn-icon btn-bg-light btn-active-color-primary btn-sm me-1'
>
<KTIcon iconName='switch' className='fs-3' />
</a>
<a
href='#'
className='btn btn-icon btn-bg-light btn-active-color-primary btn-sm me-1'
>
<KTIcon iconName='pencil' className='fs-3' />
</a>
<a
href='#'
className='btn btn-icon btn-bg-light btn-active-color-primary btn-sm'
>
<KTIcon iconName='trash' className='fs-3' />
</a> </a>
<span className='text-muted fw-semibold text-muted d-block fs-7'>
{NewDateTimeFormatter(item?.added)}
</span>
</div> </div>
</td> </div>
</tr> </td>
) <td>
<span className='text-gray-900 fw-bold text-hover-primary d-block fs-6'>
{item.loan_amount}
</span>
<span className='text-muted fw-semibold text-muted d-block fs-7'>
{item?.sales_agent? `Agent: ${item?.sales_agent}` : ``}
</span>
</td>
<td className='text-end'>
<div className='d-flex flex-column w-100 me-2'>
<div className='d-flex flex-stack mb-2'>
<span className='text-muted me-2 fs-7 fw-semibold'>50%</span>
</div>
<div className='progress h-6px w-100'>
<div
className='progress-bar bg-primary'
role='progressbar'
style={{width: '50%'}}
></div>
</div>
</div>
</td>
<td>
<div className='d-flex justify-content-end flex-shrink-0'>
<a
href='#'
className='btn btn-icon btn-bg-light btn-active-color-primary btn-sm me-1'
>
<KTIcon iconName='switch' className='fs-3' />
</a>
<a
href='#'
className='btn btn-icon btn-bg-light btn-active-color-primary btn-sm me-1'
>
<KTIcon iconName='pencil' className='fs-3' />
</a>
<a
href='#'
className='btn btn-icon btn-bg-light btn-active-color-primary btn-sm'
>
<KTIcon iconName='trash' className='fs-3' />
</a>
</div>
</td>
</tr>
))
:
<tr>
<td colSpan={5}>No data found!</td>
</tr>
} }
}) </tbody>
: {/* end::Table body */}
<tr> </table>
<td colSpan={5}>No data found!</td> {/* end::Table */}
</tr> </div>
} {/* end::Table container */}
</tbody> </div>
{/* end::Table body */} </>
</table> )}
{/* end::Table */} </RecentLoanAppList>
<p className='py-1 w-100 text-center text-hover-primary'>
<Link to='/loan/pages/process/started'>more applications</Link>
</p>
</div>
{/* end::Table container */}
</div>
</>
: :
null null
} }