React table components for PatternFly design system with sorting, selection, expansion, and editing capabilities
npx @tessl/cli install tessl/npm-patternfly--react-table@6.3.0PatternFly React Table is a comprehensive React component library that provides composable table components following the PatternFly design system. It offers both basic table rendering capabilities and advanced features like sorting, selection, expansion, editing, drag-and-drop, and favorites.
npm install @patternfly/react-tableimport {
Table,
Thead,
Tbody,
Tr,
Th,
Td,
Caption
} from "@patternfly/react-table";CommonJS:
const {
Table,
Thead,
Tbody,
Tr,
Th,
Td,
Caption
} = require("@patternfly/react-table");import { Table, Thead, Tbody, Tr, Th, Td } from "@patternfly/react-table";
function BasicTable() {
return (
<Table aria-label="Simple table">
<Thead>
<Tr>
<Th>Name</Th>
<Th>Role</Th>
<Th>Department</Th>
</Tr>
</Thead>
<Tbody>
<Tr>
<Td dataLabel="Name">John Doe</Td>
<Td dataLabel="Role">Developer</Td>
<Td dataLabel="Department">Engineering</Td>
</Tr>
<Tr>
<Td dataLabel="Name">Jane Smith</Td>
<Td dataLabel="Role">Designer</Td>
<Td dataLabel="Department">UX</Td>
</Tr>
</Tbody>
</Table>
);
}PatternFly React Table is built around several key components:
Basic table building blocks for creating structured data displays with full accessibility support.
// Main table container
function Table(props: TableProps): React.ForwardRefExoticComponent;
// Table structure components
function Thead(props: TheadProps): React.ForwardRefExoticComponent;
function Tbody(props: TbodyProps): React.ForwardRefExoticComponent;
function Tr(props: TrProps): React.ForwardRefExoticComponent;
function Th(props: ThProps): React.ForwardRefExoticComponent;
function Td(props: TdProps): React.ForwardRefExoticComponent;
function Caption(props: CaptionProps): React.FunctionComponent;Components and functionality for user interactions including sorting, selection, expansion, and actions.
// Specialized interaction components
function ActionsColumn(props: ActionsColumnProps): React.ForwardRefExoticComponent;
function SortColumn(props: SortColumnProps): React.FunctionComponent;
function SelectColumn(props: SelectColumnProps): React.FunctionComponent;
function CollapseColumn(props: CollapseColumnProps): React.FunctionComponent;
function DraggableCell(props: DraggableCellProps): React.FunctionComponent;
function EditColumn(props: EditColumnProps): React.FunctionComponent;
// Key interaction types
type OnSort = (event: React.MouseEvent, columnIndex: number, sortByDirection: SortByDirection, extraData: IExtraColumnData) => void;
type OnSelect = (event: React.FormEvent<HTMLInputElement>, isSelected: boolean, rowIndex: number, rowData: IRowData, extraData: IExtraData) => void;
type OnCollapse = (event: React.MouseEvent, rowIndex: number, isOpen: boolean, rowData: IRowData, extraData: IExtraData) => void;Components for rendering and formatting table content with responsive text handling and favorites.
// Content components
function TableText(props: TableTextProps): React.FunctionComponent;
function ExpandableRowContent(props: ExpandableRowContentProps): React.FunctionComponent;
function FavoritesCell(props: FavoritesCellProps): React.FunctionComponent;
function HeaderCellInfoWrapper(props: ColumnHelpWrapperProps): React.FunctionComponent;
// Text formatting options
enum WrapModifier {
wrap = 'wrap',
nowrap = 'nowrap',
truncate = 'truncate',
breakWord = 'breakWord',
fitContent = 'fitContent'
}Inline editing components for text and select inputs with validation support.
// Editing components
function EditableTextCell(props: IEditableTextCell): React.FunctionComponent;
function EditableSelectInputCell(props: IEditableSelectInputCell): React.FunctionComponent;
// Editing event handlers
type OnRowEdit = (event: React.MouseEvent<HTMLButtonElement>, type: RowEditType, isEditable?: boolean, rowIndex?: number, validationErrors?: RowErrors) => void;
type RowEditType = 'save' | 'cancel' | 'edit';Components for managing table layout, scrolling behavior, and responsive design.
// Layout components
function OuterScrollContainer(props: OuterScrollContainerProps): React.FunctionComponent;
function InnerScrollContainer(props: InnerScrollContainerProps): React.FunctionComponent;
function RowWrapper(props: RowWrapperProps): React.Component;
function TreeRowWrapper(props: RowWrapperProps): React.FunctionComponent;
// Grid breakpoints
enum TableGridBreakpoint {
none = '',
grid = 'grid',
gridMd = 'grid-md',
gridLg = 'grid-lg',
gridXl = 'grid-xl',
grid2xl = 'grid-2xl'
}Utility functions, decorators, and transformers for customizing table behavior, appearance, and interactions.
// Behavior decorators
function selectable(onSelect: OnSelect, selectableRowCaptionText?: string): ITransform;
function sortable(onSort: OnSort, options?: ISortBy): ITransform;
function cellActions(actions: IActions | IActionsResolver, areActionsDisabled?: IAreActionsDisabled): ITransform;
function collapsible(onCollapse: OnCollapse): ITransform;
function editable(onRowEdit?: OnRowEdit, validationErrors?: any): ITransform;
function favoritable(onFavorite: OnFavorite): ITransform;
// Layout decorators
function wrappable(): ITransform;
function breakWord(): ITransform;
function fitContent(): ITransform;
function nowrap(): ITransform;
function truncate(): ITransform;
function textCenter(): ITransform;
function cellWidth(width: 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 60 | 70 | 80 | 90 | 100): ITransform;
// Transformers and formatters
function defaultTitle(data?: IFormatterValueType): any;
function emptyTD(): ITransform;
function scopeColTransformer(): ITransform;
function emptyCol(label?: IFormatterValueType): ITransform;// Core table props
interface TableProps extends React.HTMLProps<HTMLTableElement>, OUIAProps {
'aria-label'?: string;
variant?: TableVariant | 'compact';
borders?: boolean;
gridBreakPoint?: '' | 'grid' | 'grid-md' | 'grid-lg' | 'grid-xl' | 'grid-2xl';
role?: string;
isStickyHeader?: boolean;
isTreeTable?: boolean;
isNested?: boolean;
isStriped?: boolean;
isExpandable?: boolean;
hasAnimations?: boolean;
hasNoInset?: boolean;
nestedHeaderColumnSpans?: number[];
selectableRowCaptionText?: string;
ouiaId?: number | string;
ouiaSafe?: boolean;
}
// Cell base props shared by Th and Td
interface BaseCellProps {
children?: React.ReactNode;
className?: string;
component?: React.ReactNode;
textCenter?: boolean;
modifier?: 'breakWord' | 'fitContent' | 'nowrap' | 'truncate' | 'wrap';
width?: 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 60 | 70 | 80 | 90 | 100;
visibility?: (keyof IVisibility)[];
innerRef?: React.Ref<any>;
}
// Table variants and grid breakpoints
enum TableVariant {
compact = 'compact'
}
enum TableGridBreakpoint {
none = '',
grid = 'grid',
gridMd = 'grid-md',
gridLg = 'grid-lg',
gridXl = 'grid-xl',
grid2xl = 'grid-2xl'
}
// Row and data structures
interface IRow extends RowType {
cells?: (React.ReactNode | IRowCell)[];
isOpen?: boolean;
isEditable?: boolean;
isClickable?: boolean;
isRowSelected?: boolean;
isValid?: boolean;
rowEditValidationRules?: IValidatorDef[];
rowEditBtnAriaLabel?: (idx: number) => string;
rowSaveBtnAriaLabel?: (idx: number) => string;
rowCancelBtnAriaLabel?: (idx: number) => string;
parent?: number;
compoundParent?: number;
fullWidth?: boolean;
noPadding?: boolean;
heightAuto?: boolean;
showSelect?: boolean;
isExpanded?: boolean;
isFirstVisible?: boolean;
isLastVisible?: boolean;
selected?: boolean;
disableSelection?: boolean;
favorited?: boolean;
favoritesProps?: any;
props?: any;
}
interface IRowData extends IRow {
disableActions?: boolean;
}
// Action definitions
interface IAction extends Omit<DropdownItemProps, 'title' | 'onClick'>, Pick<ButtonProps, 'variant'> {
isSeparator?: boolean;
itemKey?: string;
title?: React.ReactNode;
isAriaDisabled?: boolean;
tooltipProps?: TooltipProps;
onClick?: (event: React.MouseEvent, rowIndex: number, rowData: IRowData, extraData: IExtraData) => void;
isOutsideDropdown?: boolean;
shouldCloseOnClick?: boolean;
}
type IActions = (IAction | ISeparator)[];
type IActionsResolver = (rowData: IRowData, extraData: IExtraData) => (IAction | ISeparator)[];
// Sort configuration
interface ISortBy {
index?: number;
direction?: 'asc' | 'desc';
defaultDirection?: 'asc' | 'desc';
}
enum SortByDirection {
asc = 'asc',
desc = 'desc'
}
// Validation
interface IValidatorDef {
validator: (value: string) => boolean;
errorText: string;
name: string;
}
interface RowErrors {
[name: string]: string[];
}
// Transform and formatter interfaces
interface ITransform {
(label?: IFormatterValueType, extra?: IExtra): decoratorReturnType;
}
interface IFormatter {
(data?: IFormatterValueType, extra?: IExtra): formatterValueType & decoratorReturnType;
}
interface decoratorReturnType {
component?: React.ComponentType<any>;
className?: string;
isVisible?: boolean;
scope?: string;
parentId?: string | number;
[key: string]: any;
}
// Visibility configuration
interface IVisibility {
hidden: string;
hiddenOnSm: string;
hiddenOnMd: string;
hiddenOnLg: string;
hiddenOnXl: string;
hiddenOn2Xl: string;
visibleOnSm: string;
visibleOnMd: string;
visibleOnLg: string;
visibleOnXl: string;
visibleOn2Xl: string;
}
// Column configuration
interface IColumn {
title: React.ReactNode;
transforms?: ITransform[];
formatters?: IFormatter[];
cellTransforms?: ITransform[];
cellFormatters?: IFormatter[];
props?: any;
extraParams?: {
sortBy?: ISortBy;
onSort?: OnSort;
onCollapse?: OnCollapse;
onExpand?: OnExpand;
onSelect?: OnSelect;
selectVariant?: 'checkbox' | 'radio';
onRowEdit?: OnRowEdit;
onFavorite?: OnFavorite;
actionsToggle?: (props: CustomActionsToggleProps) => React.ReactNode;
[key: string]: any;
};
}
// Cell configuration
interface ICell {
title?: React.ReactNode;
transforms?: ITransform[];
formatters?: IFormatter[];
cellTransforms?: ITransform[];
cellFormatters?: IFormatter[];
props?: any;
}
// Row cell content
interface IRowCell<T = any> {
title?: React.ReactNode | RowCellContent<T>;
props?: any;
}
type RowCellContent<T = any> = (
value?: string,
rowIndex?: number,
cellIndex?: number,
props?: T
) => void;
// Additional event handlers
type OnExpand = (
event: React.MouseEvent,
rowIndex: number,
colIndex: number,
isOpen: boolean,
rowData: IRowData,
extraData: IExtraData
) => void;
type OnFavorite = (
event: React.MouseEvent,
isFavorited: boolean,
rowIndex: number,
rowData: IRowData,
extraData: IExtraData
) => void;
type OnTreeRowCollapse = (
event: any,
rowIndex: number,
title: React.ReactNode,
rowData: IRowData
) => void;