From 00f0b786f6b17aeb53252eff17ecad75f8457b0c Mon Sep 17 00:00:00 2001 From: laxmanhalaki Date: Wed, 19 Nov 2025 20:20:14 +0530 Subject: [PATCH] code rafactor done for few screns --- src/components/dashboard/KPICard/KPICard.tsx | 16 +- .../dashboard/StatCard/StatCard.tsx | 2 +- .../CreateRequest/ApprovalWorkflowStep.tsx | 359 ++ .../CreateRequest/BasicInformationStep.tsx | 225 + .../workflow/CreateRequest/DocumentsStep.tsx | 307 ++ .../CreateRequest/ParticipantsStep.tsx | 227 + .../CreateRequest/ReviewSubmitStep.tsx | 283 ++ .../CreateRequest/TemplateSelectionStep.tsx | 205 + .../workflow/CreateRequest/WizardFooter.tsx | 117 + .../workflow/CreateRequest/WizardStepper.tsx | 119 + .../workflow/CreateRequest/index.ts | 9 + src/hooks/useCreateRequestForm.ts | 315 ++ src/hooks/useDocumentManagement.ts | 189 + src/hooks/usePolicyValidation.ts | 150 + src/hooks/useUserSearch.ts | 142 + src/hooks/useWizardNavigation.ts | 108 + .../ApproverPerformance.tsx | 1045 +---- .../ApproverPerformanceActionsStats.tsx | 111 + .../components/ApproverPerformanceEmpty.tsx | 31 + .../components/ApproverPerformanceFilters.tsx | 240 ++ .../components/ApproverPerformanceHeader.tsx | 44 + .../ApproverPerformanceRequestList.tsx | 192 + .../ApproverPerformanceStatsCards.tsx | 112 + .../hooks/useApproverPerformanceData.ts | 196 + .../hooks/useApproverPerformanceFilters.ts | 101 + .../types/approverPerformance.types.ts | 48 + .../utils/configMappers.ts | 101 + .../ApproverPerformance/utils/formatters.ts | 24 + .../utils/statsCalculations.ts | 85 + src/pages/ClosedRequests/ClosedRequests.tsx | 679 +-- .../components/ClosedRequestCard.tsx | 112 + .../components/ClosedRequestsEmpty.tsx | 47 + .../components/ClosedRequestsFilters.tsx | 161 + .../components/ClosedRequestsHeader.tsx | 56 + .../components/ClosedRequestsList.tsx | 41 + .../components/ClosedRequestsPagination.tsx | 107 + .../ClosedRequests/hooks/useClosedRequests.ts | 106 + .../hooks/useClosedRequestsFilters.ts | 87 + .../types/closedRequests.types.ts | 54 + .../ClosedRequests/utils/configMappers.ts | 67 + .../ClosedRequests/utils/paginationHelpers.ts | 21 + .../utils/requestTransformers.ts | 37 + src/pages/CreateRequest/CreateRequest.tsx | 3718 ++--------------- .../components/CreateRequestContent.tsx | 24 + .../components/CreateRequestHeader.tsx | 71 + .../components/modals/DocumentErrorModal.tsx | 92 + .../modals/ValidationErrorModal.tsx | 138 + .../constants/requestTemplates.ts | 36 + .../hooks/useApproverValidation.ts | 183 + .../hooks/useCreateRequestHandlers.ts | 157 + .../hooks/useCreateRequestSubmission.ts | 167 + .../CreateRequest/hooks/useRequestModals.ts | 92 + .../services/createRequestService.ts | 86 + .../types/createRequest.types.ts | 124 + .../utils/approvalLevelBuilders.ts | 51 + .../CreateRequest/utils/participantMappers.ts | 110 + .../CreateRequest/utils/payloadBuilders.ts | 114 + src/pages/Dashboard/Dashboard.tsx | 2151 +--------- .../components/DashboardFiltersBar.tsx | 202 + .../Dashboard/components/DashboardHero.tsx | 70 + .../sections/AIRemarkUtilizationReport.tsx | 92 + .../sections/AdminAnalyticsSection.tsx | 213 + .../components/sections/AdminKPICards.tsx | 191 + .../sections/ApproverPerformanceReport.tsx | 154 + .../sections/CriticalAlertsSection.tsx | 134 + .../sections/PriorityDistributionReport.tsx | 134 + .../sections/RecentActivitySection.tsx | 151 + .../components/sections/TATBreachReport.tsx | 192 + .../sections/UpcomingDeadlinesSection.tsx | 129 + .../components/sections/UserKPICards.tsx | 193 + .../sections/UserMetricsSection.tsx | 76 + .../components/types/dashboard.types.ts | 16 + src/pages/Dashboard/hooks/useDashboardData.ts | 203 + .../Dashboard/hooks/useDashboardExports.ts | 52 + .../Dashboard/hooks/useDashboardFilters.ts | 62 + .../Dashboard/hooks/useDashboardPagination.ts | 97 + src/pages/Dashboard/types/dashboard.types.ts | 62 + .../Dashboard/utils/dashboardCalculations.ts | 91 + src/pages/Dashboard/utils/dashboardExports.ts | 110 + .../Dashboard/utils/dashboardNavigation.ts | 59 + src/pages/DetailedReports/DetailedReports.tsx | 1720 +------- .../components/DateRangeFilter.tsx | 139 + .../components/DetailedReportsHeader.tsx | 33 + .../sections/RequestLifecycleReport.tsx | 219 + .../sections/UserActivityLogReport.tsx | 266 ++ .../sections/WorkflowAgingReport.tsx | 262 ++ .../hooks/useActivityLogReport.ts | 129 + .../DetailedReports/hooks/useAgingReport.ts | 134 + .../DetailedReports/hooks/useDateFilter.ts | 117 + .../hooks/useDetailedReportsExports.ts | 74 + .../hooks/useLifecycleReport.ts | 110 + .../DetailedReports/hooks/useThreshold.ts | 46 + .../types/detailedReports.types.ts | 60 + .../DetailedReports/utils/colorMappers.ts | 69 + src/pages/DetailedReports/utils/csvExports.ts | 168 + src/pages/DetailedReports/utils/formatting.ts | 72 + src/pages/MyRequests/MyRequests.tsx | 532 +-- .../components/MyRequestsFilters.tsx | 79 + .../MyRequests/components/MyRequestsList.tsx | 58 + .../MyRequests/components/MyRequestsStats.tsx | 73 + .../MyRequests/components/RequestCard.tsx | 122 + src/pages/MyRequests/hooks/useMyRequests.ts | 92 + .../MyRequests/hooks/useMyRequestsFilters.ts | 65 + .../MyRequests/hooks/useMyRequestsStats.ts | 27 + .../MyRequests/types/myRequests.types.ts | 43 + src/pages/MyRequests/utils/configMappers.ts | 89 + .../MyRequests/utils/requestTransformers.ts | 43 + src/pages/RequestDetail/RequestDetail.tsx | 1344 +----- .../components/QuickActionsSidebar.tsx | 118 + .../components/RequestDetailHeader.tsx | 100 + .../components/RequestDetailModals.tsx | 210 + .../components/tabs/ActivityTab.tsx | 61 + .../components/tabs/DocumentsTab.tsx | 124 + .../components/tabs/OverviewTab.tsx | 313 ++ .../components/tabs/WorkNotesTab.tsx | 41 + .../components/tabs/WorkflowTab.tsx | 75 + .../types/requestDetail.types.ts | 27 + src/pages/Requests/Requests.tsx | 2123 ++-------- src/pages/Requests/components/RequestCard.tsx | 120 + .../Requests/components/RequestsHeader.tsx | 63 + .../Requests/components/RequestsList.tsx | 60 + .../Requests/components/RequestsStats.tsx | 84 + .../Requests/hooks/useRequestsFilters.ts | 181 + src/pages/Requests/hooks/useUserSearch.ts | 93 + .../Requests/services/requestsService.ts | 187 + src/pages/Requests/types/requests.types.ts | 65 + src/pages/Requests/utils/configMappers.ts | 70 + src/pages/Requests/utils/csvExports.ts | 74 + .../Requests/utils/requestCalculations.ts | 72 + src/pages/Requests/utils/requestFilters.ts | 196 + .../Requests/utils/requestTransformers.ts | 108 + 131 files changed, 15551 insertions(+), 11874 deletions(-) create mode 100644 src/components/workflow/CreateRequest/ApprovalWorkflowStep.tsx create mode 100644 src/components/workflow/CreateRequest/BasicInformationStep.tsx create mode 100644 src/components/workflow/CreateRequest/DocumentsStep.tsx create mode 100644 src/components/workflow/CreateRequest/ParticipantsStep.tsx create mode 100644 src/components/workflow/CreateRequest/ReviewSubmitStep.tsx create mode 100644 src/components/workflow/CreateRequest/TemplateSelectionStep.tsx create mode 100644 src/components/workflow/CreateRequest/WizardFooter.tsx create mode 100644 src/components/workflow/CreateRequest/WizardStepper.tsx create mode 100644 src/components/workflow/CreateRequest/index.ts create mode 100644 src/hooks/useCreateRequestForm.ts create mode 100644 src/hooks/useDocumentManagement.ts create mode 100644 src/hooks/usePolicyValidation.ts create mode 100644 src/hooks/useUserSearch.ts create mode 100644 src/hooks/useWizardNavigation.ts create mode 100644 src/pages/ApproverPerformance/components/ApproverPerformanceActionsStats.tsx create mode 100644 src/pages/ApproverPerformance/components/ApproverPerformanceEmpty.tsx create mode 100644 src/pages/ApproverPerformance/components/ApproverPerformanceFilters.tsx create mode 100644 src/pages/ApproverPerformance/components/ApproverPerformanceHeader.tsx create mode 100644 src/pages/ApproverPerformance/components/ApproverPerformanceRequestList.tsx create mode 100644 src/pages/ApproverPerformance/components/ApproverPerformanceStatsCards.tsx create mode 100644 src/pages/ApproverPerformance/hooks/useApproverPerformanceData.ts create mode 100644 src/pages/ApproverPerformance/hooks/useApproverPerformanceFilters.ts create mode 100644 src/pages/ApproverPerformance/types/approverPerformance.types.ts create mode 100644 src/pages/ApproverPerformance/utils/configMappers.ts create mode 100644 src/pages/ApproverPerformance/utils/formatters.ts create mode 100644 src/pages/ApproverPerformance/utils/statsCalculations.ts create mode 100644 src/pages/ClosedRequests/components/ClosedRequestCard.tsx create mode 100644 src/pages/ClosedRequests/components/ClosedRequestsEmpty.tsx create mode 100644 src/pages/ClosedRequests/components/ClosedRequestsFilters.tsx create mode 100644 src/pages/ClosedRequests/components/ClosedRequestsHeader.tsx create mode 100644 src/pages/ClosedRequests/components/ClosedRequestsList.tsx create mode 100644 src/pages/ClosedRequests/components/ClosedRequestsPagination.tsx create mode 100644 src/pages/ClosedRequests/hooks/useClosedRequests.ts create mode 100644 src/pages/ClosedRequests/hooks/useClosedRequestsFilters.ts create mode 100644 src/pages/ClosedRequests/types/closedRequests.types.ts create mode 100644 src/pages/ClosedRequests/utils/configMappers.ts create mode 100644 src/pages/ClosedRequests/utils/paginationHelpers.ts create mode 100644 src/pages/ClosedRequests/utils/requestTransformers.ts create mode 100644 src/pages/CreateRequest/components/CreateRequestContent.tsx create mode 100644 src/pages/CreateRequest/components/CreateRequestHeader.tsx create mode 100644 src/pages/CreateRequest/components/modals/DocumentErrorModal.tsx create mode 100644 src/pages/CreateRequest/components/modals/ValidationErrorModal.tsx create mode 100644 src/pages/CreateRequest/constants/requestTemplates.ts create mode 100644 src/pages/CreateRequest/hooks/useApproverValidation.ts create mode 100644 src/pages/CreateRequest/hooks/useCreateRequestHandlers.ts create mode 100644 src/pages/CreateRequest/hooks/useCreateRequestSubmission.ts create mode 100644 src/pages/CreateRequest/hooks/useRequestModals.ts create mode 100644 src/pages/CreateRequest/services/createRequestService.ts create mode 100644 src/pages/CreateRequest/types/createRequest.types.ts create mode 100644 src/pages/CreateRequest/utils/approvalLevelBuilders.ts create mode 100644 src/pages/CreateRequest/utils/participantMappers.ts create mode 100644 src/pages/CreateRequest/utils/payloadBuilders.ts create mode 100644 src/pages/Dashboard/components/DashboardFiltersBar.tsx create mode 100644 src/pages/Dashboard/components/DashboardHero.tsx create mode 100644 src/pages/Dashboard/components/sections/AIRemarkUtilizationReport.tsx create mode 100644 src/pages/Dashboard/components/sections/AdminAnalyticsSection.tsx create mode 100644 src/pages/Dashboard/components/sections/AdminKPICards.tsx create mode 100644 src/pages/Dashboard/components/sections/ApproverPerformanceReport.tsx create mode 100644 src/pages/Dashboard/components/sections/CriticalAlertsSection.tsx create mode 100644 src/pages/Dashboard/components/sections/PriorityDistributionReport.tsx create mode 100644 src/pages/Dashboard/components/sections/RecentActivitySection.tsx create mode 100644 src/pages/Dashboard/components/sections/TATBreachReport.tsx create mode 100644 src/pages/Dashboard/components/sections/UpcomingDeadlinesSection.tsx create mode 100644 src/pages/Dashboard/components/sections/UserKPICards.tsx create mode 100644 src/pages/Dashboard/components/sections/UserMetricsSection.tsx create mode 100644 src/pages/Dashboard/components/types/dashboard.types.ts create mode 100644 src/pages/Dashboard/hooks/useDashboardData.ts create mode 100644 src/pages/Dashboard/hooks/useDashboardExports.ts create mode 100644 src/pages/Dashboard/hooks/useDashboardFilters.ts create mode 100644 src/pages/Dashboard/hooks/useDashboardPagination.ts create mode 100644 src/pages/Dashboard/types/dashboard.types.ts create mode 100644 src/pages/Dashboard/utils/dashboardCalculations.ts create mode 100644 src/pages/Dashboard/utils/dashboardExports.ts create mode 100644 src/pages/Dashboard/utils/dashboardNavigation.ts create mode 100644 src/pages/DetailedReports/components/DateRangeFilter.tsx create mode 100644 src/pages/DetailedReports/components/DetailedReportsHeader.tsx create mode 100644 src/pages/DetailedReports/components/sections/RequestLifecycleReport.tsx create mode 100644 src/pages/DetailedReports/components/sections/UserActivityLogReport.tsx create mode 100644 src/pages/DetailedReports/components/sections/WorkflowAgingReport.tsx create mode 100644 src/pages/DetailedReports/hooks/useActivityLogReport.ts create mode 100644 src/pages/DetailedReports/hooks/useAgingReport.ts create mode 100644 src/pages/DetailedReports/hooks/useDateFilter.ts create mode 100644 src/pages/DetailedReports/hooks/useDetailedReportsExports.ts create mode 100644 src/pages/DetailedReports/hooks/useLifecycleReport.ts create mode 100644 src/pages/DetailedReports/hooks/useThreshold.ts create mode 100644 src/pages/DetailedReports/types/detailedReports.types.ts create mode 100644 src/pages/DetailedReports/utils/colorMappers.ts create mode 100644 src/pages/DetailedReports/utils/csvExports.ts create mode 100644 src/pages/DetailedReports/utils/formatting.ts create mode 100644 src/pages/MyRequests/components/MyRequestsFilters.tsx create mode 100644 src/pages/MyRequests/components/MyRequestsList.tsx create mode 100644 src/pages/MyRequests/components/MyRequestsStats.tsx create mode 100644 src/pages/MyRequests/components/RequestCard.tsx create mode 100644 src/pages/MyRequests/hooks/useMyRequests.ts create mode 100644 src/pages/MyRequests/hooks/useMyRequestsFilters.ts create mode 100644 src/pages/MyRequests/hooks/useMyRequestsStats.ts create mode 100644 src/pages/MyRequests/types/myRequests.types.ts create mode 100644 src/pages/MyRequests/utils/configMappers.ts create mode 100644 src/pages/MyRequests/utils/requestTransformers.ts create mode 100644 src/pages/RequestDetail/components/QuickActionsSidebar.tsx create mode 100644 src/pages/RequestDetail/components/RequestDetailHeader.tsx create mode 100644 src/pages/RequestDetail/components/RequestDetailModals.tsx create mode 100644 src/pages/RequestDetail/components/tabs/ActivityTab.tsx create mode 100644 src/pages/RequestDetail/components/tabs/DocumentsTab.tsx create mode 100644 src/pages/RequestDetail/components/tabs/OverviewTab.tsx create mode 100644 src/pages/RequestDetail/components/tabs/WorkNotesTab.tsx create mode 100644 src/pages/RequestDetail/components/tabs/WorkflowTab.tsx create mode 100644 src/pages/RequestDetail/types/requestDetail.types.ts create mode 100644 src/pages/Requests/components/RequestCard.tsx create mode 100644 src/pages/Requests/components/RequestsHeader.tsx create mode 100644 src/pages/Requests/components/RequestsList.tsx create mode 100644 src/pages/Requests/components/RequestsStats.tsx create mode 100644 src/pages/Requests/hooks/useRequestsFilters.ts create mode 100644 src/pages/Requests/hooks/useUserSearch.ts create mode 100644 src/pages/Requests/services/requestsService.ts create mode 100644 src/pages/Requests/types/requests.types.ts create mode 100644 src/pages/Requests/utils/configMappers.ts create mode 100644 src/pages/Requests/utils/csvExports.ts create mode 100644 src/pages/Requests/utils/requestCalculations.ts create mode 100644 src/pages/Requests/utils/requestFilters.ts create mode 100644 src/pages/Requests/utils/requestTransformers.ts diff --git a/src/components/dashboard/KPICard/KPICard.tsx b/src/components/dashboard/KPICard/KPICard.tsx index efa74e4..c8b17e0 100644 --- a/src/components/dashboard/KPICard/KPICard.tsx +++ b/src/components/dashboard/KPICard/KPICard.tsx @@ -27,41 +27,41 @@ export function KPICard({ }: KPICardProps) { return ( - + {title} -
+
- +
{value}
{subtitle && (
{subtitle}
)} {children && ( -
+
{children}
)} diff --git a/src/components/dashboard/StatCard/StatCard.tsx b/src/components/dashboard/StatCard/StatCard.tsx index bfe0fab..fbf2a2f 100644 --- a/src/components/dashboard/StatCard/StatCard.tsx +++ b/src/components/dashboard/StatCard/StatCard.tsx @@ -26,7 +26,7 @@ export function StatCard({ onClick={onClick} >

{label} diff --git a/src/components/workflow/CreateRequest/ApprovalWorkflowStep.tsx b/src/components/workflow/CreateRequest/ApprovalWorkflowStep.tsx new file mode 100644 index 0000000..1a9b20d --- /dev/null +++ b/src/components/workflow/CreateRequest/ApprovalWorkflowStep.tsx @@ -0,0 +1,359 @@ +import { motion } from 'framer-motion'; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; +import { Button } from '@/components/ui/button'; +import { Input } from '@/components/ui/input'; +import { Label } from '@/components/ui/label'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; +import { Badge } from '@/components/ui/badge'; +import { Users, Settings, Shield, User, CheckCircle, AlertCircle, Info, Clock, Minus, Plus } from 'lucide-react'; +import { FormData } from '@/hooks/useCreateRequestForm'; +import { useMultiUserSearch } from '@/hooks/useUserSearch'; +import { useAuth } from '@/contexts/AuthContext'; +import { ensureUserExists } from '@/services/userApi'; + +interface ApprovalWorkflowStepProps { + formData: FormData; + updateFormData: (field: keyof FormData, value: any) => void; + onValidationError: (error: { type: string; email: string; message: string }) => void; +} + +/** + * Component: ApprovalWorkflowStep + * + * Purpose: Step 3 - Approval workflow configuration + * + * Features: + * - Configure number of approvers + * - Define approval hierarchy with TAT + * - User search with @ prefix + * - Test IDs for testing + * + * Note: This is a simplified version. Full implementation includes complex approver management. + */ +export function ApprovalWorkflowStep({ + formData, + updateFormData, + onValidationError +}: ApprovalWorkflowStepProps) { + const { user } = useAuth(); + const { userSearchResults, userSearchLoading, searchUsersForIndex, clearSearchForIndex } = useMultiUserSearch(); + + const handleApproverEmailChange = (index: number, value: string) => { + const newApprovers = [...formData.approvers]; + const previousEmail = newApprovers[index]?.email; + const emailChanged = previousEmail !== value; + + newApprovers[index] = { + ...newApprovers[index], + email: value, + level: index + 1, + userId: emailChanged ? undefined : newApprovers[index]?.userId, + name: emailChanged ? undefined : newApprovers[index]?.name, + department: emailChanged ? undefined : newApprovers[index]?.department, + avatar: emailChanged ? undefined : newApprovers[index]?.avatar + }; + updateFormData('approvers', newApprovers); + + if (!value || !value.startsWith('@') || value.length < 2) { + clearSearchForIndex(index); + return; + } + searchUsersForIndex(index, value, 10); + }; + + const handleUserSelect = async (index: number, selectedUser: any) => { + try { + const dbUser = await ensureUserExists({ + userId: selectedUser.userId, + email: selectedUser.email, + displayName: selectedUser.displayName, + firstName: selectedUser.firstName, + lastName: selectedUser.lastName, + department: selectedUser.department, + phone: selectedUser.phone, + mobilePhone: selectedUser.mobilePhone, + designation: selectedUser.designation, + jobTitle: selectedUser.jobTitle, + manager: selectedUser.manager, + employeeId: selectedUser.employeeId, + employeeNumber: selectedUser.employeeNumber, + secondEmail: selectedUser.secondEmail, + location: selectedUser.location + }); + + const updated = [...formData.approvers]; + updated[index] = { + ...updated[index], + email: selectedUser.email, + name: selectedUser.displayName || [selectedUser.firstName, selectedUser.lastName].filter(Boolean).join(' '), + userId: dbUser.userId, + level: index + 1, + }; + updateFormData('approvers', updated); + clearSearchForIndex(index); + } catch (err) { + console.error('Failed to ensure user exists:', err); + onValidationError({ + type: 'error', + email: selectedUser.email, + message: 'Failed to validate user. Please try again.' + }); + } + }; + + return ( + +

+
+ +
+

+ Approval Workflow +

+

+ Define the approval hierarchy and assign approvers by email ID. +

+
+ +
+ {/* Number of Approvers */} + + + + + Approval Configuration + + + Configure how many approvers you need and define the approval sequence. + + + +
+ +
+ + + {formData.approverCount || 1} + + +
+

+ Maximum 10 approvers allowed. Each approver will review sequentially. +

+
+
+
+ + {/* Approval Hierarchy */} + + + + + Approval Hierarchy * + + + Define the approval sequence. Each approver will review the request in order from Level 1 to Level {formData.approverCount || 1}. + + + + {/* Initiator Card */} +
+
+
+ +
+
+
+ Request Initiator + YOU +
+

Creates and submits the request

+
+
+
+ + {/* Dynamic Approver Cards */} + {Array.from({ length: formData.approverCount || 1 }, (_, index) => { + const level = index + 1; + const isLast = level === (formData.approverCount || 1); + + if (!formData.approvers[index]) { + const newApprovers = [...formData.approvers]; + newApprovers[index] = { email: '', name: '', level: level, tat: '' as any }; + updateFormData('approvers', newApprovers); + } + + return ( +
+
+
+
+ +
+
+
+ {level} +
+
+
+ + Approver Level {level} + + {isLast && ( + FINAL APPROVER + )} +
+
+
+
+ + {formData.approvers[index]?.email && formData.approvers[index]?.userId && ( + + + Verified + + )} +
+
+ handleApproverEmailChange(index, e.target.value)} + className="h-10 border-2 border-gray-300 focus:border-blue-500 mt-1 w-full" + data-testid={`approval-workflow-approver-${level}-email-input`} + /> + {/* Search suggestions dropdown */} + {(userSearchLoading[index] || (userSearchResults[index]?.length || 0) > 0) && ( +
+ {userSearchLoading[index] ? ( +
Searching...
+ ) : ( +
    + {userSearchResults[index]?.map((u) => ( +
  • handleUserSelect(index, u)} + data-testid={`approval-workflow-approver-${level}-search-result-${u.userId}`} + > +
    {u.displayName || u.email}
    +
    {u.email}
    +
  • + ))} +
+ )} +
+ )} +
+
+ +
+ +
+ { + const newApprovers = [...formData.approvers]; + newApprovers[index] = { + ...newApprovers[index], + tat: parseInt(e.target.value) || '', + level: level, + tatType: formData.approvers[index]?.tatType || 'hours' + }; + updateFormData('approvers', newApprovers); + }} + className="h-10 border-2 border-gray-300 focus:border-blue-500 flex-1" + data-testid={`approval-workflow-approver-${level}-tat-input`} + /> + +
+
+
+
+
+
+
+ ); + })} +
+
+
+ + ); +} + diff --git a/src/components/workflow/CreateRequest/BasicInformationStep.tsx b/src/components/workflow/CreateRequest/BasicInformationStep.tsx new file mode 100644 index 0000000..854fd3a --- /dev/null +++ b/src/components/workflow/CreateRequest/BasicInformationStep.tsx @@ -0,0 +1,225 @@ +import { motion } from 'framer-motion'; +import { Input } from '@/components/ui/input'; +import { Label } from '@/components/ui/label'; +import { Textarea } from '@/components/ui/textarea'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; +import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'; +import { Badge } from '@/components/ui/badge'; +import { FileText, Zap, Clock } from 'lucide-react'; +import { FormData, RequestTemplate } from '@/hooks/useCreateRequestForm'; + +interface BasicInformationStepProps { + formData: FormData; + selectedTemplate: RequestTemplate | null; + updateFormData: (field: keyof FormData, value: any) => void; +} + +/** + * Component: BasicInformationStep + * + * Purpose: Step 2 - Basic information form (title, description, priority) + * + * Features: + * - Request title and description inputs + * - Priority selection (Express/Standard) + * - Template-specific additional fields + * - Test IDs for testing + */ +export function BasicInformationStep({ + formData, + selectedTemplate, + updateFormData +}: BasicInformationStepProps) { + return ( + +
+
+ +
+

+ Basic Information +

+

+ Provide the essential details for your {selectedTemplate?.name || 'request'}. +

+
+ +
+
+ +

+ Be specific and descriptive. This will be visible to all participants. +

+ updateFormData('title', e.target.value)} + className="text-base h-12 border-2 border-gray-300 focus:border-blue-500 bg-white shadow-sm" + data-testid="basic-information-title-input" + /> +
+ +
+ +

+ Explain what you need approval for, why it's needed, and any relevant background information. +

+