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

View File

@@ -0,0 +1,5 @@
---
"@medusajs/ui": patch
---
fix(ui): Disable select cells if the row cannot be selected

View File

@@ -1,6 +1,9 @@
"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 * as React from "react"
@@ -8,15 +11,19 @@ interface DataTableSelectCellProps<TData> {
ctx: DataTableCellContext<TData, unknown>
}
const DataTableSelectCell = <TData,>(props: DataTableSelectCellProps<TData>) => {
const DataTableSelectCell = <TData,>(
props: DataTableSelectCellProps<TData>
) => {
const checked = props.ctx.row.getIsSelected()
const onChange = props.ctx.row.getToggleSelectedHandler()
const disabled = !props.ctx.row.getCanSelect()
return (
<Checkbox
onClick={(e) => e.stopPropagation()}
checked={checked}
onCheckedChange={onChange}
disabled={disabled}
/>
)
}
@@ -26,7 +33,9 @@ interface DataTableSelectHeaderProps<TData> {
ctx: DataTableHeaderContext<TData, unknown>
}
const DataTableSelectHeader = <TData,>(props: DataTableSelectHeaderProps<TData>) => {
const DataTableSelectHeader = <TData,>(
props: DataTableSelectHeaderProps<TData>
) => {
const checked = props.ctx.table.getIsSomePageRowsSelected()
? "indeterminate"
: props.ctx.table.getIsAllPageRowsSelected()
@@ -34,16 +43,19 @@ const DataTableSelectHeader = <TData,>(props: DataTableSelectHeaderProps<TData>)
const onChange = (checked: CheckboxCheckedState) => {
props.ctx.table.toggleAllPageRowsSelected(!!checked)
}
const disabled = !props.ctx.table
.getRowModel()
.rows.some((row) => row.getCanSelect())
return (
<Checkbox
onClick={(e) => e.stopPropagation()}
checked={checked}
onCheckedChange={onChange}
disabled={disabled}
/>
)
}
export { DataTableSelectCell, DataTableSelectHeader }
export type { DataTableSelectCellProps, DataTableSelectHeaderProps }

View File

@@ -247,29 +247,29 @@ const columns = [
const actions = [
[
{
label: "Edit",
onClick: () => {},
icon: <PencilSquare />,
},
{
label: "Edit",
onClick: () => {},
icon: <PencilSquare />,
},
{
label: "Edit",
onClick: () => {},
icon: <PencilSquare />,
},
],
[
{
label: "Delete",
onClick: () => {},
icon: <Trash />,
},
],
]
label: "Edit",
onClick: () => {},
icon: <PencilSquare />,
},
{
label: "Edit",
onClick: () => {},
icon: <PencilSquare />,
},
{
label: "Edit",
onClick: () => {},
icon: <PencilSquare />,
},
],
[
{
label: "Delete",
onClick: () => {},
icon: <Trash />,
},
],
]
return actions
},
@@ -419,6 +419,7 @@ const KitchenSinkDemo = () => {
rowSelection: {
state: rowSelection,
onRowSelectionChange: setRowSelection,
enableRowSelection: (row) => Number(row.original.id) > 4,
},
sorting: {
state: sorting,

View File

@@ -9,8 +9,8 @@ import {
type TableOptions,
type Updater,
useReactTable,
} from "@tanstack/react-table";
import * as React from "react";
} from "@tanstack/react-table"
import * as React from "react"
import {
DataTableColumnDef,
DataTableColumnFilter,
@@ -24,14 +24,14 @@ import {
DataTableRow,
DataTableRowSelectionState,
DataTableSortingState,
} from "./types";
} from "./types"
interface DataTableOptions<TData>
extends Pick<TableOptions<TData>, "data" | "getRowId"> {
extends Pick<TableOptions<TData>, "data" | "getRowId"> {
/**
* 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.
*/
@@ -57,7 +57,10 @@ interface DataTableOptions<TData>
rowSelection?: {
state: DataTableRowSelectionState
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.
@@ -172,7 +175,11 @@ const useDataTable = <TData,>({
const { state: sortingState, onSortingChange } = sorting ?? {}
const { state: filteringState, onFilteringChange } = filtering ?? {}
const { state: paginationState, onPaginationChange } = pagination ?? {}
const { state: rowSelectionState, onRowSelectionChange, enableRowSelection } = rowSelection ?? {}
const {
state: rowSelectionState,
onRowSelectionChange,
enableRowSelection,
} = rowSelection ?? {}
const autoResetPageIndexHandler = React.useCallback(() => {
return autoResetPageIndex
@@ -197,7 +204,6 @@ const useDataTable = <TData,>({
const rowSelectionStateHandler = React.useCallback(() => {
return onRowSelectionChange
? (updaterOrValue: Updater<RowSelectionState>) => {
autoResetPageIndexHandler()?.()
onRowSelectionChangeTransformer(
onRowSelectionChange,
rowSelectionState
@@ -531,6 +537,5 @@ function onPaginationChangeTransformer(
}
}
export { useDataTable };
export type { DataTableOptions, UseDataTableReturn };
export { useDataTable }
export type { DataTableOptions, UseDataTableReturn }