{"version":3,"file":"VirtualizedDataTable.mjs","sources":["../../../../src/lib/ui/data/VirtualizedDataTable.tsx"],"sourcesContent":["/**\n * @file Virtualized Data Table Component\n * @description High-performance data table with windowed rendering for large datasets\n * Uses react-window for virtualization - only renders visible rows\n *\n * @example\n * // For tables with 100+ rows, use VirtualizedDataTable instead of DataTable\n * <VirtualizedDataTable\n *   data={largeDataset}\n *   columns={columns}\n *   rowKey=\"id\"\n *   height={600}\n *   rowHeight={50}\n * />\n */\n\nimport React, {\n  memo,\n  useMemo,\n  useCallback,\n  useId,\n  useState,\n  useRef,\n  useEffect,\n  type CSSProperties,\n  type ReactNode,\n} from 'react';\nimport {\n  FixedSizeList as List,\n  type ListChildComponentProps,\n  type FixedSizeList,\n} from 'react-window';\n\n/**\n * Column definition for virtualized table\n */\nexport interface VirtualizedColumn<T> {\n  /** Unique column key */\n  key: string;\n\n  /** Column header */\n  header: string | ReactNode;\n\n  /** Data accessor */\n  accessor: keyof T | ((row: T) => ReactNode);\n\n  /** Column width as percentage or fixed px */\n  width?: string | number;\n\n  /** Min width */\n  minWidth?: number;\n\n  /** Cell alignment */\n  align?: 'left' | 'center' | 'right';\n\n  /** Custom cell renderer */\n  cell?: (value: unknown, row: T, index: number) => ReactNode;\n}\n\n/**\n * VirtualizedDataTable props\n */\nexport interface VirtualizedDataTableProps<T> {\n  /** Table data */\n  data: T[];\n\n  /** Column definitions */\n  columns: VirtualizedColumn<T>[];\n\n  /** Unique row key accessor */\n  rowKey: keyof T | ((row: T) => string);\n\n  /** Table height in pixels */\n  height: number;\n\n  /** Row height in pixels */\n  rowHeight?: number;\n\n  /** Header height in pixels */\n  headerHeight?: number;\n\n  /** Loading state */\n  isLoading?: boolean;\n\n  /** Empty state message */\n  emptyState?: ReactNode;\n\n  /** Row click handler */\n  onRowClick?: (row: T) => void;\n\n  /** Custom class name */\n  className?: string;\n\n  /** Overscan count - rows to render above/below viewport */\n  overscanCount?: number;\n}\n\n// ============================================================================\n// STATIC STYLES\n// ============================================================================\n\nconst containerStyle: CSSProperties = {\n  border: '1px solid #e5e7eb',\n  borderRadius: '0.5rem',\n  overflow: 'hidden',\n};\n\nconst headerContainerStyle: CSSProperties = {\n  display: 'flex',\n  backgroundColor: '#f9fafb',\n  borderBottom: '1px solid #e5e7eb',\n  fontWeight: '500',\n  fontSize: '0.875rem',\n  color: '#374151',\n};\n\nconst headerCellStyle: CSSProperties = {\n  padding: '0.75rem 1rem',\n  overflow: 'hidden',\n  textOverflow: 'ellipsis',\n  whiteSpace: 'nowrap',\n};\n\nconst rowStyle: CSSProperties = {\n  display: 'flex',\n  borderBottom: '1px solid #e5e7eb',\n  fontSize: '0.875rem',\n  alignItems: 'center',\n};\n\nconst cellStyle: CSSProperties = {\n  padding: '0.75rem 1rem',\n  overflow: 'hidden',\n  textOverflow: 'ellipsis',\n  whiteSpace: 'nowrap',\n};\n\nconst loadingContainerStyle: CSSProperties = {\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  color: '#6b7280',\n};\n\nconst emptyContainerStyle: CSSProperties = {\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  color: '#6b7280',\n  padding: '2rem',\n};\n\n// Screen reader only style for keyboard help text\nconst srOnlyStyle: CSSProperties = {\n  position: 'absolute',\n  width: '1px',\n  height: '1px',\n  padding: 0,\n  margin: '-1px',\n  overflow: 'hidden',\n  clip: 'rect(0, 0, 0, 0)',\n  whiteSpace: 'nowrap',\n  border: 0,\n};\n\n// Focus indicator styles for keyboard navigation\n// const focusRowStyle: CSSProperties = {\n//   outline: '2px solid #3b82f6',\n//   outlineOffset: '-2px',\n//   backgroundColor: '#eff6ff',\n// };\n\n// CSS for keyboard focus styles\nconst keyboardFocusStyles = `\n  .virtualized-row:focus {\n    outline: 2px solid #3b82f6;\n    outline-offset: -2px;\n    background-color: #eff6ff;\n  }\n\n  .virtualized-row:focus:not(:focus-visible) {\n    outline: none;\n    background-color: inherit;\n  }\n\n  .virtualized-row:focus-visible {\n    outline: 2px solid #3b82f6;\n    outline-offset: -2px;\n    background-color: #eff6ff;\n  }\n`;\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Get cell value from row\n */\nfunction getCellValue<T>(row: T, accessor: VirtualizedColumn<T>['accessor']): unknown {\n  if (typeof accessor === 'function') {\n    return accessor(row);\n  }\n  return row[accessor];\n}\n\n/**\n * Get row key\n */\nfunction getRowKey<T>(row: T, rowKey: VirtualizedDataTableProps<T>['rowKey']): string {\n  if (typeof rowKey === 'function') {\n    return rowKey(row);\n  }\n  return String(row[rowKey]);\n}\n\n// ============================================================================\n// ROW RENDERER\n// ============================================================================\n\ninterface RowData<T> {\n  data: T[];\n  columns: VirtualizedColumn<T>[];\n  rowKey: VirtualizedDataTableProps<T>['rowKey'];\n  onRowClick?: (row: T) => void;\n  focusedIndex: number;\n  onRowFocus: (index: number) => void;\n  onKeyDown: (event: React.KeyboardEvent, index: number) => void;\n}\n\n/**\n * Virtualized row component with keyboard navigation - inner implementation\n */\nfunction VirtualizedRowInner<T>({\n  index,\n  style,\n  data: rowData,\n}: ListChildComponentProps): React.ReactElement {\n  const { data, columns, rowKey, onRowClick, focusedIndex, onRowFocus, onKeyDown } =\n    rowData as RowData<T>;\n  const row = data[index];\n\n  // Hooks must be called unconditionally\n  const rowRef = useRef<HTMLDivElement | null>(null);\n  const isFocused = focusedIndex === index;\n\n  // Focus this row when it becomes the focused index\n  useEffect(() => {\n    if (isFocused && rowRef.current !== null) {\n      rowRef.current.focus();\n    }\n  }, [isFocused]);\n\n  // Calculate row style with hover effect\n  const computedRowStyle = useMemo(\n    (): CSSProperties => ({\n      ...style,\n      ...rowStyle,\n      cursor: onRowClick !== undefined ? 'pointer' : 'default',\n    }),\n    [style, onRowClick]\n  );\n\n  // Handle row click\n  const handleClick = useCallback(() => {\n    if (row !== undefined) {\n      onRowClick?.(row);\n    }\n  }, [onRowClick, row]);\n\n  // Handle focus\n  const handleFocus = useCallback(() => {\n    onRowFocus(index);\n  }, [onRowFocus, index]);\n\n  // Handle keyboard events\n  const handleKeyDown = useCallback(\n    (event: React.KeyboardEvent) => {\n      onKeyDown(event, index);\n\n      // Handle Enter/Space for row activation\n      if ((event.key === 'Enter' || event.key === ' ') && onRowClick !== undefined && row !== undefined) {\n        event.preventDefault();\n        onRowClick(row);\n      }\n    },\n    [onKeyDown, index, onRowClick, row]\n  );\n\n  // Guard against undefined row (should not happen in normal virtualized list usage)\n  if (row === undefined) {\n    return <div style={style} />;\n  }\n\n  const key = getRowKey(row, rowKey);\n\n  return (\n    <div\n      ref={rowRef}\n      key={key}\n      className=\"virtualized-row\"\n      style={computedRowStyle}\n      onClick={handleClick}\n      onFocus={handleFocus}\n      onKeyDown={handleKeyDown}\n      role=\"row\"\n      tabIndex={isFocused ? 0 : -1}\n      aria-rowindex={index + 2} // +2 for header row and 1-based index\n    >\n      {columns.map((column: VirtualizedColumn<T>) => {\n        const value = getCellValue(row, column.accessor);\n        let cellContent: ReactNode;\n        if (column.cell !== undefined) {\n          cellContent = column.cell(value, row, index);\n        } else if (value !== null && value !== undefined) {\n          // Safe stringification: only convert primitives\n          if (\n            typeof value === 'string' ||\n            typeof value === 'number' ||\n            typeof value === 'boolean'\n          ) {\n            cellContent = String(value);\n          } else {\n            cellContent = '';\n          }\n        } else {\n          cellContent = '';\n        }\n\n        return (\n          <div\n            key={column.key}\n            role=\"cell\"\n            style={{\n              ...cellStyle,\n              width: column.width,\n              minWidth: column.minWidth,\n              textAlign: column.align ?? 'left',\n              flex: column.width !== undefined && column.width !== null ? 'none' : 1,\n            }}\n          >\n            {cellContent}\n          </div>\n        );\n      })}\n    </div>\n  );\n}\n\n/**\n * Memoized virtualized row component for performance optimization.\n * Prevents unnecessary re-renders when parent re-renders but row data hasn't changed.\n */\nconst VirtualizedRow = memo(VirtualizedRowInner) as typeof VirtualizedRowInner;\n\n// Add displayName for debugging\n(VirtualizedRow as React.FC).displayName = 'VirtualizedRow';\n\n// ============================================================================\n// VIRTUALIZED DATA TABLE\n// ============================================================================\n\n/**\n * VirtualizedDataTable component\n * Uses windowed rendering for optimal performance with large datasets\n */\nfunction VirtualizedDataTableInner<T>({\n  data,\n  columns,\n  rowKey,\n  height,\n  rowHeight = 48,\n  headerHeight = 48,\n  isLoading = false,\n  emptyState,\n  onRowClick,\n  className,\n  overscanCount = 5,\n}: VirtualizedDataTableProps<T>): React.ReactElement {\n  // State for keyboard navigation - track which row is focused\n  const [focusedIndex, setFocusedIndex] = useState<number>(-1);\n  const listRef = useRef<FixedSizeList | null>(null);\n\n  // Handler for keyboard navigation\n  const handleKeyDown = useCallback(\n    (event: React.KeyboardEvent, currentIndex: number) => {\n      let newIndex = currentIndex;\n\n      switch (event.key) {\n        case 'ArrowDown':\n          event.preventDefault();\n          newIndex = Math.min(currentIndex + 1, data.length - 1);\n          break;\n        case 'ArrowUp':\n          event.preventDefault();\n          newIndex = Math.max(currentIndex - 1, 0);\n          break;\n        case 'Home':\n          event.preventDefault();\n          newIndex = 0;\n          break;\n        case 'End':\n          event.preventDefault();\n          newIndex = data.length - 1;\n          break;\n        default:\n          return;\n      }\n\n      if (newIndex !== currentIndex) {\n        setFocusedIndex(newIndex);\n        // Scroll the row into view\n        listRef.current?.scrollToItem(newIndex, 'smart');\n      }\n    },\n    [data.length]\n  );\n\n  // Handler for row focus\n  const handleRowFocus = useCallback((index: number) => {\n    setFocusedIndex(index);\n  }, []);\n\n  // Memoize item data to prevent unnecessary re-renders\n  const itemData = useMemo(\n    (): RowData<T> => ({\n      data,\n      columns,\n      rowKey,\n      onRowClick,\n      focusedIndex,\n      onRowFocus: handleRowFocus,\n      onKeyDown: handleKeyDown,\n    }),\n    [data, columns, rowKey, onRowClick, focusedIndex, handleRowFocus, handleKeyDown]\n  );\n\n  // Memoize computed heights\n  const listHeight = useMemo(() => height - headerHeight, [height, headerHeight]);\n\n  // Memoize loading/empty container styles with dynamic height\n  const loadingStyle = useMemo(\n    (): CSSProperties => ({\n      ...loadingContainerStyle,\n      height: listHeight,\n    }),\n    [listHeight]\n  );\n\n  const emptyStyle = useMemo(\n    (): CSSProperties => ({\n      ...emptyContainerStyle,\n      height: listHeight,\n    }),\n    [listHeight]\n  );\n\n  // Generate unique ID for keyboard help - use React 18's useId() for SSR-safe IDs\n  const reactId = useId();\n  const keyboardHelpId = `table-keyboard-help${reactId}`;\n\n  return (\n    <div\n      className={className}\n      style={containerStyle}\n      role=\"table\"\n      aria-rowcount={data.length + 1}\n      aria-describedby={keyboardHelpId}\n    >\n      {/* Keyboard focus styles */}\n      <style>{keyboardFocusStyles}</style>\n\n      {/* Screen reader keyboard help */}\n      <div id={keyboardHelpId} style={srOnlyStyle}>\n        Data table with {data.length} rows and {columns.length} columns.\n        {onRowClick && ' Press Enter or Space to activate a row.'}\n        Use arrow keys to navigate between rows. Press Home for first row, End for last row.\n      </div>\n\n      {/* Header */}\n      <div style={{ ...headerContainerStyle, height: headerHeight }} role=\"row\" aria-rowindex={1}>\n        {columns.map((column) => (\n          <div\n            key={column.key}\n            role=\"columnheader\"\n            style={{\n              ...headerCellStyle,\n              width: column.width,\n              minWidth: column.minWidth,\n              textAlign: column.align ?? 'left',\n              flex: column.width !== undefined && column.width !== null ? 'none' : 1,\n            }}\n          >\n            {column.header}\n          </div>\n        ))}\n      </div>\n\n      {/* Loading state */}\n      {isLoading && (\n        <div style={loadingStyle} role=\"status\" aria-label=\"Loading table data\">\n          Loading...\n        </div>\n      )}\n\n      {/* Empty state */}\n      {!isLoading && data.length === 0 && (\n        <div style={emptyStyle}>{emptyState ?? 'No data available'}</div>\n      )}\n\n      {/* Virtualized rows */}\n      {!isLoading && data.length > 0 && (\n        <List\n          ref={listRef}\n          height={listHeight}\n          itemCount={data.length}\n          itemSize={rowHeight}\n          itemData={itemData}\n          overscanCount={overscanCount}\n          width=\"100%\"\n        >\n          {VirtualizedRow}\n        </List>\n      )}\n    </div>\n  );\n}\n\n// Export memoized component\nexport const VirtualizedDataTable = memo(\n  VirtualizedDataTableInner\n) as typeof VirtualizedDataTableInner;\n\n/**\n * Hook to determine if virtualization should be used\n * @param dataLength - Length of the data array\n * @param threshold - Threshold above which virtualization is recommended\n * @returns Whether virtualization should be used\n */\n// eslint-disable-next-line react-refresh/only-export-components\nexport function useVirtualizationRecommended(dataLength: number, threshold: number = 100): boolean {\n  return useMemo(() => dataLength > threshold, [dataLength, threshold]);\n}\n"],"names":["containerStyle","headerContainerStyle","headerCellStyle","rowStyle","cellStyle","loadingContainerStyle","emptyContainerStyle","srOnlyStyle","keyboardFocusStyles","getCellValue","row","accessor","getRowKey","rowKey","VirtualizedRowInner","index","style","rowData","data","columns","onRowClick","focusedIndex","onRowFocus","onKeyDown","rowRef","useRef","isFocused","useEffect","computedRowStyle","useMemo","handleClick","useCallback","handleFocus","handleKeyDown","event","jsx","key","column","value","cellContent","VirtualizedRow","memo","VirtualizedDataTableInner","height","rowHeight","headerHeight","isLoading","emptyState","className","overscanCount","setFocusedIndex","useState","listRef","currentIndex","newIndex","handleRowFocus","itemData","listHeight","loadingStyle","emptyStyle","keyboardHelpId","useId","jsxs","List","VirtualizedDataTable"],"mappings":"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"}