facebook / facebook/astryx

[Tracker] Table feature suite — Q3 plugin parity

Open
#3,639 0 comments 0 reactions 2 assignees Claimed by @ernestt View on GitHub
enhancement
Dominant language
TypeScript
Stars
13k
Forks
1.1k
Avg merge
1d 15h
Merged PRs (30d)
690

Description

## Problem

Astryx core `Table` ships a data-driven, transform-plugin architecture, but the core plugin set is small — 8 plugins (`useTableColumnResize`, `useTableColumnSettings`, `useTableFiltering`, `useTablePagination`, `useTableRowExpansion`, `useTableSelection`, `useTableSortable`, `useTableStickyColumns`). An internal table system built on the same plugin pattern covers a number of capabilities core has no answer for (virtualization, tree rows, drag-and-drop, and more). This is the Q3 push to mature the Table plugin suite by porting the proven patterns into core.

This is a **tracker**. Each plugin below is filed as a sub-issue and lands on its own via the normal issue → API → PR flow. Grouped by feature area.

## Rendering & performance
- Row virtualization — render only visible rows for large datasets
- Column virtualization — windowed columns for very wide tables
- Infinite scroll — load more rows on scroll

## Row grouping & hierarchy
- Row expansion — expand/collapse rows to reveal detail *(shipped, #3441)*
- Grouped rows — collapsible section rows *(in review, #3763)*
- Tree rows — nested/expandable row hierarchy
- Tree rows w/ async data source — lazy-loaded tree children
- Row-expansion data source — async-loaded expansion content

## Selection & interaction
- Single selection — radio-style single-row select
- Row activation — active-row highlight/selection
- Row navigation — keyboard/pointer row navigation *(verify vs. existing core focus handling)*
- Drag-and-drop rows — reorder rows by dragging

## Columns
- Sticky columns — pin columns to start/end *(shipped, #3118)*
- Grouped columns — multi-level column headers
- Drag-and-drop columns — reorder columns by dragging
- Column flip — transpose rows/columns
- Column reorder preview — drag preview ghost
- Heatmap columns — value-scaled cell backgrounds

## Row decoration
- Context menu — plugin-contributed row/header actions *(shipped, #3256)*
- Row index — monospaced row-number column *(in review, #3756)*
- Row status — leading-edge status bar *(in review, #3757)*
- Custom row rendering — consumer-controlled row renderer

## Loading & empty states
- Loading state — full skeleton table while data loads
- Cell placeholder — per-cell Suspense/skeleton fallbacks
- Empty state — first-class empty placeholder *(verify vs. existing `emptyState` prop + `EmptyState` component)*
- Error boundary — per-row error isolation

## Extensibility
- **`customPlugins`** — a Table prop accepting an array of user-authored plugins that adhere to the public `TablePlugin` contract (`transformColumns`, `transformHeaderCell`, `transformBodyRow`, `transformBodyCell`, `transformScrollWrapper`, `transformTableContext`, `contextMenuActions`). Lets consumers extend the Table with their own transforms — no core change — alongside the named built-ins. Needs a documented/versioned contract, composition/ordering semantics vs. built-ins, and dev-time validation.

## Notes

Scope adjusts as priorities firm up (@humbertovirtudes). Infinity virtualization (infinite + virtualized combined) is intentionally out of scope for now. Prefetch and URL-based row navigation are not planned.

Each sub-item follows the spec protocol independently (problem → research → API → PR). New plugins reuse core's existing transform-plugin interface; where the source interface diverges (e.g. virtualization's data/column slicing), API arbitration happens in the individual issue.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.