diff --git a/src/api/API.ts b/src/api/API.ts index aae4a6f..16c21fb 100644 --- a/src/api/API.ts +++ b/src/api/API.ts @@ -47,6 +47,7 @@ export const API = { updateArchitectureStatus: (applicationId: string, status: string, remarks?: string) => client.post(`/onboarding/applications/${applicationId}/architecture-status`, { status, remarks }), generateDealerCodes: (applicationId: string) => client.post(`/onboarding/applications/${applicationId}/generate-codes`), updateApplicationStatus: (id: string, data: any) => client.put(`/onboarding/applications/${id}/status`, data), + retriggerEvaluators: (id: string) => client.post(`/onboarding/applications/${id}/retrigger-evaluators`), // Documents uploadDocument: (id: string, data: any) => client.post(`/onboarding/applications/${id}/documents`, data, { diff --git a/src/components/admin/QuestionnaireBuilder.tsx b/src/components/admin/QuestionnaireBuilder.tsx index ee174cd..9fcf188 100644 --- a/src/components/admin/QuestionnaireBuilder.tsx +++ b/src/components/admin/QuestionnaireBuilder.tsx @@ -8,7 +8,7 @@ interface Question { id?: string; sectionName: string; questionText: string; - inputType: 'text' | 'yesno' | 'file' | 'number' | 'select'; + inputType: 'text' | 'yesno' | 'file' | 'number' | 'select' | 'mcq' | 'radio' | 'textarea' | 'email'; options?: { text: string; score: number }[]; weight: number; order: number; @@ -58,7 +58,7 @@ const QuestionnaireBuilder: React.FC = () => { if (normalizedType === 'mcq') normalizedType = 'select'; // Fallback validity check - const validTypes = ['text', 'number', 'file', 'yesno', 'select']; + const validTypes = ['text', 'number', 'file', 'yesno', 'select', 'radio', 'textarea', 'email', 'mcq']; if (!validTypes.includes(normalizedType)) normalizedType = 'text'; return { @@ -295,10 +295,13 @@ const QuestionnaireBuilder: React.FC = () => { className="w-full border border-slate-300 p-2.5 rounded-lg focus:ring-2 focus:ring-amber-500 outline-none bg-white" > + + - + + @@ -308,8 +311,8 @@ const QuestionnaireBuilder: React.FC = () => {
updateQuestion(index, 'weight', parseFloat(e.target.value))} + value={isNaN(q.weight) ? 0 : q.weight} + onChange={(e) => updateQuestion(index, 'weight', parseFloat(e.target.value) || 0)} className="w-full border border-slate-300 p-2.5 rounded-lg focus:ring-2 focus:ring-amber-500 outline-none pl-3 pr-8" title="Weightage" /> @@ -330,7 +333,7 @@ const QuestionnaireBuilder: React.FC = () => {
{/* Options Editor for Select/YesNo */} - {(q.inputType === 'select' || q.inputType === 'yesno') && ( + {(q.inputType === 'select' || q.inputType === 'yesno' || q.inputType === 'radio' || q.inputType === 'mcq') && (
+ ); + } + return null; + })()} {/* Stage Docs Link */} {(() => { const stageDocsCount = documents.filter(doc => @@ -2344,7 +2416,8 @@ export function ApplicationDetails() { Work Note - {currentUser && ['DD Admin', 'Super Admin', 'DD AM', 'ASM'].includes(currentUser.role) && ( + {currentUser && ['DD Admin', 'Super Admin', 'DD AM', 'ASM'].includes(currentUser.role) && + !([1, 2, 3].every(level => interviews.some(i => i.level === level))) && (