🐛(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:
5
.changeset/famous-mice-explode.md
Normal file
5
.changeset/famous-mice-explode.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
"@openfun/cunningham-react": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
fix DataGrid selection checkbox rerendering
|
||||||
@@ -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 */}
|
||||||
|
{/* a row is selected or unselected, re-triggering the animation each time, which looks buggy. */}
|
||||||
|
{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.column.columnDef.header,
|
||||||
header.getContext(),
|
header.getContext(),
|
||||||
|
)
|
||||||
)}
|
)}
|
||||||
{header.column.getIsSorted() === "asc" && (
|
{header.column.getIsSorted() === "asc" && (
|
||||||
<span className="material-icons">
|
<span className="material-icons">
|
||||||
|
|||||||
@@ -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()}
|
||||||
|
|||||||
Reference in New Issue
Block a user