{"version":3,"file":"DataTable.mjs","sources":["../../../../src/lib/ui/data/DataTable.tsx"],"sourcesContent":["/**\n * @file Data Table Component\n * @description Generic data table component for any domain\n * Performance optimized: static styles extracted, dynamic styles memoized\n * Uses theme tokens for consistent styling\n */\n\nimport React, { useMemo, useCallback, memo, type ReactNode, type CSSProperties } from 'react';\nimport { colorTokens } from '../../theme/tokens';\n\n/**\n * Column definition\n */\nexport interface Column<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 */\n  width?: string | number;\n\n  /** Min width */\n  minWidth?: string | number;\n\n  /** Whether column is sortable */\n  sortable?: boolean;\n\n  /** Custom sort function */\n  sortFn?: (a: T, b: T) => 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  /** Whether column is hidden */\n  hidden?: boolean;\n}\n\n/**\n * Sort configuration\n */\nexport interface SortConfig {\n  key: string;\n  direction: 'asc' | 'desc';\n}\n\n/**\n * Pagination configuration\n */\nexport interface PaginationConfig {\n  page: number;\n  pageSize: number;\n  total: number;\n}\n\n/**\n * Data table props\n */\nexport interface DataTableProps<T> {\n  /** Table data */\n  data: T[];\n\n  /** Column definitions */\n  columns: Column<T>[];\n\n  /** Unique row key accessor */\n  rowKey: keyof T | ((row: T) => string);\n\n  /** Loading state */\n  isLoading?: boolean;\n\n  /** Empty state message or component */\n  emptyState?: ReactNode;\n\n  /** Sort configuration */\n  sort?: SortConfig;\n\n  /** Sort change handler */\n  onSortChange?: (sort: SortConfig | undefined) => void;\n\n  /** Pagination configuration */\n  pagination?: PaginationConfig;\n\n  /** Page change handler */\n  onPageChange?: (page: number) => void;\n\n  /** Page size change handler */\n  onPageSizeChange?: (pageSize: number) => void;\n\n  /** Row click handler */\n  onRowClick?: (row: T) => void;\n\n  /** Selected row keys */\n  selectedKeys?: string[];\n\n  /** Selection change handler */\n  onSelectionChange?: (keys: string[]) => void;\n\n  /** Enable row selection */\n  selectable?: boolean;\n\n  /** Sticky header */\n  stickyHeader?: boolean;\n\n  /** Custom class name */\n  className?: string;\n\n  /** Table caption for accessibility */\n  caption?: string;\n}\n\n// ============================================================================\n// STATIC STYLES - Extracted outside component to prevent re-creation\n// ============================================================================\n\nconst tableContainerStyle: CSSProperties = {\n  overflowX: 'auto',\n};\n\nconst tableStyle: CSSProperties = {\n  width: '100%',\n  borderCollapse: 'collapse',\n  fontSize: '0.875rem',\n};\n\nconst captionStyle: 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\nconst headerRowStyle: CSSProperties = {\n  backgroundColor: colorTokens.background.muted,\n  borderBottom: `1px solid ${colorTokens.border.default}`,\n};\n\nconst baseHeaderCellStyle: CSSProperties = {\n  padding: '0.75rem 1rem',\n  fontWeight: '500',\n  color: colorTokens.text.secondary,\n  backgroundColor: colorTokens.background.muted,\n};\n\nconst sortIndicatorStyle: CSSProperties = {\n  color: colorTokens.neutral[400],\n};\n\nconst headerCellContentStyle: CSSProperties = {\n  display: 'flex',\n  alignItems: 'center',\n  gap: '0.25rem',\n};\n\nconst loadingCellStyle: CSSProperties = {\n  padding: '2rem',\n  textAlign: 'center',\n};\n\nconst emptyCellStyle: CSSProperties = {\n  padding: '2rem',\n  textAlign: 'center',\n  color: colorTokens.text.muted,\n};\n\nconst baseRowStyle: CSSProperties = {\n  borderBottom: `1px solid ${colorTokens.border.default}`,\n};\n\nconst selectionCellStyle: CSSProperties = {\n  padding: '0.75rem 1rem',\n  textAlign: 'center',\n};\n\nconst baseCellStyle: CSSProperties = {\n  padding: '0.75rem 1rem',\n};\n\nconst paginationContainerStyle: CSSProperties = {\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'space-between',\n  padding: '0.75rem 1rem',\n  borderTop: `1px solid ${colorTokens.border.default}`,\n  fontSize: '0.875rem',\n};\n\nconst paginationLeftStyle: CSSProperties = {\n  display: 'flex',\n  alignItems: 'center',\n  gap: '0.5rem',\n};\n\nconst paginationRightStyle: CSSProperties = {\n  display: 'flex',\n  alignItems: 'center',\n  gap: '1rem',\n};\n\nconst paginationInfoStyle: CSSProperties = {\n  color: colorTokens.text.muted,\n};\n\nconst paginationButtonsStyle: CSSProperties = {\n  display: 'flex',\n  gap: '0.25rem',\n};\n\nconst selectStyle: CSSProperties = {\n  padding: '0.25rem 0.5rem',\n  border: `1px solid ${colorTokens.border.emphasis}`,\n  borderRadius: '0.25rem',\n};\n\nconst baseButtonStyle: CSSProperties = {\n  padding: '0.25rem 0.5rem',\n  border: `1px solid ${colorTokens.border.emphasis}`,\n  borderRadius: '0.25rem',\n};\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Get cell value from row\n */\nfunction getCellValue<T>(row: T, accessor: Column<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: DataTableProps<T>['rowKey']): string {\n  if (typeof rowKey === 'function') {\n    return rowKey(row);\n  }\n  return String(row[rowKey]);\n}\n\n// ============================================================================\n// DATA TABLE COMPONENT\n// ============================================================================\n\n/**\n * Data table component - memoized for performance\n */\nfunction DataTableInner<T>({\n  data,\n  columns,\n  rowKey,\n  isLoading = false,\n  emptyState,\n  sort,\n  onSortChange,\n  pagination,\n  onPageChange,\n  onPageSizeChange,\n  onRowClick,\n  selectedKeys = [],\n  onSelectionChange,\n  selectable = false,\n  stickyHeader = false,\n  className,\n  caption,\n}: DataTableProps<T>): React.ReactElement {\n  // Filter visible columns - memoized\n  const visibleColumns = useMemo(() => columns.filter((col) => col.hidden !== true), [columns]);\n\n  // Handle sort click - stable callback\n  const handleSort = useCallback(\n    (key: string) => {\n      if (!onSortChange) return;\n\n      if (sort?.key === key) {\n        if (sort.direction === 'asc') {\n          onSortChange({ key, direction: 'desc' });\n        } else {\n          onSortChange(undefined);\n        }\n      } else {\n        onSortChange({ key, direction: 'asc' });\n      }\n    },\n    [sort, onSortChange]\n  );\n\n  // Handle row selection - stable callback\n  const handleSelectAll = useCallback(() => {\n    if (!onSelectionChange) return;\n\n    const allKeys = data.map((row) => getRowKey(row, rowKey));\n    const allSelected = allKeys.every((key) => selectedKeys.includes(key));\n\n    onSelectionChange(allSelected ? [] : allKeys);\n  }, [data, rowKey, selectedKeys, onSelectionChange]);\n\n  const handleSelectRow = useCallback(\n    (key: string) => {\n      if (!onSelectionChange) return;\n\n      if (selectedKeys.includes(key)) {\n        onSelectionChange(selectedKeys.filter((k) => k !== key));\n      } else {\n        onSelectionChange([...selectedKeys, key]);\n      }\n    },\n    [selectedKeys, onSelectionChange]\n  );\n\n  // Check if all rows are selected - memoized\n  const allSelected = useMemo(() => {\n    if (data.length === 0) return false;\n    return data.every((row) => selectedKeys.includes(getRowKey(row, rowKey)));\n  }, [data, rowKey, selectedKeys]);\n\n  // Page size options - static\n  const pageSizeOptions = useMemo(() => [10, 25, 50, 100], []);\n\n  // Memoized sticky header style extension\n  const stickyStyleExtension = useMemo(\n    (): Partial<CSSProperties> => ({\n      position: stickyHeader ? 'sticky' : undefined,\n      top: stickyHeader ? 0 : undefined,\n      zIndex: stickyHeader ? 1 : undefined,\n    }),\n    [stickyHeader]\n  );\n\n  // Memoized selection header cell style\n  const selectionHeaderStyle = useMemo(\n    (): CSSProperties => ({\n      ...baseHeaderCellStyle,\n      width: '3rem',\n      textAlign: 'center',\n      ...stickyStyleExtension,\n    }),\n    [stickyStyleExtension]\n  );\n\n  // Generate header cell styles based on column config - memoized per-column\n  const getHeaderCellStyle = useCallback(\n    (column: Column<T>): CSSProperties => ({\n      ...baseHeaderCellStyle,\n      textAlign: column.align ?? 'left',\n      width: column.width,\n      minWidth: column.minWidth,\n      cursor: (column.sortable ?? false) ? 'pointer' : 'default',\n      userSelect: (column.sortable ?? false) ? 'none' : undefined,\n      ...stickyStyleExtension,\n    }),\n    [stickyStyleExtension]\n  );\n\n  // Generate content justification based on alignment - memoized\n  const getContentJustification = useCallback(\n    (align?: 'left' | 'center' | 'right'): CSSProperties => {\n      let justifyContent: 'flex-start' | 'center' | 'flex-end' = 'flex-start';\n      if (align === 'center') {\n        justifyContent = 'center';\n      } else if (align === 'right') {\n        justifyContent = 'flex-end';\n      }\n      return {\n        ...headerCellContentStyle,\n        justifyContent,\n      };\n    },\n    []\n  );\n\n  // Generate row style based on selection and click handler - memoized factory\n  const getRowStyle = useCallback(\n    (isSelected: boolean, hasClickHandler: boolean): CSSProperties => ({\n      ...baseRowStyle,\n      cursor: hasClickHandler ? 'pointer' : 'default',\n      backgroundColor: isSelected ? colorTokens.interactive.selected : undefined,\n    }),\n    []\n  );\n\n  // Generate cell style based on alignment - memoized\n  const getCellStyle = useCallback(\n    (align?: 'left' | 'center' | 'right'): CSSProperties => ({\n      ...baseCellStyle,\n      textAlign: align ?? 'left',\n    }),\n    []\n  );\n\n  // Pre-computed button styles to avoid creating new objects on each call\n  const enabledButtonStyle = useMemo(\n    (): CSSProperties => ({\n      ...baseButtonStyle,\n      cursor: 'pointer',\n      opacity: 1,\n    }),\n    []\n  );\n\n  const disabledButtonStyle = useMemo(\n    (): CSSProperties => ({\n      ...baseButtonStyle,\n      cursor: 'not-allowed',\n      opacity: 0.5,\n    }),\n    []\n  );\n\n  // Returns pre-computed style reference instead of creating new object\n  const getButtonStyle = useCallback(\n    (disabled: boolean): CSSProperties => {\n      return disabled ? disabledButtonStyle : enabledButtonStyle;\n    },\n    [disabledButtonStyle, enabledButtonStyle]\n  );\n\n  // Calculate pagination state - memoized\n  const paginationState = useMemo(() => {\n    if (!pagination) return null;\n    const isFirstPage = pagination.page === 0;\n    const isLastPage = (pagination.page + 1) * pagination.pageSize >= pagination.total;\n    const startItem = pagination.page * pagination.pageSize + 1;\n    const endItem = Math.min((pagination.page + 1) * pagination.pageSize, pagination.total);\n    return { isFirstPage, isLastPage, startItem, endItem };\n  }, [pagination]);\n\n  // Stable header click handler using data-* attributes\n  const handleHeaderClick = useCallback(\n    (event: React.MouseEvent<HTMLTableCellElement>) => {\n      const { columnKey } = event.currentTarget.dataset;\n      const isSortable = event.currentTarget.dataset.sortable === 'true';\n      if (columnKey !== undefined && columnKey !== '' && isSortable) {\n        handleSort(columnKey);\n      }\n    },\n    [handleSort]\n  );\n\n  // Stable header keydown handler using data-* attributes\n  const handleHeaderKeyDown = useCallback(\n    (event: React.KeyboardEvent<HTMLTableCellElement>) => {\n      if (event.key === 'Enter' || event.key === ' ') {\n        const { columnKey } = event.currentTarget.dataset;\n        const isSortable = event.currentTarget.dataset.sortable === 'true';\n        if (columnKey !== undefined && columnKey !== '' && isSortable) {\n          event.preventDefault();\n          handleSort(columnKey);\n        }\n      }\n    },\n    [handleSort]\n  );\n\n  // Stable row click handler using data-* attributes\n  const handleRowClick = useCallback(\n    (event: React.MouseEvent<HTMLTableRowElement>) => {\n      const { rowIndex } = event.currentTarget.dataset;\n      if (rowIndex !== undefined && onRowClick) {\n        const row = data[Number(rowIndex)];\n        if (row !== undefined) {\n          onRowClick(row);\n        }\n      }\n    },\n    [data, onRowClick]\n  );\n\n  // Stable selection change handler using data-* attributes\n  const handleSelectionClick = useCallback(\n    (event: React.ChangeEvent<HTMLInputElement>) => {\n      const { rowKey } = event.currentTarget.dataset;\n      if (rowKey !== undefined && rowKey !== '') {\n        handleSelectRow(rowKey);\n      }\n    },\n    [handleSelectRow]\n  );\n\n  // Stop propagation handler for selection cell - stable\n  const stopPropagation = useCallback((event: React.MouseEvent) => {\n    event.stopPropagation();\n  }, []);\n\n  // Stable page size change handler\n  const handlePageSizeChangeEvent = useCallback(\n    (event: React.ChangeEvent<HTMLSelectElement>) => {\n      onPageSizeChange?.(Number(event.target.value));\n    },\n    [onPageSizeChange]\n  );\n\n  // Stable previous page handler\n  const handlePrevPage = useCallback(() => {\n    if (pagination) {\n      onPageChange?.(pagination.page - 1);\n    }\n  }, [pagination, onPageChange]);\n\n  // Stable next page handler\n  const handleNextPage = useCallback(() => {\n    if (pagination) {\n      onPageChange?.(pagination.page + 1);\n    }\n  }, [pagination, onPageChange]);\n\n  return (\n    <div className={className}>\n      {/* Table container */}\n      <div style={tableContainerStyle}>\n        <table style={tableStyle}>\n          {caption !== undefined && caption !== '' && (\n            <caption style={captionStyle}>{caption}</caption>\n          )}\n\n          {/* Header */}\n          <thead>\n            <tr style={headerRowStyle}>\n              {/* Selection checkbox */}\n              {selectable && (\n                <th scope=\"col\" style={selectionHeaderStyle}>\n                  <input\n                    type=\"checkbox\"\n                    checked={allSelected}\n                    onChange={handleSelectAll}\n                    aria-label=\"Select all rows\"\n                  />\n                </th>\n              )}\n\n              {/* Column headers */}\n              {visibleColumns.map((column) => {\n                const isSorted = sort?.key === column.key;\n                let ariaSortValue: 'ascending' | 'descending' | undefined;\n                if (isSorted) {\n                  ariaSortValue = sort.direction === 'asc' ? 'ascending' : 'descending';\n                } else {\n                  ariaSortValue = undefined;\n                }\n\n                const sortIndicator = (() => {\n                  if (sort?.key === column.key) {\n                    return sort.direction === 'asc' ? '↑' : '↓';\n                  }\n                  return '↕';\n                })();\n\n                return (\n                  <th\n                    key={column.key}\n                    scope=\"col\"\n                    style={getHeaderCellStyle(column)}\n                    tabIndex={column.sortable === true ? 0 : undefined}\n                    role={column.sortable === true ? 'button' : undefined}\n                    aria-sort={column.sortable === true ? ariaSortValue : undefined}\n                    data-column-key={column.key}\n                    data-sortable={column.sortable === true ? 'true' : 'false'}\n                    onClick={handleHeaderClick}\n                    onKeyDown={handleHeaderKeyDown}\n                  >\n                    <div style={getContentJustification(column.align)}>\n                      {column.header}\n                      {column.sortable === true && (\n                        <span style={sortIndicatorStyle} aria-hidden=\"true\">\n                          {sortIndicator}\n                        </span>\n                      )}\n                    </div>\n                  </th>\n                );\n              })}\n            </tr>\n          </thead>\n\n          {/* Body */}\n          <tbody aria-live=\"polite\" aria-busy={isLoading}>\n            {/* Loading state */}\n            {isLoading && (\n              <tr>\n                <td\n                  colSpan={visibleColumns.length + (selectable ? 1 : 0)}\n                  style={loadingCellStyle}\n                  role=\"status\"\n                >\n                  <span aria-label=\"Loading table data\">Loading...</span>\n                </td>\n              </tr>\n            )}\n\n            {/* Empty state */}\n            {!isLoading && data.length === 0 && (\n              <tr>\n                <td colSpan={visibleColumns.length + (selectable ? 1 : 0)} style={emptyCellStyle}>\n                  {emptyState ?? 'No data available'}\n                </td>\n              </tr>\n            )}\n\n            {/* Data rows */}\n            {!isLoading &&\n              data.map((row, rowIndex) => {\n                const key = getRowKey(row, rowKey);\n                const isSelected = selectedKeys.includes(key);\n\n                return (\n                  <tr\n                    key={key}\n                    data-row-index={rowIndex}\n                    onClick={onRowClick ? handleRowClick : undefined}\n                    style={getRowStyle(isSelected, onRowClick !== undefined)}\n                  >\n                    {/* Selection checkbox */}\n                    {selectable && (\n                      <td style={selectionCellStyle} onClick={stopPropagation}>\n                        <input\n                          type=\"checkbox\"\n                          checked={isSelected}\n                          data-row-key={key}\n                          onChange={handleSelectionClick}\n                          aria-label={`Select row ${key}`}\n                        />\n                      </td>\n                    )}\n\n                    {/* Data cells */}\n                    {visibleColumns.map((column) => {\n                      const value = getCellValue(row, column.accessor);\n\n                      let cellContent: React.ReactNode;\n                      if (column.cell) {\n                        cellContent = column.cell(value, row, rowIndex);\n                      } else if (value === null || value === undefined) {\n                        cellContent = '';\n                      } else if (typeof value === 'object') {\n                        cellContent = JSON.stringify(value);\n                      } else if (\n                        typeof value === 'string' ||\n                        typeof value === 'number' ||\n                        typeof value === 'boolean'\n                      ) {\n                        cellContent = String(value);\n                      } else {\n                        cellContent = '';\n                      }\n\n                      return (\n                        <td key={column.key} style={getCellStyle(column.align)}>\n                          {cellContent}\n                        </td>\n                      );\n                    })}\n                  </tr>\n                );\n              })}\n          </tbody>\n        </table>\n      </div>\n\n      {/* Pagination */}\n      {pagination && paginationState && (\n        <div style={paginationContainerStyle}>\n          <div style={paginationLeftStyle}>\n            <label htmlFor=\"datatable-page-size\">Rows per page:</label>\n            <select\n              id=\"datatable-page-size\"\n              aria-label=\"Select number of rows per page\"\n              value={pagination.pageSize}\n              onChange={handlePageSizeChangeEvent}\n              style={selectStyle}\n            >\n              {pageSizeOptions.map((size) => (\n                <option key={size} value={size}>\n                  {size}\n                </option>\n              ))}\n            </select>\n          </div>\n\n          <div style={paginationRightStyle}>\n            <span style={paginationInfoStyle}>\n              {paginationState.startItem}-{paginationState.endItem} of {pagination.total}\n            </span>\n\n            <div style={paginationButtonsStyle} role=\"group\" aria-label=\"Pagination controls\">\n              <button\n                onClick={handlePrevPage}\n                disabled={paginationState.isFirstPage}\n                aria-disabled={paginationState.isFirstPage}\n                aria-label=\"Go to previous page\"\n                style={getButtonStyle(paginationState.isFirstPage)}\n              >\n                Previous\n              </button>\n              <button\n                onClick={handleNextPage}\n                disabled={paginationState.isLastPage}\n                aria-disabled={paginationState.isLastPage}\n                aria-label=\"Go to next page\"\n                style={getButtonStyle(paginationState.isLastPage)}\n              >\n                Next\n              </button>\n            </div>\n          </div>\n        </div>\n      )}\n    </div>\n  );\n}\n\nDataTableInner.displayName = 'DataTable';\n\n/**\n * Memoized DataTable component with preserved generic signature\n */\nexport const DataTable = memo(DataTableInner) as <T>(\n  props: DataTableProps<T>\n) => React.ReactElement;\n"],"names":["tableContainerStyle","tableStyle","captionStyle","headerRowStyle","colorTokens","baseHeaderCellStyle","sortIndicatorStyle","headerCellContentStyle","loadingCellStyle","emptyCellStyle","baseRowStyle","selectionCellStyle","baseCellStyle","paginationContainerStyle","paginationLeftStyle","paginationRightStyle","paginationInfoStyle","paginationButtonsStyle","selectStyle","baseButtonStyle","getCellValue","row","accessor","getRowKey","rowKey","DataTableInner","data","columns","isLoading","emptyState","sort","onSortChange","pagination","onPageChange","onPageSizeChange","onRowClick","selectedKeys","onSelectionChange","selectable","stickyHeader","className","caption","visibleColumns","useMemo","col","handleSort","useCallback","key","handleSelectAll","allKeys","allSelected","handleSelectRow","k","pageSizeOptions","stickyStyleExtension","selectionHeaderStyle","getHeaderCellStyle","column","getContentJustification","align","justifyContent","getRowStyle","isSelected","hasClickHandler","getCellStyle","enabledButtonStyle","disabledButtonStyle","getButtonStyle","disabled","paginationState","isFirstPage","isLastPage","startItem","endItem","handleHeaderClick","event","columnKey","isSortable","handleHeaderKeyDown","handleRowClick","rowIndex","handleSelectionClick","stopPropagation","handlePageSizeChangeEvent","handlePrevPage","handleNextPage","jsxs","jsx","isSorted","ariaSortValue","sortIndicator","value","cellContent","size","DataTable","memo"],"mappings":"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"}