diff --git a/src/components/moderation/SubmissionChangesDisplay.tsx b/src/components/moderation/SubmissionChangesDisplay.tsx
index 6e41e2e0..e45b58b4 100644
--- a/src/components/moderation/SubmissionChangesDisplay.tsx
+++ b/src/components/moderation/SubmissionChangesDisplay.tsx
@@ -229,10 +229,15 @@ export function SubmissionChangesDisplay({
{changes.fieldChanges.map((change, idx) => {
- // Highlight fields that were modified (not just added)
- const wasEditedByModerator = change.changeType === 'modified' &&
- item.original_data &&
- item.original_data[change.field] !== undefined;
+ // Highlight fields that were added OR modified by moderator
+ const wasEditedByModerator = item.original_data &&
+ Object.keys(item.original_data).length > 0 &&
+ (
+ // Field was modified from original value
+ (change.changeType === 'modified') ||
+ // Field was added by moderator (not in original submission)
+ (change.changeType === 'added' && item.original_data[change.field] === undefined)
+ );
return (
diff --git a/src/lib/submissionChangeDetection.ts b/src/lib/submissionChangeDetection.ts
index e7d012a5..00ef3a25 100644
--- a/src/lib/submissionChangeDetection.ts
+++ b/src/lib/submissionChangeDetection.ts
@@ -157,21 +157,64 @@ export async function detectChanges(
let hasLocationChange = false;
if (action === 'create') {
- // For creates, all fields are "added" - be more permissive to show all data
- Object.entries(itemData).forEach(([key, value]) => {
- // For creates, exclude only system fields and internal metadata
- const systemFields = ['id', 'created_at', 'updated_at', 'slug', 'images', 'image_assignments'];
- const shouldShow = !systemFields.includes(key) && value !== null && value !== undefined && value !== '';
+ // Check if this creation was edited by a moderator
+ const hasModeratorEdits = originalData && Object.keys(originalData).length > 0;
+
+ if (hasModeratorEdits) {
+ // Compare item_data with original_data to detect moderator changes
+ const allKeys = new Set([
+ ...Object.keys(itemData),
+ ...Object.keys(originalData)
+ ]);
- if (shouldShow) {
- fieldChanges.push({
- field: key,
- oldValue: null,
- newValue: value,
- changeType: 'added',
- });
- }
- });
+ allKeys.forEach(key => {
+ if (!shouldTrackField(key)) return;
+
+ const oldValue = originalData[key];
+ const newValue = itemData[key];
+
+ // Skip if both are empty
+ const oldEmpty = oldValue === null || oldValue === undefined || oldValue === '';
+ const newEmpty = newValue === null || newValue === undefined || newValue === '';
+
+ if (oldEmpty && newEmpty) return;
+
+ // Detect the type of change
+ if (!isEqual(oldValue, newValue)) {
+ fieldChanges.push({
+ field: key,
+ oldValue,
+ newValue,
+ changeType: oldEmpty && !newEmpty ? 'added' : // Moderator added new field
+ newEmpty && !oldEmpty ? 'removed' : // Moderator removed field
+ 'modified', // Moderator changed value
+ });
+ } else if (!newEmpty) {
+ // Field unchanged - show as 'added' (part of original submission)
+ fieldChanges.push({
+ field: key,
+ oldValue: null,
+ newValue,
+ changeType: 'added',
+ });
+ }
+ });
+ } else {
+ // No moderator edits - show all fields as 'added' (original behavior)
+ Object.entries(itemData).forEach(([key, value]) => {
+ const systemFields = ['id', 'created_at', 'updated_at', 'slug', 'images', 'image_assignments'];
+ const shouldShow = !systemFields.includes(key) && value !== null && value !== undefined && value !== '';
+
+ if (shouldShow) {
+ fieldChanges.push({
+ field: key,
+ oldValue: null,
+ newValue: value,
+ changeType: 'added',
+ });
+ }
+ });
+ }
} else if (action === 'edit') {
// Compare each field
const allKeys = new Set([