initial commit
This commit is contained in:
@@ -1,13 +1,39 @@
|
|||||||
|
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
import {KTIcon} from '../../../helpers'
|
import { NewDateTimeFormatter } from '../../../lib/NewDateTimeFormatter'
|
||||||
import {Dropdown1} from '../../content/dropdown/Dropdown1'
|
// import {KTIcon} from '../../../helpers'
|
||||||
|
// import {Dropdown1} from '../../content/dropdown/Dropdown1'
|
||||||
|
|
||||||
|
type dashDataProps = {
|
||||||
|
loading: boolean,
|
||||||
|
data: {
|
||||||
|
call_return?: string
|
||||||
|
recent_applications? : {}[]
|
||||||
|
recent_bvn?: {
|
||||||
|
id?: string
|
||||||
|
uid?: string
|
||||||
|
bvn?: string
|
||||||
|
status?: string
|
||||||
|
added?: string
|
||||||
|
updated?: string
|
||||||
|
firstname?: string | null
|
||||||
|
lastname?: string | null
|
||||||
|
middlename?: string | null
|
||||||
|
gender?: string | null
|
||||||
|
birthdate?: string | null
|
||||||
|
phone?: string | null
|
||||||
|
nationality?: string | null
|
||||||
|
}[]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
className: string
|
className: string
|
||||||
|
dashData: dashDataProps
|
||||||
}
|
}
|
||||||
|
|
||||||
const ListsWidget3: React.FC<Props> = ({className}) => {
|
const ListsWidget3: React.FC<Props> = ({dashData, className}) => {
|
||||||
|
console.log('dashData', dashData.data)
|
||||||
return (
|
return (
|
||||||
<div className={`card ${className}`}>
|
<div className={`card ${className}`}>
|
||||||
{/* begin::Header */}
|
{/* begin::Header */}
|
||||||
@@ -31,132 +57,34 @@ const ListsWidget3: React.FC<Props> = ({className}) => {
|
|||||||
{/* end::Header */}
|
{/* end::Header */}
|
||||||
{/* begin::Body */}
|
{/* begin::Body */}
|
||||||
<div className='card-body pt-2'>
|
<div className='card-body pt-2'>
|
||||||
{/* begin::Item */}
|
{dashData.loading ?
|
||||||
<div className='d-flex align-items-center mb-8'>
|
null
|
||||||
{/* begin::Bullet */}
|
:
|
||||||
<span className='bullet bullet-vertical h-40px bg-success'></span>
|
dashData?.data?.recent_bvn && dashData?.data?.recent_bvn.length ?
|
||||||
{/* end::Bullet */}
|
dashData?.data?.recent_bvn.map(item => (
|
||||||
{/* begin::Checkbox */}
|
<div key={item?.uid} className='d-flex align-items-center mb-8'>
|
||||||
<div className='form-check form-check-custom form-check-solid mx-5'>
|
{/* begin::Bullet */}
|
||||||
<input className='form-check-input' type='checkbox' value='' />
|
<span className='bullet bullet-vertical h-40px bg-primary'></span>
|
||||||
|
{/* end::Bullet */}
|
||||||
|
{/* begin::Checkbox */}
|
||||||
|
<div className='form-check form-check-custom form-check-solid mx-5'>
|
||||||
|
<input className='form-check-input' type='checkbox' value='' />
|
||||||
|
</div>
|
||||||
|
{/* end::Checkbox */}
|
||||||
|
{/* begin::Description */}
|
||||||
|
<div className='flex-grow-1'>
|
||||||
|
<a href='#' className='text-gray-800 text-hover-primary fw-bold fs-6'>
|
||||||
|
{item?.bvn}
|
||||||
|
</a>
|
||||||
|
<span className='text-muted fw-semibold d-block'>{NewDateTimeFormatter(item?.added)}</span>
|
||||||
|
</div>
|
||||||
|
{/* end::Description */}
|
||||||
|
<span className='badge badge-light-primary fs-8 fw-bold'>New</span>
|
||||||
</div>
|
</div>
|
||||||
{/* end::Checkbox */}
|
))
|
||||||
{/* begin::Description */}
|
:
|
||||||
<div className='flex-grow-1'>
|
<p>No list Found!</p>
|
||||||
<a href='#' className='text-gray-800 text-hover-primary fw-bold fs-6'>
|
}
|
||||||
Create FireStone Logo
|
|
||||||
</a>
|
|
||||||
<span className='text-muted fw-semibold d-block'>Due in 2 Days</span>
|
|
||||||
</div>
|
|
||||||
{/* end::Description */}
|
|
||||||
<span className='badge badge-light-success fs-8 fw-bold'>New</span>
|
|
||||||
</div>
|
|
||||||
{/* end:Item */}
|
|
||||||
{/* begin::Item */}
|
|
||||||
<div className='d-flex align-items-center mb-8'>
|
|
||||||
{/* begin::Bullet */}
|
|
||||||
<span className='bullet bullet-vertical h-40px bg-primary'></span>
|
|
||||||
{/* end::Bullet */}
|
|
||||||
{/* begin::Checkbox */}
|
|
||||||
<div className='form-check form-check-custom form-check-solid mx-5'>
|
|
||||||
<input className='form-check-input' type='checkbox' value='' />
|
|
||||||
</div>
|
|
||||||
{/* end::Checkbox */}
|
|
||||||
{/* begin::Description */}
|
|
||||||
<div className='flex-grow-1'>
|
|
||||||
<a href='#' className='text-gray-800 text-hover-primary fw-bold fs-6'>
|
|
||||||
Stakeholder Meeting
|
|
||||||
</a>
|
|
||||||
<span className='text-muted fw-semibold d-block'>Due in 3 Days</span>
|
|
||||||
</div>
|
|
||||||
{/* end::Description */}
|
|
||||||
<span className='badge badge-light-primary fs-8 fw-bold'>New</span>
|
|
||||||
</div>
|
|
||||||
{/* end:Item */}
|
|
||||||
{/* begin::Item */}
|
|
||||||
<div className='d-flex align-items-center mb-8'>
|
|
||||||
{/* begin::Bullet */}
|
|
||||||
<span className='bullet bullet-vertical h-40px bg-warning'></span>
|
|
||||||
{/* end::Bullet */}
|
|
||||||
{/* begin::Checkbox */}
|
|
||||||
<div className='form-check form-check-custom form-check-solid mx-5'>
|
|
||||||
<input className='form-check-input' type='checkbox' value='' />
|
|
||||||
</div>
|
|
||||||
{/* end::Checkbox */}
|
|
||||||
{/* begin::Description */}
|
|
||||||
<div className='flex-grow-1'>
|
|
||||||
<a href='#' className='text-gray-800 text-hover-primary fw-bold fs-6'>
|
|
||||||
Scoping & Estimations
|
|
||||||
</a>
|
|
||||||
<span className='text-muted fw-semibold d-block'>Due in 5 Days</span>
|
|
||||||
</div>
|
|
||||||
{/* end::Description */}
|
|
||||||
<span className='badge badge-light-warning fs-8 fw-bold'>New</span>
|
|
||||||
</div>
|
|
||||||
{/* end:Item */}
|
|
||||||
{/* begin::Item */}
|
|
||||||
<div className='d-flex align-items-center mb-8'>
|
|
||||||
{/* begin::Bullet */}
|
|
||||||
<span className='bullet bullet-vertical h-40px bg-primary'></span>
|
|
||||||
{/* end::Bullet */}
|
|
||||||
{/* begin::Checkbox */}
|
|
||||||
<div className='form-check form-check-custom form-check-solid mx-5'>
|
|
||||||
<input className='form-check-input' type='checkbox' value='' />
|
|
||||||
</div>
|
|
||||||
{/* end::Checkbox */}
|
|
||||||
{/* begin::Description */}
|
|
||||||
<div className='flex-grow-1'>
|
|
||||||
<a href='#' className='text-gray-800 text-hover-primary fw-bold fs-6'>
|
|
||||||
KPI App Showcase
|
|
||||||
</a>
|
|
||||||
<span className='text-muted fw-semibold d-block'>Due in 2 Days</span>
|
|
||||||
</div>
|
|
||||||
{/* end::Description */}
|
|
||||||
<span className='badge badge-light-primary fs-8 fw-bold'>New</span>
|
|
||||||
</div>
|
|
||||||
{/* end:Item */}
|
|
||||||
{/* begin::Item */}
|
|
||||||
<div className='d-flex align-items-center mb-8'>
|
|
||||||
{/* begin::Bullet */}
|
|
||||||
<span className='bullet bullet-vertical h-40px bg-danger'></span>
|
|
||||||
{/* end::Bullet */}
|
|
||||||
{/* begin::Checkbox */}
|
|
||||||
<div className='form-check form-check-custom form-check-solid mx-5'>
|
|
||||||
<input className='form-check-input' type='checkbox' value='' />
|
|
||||||
</div>
|
|
||||||
{/* end::Checkbox */}
|
|
||||||
{/* begin::Description */}
|
|
||||||
<div className='flex-grow-1'>
|
|
||||||
<a href='#' className='text-gray-800 text-hover-primary fw-bold fs-6'>
|
|
||||||
Project Meeting
|
|
||||||
</a>
|
|
||||||
<span className='text-muted fw-semibold d-block'>Due in 12 Days</span>
|
|
||||||
</div>
|
|
||||||
{/* end::Description */}
|
|
||||||
<span className='badge badge-light-danger fs-8 fw-bold'>New</span>
|
|
||||||
</div>
|
|
||||||
{/* end:Item */}
|
|
||||||
{/* begin::Item */}
|
|
||||||
<div className='d-flex align-items-center'>
|
|
||||||
{/* begin::Bullet */}
|
|
||||||
<span className='bullet bullet-vertical h-40px bg-success'></span>
|
|
||||||
{/* end::Bullet */}
|
|
||||||
{/* begin::Checkbox */}
|
|
||||||
<div className='form-check form-check-custom form-check-solid mx-5'>
|
|
||||||
<input className='form-check-input' type='checkbox' value='' />
|
|
||||||
</div>
|
|
||||||
{/* end::Checkbox */}
|
|
||||||
{/* begin::Description */}
|
|
||||||
<div className='flex-grow-1'>
|
|
||||||
<a href='#' className='text-gray-800 text-hover-primary fw-bold fs-6'>
|
|
||||||
Customers Update
|
|
||||||
</a>
|
|
||||||
<span className='text-muted fw-semibold d-block'>Due in 1 week</span>
|
|
||||||
</div>
|
|
||||||
{/* end::Description */}
|
|
||||||
<span className='badge badge-light-success fs-8 fw-bold'>New</span>
|
|
||||||
</div>
|
|
||||||
{/* end:Item */}
|
|
||||||
</div>
|
</div>
|
||||||
{/* end::Body */}
|
{/* end::Body */}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -45,6 +45,29 @@ export function postAuxEnd(uri:string, reqData:any):Promise<any> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function getAuxEnd(uri: string, reqData?: any): Promise<any> {
|
||||||
|
const endPoint = import.meta.env.VITE_APP_USER_ENDPOINT + uri;
|
||||||
|
const formData = new FormData();
|
||||||
|
for (let value in reqData) {
|
||||||
|
formData.append(value, reqData[value]);
|
||||||
}
|
}
|
||||||
|
return axios
|
||||||
|
.get(endPoint, reqData)
|
||||||
|
.then((response: {}) => {
|
||||||
|
// if (response.data.internal_return == "-9999") {
|
||||||
|
// localStorage.clear();
|
||||||
|
// window.location.href = `/login?sessionExpired=true`;
|
||||||
|
// }
|
||||||
|
return response;
|
||||||
|
})
|
||||||
|
.catch((error: any) => {
|
||||||
|
console.log(
|
||||||
|
"ERROR3-------------------------------------------------------", error
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import { AuthModel, UserModel } from "./_models";
|
import { AuthModel, UserModel } from "./_models";
|
||||||
|
|
||||||
import { postAuxEnd } from "./AxiosCallHelper";
|
import { postAuxEnd, getAuxEnd } from "./AxiosCallHelper";
|
||||||
|
|
||||||
const API_URL = import.meta.env.VITE_APP_API_URL;
|
const API_URL = import.meta.env.VITE_APP_API_URL;
|
||||||
|
|
||||||
@@ -10,6 +10,7 @@ const API_URL = import.meta.env.VITE_APP_API_URL;
|
|||||||
|
|
||||||
export const GET_USER_BY_ACCESSTOKEN_URL = '/identity/verify_token'
|
export const GET_USER_BY_ACCESSTOKEN_URL = '/identity/verify_token'
|
||||||
export const LOGIN_URL = '/identity/token'
|
export const LOGIN_URL = '/identity/token'
|
||||||
|
export const USER_DASH_DETAILS = `/dash`;
|
||||||
export const REGISTER_URL = `${API_URL}/register`;
|
export const REGISTER_URL = `${API_URL}/register`;
|
||||||
export const REQUEST_PASSWORD_URL = `${API_URL}/forgot_password`;
|
export const REQUEST_PASSWORD_URL = `${API_URL}/forgot_password`;
|
||||||
|
|
||||||
@@ -55,3 +56,7 @@ export function requestPassword(email: string) {
|
|||||||
export function getUserByToken(token: string) {
|
export function getUserByToken(token: string) {
|
||||||
return postAuxEnd(GET_USER_BY_ACCESSTOKEN_URL, {token})
|
return postAuxEnd(GET_USER_BY_ACCESSTOKEN_URL, {token})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getUserDashDetails() {
|
||||||
|
return getAuxEnd(USER_DASH_DETAILS)
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
import { FC } from 'react';
|
import { FC, useEffect, useState } from 'react';
|
||||||
import { useIntl } from 'react-intl';
|
import { useIntl } from 'react-intl';
|
||||||
import { toAbsoluteUrl } from '../../../_digifi/helpers';
|
import { toAbsoluteUrl } from '../../../_digifi/helpers';
|
||||||
import { PageTitle } from '../../../_digifi/layout/core';
|
import { PageTitle } from '../../../_digifi/layout/core';
|
||||||
import {
|
import {
|
||||||
ListsWidget2,
|
// ListsWidget2,
|
||||||
ListsWidget3,
|
ListsWidget3,
|
||||||
ListsWidget4,
|
// ListsWidget4,
|
||||||
ListsWidget6,
|
// ListsWidget6,
|
||||||
TablesWidget5,
|
// TablesWidget5,
|
||||||
TablesWidget10,
|
TablesWidget10,
|
||||||
MixedWidget8,
|
// MixedWidget8,
|
||||||
CardsWidget7,
|
CardsWidget7,
|
||||||
CardsWidget17,
|
CardsWidget17,
|
||||||
CardsWidget20,
|
CardsWidget20,
|
||||||
@@ -18,76 +18,92 @@ import {
|
|||||||
} from '../../../_digifi/partials/widgets';
|
} from '../../../_digifi/partials/widgets';
|
||||||
import { ToolbarWrapper } from '../../../_digifi/layout/components/toolbar';
|
import { ToolbarWrapper } from '../../../_digifi/layout/components/toolbar';
|
||||||
import { Content } from '../../../_digifi/layout/components/content';
|
import { Content } from '../../../_digifi/layout/components/content';
|
||||||
|
import { getUserDashDetails } from '../../modules/auth/core/_requests';
|
||||||
|
|
||||||
const DashboardPage: FC = () => (
|
const DashboardPage: FC = () => {
|
||||||
<>
|
const [dashDetails, setDashDetails] = useState({loading:true, data:{}})
|
||||||
<ToolbarWrapper />
|
|
||||||
<Content>
|
|
||||||
{/* begin::Row */}
|
|
||||||
<div className="row g-5 g-xl-10 mb-5 mb-xl-10">
|
|
||||||
{/* begin::Col */}
|
|
||||||
<div className="col-md-6 col-lg-6 col-xl-6 col-xxl-3 mb-md-5 mb-xl-10">
|
|
||||||
<CardsWidget20
|
|
||||||
className="h-md-50 mb-5 mb-xl-10"
|
|
||||||
description="Active Projects"
|
|
||||||
color="#F1416C"
|
|
||||||
img={toAbsoluteUrl('media/patterns/vector-1.png')}
|
|
||||||
/>
|
|
||||||
<CardsWidget7
|
|
||||||
className="h-md-50 mb-5 mb-xl-10"
|
|
||||||
description="Professionals"
|
|
||||||
icon={false}
|
|
||||||
stats={357}
|
|
||||||
labelColor="dark"
|
|
||||||
textColor="gray-300"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
{/* end::Col */}
|
|
||||||
|
|
||||||
{/* begin::Col */}
|
useEffect(()=>{
|
||||||
<div className="col-md-6 col-lg-6 col-xl-6 col-xxl-3 mb-md-5 mb-xl-10">
|
getUserDashDetails().then(res => {
|
||||||
<CardsWidget17 className="h-md-50 mb-5 mb-xl-10" />
|
setDashDetails({loading:false, data:res.data})
|
||||||
<ListsWidget26 className="h-lg-50" />
|
}).catch(err => {
|
||||||
</div>
|
setDashDetails({loading:false, data:{}})
|
||||||
{/* end::Col */}
|
console.log(err)
|
||||||
|
})
|
||||||
|
},[])
|
||||||
|
|
||||||
{/* begin::Col */}
|
return (
|
||||||
<div className="col-xxl-6">
|
<>
|
||||||
<EngageWidget10 className="h-md-100" />
|
<ToolbarWrapper />
|
||||||
</div>
|
<Content>
|
||||||
{/* end::Col */}
|
{/* begin::Row */}
|
||||||
</div>
|
<div className="row g-5 g-xl-10 mb-5 mb-xl-10">
|
||||||
{/* end::Row */}
|
{/* begin::Col */}
|
||||||
|
<div className="col-md-6 col-lg-6 col-xl-6 col-xxl-3 mb-md-5 mb-xl-10">
|
||||||
|
<CardsWidget20
|
||||||
|
className="h-md-50 mb-5 mb-xl-10"
|
||||||
|
description="Active Projects"
|
||||||
|
color="#F1416C"
|
||||||
|
img={toAbsoluteUrl('media/patterns/vector-1.png')}
|
||||||
|
/>
|
||||||
|
<CardsWidget7
|
||||||
|
className="h-md-50 mb-5 mb-xl-10"
|
||||||
|
description="Professionals"
|
||||||
|
icon={false}
|
||||||
|
stats={357}
|
||||||
|
labelColor="dark"
|
||||||
|
textColor="gray-300"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
{/* end::Col */}
|
||||||
|
|
||||||
{/* begin::Row */}
|
{/* begin::Col */}
|
||||||
<div className="row gx-5 gx-xl-10">
|
<div className="col-md-6 col-lg-6 col-xl-6 col-xxl-3 mb-md-5 mb-xl-10">
|
||||||
{/* begin::Col */}
|
<CardsWidget17 className="h-md-50 mb-5 mb-xl-10" />
|
||||||
<div className="col-xxl-6 mb-5 mb-xl-10">
|
<ListsWidget26 className="h-lg-50" />
|
||||||
{/* <app-new-charts-widget8 cssclassName="h-xl-100" chartHeight="275px" [chartHeightNumber]="275"></app-new-charts-widget8> */}
|
</div>
|
||||||
</div>
|
{/* end::Col */}
|
||||||
{/* end::Col */}
|
|
||||||
|
|
||||||
{/* begin::Col */}
|
{/* begin::Col */}
|
||||||
<div className="col-xxl-6 mb-5 mb-xl-10">
|
<div className="col-xxl-6">
|
||||||
{/* <app-cards-widget18 cssclassName="h-xl-100" image="./assetsmedia/stock/600x600/img-65.jpg"></app-cards-widget18> */}
|
<EngageWidget10 className="h-md-100" />
|
||||||
|
</div>
|
||||||
|
{/* end::Col */}
|
||||||
</div>
|
</div>
|
||||||
{/* end::Col */}
|
{/* end::Row */}
|
||||||
</div>
|
|
||||||
{/* end::Row */}
|
|
||||||
|
|
||||||
{/* begin::Row */}
|
{/* begin::Row */}
|
||||||
<div className="row gy-5 gx-xl-8">
|
<div className="row gx-5 gx-xl-10">
|
||||||
<div className="col-xxl-4">
|
{/* begin::Col */}
|
||||||
<ListsWidget3 className="card-xxl-stretch mb-xl-3" />
|
<div className="col-xxl-6 mb-5 mb-xl-10">
|
||||||
|
{/* <app-new-charts-widget8 cssclassName="h-xl-100" chartHeight="275px" [chartHeightNumber]="275"></app-new-charts-widget8> */}
|
||||||
|
</div>
|
||||||
|
{/* end::Col */}
|
||||||
|
|
||||||
|
{/* begin::Col */}
|
||||||
|
<div className="col-xxl-6 mb-5 mb-xl-10">
|
||||||
|
{/* <app-cards-widget18 cssclassName="h-xl-100" image="./assetsmedia/stock/600x600/img-65.jpg"></app-cards-widget18> */}
|
||||||
|
</div>
|
||||||
|
{/* end::Col */}
|
||||||
</div>
|
</div>
|
||||||
<div className="col-xl-8">
|
{/* end::Row */}
|
||||||
<TablesWidget10 className="card-xxl-stretch mb-5 mb-xl-8" />
|
|
||||||
|
{/* begin::Row */}
|
||||||
|
<div className="row gy-5 gx-xl-8">
|
||||||
|
{/* BVN VERIFICATION */}
|
||||||
|
<div className="col-xxl-4">
|
||||||
|
<ListsWidget3 dashData={dashDetails} className="card-xxl-stretch mb-xl-3" />
|
||||||
|
</div>
|
||||||
|
{/* RECENT LOAN APPLICATION */}
|
||||||
|
<div className="col-xl-8">
|
||||||
|
<TablesWidget10 className="card-xxl-stretch mb-5 mb-xl-8" />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
{/* end::Row */}
|
||||||
{/* end::Row */}
|
</Content>
|
||||||
</Content>
|
</>
|
||||||
</>
|
)
|
||||||
);
|
}
|
||||||
|
|
||||||
const DashboardWrapper: FC = () => {
|
const DashboardWrapper: FC = () => {
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
|
|||||||
Reference in New Issue
Block a user