Skip to content

Commit 5ebe41f

Browse files
committed
feat: add column filtering functionality to users table store and widget
1 parent c6c5bc6 commit 5ebe41f

File tree

4 files changed

+41
-11
lines changed

4 files changed

+41
-11
lines changed

src/entities/dashboard/users/users-table-store/interfaces/action.interface.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,18 @@
11
/* eslint-disable camelcase */
2-
import { MRT_ColumnPinningState, MRT_VisibilityState } from 'mantine-react-table'
2+
import {
3+
MRT_ColumnFiltersState,
4+
MRT_ColumnPinningState,
5+
MRT_VisibilityState
6+
} from 'mantine-react-table'
37

48
export interface IActions {
59
actions: {
610
resetState: () => void
11+
setColumnFilter: (
12+
filter:
13+
| ((prev: MRT_ColumnFiltersState) => MRT_ColumnFiltersState)
14+
| MRT_ColumnFiltersState
15+
) => void
716
setColumnPinning: (
817
pinning:
918
| ((prev: MRT_ColumnPinningState) => MRT_ColumnPinningState)

src/entities/dashboard/users/users-table-store/interfaces/state.interface.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
/* eslint-disable camelcase */
2-
import { MRT_ColumnPinningState, MRT_VisibilityState } from 'mantine-react-table'
2+
import {
3+
MRT_ColumnFiltersState,
4+
MRT_ColumnPinningState,
5+
MRT_VisibilityState
6+
} from 'mantine-react-table'
37

48
export interface IState {
9+
columnFilter: MRT_ColumnFiltersState
510
columnPinning: MRT_ColumnPinningState
611
columnVisibility: MRT_VisibilityState
712
showColumnFilters: boolean

src/entities/dashboard/users/users-table-store/users-table-store.ts

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
/* eslint-disable camelcase */
22

3-
import { MRT_ColumnPinningState, MRT_VisibilityState } from 'mantine-react-table'
3+
import {
4+
MRT_ColumnFiltersState,
5+
MRT_ColumnPinningState,
6+
MRT_VisibilityState
7+
} from 'mantine-react-table'
48
import { createJSONStorage, persist } from 'zustand/middleware'
59
import { create } from 'zustand'
610

@@ -24,10 +28,13 @@ const DEFAULT_PINNING: MRT_ColumnPinningState = {
2428
right: []
2529
}
2630

31+
const DEFAULT_COLUMN_FILTER: MRT_ColumnFiltersState = []
32+
2733
const initialState: IState = {
2834
columnVisibility: DEFAULT_VISIBILITY,
2935
columnPinning: DEFAULT_PINNING,
30-
showColumnFilters: false
36+
showColumnFilters: false,
37+
columnFilter: DEFAULT_COLUMN_FILTER
3138
}
3239

3340
export const useUsersTableStore = create<IActions & IState>()(
@@ -55,18 +62,25 @@ export const useUsersTableStore = create<IActions & IState>()(
5562
typeof show === 'function' ? show(state.showColumnFilters) : show
5663
})),
5764

65+
setColumnFilter: (filter) =>
66+
set((state) => ({
67+
columnFilter:
68+
typeof filter === 'function' ? filter(state.columnFilter) : filter
69+
})),
70+
5871
resetState: () => set({ ...initialState })
5972
}
6073
}),
6174

6275
{
63-
name: 'users-column-storage',
76+
name: 'rmnw-users-table-store',
6477
version: 1,
6578
storage: createJSONStorage(() => localStorage),
6679
partialize: (state) => ({
6780
columnVisibility: state.columnVisibility,
6881
columnPinning: state.columnPinning,
69-
showColumnFilters: state.showColumnFilters
82+
showColumnFilters: state.showColumnFilters,
83+
columnFilter: state.columnFilter
7084
})
7185
}
7286
)
@@ -79,3 +93,5 @@ export const useUsersTableStoreColumnPinning = () =>
7993
useUsersTableStore((store) => store.columnPinning)
8094
export const useUsersTableStoreShowColumnFilters = () =>
8195
useUsersTableStore((store) => store.showColumnFilters)
96+
export const useUsersTableStoreColumnFilter = () =>
97+
useUsersTableStore((store) => store.columnFilter)

src/widgets/dashboard/users/users-table/user-table.widget.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import {
33
MantineReactTable,
44
MRT_ColumnFilterFnsState,
5-
MRT_ColumnFiltersState,
65
MRT_PaginationState,
76
MRT_SortingState,
87
MRT_TableOptions,
@@ -13,6 +12,7 @@ import { useTranslation } from 'react-i18next'
1312

1413
import {
1514
useUsersTableStoreActions,
15+
useUsersTableStoreColumnFilter,
1616
useUsersTableStoreColumnPinning,
1717
useUsersTableStoreColumnVisibility,
1818
useUsersTableStoreShowColumnFilters
@@ -44,6 +44,7 @@ export function UserTableWidget() {
4444
const columnVisibility = useUsersTableStoreColumnVisibility()
4545
const columnPinning = useUsersTableStoreColumnPinning()
4646
const showColumnFilters = useUsersTableStoreShowColumnFilters()
47+
const columnFilter = useUsersTableStoreColumnFilter()
4748

4849
const [sorting, setSorting] = useState<MRT_SortingState>([])
4950

@@ -52,15 +53,14 @@ export function UserTableWidget() {
5253
pageSize: 25
5354
})
5455

55-
const [columnFilters, setColumnFilters] = useState<MRT_ColumnFiltersState>([])
5656
const [columnFilterFns, setColumnFilterFns] = useState<MRT_ColumnFilterFnsState>(
5757
Object.fromEntries(tableColumns.map(({ accessorKey }) => [accessorKey, 'contains']))
5858
)
5959

6060
const params = {
6161
start: pagination.pageIndex * pagination.pageSize,
6262
size: pagination.pageSize,
63-
filters: columnFilters,
63+
filters: columnFilter,
6464
filterModes: columnFilterFns,
6565
sorting
6666
}
@@ -117,7 +117,7 @@ export function UserTableWidget() {
117117
} : undefined,
118118

119119
onColumnFilterFnsChange: setColumnFilterFns,
120-
onColumnFiltersChange: setColumnFilters,
120+
onColumnFiltersChange: actions.setColumnFilter,
121121
onPaginationChange: setPagination,
122122
onSortingChange: setSorting,
123123
onColumnPinningChange: actions.setColumnPinning,
@@ -154,7 +154,7 @@ export function UserTableWidget() {
154154
selectAllMode: 'page',
155155
state: {
156156
columnFilterFns,
157-
columnFilters,
157+
columnFilters: columnFilter,
158158
isLoading,
159159
pagination,
160160
showAlertBanner: isError,

0 commit comments

Comments
 (0)