fix: include dynamic columns in sticky position/z-index calculation

- Include pricingEditableCols and containerCols in column order for pinned calculation
- Fix z-index stacking so all pinned columns stay visible while scrolling
This commit is contained in:
Christian Vidal Wolf
2026-04-24 13:35:43 +02:00
parent 1c76544e47
commit 43f94b3902
+20 -9
View File
@@ -599,12 +599,15 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
});
};
// Column order for sticky positioning
const columnOrder = ['articleNo', 'articleName', 'line', 'classification', 'productType', 'itemToLogistic', 'unitsOuter', 'outerW', 'outerL', 'outerH'];
// Calculate sticky left position for each pinned column
const getStickyLeft = useMemo(() => {
const pinnedOrder = columnOrder.filter(k => pinnedColumns.has(k));
const baseOrder = ['articleNo', 'articleName', 'line', 'classification', 'productType', 'itemToLogistic', 'unitsOuter', 'outerW', 'outerL', 'outerH'];
const dynamicOrder: string[] = [];
pricingEditableCols.forEach(col => dynamicOrder.push(`prc_${col.index}`));
containerCols.forEach(col => dynamicOrder.push(`con_${col.index}`));
const fullOrder = [...baseOrder, ...dynamicOrder];
const pinnedOrder = fullOrder.filter(k => pinnedColumns.has(k));
return (key: string): number | null => {
if (!pinnedColumns.has(key)) return null;
const idx = pinnedOrder.indexOf(key);
@@ -612,23 +615,31 @@ export function PricingView({ data, headers, onSaveRow, onCaptureState, onEdit,
let left = 0;
for (let i = 0; i < idx; i++) {
const k = pinnedOrder[i];
left += columnWidths[k] || 100;
const width = k.startsWith('prc_') || k.startsWith('con_')
? (columnWidths[k] ?? 100)
: (columnWidths[k] || 100);
left += width;
}
return left;
};
}, [pinnedColumns, columnOrder, columnWidths]);
}, [pinnedColumns, pricingEditableCols, containerCols, columnWidths]);
// Calculate z-index for sticky columns (so they stack correctly)
const getStickyRank = useMemo(() => {
const pinnedOrder = columnOrder.filter(k => pinnedColumns.has(k));
const baseOrder = ['articleNo', 'articleName', 'line', 'classification', 'productType', 'itemToLogistic', 'unitsOuter', 'outerW', 'outerL', 'outerH'];
const dynamicOrder: string[] = [];
pricingEditableCols.forEach(col => dynamicOrder.push(`prc_${col.index}`));
containerCols.forEach(col => dynamicOrder.push(`con_${col.index}`));
const fullOrder = [...baseOrder, ...dynamicOrder];
const pinnedOrder = fullOrder.filter(k => pinnedColumns.has(k));
return (key: string): number | null => {
if (!pinnedColumns.has(key)) return null;
const idx = pinnedOrder.indexOf(key);
if (idx === -1) return null;
// Higher rank = on top
return pinnedOrder.length - idx + 10;
};
}, [pinnedColumns, columnOrder]);
}, [pinnedColumns, pricingEditableCols, containerCols]);
const isPinned = (key: string) => pinnedColumns.has(key);