@ceed/ads 1.7.3 → 1.7.4-next.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -140,6 +140,13 @@ export type DataTableProps<T extends Record<PropertyKey, any>, GetId extends ((r
140
140
  * MUI에는 없는 인터페이스지만 Total Select 기능이 추가되었기 때문에 추가해야했다.
141
141
  */
142
142
  isTotalSelected?: boolean) => void;
143
+ /**
144
+ * row별로 선택 가능 여부를 결정하는 함수
145
+ */
146
+ isRowSelectable?: (params: {
147
+ row: T;
148
+ id: InferredIdType<T, GetId>;
149
+ }) => boolean;
143
150
  disableSelectionOnClick?: boolean;
144
151
  initialState?: Partial<{
145
152
  sorting: Partial<{
package/dist/index.cjs CHANGED
@@ -3522,7 +3522,8 @@ function useDataTableRenderer({
3522
3522
  onSelectionModelChange,
3523
3523
  editMode,
3524
3524
  getId: _getId,
3525
- isTotalSelected: _isTotalSelected
3525
+ isTotalSelected: _isTotalSelected,
3526
+ isRowSelectable
3526
3527
  }) {
3527
3528
  const [focusedRowId, setFocusedRowId] = (0, import_react25.useState)(null);
3528
3529
  const [sortModel, setSortModel] = useControlledState(
@@ -3598,14 +3599,27 @@ function useDataTableRenderer({
3598
3599
  () => !pagination || paginationMode === "server" ? rows : rows.slice((page - 1) * pageSize, (page - 1) * pageSize + pageSize),
3599
3600
  [rows, page, pageSize, paginationMode, pagination]
3600
3601
  );
3602
+ const selectableDataInPage = (0, import_react25.useMemo)(
3603
+ () => dataInPage.filter((row, i) => {
3604
+ if (!isRowSelectable) return true;
3605
+ return isRowSelectable({ row, id: getId(row, i) });
3606
+ }),
3607
+ [dataInPage, isRowSelectable, getId]
3608
+ );
3601
3609
  const isAllSelected = (0, import_react25.useMemo)(
3602
- () => dataInPage.length > 0 && dataInPage.every((row, i) => selectedModelSet.has(getId(row, i))),
3603
- [dataInPage, selectedModelSet, getId]
3610
+ () => selectableDataInPage.length > 0 && selectableDataInPage.every(
3611
+ (row, i) => selectedModelSet.has(getId(row, i))
3612
+ ),
3613
+ [selectableDataInPage, selectedModelSet, getId]
3604
3614
  );
3605
3615
  const rowCount = totalRowsProp || rows.length;
3616
+ const selectableRowCount = (0, import_react25.useMemo)(() => {
3617
+ if (!isRowSelectable) return rowCount;
3618
+ return rows.filter((row, i) => isRowSelectable({ row, id: getId(row, i) })).length;
3619
+ }, [rows, isRowSelectable, getId, rowCount]);
3606
3620
  const isTotalSelected = (0, import_react25.useMemo)(
3607
- () => _isTotalSelected ?? (rowCount > 0 && (selectionModel?.length || 0) === rowCount),
3608
- [_isTotalSelected, selectionModel, rowCount]
3621
+ () => _isTotalSelected ?? (selectableRowCount > 0 && (selectionModel?.length || 0) === selectableRowCount),
3622
+ [_isTotalSelected, selectionModel, selectableRowCount]
3609
3623
  );
3610
3624
  const columnWidths = useColumnWidths(columnsByField);
3611
3625
  const getWidth = (0, import_react25.useCallback)(
@@ -3701,9 +3715,10 @@ function useDataTableRenderer({
3701
3715
  }, [page, rowCount, pageSize, handlePageChange]);
3702
3716
  (0, import_react25.useEffect)(() => {
3703
3717
  onSelectionModelChange?.([]);
3704
- }, [page]);
3718
+ }, [page, onSelectionModelChange]);
3705
3719
  return {
3706
3720
  rowCount,
3721
+ selectableRowCount,
3707
3722
  page,
3708
3723
  pageSize,
3709
3724
  onPaginationModelChange: handlePageChange,
@@ -3719,13 +3734,22 @@ function useDataTableRenderer({
3719
3734
  (model) => selectedModelSet.has(model),
3720
3735
  [selectedModelSet]
3721
3736
  ),
3737
+ isRowSelectable: (0, import_react25.useCallback)(
3738
+ (rowId, row) => {
3739
+ if (!isRowSelectable) return true;
3740
+ return isRowSelectable({ row, id: rowId });
3741
+ },
3742
+ [isRowSelectable]
3743
+ ),
3722
3744
  focusedRowId,
3723
3745
  onRowFocus: (0, import_react25.useCallback)((rowId) => {
3724
3746
  setFocusedRowId(rowId);
3725
3747
  }, []),
3726
3748
  onAllCheckboxChange: (0, import_react25.useCallback)(() => {
3727
- onSelectionModelChange?.(isAllSelected ? [] : dataInPage.map(getId));
3728
- }, [isAllSelected, dataInPage, onSelectionModelChange, getId]),
3749
+ onSelectionModelChange?.(
3750
+ isAllSelected ? [] : selectableDataInPage.map(getId)
3751
+ );
3752
+ }, [isAllSelected, selectableDataInPage, onSelectionModelChange, getId]),
3729
3753
  onCheckboxChange: (0, import_react25.useCallback)(
3730
3754
  (event, selectedModel) => {
3731
3755
  if (selectedModelSet.has(selectedModel)) {
@@ -3742,11 +3766,15 @@ function useDataTableRenderer({
3742
3766
  ),
3743
3767
  columns,
3744
3768
  onTotalSelect: (0, import_react25.useCallback)(() => {
3769
+ const selectableRows = rows.filter((row, i) => {
3770
+ if (!isRowSelectable) return true;
3771
+ return isRowSelectable({ row, id: getId(row, i) });
3772
+ });
3745
3773
  onSelectionModelChange?.(
3746
- isTotalSelected ? [] : rows.map(getId),
3774
+ isTotalSelected ? [] : selectableRows.map(getId),
3747
3775
  !isTotalSelected
3748
3776
  );
3749
- }, [isTotalSelected, rows, onSelectionModelChange, getId])
3777
+ }, [isTotalSelected, rows, onSelectionModelChange, getId, isRowSelectable])
3750
3778
  };
3751
3779
  }
3752
3780
  function Component(props, apiRef) {
@@ -3756,6 +3784,7 @@ function Component(props, apiRef) {
3756
3784
  editMode,
3757
3785
  selectionModel,
3758
3786
  onSelectionModelChange,
3787
+ isRowSelectable,
3759
3788
  disableSelectionOnClick,
3760
3789
  onRowClick,
3761
3790
  pinnedColumns,
@@ -3803,10 +3832,12 @@ function Component(props, apiRef) {
3803
3832
  columns,
3804
3833
  isAllSelected,
3805
3834
  isSelectedRow,
3835
+ isRowSelectable: isRowSelectableCheck,
3806
3836
  onAllCheckboxChange,
3807
3837
  onCheckboxChange,
3808
3838
  getId,
3809
3839
  rowCount,
3840
+ selectableRowCount,
3810
3841
  page,
3811
3842
  pageSize,
3812
3843
  onPaginationModelChange,
@@ -3832,9 +3863,15 @@ function Component(props, apiRef) {
3832
3863
  const getRowClickHandler = (0, import_react25.useCallback)(
3833
3864
  (row, rowId) => (e) => {
3834
3865
  onRowClick?.({ row, rowId }, e);
3835
- checkboxSelection && !disableSelectionOnClick && onCheckboxChange(e, rowId);
3866
+ checkboxSelection && !disableSelectionOnClick && isRowSelectableCheck(rowId, row) && onCheckboxChange(e, rowId);
3836
3867
  },
3837
- [onRowClick, checkboxSelection, disableSelectionOnClick, onCheckboxChange]
3868
+ [
3869
+ onRowClick,
3870
+ checkboxSelection,
3871
+ disableSelectionOnClick,
3872
+ onCheckboxChange,
3873
+ isRowSelectableCheck
3874
+ ]
3838
3875
  );
3839
3876
  const getRowFocusHandler = (0, import_react25.useCallback)(
3840
3877
  (rowId) => () => {
@@ -3849,10 +3886,12 @@ function Component(props, apiRef) {
3849
3886
  []
3850
3887
  );
3851
3888
  const getCheckboxChangeHandler = (0, import_react25.useCallback)(
3852
- (rowId) => (e) => {
3853
- onCheckboxChange(e, rowId);
3889
+ (rowId, row) => (e) => {
3890
+ if (isRowSelectableCheck(rowId, row)) {
3891
+ onCheckboxChange(e, rowId);
3892
+ }
3854
3893
  },
3855
- [onCheckboxChange]
3894
+ [onCheckboxChange, isRowSelectableCheck]
3856
3895
  );
3857
3896
  (0, import_react25.useImperativeHandle)(apiRef, () => ({
3858
3897
  getRowIndexRelativeToVisibleRows(rowId) {
@@ -3890,7 +3929,7 @@ function Component(props, apiRef) {
3890
3929
  justifyContent: "space-between",
3891
3930
  alignItems: "center"
3892
3931
  },
3893
- !!checkboxSelection && /* @__PURE__ */ import_react25.default.createElement(Stack_default, { direction: "row", spacing: 1 }, !isAllSelected && /* @__PURE__ */ import_react25.default.createElement(Typography_default, { level: "body-xs" }, numberFormatter(selectionModel?.length || 0), " items selected"), isAllSelected && !isTotalSelected && /* @__PURE__ */ import_react25.default.createElement(Stack_default, { direction: "row", spacing: 1, alignItems: "center" }, /* @__PURE__ */ import_react25.default.createElement(Typography_default, { level: "body-xs" }, "All ", numberFormatter(selectionModel?.length || 0), " items on this page are selected."), /* @__PURE__ */ import_react25.default.createElement(Button_default, { size: "sm", variant: "plain", onClick: onTotalSelect }, "Select all ", numberFormatter(rowCount ?? rows.length), " items")), isTotalSelected && /* @__PURE__ */ import_react25.default.createElement(Stack_default, { direction: "row", spacing: 1, alignItems: "center" }, /* @__PURE__ */ import_react25.default.createElement(Typography_default, { level: "body-xs" }, "All ", numberFormatter(rowCount ?? rows.length), " items are selected."), /* @__PURE__ */ import_react25.default.createElement(
3932
+ !!checkboxSelection && /* @__PURE__ */ import_react25.default.createElement(Stack_default, { direction: "row", spacing: 1 }, !isAllSelected && /* @__PURE__ */ import_react25.default.createElement(Typography_default, { level: "body-xs" }, numberFormatter(selectionModel?.length || 0), " items selected"), isAllSelected && !isTotalSelected && /* @__PURE__ */ import_react25.default.createElement(Stack_default, { direction: "row", spacing: 1, alignItems: "center" }, /* @__PURE__ */ import_react25.default.createElement(Typography_default, { level: "body-xs" }, "All ", numberFormatter(selectionModel?.length || 0), " items on this page are selected."), /* @__PURE__ */ import_react25.default.createElement(Button_default, { size: "sm", variant: "plain", onClick: onTotalSelect }, "Select all ", numberFormatter(selectableRowCount), " items")), isTotalSelected && /* @__PURE__ */ import_react25.default.createElement(Stack_default, { direction: "row", spacing: 1, alignItems: "center" }, /* @__PURE__ */ import_react25.default.createElement(Typography_default, { level: "body-xs" }, "All ", numberFormatter(selectableRowCount), " items are selected."), /* @__PURE__ */ import_react25.default.createElement(
3894
3933
  Button_default,
3895
3934
  {
3896
3935
  size: "sm",
@@ -3935,6 +3974,7 @@ function Component(props, apiRef) {
3935
3974
  onChange: onAllCheckboxChange,
3936
3975
  checked: isAllSelected,
3937
3976
  indeterminate: (selectionModel || []).length > 0 && !isAllSelected,
3977
+ disabled: dataInPage.length > 0 && !selectableRowCount,
3938
3978
  ...checkboxProps
3939
3979
  }
3940
3980
  )
@@ -4012,8 +4052,9 @@ function Component(props, apiRef) {
4012
4052
  RenderCheckbox,
4013
4053
  {
4014
4054
  onClick: getCheckboxClickHandler(),
4015
- onChange: getCheckboxChangeHandler(rowId),
4055
+ onChange: getCheckboxChangeHandler(rowId, row),
4016
4056
  checked: isSelectedRow(rowId),
4057
+ disabled: !isRowSelectableCheck(rowId, row),
4017
4058
  ...checkboxProps
4018
4059
  }
4019
4060
  )
package/dist/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export { useTheme, useColorScheme, useThemeProps, ButtonGroup, alertClasses, boxClasses, buttonClasses, checkboxClasses, dividerClasses, iconButtonClasses, inputClasses, menuClasses, menuButtonClasses, menuItemClasses, optionClasses, radioClasses, radioGroupClasses, selectClasses, switchClasses, tableClasses, textareaClasses, typographyClasses, formControlClasses, formLabelClasses, formHelperTextClasses, gridClasses, stackClasses, sheetClasses, modalClasses, modalCloseClasses, modalDialogClasses, modalOverflowClasses, dialogTitleClasses, dialogContentClasses, dialogActionsClasses, tooltipClasses, tabsClasses, tabListClasses, tabPanelClasses, accordionClasses, accordionDetailsClasses, accordionGroupClasses as accordionsClasses, accordionSummaryClasses, AutocompleteListbox, AutocompleteOption, autocompleteClasses, autocompleteListboxClasses, autocompleteOptionClasses, avatarClasses, avatarGroupClasses, AspectRatio, aspectRatioClasses, Badge, badgeClasses, breadcrumbsClasses, cardClasses, cardActionsClasses, cardContentClasses, cardCoverClasses, cardOverflowClasses, chipClasses, CircularProgress, circularProgressClasses, Drawer, drawerClasses, LinearProgress, linearProgressClasses, List, listClasses, ListDivider, listDividerClasses, ListItem, listItemClasses, ListItemButton, listItemButtonClasses, ListItemContent, listItemContentClasses, ListItemDecorator, listItemDecoratorClasses, ListSubheader, listSubheaderClasses, Link, linkClasses, Slider, sliderClasses, stepClasses, StepButton, stepButtonClasses, stepperClasses, Skeleton, skeletonClasses, styled, } from "@mui/joy";
2
+ export type { ButtonProps, Theme } from "@mui/joy";
2
3
  export { Accordion, Accordions, Alert, Autocomplete, AccordionDetails, AccordionSummary, Avatar, AvatarGroup, Box, Breadcrumbs, Button, Calendar, Card, CardActions, CardContent, CardCover, CardOverflow, Checkbox, Chip, Container, CssBaseline, CurrencyInput, DataTable, DatePicker, DateRangePicker, DialogActions, DialogContent, DialogTitle, DialogFrame, Divider, Dropdown, extendTheme, InsetDrawer, Uploader, FormControl, FormHelperText, FormLabel, Grid, IconButton, IconMenuButton, InfoSign, Input, Markdown, Menu, MenuButton, MenuItem, Modal, ModalClose, ModalDialog, ModalOverflow, ModalFrame, MonthPicker, MonthRangePicker, PercentageInput, ProfileMenu, Pagination, NavigationGroup, NavigationItem, Navigator, Radio, RadioGroup, RadioList, Select, Option, Sheet, Stack, Step, StepIndicator, Stepper, Switch, theme, Table, TableHead, TableBody, Tabs, Tab, TabList, TabPanel, Textarea, ThemeProvider, Tooltip, Typography, } from "./components";
package/dist/index.js CHANGED
@@ -3479,7 +3479,8 @@ function useDataTableRenderer({
3479
3479
  onSelectionModelChange,
3480
3480
  editMode,
3481
3481
  getId: _getId,
3482
- isTotalSelected: _isTotalSelected
3482
+ isTotalSelected: _isTotalSelected,
3483
+ isRowSelectable
3483
3484
  }) {
3484
3485
  const [focusedRowId, setFocusedRowId] = useState6(null);
3485
3486
  const [sortModel, setSortModel] = useControlledState(
@@ -3555,14 +3556,27 @@ function useDataTableRenderer({
3555
3556
  () => !pagination || paginationMode === "server" ? rows : rows.slice((page - 1) * pageSize, (page - 1) * pageSize + pageSize),
3556
3557
  [rows, page, pageSize, paginationMode, pagination]
3557
3558
  );
3559
+ const selectableDataInPage = useMemo8(
3560
+ () => dataInPage.filter((row, i) => {
3561
+ if (!isRowSelectable) return true;
3562
+ return isRowSelectable({ row, id: getId(row, i) });
3563
+ }),
3564
+ [dataInPage, isRowSelectable, getId]
3565
+ );
3558
3566
  const isAllSelected = useMemo8(
3559
- () => dataInPage.length > 0 && dataInPage.every((row, i) => selectedModelSet.has(getId(row, i))),
3560
- [dataInPage, selectedModelSet, getId]
3567
+ () => selectableDataInPage.length > 0 && selectableDataInPage.every(
3568
+ (row, i) => selectedModelSet.has(getId(row, i))
3569
+ ),
3570
+ [selectableDataInPage, selectedModelSet, getId]
3561
3571
  );
3562
3572
  const rowCount = totalRowsProp || rows.length;
3573
+ const selectableRowCount = useMemo8(() => {
3574
+ if (!isRowSelectable) return rowCount;
3575
+ return rows.filter((row, i) => isRowSelectable({ row, id: getId(row, i) })).length;
3576
+ }, [rows, isRowSelectable, getId, rowCount]);
3563
3577
  const isTotalSelected = useMemo8(
3564
- () => _isTotalSelected ?? (rowCount > 0 && (selectionModel?.length || 0) === rowCount),
3565
- [_isTotalSelected, selectionModel, rowCount]
3578
+ () => _isTotalSelected ?? (selectableRowCount > 0 && (selectionModel?.length || 0) === selectableRowCount),
3579
+ [_isTotalSelected, selectionModel, selectableRowCount]
3566
3580
  );
3567
3581
  const columnWidths = useColumnWidths(columnsByField);
3568
3582
  const getWidth = useCallback9(
@@ -3658,9 +3672,10 @@ function useDataTableRenderer({
3658
3672
  }, [page, rowCount, pageSize, handlePageChange]);
3659
3673
  useEffect5(() => {
3660
3674
  onSelectionModelChange?.([]);
3661
- }, [page]);
3675
+ }, [page, onSelectionModelChange]);
3662
3676
  return {
3663
3677
  rowCount,
3678
+ selectableRowCount,
3664
3679
  page,
3665
3680
  pageSize,
3666
3681
  onPaginationModelChange: handlePageChange,
@@ -3676,13 +3691,22 @@ function useDataTableRenderer({
3676
3691
  (model) => selectedModelSet.has(model),
3677
3692
  [selectedModelSet]
3678
3693
  ),
3694
+ isRowSelectable: useCallback9(
3695
+ (rowId, row) => {
3696
+ if (!isRowSelectable) return true;
3697
+ return isRowSelectable({ row, id: rowId });
3698
+ },
3699
+ [isRowSelectable]
3700
+ ),
3679
3701
  focusedRowId,
3680
3702
  onRowFocus: useCallback9((rowId) => {
3681
3703
  setFocusedRowId(rowId);
3682
3704
  }, []),
3683
3705
  onAllCheckboxChange: useCallback9(() => {
3684
- onSelectionModelChange?.(isAllSelected ? [] : dataInPage.map(getId));
3685
- }, [isAllSelected, dataInPage, onSelectionModelChange, getId]),
3706
+ onSelectionModelChange?.(
3707
+ isAllSelected ? [] : selectableDataInPage.map(getId)
3708
+ );
3709
+ }, [isAllSelected, selectableDataInPage, onSelectionModelChange, getId]),
3686
3710
  onCheckboxChange: useCallback9(
3687
3711
  (event, selectedModel) => {
3688
3712
  if (selectedModelSet.has(selectedModel)) {
@@ -3699,11 +3723,15 @@ function useDataTableRenderer({
3699
3723
  ),
3700
3724
  columns,
3701
3725
  onTotalSelect: useCallback9(() => {
3726
+ const selectableRows = rows.filter((row, i) => {
3727
+ if (!isRowSelectable) return true;
3728
+ return isRowSelectable({ row, id: getId(row, i) });
3729
+ });
3702
3730
  onSelectionModelChange?.(
3703
- isTotalSelected ? [] : rows.map(getId),
3731
+ isTotalSelected ? [] : selectableRows.map(getId),
3704
3732
  !isTotalSelected
3705
3733
  );
3706
- }, [isTotalSelected, rows, onSelectionModelChange, getId])
3734
+ }, [isTotalSelected, rows, onSelectionModelChange, getId, isRowSelectable])
3707
3735
  };
3708
3736
  }
3709
3737
  function Component(props, apiRef) {
@@ -3713,6 +3741,7 @@ function Component(props, apiRef) {
3713
3741
  editMode,
3714
3742
  selectionModel,
3715
3743
  onSelectionModelChange,
3744
+ isRowSelectable,
3716
3745
  disableSelectionOnClick,
3717
3746
  onRowClick,
3718
3747
  pinnedColumns,
@@ -3760,10 +3789,12 @@ function Component(props, apiRef) {
3760
3789
  columns,
3761
3790
  isAllSelected,
3762
3791
  isSelectedRow,
3792
+ isRowSelectable: isRowSelectableCheck,
3763
3793
  onAllCheckboxChange,
3764
3794
  onCheckboxChange,
3765
3795
  getId,
3766
3796
  rowCount,
3797
+ selectableRowCount,
3767
3798
  page,
3768
3799
  pageSize,
3769
3800
  onPaginationModelChange,
@@ -3789,9 +3820,15 @@ function Component(props, apiRef) {
3789
3820
  const getRowClickHandler = useCallback9(
3790
3821
  (row, rowId) => (e) => {
3791
3822
  onRowClick?.({ row, rowId }, e);
3792
- checkboxSelection && !disableSelectionOnClick && onCheckboxChange(e, rowId);
3823
+ checkboxSelection && !disableSelectionOnClick && isRowSelectableCheck(rowId, row) && onCheckboxChange(e, rowId);
3793
3824
  },
3794
- [onRowClick, checkboxSelection, disableSelectionOnClick, onCheckboxChange]
3825
+ [
3826
+ onRowClick,
3827
+ checkboxSelection,
3828
+ disableSelectionOnClick,
3829
+ onCheckboxChange,
3830
+ isRowSelectableCheck
3831
+ ]
3795
3832
  );
3796
3833
  const getRowFocusHandler = useCallback9(
3797
3834
  (rowId) => () => {
@@ -3806,10 +3843,12 @@ function Component(props, apiRef) {
3806
3843
  []
3807
3844
  );
3808
3845
  const getCheckboxChangeHandler = useCallback9(
3809
- (rowId) => (e) => {
3810
- onCheckboxChange(e, rowId);
3846
+ (rowId, row) => (e) => {
3847
+ if (isRowSelectableCheck(rowId, row)) {
3848
+ onCheckboxChange(e, rowId);
3849
+ }
3811
3850
  },
3812
- [onCheckboxChange]
3851
+ [onCheckboxChange, isRowSelectableCheck]
3813
3852
  );
3814
3853
  useImperativeHandle2(apiRef, () => ({
3815
3854
  getRowIndexRelativeToVisibleRows(rowId) {
@@ -3847,7 +3886,7 @@ function Component(props, apiRef) {
3847
3886
  justifyContent: "space-between",
3848
3887
  alignItems: "center"
3849
3888
  },
3850
- !!checkboxSelection && /* @__PURE__ */ React23.createElement(Stack_default, { direction: "row", spacing: 1 }, !isAllSelected && /* @__PURE__ */ React23.createElement(Typography_default, { level: "body-xs" }, numberFormatter(selectionModel?.length || 0), " items selected"), isAllSelected && !isTotalSelected && /* @__PURE__ */ React23.createElement(Stack_default, { direction: "row", spacing: 1, alignItems: "center" }, /* @__PURE__ */ React23.createElement(Typography_default, { level: "body-xs" }, "All ", numberFormatter(selectionModel?.length || 0), " items on this page are selected."), /* @__PURE__ */ React23.createElement(Button_default, { size: "sm", variant: "plain", onClick: onTotalSelect }, "Select all ", numberFormatter(rowCount ?? rows.length), " items")), isTotalSelected && /* @__PURE__ */ React23.createElement(Stack_default, { direction: "row", spacing: 1, alignItems: "center" }, /* @__PURE__ */ React23.createElement(Typography_default, { level: "body-xs" }, "All ", numberFormatter(rowCount ?? rows.length), " items are selected."), /* @__PURE__ */ React23.createElement(
3889
+ !!checkboxSelection && /* @__PURE__ */ React23.createElement(Stack_default, { direction: "row", spacing: 1 }, !isAllSelected && /* @__PURE__ */ React23.createElement(Typography_default, { level: "body-xs" }, numberFormatter(selectionModel?.length || 0), " items selected"), isAllSelected && !isTotalSelected && /* @__PURE__ */ React23.createElement(Stack_default, { direction: "row", spacing: 1, alignItems: "center" }, /* @__PURE__ */ React23.createElement(Typography_default, { level: "body-xs" }, "All ", numberFormatter(selectionModel?.length || 0), " items on this page are selected."), /* @__PURE__ */ React23.createElement(Button_default, { size: "sm", variant: "plain", onClick: onTotalSelect }, "Select all ", numberFormatter(selectableRowCount), " items")), isTotalSelected && /* @__PURE__ */ React23.createElement(Stack_default, { direction: "row", spacing: 1, alignItems: "center" }, /* @__PURE__ */ React23.createElement(Typography_default, { level: "body-xs" }, "All ", numberFormatter(selectableRowCount), " items are selected."), /* @__PURE__ */ React23.createElement(
3851
3890
  Button_default,
3852
3891
  {
3853
3892
  size: "sm",
@@ -3892,6 +3931,7 @@ function Component(props, apiRef) {
3892
3931
  onChange: onAllCheckboxChange,
3893
3932
  checked: isAllSelected,
3894
3933
  indeterminate: (selectionModel || []).length > 0 && !isAllSelected,
3934
+ disabled: dataInPage.length > 0 && !selectableRowCount,
3895
3935
  ...checkboxProps
3896
3936
  }
3897
3937
  )
@@ -3969,8 +4009,9 @@ function Component(props, apiRef) {
3969
4009
  RenderCheckbox,
3970
4010
  {
3971
4011
  onClick: getCheckboxClickHandler(),
3972
- onChange: getCheckboxChangeHandler(rowId),
4012
+ onChange: getCheckboxChangeHandler(rowId, row),
3973
4013
  checked: isSelectedRow(rowId),
4014
+ disabled: !isRowSelectableCheck(rowId, row),
3974
4015
  ...checkboxProps
3975
4016
  }
3976
4017
  )