diff --git a/src/App.tsx b/src/App.tsx index a250740..47c8e8e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -72,6 +72,11 @@ export default function App() { const [showAdminLogin, setShowAdminLogin] = useState(false); const navigate = useNavigate(); const location = useLocation(); + const currentRole = currentUser?.role || ''; + const resignationRoles = ['DD Admin', 'ASM', 'DD Lead', 'ZBH', 'NBH', 'Legal', 'Super Admin']; + const terminationRoles = ['ASM', 'DD Lead', 'DD Admin', 'Super Admin']; + const fnfRoles = ['DD Admin', 'DD Lead', 'NBH', 'Finance', 'Finance Admin', 'Super Admin']; + const financeRoles = ['Finance', 'Finance Admin']; useEffect(() => { dispatch(initializeAuth()); @@ -205,9 +210,9 @@ export default function App() { {/* Dashboards */} navigate(`/${path}`)} onViewPaymentDetails={(id) => navigate(`/finance-onboarding/${id}`)} onViewAuditDetails={(id) => navigate(`/finance-audit/${id}`)} onViewFnFDetails={(id) => navigate(`/finance-fnf/${id}`)} /> : - currentUser?.role === 'Dealer' ? + currentRole === 'Dealer' ? navigate(`/${path}`)} /> : navigate(`/${path}`)} /> } /> @@ -249,21 +254,61 @@ export default function App() { } /> {/* HR/Finance Modules (Simplified for brevity, following pattern) */} - navigate(`/resignation/${id}`)} />} /> - navigate('/resignation')} currentUser={currentUser} />} /> + navigate(`/resignation/${id}`)} /> + : + } /> + navigate('/resignation')} currentUser={currentUser} /> + : + } /> - navigate(`/termination/${id}`)} />} /> - navigate('/termination')} currentUser={currentUser} />} /> + navigate(`/termination/${id}`)} /> + : + } /> + navigate('/termination')} currentUser={currentUser} /> + : + } /> - navigate(`/fnf/${id}`)} />} /> - navigate('/fnf')} currentUser={currentUser} />} /> + navigate(`/fnf/${id}`)} /> + : + } /> + navigate('/fnf')} currentUser={currentUser} /> + : + } /> - navigate(`/finance-onboarding/${id}`)} onViewAuditDetails={(id) => navigate(`/finance-audit/${id}`)} />} /> - navigate('/finance-onboarding')} />} /> + navigate(`/finance-onboarding/${id}`)} onViewAuditDetails={(id) => navigate(`/finance-audit/${id}`)} /> + : + } /> + navigate('/finance-onboarding')} /> + : + } /> } /> - navigate(`/finance-fnf/${id}`)} />} /> - navigate('/finance-fnf')} />} /> + navigate(`/finance-fnf/${id}`)} /> + : + } /> + navigate('/finance-fnf')} /> + : + } /> navigate(`/constitutional-change/${id}`)} />} /> navigate('/constitutional-change')} currentUser={currentUser} />} /> diff --git a/src/components/admin/UserManagementPage.tsx b/src/components/admin/UserManagementPage.tsx index 245e8bb..9169426 100644 --- a/src/components/admin/UserManagementPage.tsx +++ b/src/components/admin/UserManagementPage.tsx @@ -181,10 +181,13 @@ export function UserManagementPage() { }); setShowUserModal(false); fetchData(); + } else { + toast.error(res.message || 'Failed to create user'); } } } catch (error) { - toast.error('Operation failed'); + const message = (error as any)?.response?.data?.message || (error as any)?.message || 'Operation failed'; + toast.error(message); } }; diff --git a/src/components/applications/ConstitutionalChangePage.tsx b/src/components/applications/ConstitutionalChangePage.tsx index 637c4ee..5e325a0 100644 --- a/src/components/applications/ConstitutionalChangePage.tsx +++ b/src/components/applications/ConstitutionalChangePage.tsx @@ -87,6 +87,18 @@ export function ConstitutionalChangePage({ onViewDetails }: ConstitutionalChange const [isSubmitting, setIsSubmitting] = useState(false); const [dialogDataLoading, setDialogDataLoading] = useState(false); + const isCompletedRequest = (request: any) => + request.status === 'Completed' || request.status === 'Closed' || request.currentStage === 'Completed'; + + const isRejectedRequest = (request: any) => + request.status === 'Rejected' || request.status === 'Revoked' || request.currentStage === 'Rejected' || request.currentStage === 'Revoked'; + + const isPendingReviewRequest = (request: any) => + !isCompletedRequest(request) && !isRejectedRequest(request) && request.status !== 'Submitted'; + + const isSubmittedRequest = (request: any) => + request.status === 'Submitted' || request.currentStage === 'Submitted'; + useEffect(() => { fetchRequests(); }, []); @@ -248,22 +260,22 @@ export function ConstitutionalChangePage({ onViewDetails }: ConstitutionalChange color: 'bg-blue-500', }, { - title: 'In Progress', - value: requests.filter(r => r.status !== 'Completed' && !r.status.includes('Rejected')).length, + title: 'Submitted / Review', + value: requests.filter(r => isSubmittedRequest(r) || isPendingReviewRequest(r)).length, icon: Calendar, color: 'bg-yellow-500', }, { title: 'Completed', - value: requests.filter(r => r.status === 'Completed').length, + value: requests.filter(r => isCompletedRequest(r)).length, icon: Shield, color: 'bg-green-500', }, { - title: 'Pending Action', - value: requests.filter(r => r.status.includes('Review') || r.status.includes('Pending')).length, + title: 'Rejected / Revoked', + value: requests.filter(r => isRejectedRequest(r)).length, icon: Building, - color: 'bg-amber-500', + color: 'bg-red-500', }, ]; @@ -507,8 +519,8 @@ export function ConstitutionalChangePage({ onViewDetails }: ConstitutionalChange All Requests - Pending - In Progress + Submitted / Review + Rejected / Revoked Completed @@ -612,7 +624,7 @@ export function ConstitutionalChangePage({ onViewDetails }: ConstitutionalChange {requests - .filter((r: any) => r.status.includes('Review') || r.status.includes('Pending')) + .filter((r: any) => isSubmittedRequest(r) || isPendingReviewRequest(r)) .map((request: any) => ( @@ -659,7 +671,7 @@ export function ConstitutionalChangePage({ onViewDetails }: ConstitutionalChange ))} - {requests.filter((r: any) => r.status.includes('Review') || r.status.includes('Pending')).length === 0 && ( + {requests.filter((r: any) => isSubmittedRequest(r) || isPendingReviewRequest(r)).length === 0 && ( No pending requests found @@ -686,7 +698,7 @@ export function ConstitutionalChangePage({ onViewDetails }: ConstitutionalChange {requests - .filter((r: any) => r.status !== 'Completed' && !r.status.includes('Rejected')) + .filter((r: any) => isRejectedRequest(r)) .map((request: any) => ( @@ -740,7 +752,7 @@ export function ConstitutionalChangePage({ onViewDetails }: ConstitutionalChange ))} - {requests.filter((r: any) => r.status !== 'Completed' && !r.status.includes('Rejected')).length === 0 && ( + {requests.filter((r: any) => isRejectedRequest(r)).length === 0 && ( No in-progress requests found @@ -767,7 +779,7 @@ export function ConstitutionalChangePage({ onViewDetails }: ConstitutionalChange {requests - .filter((r: any) => r.status === 'Completed' || r.status === 'Closed') + .filter((r: any) => isCompletedRequest(r)) .map((request: any) => ( @@ -812,7 +824,7 @@ export function ConstitutionalChangePage({ onViewDetails }: ConstitutionalChange ))} - {requests.filter((r: any) => r.status === 'Completed' || r.status === 'Closed').length === 0 && ( + {requests.filter((r: any) => isCompletedRequest(r)).length === 0 && ( No completed requests found diff --git a/src/components/applications/FnFPage.tsx b/src/components/applications/FnFPage.tsx index ba8407e..9a37b1b 100644 --- a/src/components/applications/FnFPage.tsx +++ b/src/components/applications/FnFPage.tsx @@ -16,13 +16,16 @@ interface FnFPageProps { const getStatusColor = (status: string) => { switch (status) { - case 'New': + case 'Initiated': return 'bg-blue-100 text-blue-700 border-blue-300'; - case 'In Progress': + case 'DD Clearance': + case 'Legal Clearance': return 'bg-yellow-100 text-yellow-700 border-yellow-300'; - case 'Under Review': + case 'Finance Approval': + case 'Calculated': return 'bg-orange-100 text-orange-700 border-orange-300'; case 'Completed': + case 'Settled': return 'bg-green-100 text-green-700 border-green-300'; default: return 'bg-slate-100 text-slate-700 border-slate-300'; @@ -95,6 +98,10 @@ export function FnFPage({ currentUser, onViewDetails }: FnFPageProps) { }); const displaySettlements: any[] = settlements.map(getMappedData); + const initiatedCases = displaySettlements.filter(c => c.status === 'Initiated'); + const clearanceCases = displaySettlements.filter(c => c.status === 'DD Clearance' || c.status === 'Legal Clearance'); + const financeApprovalCases = displaySettlements.filter(c => c.status === 'Finance Approval' || c.status === 'Calculated'); + const completedCases = displaySettlements.filter(c => c.status === 'Completed' || c.status === 'Settled'); return (
@@ -102,37 +109,37 @@ export function FnFPage({ currentUser, onViewDetails }: FnFPageProps) {
- New Cases + Initiated - {displaySettlements.filter(c => c.status === 'Initiated' || c.status === 'New').length} + {initiatedCases.length} -

Just Arrived

+

Newly created

- In Progress + Clearance - {displaySettlements.filter(c => c.status === 'In Progress').length} + {clearanceCases.length} -

Awaiting Response

+

Department / legal stage

- Under Review + Finance Approval - {displaySettlements.filter(c => c.status === 'Under Review' || c.status === 'Calculated').length} + {financeApprovalCases.length} -

Discussion Ongoing

+

Ready for finance review

@@ -171,18 +178,17 @@ export function FnFPage({ currentUser, onViewDetails }: FnFPageProps) { - New Cases All Cases - In Progress - Under Review + Initiated + Clearance + Finance Approval Completed - {/* New Cases Tab */} - + {/* Initiated Tab */} +
- {displaySettlements - .filter(c => c.status === 'New' || c.status === 'Initiated') + {initiatedCases .map((fnfCase) => ( @@ -261,10 +267,10 @@ export function FnFPage({ currentUser, onViewDetails }: FnFPageProps) { ))} - {displaySettlements.filter((c: any) => c.status === 'New' || c.status === 'Initiated').length === 0 && ( + {initiatedCases.length === 0 && (
-

No new cases to display

+

No initiated cases to display

)}
@@ -279,15 +285,15 @@ export function FnFPage({ currentUser, onViewDetails }: FnFPageProps) {
@@ -322,7 +328,7 @@ export function FnFPage({ currentUser, onViewDetails }: FnFPageProps) {
- {canSendToStakeholders && fnfCase.status === 'New' && ( + {canSendToStakeholders && fnfCase.status === 'Initiated' && (