feat: Implement comprehensive validation system

This commit is contained in:
gpt-engineer-app[bot]
2025-10-09 18:15:38 +00:00
parent 73eb8a60e5
commit f8232e4555
7 changed files with 704 additions and 1 deletions

View File

@@ -28,6 +28,9 @@ import { ConflictResolutionDialog } from './ConflictResolutionDialog';
import { EscalationDialog } from './EscalationDialog';
import { RejectionDialog } from './RejectionDialog';
import { ItemEditDialog } from './ItemEditDialog';
import { ValidationBlockerDialog } from './ValidationBlockerDialog';
import { WarningConfirmDialog } from './WarningConfirmDialog';
import { validateMultipleItems, ValidationResult } from '@/lib/entityValidationSchemas';
interface SubmissionReviewManagerProps {
submissionId: string;
@@ -53,6 +56,10 @@ export function SubmissionReviewManager({
const [editingItem, setEditingItem] = useState<SubmissionItemWithDeps | null>(null);
const [activeTab, setActiveTab] = useState<'items' | 'dependencies'>('items');
const [submissionType, setSubmissionType] = useState<string>('submission');
const [showValidationBlockerDialog, setShowValidationBlockerDialog] = useState(false);
const [showWarningConfirmDialog, setShowWarningConfirmDialog] = useState(false);
const [validationResults, setValidationResults] = useState<Map<string, ValidationResult>>(new Map());
const [userConfirmedWarnings, setUserConfirmedWarnings] = useState(false);
const { toast } = useToast();
const { isAdmin, isSuperuser } = useUserRole();
@@ -147,10 +154,47 @@ export function SubmissionReviewManager({
return;
}
const selectedItems = items.filter(item => selectedItemIds.has(item.id));
setLoading(true);
try {
// Run validation on all selected items
const validationResultsMap = await validateMultipleItems(
selectedItems.map(item => ({
item_type: item.item_type,
item_data: item.item_data,
id: item.id
}))
);
setValidationResults(validationResultsMap);
// Check for blocking errors
const itemsWithBlockingErrors = selectedItems.filter(item => {
const result = validationResultsMap.get(item.id);
return result && result.blockingErrors.length > 0;
});
if (itemsWithBlockingErrors.length > 0 && !userConfirmedWarnings) {
setShowValidationBlockerDialog(true);
setLoading(false);
return; // Block approval
}
// Check for warnings
const itemsWithWarnings = selectedItems.filter(item => {
const result = validationResultsMap.get(item.id);
return result && result.warnings.length > 0;
});
if (itemsWithWarnings.length > 0 && !userConfirmedWarnings) {
setShowWarningConfirmDialog(true);
setLoading(false);
return; // Ask for confirmation
}
// Proceed with approval
const { supabase } = await import('@/integrations/supabase/client');
const selectedItems = items.filter(item => selectedItemIds.has(item.id));
// Call the edge function for backend processing
const { data, error } = await supabase.functions.invoke('process-selective-approval', {