|
| 1 | +# Changelog |
| 2 | + |
| 3 | +A summary of notable changes per release. For the full commit history see the [repository on GitHub](https://github.com/jbetancur/react-data-table-component/commits/master). |
| 4 | + |
| 5 | +## 8.4.0 |
| 6 | + |
| 7 | +### New features |
| 8 | + |
| 9 | +- **Removable sorting** — clicking a sorted header now cycles asc → desc → unsorted, so a sort can be cleared without reloading the page. → [Sorting docs](/docs/sorting#removable-sorting) |
| 10 | +- **Multi-column sorting** — new `sortMulti` prop. Ctrl/⌘-click headers to build a sort stack; priority follows click order and a numbered badge marks each sorted column. → [Sorting docs](/docs/sorting#multi-column-sorting) ([#1325](https://github.com/jbetancur/react-data-table-component/pulls/1325)) |
| 11 | +- `SortColumn<T>` type exported — represents a single entry in the sort stack (`{ column, sortDirection }`). |
| 12 | +- `onSort` gains a fourth `sortColumns: SortColumn<T>[]` argument with the full sort config. Existing three-argument handlers are unaffected. |
| 13 | + |
| 14 | +### Behavior changes |
| 15 | + |
| 16 | +- A third click on a sorted header now removes the sort (previously it stayed on descending). Server-side `onSort` handlers should treat an empty `sortColumns` array as "no sort" and drop their `ORDER BY`. |
| 17 | + |
| 18 | +--- |
| 19 | + |
| 20 | +## 8.3.0 |
| 21 | + |
| 22 | +### New features |
| 23 | + |
| 24 | +- **Localization** — new `localization` prop replaces the three separate option props (`columnFilterOptions`, `expandableRowsOptions`, and pagination aria-label fields on `paginationComponentOptions`). Pass a single object to translate every string and aria-label in the table — filter panel, pagination navigation, and expand/collapse buttons. → [Localization docs](/docs/localization) |
| 25 | +- **Built-in locales** — import pre-built translations from the `react-data-table-component/locales` subpath. Ships with: English (`en`), French (`fr`), Spanish (`es`), German (`de`), Brazilian Portuguese (`ptBR`), Arabic — Modern Standard (`ar`), Egyptian (`arEG`), Levantine (`arLV`), Hebrew (`he`), Chinese Simplified (`zhCN`), Chinese Traditional (`zhTW`), Japanese (`ja`), Korean (`ko`), Ukrainian (`uk`). Each locale is individually tree-shakeable. |
| 26 | +- New utility exports: `emptyFilterState(type)` and `isFilterActive(filter)`. → [Filtering docs](/docs/filtering#utility-exports) |
| 27 | +- **Removable sorting** — clicking a sortable header now cycles ascending → descending → unsorted, so a sort can be cleared directly from the header. → [Sorting docs](/docs/sorting#removable-sorting) |
| 28 | +- **Multi-column sorting** — new `sortMulti` prop. Ctrl/⌘-click a header to add it to the existing sort; priority follows click order and a numbered badge marks each sorted column. `onSort` gains a fourth `sortColumns` argument with the full sort config, and the new `SortColumn<T>` type is exported. → [Sorting docs](/docs/sorting#multi-column-sorting) |
| 29 | + |
| 30 | +### Behavior changes |
| 31 | + |
| 32 | +- A third click on a sorted header now *removes* the sort (previously it stayed descending). When the sort is cleared, `onSort` fires with an empty primary column and an empty `sortColumns` array — server-side handlers should treat this as "no sort" and drop their `ORDER BY`. The existing three-argument `onSort` usage is unaffected; the fourth argument is additive. |
| 33 | + |
| 34 | +### Deprecations |
| 35 | + |
| 36 | +The following will continue to work in 8.x but will be removed in v9. TypeScript will show a deprecation hint. |
| 37 | + |
| 38 | +- `columnFilterOptions` prop — use `localization` with a `filter` key instead. |
| 39 | +- `expandableRowsOptions` prop — use `localization` with an `expandable` key instead. |
| 40 | +- Pagination aria-label fields on `paginationComponentOptions` (`navigationAriaLabel`, `firstPageAriaLabel`, `previousPageAriaLabel`, `nextPageAriaLabel`, `lastPageAriaLabel`) — use `localization` with a `pagination` key instead. |
| 41 | +- `ColumnFilterOptions` and `ExpandableRowsOptions` types — use `Localization['filter']` and `Localization['expandable']` instead. |
| 42 | + |
| 43 | +--- |
| 44 | + |
| 45 | +## 8.2.0 |
| 46 | + |
| 47 | +### New features |
| 48 | + |
| 49 | +- `paginationPosition` — controls where the pagination bar renders. Accepts `'bottom'` (default), `'top'`, or `'both'`. → [Pagination docs](/docs/pagination#pagination-position) |
| 50 | +- `paginationPage` — controlled active-page prop. Set it to navigate programmatically (e.g. reset to page 1 after a filter change). Use with `onChangePage` to keep in sync. → [API reference](/docs/api#pagination) |
| 51 | +- Built-in **footer row** for totals, averages, and other summary cells. Declare per-column with the new `footer` field (`ReactNode` or `(rows) => ReactNode`) or replace the whole row with `footerComponent`. Footer cells respect column widths, alignment, and pinning automatically. → [Footer docs](/docs/footer) |
| 52 | +- **Pagination button aria-labels** — "First Page", "Previous Page", "Next Page", and "Last Page" are now configurable via `paginationComponentOptions`, enabling proper i18n for screen readers. |
| 53 | +- `ref.clearSort()` — new `DataTableHandle` method to programmatically reset sort back to its default state, or unsorted if no defaults are set. → [Sorting docs](/docs/sorting#resetting-sort-programmatically) |
| 54 | +- **Sortable column indicator** — sortable columns now show a faint sort icon at reduced opacity so users can discover which columns are sortable before clicking. The inactive opacity is themable via `--rdt-sort-icon-inactive-opacity` (default `0.3`). |
| 55 | +- `onScroll` — new prop that fires whenever the table's scroll wrapper scrolls. Receives the native `React.UIEvent<HTMLDivElement>`. |
| 56 | + |
| 57 | +### Bug fixes |
| 58 | + |
| 59 | +- Fixed column reordering bypassing `reorder={false}` when a cell's text was selected via double-click and then dragged. |
| 60 | + |
| 61 | +--- |
| 62 | + |
| 63 | +## 8.1.0 |
| 64 | + |
| 65 | +### New features |
| 66 | + |
| 67 | +- Inline editing now supports `number`, `date`, `checkbox`, and `custom` editor types. New column-level `validate` hook gates the edit before `onCellEdit` fires. → [Inline editing](/docs/inline-editing) |
| 68 | +- Shift-click range selection on row checkboxes. Enabled by default — opt out with `selectableRowsRange={false}`. New `selectedRows` prop drives controlled selection. → [Row selection](/docs/selection) |
| 69 | +- New headless export hook `useTableExport`: build CSV/JSON, trigger a download, or copy to clipboard. → [Export](/docs/export) |
| 70 | + |
| 71 | +### Bug fixes & polish |
| 72 | + |
| 73 | +- Expandable row open/close animation now works correctly. Switched from a `max-height` tween to the CSS grid `grid-template-rows: 0fr → 1fr` trick. Close animation added — the row stays mounted while animating out, then unmounts. Both directions respect `animateRows` and `prefers-reduced-motion`. |
| 74 | +- Fixed `useLayoutEffect` SSR warning in Next.js App Router and Astro SSR modes. |
| 75 | +- Inline editing: added CSS for `checkbox` and `custom` editor types, and validation error tooltip styles (`.rdt_cellEditError`, `.rdt_editErrorTip`). |
| 76 | + |
| 77 | +--- |
| 78 | + |
| 79 | +## v8 |
| 80 | + |
| 81 | +v8 is a full rewrite around a headless hook architecture. Every major feature is composable and usable independently of `<DataTable>`. See the [migration guide](/docs/migration) for breaking changes from v7. |
| 82 | + |
| 83 | +### Headline features |
| 84 | + |
| 85 | +- Column pinning (`pinned: 'left' | 'right'`) with cascading sticky offsets, custom pinned scrollbar, and full compatibility with resize/reorder/fixed-header. |
| 86 | +- Inline cell editing (`editable` + `onCellEdit`). |
| 87 | +- Per-column filtering with structured operators (`filterable`, `filterType`, controlled `filterValues`). |
| 88 | +- Column groups (`columnGroups`): span labels across adjacent columns. Drag-to-reorder entire groups as a unit. |
| 89 | +- Drag-to-reorder columns and column groups (`reorder: true`, `onColumnOrderChange`). |
| 90 | +- Column visibility hook (`useColumnVisibility`) for show/hide pickers. |
| 91 | +- Resizable columns (`resizable`): handle straddles the column boundary, 6 px hit area, 40 px hard floor. |
| 92 | +- Column separators: `columnSeparator` and `headerSeparator` with `"subtle"` / `"full"` variants. |
| 93 | +- Row animations (`animateRows`): staggered entrance + sort transitions, respects `prefers-reduced-motion`. |
| 94 | +- Improved loading state: skeleton on first load, dimmed overlay + spinner on refetch. |
| 95 | +- Imperative ref API: `ref.current?.clearSelectedRows()`. The `clearSelectedRows` prop is deprecated. |
| 96 | +- New row events: `onRowMiddleClicked`, `onRowMouseEnter`, `onRowMouseLeave`. |
| 97 | +- Dark mode support via `colorMode` ("light", "dark", "auto"). |
| 98 | +- Headless hooks exported: `useColumns`, `useTableState`, `useTableData`, `useColumnFilter`, `useColumnVisibility`. |
| 99 | +- New theme: `crisp`. Refactored theme system around CSS variables (`createTheme`). |
| 100 | + |
| 101 | +### Architecture changes |
| 102 | + |
| 103 | +- Replaced styled-components with CSS variables and a single stylesheet. No more runtime CS -in-JS. Smaller bundle, faster first render. |
| 104 | +- All visual defaults live in `DataTable.css` as `--rdt-*` custom properties. |
| 105 | +- Row separators are drawn at the cell level (`.rdt_cellBase`) instead of the row container. Fixes a long-standing issue where the separator scrolled with content past pinned columns. |
| 106 | +- System column width (checkbox/expander) is now controlled by `--rdt-system-col-width`. Themes can override it and pinning offsets stay aligned. |
| 107 | + |
| 108 | +### Breaking changes from v7 |
| 109 | + |
| 110 | +- v8 ships its own CSS. No `import 'react-data-table-component/dist/index.css'` required, and styled-components overrides will not apply. Use the new theme system or `customStyles`. |
| 111 | +- `clearSelectedRows` prop deprecated in favor of `ref.current.clearSelectedRows()`. |
| 112 | +- Several renamed props and removed legacy options. See [migration guide](/docs/migration). |
| 113 | + |
| 114 | +--- |
| 115 | + |
| 116 | +## v7 (legacy) |
| 117 | + |
| 118 | +v7 is no longer actively developed. Docs remain at [v7.reactdatatable.com](https://v7.reactdatatable.com). |
| 119 | + |
| 120 | +If you're upgrading, the [migration guide](/docs/migration) covers the breaking changes and rename mappings. |
0 commit comments