diff --git a/package-lock.json b/package-lock.json
index e0dbbb9..a73add6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,7 +11,7 @@
"@fortawesome/fontawesome-svg-core": "^6.6.0",
"@fortawesome/free-solid-svg-icons": "^6.6.0",
"@fortawesome/react-fontawesome": "^0.2.2",
- "@headlessui/react": "^2.1.9",
+ "@headlessui/react": "^2.1.10",
"@heroicons/react": "^2.1.5",
"@mui/icons-material": "^6.1.2",
"@react-spring/web": "^9.7.5",
@@ -1185,9 +1185,9 @@
}
},
"node_modules/@headlessui/react": {
- "version": "2.1.9",
- "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.1.9.tgz",
- "integrity": "sha512-ckWw7vlKtnoa1fL2X0fx1a3t/Li9MIKDVXn3SgG65YlxvDAsNrY39PPCxVM7sQRA7go2fJsuHSSauKFNaJHH7A==",
+ "version": "2.1.10",
+ "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.1.10.tgz",
+ "integrity": "sha512-6mLa2fjMDAFQi+/R10B+zU3edsUk/MDtENB2zHho0lqKU1uzhAfJLUduWds4nCo8wbl3vULtC5rJfZAQ1yqIng==",
"license": "MIT",
"dependencies": {
"@floating-ui/react": "^0.26.16",
diff --git a/package.json b/package.json
index d5094fa..26f701f 100644
--- a/package.json
+++ b/package.json
@@ -13,7 +13,7 @@
"@fortawesome/fontawesome-svg-core": "^6.6.0",
"@fortawesome/free-solid-svg-icons": "^6.6.0",
"@fortawesome/react-fontawesome": "^0.2.2",
- "@headlessui/react": "^2.1.9",
+ "@headlessui/react": "^2.1.10",
"@heroicons/react": "^2.1.5",
"@mui/icons-material": "^6.1.2",
"@react-spring/web": "^9.7.5",
diff --git a/src/appLayout/MainNavigation.css b/src/appLayout/MainNavigation.css
deleted file mode 100644
index e69de29..0000000
diff --git a/src/appLayout/MainNavigation.jsx b/src/appLayout/MainNavigation.jsx
deleted file mode 100644
index e69de29..0000000
diff --git a/src/appLayout/Navbar.jsx b/src/appLayout/Navbar.jsx
new file mode 100644
index 0000000..1dccb6d
--- /dev/null
+++ b/src/appLayout/Navbar.jsx
@@ -0,0 +1,57 @@
+import { Bars3Icon, BellIcon, ChevronDownIcon } from "@heroicons/react/24/outline";
+import { Link } from "react-router-dom";
+import { Menu } from "@headlessui/react"; // Import from Headless UI
+import logo from "../assets/logo.png";
+import profile from "../assets/profile.png";
+
+const Navbar = ({ onSidebarToggle }) => {
+ const userNavigation = [
+ { name: "Profile", href: "#" },
+ { name: "Settings", href: "#" },
+ { name: "Log out", href: "/login" },
+ ];
+
+ return (
+
+
+
+
+

+
+
+
+
+
+
+
+ );
+};
+
+export default Navbar;
diff --git a/src/appLayout/Sidebar.jsx b/src/appLayout/Sidebar.jsx
new file mode 100644
index 0000000..b5ad048
--- /dev/null
+++ b/src/appLayout/Sidebar.jsx
@@ -0,0 +1,58 @@
+// // Sidebar.jsx
+// import { Link } from "react-router-dom";
+// import { ChevronDownIcon, ChevronUpIcon } from "@heroicons/react/24/outline";
+// import { useState } from "react";
+// import logo from "../assets/logo.png";
+// import { navigation } from "../pages/navigationData"; // Externalized navigation data
+
+// const Sidebar = ({ isOpen }) => {
+// const [openDropdown, setOpenDropdown] = useState(null);
+
+// const toggleDropdown = (name) => {
+// setOpenDropdown(openDropdown === name ? null : name);
+// };
+
+// return (
+//
+//
+//
+//

+//
+//
+//
+//
+// );
+// };
+
+// export default Sidebar;
diff --git a/src/pages/ActivityTab.jsx b/src/pages/ActivityTab.jsx
index e01dd68..64888f4 100644
--- a/src/pages/ActivityTab.jsx
+++ b/src/pages/ActivityTab.jsx
@@ -23,6 +23,9 @@ const ActivityTab = () => {
const [newStatus, setNewStatus] = useState('All');
const [filteredActivity, setFilteredActivity] = useState(activityData);
+ const [isAddingComment, setIsAddingComment] = useState(false); // To control comment section display
+ const [newComment, setNewComment] = useState(''); // To store the new comment
+
// Function to filter activities based on search criteria
const handleSearch = () => {
const filtered = activityData.filter((activity) => {
@@ -35,8 +38,21 @@ const ActivityTab = () => {
setFilteredActivity(filtered);
};
+ // Function to handle the new comment submission
+ const handleAddComment = () => {
+ const newActivity = {
+ date: new Date().toLocaleString(),
+ actionBy: 'User', // Example: Comment will be added by the user
+ status: 'COMMENT ADDED',
+ message: newComment
+ };
+ setFilteredActivity([newActivity, ...filteredActivity]);
+ setNewComment('');
+ setIsAddingComment(false); // Hide the comment section after submission
+ };
+
return (
-
+
{/* Search Section */}
@@ -80,7 +96,6 @@ const ActivityTab = () => {
-
-
+
{/* Add Comment Section */}
-
View Rule Breakdown
-
+
View Rule Breakdown
+ {!isAddingComment ? (
+
+ ) : (
+
+ )}
{/* Activity List */}
-
- {filteredActivity.length > 0 ? (
- filteredActivity.slice(0, 4).map((activity, index) => ( // Limit to 4 comments
-
-
-
{/* Add margin-top for spacing */}
- Date: {activity.date} | Action by: {activity.actionBy} | Status: {activity.status}
-
+
+ {filteredActivity.length > 0 ? (
+ filteredActivity.slice(0, 4).map((activity, index) => ( // Limit to 4 comments
+
+
+
+ Date: {activity.date} | Action by: {activity.actionBy} | Status: {activity.status}
+
+
+ ))
+ ) : (
+
No matching records found.
+ )}
- ))
- ) : (
-
No matching records found.
- )}
-
-
);
};
diff --git a/src/pages/CustomerDetails.jsx b/src/pages/CustomerDetails.jsx
index 89cffed..49d83b5 100644
--- a/src/pages/CustomerDetails.jsx
+++ b/src/pages/CustomerDetails.jsx
@@ -34,6 +34,7 @@ import setupIcon from "../assets/setupIcon.png";
import LoanDetailsTab from "./LoanDetailsTab";
import { loanData } from "./data";
import DeclineModal from "./DeclineModal";
+import UploadModal from "./UploadModal";
import { Link } from "react-router-dom";
const navigation = [
@@ -141,7 +142,9 @@ function classNames(...classes) {
}
export default function CustomerDetails() {
- const [isModalOpen, setIsModalOpen] = useState(false); // Fixed typo in modal state
+ const [isModalOpen, setIsModalOpen] = useState(false)
+ const [isDeclineModalOpen, setIsDeclineModalOpen] = useState(false);
+ const [isCompleteReviewModalOpen, setIsCompleteReviewModalOpen] = useState(false);
const [searchTerm, setSearchTerm] = useState(""); // State for search input
const [activeTab, setActiveTab] = useState("Information"); // Default to 'Information' tab
const [filteredData, setFilteredData] = useState(loanData); // State for filtered data
@@ -179,13 +182,20 @@ export default function CustomerDetails() {
setIsModalOpen(false);
};
- const handleDeclineLoan = () => {
- openModal(); // Open modal when decline is clicked
+ // Modal handling functions
+ const handleDeclineLoan = () => {
+ setIsDeclineModalOpen(true); // Open Decline modal
};
-
const handleCompleteReview = () => {
- console.log("Review Completed");
+ setIsCompleteReviewModalOpen(true); // Open Complete Review modal
+ };
+ const handleCloseDeclineModal = () => {
+ setIsDeclineModalOpen(false); // Close Decline modal
};
+ const handleCloseCompleteReviewModal = () => {
+ setIsCompleteReviewModalOpen(false); // Close Complete Review modal
+ };
+
return (
<>
@@ -474,8 +484,7 @@ export default function CustomerDetails() {
- {/* Modal for Declining Loan */}
-
+
{/* Decline Loan and Complete Review Buttons */}
@@ -492,6 +501,9 @@ export default function CustomerDetails() {
Complete Review
+{/* Render the modals conditionally */}
+
+
{/* Help Widget Ends */}
diff --git a/src/pages/LoanDetailsTab.jsx b/src/pages/LoanDetailsTab.jsx
index 8a9b123..27654b4 100644
--- a/src/pages/LoanDetailsTab.jsx
+++ b/src/pages/LoanDetailsTab.jsx
@@ -23,11 +23,11 @@ const LoanDetailsTab = () => {
return (
{Object.entries(loanData.Information).map(([key, value]) => (
-
-
+
+
{key.replace(/([A-Z])/g, " $1")}:{" "}
- {value}
+ {value}
))}
@@ -36,7 +36,7 @@ const LoanDetailsTab = () => {
case "CRC Nano Report":
return (
-
+
{
],
]}
filename="bank_statement.csv"
- className="bg-white hover:bg-[#135D54] hover:text-white text-[#4A5D58] border-solid border-2 border-[#4A5D58] px-4 py-2 rounded-md flex items-center space-x-2"
+ className="bg-white text-sm hover:bg-[#135D54] hover:text-white text-[#4A5D58]
+ border-solid border-2 border-[#4A5D58] px-4 py-2 rounded-md flex items-center space-x-2"
>
Export CSV
{Object.entries(loanData.CRCNanoReport).map(([key, value]) => (
-
-
+
+
{key.replace(/([A-Z])/g, " $1")}:{" "}
- {value}
+ {value}
))}
@@ -88,8 +89,8 @@ const LoanDetailsTab = () => {
case "Bank Statement":
return (
-
-
Bank Statement
+
+
Bank Statement
{
],
]}
filename="bank_statement.csv"
- className="bg-white hover:bg-[#135D54] hover:text-white text-[#4A5D58] border-solid border-2 border-[#4A5D58] px-4 py-2 rounded-md flex items-center space-x-2"
+ className="bg-white hover:bg-[#135D54] hover:text-white text-[#4A5D58] text-sm border-solid border-2 border-[#4A5D58] px-4 py-2 rounded-md flex items-center space-x-2"
onClick={toggleBankDetails} // Toggle the bank statement details
>
View Bank Statement
@@ -131,11 +132,11 @@ const LoanDetailsTab = () => {
{showBankDetails && (
{Object.entries(loanData.BankStatement).map(([key, value]) => (
-
-
+
+
{key.replace(/([A-Z])/g, " $1")}:{" "}
- {value}
+ {value}
))}
diff --git a/src/pages/RepaymentDetails.jsx b/src/pages/RepaymentDetails.jsx
index 8283833..e1c9696 100644
--- a/src/pages/RepaymentDetails.jsx
+++ b/src/pages/RepaymentDetails.jsx
@@ -12,7 +12,7 @@ export default function RepaymentDetails() {
return (
-
+
diff --git a/src/pages/SigninPage.jsx b/src/pages/SigninPage.jsx
index d54c707..83a0625 100644
--- a/src/pages/SigninPage.jsx
+++ b/src/pages/SigninPage.jsx
@@ -158,25 +158,26 @@ export default function Signin() {
Sign in
-
-
Forgot password?
-
- Click here
-
-
-
-
-
Need an Easy Loan Access Account?
-
-
+
+
Forgot password?
+
+ Click here
+
+
+
+
+
Need an Easy Loan Access Account?
+
+
+
diff --git a/src/pages/SuccessModal.jsx b/src/pages/SuccessModal.jsx
new file mode 100644
index 0000000..b33ec18
--- /dev/null
+++ b/src/pages/SuccessModal.jsx
@@ -0,0 +1,34 @@
+import React from 'react';
+import { useSpring, animated } from '@react-spring/web';
+
+const SuccessModal = ({ isOpen, onClose }) => {
+ const animation = useSpring({
+ opacity: isOpen ? 1 : 0,
+ transform: isOpen ? 'translateY(0)' : 'translateY(-50px)',
+ config: { tension: 220, friction: 15 },
+ });
+
+ if (!isOpen) return null;
+
+ return (
+
+
+ Upload Successful!
+
+ Your Mono Bank Statement has been uploaded successfully.
+
+
+
+
+ );
+};
+
+export default SuccessModal;
diff --git a/src/pages/SupportingDocuments.jsx b/src/pages/SupportingDocuments.jsx
index f3a2117..4c737ba 100644
--- a/src/pages/SupportingDocuments.jsx
+++ b/src/pages/SupportingDocuments.jsx
@@ -23,7 +23,7 @@ const SupportingDocuments = () => {
};
return (
-
+
{/* Upload Document Section */}
diff --git a/src/pages/UploadModal.jsx b/src/pages/UploadModal.jsx
new file mode 100644
index 0000000..658f127
--- /dev/null
+++ b/src/pages/UploadModal.jsx
@@ -0,0 +1,89 @@
+import React, { useState } from 'react';
+import { useSpring, animated } from 'react-spring';
+import SuccessModal from './SuccessModal';
+
+const UploadModal = ({ isOpen, onClose }) => {
+ const [isSuccessModalOpen, setIsSuccessModalOpen] = useState(false);
+ const [file, setFile] = useState(null);
+
+ // Spring animation for fade-in/out effect
+ const animation = useSpring({
+ opacity: isOpen ? 1 : 0,
+ transform: isOpen ? 'translateY(0%)' : 'translateY(-30%)',
+ config: { tension: 200, friction: 20 },
+ });
+
+ const handleFileChange = (event) => {
+ const selectedFile = event.target.files[0];
+ if (selectedFile) setFile(selectedFile);
+ };
+
+ const handleUpload = () => {
+ if (file) {
+ console.log('Uploading:', file.name);
+ setIsSuccessModalOpen(true); // Open success modal
+ } else {
+ alert('Please select a file to upload.');
+ }
+ };
+
+ const handleCloseSuccessModal = () => {
+ setIsSuccessModalOpen(false);
+ onClose(); // Close the UploadModal as well
+ };
+
+ if (!isOpen) return null;
+
+ return (
+
+
+
+
Upload Mono Bank Statement
+
+
+
+
+
Kindly Upload Mono Bank Statement
+
+
+
+ {file && (
+
+ Selected file: {file.name}
+
+ )}
+
+
+
+
+
+
+ {/* Render the SuccessModal */}
+
+
+
+
+ );
+};
+
+export default UploadModal;
diff --git a/src/pages/navigationData.js b/src/pages/navigationData.js
new file mode 100644
index 0000000..6a634b4
--- /dev/null
+++ b/src/pages/navigationData.js
@@ -0,0 +1,30 @@
+// export const navigation = [
+// {
+// name: "Dashboard",
+// href: "/dashboard",
+// icon: home,
+// hasDropdown: false,
+// },
+// {
+// name: "Customers",
+// href: "/customers",
+// icon: "path/to/icon.png",
+// hasDropdown: true,
+// children: [
+// { name: "Customer Details", href: "/customers/details" },
+// { name: "Customer Orders", href: "/customers/orders" },
+// ],
+// },
+// {
+// name: "Settings",
+// href: "/settings",
+// icon: "path/to/icon.png",
+// hasDropdown: true,
+// children: [
+// { name: "Profile", href: "/settings/profile" },
+// { name: "Account", href: "/settings/account" },
+// ],
+// },
+// // Add more navigation items as needed
+// ];
+
\ No newline at end of file