material-react-table 2.11.3 → 2.12.1

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.
Files changed (37) hide show
  1. package/README.md +29 -22
  2. package/dist/index.d.ts +19 -2
  3. package/dist/index.esm.js +136 -105
  4. package/dist/index.esm.js.map +1 -1
  5. package/dist/index.js +137 -104
  6. package/dist/index.js.map +1 -1
  7. package/locales/hr/index.d.ts +3 -0
  8. package/locales/hr/index.esm.d.ts +3 -0
  9. package/locales/hr/index.esm.js +95 -0
  10. package/locales/hr/index.js +99 -0
  11. package/locales/hr/package.json +6 -0
  12. package/package.json +25 -25
  13. package/src/components/body/MRT_TableBodyCell.tsx +7 -0
  14. package/src/components/body/MRT_TableBodyRow.tsx +5 -0
  15. package/src/components/body/MRT_TableDetailPanel.tsx +2 -5
  16. package/src/components/head/MRT_TableHead.tsx +11 -11
  17. package/src/components/head/MRT_TableHeadCell.tsx +7 -0
  18. package/src/components/head/MRT_TableHeadCellFilterContainer.tsx +3 -4
  19. package/src/components/head/MRT_TableHeadCellFilterLabel.tsx +61 -37
  20. package/src/components/inputs/MRT_FilterRangeFields.tsx +8 -2
  21. package/src/components/inputs/MRT_FilterTextField.tsx +41 -63
  22. package/src/components/menus/MRT_ShowHideColumnsMenuItems.tsx +1 -4
  23. package/src/components/table/MRT_TablePaper.tsx +4 -4
  24. package/src/components/toolbar/MRT_TablePagination.tsx +10 -12
  25. package/src/components/toolbar/MRT_ToolbarDropZone.tsx +5 -0
  26. package/src/hooks/display-columns/getMRT_RowActionsColumnDef.tsx +1 -1
  27. package/src/hooks/display-columns/getMRT_RowDragColumnDef.tsx +1 -1
  28. package/src/hooks/display-columns/getMRT_RowExpandColumnDef.tsx +1 -1
  29. package/src/hooks/display-columns/getMRT_RowNumbersColumnDef.tsx +1 -1
  30. package/src/hooks/display-columns/getMRT_RowPinningColumnDef.tsx +1 -1
  31. package/src/hooks/display-columns/getMRT_RowSelectColumnDef.tsx +1 -1
  32. package/src/hooks/display-columns/getMRT_RowSpacerColumnDef.tsx +1 -1
  33. package/src/hooks/useMRT_ColumnVirtualizer.ts +6 -8
  34. package/src/locales/hr.ts +96 -0
  35. package/src/types.ts +0 -1
  36. package/src/utils/column.utils.ts +86 -0
  37. package/src/utils/utils.ts +1 -1
@@ -3,7 +3,6 @@ import {
3
3
  type MouseEvent,
4
4
  useCallback,
5
5
  useEffect,
6
- useMemo,
7
6
  useRef,
8
7
  useState,
9
8
  } from 'react';
@@ -35,6 +34,10 @@ import {
35
34
  type MRT_RowData,
36
35
  type MRT_TableInstance,
37
36
  } from '../../types';
37
+ import {
38
+ getColumnFilterInfo,
39
+ useDropdownOptions,
40
+ } from '../../utils/column.utils';
38
41
  import { getValueAndLabel, parseFromValuesOrFunc } from '../../utils/utils';
39
42
  import { MRT_FilterOptionMenu } from '../menus/MRT_FilterOptionMenu';
40
43
 
@@ -53,7 +56,6 @@ export const MRT_FilterTextField = <TData extends MRT_RowData>({
53
56
  }: MRT_FilterTextFieldProps<TData>) => {
54
57
  const {
55
58
  options: {
56
- columnFilterModeOptions,
57
59
  enableColumnFilterModes,
58
60
  icons: { CloseIcon, FilterListIcon },
59
61
  localization,
@@ -71,58 +73,48 @@ export const MRT_FilterTextField = <TData extends MRT_RowData>({
71
73
  const { columnDef } = column;
72
74
  const { filterVariant } = columnDef;
73
75
 
76
+ const args = { column, rangeFilterIndex, table };
77
+
74
78
  const textFieldProps: TextFieldProps = {
75
- ...parseFromValuesOrFunc(muiFilterTextFieldProps, { column, table }),
76
- ...parseFromValuesOrFunc(columnDef.muiFilterTextFieldProps, {
77
- column,
78
- table,
79
- }),
79
+ ...parseFromValuesOrFunc(muiFilterTextFieldProps, args),
80
+ ...parseFromValuesOrFunc(columnDef.muiFilterTextFieldProps, args),
80
81
  ...rest,
81
82
  };
82
83
 
83
84
  const autocompleteProps = {
84
- ...parseFromValuesOrFunc(muiFilterAutocompleteProps, { column, table }),
85
- ...parseFromValuesOrFunc(columnDef.muiFilterAutocompleteProps, {
86
- column,
87
- table,
88
- }),
85
+ ...parseFromValuesOrFunc(muiFilterAutocompleteProps, args),
86
+ ...parseFromValuesOrFunc(columnDef.muiFilterAutocompleteProps, args),
89
87
  };
90
88
 
91
89
  const datePickerProps: DatePickerProps<any> = {
92
- ...parseFromValuesOrFunc(muiFilterDatePickerProps, { column, table }),
93
- ...parseFromValuesOrFunc(columnDef.muiFilterDatePickerProps, {
94
- column,
95
- table,
96
- }),
90
+ ...parseFromValuesOrFunc(muiFilterDatePickerProps, args),
91
+ ...parseFromValuesOrFunc(columnDef.muiFilterDatePickerProps, args),
97
92
  };
98
93
 
99
94
  const dateTimePickerProps: DateTimePickerProps<any> = {
100
- ...parseFromValuesOrFunc(muiFilterDateTimePickerProps, { column, table }),
101
- ...parseFromValuesOrFunc(columnDef.muiFilterDateTimePickerProps, {
102
- column,
103
- table,
104
- }),
95
+ ...parseFromValuesOrFunc(muiFilterDateTimePickerProps, args),
96
+ ...parseFromValuesOrFunc(columnDef.muiFilterDateTimePickerProps, args),
105
97
  };
106
98
 
107
99
  const timePickerProps: TimePickerProps<any> = {
108
- ...parseFromValuesOrFunc(muiFilterTimePickerProps, { column, table }),
109
- ...parseFromValuesOrFunc(columnDef.muiFilterTimePickerProps, {
110
- column,
111
- table,
112
- }),
100
+ ...parseFromValuesOrFunc(muiFilterTimePickerProps, args),
101
+ ...parseFromValuesOrFunc(columnDef.muiFilterTimePickerProps, args),
113
102
  };
114
103
 
115
- const isDateFilter =
116
- filterVariant?.startsWith('date') || filterVariant?.startsWith('time');
117
- const isAutocompleteFilter = filterVariant === 'autocomplete';
118
- const isRangeFilter =
119
- filterVariant?.includes('range') || rangeFilterIndex !== undefined;
120
- const isSelectFilter = filterVariant === 'select';
121
- const isMultiSelectFilter = filterVariant === 'multi-select';
122
- const isTextboxFilter =
123
- ['autocomplete', 'text'].includes(filterVariant!) ||
124
- (!isSelectFilter && !isMultiSelectFilter);
125
- const currentFilterOption = columnDef._filterFn;
104
+ const {
105
+ allowedColumnFilterOptions,
106
+ currentFilterOption,
107
+ facetedUniqueValues,
108
+ isAutocompleteFilter,
109
+ isDateFilter,
110
+ isMultiSelectFilter,
111
+ isRangeFilter,
112
+ isSelectFilter,
113
+ isTextboxFilter,
114
+ } = getColumnFilterInfo({ header, table });
115
+
116
+ const dropdownOptions = useDropdownOptions({ header, table });
117
+
126
118
  const filterChipLabel = ['empty', 'notEmpty'].includes(currentFilterOption)
127
119
  ? //@ts-ignore
128
120
  localization[
@@ -132,6 +124,7 @@ export const MRT_FilterTextField = <TData extends MRT_RowData>({
132
124
  }`
133
125
  ]
134
126
  : '';
127
+
135
128
  const filterPlaceholder = !isRangeFilter
136
129
  ? textFieldProps?.placeholder ??
137
130
  localization.filterByColumn?.replace('{column}', String(columnDef.header))
@@ -140,16 +133,14 @@ export const MRT_FilterTextField = <TData extends MRT_RowData>({
140
133
  : rangeFilterIndex === 1
141
134
  ? localization.max
142
135
  : '';
143
- const allowedColumnFilterOptions =
144
- columnDef?.columnFilterModeOptions ?? columnFilterModeOptions;
145
- const showChangeModeButton =
136
+
137
+ const showChangeModeButton = !!(
146
138
  enableColumnFilterModes &&
147
139
  columnDef.enableColumnFilterModes !== false &&
148
140
  !rangeFilterIndex &&
149
141
  (allowedColumnFilterOptions === undefined ||
150
- !!allowedColumnFilterOptions?.length);
151
-
152
- const facetedUniqueValues = column.getFacetedUniqueValues();
142
+ !!allowedColumnFilterOptions?.length)
143
+ );
153
144
 
154
145
  const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);
155
146
  const [filterValue, setFilterValue] = useState<string | string[]>(() =>
@@ -257,23 +248,6 @@ export const MRT_FilterTextField = <TData extends MRT_RowData>({
257
248
  );
258
249
  }
259
250
 
260
- const dropdownOptions = useMemo(
261
- () =>
262
- columnDef.filterSelectOptions ??
263
- ((isSelectFilter || isMultiSelectFilter || isAutocompleteFilter) &&
264
- facetedUniqueValues
265
- ? Array.from(facetedUniqueValues.keys())
266
- .filter((value) => value !== null && value !== undefined)
267
- .sort((a, b) => a.localeCompare(b))
268
- : undefined),
269
- [
270
- columnDef.filterSelectOptions,
271
- facetedUniqueValues,
272
- isMultiSelectFilter,
273
- isSelectFilter,
274
- ],
275
- );
276
-
277
251
  const endAdornment =
278
252
  !isAutocompleteFilter && !isDateFilter && !filterChipLabel ? (
279
253
  <InputAdornment
@@ -447,8 +421,12 @@ export const MRT_FilterTextField = <TData extends MRT_RowData>({
447
421
  ) : isAutocompleteFilter ? (
448
422
  <Autocomplete
449
423
  freeSolo
450
- getOptionLabel={(option) => getValueAndLabel(option).label}
451
- onChange={(_e, newValue) => handleAutocompleteChange(newValue)}
424
+ getOptionLabel={(option: DropdownOption) =>
425
+ getValueAndLabel(option).label
426
+ }
427
+ onChange={(_e, newValue: DropdownOption) =>
428
+ handleAutocompleteChange(newValue)
429
+ }
452
430
  options={
453
431
  dropdownOptions?.map((option) => getValueAndLabel(option)) ?? []
454
432
  }
@@ -56,10 +56,7 @@ export const MRT_ShowHideColumnsMenuItems = <TData extends MRT_RowData>({
56
56
  const { columnDef } = column;
57
57
  const { columnDefType } = columnDef;
58
58
 
59
- const switchChecked =
60
- (columnDefType !== 'group' && column.getIsVisible()) ||
61
- (columnDefType === 'group' &&
62
- column.getLeafColumns().some((col) => col.getIsVisible()));
59
+ const switchChecked = column.getIsVisible();
63
60
 
64
61
  const handleToggleColumnHidden = (column: MRT_Column<TData>) => {
65
62
  if (columnDefType === 'group') {
@@ -48,16 +48,16 @@ export const MRT_TablePaper = <TData extends MRT_RowData>({
48
48
  ...(isFullScreen
49
49
  ? {
50
50
  bottom: 0,
51
- height: '100vh',
51
+ height: '100dvh',
52
52
  left: 0,
53
53
  margin: 0,
54
- maxHeight: '100vh',
55
- maxWidth: '100vw',
54
+ maxHeight: '100dvh',
55
+ maxWidth: '100dvw',
56
56
  padding: 0,
57
57
  position: 'fixed',
58
58
  right: 0,
59
59
  top: 0,
60
- width: '100vw',
60
+ width: '100dvw',
61
61
  zIndex: 999,
62
62
  }
63
63
  : {}),
@@ -37,7 +37,6 @@ export const MRT_TablePagination = <TData extends MRT_RowData>({
37
37
  const isMobile = useMediaQuery('(max-width: 720px)');
38
38
 
39
39
  const {
40
- getPrePaginationRowModel,
41
40
  getState,
42
41
  options: {
43
42
  enableToolbarInternalActions,
@@ -45,10 +44,7 @@ export const MRT_TablePagination = <TData extends MRT_RowData>({
45
44
  localization,
46
45
  muiPaginationProps,
47
46
  paginationDisplayMode,
48
- rowCount,
49
47
  },
50
- setPageIndex,
51
- setPageSize,
52
48
  } = table;
53
49
  const {
54
50
  pagination: { pageIndex = 0, pageSize = 10 },
@@ -62,8 +58,8 @@ export const MRT_TablePagination = <TData extends MRT_RowData>({
62
58
  ...rest,
63
59
  };
64
60
 
65
- const totalRowCount = rowCount ?? getPrePaginationRowModel().rows.length;
66
- const numberOfPages = Math.ceil(totalRowCount / pageSize);
61
+ const totalRowCount = table.getRowCount();
62
+ const numberOfPages = table.getPageCount();
67
63
  const showFirstLastPageButtons = numberOfPages > 2;
68
64
  const firstRowIndex = pageIndex * pageSize;
69
65
  const lastRowIndex = Math.min(pageIndex * pageSize + pageSize, totalRowCount);
@@ -123,7 +119,9 @@ export const MRT_TablePagination = <TData extends MRT_RowData>({
123
119
  id: 'mrt-rows-per-page',
124
120
  }}
125
121
  label={localization.rowsPerPage}
126
- onChange={(event) => setPageSize(+(event.target.value as any))}
122
+ onChange={(event) =>
123
+ table.setPageSize(+(event.target.value as any))
124
+ }
127
125
  sx={{ mb: 0 }}
128
126
  value={pageSize}
129
127
  variant="standard"
@@ -153,7 +151,7 @@ export const MRT_TablePagination = <TData extends MRT_RowData>({
153
151
  <Pagination
154
152
  count={numberOfPages}
155
153
  disabled={disabled}
156
- onChange={(_e, newPageIndex) => setPageIndex(newPageIndex - 1)}
154
+ onChange={(_e, newPageIndex) => table.setPageIndex(newPageIndex - 1)}
157
155
  page={pageIndex + 1}
158
156
  renderItem={(item) => (
159
157
  <PaginationItem
@@ -189,7 +187,7 @@ export const MRT_TablePagination = <TData extends MRT_RowData>({
189
187
  <IconButton
190
188
  aria-label={localization.goToFirstPage}
191
189
  disabled={disableBack}
192
- onClick={() => setPageIndex(0)}
190
+ onClick={() => table.firstPage()}
193
191
  size="small"
194
192
  >
195
193
  <FirstPageIcon {...flipIconStyles(theme)} />
@@ -202,7 +200,7 @@ export const MRT_TablePagination = <TData extends MRT_RowData>({
202
200
  <IconButton
203
201
  aria-label={localization.goToPreviousPage}
204
202
  disabled={disableBack}
205
- onClick={() => setPageIndex(pageIndex - 1)}
203
+ onClick={() => table.previousPage()}
206
204
  size="small"
207
205
  >
208
206
  <ChevronLeftIcon {...flipIconStyles(theme)} />
@@ -214,7 +212,7 @@ export const MRT_TablePagination = <TData extends MRT_RowData>({
214
212
  <IconButton
215
213
  aria-label={localization.goToNextPage}
216
214
  disabled={disableNext}
217
- onClick={() => setPageIndex(pageIndex + 1)}
215
+ onClick={() => table.nextPage()}
218
216
  size="small"
219
217
  >
220
218
  <ChevronRightIcon {...flipIconStyles(theme)} />
@@ -227,7 +225,7 @@ export const MRT_TablePagination = <TData extends MRT_RowData>({
227
225
  <IconButton
228
226
  aria-label={localization.goToLastPage}
229
227
  disabled={disableNext}
230
- onClick={() => setPageIndex(numberOfPages - 1)}
228
+ onClick={() => table.lastPage()}
231
229
  size="small"
232
230
  >
233
231
  <LastPageIcon {...flipIconStyles(theme)} />
@@ -29,6 +29,10 @@ export const MRT_ToolbarDropZone = <TData extends MRT_RowData>({
29
29
  setHoveredColumn({ id: 'drop-zone' });
30
30
  };
31
31
 
32
+ const handleDragOver = (e: DragEvent) => {
33
+ e.preventDefault();
34
+ };
35
+
32
36
  useEffect(() => {
33
37
  if (table.options.state?.showToolbarDropZone !== undefined) {
34
38
  setShowToolbarDropZone(
@@ -45,6 +49,7 @@ export const MRT_ToolbarDropZone = <TData extends MRT_RowData>({
45
49
  <Box
46
50
  className="Mui-ToolbarDropZone"
47
51
  onDragEnter={handleDragEnter}
52
+ onDragOver={handleDragOver}
48
53
  {...rest}
49
54
  sx={(theme) => ({
50
55
  alignItems: 'center',
@@ -8,7 +8,7 @@ import { defaultDisplayColumnProps } from '../../utils/displayColumn.utils';
8
8
 
9
9
  export const getMRT_RowActionsColumnDef = <TData extends MRT_RowData>(
10
10
  tableOptions: MRT_StatefulTableOptions<TData>,
11
- ): MRT_ColumnDef<TData> | null => {
11
+ ): MRT_ColumnDef<TData> => {
12
12
  return {
13
13
  Cell: ({ cell, row, staticRowIndex, table }) => (
14
14
  <MRT_ToggleRowActionMenuButton
@@ -9,7 +9,7 @@ import { defaultDisplayColumnProps } from '../../utils/displayColumn.utils';
9
9
 
10
10
  export const getMRT_RowDragColumnDef = <TData extends MRT_RowData>(
11
11
  tableOptions: MRT_StatefulTableOptions<TData>,
12
- ): MRT_ColumnDef<TData> | null => {
12
+ ): MRT_ColumnDef<TData> => {
13
13
  return {
14
14
  Cell: ({ row, rowRef, table }) => (
15
15
  <MRT_TableBodyRowGrabHandle
@@ -13,7 +13,7 @@ import { getCommonTooltipProps } from '../../utils/style.utils';
13
13
 
14
14
  export const getMRT_RowExpandColumnDef = <TData extends MRT_RowData>(
15
15
  tableOptions: MRT_StatefulTableOptions<TData>,
16
- ): MRT_ColumnDef<TData> | null => {
16
+ ): MRT_ColumnDef<TData> => {
17
17
  const {
18
18
  defaultColumn,
19
19
  enableExpandAll,
@@ -7,7 +7,7 @@ import { defaultDisplayColumnProps } from '../../utils/displayColumn.utils';
7
7
 
8
8
  export const getMRT_RowNumbersColumnDef = <TData extends MRT_RowData>(
9
9
  tableOptions: MRT_StatefulTableOptions<TData>,
10
- ): MRT_ColumnDef<TData> | null => {
10
+ ): MRT_ColumnDef<TData> => {
11
11
  const { localization, rowNumberDisplayMode } = tableOptions;
12
12
  const {
13
13
  pagination: { pageIndex, pageSize },
@@ -8,7 +8,7 @@ import { defaultDisplayColumnProps } from '../../utils/displayColumn.utils';
8
8
 
9
9
  export const getMRT_RowPinningColumnDef = <TData extends MRT_RowData>(
10
10
  tableOptions: MRT_StatefulTableOptions<TData>,
11
- ): MRT_ColumnDef<TData> | null => {
11
+ ): MRT_ColumnDef<TData> => {
12
12
  return {
13
13
  Cell: ({ row, table }) => (
14
14
  <MRT_TableBodyRowPinButton row={row} table={table} />
@@ -8,7 +8,7 @@ import { defaultDisplayColumnProps } from '../../utils/displayColumn.utils';
8
8
 
9
9
  export const getMRT_RowSelectColumnDef = <TData extends MRT_RowData>(
10
10
  tableOptions: MRT_StatefulTableOptions<TData>,
11
- ): MRT_ColumnDef<TData> | null => {
11
+ ): MRT_ColumnDef<TData> => {
12
12
  const { enableMultiRowSelection, enableSelectAll } = tableOptions;
13
13
 
14
14
  return {
@@ -17,7 +17,7 @@ const blankColProps = {
17
17
 
18
18
  export const getMRT_RowSpacerColumnDef = <TData extends MRT_RowData>(
19
19
  tableOptions: MRT_StatefulTableOptions<TData>,
20
- ): MRT_ColumnDef<TData> | null => {
20
+ ): MRT_ColumnDef<TData> => {
21
21
  return {
22
22
  ...defaultDisplayColumnProps({
23
23
  id: 'mrt-row-spacer',
@@ -16,10 +16,7 @@ export const useMRT_ColumnVirtualizer = <
16
16
  table: MRT_TableInstance<TData>,
17
17
  ): MRT_ColumnVirtualizer | undefined => {
18
18
  const {
19
- getLeftLeafColumns,
20
- getRightLeafColumns,
21
19
  getState,
22
- getVisibleLeafColumns,
23
20
  options: {
24
21
  columnVirtualizerInstanceRef,
25
22
  columnVirtualizerOptions,
@@ -28,7 +25,7 @@ export const useMRT_ColumnVirtualizer = <
28
25
  },
29
26
  refs: { tableContainerRef },
30
27
  } = table;
31
- const { columnPinning, draggingColumn } = getState();
28
+ const { columnPinning, columnVisibility, draggingColumn } = getState();
32
29
 
33
30
  if (!enableColumnVirtualization) return undefined;
34
31
 
@@ -39,21 +36,22 @@ export const useMRT_ColumnVirtualizer = <
39
36
  },
40
37
  );
41
38
 
42
- const visibleColumns = getVisibleLeafColumns();
39
+ const visibleColumns = table.getVisibleLeafColumns();
43
40
 
44
41
  const [leftPinnedIndexes, rightPinnedIndexes] = useMemo(
45
42
  () =>
46
43
  enableColumnPinning
47
44
  ? [
48
- getLeftLeafColumns().map((c) => c.getPinnedIndex()),
49
- getRightLeafColumns()
45
+ table.getLeftVisibleLeafColumns().map((c) => c.getPinnedIndex()),
46
+ table
47
+ .getRightVisibleLeafColumns()
50
48
  .map(
51
49
  (column) => visibleColumns.length - column.getPinnedIndex() - 1,
52
50
  )
53
51
  .sort((a, b) => a - b),
54
52
  ]
55
53
  : [[], []],
56
- [columnPinning, enableColumnPinning],
54
+ [columnPinning, columnVisibility, enableColumnPinning],
57
55
  );
58
56
 
59
57
  const numPinnedLeft = leftPinnedIndexes.length;
@@ -0,0 +1,96 @@
1
+ import { type MRT_Localization } from '..';
2
+
3
+ export const MRT_Localization_HR: MRT_Localization = {
4
+ actions: 'Radnje',
5
+ and: 'i',
6
+ cancel: 'Odustani',
7
+ changeFilterMode: 'Promijeni način filtriranja',
8
+ changeSearchMode: 'Promijeni način pretraživanja',
9
+ clearFilter: 'Očisti filtriranje',
10
+ clearSearch: 'Očisti pretragu',
11
+ clearSelection: 'Očisti odabir',
12
+ clearSort: 'Očisti sortiranje',
13
+ clickToCopy: 'Klikni za kopiranje',
14
+ copy: 'Kopiraj',
15
+ collapse: 'Sažmi',
16
+ collapseAll: 'Sažmi sve',
17
+ columnActions: 'Radnje s stupcima',
18
+ copiedToClipboard: 'Kopirano u međuspremnik',
19
+ dropToGroupBy: 'Ispusti za grupiranje po {column}',
20
+ edit: 'Uredi',
21
+ expand: 'Proširi',
22
+ expandAll: 'Proširi sve',
23
+ filterArrIncludes: 'Uključuje',
24
+ filterArrIncludesAll: 'Uključuje sve',
25
+ filterArrIncludesSome: 'Uključuje',
26
+ filterBetween: 'Između',
27
+ filterBetweenInclusive: 'Između uključivo',
28
+ filterByColumn: 'Filtriraj po {column}',
29
+ filterContains: 'Sadrži',
30
+ filterEmpty: 'Prazno',
31
+ filterEndsWith: 'Završava s',
32
+ filterEquals: 'Jednako',
33
+ filterEqualsString: 'Jednako',
34
+ filterFuzzy: 'Maglovito',
35
+ filterGreaterThan: 'Veće od',
36
+ filterGreaterThanOrEqualTo: 'Veće od ili jednako',
37
+ filterInNumberRange: 'Između',
38
+ filterIncludesString: 'Sadrži',
39
+ filterIncludesStringSensitive: 'Sadrži',
40
+ filterLessThan: 'Manje od',
41
+ filterLessThanOrEqualTo: 'Manje od ili jednako',
42
+ filterMode: 'Način filtriranja: {filterType}',
43
+ filterNotEmpty: 'Nije prazno',
44
+ filterNotEquals: 'Nije jednako',
45
+ filterStartsWith: 'Počinje s',
46
+ filterWeakEquals: 'Jednako',
47
+ filteringByColumn: 'Filtriranje po {column} - {filterType} {filterValue}',
48
+ goToFirstPage: 'Idi na prvu stranicu',
49
+ goToLastPage: 'Idi na zadnju stranicu',
50
+ goToNextPage: 'Idi na sljedeću stranicu',
51
+ goToPreviousPage: 'Idi na prethodnu stranicu',
52
+ grab: 'Uhvati',
53
+ groupByColumn: 'Grupiraj po {column}',
54
+ groupedBy: 'Grupirano po ',
55
+ hideAll: 'Sakrij sve',
56
+ hideColumn: 'Sakrij stupac {column}',
57
+ max: 'Maks.',
58
+ min: 'Min.',
59
+ move: 'Premjesti',
60
+ noRecordsToDisplay: 'Nema zapisa za prikaz',
61
+ noResultsFound: 'Nema pronađenih rezultata',
62
+ of: 'od',
63
+ or: 'ili',
64
+ pin: 'Prikači',
65
+ pinToLeft: 'Prikači na lijevo',
66
+ pinToRight: 'Prikači na desno',
67
+ resetColumnSize: 'Resetiraj veličinu stupca',
68
+ resetOrder: 'Resetiraj redoslijed',
69
+ rowActions: 'Radnje retka',
70
+ rowNumber: '#',
71
+ rowNumbers: 'Brojevi redaka',
72
+ rowsPerPage: 'Redaka po stranici',
73
+ save: 'Spremi',
74
+ search: 'Pretraži',
75
+ selectedCountOfRowCountRowsSelected:
76
+ '{selectedCount} od {rowCount} odabranih redaka',
77
+ select: 'Odaberi',
78
+ showAll: 'Prikaži sve',
79
+ showAllColumns: 'Prikaži sve stupce',
80
+ showHideColumns: 'Prikaži/sakrij stupce',
81
+ showHideFilters: 'Prikaži/sakrij filtere',
82
+ showHideSearch: 'Prikaži/sakrij pretragu',
83
+ sortByColumnAsc: 'Sortiraj po {column} uzlazno',
84
+ sortByColumnDesc: 'Sortiraj po {column} silazno',
85
+ sortedByColumnAsc: 'Sortirano po {column} uzlazno',
86
+ sortedByColumnDesc: 'Sortirano po {column} silazno',
87
+ thenBy: ', zatim po ',
88
+ toggleDensity: 'Promijeni gustoću',
89
+ toggleFullScreen: 'Prebaci u puni zaslon',
90
+ toggleSelectAll: 'Prebaci odabir svih',
91
+ toggleSelectRow: 'Prebaci odabir retka',
92
+ toggleVisibility: 'Prebaci vidljivost',
93
+ ungroupByColumn: 'Razgrupiraj po {column}',
94
+ unpin: 'Odkači',
95
+ unpinAll: 'Odkači sve',
96
+ };
package/src/types.ts CHANGED
@@ -1267,7 +1267,6 @@ export type MRT_TableOptions<TData extends MRT_RowData> = Omit<
1267
1267
  renderTopToolbarCustomActions?: (props: {
1268
1268
  table: MRT_TableInstance<TData>;
1269
1269
  }) => ReactNode;
1270
- rowCount?: number;
1271
1270
  rowNumberDisplayMode?: 'original' | 'static';
1272
1271
  rowPinningDisplayMode?:
1273
1272
  | 'bottom'
@@ -1,12 +1,16 @@
1
+ import { useMemo } from 'react';
1
2
  import { type Row } from '@tanstack/react-table';
2
3
  import {
4
+ type DropdownOption,
3
5
  type MRT_Column,
4
6
  type MRT_ColumnDef,
5
7
  type MRT_ColumnOrderState,
6
8
  type MRT_DefinedColumnDef,
7
9
  type MRT_DefinedTableOptions,
8
10
  type MRT_FilterOption,
11
+ type MRT_Header,
9
12
  type MRT_RowData,
13
+ type MRT_TableInstance,
10
14
  } from '../types';
11
15
 
12
16
  export const getColumnId = <TData extends MRT_RowData>(
@@ -121,3 +125,85 @@ export const getDefaultColumnFilterFn = <TData extends MRT_RowData>(
121
125
  return 'equals';
122
126
  return 'fuzzy';
123
127
  };
128
+
129
+ export const getColumnFilterInfo = <TData extends MRT_RowData>({
130
+ header,
131
+ table,
132
+ }: {
133
+ header: MRT_Header<TData>;
134
+ table: MRT_TableInstance<TData>;
135
+ }) => {
136
+ const {
137
+ options: { columnFilterModeOptions },
138
+ } = table;
139
+ const { column } = header;
140
+ const { columnDef } = column;
141
+ const { filterVariant } = columnDef;
142
+
143
+ const isDateFilter = !!(
144
+ filterVariant?.startsWith('date') || filterVariant?.startsWith('time')
145
+ );
146
+ const isAutocompleteFilter = filterVariant === 'autocomplete';
147
+ const isRangeFilter =
148
+ filterVariant?.includes('range') ||
149
+ ['between', 'betweenInclusive', 'inNumberRange'].includes(
150
+ columnDef._filterFn,
151
+ );
152
+ const isSelectFilter = filterVariant === 'select';
153
+ const isMultiSelectFilter = filterVariant === 'multi-select';
154
+ const isTextboxFilter =
155
+ ['autocomplete', 'text'].includes(filterVariant!) ||
156
+ (!isSelectFilter && !isMultiSelectFilter);
157
+ const currentFilterOption = columnDef._filterFn;
158
+
159
+ const allowedColumnFilterOptions =
160
+ columnDef?.columnFilterModeOptions ?? columnFilterModeOptions;
161
+
162
+ const facetedUniqueValues = column.getFacetedUniqueValues();
163
+
164
+ return {
165
+ allowedColumnFilterOptions,
166
+ currentFilterOption,
167
+ facetedUniqueValues,
168
+ isAutocompleteFilter,
169
+ isDateFilter,
170
+ isMultiSelectFilter,
171
+ isRangeFilter,
172
+ isSelectFilter,
173
+ isTextboxFilter,
174
+ } as const;
175
+ };
176
+
177
+ export const useDropdownOptions = <TData extends MRT_RowData>({
178
+ header,
179
+ table,
180
+ }: {
181
+ header: MRT_Header<TData>;
182
+ table: MRT_TableInstance<TData>;
183
+ }): DropdownOption[] | undefined => {
184
+ const { column } = header;
185
+ const { columnDef } = column;
186
+ const {
187
+ facetedUniqueValues,
188
+ isAutocompleteFilter,
189
+ isMultiSelectFilter,
190
+ isSelectFilter,
191
+ } = getColumnFilterInfo({ header, table });
192
+
193
+ return useMemo<DropdownOption[] | undefined>(
194
+ () =>
195
+ columnDef.filterSelectOptions ??
196
+ ((isSelectFilter || isMultiSelectFilter || isAutocompleteFilter) &&
197
+ facetedUniqueValues
198
+ ? Array.from(facetedUniqueValues.keys())
199
+ .filter((value) => value !== null && value !== undefined)
200
+ .sort((a, b) => a.localeCompare(b))
201
+ : undefined),
202
+ [
203
+ columnDef.filterSelectOptions,
204
+ facetedUniqueValues,
205
+ isMultiSelectFilter,
206
+ isSelectFilter,
207
+ ],
208
+ );
209
+ };
@@ -6,7 +6,7 @@ export const parseFromValuesOrFunc = <T, U>(
6
6
  ): T | undefined => (fn instanceof Function ? fn(arg) : fn);
7
7
 
8
8
  export const getValueAndLabel = (
9
- option: DropdownOption,
9
+ option?: DropdownOption,
10
10
  ): { label: string; value: string } => {
11
11
  let label: string = '';
12
12
  let value: string = '';