diff --git a/backend/src/.jest-cache/haste-map-60cab15b743c6776f41d29bcac696b99-0ca4a1d6e3dfec1d63b61b0119442391-1908b04cd11e739233ee8977de00dc57 b/backend/src/.jest-cache/haste-map-60cab15b743c6776f41d29bcac696b99-0ca4a1d6e3dfec1d63b61b0119442391-1908b04cd11e739233ee8977de00dc57 index abb55eb..c1b757e 100644 Binary files a/backend/src/.jest-cache/haste-map-60cab15b743c6776f41d29bcac696b99-0ca4a1d6e3dfec1d63b61b0119442391-1908b04cd11e739233ee8977de00dc57 and b/backend/src/.jest-cache/haste-map-60cab15b743c6776f41d29bcac696b99-0ca4a1d6e3dfec1d63b61b0119442391-1908b04cd11e739233ee8977de00dc57 differ diff --git a/frontend/components/correspondences/form.tsx b/frontend/components/correspondences/form.tsx index 7238ce9..1191a08 100644 --- a/frontend/components/correspondences/form.tsx +++ b/frontend/components/correspondences/form.tsx @@ -14,7 +14,7 @@ import { useRouter } from 'next/navigation'; import { Loader2 } from 'lucide-react'; import { useCreateCorrespondence, useUpdateCorrespondence } from '@/hooks/use-correspondence'; import { Organization } from '@/types/organization'; -import { useOrganizations, useProjects, useCorrespondenceTypes, useDisciplines } from '@/hooks/use-master-data'; +import { useOrganizations, useProjects, useCorrespondenceTypes, useDisciplines, useContracts } from '@/hooks/use-master-data'; import { CreateCorrespondenceDto } from '@/types/dto/correspondence/create-correspondence.dto'; import { useState, useEffect } from 'react'; import { correspondenceService as _correspondenceService } from '@/lib/services/correspondence.service'; @@ -24,6 +24,7 @@ import { filesApi } from '@/lib/api/files'; // Updated Zod Schema with all required fields const correspondenceSchema = z.object({ projectId: z.string().min(1, 'Please select a Project'), + contractId: z.string().min(1, 'Please select a Contract'), documentTypeId: z.number().min(1, 'Please select a Document Type'), disciplineId: z.number().optional(), subject: z.string().min(5, 'Subject must be at least 5 characters'), @@ -51,6 +52,12 @@ type ProjectOption = { projectCode: string; }; +type ContractOption = { + publicId?: string; + contractName?: string; + contractCode?: string; +}; + type CorrespondenceTypeOption = { id: number; typeName: string; @@ -116,11 +123,9 @@ export function CorrespondenceForm({ initialData, uuid }: { initialData?: Initia const { data: projectsData, isLoading: isLoadingProjects } = useProjects(); const { data: organizations, isLoading: isLoadingOrgs } = useOrganizations(); const { data: correspondenceTypesData, isLoading: isLoadingTypes } = useCorrespondenceTypes(); - const { data: disciplinesData, isLoading: isLoadingDisciplines } = useDisciplines(); const projects = (projectsData as ProjectOption[]) ?? []; const organizationOptions = extractArrayData(organizations); const correspondenceTypes = extractArrayData(correspondenceTypesData); - const disciplines = extractArrayData(disciplinesData); // Extract initial values if editing const currentRev = initialData?.revisions?.find((r) => r.isCurrent) || initialData?.revisions?.[0]; @@ -158,11 +163,35 @@ export function CorrespondenceForm({ initialData, uuid }: { initialData?: Initia // Watch for controlled inputs const projectId = watch('projectId'); + const contractId = watch('contractId'); const documentTypeId = watch('documentTypeId'); const disciplineId = watch('disciplineId'); const fromOrgId = watch('fromOrganizationId'); const toOrgId = watch('toOrganizationId'); + // Fetch contracts based on selected project + const { data: contractsData, isLoading: isLoadingContracts } = useContracts(projectId); + const contracts = extractArrayData(contractsData); + + // Fetch disciplines based on selected contract + const { data: disciplinesData, isLoading: isLoadingDisciplines } = useDisciplines(contractId); + const disciplines = extractArrayData(disciplinesData); + + // Reset dependent fields when project changes + useEffect(() => { + if (projectId) { + setValue('contractId', ''); + setValue('disciplineId', undefined); + } + }, [projectId, setValue]); + + // Reset discipline when contract changes + useEffect(() => { + if (contractId) { + setValue('disciplineId', undefined); + } + }, [contractId, setValue]); + const [isUploading, setIsUploading] = useState(false); const onSubmit = async (data: FormData) => { @@ -303,7 +332,7 @@ export function CorrespondenceForm({ initialData, uuid }: { initialData?: Initia )} {/* Document Metadata Section */} -
+
{/* Project Dropdown */}
@@ -326,6 +355,33 @@ export function CorrespondenceForm({ initialData, uuid }: { initialData?: Initia {errors.projectId &&

{errors.projectId.message}

}
+ {/* Contract Dropdown */} +
+ + + {errors.contractId &&

{errors.contractId.message}

} +
+ {/* Document Type Dropdown */}
@@ -354,7 +410,7 @@ export function CorrespondenceForm({ initialData, uuid }: { initialData?: Initia
diff --git a/frontend/hooks/use-master-data.ts b/frontend/hooks/use-master-data.ts index 4635a7c..52f460f 100644 --- a/frontend/hooks/use-master-data.ts +++ b/frontend/hooks/use-master-data.ts @@ -79,6 +79,7 @@ export function useDisciplines(contractId?: number | string) { return useQuery({ queryKey: masterDataKeys.disciplines(contractId), queryFn: () => masterDataService.getDisciplines(contractId), + enabled: !!contractId && contractId !== '', }); } diff --git a/frontend/hooks/use-reference-data.ts b/frontend/hooks/use-reference-data.ts index dddfa1b..e6df797 100644 --- a/frontend/hooks/use-reference-data.ts +++ b/frontend/hooks/use-reference-data.ts @@ -19,6 +19,7 @@ export const useRfaTypes = (contractId?: number | string) => { return useQuery({ queryKey: referenceDataKeys.rfaTypes(contractId), queryFn: () => masterDataService.getRfaTypes(contractId), + enabled: !!contractId && contractId !== '', }); };