mantine-datatable-extended 0.2.0 → 0.3.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
- - **DataTableSearch**: Search with multi-column selection
19
- - **DataTableFilter**: Filter data with various filter types (text, number, date, select, range...)
20
- - **DataTableSortList**: Sort by multiple columns simultaneously
21
- - **DataTableColumnsToggle**: Show/hide columns
22
- - **DataTablePagination**: Flexible pagination that can be placed anywhere
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
23
23
 
24
24
  ### 🔗 URL State Management
25
25
 
@@ -50,6 +50,7 @@ pnpm add mantine-datatable-extended mantine-datatable @mantine/dates dayjs nuqs
50
50
 
51
51
  **Peer Dependencies:**
52
52
 
53
+ - `@dnd-kit/react` >= 0.3
53
54
  - `@mantine/core` >= 8.3
54
55
  - `@mantine/dates` >= 8.3
55
56
  - `@mantine/hooks` >= 8.3
@@ -90,19 +91,19 @@ export default function RootLayout({ children }) {
90
91
  "use client";
91
92
 
92
93
  import {
93
- DataTableExtended,
94
- DataTableProvider,
95
- DataTableSearch,
96
- DataTableFilter,
97
- DataTableSortList,
98
- DataTableColumnsToggle,
99
- DataTablePagination,
100
- type DataTableExtendedColumnProps,
94
+ DteExtended,
95
+ DteProvider,
96
+ DteSearch,
97
+ DteFilter,
98
+ DteSortList,
99
+ DteColumnsToggle,
100
+ DtePagination,
101
+ type TDteColumnProps,
101
102
  } from "mantine-datatable-extended";
102
103
  import { useDataTableColumns } from "mantine-datatable";
103
104
  import { Group, Space } from "@mantine/core";
104
105
 
105
- const columns: DataTableExtendedColumnProps[] = [
106
+ const columns: TDteColumnProps[] = [
106
107
  {
107
108
  accessor: "name",
108
109
  title: "Name",
@@ -123,27 +124,27 @@ export default function MyTable() {
123
124
  });
124
125
 
125
126
  return (
126
- <DataTableProvider
127
+ <DteProvider
127
128
  columns={columns}
128
129
  originalUseDataTableColumnsResult={originalUseDataTableColumnsResult}
129
130
  storeColumnsKey="my-table"
130
131
  >
131
132
  <Group justify="space-between">
132
133
  <Group>
133
- <DataTableSearch />
134
- <DataTableFilter />
134
+ <DteSearch />
135
+ <DteFilter />
135
136
  </Group>
136
137
  <Group>
137
- <DataTableSortList />
138
- <DataTableColumnsToggle />
138
+ <DteSortList />
139
+ <DteColumnsToggle />
139
140
  </Group>
140
141
  </Group>
141
142
 
142
143
  <Space h="md" />
143
- <DataTableExtended records={data} />
144
+ <DteExtended records={data} />
144
145
  <Space h="md" />
145
- <DataTablePagination />
146
- </DataTableProvider>
146
+ <DtePagination />
147
+ </DteProvider>
147
148
  );
148
149
  }
149
150
  ```
@@ -1,7 +1,11 @@
1
+ import * as react from 'react';
1
2
  import { DataTableColumn, useDataTableColumns } from 'mantine-datatable';
2
3
  import { z } from 'zod';
3
4
 
4
- type FilterMultiSelectOptions = {
5
+ /**
6
+ * Options for multi-select filter variant.
7
+ */
8
+ type TFilterMultiSelectOptions = {
5
9
  data: {
6
10
  value: string;
7
11
  label: string;
@@ -9,7 +13,10 @@ type FilterMultiSelectOptions = {
9
13
  icon?: React.ReactNode;
10
14
  }[];
11
15
  };
12
- type FilterSingleSelectOptions = {
16
+ /**
17
+ * Options for single-select filter variant.
18
+ */
19
+ type TFilterSingleSelectOptions = {
13
20
  data: {
14
21
  value: string;
15
22
  label: string;
@@ -17,14 +24,18 @@ type FilterSingleSelectOptions = {
17
24
  icon?: React.ReactNode;
18
25
  }[];
19
26
  };
20
- type FilterNumberRangeOptions = {
27
+ /**
28
+ * Options for number range filter variant.
29
+ */
30
+ type TFilterNumberRangeOptions = {
21
31
  min: number;
22
32
  max: number;
23
33
  step?: number;
24
34
  minRange?: number;
35
+ suffix?: string;
25
36
  };
26
37
 
27
- type BaseExtend = {
38
+ type TBaseExtend = {
28
39
  /**
29
40
  * Whether the column is searchable.
30
41
  */
@@ -38,24 +49,28 @@ type BaseExtend = {
38
49
  */
39
50
  filterable?: boolean;
40
51
  };
41
- type FilterableExtend = BaseExtend & ({
52
+ type TFilterableExtend = TBaseExtend & ({
42
53
  filterVariant?: "text" | "number" | "date" | "date_range";
43
54
  filterOptions?: never;
44
55
  } | {
45
56
  filterVariant: "number_range";
46
- filterOptions: FilterNumberRangeOptions;
57
+ filterOptions: TFilterNumberRangeOptions;
47
58
  } | {
48
59
  filterVariant: "single_select";
49
- filterOptions: FilterSingleSelectOptions;
60
+ filterOptions: TFilterSingleSelectOptions;
50
61
  } | {
51
62
  filterVariant: "multi_select";
52
- filterOptions: FilterMultiSelectOptions;
63
+ filterOptions: TFilterMultiSelectOptions;
53
64
  });
54
- type DataTableExtendedColumnProps<T = Record<string, unknown>> = Omit<DataTableColumn<T>, "sortable" | "sortKey" | "filter" | "filterPopoverProps" | "filterPopoverDisableClickOutside" | "filtering" | "ellipsis" | "noWrap"> & {
65
+ /**
66
+ * Extended column props for DataTable with search, sort, and filter support.
67
+ * Extends mantine-datatable's DataTableColumn with an optional `extend` property.
68
+ */
69
+ type TDteColumnProps<T = Record<string, unknown>> = Omit<DataTableColumn<T>, "sortable" | "sortKey" | "filter" | "filterPopoverProps" | "filterPopoverDisableClickOutside" | "filtering" | "ellipsis" | "noWrap"> & {
55
70
  /**
56
71
  * The extended properties of the column.
57
72
  */
58
- extend?: FilterableExtend;
73
+ extend?: TFilterableExtend;
59
74
  } & ({
60
75
  /**
61
76
  * If true, cell content in this column will be truncated with ellipsis as needed and will not wrap
@@ -102,7 +117,100 @@ declare const filterSchema: z.ZodObject<{
102
117
  }, z.core.$strip>;
103
118
  type TFilterCondition = z.infer<typeof filterSchema>;
104
119
 
105
- type UrlKeysType = {
120
+ type TDteViewOptions = {
121
+ /**
122
+ * The label for the columns toggle button.
123
+ */
124
+ columnsToggle: string;
125
+ /**
126
+ * The placeholder for the columns search input.
127
+ */
128
+ columnsToggleSearchPlaceholder: string;
129
+ };
130
+ type TDteSortOptions = {
131
+ /**
132
+ * The label for the sort button.
133
+ */
134
+ sort: string;
135
+ /**
136
+ * The label for the add sort button.
137
+ */
138
+ addSort: string;
139
+ /**
140
+ * The label for the reset sort button.
141
+ */
142
+ resetSort: string;
143
+ /**
144
+ * The label for the ascending sort direction.
145
+ */
146
+ asc: string;
147
+ /**
148
+ * The label for the descending sort direction.
149
+ */
150
+ desc: string;
151
+ };
152
+ type TDteSearchOptions = {
153
+ /**
154
+ * The label for the search input placeholder.
155
+ */
156
+ search: string;
157
+ /**
158
+ * The placeholder for the search accessors filter input.
159
+ */
160
+ searchAccessorsSearchPlaceholder: string;
161
+ };
162
+ type TDteFilterOptions = {
163
+ /**
164
+ * The label for the reset filter button.
165
+ */
166
+ resetFilter: string;
167
+ };
168
+ type TDtePaginationOptions = {
169
+ /**
170
+ * The label for the rows per page.
171
+ */
172
+ rowsPerPage: string;
173
+ /**
174
+ * The label for the page of total pages.
175
+ * The first string is "Page".
176
+ * The second string is "of".
177
+ */
178
+ pageOfTotalPages: [string, string];
179
+ /**
180
+ * The label for the start record - end record / total records.
181
+ * The first string is "From".
182
+ * The second string is "to".
183
+ * The third string is "of total".
184
+ */
185
+ startEndRecordOfTotalRecords: [string, string, string];
186
+ };
187
+ /**
188
+ * Unified i18n type for all DataTable components.
189
+ * Grouped by component - full type stored in context (after merging with defaults).
190
+ */
191
+ type TDteI18n = {
192
+ view: TDteViewOptions;
193
+ sort: TDteSortOptions;
194
+ search: TDteSearchOptions;
195
+ filter: TDteFilterOptions;
196
+ pagination: TDtePaginationOptions;
197
+ };
198
+ /**
199
+ * Input type for i18n prop in DteProvider.
200
+ * Each group is optional - only override the keys you need.
201
+ */
202
+ type TDteI18nInput = {
203
+ view?: Partial<TDteViewOptions>;
204
+ sort?: Partial<TDteSortOptions>;
205
+ search?: Partial<TDteSearchOptions>;
206
+ filter?: Partial<TDteFilterOptions>;
207
+ pagination?: Partial<TDtePaginationOptions>;
208
+ };
209
+
210
+ /**
211
+ * URL query parameter keys for DataTable state (page, pageSize, sorts, search, filters).
212
+ */
213
+ type TUrlKeys = {
106
214
  /**
107
215
  * The key of the page parameter.
108
216
  */
@@ -124,7 +232,10 @@ type UrlKeysType = {
124
232
  */
125
233
  filters: string;
126
234
  };
127
- type DefaultParamsType = {
235
+ /**
236
+ * Default values for DataTable query parameters.
237
+ */
238
+ type TDefaultParams = {
128
239
  /**
129
240
  * The default page number.
130
241
  */
@@ -146,7 +257,10 @@ type DefaultParamsType = {
146
257
  */
147
258
  filters?: TFilterCondition[];
148
259
  };
149
- type PaginationPropsType = {
260
+ /**
261
+ * Pagination configuration passed to DataTable context.
262
+ */
263
+ type TPaginationProps = {
150
264
  /**
151
265
  * The total records.
152
266
  */
@@ -156,16 +270,19 @@ type PaginationPropsType = {
156
270
  */
157
271
  recordsPerPageOptions: number[];
158
272
  };
159
- type DataTableContextProps<T = Record<string, unknown>> = {
273
+ /**
274
+ * Context value type for DteProvider.
275
+ */
276
+ type TDteContextProps<T = Record<string, unknown>> = {
160
277
  /**
161
278
  * The keys of the URL parameters.
162
279
  * Useful for multiple data tables on the same page.
163
280
  */
164
- urlKeys?: UrlKeysType;
281
+ urlKeys?: TUrlKeys;
165
282
  /**
166
283
  * The default parameters of the data table.
167
284
  */
168
- defaultParams?: DefaultParamsType;
285
+ defaultParams?: TDefaultParams;
169
286
  /**
170
287
  * The key of the column store.
171
288
  * This is used to store the columns of the data table in localStorage for draggable and toggleable columns.
@@ -176,7 +293,7 @@ type DataTableContextProps<T = Record<string, unknown>> = {
176
293
  * The columns of the data table.
177
294
  * This is use original column properties from mantine-datatable with "extend" property.
178
295
  */
179
- columns: DataTableExtendedColumnProps<T>[];
296
+ columns: TDteColumnProps<T>[];
180
297
  /**
181
298
  * The result of the useDataTableColumns hook from mantine-datatable.
182
299
  */
@@ -184,7 +301,7 @@ type DataTableContextProps<T = Record<string, unknown>> = {
184
301
  /**
185
302
  * The pagination props.
186
303
  */
187
- paginationProps?: PaginationPropsType;
304
+ paginationProps?: TPaginationProps;
188
305
  /**
189
306
  * The function to set the pagination total records.
190
307
  */
@@ -193,6 +310,19 @@ type DataTableContextProps<T = Record<string, unknown>> = {
193
310
  * The function to set the pagination records per page options.
194
311
  */
195
312
  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
+ };
320
+ /**
321
+ * Props for DteProvider. Extends context props but i18n is optional input.
322
+ */
323
+ type TDteProviderProps<T = Record<string, unknown>> = Omit<TDteContextProps<T>, "i18n"> & {
324
+ children: react.ReactNode;
325
+ i18n?: TDteI18nInput;
196
326
  };
197
327
 
198
- export type { DataTableContextProps as D, DataTableExtendedColumnProps as a };
328
+ export type { TDteProviderProps as T, TDteContextProps as a, TDteColumnProps as b, TDteI18nInput as c };
package/dist/index.css ADDED
@@ -0,0 +1 @@
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}
package/dist/index.d.ts CHANGED
@@ -1,100 +1,28 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { DataTableProps, DataTablePaginationProps, DataTableSortProps } from 'mantine-datatable';
3
3
  import * as nuqs from 'nuqs';
4
- import { D as DataTableContextProps } from './data-table-provider.type-CblXE_l1.js';
5
- export { a as DataTableExtendedColumnProps } from './data-table-provider.type-CblXE_l1.js';
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';
6
+ import 'react';
6
7
  import 'zod';
7
8
 
8
- type i18nDataTableViewOptions = {
9
- /**
10
- * The label for the columns toggle button.
11
- */
12
- columnsToggle: string;
13
- };
14
- type i18nDataTableSortOptions = {
15
- /**
16
- * The label for the sort button.
17
- */
18
- sort: string;
19
- /**
20
- * The label for the add sort button.
21
- */
22
- addSort: string;
23
- /**
24
- * The label for the reset sort button.
25
- */
26
- resetSort: string;
27
- /**
28
- * The label for the ascending sort direction.
29
- */
30
- asc: string;
31
- /**
32
- * The label for the descending sort direction.
33
- */
34
- desc: string;
35
- };
36
- type i18nDataTableSearchOptions = {
37
- /**
38
- * The label for the search input placeholder.
39
- */
40
- search: string;
41
- };
42
- type i18nDataTableFilterOptions = {
43
- /**
44
- * The label for the reset filter button.
45
- */
46
- resetFilter: string;
47
- };
48
- type i18nDataTablePaginationOptions = {
49
- /**
50
- * The label for the rows per page.
51
- */
52
- rowsPerPage: string;
53
- /**
54
- * The label for the page of total pages.
55
- * The first string is "Page".
56
- * The second string is "of".
57
- */
58
- pageOfTotalPages: [string, string];
59
- /**
60
- * The label for the start record - end record / total records.
61
- * The first string is "From".
62
- * The second string is "to".
63
- * The third string is "of total".
64
- */
65
- startEndRecordOfTotalRecords: [string, string, string];
66
- };
9
+ declare function DteColumnsToggle(): react_jsx_runtime.JSX.Element;
67
10
 
68
- type TDataTableColumnsToggleProps = {
69
- i18n?: i18nDataTableViewOptions;
70
- };
71
- declare function DataTableColumnsToggle({ i18n, }: TDataTableColumnsToggleProps): react_jsx_runtime.JSX.Element;
72
-
73
- type TDataTableExtendedProps<T = Record<string, unknown>> = Omit<DataTableProps<T>, "storeColumnsKey" | "groups" | "columns" | keyof DataTablePaginationProps | keyof DataTableSortProps>;
74
- declare function DataTableExtended<T = Record<string, unknown>>(props: TDataTableExtendedProps<T>): react_jsx_runtime.JSX.Element;
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;
75
13
 
76
- type TDataTableFilterProps = {
77
- i18n?: i18nDataTableFilterOptions;
78
- };
79
- declare function DataTableFilter({ i18n }: TDataTableFilterProps): react_jsx_runtime.JSX.Element;
14
+ declare function DteFilter(): react_jsx_runtime.JSX.Element;
80
15
 
81
- type TDataTablePaginationProps = {
16
+ type TDtePaginationProps = {
82
17
  recordsPerPageOptions?: number[];
83
- i18n?: i18nDataTablePaginationOptions;
84
18
  };
85
- declare function DataTablePagination({ recordsPerPageOptions, i18n, }: TDataTablePaginationProps): false | react_jsx_runtime.JSX.Element;
19
+ declare function DtePagination({ recordsPerPageOptions, }: TDtePaginationProps): false | react_jsx_runtime.JSX.Element;
86
20
 
87
- type TDataTableSearchProps = {
88
- i18n?: i18nDataTableSearchOptions;
89
- };
90
- declare function DataTableSearch({ i18n }: TDataTableSearchProps): react_jsx_runtime.JSX.Element;
21
+ declare function DteSearch(): react_jsx_runtime.JSX.Element;
91
22
 
92
- type TDataTableSortListProps = {
93
- i18n?: i18nDataTableSortOptions;
94
- };
95
- declare function DataTableSortList({ i18n, }: TDataTableSortListProps): react_jsx_runtime.JSX.Element;
23
+ declare function DteSortList(): react_jsx_runtime.JSX.Element;
96
24
 
97
- declare function useDataTableQueryParams(): {
25
+ declare function useDteQueryParams(): {
98
26
  page: number;
99
27
  setPage: (value: number | ((old: number) => number | null) | null, options?: nuqs.Options) => Promise<URLSearchParams>;
100
28
  pageSize: number;
@@ -153,10 +81,7 @@ declare function useDataTableQueryParams(): {
153
81
  resetAll: () => void;
154
82
  };
155
83
 
156
- declare function useDataTableContext<T = Record<string, unknown>>(): DataTableContextProps<T>;
157
- type DataTableProviderProps<T = Record<string, unknown>> = {
158
- children: React.ReactNode;
159
- } & DataTableContextProps<T>;
160
- declare function DataTableProvider<T = Record<string, unknown>>({ children, urlKeys, defaultParams, storeColumnsKey, columns, originalUseDataTableColumnsResult, }: DataTableProviderProps<T>): react_jsx_runtime.JSX.Element;
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;
161
86
 
162
- export { DataTableColumnsToggle, DataTableContextProps, DataTableExtended, DataTableFilter, DataTablePagination, DataTableProvider, DataTableSearch, DataTableSortList, useDataTableContext, useDataTableQueryParams };
87
+ export { DteColumnsToggle, DteExtended, DteFilter, DtePagination, DteProvider, DteSearch, DteSortList, TDteProviderProps, useDteContext, useDteQueryParams };
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import {Popover,Button,Stack,Checkbox,Group,Text,NativeSelect,Space,Pagination,TextInput,CloseButton,Badge,Grid,Select,ActionIcon,Indicator,RangeSlider,NumberInput}from'@mantine/core';import {IconColumns,IconSort09,IconTrash,IconPlus,IconRefresh,IconX,IconSearch}from'@tabler/icons-react';import Ht,{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 Te,{z}from'zod';import {DatePicker}from'@mantine/dates';import z$1 from'dayjs';var pe=createContext(void 0);function P(){let a=useContext(pe);if(!a)throw new Error("useDataTableContext must be used within a DataTableProvider");return a}function Ge({children:a,urlKeys:e,defaultParams:p,storeColumnsKey:o,columns:s,originalUseDataTableColumnsResult:r}){if(!o)throw new Error("storeColumnsKey property is required");if(!s)throw new Error("columns property is required");let[t,u]=useState(0),[m,g]=useState([10,20,30,40,50]),i=useMemo(()=>({totalRecords:t,recordsPerPageOptions:m}),[t,m]),l=useMemo(()=>({urlKeys:e,defaultParams:p,storeColumnsKey:o,columns:s,originalUseDataTableColumnsResult:r,paginationProps:i,setTotalRecords:u,setRecordsPerPageOptions:g}),[e,p,o,s,r,i]);return jsx(pe.Provider,{value:{...l},children:a})}var Ue={columnsToggle:"Columns Toggle"};function Xe({i18n:a=Ue}){let{originalUseDataTableColumnsResult:e}=P(),{effectiveColumns:p,columnsToggle:o,setColumnsToggle:s}=e,r=t=>{s(o.map(u=>u.accessor===t.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(IconColumns,{}),variant:"default",children:a.columnsToggle})}),jsx(Popover.Dropdown,{children:jsx(Stack,{children:o.filter(t=>t.toggleable).map(t=>jsx(Checkbox,{checked:t.toggled,label:p.find(u=>u.accessor===t.accessor)?.title?.toString()??"",labelPosition:"left",onChange:()=>r(t),styles:{labelWrapper:{display:"flex",justifyContent:"space-between",width:"100%"}},variant:"outline"},t.accessor))})})]})}function qe(a){let{storeColumnsKey:e,originalUseDataTableColumnsResult:p}=P(),{effectiveColumns:o}=p,s={...a,columns:o,storeColumnsKey:e};return jsx(DataTable,{...s})}var B={ASC:"asc",DESC:"desc"},v={TEXT:"text",NUMBER:"number",NUMBER_RANGE:"number_range",DATE:"date",DATE_RANGE:"date_range",SINGLE_SELECT:"single_select",MULTI_SELECT:"multi_select"};var ue=z.object({accessor:z.string(),direction:z.enum(B)}),de=z.object({accessors:z.array(z.string()),value:z.string()}),me=z.object({variant:z.enum(v),accessor:z.string(),value:z.union([z.string(),z.array(z.string())])});function T(){let a={page:"page",pageSize:"pageSize",sorts:"sorts",search:"search",filters:"filters"},e={page:1,pageSize:10,sorts:[],search:{accessors:[],value:""},filters:[]},{urlKeys:p,defaultParams:o}=P();p&&(a=p),o&&(e={...e,...o});let[s,r]=useQueryState(a.page,parseAsInteger.withDefault(e.page)),[t,u]=useQueryState(a.pageSize,parseAsInteger.withDefault(e.pageSize)),[m,g]=useQueryState(a.sorts,parseAsJson(Te.array(ue)).withDefault(e.sorts)),[i,l]=useQueryState(a.search,parseAsJson(de).withDefault(e.search)),[c,n]=useQueryState(a.filters,parseAsJson(Te.array(me)).withDefault(e.filters)),d=()=>{r(e.page);},f=()=>{u(e.pageSize);},D=()=>{g(e.sorts);},I=()=>{l(e.search);},ie=()=>{n(e.filters);};return {page:s,setPage:r,pageSize:t,setPageSize:u,sorts:m,setSorts:g,search:i,setSearch:l,filters:c,setFilters:n,resetPage:d,resetPageSize:f,resetSorts:D,resetSearch:I,resetFilters:ie,resetAll:()=>{d(),f(),D(),I(),ie();}}}function De({column:a}){let e=a.accessor,p=a.extend?.filterVariant,{filters:o,setFilters:s}=T(),r=o.find(l=>l.accessor===e),t=r?.value?1:0,[u,m]=useState(r?z$1(Number.parseInt(r.value,10)).toISOString():null),g=l=>{if(m(l),l){let c=z$1(l).valueOf().toString();s(r?o.map(n=>n.accessor===e?{...n,value:c}:n):[...o,{variant:p,accessor:e,value:c}]);}},i=()=>{m(null),s(o.filter(l=>l.accessor!==e));};return jsxs(Popover,{shadow:"md",width:"max-content",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Indicator,{disabled:t<=0,processing:true,children:jsxs(Button.Group,{children:[t>0&&jsx(Button,{onClick:i,px:"xs",variant:"default",children:jsx(IconX,{size:16})}),jsx(Button,{variant:"default",children:a.title})]})})}),jsx(Popover.Dropdown,{children:jsx(DatePicker,{onChange:g,value:u})})]})}function he({column:a}){let e=a.accessor,p=a.extend?.filterVariant,{filters:o,setFilters:s}=T(),r=o.find(l=>l.accessor===e),t=r?.value.length??0,[u,m]=useState(r?.value[0]&&r?.value[1]?[z$1(Number.parseInt(r.value[0],10)).toISOString(),z$1(Number.parseInt(r.value[1],10)).toISOString()]:[null,null]),g=([l,c])=>{if(m([l,c]),l&&c){let[n,d]=[z$1(l).valueOf().toString(),z$1(c).valueOf().toString()];s(r?o.map(f=>f.accessor===e?{...f,value:[n,d]}:f):[...o,{variant:p,accessor:e,value:[n,d]}]);}},i=()=>{m([null,null]),s(o.filter(l=>l.accessor!==e));};return jsxs(Popover,{shadow:"md",width:"max-content",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Indicator,{disabled:t<=0,processing:true,children:jsxs(Button.Group,{children:[t>0&&jsx(Button,{onClick:i,px:"xs",variant:"default",children:jsx(IconX,{size:16})}),jsx(Button,{variant:"default",children:a.title})]})})}),jsx(Popover.Dropdown,{children:jsx(DatePicker,{allowSingleDateInRange:true,onChange:g,type:"range",value:u})})]})}function ve({column:a}){let e=a.accessor,p=a.extend?.filterVariant,s=(a.extend?.filterOptions).data,{filters:r,setFilters:t}=T(),u=r.find(c=>c.accessor===e),m=u?.value.length??0,g=c=>{let n=u?.value??[],d=n.includes(c)?n.filter(f=>f!==c):[...n,c];if(d.length===0)t(r.filter(f=>f.accessor!==e));else {let f=r.some(D=>D.accessor===e);t(f?r.map(D=>D.accessor===e?{...D,value:d}:D):[...r,{variant:p,accessor:e,value:d}]);}},i=c=>r.some(n=>n.accessor===e&&n.value.includes(c)),l=()=>{t(r.filter(c=>c.accessor!==e));};return jsxs(Popover,{shadow:"md",width:"max-content",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Indicator,{disabled:m<=0,processing:true,children:jsxs(Button.Group,{children:[m>0&&jsx(Button,{onClick:l,px:"xs",variant:"default",children:jsx(IconX,{size:16})}),jsx(Button,{variant:"default",children:a.title})]})})}),jsx(Popover.Dropdown,{children:jsx(Stack,{children:s.map(c=>jsx(Checkbox,{checked:i(c.value),label:c.label,labelPosition:"left",onChange:()=>g(c.value),styles:{labelWrapper:{display:"flex",justifyContent:"space-between",width:"100%"}},variant:"outline"},`${e}-${c.value}`))})})]})}function ye({column:a}){let e=a.accessor,p=a.extend?.filterVariant,{filters:o,setFilters:s}=T(),r=o.find(i=>i.accessor===e),t=r?.value.length??0,u=i=>{s(r?o.map(l=>l.accessor===e?{...l,value:i.toString()}:l):[...o,{variant:p,accessor:e,value:i.toString()}]);},m=i=>{let l=i;typeof i=="string"&&(l=Number.parseInt(i,10)),u(l);},g=()=>{s(o.filter(i=>i.accessor!==e));};return jsxs(Popover,{shadow:"md",width:"250px",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Indicator,{disabled:t<=0,processing:true,children:jsxs(Button.Group,{children:[t>0&&jsx(Button,{onClick:g,px:"xs",variant:"default",children:jsx(IconX,{size:16})}),jsx(Button,{variant:"default",children:a.title})]})})}),jsx(Popover.Dropdown,{children:jsx(NumberInput,{onChange:i=>m(i),value:r?.value?Number.parseInt(r.value,10):void 0})})]})}function we({column:a}){let e=a.accessor,p=a.extend?.filterVariant,{min:o,max:s,step:r=1,minRange:t=1}=a.extend?.filterOptions,{filters:u,setFilters:m}=T(),g=u.find(d=>d.accessor===e),i=g?.value.length??0,l=d=>{let[f,D]=[d[0].toString(),d[1].toString()];m(g?u.map(I=>I.accessor===e?{...I,value:[f,D]}:I):[...u,{variant:p,accessor:e,value:[f,D]}]);},c=([d,f])=>{l([d,f]);},n=()=>{m(u.filter(d=>d.accessor!==e));};return jsxs(Popover,{shadow:"md",width:"250px",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Indicator,{disabled:i<=0,processing:true,children:jsxs(Button.Group,{children:[i>0&&jsx(Button,{onClick:n,px:"xs",variant:"default",children:jsx(IconX,{size:16})}),jsx(Button,{variant:"default",children:a.title})]})})}),jsx(Popover.Dropdown,{children:jsx(RangeSlider,{max:s,min:o,minRange:t,onChange:c,step:r,value:g?.value[0]&&g?.value[1]?[Number.parseInt(g.value[0],10),Number.parseInt(g.value[1],10)]:[o,s]})})]})}function Re({column:a}){let e=a.accessor,p=a.extend?.filterVariant,s=(a.extend?.filterOptions).data,{filters:r,setFilters:t}=T(),u=r.find(c=>c.accessor===e),m=u?.value.length??0,g=c=>{t(u?r.map(n=>n.accessor===e?{...n,value:c}:n):[...r,{variant:p,accessor:e,value:c}]);},i=c=>u?.value===c,l=()=>{t(r.filter(c=>c.accessor!==e));};return jsxs(Popover,{shadow:"md",width:"max-content",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Indicator,{disabled:m<=0,processing:true,children:jsxs(Button.Group,{children:[m>0&&jsx(Button,{onClick:l,px:"xs",variant:"default",children:jsx(IconX,{size:16})}),jsx(Button,{variant:"default",children:a.title})]})})}),jsx(Popover.Dropdown,{children:jsx(Stack,{children:s.map(c=>jsx(Checkbox,{checked:i(c.value),label:c.label,labelPosition:"left",onChange:()=>g(c.value),radius:"xl",styles:{labelWrapper:{display:"flex",justifyContent:"space-between",width:"100%"}},variant:"outline"},`${e}-${c.value}`))})})]})}function ke({column:a}){let e=a.accessor,p=a.extend?.filterVariant,{filters:o,setFilters:s}=T(),r=o.find(i=>i.accessor===e),t=r?.value.length??0,u=i=>{s(r?i===""?o.filter(l=>l.accessor!==e):o.map(l=>l.accessor===e?{...l,value:i}:l):[...o,{variant:p,accessor:e,value:i}]);},m=i=>{u(i);},g=()=>{s(o.filter(i=>i.accessor!==e));};return jsxs(Popover,{shadow:"md",width:"250px",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Indicator,{disabled:t<=0,processing:true,children:jsxs(Button.Group,{children:[t>0&&jsx(Button,{onClick:g,px:"xs",variant:"default",children:jsx(IconX,{size:16})}),jsx(Button,{variant:"default",children:a.title})]})})}),jsx(Popover.Dropdown,{children:jsx(TextInput,{onChange:i=>m(i.target.value),value:r?.value??""})})]})}var vt={resetFilter:"Reset Filter"};function xt({i18n:a=vt}){let{filters:e,resetFilters:p}=T(),{columns:o}=P(),s=()=>{p();},r=o.filter(t=>t.extend?.filterable);return jsxs(Group,{gap:"xs",children:[r.map(t=>{switch(t.extend?.filterVariant){case v.TEXT:return jsx(ke,{column:t},t.accessor);case v.NUMBER:return jsx(ye,{column:t},t.accessor);case v.SINGLE_SELECT:return jsx(Re,{column:t},t.accessor);case v.MULTI_SELECT:return jsx(ve,{column:t},t.accessor);case v.DATE:return jsx(De,{column:t},t.accessor);case v.DATE_RANGE:return jsx(he,{column:t},t.accessor);case v.NUMBER_RANGE:return jsx(we,{column:t},t.accessor);default:return null}}),e.length>0&&jsx(Button,{onClick:s,variant:"default",children:a.resetFilter})]})}var Rt={rowsPerPage:"Rows per page",pageOfTotalPages:["Page","of"],startEndRecordOfTotalRecords:["","-","/"]};function Et({recordsPerPageOptions:a=[10,20,30,40,50],i18n:e=Rt}){let{page:p,pageSize:o,setPage:s,setPageSize:r}=T(),{paginationProps:t}=P(),{totalRecords:u}=t||{},[m,g]=useState(0),[{startRecord:i,endRecord:l},c]=useState({startRecord:0,endRecord:0});return useEffect(()=>{g(Math.ceil((u||0)/(o||(a[0]??10))));},[u,o,a]),useEffect(()=>{c({startRecord:(p-1)*o+1,endRecord:Math.min(p*o,u||0)});},[p,o,u]),m>0&&jsxs(Group,{align:"center",justify:"space-between",children:[jsx(Group,{children:jsxs(Text,{size:"sm",children:[e.startEndRecordOfTotalRecords[0]," ",i," ",e.startEndRecordOfTotalRecords[1]," ",l," ",e.startEndRecordOfTotalRecords[2]," ",u]})}),jsxs(Group,{children:[jsx(Text,{size:"sm",children:e.rowsPerPage}),jsx(NativeSelect,{data:a.map(n=>({label:n.toString(),value:n.toString()})),onChange:n=>r(Number(n.target.value)),size:"xs",value:o,w:70}),jsx(Space,{w:"md"}),jsxs(Text,{size:"sm",children:[e.pageOfTotalPages[0]," ",p," ",e.pageOfTotalPages[1]," ",m]}),jsx(Pagination,{onChange:n=>s(n),size:"sm",total:m,value:p,withControls:true,withEdges:true})]})]})}function Mt(){let{columns:a}=P(),{search:e,setSearch:p}=T(),o=e.accessors.length,s=a.filter(t=>t.extend?.searchable),r=t=>{e.accessors.includes(t)?p({...e,accessors:e.accessors.filter(u=>u!==t)}):p({...e,accessors:[...e.accessors,t]});};return jsxs(Popover,{shadow:"md",width:"max-content",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Indicator,{color:"transparent",disabled:o<=0,label:jsx(Badge,{circle:true,size:"xs",variant:"outline",children:o}),children:jsx(ActionIcon,{size:36,variant:"default",children:jsx(IconSearch,{size:16})})})}),jsx(Popover.Dropdown,{children:jsx(Stack,{children:s.map(t=>jsx(Checkbox,{checked:e.accessors.includes(t.accessor.toString()),label:t.title?.toString()??"",labelPosition:"left",onChange:()=>r(t.accessor.toString()),styles:{labelWrapper:{display:"flex",justifyContent:"space-between",width:"100%"}},variant:"outline"},t.accessor.toString()))})})]})}var Qt={search:"Search"};function Lt({i18n:a=Qt}){let{search:e,setSearch:p}=T(),o=s=>{p({...e,value:s});};return jsxs(Group,{gap:"xs",children:[jsx(Mt,{}),jsx(TextInput,{onChange:s=>o(s.target.value),placeholder:a.search,rightSection:e.value.length>0&&jsx(CloseButton,{onClick:()=>o(""),size:"sm",variant:"transparent"}),value:e.value,w:"200px"})]})}var Yt={sort:"Sort",addSort:"Add Sort",resetSort:"Reset Sort",asc:"Asc",desc:"Desc"};function Zt({i18n:a=Yt}){let{sorts:e,setSorts:p,resetSorts:o}=T(),{columns:s}=P(),r=s.filter(n=>n.extend?.sortable),t=r.filter(n=>!e.some(d=>d.accessor===n.accessor)),u=e.length,m=()=>{if(t.length>0&&t[0]){let n={accessor:t[0].accessor,direction:B.ASC};p([...e,n]);}},g=()=>{o();},i=n=>{p(e.filter(d=>d.accessor!==n));},l=(n,d)=>{if(d===null)return;let f=e.filter(D=>D.accessor!==n&&D.accessor!==d);p([...f,{accessor:d,direction:e.find(D=>D.accessor===n)?.direction||B.ASC}]);},c=(n,d)=>{d!==null&&p(e.map(f=>f.accessor===n?{...f,direction:d}:f));};return jsxs(Popover,{shadow:"md",width:"450px",withArrow:true,children:[jsx(Popover.Target,{children:jsx(Button,{leftSection:jsx(IconSort09,{}),rightSection:jsx(Badge,{circle:true,variant:"outline",children:u}),variant:"default",children:a.sort})}),jsxs(Popover.Dropdown,{children:[jsx(Grid,{children:e.map(n=>jsxs(Ht.Fragment,{children:[jsx(Grid.Col,{span:6,children:jsx(Select,{comboboxProps:{withinPortal:false},data:r.map(d=>({label:d.title?.toString()??"",value:d.accessor})),onChange:d=>l(n.accessor,d),value:n.accessor})}),jsx(Grid.Col,{span:4,children:jsx(Select,{comboboxProps:{withinPortal:false},data:Object.values(B).map(d=>({label:a[d]??"",value:d})),onChange:d=>c(n.accessor,d),value:n.direction})}),jsx(Grid.Col,{span:1,style:{display:"flex",justifyContent:"center",alignItems:"center"},children:jsx(ActionIcon,{onClick:()=>i(n.accessor),size:"lg",variant:"default",children:jsx(IconTrash,{size:16})})})]},n.accessor))}),jsx(Space,{h:"md"}),jsxs(Group,{children:[jsx(Button,{color:"dark",disabled:t.length===0,leftSection:jsx(IconPlus,{size:16}),onClick:m,size:"sm",variant:"filled",children:a.addSort}),jsx(Button,{leftSection:jsx(IconRefresh,{size:16}),onClick:g,size:"sm",variant:"default",children:a.resetSort})]})]})]})}export{Xe as DataTableColumnsToggle,qe as DataTableExtended,xt as DataTableFilter,Et as DataTablePagination,Ge as DataTableProvider,Lt as DataTableSearch,Zt as DataTableSortList,P as useDataTableContext,T as useDataTableQueryParams};
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 ze({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(ze,{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})]})}function no({recordsPerPageOptions:o=[10,20,30,40,50]}){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 ho(){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 To(){let{search:o,setSearch:e}=D(),{i18n:l}=b(),i=a=>{e({...o,value:a});};return jsxs(Group,{gap:"xs",children:[jsx(ho,{}),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 Ro({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 Eo(){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(Ro,{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,no as DtePagination,$e as DteProvider,To as DteSearch,Eo as DteSortList,b as useDteContext,D as useDteQueryParams};
package/dist/server.d.ts CHANGED
@@ -1,9 +1,11 @@
1
1
  import * as nuqs_server from 'nuqs/server';
2
- import { D as DataTableContextProps } from './data-table-provider.type-CblXE_l1.js';
2
+ import { a as TDteContextProps } from './data-table-provider.type-dlzY73EE.js';
3
+ import 'react';
3
4
  import 'mantine-datatable';
4
5
  import 'zod';
5
6
 
6
- declare const createDataTableLoader: (props?: Pick<DataTableContextProps, "urlKeys" | "defaultParams">) => nuqs_server.LoaderFunction<{
7
+ type TCreateDteLoaderProps = Pick<TDteContextProps, "urlKeys" | "defaultParams">;
8
+ declare function createDteLoader(props?: TCreateDteLoaderProps): nuqs_server.LoaderFunction<{
7
9
  [x: string]: (Omit<nuqs_server.SingleParserBuilder<number>, "parseServerSide"> & {
8
10
  readonly defaultValue: number;
9
11
  parseServerSide(value: string | string[] | undefined): number;
@@ -49,4 +51,4 @@ declare const createDataTableLoader: (props?: Pick<DataTableContextProps, "urlKe
49
51
  });
50
52
  }>;
51
53
 
52
- export { createDataTableLoader };
54
+ export { type TCreateDteLoaderProps, createDteLoader };
package/dist/server.mjs CHANGED
@@ -1 +1 @@
1
- import {parseAsJson,parseAsInteger,createLoader}from'nuqs/server';import {z as z$1}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$1.object({accessor:z$1.string(),direction:z$1.enum(i)}),p=z$1.object({accessors:z$1.array(z$1.string()),value:z$1.string()}),l=z$1.object({variant:z$1.enum(c),accessor:z$1.string(),value:z$1.union([z$1.string(),z$1.array(z$1.string())])});var z=(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$1.array(n)).withDefault(t.sorts),[`${r.search}`]:parseAsJson(p).withDefault(t.search),[`${r.filters}`]:parseAsJson(z$1.array(l)).withDefault(t.filters)};return createLoader(S)};export{z as createDataTableLoader};
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};
@@ -0,0 +1 @@
1
+ @import "./index.css" layer(mantine-datatable-extended);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "mantine-datatable-extended",
3
3
  "type": "module",
4
- "version": "0.2.0",
4
+ "version": "0.3.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",
@@ -33,6 +33,14 @@
33
33
  "types": "./dist/server.d.ts",
34
34
  "import": "./dist/server.mjs",
35
35
  "require": "./dist/server.cjs"
36
+ },
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"
36
44
  }
37
45
  },
38
46
  "files": [
@@ -48,6 +56,7 @@
48
56
  "@repo/config": "0.0.0"
49
57
  },
50
58
  "peerDependencies": {
59
+ "@dnd-kit/react": ">=0.3",
51
60
  "@mantine/core": ">=8.3",
52
61
  "@mantine/dates": ">=8.3",
53
62
  "@mantine/hooks": ">=8.3",