mantine-datatable-extended 0.3.1 → 0.4.0

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.
package/README.md CHANGED
@@ -15,11 +15,11 @@ Mantine and Mantine DataTable are excellent libraries, trusted and used by many
15
15
 
16
16
  ### 🎯 Standardized Components
17
17
 
18
- - **DteSearch**: Search with multi-column selection
19
- - **DteFilter**: Filter data with various filter types (text, number, date, select, range...)
20
- - **DteSortList**: Sort by multiple columns simultaneously
21
- - **DteColumnsToggle**: Show/hide columns
22
- - **DtePagination**: Flexible pagination that can be placed anywhere
18
+ - **MDESearch**: Search with multi-column selection
19
+ - **MDEFilter**: Filter data with various filter types (text, number, date, select, range...)
20
+ - **MDESortList**: Sort by multiple columns simultaneously
21
+ - **MDEColumnsToggle**: Show/hide columns
22
+ - **MDEPagination**: Flexible pagination that can be placed anywhere
23
23
 
24
24
  ### 🔗 URL State Management
25
25
 
@@ -91,19 +91,19 @@ export default function RootLayout({ children }) {
91
91
  "use client";
92
92
 
93
93
  import {
94
- DteExtended,
95
- DteProvider,
96
- DteSearch,
97
- DteFilter,
98
- DteSortList,
99
- DteColumnsToggle,
100
- DtePagination,
101
- type TDteColumnProps,
94
+ MantineDatatableExtended,
95
+ MDEProvider,
96
+ MDESearch,
97
+ MDEFilter,
98
+ MDESortList,
99
+ MDEColumnsToggle,
100
+ MDEPagination,
101
+ type TMDEColumnProps,
102
102
  } from "mantine-datatable-extended";
103
103
  import { useDataTableColumns } from "mantine-datatable";
104
104
  import { Group, Space } from "@mantine/core";
105
105
 
106
- const columns: TDteColumnProps[] = [
106
+ const columns: TMDEColumnProps[] = [
107
107
  {
108
108
  accessor: "name",
109
109
  title: "Name",
@@ -124,27 +124,27 @@ export default function MyTable() {
124
124
  });
125
125
 
126
126
  return (
127
- <DteProvider
127
+ <MDEProvider
128
128
  columns={columns}
129
129
  originalUseDataTableColumnsResult={originalUseDataTableColumnsResult}
130
130
  storeColumnsKey="my-table"
131
131
  >
132
132
  <Group justify="space-between">
133
133
  <Group>
134
- <DteSearch />
135
- <DteFilter />
134
+ <MDESearch />
135
+ <MDEFilter />
136
136
  </Group>
137
137
  <Group>
138
- <DteSortList />
139
- <DteColumnsToggle />
138
+ <MDESortList />
139
+ <MDEColumnsToggle />
140
140
  </Group>
141
141
  </Group>
142
142
 
143
143
  <Space h="md" />
144
- <DteExtended records={data} />
144
+ <MantineDatatableExtended records={data} />
145
145
  <Space h="md" />
146
- <DtePagination />
147
- </DteProvider>
146
+ <MDEPagination />
147
+ </MDEProvider>
148
148
  );
149
149
  }
150
150
  ```
@@ -0,0 +1 @@
1
+ import {z}from'zod';var t={ASC:"asc",DESC:"desc"},r={TEXT:"text",NUMBER:"number",NUMBER_RANGE:"number_range",DATE:"date",DATE_RANGE:"date_range",SINGLE_SELECT:"single_select",MULTI_SELECT:"multi_select"};var c=z.object({accessor:z.string(),direction:z.enum(t)}),i=z.object({accessors:z.array(z.string()),value:z.string()}),n=z.object({variant:z.enum(r),accessor:z.string(),value:z.union([z.string(),z.array(z.string())])});var l={page:"page",pageSize:"pageSize",sorts:"sorts",search:"search",filters:"filters"},E={page:1,pageSize:10,sorts:[],search:{accessors:[],value:""},filters:[]},S=[10,20,30,40,50],T=0,g={view:{columnsToggle:"Columns Toggle",columnsToggleSearchPlaceholder:"Search columns\u2026"},sort:{sort:"Sort",addSort:"Add Sort",resetSort:"Reset Sort",asc:"Asc",desc:"Desc"},search:{search:"Search",searchAccessorsSearchPlaceholder:"Search columns\u2026"},filter:{resetFilter:"Reset Filters"},pagination:{rowsPerPage:"Rows per page",pageOfTotalPages:["Page","of"],startEndRecordOfTotalRecords:["","-","/"]}};export{t as a,r as b,c,i as d,n as e,l as f,E as g,S as h,T as i,g as j};
@@ -2,6 +2,50 @@ import * as react from 'react';
2
2
  import { DataTableColumn, useDataTableColumns } from 'mantine-datatable';
3
3
  import { z } from 'zod';
4
4
 
5
+ declare const sortSchema: z.ZodObject<{
6
+ accessor: z.ZodString;
7
+ direction: z.ZodEnum<{
8
+ readonly ASC: "asc";
9
+ readonly DESC: "desc";
10
+ }>;
11
+ }, z.core.$strip>;
12
+ type TSortCondition = z.infer<typeof sortSchema>;
13
+ declare const searchSchema: z.ZodObject<{
14
+ accessors: z.ZodArray<z.ZodString>;
15
+ value: z.ZodString;
16
+ }, z.core.$strip>;
17
+ type TSearchCondition = z.infer<typeof searchSchema>;
18
+ declare const filterSchema: z.ZodObject<{
19
+ variant: z.ZodEnum<{
20
+ readonly TEXT: "text";
21
+ readonly NUMBER: "number";
22
+ readonly NUMBER_RANGE: "number_range";
23
+ readonly DATE: "date";
24
+ readonly DATE_RANGE: "date_range";
25
+ readonly SINGLE_SELECT: "single_select";
26
+ readonly MULTI_SELECT: "multi_select";
27
+ }>;
28
+ accessor: z.ZodString;
29
+ value: z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>;
30
+ }, z.core.$strip>;
31
+ type TFilterCondition = z.infer<typeof filterSchema>;
32
+
33
+ /**
34
+ * Hook signature for a single query param: returns [value, setter].
35
+ */
36
+ type TQueryParamHook<T> = (key: string, defaultValue: T) => readonly [T, (value: T) => void];
37
+ /**
38
+ * Adapter interface for query params state management.
39
+ * Implement this to use different backends (nuqs, localStorage, memory, etc.).
40
+ */
41
+ type TQueryParamsAdapter = {
42
+ usePage: TQueryParamHook<number>;
43
+ usePageSize: TQueryParamHook<number>;
44
+ useSorts: TQueryParamHook<TSortCondition[]>;
45
+ useSearch: TQueryParamHook<TSearchCondition>;
46
+ useFilters: TQueryParamHook<TFilterCondition[]>;
47
+ };
48
+
5
49
  /**
6
50
  * Options for multi-select filter variant.
7
51
  */
@@ -66,7 +110,7 @@ type TFilterableExtend = TBaseExtend & ({
66
110
  * Extended column props for DataTable with search, sort, and filter support.
67
111
  * Extends mantine-datatable's DataTableColumn with an optional `extend` property.
68
112
  */
69
- type TDteColumnProps<T = Record<string, unknown>> = Omit<DataTableColumn<T>, "sortable" | "sortKey" | "filter" | "filterPopoverProps" | "filterPopoverDisableClickOutside" | "filtering" | "ellipsis" | "noWrap"> & {
113
+ type TMDEColumnProps<T = Record<string, unknown>> = Omit<DataTableColumn<T>, "sortable" | "sortKey" | "filter" | "filterPopoverProps" | "filterPopoverDisableClickOutside" | "filtering" | "ellipsis" | "noWrap"> & {
70
114
  /**
71
115
  * The extended properties of the column.
72
116
  */
@@ -89,35 +133,7 @@ type TDteColumnProps<T = Record<string, unknown>> = Omit<DataTableColumn<T>, "so
89
133
  noWrap?: boolean;
90
134
  });
91
135
 
92
- declare const sortSchema: z.ZodObject<{
93
- accessor: z.ZodString;
94
- direction: z.ZodEnum<{
95
- readonly ASC: "asc";
96
- readonly DESC: "desc";
97
- }>;
98
- }, z.core.$strip>;
99
- type TSortCondition = z.infer<typeof sortSchema>;
100
- declare const searchSchema: z.ZodObject<{
101
- accessors: z.ZodArray<z.ZodString>;
102
- value: z.ZodString;
103
- }, z.core.$strip>;
104
- type TSearchCondition = z.infer<typeof searchSchema>;
105
- declare const filterSchema: z.ZodObject<{
106
- variant: z.ZodEnum<{
107
- readonly TEXT: "text";
108
- readonly NUMBER: "number";
109
- readonly NUMBER_RANGE: "number_range";
110
- readonly DATE: "date";
111
- readonly DATE_RANGE: "date_range";
112
- readonly SINGLE_SELECT: "single_select";
113
- readonly MULTI_SELECT: "multi_select";
114
- }>;
115
- accessor: z.ZodString;
116
- value: z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>;
117
- }, z.core.$strip>;
118
- type TFilterCondition = z.infer<typeof filterSchema>;
119
-
120
- type TDteViewOptions = {
136
+ type TMDEViewOptions = {
121
137
  /**
122
138
  * The label for the columns toggle button.
123
139
  */
@@ -127,7 +143,7 @@ type TDteViewOptions = {
127
143
  */
128
144
  columnsToggleSearchPlaceholder: string;
129
145
  };
130
- type TDteSortOptions = {
146
+ type TMDESortOptions = {
131
147
  /**
132
148
  * The label for the sort button.
133
149
  */
@@ -149,7 +165,7 @@ type TDteSortOptions = {
149
165
  */
150
166
  desc: string;
151
167
  };
152
- type TDteSearchOptions = {
168
+ type TMDESearchOptions = {
153
169
  /**
154
170
  * The label for the search input placeholder.
155
171
  */
@@ -159,13 +175,13 @@ type TDteSearchOptions = {
159
175
  */
160
176
  searchAccessorsSearchPlaceholder: string;
161
177
  };
162
- type TDteFilterOptions = {
178
+ type TMDEFilterOptions = {
163
179
  /**
164
180
  * The label for the reset filter button.
165
181
  */
166
182
  resetFilter: string;
167
183
  };
168
- type TDtePaginationOptions = {
184
+ type TMDEPaginationOptions = {
169
185
  /**
170
186
  * The label for the rows per page.
171
187
  */
@@ -188,23 +204,23 @@ type TDtePaginationOptions = {
188
204
  * Unified i18n type for all DataTable components.
189
205
  * Grouped by component - full type stored in context (after merging with defaults).
190
206
  */
191
- type TDteI18n = {
192
- view: TDteViewOptions;
193
- sort: TDteSortOptions;
194
- search: TDteSearchOptions;
195
- filter: TDteFilterOptions;
196
- pagination: TDtePaginationOptions;
207
+ type TMDEI18n = {
208
+ view: TMDEViewOptions;
209
+ sort: TMDESortOptions;
210
+ search: TMDESearchOptions;
211
+ filter: TMDEFilterOptions;
212
+ pagination: TMDEPaginationOptions;
197
213
  };
198
214
  /**
199
- * Input type for i18n prop in DteProvider.
215
+ * Input type for i18n prop in MDEProvider.
200
216
  * Each group is optional - only override the keys you need.
201
217
  */
202
- type TDteI18nInput = {
203
- view?: Partial<TDteViewOptions>;
204
- sort?: Partial<TDteSortOptions>;
205
- search?: Partial<TDteSearchOptions>;
206
- filter?: Partial<TDteFilterOptions>;
207
- pagination?: Partial<TDtePaginationOptions>;
218
+ type TMDEI18nInput = {
219
+ view?: Partial<TMDEViewOptions>;
220
+ sort?: Partial<TMDESortOptions>;
221
+ search?: Partial<TMDESearchOptions>;
222
+ filter?: Partial<TMDEFilterOptions>;
223
+ pagination?: Partial<TMDEPaginationOptions>;
208
224
  };
209
225
 
210
226
  /**
@@ -239,23 +255,23 @@ type TDefaultParams = {
239
255
  /**
240
256
  * The default page number.
241
257
  */
242
- page?: number;
258
+ page: number;
243
259
  /**
244
260
  * The default page size.
245
261
  */
246
- pageSize?: number;
262
+ pageSize: number;
247
263
  /**
248
264
  * The default sorts.
249
265
  */
250
- sorts?: TSortCondition[];
266
+ sorts: TSortCondition[];
251
267
  /**
252
268
  * The default search.
253
269
  */
254
- search?: TSearchCondition;
270
+ search: TSearchCondition;
255
271
  /**
256
272
  * The default filters.
257
273
  */
258
- filters?: TFilterCondition[];
274
+ filters: TFilterCondition[];
259
275
  };
260
276
  /**
261
277
  * Pagination configuration passed to DataTable context.
@@ -271,9 +287,13 @@ type TPaginationProps = {
271
287
  recordsPerPageOptions: number[];
272
288
  };
273
289
  /**
274
- * Context value type for DteProvider.
290
+ * Stable configuration context rarely changes after mount.
275
291
  */
276
- type TDteContextProps<T = Record<string, unknown>> = {
292
+ type TMDEConfigContextProps<T = Record<string, unknown>> = {
293
+ /**
294
+ * Adapter for query params state management (nuqs, TanStack Router, etc.).
295
+ */
296
+ queryParamsAdapter: TQueryParamsAdapter;
277
297
  /**
278
298
  * The keys of the URL parameters.
279
299
  * Useful for multiple data tables on the same page.
@@ -283,21 +303,28 @@ type TDteContextProps<T = Record<string, unknown>> = {
283
303
  * The default parameters of the data table.
284
304
  */
285
305
  defaultParams?: TDefaultParams;
286
- /**
287
- * The key of the column store.
288
- * This is used to store the columns of the data table in localStorage for draggable and toggleable columns.
289
- * Event if you don't want to use the draggable and toggleable columns, you should set this key.
290
- */
291
- storeColumnsKey: string;
292
306
  /**
293
307
  * The columns of the data table.
294
308
  * This is use original column properties from mantine-datatable with "extend" property.
295
309
  */
296
- columns: TDteColumnProps<T>[];
310
+ columns: TMDEColumnProps<T>[];
297
311
  /**
298
312
  * The result of the useDataTableColumns hook from mantine-datatable.
299
313
  */
300
- originalUseDataTableColumnsResult: ReturnType<typeof useDataTableColumns<T>>;
314
+ useDataTableColumnsResult: ReturnType<typeof useDataTableColumns<T>> & {
315
+ key: string;
316
+ };
317
+ /**
318
+ * Internationalization strings for all DataTable components.
319
+ * In context: merged result (always present).
320
+ * In provider props: optional input, merged with defaults.
321
+ */
322
+ i18n: TMDEI18n;
323
+ };
324
+ /**
325
+ * Mutable pagination context — changes on every data fetch.
326
+ */
327
+ type TMDEPaginationContextProps = {
301
328
  /**
302
329
  * The pagination props.
303
330
  */
@@ -310,19 +337,14 @@ type TDteContextProps<T = Record<string, unknown>> = {
310
337
  * The function to set the pagination records per page options.
311
338
  */
312
339
  setRecordsPerPageOptions?: (recordsPerPageOptions: number[]) => void;
313
- /**
314
- * Internationalization strings for all DataTable components.
315
- * In context: merged result (always present).
316
- * In provider props: optional input, merged with defaults.
317
- */
318
- i18n: TDteI18n;
319
340
  };
320
341
  /**
321
- * Props for DteProvider. Extends context props but i18n is optional input.
342
+ * Props for MDEProvider. Extends context props but i18n is optional input.
322
343
  */
323
- type TDteProviderProps<T = Record<string, unknown>> = Omit<TDteContextProps<T>, "i18n"> & {
344
+ type TMDEProviderProps<T = Record<string, unknown>> = Omit<TMDEConfigContextProps<T> & TMDEPaginationContextProps, "i18n" | "paginationProps"> & {
324
345
  children: react.ReactNode;
325
- i18n?: TDteI18nInput;
346
+ paginationProps?: Partial<Pick<TPaginationProps, "recordsPerPageOptions">>;
347
+ i18n?: TMDEI18nInput;
326
348
  };
327
349
 
328
- export type { TDteProviderProps as T, TDteContextProps as a, TDteColumnProps as b, TDteI18nInput as c };
350
+ export type { TQueryParamsAdapter as T, TPaginationProps as a, TMDEColumnProps as b, TUrlKeys as c, TDefaultParams as d, TMDEI18nInput as e, TSortCondition as f, TSearchCondition as g, TFilterCondition as h, TMDEProviderProps as i };
package/dist/index.d.ts CHANGED
@@ -1,32 +1,138 @@
1
+ import { T as TQueryParamsAdapter, a as TPaginationProps, b as TMDEColumnProps, c as TUrlKeys, d as TDefaultParams, e as TMDEI18nInput, f as TSortCondition, g as TSearchCondition, h as TFilterCondition, i as TMDEProviderProps } from './data-table-provider.type-DPvItGHz.js';
1
2
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { DataTableProps, DataTablePaginationProps, DataTableSortProps } from 'mantine-datatable';
3
- import * as nuqs from 'nuqs';
4
- import { T as TDteProviderProps, a as TDteContextProps } from './data-table-provider.type-dlzY73EE.js';
5
- export { b as TDteColumnProps, c as TDteI18nInput } from './data-table-provider.type-dlzY73EE.js';
3
+ import * as mantine_datatable from 'mantine-datatable';
4
+ import { DataTableProps, DataTablePaginationProps, DataTableSortProps, useDataTableColumns } from 'mantine-datatable';
6
5
  import 'react';
7
6
  import 'zod';
8
7
 
9
- declare function DteColumnsToggle(): react_jsx_runtime.JSX.Element;
8
+ /**
9
+ * Nuqs-based adapter for query params.
10
+ * Syncs state with URL search params via nuqs.
11
+ */
12
+ declare function createNuqsQueryParamsAdapter(): TQueryParamsAdapter;
10
13
 
11
- type TDteExtendedProps<T = Record<string, unknown>> = Omit<DataTableProps<T>, "storeColumnsKey" | "groups" | "columns" | keyof DataTablePaginationProps | keyof DataTableSortProps>;
12
- declare function DteExtended<T = Record<string, unknown>>(props: TDteExtendedProps<T>): react_jsx_runtime.JSX.Element;
14
+ /**
15
+ * TanStack Router-based adapter for query params.
16
+ * Syncs state with URL search params via useSearch and useNavigate.
17
+ * Requires @tanstack/react-router to be installed.
18
+ */
19
+ declare function createTanStackRouterQueryParamsAdapter(): TQueryParamsAdapter;
13
20
 
14
- declare function DteFilter(): react_jsx_runtime.JSX.Element;
21
+ declare function MDEColumnsToggle(): react_jsx_runtime.JSX.Element;
15
22
 
16
- type TDtePaginationProps = {
17
- recordsPerPageOptions?: number[];
18
- };
19
- declare function DtePagination({ recordsPerPageOptions, }: TDtePaginationProps): false | react_jsx_runtime.JSX.Element;
23
+ type TMantineDatatableExtendedProps<T = Record<string, unknown>> = Omit<DataTableProps<T>, "storeColumnsKey" | "groups" | "columns" | keyof DataTablePaginationProps | keyof DataTableSortProps> & Partial<Pick<TPaginationProps, "totalRecords">>;
24
+ declare function MantineDatatableExtended<T = Record<string, unknown>>(props: TMantineDatatableExtendedProps<T>): react_jsx_runtime.JSX.Element;
25
+
26
+ declare function MDEFilter(): react_jsx_runtime.JSX.Element;
27
+
28
+ declare function MDEPagination(): false | react_jsx_runtime.JSX.Element;
20
29
 
21
- declare function DteSearch(): react_jsx_runtime.JSX.Element;
30
+ declare function MDESearch(): react_jsx_runtime.JSX.Element;
22
31
 
23
- declare function DteSortList(): react_jsx_runtime.JSX.Element;
32
+ declare function MDESortList(): react_jsx_runtime.JSX.Element;
33
+
34
+ type TUseMDEInputs<T = Record<string, unknown>> = {
35
+ /**
36
+ * The columns to display in the data table.
37
+ */
38
+ columns: TMDEColumnProps<T>[];
39
+ /**
40
+ * The query params adapter to use for the data table.
41
+ */
42
+ queryParamsAdapter: TQueryParamsAdapter;
43
+ /**
44
+ * The props to pass to the useDataTableColumns hook.
45
+ */
46
+ useDataTableColumnsProps?: Parameters<typeof useDataTableColumns<T>>[0];
47
+ /**
48
+ * The url keys to use for the data table.
49
+ */
50
+ urlKeys?: Partial<TUrlKeys>;
51
+ /**
52
+ * The default params to use for the data table.
53
+ */
54
+ defaultParams?: Partial<TDefaultParams>;
55
+ /**
56
+ * The pagination props to use for the data table.
57
+ */
58
+ paginationProps?: Partial<Pick<TPaginationProps, "recordsPerPageOptions">>;
59
+ /**
60
+ * The i18n to use for the data table.
61
+ */
62
+ i18n?: Partial<TMDEI18nInput>;
63
+ };
64
+ declare function useMDE<T = Record<string, unknown>>({ useDataTableColumnsProps, columns, queryParamsAdapter, urlKeys, defaultParams, paginationProps, i18n, }: TUseMDEInputs<T>): {
65
+ columns: TMDEColumnProps<T>[];
66
+ urlKeys: {
67
+ page: string;
68
+ pageSize: string;
69
+ sorts: string;
70
+ search: string;
71
+ filters: string;
72
+ };
73
+ defaultParams: {
74
+ page: number;
75
+ pageSize: number;
76
+ sorts: TSortCondition[];
77
+ search: TSearchCondition;
78
+ filters: TFilterCondition[];
79
+ };
80
+ i18n: any;
81
+ queryParamsAdapter: TQueryParamsAdapter;
82
+ useDataTableColumnsResult: {
83
+ key: string;
84
+ effectiveColumns: mantine_datatable.DataTableColumn<T>[];
85
+ setColumnsOrder: (order: string[] | ((prev: string[]) => string[])) => void;
86
+ columnsOrder: string[];
87
+ resetColumnsOrder: () => void;
88
+ columnsToggle: mantine_datatable.DataTableColumnToggle[];
89
+ setColumnsToggle: (toggle: mantine_datatable.DataTableColumnToggle[] | ((prev: mantine_datatable.DataTableColumnToggle[]) => mantine_datatable.DataTableColumnToggle[])) => void;
90
+ resetColumnsToggle: () => void;
91
+ columnsWidth: {
92
+ [x: string]: string | number;
93
+ }[];
94
+ setColumnsWidth: (updates: {
95
+ accessor: string;
96
+ width: string | number;
97
+ }[]) => void;
98
+ setColumnWidth: (accessor: string, width: string | number) => void;
99
+ setMultipleColumnWidths: (updates: {
100
+ accessor: string;
101
+ width: string | number;
102
+ }[]) => void;
103
+ resetColumnsWidth: () => void;
104
+ hasResizableColumns: boolean;
105
+ allResizableWidthsInitial: boolean;
106
+ measureAndSetColumnWidths: () => void;
107
+ };
108
+ paginationProps: {
109
+ recordsPerPageOptions: number[];
110
+ };
111
+ };
24
112
 
25
- declare function useDteQueryParams(): {
113
+ /**
114
+ *
115
+ * @returns Use this hook to get/set page number.
116
+ */
117
+ declare function useMDEPage(): {
26
118
  page: number;
27
- setPage: (value: number | ((old: number) => number | null) | null, options?: nuqs.Options) => Promise<URLSearchParams>;
119
+ setPage: (value: number) => void;
120
+ resetPage: () => void;
121
+ };
122
+ /**
123
+ *
124
+ * @returns Use this hook to get/set page size.
125
+ */
126
+ declare function useMDEPageSize(): {
28
127
  pageSize: number;
29
- setPageSize: (value: number | ((old: number) => number | null) | null, options?: nuqs.Options) => Promise<URLSearchParams>;
128
+ setPageSize: (value: number) => void;
129
+ resetPageSize: () => void;
130
+ };
131
+ /**
132
+ *
133
+ * @returns Use this hook to get/set sorts.
134
+ */
135
+ declare function useMDESorts(): {
30
136
  sorts: {
31
137
  accessor: string;
32
138
  direction: "asc" | "desc";
@@ -34,13 +140,14 @@ declare function useDteQueryParams(): {
34
140
  setSorts: (value: {
35
141
  accessor: string;
36
142
  direction: "asc" | "desc";
37
- }[] | ((old: {
38
- accessor: string;
39
- direction: "asc" | "desc";
40
- }[]) => {
41
- accessor: string;
42
- direction: "asc" | "desc";
43
- }[] | null) | null, options?: nuqs.Options) => Promise<URLSearchParams>;
143
+ }[]) => void;
144
+ resetSorts: () => void;
145
+ };
146
+ /**
147
+ *
148
+ * @returns Use this hook to get/set search.
149
+ */
150
+ declare function useMDESearch(): {
44
151
  search: {
45
152
  accessors: string[];
46
153
  value: string;
@@ -48,31 +155,61 @@ declare function useDteQueryParams(): {
48
155
  setSearch: (value: {
49
156
  accessors: string[];
50
157
  value: string;
51
- } | ((old: {
52
- accessors: string[];
53
- value: string;
54
- }) => {
55
- accessors: string[];
56
- value: string;
57
- } | null) | null, options?: nuqs.Options) => Promise<URLSearchParams>;
158
+ }) => void;
159
+ resetSearch: () => void;
160
+ };
161
+ /**
162
+ *
163
+ * @returns Use this hook to get/set filters.
164
+ */
165
+ declare function useMDEFilters(): {
58
166
  filters: {
59
- variant: "number" | "text" | "date" | "date_range" | "number_range" | "single_select" | "multi_select";
167
+ variant: "number" | "text" | "number_range" | "date" | "date_range" | "single_select" | "multi_select";
60
168
  accessor: string;
61
169
  value: string | string[];
62
170
  }[];
63
171
  setFilters: (value: {
64
- variant: "number" | "text" | "date" | "date_range" | "number_range" | "single_select" | "multi_select";
172
+ variant: "number" | "text" | "number_range" | "date" | "date_range" | "single_select" | "multi_select";
65
173
  accessor: string;
66
174
  value: string | string[];
67
- }[] | ((old: {
68
- variant: "number" | "text" | "date" | "date_range" | "number_range" | "single_select" | "multi_select";
175
+ }[]) => void;
176
+ resetFilters: () => void;
177
+ };
178
+ /**
179
+ *
180
+ * @returns Use this hook to get/set all query parameters.
181
+ */
182
+ declare function useMDEQueryParams(): {
183
+ page: number;
184
+ setPage: (value: number) => void;
185
+ pageSize: number;
186
+ setPageSize: (value: number) => void;
187
+ sorts: {
188
+ accessor: string;
189
+ direction: "asc" | "desc";
190
+ }[];
191
+ setSorts: (value: {
192
+ accessor: string;
193
+ direction: "asc" | "desc";
194
+ }[]) => void;
195
+ search: {
196
+ accessors: string[];
197
+ value: string;
198
+ };
199
+ setSearch: (value: {
200
+ accessors: string[];
201
+ value: string;
202
+ }) => void;
203
+ filters: {
204
+ variant: "number" | "text" | "number_range" | "date" | "date_range" | "single_select" | "multi_select";
69
205
  accessor: string;
70
206
  value: string | string[];
71
- }[]) => {
72
- variant: "number" | "text" | "date" | "date_range" | "number_range" | "single_select" | "multi_select";
207
+ }[];
208
+ setFilters: (value: {
209
+ variant: "number" | "text" | "number_range" | "date" | "date_range" | "single_select" | "multi_select";
73
210
  accessor: string;
74
211
  value: string | string[];
75
- }[] | null) | null, options?: nuqs.Options) => Promise<URLSearchParams>;
212
+ }[]) => void;
76
213
  resetPage: () => void;
77
214
  resetPageSize: () => void;
78
215
  resetSorts: () => void;
@@ -81,7 +218,12 @@ declare function useDteQueryParams(): {
81
218
  resetAll: () => void;
82
219
  };
83
220
 
84
- declare function useDteContext<T = Record<string, unknown>>(): TDteContextProps<T>;
85
- declare function DteProvider<T = Record<string, unknown>>({ children, urlKeys, defaultParams, storeColumnsKey, columns, originalUseDataTableColumnsResult, i18n: i18nInput, }: TDteProviderProps<T>): react_jsx_runtime.JSX.Element;
221
+ declare function MDEProvider<T = Record<string, unknown>>({ children, queryParamsAdapter, urlKeys, defaultParams, columns, useDataTableColumnsResult, i18n: i18nInput, paginationProps, }: TMDEProviderProps<T>): react_jsx_runtime.JSX.Element;
222
+
223
+ type TCreateMDEColumnsHelperProps<T = Record<string, unknown>> = () => TMDEColumnProps<T>[];
224
+ /**
225
+ * A helper function to create columns for the data table.
226
+ */
227
+ declare function createMDEColumnsHelper<T = Record<string, unknown>>(getColumns: TCreateMDEColumnsHelperProps<T>): TMDEColumnProps<T>[];
86
228
 
87
- export { DteColumnsToggle, DteExtended, DteFilter, DtePagination, DteProvider, DteSearch, DteSortList, TDteProviderProps, useDteContext, useDteQueryParams };
229
+ export { MDEColumnsToggle, MDEFilter, MDEPagination, MDEProvider, MDESearch, MDESortList, MantineDatatableExtended, createMDEColumnsHelper, createNuqsQueryParamsAdapter, createTanStackRouterQueryParamsAdapter, useMDE, useMDEFilters, useMDEPage, useMDEPageSize, useMDEQueryParams, useMDESearch, useMDESorts };
package/dist/index.mjs CHANGED
@@ -1,2 +1,3 @@
1
+ "use no memo";
1
2
  "use client";
2
- import {Popover,Button,TextInput,Divider,ScrollArea,Stack,Checkbox,Group,Text,NativeSelect,Space,Pagination,CloseButton,Badge,Indicator,NumberInput,RangeSlider,ActionIcon,Select}from'@mantine/core';import {IconAdjustmentsHorizontal,IconSearch,IconX,IconArrowsSort,IconPlus,IconRefresh,IconFilter,IconTrash,IconGripHorizontal}from'@tabler/icons-react';import {createContext,useContext,useState,useMemo,useEffect}from'react';import {jsx,jsxs}from'react/jsx-runtime';import {DataTable}from'mantine-datatable';import {useQueryState,parseAsInteger,parseAsJson}from'nuqs';import we,{z}from'zod';import {DatePicker}from'@mantine/dates';import L from'dayjs';import {DragDropProvider}from'@dnd-kit/react';import {isSortable,useSortable}from'@dnd-kit/react/sortable';var B={view:{columnsToggle:"Columns Toggle",columnsToggleSearchPlaceholder:"Search columns\u2026"},sort:{sort:"Sort",addSort:"Add Sort",resetSort:"Reset Sort",asc:"Asc",desc:"Desc"},search:{search:"Search",searchAccessorsSearchPlaceholder:"Search columns\u2026"},filter:{resetFilter:"Reset Filters"},pagination:{rowsPerPage:"Rows per page",pageOfTotalPages:["Page","of"],startEndRecordOfTotalRecords:["","-","/"]}};var Te=createContext(void 0);function b(){let o=useContext(Te);if(!o)throw new Error("useDteContext must be used within a DteProvider");return o}function $e({children:o,urlKeys:e,defaultParams:l,storeColumnsKey:i,columns:a,originalUseDataTableColumnsResult:s,i18n:r}){if(!i)throw new Error("storeColumnsKey property is required");if(!a)throw new Error("columns property is required");let[m,p]=useState(0),[u,t]=useState([10,20,30,40,50]),c=useMemo(()=>({totalRecords:m,recordsPerPageOptions:u}),[m,u]),h=useMemo(()=>({view:{...B.view,...r?.view},sort:{...B.sort,...r?.sort},search:{...B.search,...r?.search},filter:{...B.filter,...r?.filter},pagination:{...B.pagination,...r?.pagination}}),[r]),g=useMemo(()=>({urlKeys:e,defaultParams:l,storeColumnsKey:i,columns:a,originalUseDataTableColumnsResult:s,paginationProps:c,setTotalRecords:p,setRecordsPerPageOptions:t,i18n:h}),[e,l,i,a,s,c,h]);return jsx(Te.Provider,{value:{...g},children:o})}function st(){let{originalUseDataTableColumnsResult:o,i18n:e}=b(),{effectiveColumns:l,columnsToggle:i,setColumnsToggle:a}=o,[s,r]=useState(""),m=useMemo(()=>i.filter(t=>t.toggleable),[i]),p=useMemo(()=>{if(!s.trim())return m;let t=s.toLowerCase().trim();return m.filter(c=>(l.find(g=>g.accessor===c.accessor)?.title?.toString()??"").toLowerCase().includes(t))},[m,l,s]),u=t=>{a(i.map(c=>c.accessor===t.accessor?{...c,toggled:!c.toggled}:c));};return jsxs(Popover,{shadow:"md",width:"max-content",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Button,{leftSection:jsx(IconAdjustmentsHorizontal,{size:16}),variant:"default",children:e.view.columnsToggle})}),jsxs(Popover.Dropdown,{p:"0",children:[jsx(TextInput,{autoFocus:true,leftSection:jsx(IconSearch,{size:16}),onChange:t=>r(t.target.value),p:"4",placeholder:e.view.columnsToggleSearchPlaceholder,styles:{input:{border:"none"}},value:s}),jsx(Divider,{}),jsx(ScrollArea.Autosize,{mah:180,type:"auto",children:jsx(Stack,{gap:"0",children:p.map(t=>jsx(Checkbox,{checked:t.toggled,classNames:{root:"mantine-dte-checkbox-root",body:"mantine-dte-checkbox-body",labelWrapper:"mantine-dte-checkbox-label-wrapper",label:"mantine-dte-checkbox-label",input:"mantine-dte-checkbox-input",icon:"mantine-dte-checkbox-icon"},label:l.find(c=>c.accessor===t.accessor)?.title?.toString()??"",labelPosition:"left",onChange:()=>u(t),size:"xs",variant:"outline"},t.accessor))})})]})]})}function it(o){let{storeColumnsKey:e,originalUseDataTableColumnsResult:l}=b(),{effectiveColumns:i}=l,a={...o,columns:i,storeColumnsKey:e};return jsx(DataTable,{...a})}var N={ASC:"asc",DESC:"desc"},F={TEXT:"text",NUMBER:"number",NUMBER_RANGE:"number_range",DATE:"date",DATE_RANGE:"date_range",SINGLE_SELECT:"single_select",MULTI_SELECT:"multi_select"};var ve=z.object({accessor:z.string(),direction:z.enum(N)}),be=z.object({accessors:z.array(z.string()),value:z.string()}),Pe=z.object({variant:z.enum(F),accessor:z.string(),value:z.union([z.string(),z.array(z.string())])});function D(){let o={page:"page",pageSize:"pageSize",sorts:"sorts",search:"search",filters:"filters"},e={page:1,pageSize:10,sorts:[],search:{accessors:[],value:""},filters:[]},{urlKeys:l,defaultParams:i}=b();l&&(o=l),i&&(e={...e,...i});let[a,s]=useQueryState(o.page,parseAsInteger.withDefault(e.page)),[r,m]=useQueryState(o.pageSize,parseAsInteger.withDefault(e.pageSize)),[p,u]=useQueryState(o.sorts,parseAsJson(we.array(ve)).withDefault(e.sorts)),[t,c]=useQueryState(o.search,parseAsJson(be).withDefault(e.search)),[h,g]=useQueryState(o.filters,parseAsJson(we.array(Pe)).withDefault(e.filters)),f=()=>{s(e.page);},n=()=>{m(e.pageSize);},d=()=>{u(e.sorts);},P=()=>{c(e.search);},T=()=>{g(e.filters);};return {page:a,setPage:s,pageSize:r,setPageSize:m,sorts:p,setSorts:u,search:t,setSearch:c,filters:h,setFilters:g,resetPage:f,resetPageSize:n,resetSorts:d,resetSearch:P,resetFilters:T,resetAll:()=>{f(),n(),d(),P(),T();}}}function Fe({column:o}){let e=o.accessor,l=o.extend?.filterVariant,{filters:i,setFilters:a}=D(),s=i.find(c=>c.accessor===e),r=s?.value?1:0,[m,p]=useState(s?L(Number.parseInt(s.value,10)).toISOString():null),u=c=>{if(p(c),c){let h=L(c).valueOf().toString();a(s?i.map(g=>g.accessor===e?{...g,value:h}:g):[...i,{variant:l,accessor:e,value:h}]);}},t=()=>{p(null),a(i.filter(c=>c.accessor!==e));};return jsxs(Popover,{shadow:"md",width:"max-content",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Indicator,{disabled:r<=0,processing:true,children:jsxs(Button.Group,{children:[r>0&&jsx(Button,{onClick:t,px:"xs",variant:"default",children:jsx(IconX,{size:16})}),jsx(Button,{variant:"default",children:o.title})]})})}),jsx(Popover.Dropdown,{children:jsx(DatePicker,{defaultDate:m?new Date(m):void 0,onChange:u,value:m})})]})}function Re({column:o}){let e=o.accessor,l=o.extend?.filterVariant,{filters:i,setFilters:a}=D(),s=i.find(h=>h.accessor===e),r=s?.value.length??0,[m,p]=useState(s?.value[0]&&s?.value[1]?[L(Number.parseInt(s.value[0],10)).toISOString(),L(Number.parseInt(s.value[1],10)).toISOString()]:[null,null]),u=([h,g])=>{if(p([h,g]),h&&g){let[f,n]=[L(h).valueOf().toString(),L(g).valueOf().toString()];a(s?i.map(d=>d.accessor===e?{...d,value:[f,n]}:d):[...i,{variant:l,accessor:e,value:[f,n]}]);}},t=()=>{p([null,null]),a(i.filter(h=>h.accessor!==e));},c=m[1]&&m[0];return jsxs(Popover,{shadow:"md",width:"max-content",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Indicator,{disabled:r<=0,processing:true,children:jsxs(Button.Group,{children:[r>0&&jsx(Button,{onClick:t,px:"xs",variant:"default",children:jsx(IconX,{size:16})}),jsx(Button,{variant:"default",children:o.title})]})})}),jsx(Popover.Dropdown,{children:jsx(DatePicker,{allowSingleDateInRange:true,defaultDate:c?new Date(c):void 0,onChange:u,type:"range",value:m})})]})}function Ee({column:o}){let e=o.accessor,l=o.extend?.filterVariant,a=(o.extend?.filterOptions).data,[s,r]=useState(""),m=useMemo(()=>{if(!s.trim())return a;let n=s.toLowerCase().trim();return a.filter(d=>d.label.toLowerCase().includes(n))},[a,s]),{filters:p,setFilters:u}=D(),t=p.find(n=>n.accessor===e),c=t?.value.length??0,h=n=>{let d=t?.value??[],P=d.includes(n)?d.filter(T=>T!==n):[...d,n];if(P.length===0)u(p.filter(T=>T.accessor!==e));else {let T=p.some(S=>S.accessor===e);u(T?p.map(S=>S.accessor===e?{...S,value:P}:S):[...p,{variant:l,accessor:e,value:P}]);}},g=n=>p.some(d=>d.accessor===e&&d.value.includes(n)),f=()=>{u(p.filter(n=>n.accessor!==e));};return jsxs(Popover,{shadow:"md",width:"max-content",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Indicator,{disabled:c<=0,processing:true,children:jsxs(Button.Group,{children:[c>0&&jsx(Button,{onClick:f,px:"xs",variant:"default",children:jsx(IconX,{size:16})}),jsx(Button,{variant:"default",children:o.title})]})})}),jsxs(Popover.Dropdown,{p:"0",children:[jsx(TextInput,{autoFocus:true,leftSection:jsx(IconSearch,{size:16}),onChange:n=>r(n.target.value),p:"4",styles:{input:{border:"none"}},value:s}),jsx(Divider,{}),jsx(ScrollArea.Autosize,{mah:180,type:"auto",children:jsx(Stack,{gap:"0",children:m.map(n=>jsx(Checkbox,{checked:g(n.value),classNames:{root:"mantine-dte-checkbox-root",body:"mantine-dte-checkbox-body",labelWrapper:"mantine-dte-checkbox-label-wrapper",label:"mantine-dte-checkbox-label",input:"mantine-dte-checkbox-input",icon:"mantine-dte-checkbox-icon"},label:n.label,labelPosition:"left",onChange:()=>h(n.value),size:"xs",styles:{labelWrapper:{display:"flex",justifyContent:"space-between",width:"100%"}},variant:"outline"},`${e}-${n.value}`))})})]})]})}function Ae({column:o}){let e=o.accessor,l=o.extend?.filterVariant,{filters:i,setFilters:a}=D(),s=i.find(t=>t.accessor===e),r=s?.value.length??0,m=t=>{a(s?i.map(c=>c.accessor===e?{...c,value:t.toString()}:c):[...i,{variant:l,accessor:e,value:t.toString()}]);},p=t=>{let c=t;typeof t=="string"&&(c=Number.parseInt(t,10)),m(c);},u=()=>{a(i.filter(t=>t.accessor!==e));};return jsxs(Popover,{shadow:"md",width:"250px",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Indicator,{disabled:r<=0,processing:true,children:jsxs(Button.Group,{children:[r>0&&jsx(Button,{onClick:u,px:"xs",variant:"default",children:jsx(IconX,{size:16})}),jsx(Button,{variant:"default",children:o.title})]})})}),jsx(Popover.Dropdown,{p:"0",children:jsx(NumberInput,{autoFocus:true,leftSection:jsx(IconFilter,{size:16}),onChange:t=>p(t),p:"4",value:s?.value?Number.parseInt(s.value,10):void 0,variant:"unstyled"})})]})}function Oe({column:o}){let e=o.accessor,l=o.extend?.filterVariant,{min:i,max:a,step:s=1,minRange:r=1,suffix:m}=o.extend?.filterOptions,{filters:p,setFilters:u}=D(),t=p.find(T=>T.accessor===e),c=t?.value.length??0,h=T=>{let[S,k]=[T[0].toString(),T[1].toString()];u(t?p.map(X=>X.accessor===e?{...X,value:[S,k]}:X):[...p,{variant:l,accessor:e,value:[S,k]}]);},g=t?.value[0]&&t?.value[1]?[Number.parseInt(t.value[0],10),Number.parseInt(t.value[1],10)]:[i,a],f=([T,S])=>{h([T,S]);},n=T=>{let S=typeof T=="string"?Number.parseInt(T,10)||i:T,k=Math.min(Math.max(S,i),g[1]);h([k,g[1]]);},d=T=>{let S=typeof T=="string"?Number.parseInt(T,10)||a:T,k=Math.max(Math.min(S,a),g[0]);h([g[0],k]);},P=()=>{u(p.filter(T=>T.accessor!==e));};return jsxs(Popover,{shadow:"md",width:"250px",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Indicator,{disabled:c<=0,processing:true,children:jsxs(Button.Group,{children:[c>0&&jsx(Button,{onClick:P,px:"xs",variant:"default",children:jsx(IconX,{size:16})}),jsx(Button,{variant:"default",children:o.title})]})})}),jsx(Popover.Dropdown,{p:"xs",children:jsxs(Stack,{gap:"md",children:[jsxs(Group,{grow:true,children:[jsx(NumberInput,{max:g[1],min:i,onChange:n,step:s,suffix:m,value:g[0]}),jsx(NumberInput,{max:a,min:g[0],onChange:d,step:s,suffix:m,value:g[1]})]}),jsx(RangeSlider,{label:null,max:a,min:i,minRange:r,onChange:f,step:s,value:g})]})})]})}function Ve({column:o}){let e=o.accessor,l=o.extend?.filterVariant,a=(o.extend?.filterOptions).data,[s,r]=useState(""),m=useMemo(()=>{if(!s.trim())return a;let n=s.toLowerCase().trim();return a.filter(d=>d.label.toLowerCase().includes(n))},[a,s]),{filters:p,setFilters:u}=D(),t=p.find(n=>n.accessor===e),c=t?.value.length??0,h=n=>{u(t?p.map(d=>d.accessor===e?{...d,value:n}:d):[...p,{variant:l,accessor:e,value:n}]);},g=n=>t?.value===n,f=()=>{u(p.filter(n=>n.accessor!==e));};return jsxs(Popover,{shadow:"md",width:"max-content",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Indicator,{disabled:c<=0,processing:true,children:jsxs(Button.Group,{children:[c>0&&jsx(Button,{onClick:f,px:"xs",variant:"default",children:jsx(IconX,{size:16})}),jsx(Button,{variant:"default",children:o.title})]})})}),jsxs(Popover.Dropdown,{p:"0",children:[jsx(TextInput,{autoFocus:true,leftSection:jsx(IconSearch,{size:16}),onChange:n=>r(n.target.value),p:"4",styles:{input:{border:"none"}},value:s}),jsx(Divider,{}),jsx(ScrollArea.Autosize,{mah:180,type:"auto",children:jsx(Stack,{gap:"0",children:m.map(n=>jsx(Checkbox,{checked:g(n.value),classNames:{root:"mantine-dte-checkbox-root",body:"mantine-dte-checkbox-body",labelWrapper:"mantine-dte-checkbox-label-wrapper",label:"mantine-dte-checkbox-label",input:"mantine-dte-checkbox-input",icon:"mantine-dte-checkbox-icon"},label:n.label,labelPosition:"left",onChange:()=>h(n.value),radius:"xl",size:"xs",styles:{labelWrapper:{display:"flex",justifyContent:"space-between",width:"100%"}}},`${e}-${n.value}`))})})]})]})}function Ne({column:o}){let e=o.accessor,l=o.extend?.filterVariant,{filters:i,setFilters:a}=D(),s=i.find(t=>t.accessor===e),r=s?.value.length??0,m=t=>{a(s?t===""?i.filter(c=>c.accessor!==e):i.map(c=>c.accessor===e?{...c,value:t}:c):[...i,{variant:l,accessor:e,value:t}]);},p=t=>{m(t);},u=()=>{a(i.filter(t=>t.accessor!==e));};return jsxs(Popover,{shadow:"md",width:"250px",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Indicator,{disabled:r<=0,processing:true,children:jsxs(Button.Group,{children:[r>0&&jsx(Button,{onClick:u,px:"xs",variant:"default",children:jsx(IconX,{size:16})}),jsx(Button,{variant:"default",children:o.title})]})})}),jsx(Popover.Dropdown,{p:"0",children:jsx(TextInput,{autoFocus:true,leftSection:jsx(IconFilter,{size:16}),onChange:t=>p(t.target.value),p:"4",value:s?.value??"",variant:"unstyled"})})]})}function jt(){let{filters:o,resetFilters:e}=D(),{columns:l,i18n:i}=b(),a=()=>{e();},s=l.filter(r=>r.extend?.filterable);return jsxs(Group,{gap:"xs",children:[s.map(r=>{switch(r.extend?.filterVariant){case F.TEXT:return jsx(Ne,{column:r},r.accessor);case F.NUMBER:return jsx(Ae,{column:r},r.accessor);case F.SINGLE_SELECT:return jsx(Ve,{column:r},r.accessor);case F.MULTI_SELECT:return jsx(Ee,{column:r},r.accessor);case F.DATE:return jsx(Fe,{column:r},r.accessor);case F.DATE_RANGE:return jsx(Re,{column:r},r.accessor);case F.NUMBER_RANGE:return jsx(Oe,{column:r},r.accessor);default:return null}}),o.length>0&&jsx(Button,{color:"red",leftSection:jsx(IconX,{size:16}),onClick:a,variant:"outline",children:i.filter.resetFilter})]})}var no=[10,20,30,40,50];function so({recordsPerPageOptions:o=no}){let{page:e,pageSize:l,setPage:i,setPageSize:a}=D(),{paginationProps:s,i18n:r}=b(),{totalRecords:m}=s||{},[p,u]=useState(0),[{startRecord:t,endRecord:c},h]=useState({startRecord:0,endRecord:0});return useEffect(()=>{u(Math.ceil((m||0)/(l||(o[0]??10))));},[m,l,o]),useEffect(()=>{h({startRecord:(e-1)*l+1,endRecord:Math.min(e*l,m||0)});},[e,l,m]),p>0&&jsxs(Group,{align:"center",justify:"space-between",children:[jsx(Group,{children:jsxs(Text,{size:"sm",children:[r.pagination.startEndRecordOfTotalRecords[0]," ",t," ",r.pagination.startEndRecordOfTotalRecords[1]," ",c," ",r.pagination.startEndRecordOfTotalRecords[2]," ",m]})}),jsxs(Group,{children:[jsx(Text,{size:"sm",children:r.pagination.rowsPerPage}),jsx(NativeSelect,{data:o.map(g=>({label:g.toString(),value:g.toString()})),onChange:g=>a(Number(g.target.value)),size:"xs",value:l,w:70}),jsx(Space,{w:"md"}),jsxs(Text,{size:"sm",children:[r.pagination.pageOfTotalPages[0]," ",e," ",r.pagination.pageOfTotalPages[1]," ",p]}),jsx(Pagination,{onChange:g=>i(g),size:"sm",total:p,value:e,withControls:true,withEdges:true})]})]})}function To(){let{columns:o,i18n:e}=b(),{search:l,setSearch:i}=D(),a=l.accessors.length,[s,r]=useState(""),m=useMemo(()=>o.filter(t=>t.extend?.searchable),[o]),p=useMemo(()=>{if(!s.trim())return m;let t=s.toLowerCase().trim();return m.filter(c=>(c.title?.toString()??"").toLowerCase().includes(t))},[m,s]),u=t=>{l.accessors.includes(t)?i({...l,accessors:l.accessors.filter(c=>c!==t)}):i({...l,accessors:[...l.accessors,t]});};return jsxs(Popover,{shadow:"md",width:"max-content",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Indicator,{color:"transparent",disabled:a<=0,label:jsx(Badge,{circle:true,size:"xs",variant:"outline",children:a}),children:jsx(ActionIcon,{size:36,variant:"default",children:jsx(IconSearch,{size:16})})})}),jsxs(Popover.Dropdown,{p:"0",children:[jsx(TextInput,{autoFocus:true,leftSection:jsx(IconSearch,{size:16}),onChange:t=>r(t.target.value),p:"4",placeholder:e.search.searchAccessorsSearchPlaceholder,styles:{input:{border:"none"}},value:s}),jsx(Divider,{}),jsx(ScrollArea.Autosize,{mah:180,type:"auto",children:jsx(Stack,{gap:"0",children:p.map(t=>jsx(Checkbox,{checked:l.accessors.includes(t.accessor.toString()),classNames:{root:"mantine-dte-checkbox-root",body:"mantine-dte-checkbox-body",labelWrapper:"mantine-dte-checkbox-label-wrapper",label:"mantine-dte-checkbox-label",input:"mantine-dte-checkbox-input",icon:"mantine-dte-checkbox-icon"},label:t.title?.toString()??"",labelPosition:"left",onChange:()=>u(t.accessor.toString()),size:"xs",variant:"outline"},t.accessor.toString()))})})]})]})}function Do(){let{search:o,setSearch:e}=D(),{i18n:l}=b(),i=a=>{e({...o,value:a});};return jsxs(Group,{gap:"xs",children:[jsx(To,{}),jsx(TextInput,{onChange:a=>i(a.target.value),placeholder:l.search.search,rightSection:o.value.length>0&&jsx(CloseButton,{onClick:()=>i(""),size:"sm",variant:"transparent"}),value:o.value,w:"200px"})]})}function Eo({sort:o,index:e,sortableColumns:l,onAccessorChange:i,onDirectionChange:a,onRemoveSort:s}){let{i18n:r}=b(),{ref:m,handleRef:p}=useSortable({id:o.accessor,index:e});return jsxs(Group,{align:"center",gap:"xs",ref:m,wrap:"nowrap",children:[jsx(Select,{checkIconPosition:"right",comboboxProps:{withinPortal:false},data:l.map(u=>({label:u.title?.toString()??"",value:u.accessor})),onChange:u=>i(o.accessor,u),searchable:true,size:"xs",value:o.accessor}),jsx(Select,{checkIconPosition:"right",comboboxProps:{withinPortal:false},data:Object.values(N).map(u=>({label:r.sort[u]??"",value:u})),onChange:u=>a(o.accessor,u),size:"xs",value:o.direction}),jsx(ActionIcon,{"aria-label":"Remove sort",onClick:()=>s(o.accessor),size:"md",variant:"default",children:jsx(IconTrash,{size:16})}),jsx(ActionIcon,{"aria-label":"Drag to reorder",ref:p,size:"md",style:{cursor:"grab",flexShrink:0},variant:"default",children:jsx(IconGripHorizontal,{size:16})})]})}function Io(){let{sorts:o,setSorts:e,resetSorts:l}=D(),{columns:i,i18n:a}=b(),s=i.filter(f=>f.extend?.sortable),r=s.filter(f=>!o.some(n=>n.accessor===f.accessor)),m=o.length,p=()=>{if(r.length>0&&r[0]){let f={accessor:r[0].accessor,direction:N.ASC};e([...o,f]);}},u=()=>{l();},t=f=>{e(o.filter(n=>n.accessor!==f));},c=(f,n)=>{if(n===null)return;let d=o.filter(P=>P.accessor!==f&&P.accessor!==n);e([...d,{accessor:n,direction:o.find(P=>P.accessor===f)?.direction||N.ASC}]);},h=(f,n)=>{n!==null&&e(o.map(d=>d.accessor===f?{...d,direction:n}:d));},g=f=>{if(f.canceled)return;let{source:n}=f.operation;if(n&&isSortable(n)){let{initialIndex:d,index:P}=n;d!==P&&e(T=>{let S=[...T],[k]=S.splice(d,1);return k&&S.splice(P,0,k),S});}};return jsxs(Popover,{shadow:"md",width:"450px",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Button,{leftSection:jsx(IconArrowsSort,{size:16}),rightSection:jsx(Badge,{circle:true,variant:"outline",children:m}),variant:"default",children:a.sort.sort})}),jsxs(Popover.Dropdown,{p:"sm",children:[jsx(DragDropProvider,{onDragEnd:g,children:jsx(Stack,{gap:"xs",children:o.map((f,n)=>jsx(Eo,{index:n,onAccessorChange:c,onDirectionChange:h,onRemoveSort:t,sort:f,sortableColumns:s},f.accessor))})}),jsx(Space,{h:"sm"}),jsxs(Group,{children:[jsx(Button,{color:"dark",disabled:r.length===0,leftSection:jsx(IconPlus,{size:16}),onClick:p,size:"xs",variant:"filled",children:a.sort.addSort}),jsx(Button,{leftSection:jsx(IconRefresh,{size:16}),onClick:u,size:"xs",variant:"default",children:a.sort.resetSort})]})]})]})}export{st as DteColumnsToggle,it as DteExtended,jt as DteFilter,so as DtePagination,$e as DteProvider,Do as DteSearch,Io as DteSortList,b as useDteContext,D as useDteQueryParams};
3
+ import {e,d,c,i,h,j as j$1,f,g,b,a}from'./chunk-EDD26HQ2.mjs';import {useQueryState,parseAsJson,parseAsInteger}from'nuqs';import {z}from'zod';import {useSearch,useNavigate}from'@tanstack/react-router';import {createContext,useMemo,useCallback,useState,useEffect,useContext}from'react';import {Popover,Button,TextInput,Divider,ScrollArea,Stack,Checkbox,Group,Text,NativeSelect,Space,Pagination,CloseButton,Badge,Indicator,NumberInput,RangeSlider,ActionIcon,Select}from'@mantine/core';import {IconAdjustmentsHorizontal,IconSearch,IconX,IconArrowsSort,IconPlus,IconRefresh,IconFilter,IconTrash,IconGripHorizontal}from'@tabler/icons-react';import {jsx,jsxs}from'react/jsx-runtime';import {DataTable,useDataTableColumns}from'mantine-datatable';import {DatePicker}from'@mantine/dates';import re from'dayjs';import {DragDropProvider}from'@dnd-kit/react';import {isSortable,useSortable}from'@dnd-kit/react/sortable';function Ne(){return {usePage:(e,t)=>useQueryState(e,parseAsInteger.withDefault(t)),usePageSize:(e,t)=>useQueryState(e,parseAsInteger.withDefault(t)),useSorts:(e,t)=>useQueryState(e,parseAsJson(z.array(c)).withDefault(t)),useSearch:(e,t)=>useQueryState(e,parseAsJson(d).withDefault(t)),useFilters:(e$1,t)=>useQueryState(e$1,parseAsJson(z.array(e)).withDefault(t))}}function Ve(e,t){if(e==null)return t;let a=Number(e);return Number.isNaN(a)?t:a}function ce(e,t,a){if(e==null)return a;let s=typeof e=="string"?(()=>{try{return JSON.parse(e)}catch{return e}})():e,r=t.safeParse(s);return r.success?r.data:a}function Ge(){return {usePage:(e,t)=>{let a=useSearch({strict:false}),s=useNavigate(),r=useMemo(()=>Ve(a[e],t),[a[e],t,e]),n=useCallback(o=>{s({to:".",search:l=>({...l,[e]:o}),replace:true});},[s,e]);return [r,n]},usePageSize:(e,t)=>{let a=useSearch({strict:false}),s=useNavigate(),r=useMemo(()=>Ve(a[e],t),[a[e],t,e]),n=useCallback(o=>{s({to:".",search:l=>({...l,[e]:o}),replace:true});},[s,e]);return [r,n]},useSorts:(e,t)=>{let a=useSearch({strict:false}),s=useNavigate(),r=useMemo(()=>ce(a[e],z.array(c),t),[a[e],t,e]),n=useCallback(o=>{s({to:".",search:l=>({...l,[e]:o}),replace:true});},[s,e]);return [r,n]},useSearch:(e,t)=>{let a=useSearch({strict:false}),s=useNavigate(),r=useMemo(()=>ce(a[e],d,t),[a[e],t,e]),n=useCallback(o=>{s({to:".",search:l=>({...l,[e]:o}),replace:true});},[s,e]);return [r,n]},useFilters:(e$1,t)=>{let a=useSearch({strict:false}),s=useNavigate(),r=useMemo(()=>ce(a[e$1],z.array(e),t),[a[e$1],t,e$1]),n=useCallback(o=>{s({to:".",search:l=>({...l,[e$1]:o}),replace:true});},[s,e$1]);return [r,n]}}}var He=createContext(void 0);function T(){let e=useContext(He);if(!e)throw new Error("useMDEConfigContext must be used within a MDEProvider");return e}var Ke=createContext(void 0);function Z(){let e=useContext(Ke);if(!e)throw new Error("useMDEPaginationContext must be used within a MDEProvider");return e}function dt({children:e,queryParamsAdapter:t,urlKeys:a,defaultParams:s,columns:r,useDataTableColumnsResult:n,i18n:o,paginationProps:l}){if(!r)throw new Error("columns property is required");if(!t)throw new Error("queryParamsAdapter property is required");let[p,m]=useState(i),[i$1,u]=useState(l?.recordsPerPageOptions??h),P=useMemo(()=>({view:{...j$1.view,...o?.view},sort:{...j$1.sort,...o?.sort},search:{...j$1.search,...o?.search},filter:{...j$1.filter,...o?.filter},pagination:{...j$1.pagination,...o?.pagination}}),[JSON.stringify(o)]),f=useMemo(()=>({queryParamsAdapter:t,urlKeys:a,defaultParams:s,columns:r,useDataTableColumnsResult:n,i18n:P}),[t,JSON.stringify(a),JSON.stringify(s),r,n,P]),g=useCallback(E=>m(E),[]),c=useCallback(E=>u(E),[]),d=useMemo(()=>({paginationProps:{totalRecords:p,recordsPerPageOptions:i$1},setTotalRecords:g,setRecordsPerPageOptions:c}),[p,i$1,g,c]);return jsx(He.Provider,{value:f,children:jsx(Ke.Provider,{value:d,children:e})})}function Ct(){let{useDataTableColumnsResult:e,i18n:t}=T(),{effectiveColumns:a,columnsToggle:s,setColumnsToggle:r}=e,[n,o]=useState(""),l=useMemo(()=>s.filter(i=>i.toggleable),[s]),p=useMemo(()=>{if(!n.trim())return l;let i=n.toLowerCase().trim();return l.filter(u=>(a.find(f=>f.accessor===u.accessor)?.title?.toString()??"").toLowerCase().includes(i))},[l,a,n]),m=i=>{r(s.map(u=>u.accessor===i.accessor?{...u,toggled:!u.toggled}:u));};return jsxs(Popover,{shadow:"md",width:"max-content",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Button,{leftSection:jsx(IconAdjustmentsHorizontal,{size:16}),variant:"default",children:t.view.columnsToggle})}),jsxs(Popover.Dropdown,{p:"0",children:[jsx(TextInput,{autoFocus:true,leftSection:jsx(IconSearch,{size:16}),onChange:i=>o(i.target.value),p:"4",placeholder:t.view.columnsToggleSearchPlaceholder,styles:{input:{border:"none"}},value:n}),jsx(Divider,{}),jsx(ScrollArea.Autosize,{mah:180,type:"auto",children:jsx(Stack,{gap:"0",children:p.map(i=>jsx(Checkbox,{checked:i.toggled,classNames:{root:"mantine-mde-checkbox-root",body:"mantine-mde-checkbox-body",labelWrapper:"mantine-mde-checkbox-label-wrapper",label:"mantine-mde-checkbox-label",input:"mantine-mde-checkbox-input",icon:"mantine-mde-checkbox-icon"},label:a.find(u=>u.accessor===i.accessor)?.title?.toString()??"",labelPosition:"left",onChange:()=>m(i),size:"xs",variant:"outline"},i.accessor))})})]})]})}function wt(e){let{useDataTableColumnsResult:t}=T(),{setTotalRecords:a}=Z(),{effectiveColumns:s}=t,r={...e,columns:s,storeColumnsKey:t.key};return useEffect(()=>{a?.(e.totalRecords??i);},[e.totalRecords,a]),jsx(DataTable,{...r})}function j(){let{queryParamsAdapter:e,urlKeys:t,defaultParams:a}=T(),s=t?.page??f.page,r=a?.page??g.page,[n,o]=e.usePage(s,r),l=useCallback(()=>o(r),[o,r]);return {page:n,setPage:o,resetPage:l}}function ee(){let{queryParamsAdapter:e,urlKeys:t,defaultParams:a}=T(),s=t?.pageSize??f.pageSize,r=a?.pageSize??g.pageSize,[n,o]=e.usePageSize(s,r),l=useCallback(()=>o(r),[o,r]);return {pageSize:n,setPageSize:o,resetPageSize:l}}function te(){let{queryParamsAdapter:e,urlKeys:t,defaultParams:a}=T(),s=t?.sorts??f.sorts,r=a?.sorts??g.sorts,[n,o]=e.useSorts(s,r),l=useCallback(()=>o(r),[o,r]);return {sorts:n,setSorts:o,resetSorts:l}}function q(){let{queryParamsAdapter:e,urlKeys:t,defaultParams:a}=T(),s=t?.search??f.search,r=a?.search??g.search,[n,o]=e.useSearch(s,r),l=useCallback(()=>o(r),[o,r]);return {search:n,setSearch:o,resetSearch:l}}function D(){let{queryParamsAdapter:e,urlKeys:t,defaultParams:a}=T(),s=t?.filters??f.filters,r=a?.filters??g.filters,[n,o]=e.useFilters(s,r),l=useCallback(()=>o(r),[o,r]);return {filters:n,setFilters:o,resetFilters:l}}function Ft(){let{page:e,setPage:t,resetPage:a}=j(),{pageSize:s,setPageSize:r,resetPageSize:n}=ee(),{sorts:o,setSorts:l,resetSorts:p}=te(),{search:m,setSearch:i,resetSearch:u}=q(),{filters:P,setFilters:f,resetFilters:g}=D(),c=useCallback(()=>{a(),n(),p(),u(),g();},[a,n,p,u,g]);return {page:e,setPage:t,pageSize:s,setPageSize:r,sorts:o,setSorts:l,search:m,setSearch:i,filters:P,setFilters:f,resetPage:a,resetPageSize:n,resetSorts:p,resetSearch:u,resetFilters:g,resetAll:c}}function Ye({column:e}){let t=e.accessor,a=e.extend?.filterVariant,{filters:s,setFilters:r}=D(),n=s.find(u=>u.accessor===t),o=n?.value?1:0,[l,p]=useState(n?re(Number.parseInt(n.value,10)).toISOString():null),m=u=>{if(p(u),u){let P=re(u).valueOf().toString();r(n?s.map(f=>f.accessor===t?{...f,value:P}:f):[...s,{variant:a,accessor:t,value:P}]);}},i=()=>{p(null),r(s.filter(u=>u.accessor!==t));};return jsxs(Popover,{shadow:"md",width:"max-content",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Indicator,{disabled:o<=0,processing:true,children:jsxs(Button.Group,{children:[o>0&&jsx(Button,{onClick:i,px:"xs",variant:"default",children:jsx(IconX,{size:16})}),jsx(Button,{variant:"default",children:e.title})]})})}),jsx(Popover.Dropdown,{children:jsx(DatePicker,{defaultDate:l?new Date(l):void 0,onChange:m,value:l})})]})}function je({column:e}){let t=e.accessor,a=e.extend?.filterVariant,{filters:s,setFilters:r}=D(),n=s.find(P=>P.accessor===t),o=n?.value.length??0,[l,p]=useState(n?.value[0]&&n?.value[1]?[re(Number.parseInt(n.value[0],10)).toISOString(),re(Number.parseInt(n.value[1],10)).toISOString()]:[null,null]),m=([P,f])=>{if(p([P,f]),P&&f){let[g,c]=[re(P).valueOf().toString(),re(f).valueOf().toString()];r(n?s.map(d=>d.accessor===t?{...d,value:[g,c]}:d):[...s,{variant:a,accessor:t,value:[g,c]}]);}},i=()=>{p([null,null]),r(s.filter(P=>P.accessor!==t));},u=l[1]&&l[0];return jsxs(Popover,{shadow:"md",width:"max-content",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Indicator,{disabled:o<=0,processing:true,children:jsxs(Button.Group,{children:[o>0&&jsx(Button,{onClick:i,px:"xs",variant:"default",children:jsx(IconX,{size:16})}),jsx(Button,{variant:"default",children:e.title})]})})}),jsx(Popover.Dropdown,{children:jsx(DatePicker,{allowSingleDateInRange:true,defaultDate:u?new Date(u):void 0,onChange:m,type:"range",value:l})})]})}function et({column:e}){let t=e.accessor,a=e.extend?.filterVariant,r=(e.extend?.filterOptions).data,[n,o]=useState(""),l=useMemo(()=>{if(!n.trim())return r;let c=n.toLowerCase().trim();return r.filter(d=>d.label.toLowerCase().includes(c))},[r,n]),{filters:p,setFilters:m}=D(),i=p.find(c=>c.accessor===t),u=i?.value.length??0,P=c=>{let d=i?.value??[],E=d.includes(c)?d.filter(h=>h!==c):[...d,c];if(E.length===0)m(p.filter(h=>h.accessor!==t));else {let h=p.some(b=>b.accessor===t);m(h?p.map(b=>b.accessor===t?{...b,value:E}:b):[...p,{variant:a,accessor:t,value:E}]);}},f=c=>p.some(d=>d.accessor===t&&d.value.includes(c)),g=()=>{m(p.filter(c=>c.accessor!==t));};return jsxs(Popover,{shadow:"md",width:"max-content",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Indicator,{disabled:u<=0,processing:true,children:jsxs(Button.Group,{children:[u>0&&jsx(Button,{onClick:g,px:"xs",variant:"default",children:jsx(IconX,{size:16})}),jsx(Button,{variant:"default",children:e.title})]})})}),jsxs(Popover.Dropdown,{p:"0",children:[jsx(TextInput,{autoFocus:true,leftSection:jsx(IconSearch,{size:16}),onChange:c=>o(c.target.value),p:"4",styles:{input:{border:"none"}},value:n}),jsx(Divider,{}),jsx(ScrollArea.Autosize,{mah:180,type:"auto",children:jsx(Stack,{gap:"0",children:l.map(c=>jsx(Checkbox,{checked:f(c.value),classNames:{root:"mantine-mde-checkbox-root",body:"mantine-mde-checkbox-body",labelWrapper:"mantine-mde-checkbox-label-wrapper",label:"mantine-mde-checkbox-label",input:"mantine-mde-checkbox-input",icon:"mantine-mde-checkbox-icon"},label:c.label,labelPosition:"left",onChange:()=>P(c.value),size:"xs",styles:{labelWrapper:{display:"flex",justifyContent:"space-between",width:"100%"}},variant:"outline"},`${t}-${c.value}`))})})]})]})}function rt({column:e}){let t=e.accessor,a=e.extend?.filterVariant,{filters:s,setFilters:r}=D(),n=s.find(i=>i.accessor===t),o=n?.value.length??0,l=i=>{r(n?s.map(u=>u.accessor===t?{...u,value:i.toString()}:u):[...s,{variant:a,accessor:t,value:i.toString()}]);},p=i=>{let u=i;typeof i=="string"&&(u=Number.parseInt(i,10)),l(u);},m=()=>{r(s.filter(i=>i.accessor!==t));};return jsxs(Popover,{shadow:"md",width:"250px",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Indicator,{disabled:o<=0,processing:true,children:jsxs(Button.Group,{children:[o>0&&jsx(Button,{onClick:m,px:"xs",variant:"default",children:jsx(IconX,{size:16})}),jsx(Button,{variant:"default",children:e.title})]})})}),jsx(Popover.Dropdown,{p:"0",children:jsx(NumberInput,{autoFocus:true,leftSection:jsx(IconFilter,{size:16}),onChange:i=>p(i),p:"4",value:n?.value?Number.parseInt(n.value,10):void 0,variant:"unstyled"})})]})}function nt({column:e}){let t=e.accessor,a=e.extend?.filterVariant,{min:s,max:r,step:n=1,minRange:o=1,suffix:l}=e.extend?.filterOptions,{filters:p,setFilters:m}=D(),i=p.find(h=>h.accessor===t),u=i?.value.length??0,P=h=>{let[b,B]=[h[0].toString(),h[1].toString()];m(i?p.map(ae=>ae.accessor===t?{...ae,value:[b,B]}:ae):[...p,{variant:a,accessor:t,value:[b,B]}]);},f=i?.value[0]&&i?.value[1]?[Number.parseInt(i.value[0],10),Number.parseInt(i.value[1],10)]:[s,r],g=([h,b])=>{P([h,b]);},c=h=>{let b=typeof h=="string"?Number.parseInt(h,10)||s:h,B=Math.min(Math.max(b,s),f[1]);P([B,f[1]]);},d=h=>{let b=typeof h=="string"?Number.parseInt(h,10)||r:h,B=Math.max(Math.min(b,r),f[0]);P([f[0],B]);},E=()=>{m(p.filter(h=>h.accessor!==t));};return jsxs(Popover,{shadow:"md",width:"250px",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Indicator,{disabled:u<=0,processing:true,children:jsxs(Button.Group,{children:[u>0&&jsx(Button,{onClick:E,px:"xs",variant:"default",children:jsx(IconX,{size:16})}),jsx(Button,{variant:"default",children:e.title})]})})}),jsx(Popover.Dropdown,{p:"xs",children:jsxs(Stack,{gap:"md",children:[jsxs(Group,{grow:true,children:[jsx(NumberInput,{max:f[1],min:s,onChange:c,step:n,suffix:l,value:f[0]}),jsx(NumberInput,{max:r,min:f[0],onChange:d,step:n,suffix:l,value:f[1]})]}),jsx(RangeSlider,{label:null,max:r,min:s,minRange:o,onChange:g,step:n,value:f})]})})]})}function st({column:e}){let t=e.accessor,a=e.extend?.filterVariant,r=(e.extend?.filterOptions).data,[n,o]=useState(""),l=useMemo(()=>{if(!n.trim())return r;let c=n.toLowerCase().trim();return r.filter(d=>d.label.toLowerCase().includes(c))},[r,n]),{filters:p,setFilters:m}=D(),i=p.find(c=>c.accessor===t),u=i?.value.length??0,P=c=>{m(i?p.map(d=>d.accessor===t?{...d,value:c}:d):[...p,{variant:a,accessor:t,value:c}]);},f=c=>i?.value===c,g=()=>{m(p.filter(c=>c.accessor!==t));};return jsxs(Popover,{shadow:"md",width:"max-content",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Indicator,{disabled:u<=0,processing:true,children:jsxs(Button.Group,{children:[u>0&&jsx(Button,{onClick:g,px:"xs",variant:"default",children:jsx(IconX,{size:16})}),jsx(Button,{variant:"default",children:e.title})]})})}),jsxs(Popover.Dropdown,{p:"0",children:[jsx(TextInput,{autoFocus:true,leftSection:jsx(IconSearch,{size:16}),onChange:c=>o(c.target.value),p:"4",styles:{input:{border:"none"}},value:n}),jsx(Divider,{}),jsx(ScrollArea.Autosize,{mah:180,type:"auto",children:jsx(Stack,{gap:"0",children:l.map(c=>jsx(Checkbox,{checked:f(c.value),classNames:{root:"mantine-mde-checkbox-root",body:"mantine-mde-checkbox-body",labelWrapper:"mantine-mde-checkbox-label-wrapper",label:"mantine-mde-checkbox-label",input:"mantine-mde-checkbox-input",icon:"mantine-mde-checkbox-icon"},label:c.label,labelPosition:"left",onChange:()=>P(c.value),radius:"xl",size:"xs",styles:{labelWrapper:{display:"flex",justifyContent:"space-between",width:"100%"}}},`${t}-${c.value}`))})})]})]})}function it({column:e}){let t=e.accessor,a=e.extend?.filterVariant,{filters:s,setFilters:r}=D(),n=s.find(i=>i.accessor===t),o=n?.value.length??0,l=i=>{r(n?i===""?s.filter(u=>u.accessor!==t):s.map(u=>u.accessor===t?{...u,value:i}:u):[...s,{variant:a,accessor:t,value:i}]);},p=i=>{l(i);},m=()=>{r(s.filter(i=>i.accessor!==t));};return jsxs(Popover,{shadow:"md",width:"250px",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Indicator,{disabled:o<=0,processing:true,children:jsxs(Button.Group,{children:[o>0&&jsx(Button,{onClick:m,px:"xs",variant:"default",children:jsx(IconX,{size:16})}),jsx(Button,{variant:"default",children:e.title})]})})}),jsx(Popover.Dropdown,{p:"0",children:jsx(TextInput,{autoFocus:true,leftSection:jsx(IconFilter,{size:16}),onChange:i=>p(i.target.value),p:"4",value:n?.value??"",variant:"unstyled"})})]})}function Sr(){let{filters:e,resetFilters:t}=D(),{columns:a,i18n:s}=T(),r=()=>{t();},n=a.filter(o=>o.extend?.filterable);return jsxs(Group,{gap:"xs",children:[n.map(o=>{switch(o.extend?.filterVariant){case b.TEXT:return jsx(it,{column:o},o.accessor);case b.NUMBER:return jsx(rt,{column:o},o.accessor);case b.SINGLE_SELECT:return jsx(st,{column:o},o.accessor);case b.MULTI_SELECT:return jsx(et,{column:o},o.accessor);case b.DATE:return jsx(Ye,{column:o},o.accessor);case b.DATE_RANGE:return jsx(je,{column:o},o.accessor);case b.NUMBER_RANGE:return jsx(nt,{column:o},o.accessor);default:return null}}),e.length>0&&jsx(Button,{color:"red",leftSection:jsx(IconX,{size:16}),onClick:r,variant:"outline",children:s.filter.resetFilter})]})}function Mr(){let{page:e,setPage:t}=j(),{pageSize:a,setPageSize:s}=ee(),{paginationProps:r}=Z(),{i18n:n}=T(),{totalRecords:o,recordsPerPageOptions:l}=r||{},p=useMemo(()=>Math.ceil((o||0)/((a||l?.[0])??10)),[o,a,l]),m=(e-1)*a+1,i=Math.min(e*a,o||0);return p>0&&jsxs(Group,{align:"center",justify:"space-between",children:[jsx(Group,{children:jsxs(Text,{size:"sm",children:[n.pagination.startEndRecordOfTotalRecords[0]," ",m," ",n.pagination.startEndRecordOfTotalRecords[1]," ",i," ",n.pagination.startEndRecordOfTotalRecords[2]," ",o]})}),jsxs(Group,{children:[jsx(Text,{size:"sm",children:n.pagination.rowsPerPage}),jsx(NativeSelect,{data:l?.map(u=>({label:u.toString(),value:u.toString()}))||[],onChange:u=>s(Number(u.target.value)),size:"xs",value:a,w:70}),jsx(Space,{w:"md"}),jsxs(Text,{size:"sm",children:[n.pagination.pageOfTotalPages[0]," ",e," ",n.pagination.pageOfTotalPages[1]," ",p]}),jsx(Pagination,{onChange:u=>t(u),size:"sm",total:p,value:e,withControls:true,withEdges:true})]})]})}function Br(){let{columns:e,i18n:t}=T(),{search:a,setSearch:s}=q(),r=a.accessors.length,[n,o]=useState(""),l=useMemo(()=>e.filter(i=>i.extend?.searchable),[e]),p=useMemo(()=>{if(!n.trim())return l;let i=n.toLowerCase().trim();return l.filter(u=>(u.title?.toString()??"").toLowerCase().includes(i))},[l,n]),m=i=>{a.accessors.includes(i)?s({...a,accessors:a.accessors.filter(u=>u!==i)}):s({...a,accessors:[...a.accessors,i]});};return jsxs(Popover,{shadow:"md",width:"max-content",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Indicator,{color:"transparent",disabled:r<=0,label:jsx(Badge,{circle:true,size:"xs",variant:"outline",children:r}),children:jsx(ActionIcon,{size:36,variant:"default",children:jsx(IconSearch,{size:16})})})}),jsxs(Popover.Dropdown,{p:"0",children:[jsx(TextInput,{autoFocus:true,leftSection:jsx(IconSearch,{size:16}),onChange:i=>o(i.target.value),p:"4",placeholder:t.search.searchAccessorsSearchPlaceholder,styles:{input:{border:"none"}},value:n}),jsx(Divider,{}),jsx(ScrollArea.Autosize,{mah:180,type:"auto",children:jsx(Stack,{gap:"0",children:p.map(i=>jsx(Checkbox,{checked:a.accessors.includes(i.accessor.toString()),classNames:{root:"mantine-mde-checkbox-root",body:"mantine-mde-checkbox-body",labelWrapper:"mantine-mde-checkbox-label-wrapper",label:"mantine-mde-checkbox-label",input:"mantine-mde-checkbox-input",icon:"mantine-mde-checkbox-icon"},label:i.title?.toString()??"",labelPosition:"left",onChange:()=>m(i.accessor.toString()),size:"xs",variant:"outline"},i.accessor.toString()))})})]})]})}function Vr(){let{search:e,setSearch:t}=q(),{i18n:a}=T(),s=r=>{t({...e,value:r});};return jsxs(Group,{gap:"xs",children:[jsx(Br,{}),jsx(TextInput,{onChange:r=>s(r.target.value),placeholder:a.search.search,rightSection:e.value.length>0&&jsx(CloseButton,{onClick:()=>s(""),size:"sm",variant:"transparent"}),value:e.value,w:"200px"})]})}function $r({sort:e,index:t,sortableColumns:a$1,onAccessorChange:s,onDirectionChange:r,onRemoveSort:n}){let{i18n:o}=T(),{ref:l,handleRef:p}=useSortable({id:e.accessor,index:t});return jsxs(Group,{align:"center",gap:"xs",ref:l,wrap:"nowrap",children:[jsx(Select,{checkIconPosition:"right",comboboxProps:{withinPortal:false},data:a$1.map(m=>({label:m.title?.toString()??"",value:m.accessor})),onChange:m=>s(e.accessor,m),searchable:true,size:"xs",value:e.accessor}),jsx(Select,{checkIconPosition:"right",comboboxProps:{withinPortal:false},data:Object.values(a).map(m=>({label:o.sort[m]??"",value:m})),onChange:m=>r(e.accessor,m),size:"xs",value:e.direction}),jsx(ActionIcon,{"aria-label":"Remove sort",onClick:()=>n(e.accessor),size:"md",variant:"default",children:jsx(IconTrash,{size:16})}),jsx(ActionIcon,{"aria-label":"Drag to reorder",ref:p,size:"md",style:{cursor:"grab",flexShrink:0},variant:"default",children:jsx(IconGripHorizontal,{size:16})})]})}function Yr(){let{sorts:e,setSorts:t,resetSorts:a$1}=te(),{columns:s,i18n:r}=T(),n=s.filter(g=>g.extend?.sortable),o=n.filter(g=>!e.some(c=>c.accessor===g.accessor)),l=e.length,p=()=>{if(o.length>0&&o[0]){let g={accessor:o[0].accessor,direction:a.ASC};t([...e,g]);}},m=()=>{a$1();},i=g=>{t(e.filter(c=>c.accessor!==g));},u=(g,c)=>{if(c===null)return;let d=e.filter(E=>E.accessor!==g&&E.accessor!==c);t([...d,{accessor:c,direction:e.find(E=>E.accessor===g)?.direction||a.ASC}]);},P=(g,c)=>{c!==null&&t(e.map(d=>d.accessor===g?{...d,direction:c}:d));},f=g=>{if(g.canceled)return;let{source:c}=g.operation;if(c&&isSortable(c)){let{initialIndex:d,index:E}=c;if(d!==E){let h=[...e],[b]=h.splice(d,1);b&&h.splice(E,0,b),t(h);}}};return jsxs(Popover,{shadow:"md",width:"450px",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Button,{leftSection:jsx(IconArrowsSort,{size:16}),rightSection:jsx(Badge,{circle:true,variant:"outline",children:l}),variant:"default",children:r.sort.sort})}),jsxs(Popover.Dropdown,{p:"sm",children:[jsx(DragDropProvider,{onDragEnd:f,children:jsx(Stack,{gap:"xs",children:e.map((g,c)=>jsx($r,{index:c,onAccessorChange:u,onDirectionChange:P,onRemoveSort:i,sort:g,sortableColumns:n},g.accessor))})}),jsx(Space,{h:"sm"}),jsxs(Group,{children:[jsx(Button,{color:"dark",disabled:o.length===0,leftSection:jsx(IconPlus,{size:16}),onClick:p,size:"xs",variant:"filled",children:r.sort.addSort}),jsx(Button,{leftSection:jsx(IconRefresh,{size:16}),onClick:m,size:"xs",variant:"default",children:r.sort.resetSort})]})]})]})}function jr({useDataTableColumnsProps:e,columns:t,queryParamsAdapter:a,urlKeys:s,defaultParams:r,paginationProps:n,i18n:o}){let l=useMemo(()=>({...f,...s}),[JSON.stringify(s)]),p=useMemo(()=>({...g,...r}),[JSON.stringify(r)]),m=useMemo(()=>({...j$1,...o}),[JSON.stringify(o)]),i=useDataTableColumns(e??{key:"mde-default",columns:t});return {columns:t,urlKeys:l,defaultParams:p,i18n:m,queryParamsAdapter:a,useDataTableColumnsResult:{...i,key:e?.key??"mde-default"},paginationProps:{recordsPerPageOptions:n?.recordsPerPageOptions??h}}}function to(e){return useMemo(()=>e(),[e])}export{Ct as MDEColumnsToggle,Sr as MDEFilter,Mr as MDEPagination,dt as MDEProvider,Vr as MDESearch,Yr as MDESortList,wt as MantineDatatableExtended,to as createMDEColumnsHelper,Ne as createNuqsQueryParamsAdapter,Ge as createTanStackRouterQueryParamsAdapter,jr as useMDE,D as useMDEFilters,j as useMDEPage,ee as useMDEPageSize,Ft as useMDEQueryParams,q as useMDESearch,te as useMDESorts};
package/dist/server.d.ts CHANGED
@@ -1,11 +1,14 @@
1
1
  import * as nuqs_server from 'nuqs/server';
2
- import { a as TDteContextProps } from './data-table-provider.type-dlzY73EE.js';
2
+ import { c as TUrlKeys, d as TDefaultParams } from './data-table-provider.type-DPvItGHz.js';
3
3
  import 'react';
4
4
  import 'mantine-datatable';
5
5
  import 'zod';
6
6
 
7
- type TCreateDteLoaderProps = Pick<TDteContextProps, "urlKeys" | "defaultParams">;
8
- declare function createDteLoader(props?: TCreateDteLoaderProps): nuqs_server.LoaderFunction<{
7
+ type TCreateMDELoaderProps = {
8
+ urlKeys?: Partial<TUrlKeys>;
9
+ defaultParams?: Partial<TDefaultParams>;
10
+ };
11
+ declare function createMDELoader(props?: TCreateMDELoaderProps): nuqs_server.LoaderFunction<{
9
12
  [x: string]: (Omit<nuqs_server.SingleParserBuilder<number>, "parseServerSide"> & {
10
13
  readonly defaultValue: number;
11
14
  parseServerSide(value: string | string[] | undefined): number;
@@ -51,4 +54,4 @@ declare function createDteLoader(props?: TCreateDteLoaderProps): nuqs_server.Loa
51
54
  });
52
55
  }>;
53
56
 
54
- export { type TCreateDteLoaderProps, createDteLoader };
57
+ export { type TCreateMDELoaderProps, createMDELoader };
package/dist/server.mjs CHANGED
@@ -1 +1 @@
1
- import {parseAsJson,parseAsInteger,createLoader}from'nuqs/server';import {z}from'zod';var i={ASC:"asc",DESC:"desc"},c={TEXT:"text",NUMBER:"number",NUMBER_RANGE:"number_range",DATE:"date",DATE_RANGE:"date_range",SINGLE_SELECT:"single_select",MULTI_SELECT:"multi_select"};var n=z.object({accessor:z.string(),direction:z.enum(i)}),p=z.object({accessors:z.array(z.string()),value:z.string()}),f=z.object({variant:z.enum(c),accessor:z.string(),value:z.union([z.string(),z.array(z.string())])});function C(y={}){let r={page:"page",pageSize:"pageSize",sorts:"sorts",search:"search",filters:"filters"},t={page:1,pageSize:10,sorts:[],search:{accessors:[],value:""},filters:[]},{urlKeys:o,defaultParams:s}=y;o&&(r=o),s&&(t={...t,...s});let S={[`${r.page}`]:parseAsInteger.withDefault(t.page),[`${r.pageSize}`]:parseAsInteger.withDefault(t.pageSize),[`${r.sorts}`]:parseAsJson(z.array(n)).withDefault(t.sorts),[`${r.search}`]:parseAsJson(p).withDefault(t.search),[`${r.filters}`]:parseAsJson(z.array(f)).withDefault(t.filters)};return createLoader(S)}export{C as createDteLoader};
1
+ import {f,g,e,d,c}from'./chunk-EDD26HQ2.mjs';import {parseAsJson,parseAsInteger,createLoader}from'nuqs/server';import {z}from'zod';function L(m={}){let{urlKeys:c$1,defaultParams:u}=m,e$1={...f,...c$1},r={...g,...u},h={[`${e$1.page}`]:parseAsInteger.withDefault(r.page),[`${e$1.pageSize}`]:parseAsInteger.withDefault(r.pageSize),[`${e$1.sorts}`]:parseAsJson(z.array(c)).withDefault(r.sorts),[`${e$1.search}`]:parseAsJson(d).withDefault(r.search),[`${e$1.filters}`]:parseAsJson(z.array(e)).withDefault(r.filters)};return createLoader(h)}export{L as createMDELoader};
@@ -0,0 +1,34 @@
1
+ .mantine-mde-checkbox-root {
2
+ &:hover {
3
+ background-color: var(--mantine-color-gray-1);
4
+ }
5
+ }
6
+
7
+ [data-mantine-color-scheme="dark"] .mantine-mde-checkbox-root:hover {
8
+ background-color: var(--mantine-color-dark-8);
9
+ }
10
+ .mantine-mde-checkbox-body {
11
+ display: flex;
12
+ align-items: center;
13
+ padding-left: var(--mantine-spacing-sm);
14
+ padding-right: var(--mantine-spacing-lg);
15
+ }
16
+ .mantine-mde-checkbox-label-wrapper {
17
+ display: flex;
18
+ justify-content: space-between;
19
+ width: 100%;
20
+ }
21
+ .mantine-mde-checkbox-label {
22
+ font-size: var(--mantine-font-size-xs);
23
+ padding-top: var(--mantine-spacing-xs);
24
+ padding-bottom: var(--mantine-spacing-xs);
25
+ cursor: pointer;
26
+ }
27
+ .mantine-mde-checkbox-input {
28
+ cursor: pointer;
29
+ }
30
+ .mantine-mde-checkbox-icon {
31
+ scale: 0.8;
32
+ }
33
+
34
+ /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zdHlsZXMuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIiwiZmlsZSI6InN0eWxlcy5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIubWFudGluZS1tZGUtY2hlY2tib3gtcm9vdCB7XG5cdCY6aG92ZXIge1xuXHRcdGJhY2tncm91bmQtY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0xKTtcblx0fVxufVxuXG5bZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1cImRhcmtcIl0gLm1hbnRpbmUtbWRlLWNoZWNrYm94LXJvb3Q6aG92ZXIge1xuXHRiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstOCk7XG59XG4ubWFudGluZS1tZGUtY2hlY2tib3gtYm9keSB7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdHBhZGRpbmctbGVmdDogdmFyKC0tbWFudGluZS1zcGFjaW5nLXNtKTtcblx0cGFkZGluZy1yaWdodDogdmFyKC0tbWFudGluZS1zcGFjaW5nLWxnKTtcbn1cbi5tYW50aW5lLW1kZS1jaGVja2JveC1sYWJlbC13cmFwcGVyIHtcblx0ZGlzcGxheTogZmxleDtcblx0anVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuXHR3aWR0aDogMTAwJTtcbn1cbi5tYW50aW5lLW1kZS1jaGVja2JveC1sYWJlbCB7XG5cdGZvbnQtc2l6ZTogdmFyKC0tbWFudGluZS1mb250LXNpemUteHMpO1xuXHRwYWRkaW5nLXRvcDogdmFyKC0tbWFudGluZS1zcGFjaW5nLXhzKTtcblx0cGFkZGluZy1ib3R0b206IHZhcigtLW1hbnRpbmUtc3BhY2luZy14cyk7XG5cdGN1cnNvcjogcG9pbnRlcjtcbn1cbi5tYW50aW5lLW1kZS1jaGVja2JveC1pbnB1dCB7XG5cdGN1cnNvcjogcG9pbnRlcjtcbn1cbi5tYW50aW5lLW1kZS1jaGVja2JveC1pY29uIHtcblx0c2NhbGU6IDAuODtcbn1cbiJdfQ== */
@@ -1 +1,3 @@
1
- @import "./index.css" layer(mantine-datatable-extended);
1
+ @import "./styles.css" layer(mantine-datatable-extended);
2
+
3
+ /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zdHlsZXMubGF5ZXIuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIiwiZmlsZSI6InN0eWxlcy5sYXllci5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyJAaW1wb3J0IFwiLi9zdHlsZXMuY3NzXCIgbGF5ZXIobWFudGluZS1kYXRhdGFibGUtZXh0ZW5kZWQpO1xuIl19 */
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "mantine-datatable-extended",
3
3
  "type": "module",
4
- "version": "0.3.1",
4
+ "version": "0.4.0",
5
5
  "description": "An extension library for Mantine DataTable, providing powerful and easy-to-use features for building data tables in React applications.",
6
6
  "tags": [
7
7
  "mantine",
@@ -26,22 +26,14 @@
26
26
  "exports": {
27
27
  ".": {
28
28
  "types": "./dist/index.d.ts",
29
- "import": "./dist/index.mjs",
30
- "require": "./dist/index.cjs"
29
+ "import": "./dist/index.mjs"
31
30
  },
32
31
  "./server": {
33
32
  "types": "./dist/server.d.ts",
34
- "import": "./dist/server.mjs",
35
- "require": "./dist/server.cjs"
33
+ "import": "./dist/server.mjs"
36
34
  },
37
- "./styles.css": {
38
- "development": "./src/style.css",
39
- "default": "./dist/index.css"
40
- },
41
- "./styles.layer.css": {
42
- "development": "./src/styles.layer.css",
43
- "default": "./dist/styles.layer.css"
44
- }
35
+ "./styles.css": "./dist/styles.css",
36
+ "./styles.layer.css": "./dist/styles.layer.css"
45
37
  },
46
38
  "files": [
47
39
  "./dist",
@@ -49,14 +41,19 @@
49
41
  "./LICENSE"
50
42
  ],
51
43
  "devDependencies": {
44
+ "@tanstack/react-router": "^1.141.1",
52
45
  "@types/react": "^19.2.7",
53
46
  "@types/react-dom": "^19.2.3",
47
+ "npm-run-all": "^4.1.5",
48
+ "postcss": "^8.5.6",
49
+ "postcss-cli": "^11.0.1",
54
50
  "tsup": "^8.0.0",
55
51
  "typescript": "^5",
56
52
  "@repo/config": "0.0.0"
57
53
  },
58
54
  "peerDependencies": {
59
55
  "@dnd-kit/react": ">=0.3",
56
+ "@tanstack/react-router": ">=1.43",
60
57
  "@mantine/core": ">=8.3",
61
58
  "@mantine/dates": ">=8.3",
62
59
  "@mantine/hooks": ">=8.3",
@@ -69,9 +66,19 @@
69
66
  "react-dom": ">=19",
70
67
  "zod": ">=4.1"
71
68
  },
69
+ "peerDependenciesMeta": {
70
+ "@tanstack/react-router": {
71
+ "optional": true
72
+ },
73
+ "nuqs": {
74
+ "optional": true
75
+ }
76
+ },
72
77
  "sideEffects": false,
73
78
  "scripts": {
74
- "build": "tsup",
75
- "dev": "tsup --watch"
79
+ "build": "rm -rf dist; tsup; postcss src/styles*.css --dir dist",
80
+ "dev:bundle-css": "postcss src/styles*.css --dir dist --watch",
81
+ "dev:bundle-ts": "tsup --watch",
82
+ "dev": "run-p dev:*"
76
83
  }
77
84
  }
package/dist/index.css DELETED
@@ -1 +0,0 @@
1
- .mantine-dte-checkbox-root{&:hover{background-color:var(--mantine-color-gray-1)}}[data-mantine-color-scheme=dark] .mantine-dte-checkbox-root:hover{background-color:var(--mantine-color-dark-8)}.mantine-dte-checkbox-body{display:flex;align-items:center;padding-left:var(--mantine-spacing-sm);padding-right:var(--mantine-spacing-lg)}.mantine-dte-checkbox-label-wrapper{display:flex;justify-content:space-between;width:100%}.mantine-dte-checkbox-label{font-size:var(--mantine-font-size-xs);padding-top:var(--mantine-spacing-xs);padding-bottom:var(--mantine-spacing-xs);cursor:pointer}.mantine-dte-checkbox-input{cursor:pointer}.mantine-dte-checkbox-icon{scale:.8}