feat: add Cosmetic Items tab with inline CPNP No. editing

New sidebar tab for cosmetic product lines (INKEE, BATH FUN, TOP FASHION,
SENSES, BODYNESS) filtered to items with empty CPNP No. Column filters on
Item Available allow toggling zero/non-zero stock. CPNP_NO added as virtual
column (index 107) stored in Supabase.

Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
Christian Vidal Wolf
2026-05-08 13:28:39 +02:00
co-authored by claude-flow
parent d9b9664a9d
commit 1556aea081
4 changed files with 376 additions and 6 deletions
+14 -2
View File
@@ -20,6 +20,7 @@ import { HistoryView } from './components/HistoryView';
import { UndoToast } from './components/UndoToast';
import { PendingValidationView } from './components/PendingValidationView';
import { MissingDataView } from './components/MissingDataView';
import { CosmeticItemsView } from './components/CosmeticItemsView';
const FORCED_ZERO_STOCK_SKUS = new Set([
'11631VC', '1237VC', '1238VC', '1652VC', '1653VC', '1684VC', '1688VC', '1717VC',
@@ -60,7 +61,7 @@ export default function App() {
hasUnsavedChanges: false,
asinColumnIndex: null
});
const [activeModule, setActiveModule] = useState<'descriptions' | 'article_details' | 'matrix' | 'dimensions' | 'pricing' | 'pending_validation' | 'history' | 'missing_data'>('descriptions');
const [activeModule, setActiveModule] = useState<'descriptions' | 'article_details' | 'matrix' | 'dimensions' | 'pricing' | 'pending_validation' | 'history' | 'missing_data' | 'cosmetic_items'>('descriptions');
const [undoHistory, setUndoHistory] = useState<{ data: ExcelRow[], message: string }[]>([]);
const [editingRowIndex, setEditingRowIndex] = useState<number | null>(null);
const [isLoadingDefault, setIsLoadingDefault] = useState(true);
@@ -179,6 +180,7 @@ export default function App() {
[COLUMNS.ITEM_TO_LOGISTIC]: 'Item to Logistic',
[COLUMNS.ANNA_CHECK]: 'Anna Check',
[COLUMNS.ANNA_NOTE]: 'Anna Note',
[COLUMNS.CPNP_NO]: 'CPNP No.',
};
Object.entries(VIRTUAL_COLS).forEach(([idxStr, name]) => {
const idx = Number(idxStr);
@@ -204,7 +206,8 @@ export default function App() {
resolvedCols.VALIDATED_CHECK,
resolvedCols.VALIDATED_NOTE,
resolvedCols.PRODUCT_TYPE,
resolvedCols.ITEM_TO_LOGISTIC
resolvedCols.ITEM_TO_LOGISTIC,
resolvedCols.CPNP_NO
]);
headers.forEach((h: any, i: number) => {
@@ -787,6 +790,15 @@ const articleNoIdx = resolvedCols.ARTICLE_NO;
onCaptureState={captureState}
/>
)}
{activeModule === 'cosmetic_items' && (
<CosmeticItemsView
data={appState.data}
headers={appState.headers}
onSaveRow={handleSaveRow}
onCaptureState={captureState}
rowStatuses={rowStatuses}
/>
)}
{activeModule === 'history' && (
<HistoryView
headers={appState.headers}