7.5 KiB
7.5 KiB
Source-Level Flow Structure - Complete Implementation
Overview
Flow folders are now at the src/ level for maximum visibility and easy removal. Each flow folder is completely self-contained - deleting a folder removes ALL related code.
Directory Structure
src/
├── custom/ # Custom Request Flow (COMPLETE)
│ ├── components/
│ │ ├── request-detail/
│ │ │ ├── OverviewTab.tsx # Custom overview
│ │ │ └── WorkflowTab.tsx # Custom workflow
│ │ └── request-creation/
│ │ └── CreateRequest.tsx # Custom creation
│ ├── pages/
│ │ └── RequestDetail.tsx # COMPLETE Custom RequestDetail screen
│ ├── hooks/ # Custom-specific hooks (future)
│ ├── services/ # Custom-specific services (future)
│ ├── utils/ # Custom-specific utilities (future)
│ ├── types/ # Custom-specific types (future)
│ └── index.ts # Exports all Custom components
│
├── dealer-claim/ # Dealer Claim Flow (COMPLETE)
│ ├── components/
│ │ ├── request-detail/
│ │ │ ├── OverviewTab.tsx # Dealer claim overview
│ │ │ ├── WorkflowTab.tsx # Dealer claim workflow
│ │ │ ├── IOTab.tsx # IO management
│ │ │ ├── claim-cards/ # All dealer claim cards
│ │ │ │ ├── ActivityInformationCard.tsx
│ │ │ │ ├── DealerInformationCard.tsx
│ │ │ │ ├── ProcessDetailsCard.tsx
│ │ │ │ ├── ProposalDetailsCard.tsx
│ │ │ │ └── RequestInitiatorCard.tsx
│ │ │ └── modals/ # All dealer claim modals
│ │ │ ├── CreditNoteSAPModal.tsx
│ │ │ ├── DealerCompletionDocumentsModal.tsx
│ │ │ ├── DealerProposalSubmissionModal.tsx
│ │ │ ├── DeptLeadIOApprovalModal.tsx
│ │ │ ├── EditClaimAmountModal.tsx
│ │ │ ├── EmailNotificationTemplateModal.tsx
│ │ │ └── InitiatorProposalApprovalModal.tsx
│ │ └── request-creation/
│ │ └── ClaimManagementWizard.tsx
│ ├── pages/
│ │ └── RequestDetail.tsx # COMPLETE Dealer Claim RequestDetail screen
│ ├── hooks/ # Dealer claim hooks (future)
│ ├── services/ # Dealer claim services (future)
│ ├── utils/ # Dealer claim utilities (future)
│ ├── types/ # Dealer claim types (future)
│ └── index.ts # Exports all Dealer Claim components
│
├── shared/ # Shared Components (Flow-Agnostic)
│ └── components/
│ └── request-detail/
│ ├── DocumentsTab.tsx # Used by all flows
│ ├── ActivityTab.tsx # Used by all flows
│ ├── WorkNotesTab.tsx # Used by all flows
│ ├── SummaryTab.tsx # Used by all flows
│ ├── RequestDetailHeader.tsx
│ ├── QuickActionsSidebar.tsx
│ └── RequestDetailModals.tsx
│
└── flows.ts # Flow registry and routing utilities
Key Features
✅ Source-Level Visibility
- Flow folders are directly under
src/ - Easy to see and navigate
- Clear separation from other code
✅ Complete Self-Containment
- Each flow folder contains ALL its code
- RequestDetail screens, components, modals, cards
- Future: hooks, services, utils, types
✅ Easy Removal
- Delete
src/custom/→ All custom code removed - Delete
src/dealer-claim/→ All dealer claim code removed - Update
src/flows.ts→ Done!
How It Works
Main RequestDetail Router
src/pages/RequestDetail/RequestDetail.tsx is a simple router:
// 1. Fetches request to determine flow type
const flowType = getRequestFlowType(apiRequest);
// 2. Gets the appropriate RequestDetail screen from registry
const RequestDetailScreen = getRequestDetailScreen(flowType);
// 3. Renders the flow-specific screen
return <RequestDetailScreen {...props} />;
Flow Registry
src/flows.ts contains the registry:
import * as CustomFlow from './custom';
import * as DealerClaimFlow from './dealer-claim';
import * as SharedComponents from './shared/components';
export const FlowRegistry = {
CUSTOM: CustomFlow,
DEALER_CLAIM: DealerClaimFlow,
} as const;
export function getRequestDetailScreen(flowType: RequestFlowType) {
switch (flowType) {
case 'DEALER_CLAIM':
return DealerClaimFlow.DealerClaimRequestDetail;
case 'CUSTOM':
default:
return CustomFlow.CustomRequestDetail;
}
}
Deleting a Flow
Example: Remove Dealer Claim
Step 1: Delete folder
rm -rf src/dealer-claim/
Step 2: Update src/flows.ts
// Remove import
// import * as DealerClaimFlow from './dealer-claim';
// Update FlowRegistry
export const FlowRegistry = {
CUSTOM: CustomFlow,
// DEALER_CLAIM: DealerClaimFlow, // REMOVED
} as const;
// Update getRequestDetailScreen()
export function getRequestDetailScreen(flowType: RequestFlowType) {
switch (flowType) {
// case 'DEALER_CLAIM': // REMOVED
// return DealerClaimFlow.DealerClaimRequestDetail;
case 'CUSTOM':
default:
return CustomFlow.CustomRequestDetail;
}
}
Done! All dealer claim code is removed.
Import Paths
Flow-Specific Imports
// Custom flow
import { CustomRequestDetail } from '@/custom';
import { CustomOverviewTab } from '@/custom';
// Dealer claim flow
import { DealerClaimRequestDetail } from '@/dealer-claim';
import { DealerClaimOverviewTab } from '@/dealer-claim';
Shared Components
import { SharedComponents } from '@/shared/components';
const { DocumentsTab, ActivityTab } = SharedComponents;
Flow Registry
import { getRequestDetailScreen, CustomFlow, DealerClaimFlow } from '@/flows';
Benefits
- Maximum Visibility: Flow folders at
src/level are immediately visible - Easy Navigation: No nested paths - just
src/custom/orsrc/dealer-claim/ - Simple Removal: Delete folder + update
flows.ts= Done - Clear Ownership: Know exactly what belongs to which flow
- Complete Isolation: Each flow is independent
- Future-Proof: Easy to add hooks, services, utils, types to each flow
Current Structure
src/custom/
- ✅ Complete RequestDetail screen
- ✅ Request detail components
- ✅ Request creation component
- 🔜 Hooks, services, utils, types
src/dealer-claim/
- ✅ Complete RequestDetail screen
- ✅ Request detail components
- ✅ Request detail cards (5 cards)
- ✅ Request detail modals (7 modals)
- ✅ Request creation wizard
- 🔜 Hooks, services, utils, types
src/shared/
- ✅ Shared components used by all flows
src/flows.ts
- ✅ Flow registry
- ✅ Routing utilities
- ✅ Component getters
Conclusion
The architecture is now completely modular at the source level. Flow folders are directly under src/ for maximum visibility and easy removal. Deleting a folder removes all related code with zero dependencies remaining.