{"version":3,"file":"virtualList.mjs","names":[],"sources":["../../../../package/common/virtualList/virtualList.tsx"],"sourcesContent":["import React, { useMemo, useCallback, useEffect, useId, useImperativeHandle, useRef } from 'react';\nimport cx from 'classnames';\nimport styles from './virtualList.module.pcss';\nimport Loader from '../loader';\nimport Checkbox from '../checkbox';\nimport VirtualRow from './virtualRow';\nimport VirtualListHeader from './virtualListHeader';\nimport { useVirtualWindow } from './useVirtualWindow';\nimport { useSelection } from './useSelection';\nimport { useColumns } from './useColumns';\nimport { useRowDrag } from './useRowDrag';\nimport { useSorting } from './useSorting';\nimport { useColumnResize } from './useColumnResize';\nimport { useRowNavigation } from './useRowNavigation';\nimport { useLabels, useLocale } from '../configProvider';\nimport type { VirtualListColumn, VirtualListLabels, VirtualListProps } from './virtualList.types';\n\nconst DEFAULT_LABELS: Required<VirtualListLabels> = {\n  selectRow: 'Select row',\n  selectAllRows: 'Select all rows',\n  toggleColumns: 'Toggle column visibility',\n  columnsHidden: (count) => `${count} columns hidden`,\n  resetColumnWidths: 'Reset column widths',\n};\n\n// Pure helpers live in ./virtualList.utils; re-exported here so existing\n// imports (and unit tests) keep working against the component entry point.\nexport {\n  buildOffsets,\n  findStartIndex,\n  getVisibleRange,\n  resolveReorderTarget,\n  resolveTreeDropTarget,\n  lastDescendantIndex,\n  buildColumnTemplate,\n  compareSortValues,\n  isColumnSortable,\n  isEmptySortValue,\n  nextSort,\n  sortItems,\n} from './virtualList.utils';\n\n// ─── Orchestrator ─────────────────────────────────────────────────────────────\n// VirtualListInner wires the hooks together and renders the two pieces of\n// markup. Each concern lives in its own module:\n//   useSorting          — table mode: header sort state, and the sorted row order\n//   useVirtualWindow    — generic scroll / measurement / windowing (all modes)\n//   useColumnResize     — table mode: user column widths, and the drag that sets them\n//   useSelection        — multi-row selection\n//   useColumns          — table mode: columns, visibility, persistence, fit widths\n//   useRowDrag          — reorder + tree drag-and-drop (mouse + touch)\n//   useRowNavigation    — arrow-key navigation over the rows\n//   virtualListHeader   — the header row: sorting, resizing, the column menu\n//   virtualRow          — one positioned row, with its drag wiring\n//\n// The hook order is not free: useColumnResize decides whether the layout is\n// frozen, which useColumns needs to build the grid template.\n\n/** One handler after the other, or whichever of the two exists. */\nfunction chain<E>(theirs: ((event: E) => void) | undefined, ours: ((event: E) => void) | undefined) {\n  if (!theirs || !ours) return theirs ?? ours;\n  return (event: E) => {\n    theirs(event);\n    ours(event);\n  };\n}\n\nfunction VirtualList<T>(props: VirtualListProps<T>) {\n  const {\n    ref,\n    items,\n    renderRow,\n    ariaRoles,\n    columns,\n    height = '100%',\n    estimatedRowHeight = 40,\n    overscan = 3,\n    rowGap = 0,\n    rowPadding,\n    selectedKey,\n    getItemKey,\n    onRowClick,\n    keyboardNavigation = true,\n    tabAcrossRows = false,\n    scrollParent,\n    visibleColumnKeys,\n    onVisibleColumnsChange,\n    persistColumnsKey,\n    resizableColumns = false,\n    columnWidths,\n    onColumnWidthsChange,\n    labels,\n    sort,\n    defaultSort,\n    onSortChange,\n    showColumnToggle,\n    onLoadMore,\n    loadMoreThreshold = 100,\n    isLoading = false,\n    multiSelect = false,\n    selectedKeys,\n    onSelectionChange,\n    reorderable = false,\n    onReorder,\n    longPressDelay = 400,\n    treeReorder = false,\n    getItemDepth,\n    isGroup,\n    onTreeDrop,\n    treeIndentPx = 24,\n    dragHandle = false,\n    showDivider = true,\n    rowHover = true,\n    className,\n    style,\n    classNames,\n    styles: slotStyles,\n    ...rest\n  } = props;\n  // Read off the raw props: the destructured value carries a default and so\n  // cannot tell a passed '100%' from an omitted one.\n  const heightIgnored = props.scrollParent != null && props.height !== undefined;\n  // StrictMode runs every effect twice on mount; a developer warning should appear once.\n  const warnedHeightRef = useRef(false);\n  useEffect(() => {\n    if (!heightIgnored || warnedHeightRef.current) return;\n    warnedHeightRef.current = true;\n    console.warn(\n      'VirtualList: `height` is ignored alongside `scrollParent`, which leaves the list no viewport to size.',\n    );\n  }, [heightIgnored]);\n\n  const text = useLabels('VirtualList', labels, DEFAULT_LABELS);\n  const locale = useLocale();\n  const { rows, effectiveSort, isSorted, handleHeaderSort } = useSorting<T>({\n    items,\n    columns,\n    sort,\n    defaultSort,\n    onSortChange,\n    locale,\n  });\n\n  const getKey = useCallback(\n    (item: T, index: number): string | number => (getItemKey ? getItemKey(item, index) : index),\n    [getItemKey],\n  );\n  const keys = useMemo(() => rows.map((item, i) => getKey(item, i)), [rows, getKey]);\n  const depths = useMemo(\n    () => (getItemDepth ? rows.map((item, i) => getItemDepth(item, i)) : []),\n    [rows, getItemDepth],\n  );\n  const isGroupAt = useCallback((i: number) => (isGroup ? isGroup(rows[i], i) : false), [isGroup, rows]);\n\n  const win = useVirtualWindow<T>({\n    items: rows,\n    keys,\n    getItemKey,\n    estimatedRowHeight,\n    rowGap,\n    overscan,\n    onLoadMore,\n    loadMoreThreshold,\n    isLoading,\n    scrollParent,\n  });\n  const { rootRef, headerRef, rowObserver, keysRef, offsets, totalHeight, startIndex, endIndex } = win;\n\n  // Filled from `cols` below: the resize hook only reads the visible set when a\n  // handle is actually used, which is what lets it run before the hook that\n  // derives it.\n  const visibleColumnsRef = useRef<VirtualListColumn<T>[]>([]);\n  const columnResize = useColumnResize<T>({\n    columns,\n    visibleColumnsRef,\n    resizableColumns,\n    columnWidths,\n    onColumnWidthsChange,\n    persistColumnsKey,\n    rootRef,\n  });\n\n  const selection = useSelection<T>({ items: rows, getKey, multiSelect, selectedKeys, onSelectionChange });\n  const { effectiveSelectedKeys } = selection;\n\n  const cols = useColumns<T>({\n    columns,\n    items: rows,\n    multiSelect,\n    visibleColumnKeys,\n    onVisibleColumnsChange,\n    persistColumnsKey,\n    showColumnToggle,\n    userWidths: columnResize.widths,\n    isFrozen: columnResize.isFrozen,\n    rootRef,\n    startIndex,\n    endIndex,\n    containerHeight: win.containerHeight,\n    containerWidth: win.containerWidth,\n    isLoading,\n  });\n  // The rest of `cols` is the header's business and goes there whole.\n  const { hasColumns, visibleColumns, columnTemplate, widthVars, shouldShowToggle, recalculateColumns } = cols;\n  visibleColumnsRef.current = visibleColumns;\n\n  // Compose the forwarded handle from the hooks that own each piece: scroll\n  // methods from the windowing engine, column controls from the column hooks.\n  useImperativeHandle(ref, () => ({ ...win.scrollApi, recalculateColumns, resetColumnWidths: columnResize.reset }), [\n    win.scrollApi,\n    recalculateColumns,\n    columnResize.reset,\n  ]);\n\n  // Dragging a row to position N is meaningless while the list decides the\n  // order: the drop would be undone by the next sort pass.\n  const dragBlockedBySort = isSorted && (reorderable || treeReorder);\n  const warnedSortRef = useRef(false);\n  useEffect(() => {\n    if (!dragBlockedBySort || warnedSortRef.current) return;\n    warnedSortRef.current = true;\n    console.warn('VirtualList: row reordering is disabled while the list is sorted. Clear the sort to drag rows.');\n  }, [dragBlockedBySort]);\n\n  const drag = useRowDrag({\n    reorderable: reorderable && !isSorted,\n    treeReorder: treeReorder && !isSorted,\n    onReorder,\n    onTreeDrop,\n    longPressDelay,\n    dragHandle,\n    treeIndentPx,\n    keys,\n    depths,\n    isGroupAt,\n    rootRef,\n    keysRef,\n    getVisibleRect: win.getVisibleRect,\n    scrollBy: win.scrollBy,\n  });\n\n  const listId = useId();\n  const rowDomId = (index: number) => `${listId}-row-${index}`;\n  const nav = useRowNavigation({\n    enabled: keyboardNavigation,\n    tabAcrossRows,\n    rowCount: rows.length,\n    offsets,\n    rootRef,\n    headerRef,\n    getVisibleSlice: win.getVisibleSlice,\n    viewportHeight: win.viewportHeight,\n    scrollToIndex: win.scrollApi.scrollToIndex,\n    initialIndex: selectedKey != null ? Math.max(0, keys.indexOf(selectedKey)) : 0,\n    multiSelect,\n    onActivate: onRowClick && ((index: number) => onRowClick(rows[index], index)),\n    onToggleSelect: (index) => selection.handleRowSelect(keys[index]),\n  });\n\n  const rowPaddingValue = typeof rowPadding === 'number' ? `${rowPadding}px` : rowPadding;\n\n  const renderRowAt = (i: number) => {\n    const item = rows[i];\n    const key = getKey(item, i);\n    const isSelected = (selectedKey != null && key === selectedKey) || effectiveSelectedKeys.has(key);\n    const dragProps = drag.getRowDragProps(i, key);\n\n    return (\n      <VirtualRow\n        key={key}\n        id={rowDomId(i)}\n        index={i}\n        top={offsets[i]}\n        padding={rowPaddingValue}\n        columnTemplate={columnTemplate}\n        isSelected={isSelected}\n        isActive={i === nav.activeIndex}\n        manageTabStops={keyboardNavigation}\n        isEntered={i === nav.enteredIndex}\n        activeClassName={classNames?.activeRow}\n        activeStyle={slotStyles?.activeRow}\n        showDivider={showDivider}\n        hover={rowHover}\n        onClick={() => {\n          if (drag.consumeSuppressedClick()) return;\n          // Keep the arrows where the pointer last was.\n          nav.setActiveIndex(i);\n          onRowClick?.(item, i);\n        }}\n        observer={rowObserver}\n        ariaRowIndex={hasColumns ? i + 2 : undefined}\n        ariaPosInSet={hasColumns ? undefined : i + 1}\n        ariaSetSize={hasColumns ? undefined : rows.length}\n        rowRole={ariaRoles?.row ?? (hasColumns ? 'row' : 'listitem')}\n        reserveToggleGutter={shouldShowToggle}\n        {...dragProps}\n        dropIndicatorClassName={classNames?.dropIndicator}\n        dropIndicatorStyle={slotStyles?.dropIndicator}\n        rowClassName={classNames?.row}\n        rowStyle={slotStyles?.row}\n      >\n        {hasColumns ? (\n          <>\n            {multiSelect && (\n              <div\n                className={cx(styles.virtualListSelectCell, classNames?.selectCell)}\n                style={slotStyles?.selectCell}\n                role='gridcell'\n                onClick={(e) => e.stopPropagation()}\n              >\n                <Checkbox\n                  selected={effectiveSelectedKeys.has(key)}\n                  onToggle={() => selection.handleRowSelect(key)}\n                  aria-label={text.selectRow}\n                  // One tab stop per rendered row, changing as the list scrolls,\n                  // would strand the focus the moment a row unmounts. Space on\n                  // the active row is the keyboard path instead.\n                  tabIndex={-1}\n                />\n              </div>\n            )}\n            {visibleColumns.map((col) => (\n              <div\n                key={col.key}\n                className={cx(styles.virtualListCell, classNames?.cell)}\n                style={slotStyles?.cell}\n                role='gridcell'\n                data-col-key={col.key}\n                data-fit-key={col.width.type === 'fit' ? col.key : undefined}\n              >\n                {col.renderCell(item, i)}\n              </div>\n            ))}\n          </>\n        ) : (\n          renderRow?.(item, i)\n        )}\n      </VirtualRow>\n    );\n  };\n\n  const visibleRows: React.ReactNode[] = [];\n  for (let i = startIndex; i <= endIndex; i++) visibleRows.push(renderRowAt(i));\n\n  // Keep the row being touch-dragged mounted even if it scrolls out of the\n  // window. Touch events are dispatched to the element under the finger at\n  // touchstart; if that row unmounts, the browser stops delivering touchmove\n  // and the drag freezes. Pinning its DOM node keeps the gesture alive.\n  const draggedIndex = drag.draggingKey != null ? keys.indexOf(drag.draggingKey) : -1;\n  if (draggedIndex >= 0 && (draggedIndex < startIndex || draggedIndex > endIndex)) {\n    visibleRows.push(renderRowAt(draggedIndex));\n  }\n\n  // Same reason, one step further: the row being used holds the focus, and\n  // unmounting it would drop that focus to the document body mid-scroll.\n  if (nav.enteredIndex >= 0 && (nav.enteredIndex < startIndex || nav.enteredIndex > endIndex)) {\n    visibleRows.push(renderRowAt(nav.enteredIndex));\n  }\n\n  // Navigation must not replace handlers the consumer passed. Theirs runs first,\n  // and a `preventDefault` in it keeps the event: the navigation handlers all\n  // check `defaultPrevented`.\n  const containerProps = {\n    ...nav.containerProps,\n    onKeyDown: chain<React.KeyboardEvent<HTMLDivElement>>(rest.onKeyDown, nav.containerProps.onKeyDown),\n    onFocus: chain<React.FocusEvent<HTMLDivElement>>(rest.onFocus, nav.containerProps.onFocus),\n    onBlur: chain<React.FocusEvent<HTMLDivElement>>(rest.onBlur, nav.containerProps.onBlur),\n  };\n\n  return (\n    <div\n      {...rest}\n      {...containerProps}\n      ref={rootRef}\n      className={cx(\n        styles.virtualList,\n        win.isWindowed && styles.virtualListWindowed,\n        drag.draggingKey != null && styles.virtualListReordering,\n        columnResize.isResizing && styles.virtualListResizing,\n        className,\n        classNames?.root,\n      )}\n      style={{ ...(win.isWindowed ? null : { height }), ...widthVars, ...style, ...slotStyles?.root }}\n      role={ariaRoles?.container ?? (hasColumns ? 'grid' : 'list')}\n      aria-rowcount={hasColumns ? rows.length + 1 : undefined}\n      aria-busy={isLoading || win.showLoadMoreSpinner || rest['aria-busy'] || undefined}\n      // Only a composite role may point at an active descendant, and the default\n      // `list` is not one. In list mode, pass `ariaRoles` (e.g. listbox/option)\n      // to have the active row announced.\n      aria-activedescendant={\n        nav.activeIndex >= 0 && (ariaRoles?.container ?? (hasColumns ? 'grid' : 'list')) !== 'list'\n          ? rowDomId(nav.activeIndex)\n          : undefined\n      }\n    >\n      {hasColumns && (\n        <VirtualListHeader<T>\n          headerRef={headerRef}\n          columns={columns!}\n          cols={cols}\n          resize={columnResize}\n          sort={effectiveSort}\n          onSort={handleHeaderSort}\n          multiSelect={multiSelect}\n          allSelected={selection.allSelected}\n          someSelected={selection.someSelected}\n          onSelectAll={selection.handleSelectAll}\n          labels={text}\n          classNames={classNames}\n          styles={slotStyles}\n        />\n      )}\n      {/* Hidden, with the list marked busy instead: a list or grid may only own rows. */}\n      {isLoading ? (\n        <div className={styles.virtualListLoadingFull} aria-hidden='true'>\n          <Loader size={32} />\n        </div>\n      ) : (\n        <div\n          className={cx(styles.virtualListBody, classNames?.body)}\n          style={{ height: totalHeight, ...slotStyles?.body }}\n        >\n          {visibleRows}\n        </div>\n      )}\n      {win.showLoadMoreSpinner && (\n        <div\n          className={cx(styles.virtualListLoadingIndicator, classNames?.loadingIndicator)}\n          style={slotStyles?.loadingIndicator}\n          aria-hidden='true'\n        >\n          <Loader size={32} />\n        </div>\n      )}\n    </div>\n  );\n}\n\nexport default VirtualList;\n"],"mappings":"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"}