fix(ui): Disable select cells if the row cannot be selected (#11442)

This commit is contained in:
Kasper Fabricius Kristensen
2025-03-20 11:52:07 +01:00
committed by GitHub
parent 98e630bce5
commit c40fb01d92
4 changed files with 61 additions and 38 deletions
+5
View File
@@ -0,0 +1,5 @@
---
"@medusajs/ui": patch
---
fix(ui): Disable select cells if the row cannot be selected
@@ -1,6 +1,9 @@
"use client" "use client"
import type { DataTableCellContext, DataTableHeaderContext } from "@/blocks/data-table/types" import type {
DataTableCellContext,
DataTableHeaderContext,
} from "@/blocks/data-table/types"
import { Checkbox, CheckboxCheckedState } from "@/components/checkbox" import { Checkbox, CheckboxCheckedState } from "@/components/checkbox"
import * as React from "react" import * as React from "react"
@@ -8,15 +11,19 @@ interface DataTableSelectCellProps<TData> {
ctx: DataTableCellContext<TData, unknown> ctx: DataTableCellContext<TData, unknown>
} }
const DataTableSelectCell = <TData,>(props: DataTableSelectCellProps<TData>) => { const DataTableSelectCell = <TData,>(
props: DataTableSelectCellProps<TData>
) => {
const checked = props.ctx.row.getIsSelected() const checked = props.ctx.row.getIsSelected()
const onChange = props.ctx.row.getToggleSelectedHandler() const onChange = props.ctx.row.getToggleSelectedHandler()
const disabled = !props.ctx.row.getCanSelect()
return ( return (
<Checkbox <Checkbox
onClick={(e) => e.stopPropagation()} onClick={(e) => e.stopPropagation()}
checked={checked} checked={checked}
onCheckedChange={onChange} onCheckedChange={onChange}
disabled={disabled}
/> />
) )
} }
@@ -26,7 +33,9 @@ interface DataTableSelectHeaderProps<TData> {
ctx: DataTableHeaderContext<TData, unknown> ctx: DataTableHeaderContext<TData, unknown>
} }
const DataTableSelectHeader = <TData,>(props: DataTableSelectHeaderProps<TData>) => { const DataTableSelectHeader = <TData,>(
props: DataTableSelectHeaderProps<TData>
) => {
const checked = props.ctx.table.getIsSomePageRowsSelected() const checked = props.ctx.table.getIsSomePageRowsSelected()
? "indeterminate" ? "indeterminate"
: props.ctx.table.getIsAllPageRowsSelected() : props.ctx.table.getIsAllPageRowsSelected()
@@ -34,16 +43,19 @@ const DataTableSelectHeader = <TData,>(props: DataTableSelectHeaderProps<TData>)
const onChange = (checked: CheckboxCheckedState) => { const onChange = (checked: CheckboxCheckedState) => {
props.ctx.table.toggleAllPageRowsSelected(!!checked) props.ctx.table.toggleAllPageRowsSelected(!!checked)
} }
const disabled = !props.ctx.table
.getRowModel()
.rows.some((row) => row.getCanSelect())
return ( return (
<Checkbox <Checkbox
onClick={(e) => e.stopPropagation()} onClick={(e) => e.stopPropagation()}
checked={checked} checked={checked}
onCheckedChange={onChange} onCheckedChange={onChange}
disabled={disabled}
/> />
) )
} }
export { DataTableSelectCell, DataTableSelectHeader } export { DataTableSelectCell, DataTableSelectHeader }
export type { DataTableSelectCellProps, DataTableSelectHeaderProps } export type { DataTableSelectCellProps, DataTableSelectHeaderProps }
@@ -247,29 +247,29 @@ const columns = [
const actions = [ const actions = [
[ [
{ {
label: "Edit", label: "Edit",
onClick: () => {}, onClick: () => {},
icon: <PencilSquare />, icon: <PencilSquare />,
}, },
{ {
label: "Edit", label: "Edit",
onClick: () => {}, onClick: () => {},
icon: <PencilSquare />, icon: <PencilSquare />,
}, },
{ {
label: "Edit", label: "Edit",
onClick: () => {}, onClick: () => {},
icon: <PencilSquare />, icon: <PencilSquare />,
}, },
], ],
[ [
{ {
label: "Delete", label: "Delete",
onClick: () => {}, onClick: () => {},
icon: <Trash />, icon: <Trash />,
}, },
], ],
] ]
return actions return actions
}, },
@@ -419,6 +419,7 @@ const KitchenSinkDemo = () => {
rowSelection: { rowSelection: {
state: rowSelection, state: rowSelection,
onRowSelectionChange: setRowSelection, onRowSelectionChange: setRowSelection,
enableRowSelection: (row) => Number(row.original.id) > 4,
}, },
sorting: { sorting: {
state: sorting, state: sorting,
@@ -9,8 +9,8 @@ import {
type TableOptions, type TableOptions,
type Updater, type Updater,
useReactTable, useReactTable,
} from "@tanstack/react-table"; } from "@tanstack/react-table"
import * as React from "react"; import * as React from "react"
import { import {
DataTableColumnDef, DataTableColumnDef,
DataTableColumnFilter, DataTableColumnFilter,
@@ -24,14 +24,14 @@ import {
DataTableRow, DataTableRow,
DataTableRowSelectionState, DataTableRowSelectionState,
DataTableSortingState, DataTableSortingState,
} from "./types"; } from "./types"
interface DataTableOptions<TData> interface DataTableOptions<TData>
extends Pick<TableOptions<TData>, "data" | "getRowId"> { extends Pick<TableOptions<TData>, "data" | "getRowId"> {
/** /**
* The columns to use for the table. * The columns to use for the table.
*/ */
columns: DataTableColumnDef<TData, any>[]; columns: DataTableColumnDef<TData, any>[]
/** /**
* The filters which the user can apply to the table. * The filters which the user can apply to the table.
*/ */
@@ -57,7 +57,10 @@ interface DataTableOptions<TData>
rowSelection?: { rowSelection?: {
state: DataTableRowSelectionState state: DataTableRowSelectionState
onRowSelectionChange: (state: DataTableRowSelectionState) => void onRowSelectionChange: (state: DataTableRowSelectionState) => void
enableRowSelection?: boolean | ((row: DataTableRow<TData>) => boolean) | undefined enableRowSelection?:
| boolean
| ((row: DataTableRow<TData>) => boolean)
| undefined
} }
/** /**
* The state and callback for the sorting. * The state and callback for the sorting.
@@ -172,7 +175,11 @@ const useDataTable = <TData,>({
const { state: sortingState, onSortingChange } = sorting ?? {} const { state: sortingState, onSortingChange } = sorting ?? {}
const { state: filteringState, onFilteringChange } = filtering ?? {} const { state: filteringState, onFilteringChange } = filtering ?? {}
const { state: paginationState, onPaginationChange } = pagination ?? {} const { state: paginationState, onPaginationChange } = pagination ?? {}
const { state: rowSelectionState, onRowSelectionChange, enableRowSelection } = rowSelection ?? {} const {
state: rowSelectionState,
onRowSelectionChange,
enableRowSelection,
} = rowSelection ?? {}
const autoResetPageIndexHandler = React.useCallback(() => { const autoResetPageIndexHandler = React.useCallback(() => {
return autoResetPageIndex return autoResetPageIndex
@@ -197,7 +204,6 @@ const useDataTable = <TData,>({
const rowSelectionStateHandler = React.useCallback(() => { const rowSelectionStateHandler = React.useCallback(() => {
return onRowSelectionChange return onRowSelectionChange
? (updaterOrValue: Updater<RowSelectionState>) => { ? (updaterOrValue: Updater<RowSelectionState>) => {
autoResetPageIndexHandler()?.()
onRowSelectionChangeTransformer( onRowSelectionChangeTransformer(
onRowSelectionChange, onRowSelectionChange,
rowSelectionState rowSelectionState
@@ -531,6 +537,5 @@ function onPaginationChangeTransformer(
} }
} }
export { useDataTable }; export { useDataTable }
export type { DataTableOptions, UseDataTableReturn }; export type { DataTableOptions, UseDataTableReturn }