fix(ui): Disable select cells if the row cannot be selected (#11442)
This commit is contained in:
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
"@medusajs/ui": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
fix(ui): Disable select cells if the row cannot be selected
|
||||||
+16
-4
@@ -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 }
|
||||||
|
|
||||||
|
|||||||
@@ -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 }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user