diff --git a/inventory/src/lib/react-spreadsheet-import/src/steps/MatchColumnsStep/MatchColumnsStep.tsx b/inventory/src/lib/react-spreadsheet-import/src/steps/MatchColumnsStep/MatchColumnsStep.tsx index f0d13d6..8252bf3 100644 --- a/inventory/src/lib/react-spreadsheet-import/src/steps/MatchColumnsStep/MatchColumnsStep.tsx +++ b/inventory/src/lib/react-spreadsheet-import/src/steps/MatchColumnsStep/MatchColumnsStep.tsx @@ -143,7 +143,10 @@ const ColumnActions = memo(({ className="h-7 px-2" > {isExpanded ? - "Hide values" : + <> + + Hide values + > : <> Map values @@ -630,27 +633,21 @@ export const MatchColumnsStep = React.memo(({ ) const [globalSelections, setGlobalSelections] = useState(initialGlobalSelections || {}) const [showAllColumns, setShowAllColumns] = useState(true) - const [expandedValueMappings, setExpandedValueMappings] = useState([]) + const [expandedValues, setExpandedValues] = useState([]) + const [userCollapsedColumns, setUserCollapsedColumns] = useState([]) - // Use debounce for expensive operations - const [expandedValues, setExpandedValues] = useState([]); - - useEffect(() => { - const timeoutId = setTimeout(() => { - setExpandedValueMappings(expandedValues); - }, 50); - - return () => clearTimeout(timeoutId); - }, [expandedValues]); - - // Toggle with immediate visual feedback but debounced actual state change + // Toggle with immediate visual feedback const toggleValueMappingOptimized = useCallback((columnIndex: number) => { - setExpandedValues(prev => - prev.includes(columnIndex) - ? prev.filter(idx => idx !== columnIndex) - : [...prev, columnIndex] - ); - }, []); + if (expandedValues.includes(columnIndex)) { + // User is collapsing this column - add to userCollapsedColumns + setUserCollapsedColumns(prev => [...prev, columnIndex]); + setExpandedValues(prev => prev.filter(idx => idx !== columnIndex)); + } else { + // User is expanding this column - remove from userCollapsedColumns + setUserCollapsedColumns(prev => prev.filter(idx => idx !== columnIndex)); + setExpandedValues(prev => [...prev, columnIndex]); + } + }, [expandedValues]); // Check if column is expandable (has value mappings) const isExpandable = useCallback((column: Column) => { @@ -798,9 +795,6 @@ export const MatchColumnsStep = React.memo(({ const stableMappedProductLines = useMemo(() => mappedProductLines || [], [mappedProductLines]); const stableMappedSublines = useMemo(() => mappedSublines || [], [mappedSublines]); - // Type guard for suppliers and companies - - // Check if a field is covered by global selections const isFieldCoveredByGlobalSelections = useCallback((key: string) => { return (key === 'supplier' && !!globalSelections.supplier) || @@ -1268,15 +1262,18 @@ export const MatchColumnsStep = React.memo(({ // Automatically expand columns with unmapped values - use layoutEffect to avoid flashing useLayoutEffect(() => { - // Only add new columns that need to be expanded without removing existing ones - const columnsToExpand = columnsWithUnmappedValues - .filter(column => !expandedValueMappings.includes(column.index)) - .map(column => column.index); + // Track the current unmapped column indexes + const currentUnmappedIndexes = columnsWithUnmappedValues.map(col => col.index); - if (columnsToExpand.length > 0) { - setExpandedValueMappings(prev => [...prev, ...columnsToExpand]); + // Find columns that are newly unmapped (weren't in expandedValues or userCollapsedColumns) + const newlyUnmappedColumns = currentUnmappedIndexes.filter(index => + !expandedValues.includes(index) && !userCollapsedColumns.includes(index) + ); + + if (newlyUnmappedColumns.length > 0) { + setExpandedValues(prev => [...prev, ...newlyUnmappedColumns]); } - }, [columnsWithUnmappedValues, expandedValueMappings]); + }, [columnsWithUnmappedValues, expandedValues, userCollapsedColumns]); // Create a stable mapping of column index to change handlers const columnChangeHandlers = useMemo(() => { @@ -1351,7 +1348,7 @@ export const MatchColumnsStep = React.memo(({ - Imported Spreadsheet Column + Imported Column Sample Data Map To Field @@ -1361,7 +1358,7 @@ export const MatchColumnsStep = React.memo(({ {/* Always show columns with unmapped values */} {columnsWithUnmappedValues.map((column) => { - const isExpanded = expandedValueMappings.includes(column.index); + const isExpanded = expandedValues.includes(column.index); return ( @@ -1381,7 +1378,7 @@ export const MatchColumnsStep = React.memo(({ column={column} onIgnore={onIgnore} toggleValueMapping={toggleValueMappingOptimized} - isExpanded={expandedValueMappings.includes(column.index)} + isExpanded={isExpanded} canExpandValues={isExpandable(column)} /> @@ -1401,7 +1398,7 @@ export const MatchColumnsStep = React.memo(({ {/* Always show unmapped columns */} {unmatchedColumns.map((column) => ( - + {column.header} {renderSamplePreview(column.index)} @@ -1417,7 +1414,7 @@ export const MatchColumnsStep = React.memo(({ column={column} onIgnore={onIgnore} toggleValueMapping={toggleValueMappingOptimized} - isExpanded={expandedValueMappings.includes(column.index)} + isExpanded={expandedValues.includes(column.index)} canExpandValues={isExpandable(column)} /> @@ -1426,12 +1423,12 @@ export const MatchColumnsStep = React.memo(({ {/* Show matched columns if showAllColumns is true */} {showAllColumns && matchedColumns.map((column) => { - const isExpanded = expandedValueMappings.includes(column.index); + const isExpanded = expandedValues.includes(column.index); const canExpandValues = isExpandable(column); return ( - + {column.header} {renderSamplePreview(column.index)} @@ -1447,7 +1444,7 @@ export const MatchColumnsStep = React.memo(({ column={column} onIgnore={onIgnore} toggleValueMapping={toggleValueMappingOptimized} - isExpanded={expandedValueMappings.includes(column.index)} + isExpanded={isExpanded} canExpandValues={canExpandValues} /> @@ -1467,7 +1464,7 @@ export const MatchColumnsStep = React.memo(({ {/* Show ignored columns if showAllColumns is true */} {showAllColumns && ignoredColumns.map((column) => ( - + {column.header} {renderSamplePreview(column.index)} @@ -1476,7 +1473,7 @@ export const MatchColumnsStep = React.memo(({ - Ignored + Ignored ({ matchedColumns, ignoredColumns, showAllColumns, - expandedValueMappings, + expandedValues, renderSamplePreview, renderFieldSelector, renderValueMappings, @@ -1535,7 +1532,7 @@ export const MatchColumnsStep = React.memo(({ {/* Left panel - Global selections & Required fields */} - + Global Settings These values will be applied to all imported items @@ -1594,8 +1591,6 @@ export const MatchColumnsStep = React.memo(({ - - {/* Required Fields Section - Updated to show source column */} @@ -1645,9 +1640,6 @@ export const MatchColumnsStep = React.memo(({ Map Spreadsheet Columns - 0 ? "destructive" : "outline"}> - {unmatchedRequiredFields.length} required missing - {columnsWithUnmappedValues.length > 0 && ( {columnsWithUnmappedValues.length} with unmapped values diff --git a/inventory/src/lib/react-spreadsheet-import/src/steps/MatchColumnsStep/components/ColumnGrid.tsx b/inventory/src/lib/react-spreadsheet-import/src/steps/MatchColumnsStep/components/ColumnGrid.tsx deleted file mode 100644 index 6ea072b..0000000 --- a/inventory/src/lib/react-spreadsheet-import/src/steps/MatchColumnsStep/components/ColumnGrid.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import type React from "react" -import type { Column, Columns } from "../MatchColumnsStep" -import { ColumnType } from "../MatchColumnsStep" -import { useRsi } from "../../../hooks/useRsi" -import { ScrollArea, ScrollBar } from "@/components/ui/scroll-area" - -type ColumnGridProps = { - columns: Columns - userColumn: (column: Column) => React.ReactNode - templateColumn: (column: Column) => React.ReactNode - onContinue: (val: Record[]) => void - onBack?: () => void - isLoading: boolean -} - -export const ColumnGrid = ({ - columns, - userColumn, - templateColumn, -}: ColumnGridProps) => { - const { translations } = useRsi() - const normalColumnWidth = 250 - const ignoredColumnWidth = 48 // 12 units = 3rem = 48px - const gap = 16 - const totalWidth = columns.reduce((acc, col) => - acc + (col.type === ColumnType.ignored ? ignoredColumnWidth : normalColumnWidth) + gap, - -gap // Subtract one gap since we need gaps between columns only - ) - - return ( - - - - {translations.matchColumnsStep.title} - - - - - {/* Your table section */} - - - {translations.matchColumnsStep.userTableTitle} - - - - `${col.type === ColumnType.ignored ? ignoredColumnWidth : normalColumnWidth}px` - ).join(" "), - }} - > - {columns.map((column, index) => ( - - {userColumn(column)} - - ))} - - - - - - {/* Will become section */} - - - {translations.matchColumnsStep.templateTitle} - - - `${col.type === ColumnType.ignored ? ignoredColumnWidth : normalColumnWidth}px` - ).join(" "), - }} - > - {columns.map((column, index) => ( - - {templateColumn(column)} - - ))} - - - - - - - ) -} diff --git a/inventory/src/lib/react-spreadsheet-import/src/steps/MatchColumnsStep/components/UserTableColumn.tsx b/inventory/src/lib/react-spreadsheet-import/src/steps/MatchColumnsStep/components/UserTableColumn.tsx deleted file mode 100644 index b1236ae..0000000 --- a/inventory/src/lib/react-spreadsheet-import/src/steps/MatchColumnsStep/components/UserTableColumn.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import { Button } from "@/components/ui/button" -import { Card, CardContent, CardHeader } from "@/components/ui/card" -import { X, RotateCcw } from "lucide-react" -import type { Column } from "../MatchColumnsStep" -import { ColumnType } from "../MatchColumnsStep" -import type { RawData } from "../../../types" - -type UserTableColumnProps = { - column: Column - entries: RawData - onIgnore: (index: number) => void - onRevertIgnore: (index: number) => void -} - -export const UserTableColumn = (props: UserTableColumnProps) => { - const { - column: { header, index, type }, - entries, - onIgnore, - onRevertIgnore, - } = props - const isIgnored = type === ColumnType.ignored - - if (isIgnored) { - return ( - - - onRevertIgnore(index)} - className="h-8 w-8" - > - - - - {header} - - - - ) - } - - return ( - - - - {header} - - onIgnore(index)} - className="h-8 w-8" - > - - - - - {entries.map((entry, i) => ( - - {entry} - - ))} - - - ) -} diff --git a/inventory/src/lib/react-spreadsheet-import/src/steps/SelectHeaderStep/SelectHeaderStep.tsx b/inventory/src/lib/react-spreadsheet-import/src/steps/SelectHeaderStep/SelectHeaderStep.tsx index a5e6daa..dfce26b 100644 --- a/inventory/src/lib/react-spreadsheet-import/src/steps/SelectHeaderStep/SelectHeaderStep.tsx +++ b/inventory/src/lib/react-spreadsheet-import/src/steps/SelectHeaderStep/SelectHeaderStep.tsx @@ -159,7 +159,7 @@ export const SelectHeaderStep = ({ data, onContinue, onBack }: SelectHeaderProps diff --git a/inventory/src/lib/react-spreadsheet-import/src/steps/SelectHeaderStep/components/SelectHeaderTable.tsx b/inventory/src/lib/react-spreadsheet-import/src/steps/SelectHeaderStep/components/SelectHeaderTable.tsx index dd6a2fe..0104576 100644 --- a/inventory/src/lib/react-spreadsheet-import/src/steps/SelectHeaderStep/components/SelectHeaderTable.tsx +++ b/inventory/src/lib/react-spreadsheet-import/src/steps/SelectHeaderStep/components/SelectHeaderTable.tsx @@ -70,7 +70,7 @@ export const SelectHeaderTable = ({ data, selectedRows, setSelectedRows }: Props key={rowIndex} className={cn( "grid", - selectedRowIndex === rowIndex && "bg-muted", + selectedRowIndex === rowIndex && "bg-muted font-bold", "group hover:bg-muted/50" )} style={{ gridTemplateColumns }} diff --git a/inventory/src/lib/react-spreadsheet-import/src/steps/ValidationStepNew/components/ValidationContainer.tsx b/inventory/src/lib/react-spreadsheet-import/src/steps/ValidationStepNew/components/ValidationContainer.tsx index b158483..516f290 100644 --- a/inventory/src/lib/react-spreadsheet-import/src/steps/ValidationStepNew/components/ValidationContainer.tsx +++ b/inventory/src/lib/react-spreadsheet-import/src/steps/ValidationStepNew/components/ValidationContainer.tsx @@ -54,9 +54,7 @@ const ValidationContainer = ({ loadTemplates, setData, fields, - isLoadingTemplates, - rowValidationStatus - } = validationState + isLoadingTemplates } = validationState // Add state for tracking product lines and sublines per row const [rowProductLines, setRowProductLines] = useState>({}); @@ -133,7 +131,7 @@ const ValidationContainer = ({ // Clear loading state setIsLoadingLines(prev => ({ ...prev, [rowIndex]: false })); } - }, []); + }, []); // Function to fetch sublines for a specific line - memoized const fetchSublines = useCallback(async (rowIndex: string | number, lineId: string) => {
These values will be applied to all imported items @@ -1594,8 +1591,6 @@ export const MatchColumnsStep = React.memo(({
- {header} -
- {entry} -