From 71a4897f28368a1886b303e11e3871d30c4afe0c Mon Sep 17 00:00:00 2001 From: Christian Vidal Wolf Date: Wed, 8 Apr 2026 19:32:28 +0200 Subject: [PATCH] fix: remove rowStatuses prop from ProductDescriptions to fix app crash The rowStatuses prop was merged from feature branch but is incompatible with main. Removed it and restored original tbody structure while keeping the Present/Missing filter fix. Co-authored-by: Qwen-Coder --- src/App.tsx | 59 +++++++++++---------- src/components/ProductDescriptions.tsx | 72 +++++++++++--------------- 2 files changed, 60 insertions(+), 71 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 1928d34..1414d57 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -81,22 +81,22 @@ export default function App() { const articleNo = String(row[articleNoIdx]); const synced = syncedData[articleNo]; const finalRow = synced ? synced.data : row; - + // Sync status_check if (synced && synced.status === 'pending') { setRowStatuses(prev => ({ ...prev, [articleNo]: 'pending' })); } - + // Format numeric/price fields to 2 decimal places return finalRow.map((val, idx) => { if (val === undefined || val === null || val === '') return val; const header = (rawHeaders[idx] || '').toLowerCase(); - + // Skip Article No, Barcodes, and other code-like fields // But allow if it's a weight/measure column (e.g. Article NW (kg)) - if ((header.includes('id') || header.includes('no') || header.includes('code') || - header.includes('art.') || header.includes('barcode') || header.includes('article')) && - !(header.includes('nw') || header.includes('gw') || header.includes('weight') || header.includes('kg'))) { + if ((header.includes('id') || header.includes('no') || header.includes('code') || + header.includes('art.') || header.includes('barcode') || header.includes('article')) && + !(header.includes('nw') || header.includes('gw') || header.includes('weight') || header.includes('kg'))) { return val; } @@ -106,7 +106,7 @@ export default function App() { if (typeof val === 'number') { return Number(val.toFixed(2)); } - + if (typeof val === 'string') { const normalized = val.trim().replace(',', '.'); const num = parseFloat(normalized); @@ -156,18 +156,18 @@ export default function App() { const wsname = wb.SheetNames[0]; const ws = wb.Sheets[wsname]; const data = XLSX.utils.sheet_to_json(ws, { header: 1 }); - + if (data.length > 0) { const rawHeaders = data[0]; const rawRows = data.slice(1); - + const processedRows = rawRows.map(row => { return row.map((val, idx) => { if (val === undefined || val === null || val === '') return val; const header = (rawHeaders[idx] || '').toLowerCase(); - - if (header.includes('id') || header.includes('no') || header.includes('code') || - header.includes('art.') || header.includes('barcode') || header.includes('article')) { + + if (header.includes('id') || header.includes('no') || header.includes('code') || + header.includes('art.') || header.includes('barcode') || header.includes('article')) { // But allow if it's a weight/measure column (e.g. Article NW (kg)) if (!(header.includes('nw') || header.includes('gw') || header.includes('weight') || header.includes('kg'))) { return val; @@ -190,7 +190,7 @@ export default function App() { if (typeof val === 'number') { return Number(val.toFixed(2)); } - + if (typeof val === 'string') { const normalized = val.trim().replace(',', '.'); const num = parseFloat(normalized); @@ -217,15 +217,15 @@ export default function App() { const handleExport = () => { if (appState.data.length === 0) return; - + const wsData = [appState.headers, ...appState.data]; const ws = XLSX.utils.aoa_to_sheet(wsData); const wb = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(wb, ws, 'Products'); - + const dateStr = new Date().toISOString().split('T')[0]; XLSX.writeFile(wb, `CRAZE_Products_Updated_${dateStr}.xlsx`); - + // 3. Post-export: Reset pending statuses in Supabase console.log('Resetting pending statuses in Supabase...'); resetAllPendingRows().then(success => { @@ -254,12 +254,12 @@ export default function App() { // 2. Persist to Supabase const articleNo = String(updatedRow[COLUMNS.ARTICLE_NO]); console.log(`Saving article ${articleNo} to Supabase...`); - + // Update local status to pending setRowStatuses(prev => ({ ...prev, [articleNo]: 'pending' })); - + const success = await saveRowToSupabase(articleNo, updatedRow); - + if (success) { console.log(`Successfully saved ${articleNo}`); setAppState(prev => ({ ...prev, hasUnsavedChanges: false })); @@ -283,7 +283,7 @@ export default function App() { const handleUndo = () => { if (undoHistory.length === 0) return; - + const [lastAction, ...remainingHistory] = undoHistory; setAppState(prev => ({ ...prev, @@ -366,10 +366,9 @@ export default function App() { ) : ( <> {activeModule === 'descriptions' && ( - setEditingRowIndex(index)} - rowStatuses={rowStatuses} + setEditingRowIndex(index)} /> )} {activeModule === 'matrix' && ( @@ -409,15 +408,15 @@ export default function App() { - setUndoHistory([])} + setUndoHistory([])} /> {editingRowIndex !== null && ( - setEditingRowIndex(null)} diff --git a/src/components/ProductDescriptions.tsx b/src/components/ProductDescriptions.tsx index 80ea9cd..114d222 100644 --- a/src/components/ProductDescriptions.tsx +++ b/src/components/ProductDescriptions.tsx @@ -304,47 +304,37 @@ export function ProductDescriptions({ data, onEdit }: ProductDescriptionsProps) - {paginatedData.map(({ row, index }) => { - const isPending = rowStatuses[String(row[COLUMNS.ARTICLE_NO])] === 'pending'; - return ( - - {row[COLUMNS.ARTICLE_NO]} - {row[COLUMNS.ARTICLE_NAME]} - {row[COLUMNS.LINE]} - {row[COLUMNS.LICENSE] || '—'} - - - {row[COLUMNS.CLASSIFICATION] || '—'} - - - - - - - - - - - ); - })} + {paginatedData.map(({ row, index }) => ( + + {row[COLUMNS.ARTICLE_NO]} + {row[COLUMNS.ARTICLE_NAME]} + {row[COLUMNS.LINE]} + {row[COLUMNS.LICENSE] || '—'} + + + {row[COLUMNS.CLASSIFICATION] || '—'} + + + + + + + + + + + ))} {paginatedData.length === 0 && (