diff --git a/.changeset/famous-mice-explode.md b/.changeset/famous-mice-explode.md new file mode 100644 index 0000000..6e642f8 --- /dev/null +++ b/.changeset/famous-mice-explode.md @@ -0,0 +1,5 @@ +--- +"@openfun/cunningham-react": patch +--- + +fix DataGrid selection checkbox rerendering diff --git a/packages/react/src/components/DataGrid/index.tsx b/packages/react/src/components/DataGrid/index.tsx index 4476f01..65477f2 100644 --- a/packages/react/src/components/DataGrid/index.tsx +++ b/packages/react/src/components/DataGrid/index.tsx @@ -12,12 +12,14 @@ import { Pagination, PaginationProps } from ":/components/Pagination"; import { useCunningham } from ":/components/Provider"; import { Loader } from ":/components/Loader"; import { + HEADER_ID_SELECT, paginationToPaginationState, sortingStateToSortModel, sortModelToSortingState, useHeadlessColumns, } from ":/components/DataGrid/utils"; import emptyImageUrl from ":/components/DataGrid/empty.svg"; +import { Checkbox } from ":/components/Forms/Checkbox"; export interface Row extends Record { id: string; @@ -208,7 +210,7 @@ export const DataGrid = ({ colSpan={header.colSpan} className={classNames({ "c__datagrid__header--select": - header.id === "select", + header.id === HEADER_ID_SELECT, })} style={style} > @@ -230,9 +232,22 @@ export const DataGrid = ({ } : {})} > - {flexRender( - header.column.columnDef.header, - header.getContext(), + {/* We cant use flexRender for select header because it triggers a re-render each time */} + {/* a row is selected or unselected, re-triggering the animation each time, which looks buggy. */} + {header.id === HEADER_ID_SELECT ? ( + + ) : ( + flexRender( + header.column.columnDef.header, + header.getContext(), + ) )} {header.column.getIsSorted() === "asc" && ( diff --git a/packages/react/src/components/DataGrid/utils.tsx b/packages/react/src/components/DataGrid/utils.tsx index 574b0b0..c72009a 100644 --- a/packages/react/src/components/DataGrid/utils.tsx +++ b/packages/react/src/components/DataGrid/utils.tsx @@ -11,6 +11,8 @@ import { PaginationProps } from ":/components/Pagination"; import { BaseProps, Column, Row, SortModel } from ":/components/DataGrid/index"; import { useCunningham } from ":/components/Provider"; +export const HEADER_ID_SELECT = "cunningham-select"; + /** * Converts Cunningham's columns to the underlying tanstack table. */ @@ -47,15 +49,8 @@ export const useHeadlessColumns = ({ if (enableRowSelection) { headlessColumns = [ columnHelper.display({ - id: "select", - header: ({ table }) => ( - - ), + id: HEADER_ID_SELECT, + header: () => null, cell: ({ row }) => (