diff --git a/src/App.tsx b/src/App.tsx index ef57e0d..837de33 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -514,7 +514,7 @@ function AppRoutes({ onLogout }: AppProps) { path="/approver-performance" element={ - + } /> diff --git a/src/components/admin/ConfigurationManager.tsx b/src/components/admin/ConfigurationManager.tsx index 5bcbdd7..c28159e 100644 --- a/src/components/admin/ConfigurationManager.tsx +++ b/src/components/admin/ConfigurationManager.tsx @@ -258,11 +258,6 @@ export function ConfigurationManager({ onConfigUpdate }: ConfigurationManagerPro } }; - const getCategoryColor = (category: string) => { - // Use uniform slate color for all category icons - return 'bg-gradient-to-br from-slate-600 to-slate-700 text-white'; - }; - // Filter out notification rules and dashboard layout categories const excludedCategories = ['NOTIFICATION_RULES', 'DASHBOARD_LAYOUT']; const filteredConfigurations = configurations.filter( diff --git a/src/components/participant/AddSpectatorModal/AddSpectatorModal.tsx b/src/components/participant/AddSpectatorModal/AddSpectatorModal.tsx index 22a7e20..eb89d5f 100644 --- a/src/components/participant/AddSpectatorModal/AddSpectatorModal.tsx +++ b/src/components/participant/AddSpectatorModal/AddSpectatorModal.tsx @@ -192,9 +192,6 @@ export function AddSpectatorModal({ } // Count existing participants (initiator + approvers + spectators) - const existingApprovers = existingParticipants.filter( - p => (p.participantType || '').toUpperCase() === 'APPROVER' - ); const totalParticipants = existingParticipants.length + 1; // +1 for the new spectator // Check maximum participants diff --git a/src/components/workflow/ApprovalWorkflow/ApprovalStepCard.tsx b/src/components/workflow/ApprovalWorkflow/ApprovalStepCard.tsx index 5ace43f..534d503 100644 --- a/src/components/workflow/ApprovalWorkflow/ApprovalStepCard.tsx +++ b/src/components/workflow/ApprovalWorkflow/ApprovalStepCard.tsx @@ -107,7 +107,7 @@ export function ApprovalStepCard({ const isWaiting = step.status === 'waiting'; const tatHours = Number(step.tatHours || 0); - const actualHours = step.actualHours; + const actualHours = step.actualHours ?? 0; const savedHours = isCompleted && actualHours ? Math.max(0, tatHours - actualHours) : 0; // Calculate if breached diff --git a/src/hooks/useRequestSocket.ts b/src/hooks/useRequestSocket.ts index b3ee746..ac6a5a4 100644 --- a/src/hooks/useRequestSocket.ts +++ b/src/hooks/useRequestSocket.ts @@ -169,7 +169,7 @@ export function useRequestSocket( * 1. Increment unread badge if user is not on Work Notes tab * 2. Refresh merged messages to show new note */ - const handleNewWorkNote = (data: any) => { + const handleNewWorkNote = (_data: any) => { // New work note received - logging removed // Update unread badge (only if not viewing work notes) diff --git a/src/pages/Dashboard/Dashboard.tsx b/src/pages/Dashboard/Dashboard.tsx index 808b666..2b580c9 100644 --- a/src/pages/Dashboard/Dashboard.tsx +++ b/src/pages/Dashboard/Dashboard.tsx @@ -29,13 +29,12 @@ import { ArrowRight } from 'lucide-react'; import { format } from 'date-fns'; -import { dashboardService, type DashboardKPIs, type DateRange, type AIRemarkUtilization, type ApproverPerformance } from '@/services/dashboard.service'; +import { dashboardService, type DashboardKPIs, type DateRange, type AIRemarkUtilization, type ApproverPerformance, type DepartmentStats, type PriorityDistribution, type UpcomingDeadline, type RecentActivity, type CriticalRequest } from '@/services/dashboard.service'; import { useAuth, hasManagementAccess } from '@/contexts/AuthContext'; import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, PieChart as RechartsPieChart, Pie, Cell, BarChart, Bar } from 'recharts'; import { KPICard } from '@/components/dashboard/KPICard'; import { StatCard } from '@/components/dashboard/StatCard'; import { CriticalAlertCard, CriticalAlertData } from '@/components/dashboard/CriticalAlertCard'; -import type { CriticalRequest } from '@/services/dashboard.service'; import { ActivityFeedItem, ActivityData } from '@/components/dashboard/ActivityFeedItem'; import { Pagination } from '@/components/common/Pagination'; import { formatHoursMinutes } from '@/utils/slaTracker'; @@ -213,13 +212,12 @@ export function Dashboard({ onNavigate, onNewRequest }: DashboardProps) { ] : []; // Fetch all data in parallel - const [ - kpisData, - activityResult, - criticalResult, - deadlinesResult, - ...adminResults - ] = await Promise.all([...commonPromises, ...adminPromises]); + const results = await Promise.all([...commonPromises, ...adminPromises]); + + const kpisData = results[0] as DashboardKPIs; + const activityResult = results[1] as { activities: RecentActivity[]; pagination: { currentPage: number; totalPages: number; totalRecords: number; limit: number } }; + const criticalResult = results[2] as { criticalRequests: CriticalRequest[]; pagination: { currentPage: number; totalPages: number; totalRecords: number; limit: number } }; + const deadlinesResult = results[3] as { deadlines: UpcomingDeadline[]; pagination: { currentPage: number; totalPages: number; totalRecords: number; limit: number } }; setKpis(kpisData); setRecentActivity(activityResult.activities); @@ -238,8 +236,11 @@ export function Dashboard({ onNavigate, onNewRequest }: DashboardProps) { setDeadlinesTotalRecords(deadlinesResult.pagination.totalRecords); // Only set admin-specific data if user is admin - if (isAdmin && adminResults.length === 4) { - const [deptStats, priorityDist, aiUtilization, approverResult] = adminResults; + if (isAdmin && results.length >= 8) { + const deptStats = results[4] as DepartmentStats[]; + const priorityDist = results[5] as PriorityDistribution[]; + const aiUtilization = results[6] as AIRemarkUtilization; + const approverResult = results[7] as { performance: ApproverPerformance[]; pagination: { currentPage: number; totalPages: number; totalRecords: number; limit: number } }; setDepartmentStats(deptStats); setPriorityDistribution(priorityDist); setAiRemarkUtilization(aiUtilization);