🐛(react) fix DataGrid selection checkbox rerendering

Each time a row was select or unselect the checkbox was re-triggering
its animation, which looked buggy.

Fixes #37
This commit is contained in:
Nathan Vasse
2024-03-12 16:44:26 +01:00
committed by NathanVss
parent 20f5bb703b
commit b4a6367bce
3 changed files with 28 additions and 13 deletions

View File

@@ -0,0 +1,5 @@
---
"@openfun/cunningham-react": patch
---
fix DataGrid selection checkbox rerendering

View File

@@ -12,12 +12,14 @@ import { Pagination, PaginationProps } from ":/components/Pagination";
import { useCunningham } from ":/components/Provider"; import { useCunningham } from ":/components/Provider";
import { Loader } from ":/components/Loader"; import { Loader } from ":/components/Loader";
import { import {
HEADER_ID_SELECT,
paginationToPaginationState, paginationToPaginationState,
sortingStateToSortModel, sortingStateToSortModel,
sortModelToSortingState, sortModelToSortingState,
useHeadlessColumns, useHeadlessColumns,
} from ":/components/DataGrid/utils"; } from ":/components/DataGrid/utils";
import emptyImageUrl from ":/components/DataGrid/empty.svg"; import emptyImageUrl from ":/components/DataGrid/empty.svg";
import { Checkbox } from ":/components/Forms/Checkbox";
export interface Row extends Record<string, any> { export interface Row extends Record<string, any> {
id: string; id: string;
@@ -208,7 +210,7 @@ export const DataGrid = <T extends Row>({
colSpan={header.colSpan} colSpan={header.colSpan}
className={classNames({ className={classNames({
"c__datagrid__header--select": "c__datagrid__header--select":
header.id === "select", header.id === HEADER_ID_SELECT,
})} })}
style={style} style={style}
> >
@@ -230,9 +232,22 @@ export const DataGrid = <T extends Row>({
} }
: {})} : {})}
> >
{flexRender( {/* We cant use flexRender for select header because it triggers a re-render each time */}
header.column.columnDef.header, {/* a row is selected or unselected, re-triggering the animation each time, which looks buggy. */}
header.getContext(), {header.id === HEADER_ID_SELECT ? (
<Checkbox
checked={table.getIsAllRowsSelected()}
indeterminate={table.getIsSomeRowsSelected()}
onChange={table.getToggleAllRowsSelectedHandler()}
aria-label={t(
"components.datagrid.rows_selection_aria",
)}
/>
) : (
flexRender(
header.column.columnDef.header,
header.getContext(),
)
)} )}
{header.column.getIsSorted() === "asc" && ( {header.column.getIsSorted() === "asc" && (
<span className="material-icons"> <span className="material-icons">

View File

@@ -11,6 +11,8 @@ import { PaginationProps } from ":/components/Pagination";
import { BaseProps, Column, Row, SortModel } from ":/components/DataGrid/index"; import { BaseProps, Column, Row, SortModel } from ":/components/DataGrid/index";
import { useCunningham } from ":/components/Provider"; import { useCunningham } from ":/components/Provider";
export const HEADER_ID_SELECT = "cunningham-select";
/** /**
* Converts Cunningham's columns to the underlying tanstack table. * Converts Cunningham's columns to the underlying tanstack table.
*/ */
@@ -47,15 +49,8 @@ export const useHeadlessColumns = <T extends Row>({
if (enableRowSelection) { if (enableRowSelection) {
headlessColumns = [ headlessColumns = [
columnHelper.display({ columnHelper.display({
id: "select", id: HEADER_ID_SELECT,
header: ({ table }) => ( header: () => null,
<Checkbox
checked={table.getIsAllRowsSelected()}
indeterminate={table.getIsSomeRowsSelected()}
onChange={table.getToggleAllRowsSelectedHandler()}
aria-label={t("components.datagrid.rows_selection_aria")}
/>
),
cell: ({ row }) => ( cell: ({ row }) => (
<Checkbox <Checkbox
checked={row.getIsSelected()} checked={row.getIsSelected()}