diff --git a/src/components/forms/DynamicForm.tsx b/src/components/forms/DynamicForm.tsx index 9fb473e..aa77edd 100644 --- a/src/components/forms/DynamicForm.tsx +++ b/src/components/forms/DynamicForm.tsx @@ -382,6 +382,17 @@ export function DynamicForm({ client, activityId: initialActivityId, instanceId: finalValues[actionField.id] = clickedActionRef.current; } + for (const f of fields) { + if (f.mandatory && f.data_type === 'grid') { + const val = finalValues[f.id]; + if (!Array.isArray(val) || val.length === 0) { + setSubmitError(`Please add at least one item to ${f.name}`); + setSubmitting(false); + return; + } + } + } + for (const f of fields) { let val = finalValues[f.id]; const isNotesOrRemarks = (f.id || '').toLowerCase().includes('notes') || (f.id || '').toLowerCase().includes('remarks') || (f.name && ((f.name || '').toLowerCase().includes('notes') || (f.name || '').toLowerCase().includes('remarks'))); @@ -639,11 +650,13 @@ export function DynamicForm({ client, activityId: initialActivityId, instanceId: if (type.startsWith('grid')) { return ( []) || []} onChange={(newVal) => handleFieldChange(f.id, newVal)} isActivityPotentialMining={currentActivityId === ORDER_BOOKING.activities.POTENTIAL_MINING.uid} + required={f.mandatory} /> ); } diff --git a/src/components/forms/fields/SmartGridField.tsx b/src/components/forms/fields/SmartGridField.tsx index 86c2372..ef67250 100644 --- a/src/components/forms/fields/SmartGridField.tsx +++ b/src/components/forms/fields/SmartGridField.tsx @@ -11,12 +11,14 @@ export function SmartGridField({ value = [], onChange, isActivityPotentialMining = false, + required = false, }: { label: string; columns: FormScreenField[]; value: Record[]; onChange: (val: Record[]) => void; isActivityPotentialMining?: boolean; + required?: boolean; }) { const isPotentialMining = isActivityPotentialMining; const formRef = useRef(null); @@ -261,7 +263,10 @@ export function SmartGridField({ return (
- {label} + + {label} + {required && *} + {value.length === 0 ? ( No rows added.