From 02182daa65039ca280bd162a489fcc9035f4072b Mon Sep 17 00:00:00 2001 From: laxmanhalaki Date: Tue, 18 Nov 2025 20:40:51 +0530 Subject: [PATCH] dashboard api optimisation for role specific --- src/pages/Dashboard/Dashboard.tsx | 82 +++++++++++++++++++------------ 1 file changed, 51 insertions(+), 31 deletions(-) diff --git a/src/pages/Dashboard/Dashboard.tsx b/src/pages/Dashboard/Dashboard.tsx index 0aad105..808b666 100644 --- a/src/pages/Dashboard/Dashboard.tsx +++ b/src/pages/Dashboard/Dashboard.tsx @@ -196,26 +196,30 @@ export function Dashboard({ onNavigate, onNewRequest }: DashboardProps) { params.endDate = customEnd.toISOString(); } + // Fetch common data for all users + const commonPromises = [ + dashboardService.getKPIs(selectedDateRange, customStart, customEnd), + dashboardService.getRecentActivity(1, 10), + dashboardService.getCriticalRequests(1, 10), + dashboardService.getUpcomingDeadlines(1, 10) + ]; + + // Fetch admin-only data if user is admin + const adminPromises = isAdmin ? [ + dashboardService.getDepartmentStats(selectedDateRange, customStart, customEnd), + dashboardService.getPriorityDistribution(selectedDateRange, customStart, customEnd), + dashboardService.getAIRemarkUtilization(selectedDateRange, customStart, customEnd), + dashboardService.getApproverPerformance(selectedDateRange, 1, 10, customStart, customEnd) + ] : []; + // Fetch all data in parallel const [ kpisData, activityResult, - criticalResult, - deptStats, - priorityDist, + criticalResult, deadlinesResult, - aiUtilization, - approverResult - ] = await Promise.all([ - dashboardService.getKPIs(selectedDateRange, customStart, customEnd), - dashboardService.getRecentActivity(1, 10), - dashboardService.getCriticalRequests(1, 10), - dashboardService.getDepartmentStats(selectedDateRange, customStart, customEnd), - dashboardService.getPriorityDistribution(selectedDateRange, customStart, customEnd), - dashboardService.getUpcomingDeadlines(1, 10), - dashboardService.getAIRemarkUtilization(selectedDateRange, customStart, customEnd), - dashboardService.getApproverPerformance(selectedDateRange, 1, 10, customStart, customEnd) - ]); + ...adminResults + ] = await Promise.all([...commonPromises, ...adminPromises]); setKpis(kpisData); setRecentActivity(activityResult.activities); @@ -228,27 +232,35 @@ export function Dashboard({ onNavigate, onNewRequest }: DashboardProps) { setCriticalTotalPages(criticalResult.pagination.totalPages); setCriticalTotalRecords(criticalResult.pagination.totalRecords); - setDepartmentStats(deptStats); - setPriorityDistribution(priorityDist); - setUpcomingDeadlines(deadlinesResult.deadlines); setDeadlinesPage(deadlinesResult.pagination.currentPage); setDeadlinesTotalPages(deadlinesResult.pagination.totalPages); setDeadlinesTotalRecords(deadlinesResult.pagination.totalRecords); - setAiRemarkUtilization(aiUtilization); - - setApproverPerformance(approverResult.performance); - setApproverPage(approverResult.pagination.currentPage); - setApproverTotalPages(approverResult.pagination.totalPages); - setApproverTotalRecords(approverResult.pagination.totalRecords); + // Only set admin-specific data if user is admin + if (isAdmin && adminResults.length === 4) { + const [deptStats, priorityDist, aiUtilization, approverResult] = adminResults; + setDepartmentStats(deptStats); + setPriorityDistribution(priorityDist); + setAiRemarkUtilization(aiUtilization); + setApproverPerformance(approverResult.performance); + setApproverPage(approverResult.pagination.currentPage); + setApproverTotalPages(approverResult.pagination.totalPages); + setApproverTotalRecords(approverResult.pagination.totalRecords); + } else if (!isAdmin) { + // Reset admin-specific data for normal users + setDepartmentStats([]); + setPriorityDistribution([]); + setAiRemarkUtilization(null); + setApproverPerformance([]); + } } catch (error) { console.error('Failed to fetch dashboard data:', error); } finally { setLoading(false); setRefreshing(false); } - }, []); + }, [isAdmin]); const handleRefresh = () => { if (dateRange === 'custom' && customStartDate && customEndDate) { @@ -455,12 +467,20 @@ export function Dashboard({ onNavigate, onNewRequest }: DashboardProps) { }, [fetchDashboardData, dateRange, customStartDate, customEndDate]); // Memoize quick actions to prevent recreation on each render - const quickActions = useMemo(() => [ - { label: 'New Request', icon: FileText, action: () => onNewRequest?.(), color: 'bg-emerald-600 hover:bg-emerald-700' }, - { label: 'View Pending', icon: Clock, action: () => onNavigate?.('open-requests'), color: 'bg-blue-600 hover:bg-blue-700' }, - { label: 'Reports', icon: Activity, action: () => onNavigate?.('detailed-reports'), color: 'bg-purple-600 hover:bg-purple-700' }, - { label: 'Settings', icon: Settings, action: () => onNavigate?.('settings'), color: 'bg-slate-600 hover:bg-slate-700' } - ], [onNavigate, onNewRequest]); + const quickActions = useMemo(() => { + const actions = [ + { label: 'New Request', icon: FileText, action: () => onNewRequest?.(), color: 'bg-emerald-600 hover:bg-emerald-700' }, + { label: 'View Pending', icon: Clock, action: () => onNavigate?.('open-requests'), color: 'bg-blue-600 hover:bg-blue-700' }, + { label: 'Settings', icon: Settings, action: () => onNavigate?.('settings'), color: 'bg-slate-600 hover:bg-slate-700' } + ]; + + // Only show Reports button for admin users + if (isAdmin) { + actions.splice(2, 0, { label: 'Reports', icon: Activity, action: () => onNavigate?.('detailed-reports'), color: 'bg-purple-600 hover:bg-purple-700' }); + } + + return actions; + }, [onNavigate, onNewRequest, isAdmin]); // Helper function to build filter URL params const buildFilterUrl = useCallback((filters: {