diff --git a/src/components/upload/PhotoManagementDialog.tsx b/src/components/upload/PhotoManagementDialog.tsx index fbae7ad9..497f96cc 100644 --- a/src/components/upload/PhotoManagementDialog.tsx +++ b/src/components/upload/PhotoManagementDialog.tsx @@ -104,6 +104,27 @@ export function PhotoManagementDialog({ const { data: { user } } = await supabase.auth.getUser(); if (!user) throw new Error('Not authenticated'); + // Fetch entity name from database based on entity type + let entityName = 'Unknown'; + + try { + if (entityType === 'park') { + const { data } = await supabase.from('parks').select('name').eq('id', entityId).single(); + if (data?.name) entityName = data.name; + } else if (entityType === 'ride') { + const { data } = await supabase.from('rides').select('name').eq('id', entityId).single(); + if (data?.name) entityName = data.name; + } else if (entityType === 'ride_model') { + const { data } = await supabase.from('ride_models').select('name').eq('id', entityId).single(); + if (data?.name) entityName = data.name; + } else if (['manufacturer', 'operator', 'designer', 'property_owner'].includes(entityType)) { + const { data } = await supabase.from('companies').select('name').eq('id', entityId).single(); + if (data?.name) entityName = data.name; + } + } catch (err) { + console.error('Error fetching entity name:', err); + } + // Create content submission const { data: submission, error: submissionError } = await supabase .from('content_submissions') @@ -120,7 +141,7 @@ export function PhotoManagementDialog({ if (submissionError) throw submissionError; - // Create submission item + // Create submission item with all necessary data const { error: itemError } = await supabase .from('submission_items') .insert({ @@ -130,9 +151,11 @@ export function PhotoManagementDialog({ photo_id: photoToDelete.id, entity_type: entityType, entity_id: entityId, + entity_name: entityName, cloudflare_image_url: photoToDelete.cloudflare_image_url, + title: photoToDelete.title, caption: photoToDelete.caption, - reason: deleteReason + deletion_reason: deleteReason }, status: 'pending' }); diff --git a/src/lib/submissionChangeDetection.ts b/src/lib/submissionChangeDetection.ts index 350a4d4a..8c225d80 100644 --- a/src/lib/submissionChangeDetection.ts +++ b/src/lib/submissionChangeDetection.ts @@ -97,12 +97,12 @@ async function detectPhotoChanges(submissionId: string): Promise changes.push({ type: 'deleted', photo: { - url: itemData.photo_url || itemData.cloudflare_image_url || '', + url: itemData.cloudflare_image_url || itemData.photo_url || '', title: itemData.title, caption: itemData.caption, entity_type: itemData.entity_type, entity_name: itemData.entity_name, - deletion_reason: itemData.deletion_reason + deletion_reason: itemData.deletion_reason || itemData.reason } }); } else if (item.item_type === 'photo_edit' && itemData && originalData) { @@ -256,8 +256,39 @@ export async function detectChanges( detectImageChanges(originalData, itemData, imageChanges); } - // Get entity name - const entityName = itemData.name || originalData?.name || 'Unknown'; + // Get entity name - handle different item types + let entityName = 'Unknown'; + if (item.item_type === 'photo_delete' || item.item_type === 'photo_edit' || item.item_type === 'photo') { + // For photo operations, prioritize entity_name from item_data + entityName = itemData.entity_name || itemData.caption || itemData.title || 'Photo'; + + // If we have entity_type and entity_id but no entity_name, fetch it from DB + if (!itemData.entity_name && itemData.entity_type && itemData.entity_id) { + try { + const entityType = itemData.entity_type; + const entityId = itemData.entity_id; + + if (entityType === 'park') { + const { data } = await supabase.from('parks').select('name').eq('id', entityId).single(); + if (data?.name) entityName = `${data.name} (${formatEntityType(entityType)})`; + } else if (entityType === 'ride') { + const { data } = await supabase.from('rides').select('name').eq('id', entityId).single(); + if (data?.name) entityName = `${data.name} (${formatEntityType(entityType)})`; + } else if (entityType === 'ride_model') { + const { data } = await supabase.from('ride_models').select('name').eq('id', entityId).single(); + if (data?.name) entityName = `${data.name} (${formatEntityType(entityType)})`; + } else if (['manufacturer', 'operator', 'designer', 'property_owner'].includes(entityType)) { + const { data } = await supabase.from('companies').select('name').eq('id', entityId).single(); + if (data?.name) entityName = `${data.name} (${formatEntityType(entityType)})`; + } + } catch (err) { + console.error('Error fetching entity name:', err); + } + } + } else { + // For regular entities, use name field + entityName = itemData.name || originalData?.name || 'Unknown'; + } // Detect photo changes if submissionId provided const photoChanges = submissionId ? await detectPhotoChanges(submissionId) : []; @@ -413,6 +444,32 @@ export function formatFieldName(field: string): string { .trim(); } +/** + * Get table name for entity type + */ +function getTableNameForEntityType(entityType: string): string | null { + const mapping: Record = { + 'park': 'parks', + 'ride': 'rides', + 'manufacturer': 'companies', + 'operator': 'companies', + 'designer': 'companies', + 'property_owner': 'companies', + 'ride_model': 'ride_models' + }; + return mapping[entityType] || null; +} + +/** + * Format entity type for display + */ +function formatEntityType(entityType: string): string { + return entityType + .split('_') + .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) + .join(' '); +} + /** * Format field value for display */