Fix: Restore missing user edits by refining the data merge logic.

- Migrated 126 manual edits to 'edited' status.
- Updated App.tsx to merge rows with 'edited' or 'synced' status.
- Protected manual edits from being overwritten by automated Dropbox syncs.
This commit is contained in:
Christian Vidal Wolf
2026-04-23 15:04:43 +02:00
parent 360baa7f10
commit 397023b00d
3 changed files with 15 additions and 11 deletions
+12 -8
View File
@@ -40,29 +40,33 @@ export default async function handler(req, res) {
} }
const articleNoIdx = 0; const articleNoIdx = 0;
// Fetch IDs of products that have been manually edited so we don't overwrite them
const { data: protectedProducts } = await supabase
.from('products')
.select('product_id')
.or('status.eq.edited,status.eq.pending');
const protectedIds = new Set((protectedProducts || []).map(p => p.product_id));
const productsToUpsert = []; const productsToUpsert = [];
for (const row of rows) { for (const row of rows) {
const productId = String(row[articleNoIdx]); const productId = String(row[articleNoIdx]);
if (productId && productId.trim() !== '') { if (productId && productId.trim() !== '' && !protectedIds.has(productId)) {
productsToUpsert.push({ productsToUpsert.push({
product_id: productId, product_id: productId,
data: row, data: row,
status: 'synced', status: 'excel',
updated_at: new Date().toISOString() updated_at: new Date().toISOString()
}); });
} }
} }
console.log('Upserting', productsToUpsert.length, 'products to Supabase...'); console.log('Upserting', productsToUpsert.length, 'new/updated products to Supabase...');
// We can now use a normal upsert because we filtered out the manual edits
const { error } = await supabase const { error } = await supabase
.from('products') .from('products')
.upsert(productsToUpsert, { .upsert(productsToUpsert, { onConflict: 'product_id' });
onConflict: 'product_id',
ignoreDuplicates: true // Keep this: will be overwritten by App.tsx logic if there are pending edits
});
if (error) { if (error) {
console.error('Supabase upsert error:', error); console.error('Supabase upsert error:', error);
+2 -2
View File
@@ -166,8 +166,8 @@ export default function App() {
// Start with Dropbox values (default) // Start with Dropbox values (default)
let finalRow = [...row]; let finalRow = [...row];
// Only preserve Supabase values if there's a PENDING edit for this article // Only preserve Supabase values if there's a PENDING or EDITED edit for this article
if (synced && synced.status === 'pending') { if (synced && (synced.status === 'pending' || synced.status === 'edited' || synced.status === 'synced')) {
// Keep the manually edited values from Supabase // Keep the manually edited values from Supabase
editableColumns.forEach(idx => { editableColumns.forEach(idx => {
if (synced.data[idx] !== undefined && synced.data[idx] !== null) { if (synced.data[idx] !== undefined && synced.data[idx] !== null) {
+1 -1
View File
@@ -77,7 +77,7 @@ export async function saveRowToSupabase(articleNo: string, rowData: ExcelRow): P
body: JSON.stringify({ body: JSON.stringify({
product_id: articleNo, product_id: articleNo,
data: rowData, data: rowData,
status: 'synced', status: 'edited',
updated_at: new Date().toISOString() updated_at: new Date().toISOString()
}) })
} }