add acc page

This commit is contained in:
2026-05-01 19:15:49 -04:00
parent 094b8b15d5
commit 1054fa0fd1
5 changed files with 217 additions and 1 deletions
+1
View File
@@ -9,6 +9,7 @@ const RouteLinks = {
billings: '/billings',
files_uploads: '/files-uploads',
recentSignup: '/recent-signup',
recentAccount: '/recent-account',
loansPage: '/loans',
transactionsPage: '/transactions',
countrySettings: '/country',
+3
View File
@@ -25,6 +25,7 @@ import CountrySettingsPage from "./pages/CountrySettingsPage";
import ProductViewPage from "./pages/ProductViewPage";
import FilesUploadPage from "./pages/FilesUploadPage"; // TRANSACTION DETAILS PAGE
import AccountEditpage from "./pages/AccountEditPage";
import RecentAccountsPage from "./pages/RecentAccountsPage";
// const Home = lazy(() => import('./pages/Home'));
@@ -35,6 +36,8 @@ export default function SiteRoutes() {
<Route element={<UserExist/>}>
<Route path={RouteLinks.homePage} element={<HomePage/>}/> {`*/HOME PAGE*/`}
<Route path={RouteLinks.recentAccount} element={<RecentAccountsPage/>}/> {`*/RECENT SIGNUP PAGE*/`}
<Route path={RouteLinks.recentSignup} element={<RecentSignupPage/>}/> {`*/RECENT SIGNUP PAGE*/`}
<Route path={RouteLinks.subscriptions} element={<SubscriptionsPage/>}/> {`*/SUBSCRIPTIONS PAGE*/`}
<Route path={RouteLinks.customerPage} element={<CustomerPage/>}/> {`*/CUSTOMER PAGE*/`}
@@ -151,8 +151,9 @@ export default function DashboardAside() {
const asideNavLinks = [
{name: 'Dashboard', status: 1, icon: 'dashboard', to: RouteLinks.homePage},
{
name: 'Deployments', title: 'Activities', status: 1, icon: 'arrow-right', subLinks: [
name: 'Front Office', title: 'Activities', status: 1, icon: 'arrow-right', subLinks: [
{name: 'Recent Signup', status: 1, icon: 'dot', to: RouteLinks.recentSignup},
{name: 'Recent Accounts(30)', status: 1, icon: 'dot', to: RouteLinks.recentAccount},
{name: 'Provisions', status: 1, icon: 'dot', to: RouteLinks.subscriptions},
{name: 'Customers', status: 1, icon: 'dot', to: RouteLinks.customerPage},
{name: 'Billings', status: 1, icon: 'dot', to: RouteLinks.billings},
@@ -0,0 +1,203 @@
import { useState } from "react";
import { useQuery } from "@tanstack/react-query";
import queryKeys from "../../services/queryKeys";
import BreadcrumbCom from "../breadcrumb/BreadcrumbCom";
import TablePaginatedWrapper from "../tableWrapper/TablePaginatedWrapper";
import Icons from "../Icons";
import { getRecentSignup } from "../../services/siteServices";
import getDateTimeFromDateString from "../../helpers/getDateTimeFromDateString";
import {Link} from 'react-router-dom';
export default function RecentAccounts() {
const [page, setPage] = useState(1);
const [filter, setFilter] = useState({ type: "", id: "" });
const [willFilter, setWillFilter] = useState(false);
const handleFilter = ({ target: { name, value } }) => {
setFilter((prev) => ({ ...prev, [name]: value }));
};
const handleFilterByParams = () => {
if (filter.type && !filter.id) {
return;
} else if (!filter.type) {
setPage(1);
setWillFilter((prev) => !prev);
setFilter({ type: "", id: "" });
} else {
setPage(1);
setWillFilter((prev) => !prev);
}
};
const { data, isFetching, isError, error } = useQuery({
queryKey: [...queryKeys.recent_signup, page, willFilter],
queryFn: () => {
const filterData = filter?.type ? { [filter?.type]: filter.id } : {};
const reqData = {
page,
...filterData,
};
return getRecentSignup(reqData);
},
staleTime: 0, //0 mins
});
const recentSignupData = data?.data?.members; // BILLINGS LIST
const pagination = data?.data?.pagination;
// console.log('DATA', data?.data)
return (
<div className="w-full flex flex-col gap-8">
<BreadcrumbCom
title="Recent Accounts"
paths={["Dashboard", "Recent Acc"]}
/>
<div className="box bg-white dark:bg-black-box text-black-body dark:text-white-body">
{isError ? (
<p className="text-red-500">{error?.message}</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">
<select
name="type"
value={filter?.type}
className="h-10 w-full p-2 rounded-md"
onChange={handleFilter}
>
<option value="">All</option>
<option value="username">Username</option>
</select>
</div>
<div className="w-full sm:max-w-48">
<input
name="id"
value={filter?.id}
disabled={!filter.type}
className={`h-10 w-full p-2 rounded-md outline-none border border-black-aside ${!filter.type && "opacity-30"}`}
onChange={handleFilter}
/>
</div>
<button
onClick={handleFilterByParams}
disabled={filter.type && !filter.id}
className={`h-10 bg-primary px-2 py-1 rounded-md text-white font-medium sm:self-end ${filter.type && !filter.id && "opacity-50"}`}
>
Submit
</button>
</div>
{/* end of filter section */}
<TablePaginatedWrapper
data={recentSignupData}
isFetching={isFetching}
setPage={setPage}
itemsPerPage={pagination?.limit}
pagination={pagination}
>
{({ data }) => (
<>
<table className="py-2 w-full text-sm">
<thead className="py-2 text-sm text-slate-500 text-left">
<tr>
<th scope="col" className="px-2 py-2">
Added
</th>
<th scope="col" className="px-2">
User Name /Email
</th>
<th scope="col" className="px-2 text-right">
Name
</th>
<th scope="col" className="px-2 text-right">
Country
</th>
<th scope="col" className="px-2 text-right">
Action
</th>
</tr>
</thead>
<tbody>
{data && data.length > 0 ? (
data?.map((item, index) => (
<tr
key={index}
className="py-2 border-t border-dashed border-slate-300"
>
<td className="px-2 py-2">
<div className="w-full min-w-48 flex items-center gap-2 whitespace-nowrap">
<div className="text-left">
<div className="text-base font-semibold">
{getDateTimeFromDateString(item?.added)}
</div>
</div>
</div>
</td>
<td className="px-2">
<div className="text-left">
<div className="text-base font-semibold">
{item?.username}
</div>
<div className="text-base font-semibold">
{item?.email}
</div>
</div>
</td>
<td className="px-2">
<div className="text-right">
<div className="text-base font-semibold">
{item?.firstname} {item?.lastname}
</div>
{/* <div className="font-normal text-gray-500">{item?.external_url}</div> */}
</div>
</td>
<td className="px-2">
<div className="text-right">
<div className="text-base font-semibold">
{item?.country}
</div>
</div>
</td>
<td className="px-2 text-right">
<div className="flex items-center justify-end gap-3 md:gap-4">
<div className="p-2 flex justify-center items-center text-slate-500 bg-white-body dark:text-white-body dark:bg-black-body rounded-md">
<Link
to={`/account-view/${item?.member_uid}`}
state={{
customerID: item?.id,
memberUID: item?.member_uid,
}}
>
<Icons name="eye" />
</Link>
</div>
</div>
</td>
</tr>
))
) : (
<tr className="py-2 border-t border-dashed border-slate-300">
<td className="px-3 py-2" colSpan={4}>
<div className="flex justify-center items-center">
No Record Found
</div>
</td>
</tr>
)}
</tbody>
</table>
</>
)}
</TablePaginatedWrapper>
</>
)}
</div>
</div>
);
}
+8
View File
@@ -0,0 +1,8 @@
import React from 'react'
import RecentAccounts from "../components/recent_accounts/RecentAccounts";
export default function RecentAccountsPage() {
return (
<RecentAccounts />
)
}