3
3
import type { Ref } from 'vue'
4
4
import type { VariantProps } from 'tailwind-variants'
5
5
import type { AppConfig } from '@nuxt/schema'
6
- import type { RowData } from '@tanstack/table-core'
7
6
import type {
8
- Row ,
7
+ CellContext ,
9
8
ColumnDef,
9
+ ColumnFiltersOptions,
10
10
ColumnFiltersState,
11
+ ColumnOrderState,
12
+ ColumnPinningOptions,
11
13
ColumnPinningState,
12
- RowSelectionState,
13
- SortingState,
14
+ ColumnSizingInfoState,
15
+ ColumnSizingOptions,
16
+ ColumnSizingState,
17
+ CoreOptions,
18
+ ExpandedOptions,
14
19
ExpandedState,
15
- VisibilityState ,
20
+ FacetedOptions ,
16
21
GlobalFilterOptions,
17
- ColumnFiltersOptions,
18
- ColumnPinningOptions,
19
- VisibilityOptions,
20
- ExpandedOptions,
21
- SortingOptions,
22
+ GroupingOptions,
23
+ GroupingState,
24
+ HeaderContext,
25
+ PaginationOptions,
26
+ PaginationState,
27
+ Row,
28
+ RowData,
29
+ RowPinningOptions,
30
+ RowPinningState,
22
31
RowSelectionOptions,
32
+ RowSelectionState,
33
+ SortingOptions,
34
+ SortingState,
23
35
Updater,
24
- CellContext ,
25
- HeaderContext
36
+ VisibilityOptions ,
37
+ VisibilityState
26
38
} from '@tanstack/vue-table'
27
39
import _appConfig from '#build/app.config'
28
40
import theme from '#build/ui/table'
@@ -44,13 +56,17 @@ const table = tv({ extend: tv(theme), ...(appConfigTable.ui?.table || {}) })
44
56
45
57
type TableVariants = VariantProps<typeof table>
46
58
47
- export type TableColumn<T> = ColumnDef<T>
59
+ export type TableData = RowData
60
+
61
+ export type TableColumn<T extends TableData, D = unknown> = ColumnDef<T, D>
48
62
49
- export interface TableData {
50
- [key: string]: any
63
+ export interface TableOptions<T extends TableData> extends Omit<CoreOptions<T>, 'data' | 'columns' | 'getCoreRowModel' | 'state' | 'onStateChange' | 'renderFallbackValue'> {
64
+ state?: CoreOptions<T>['state']
65
+ onStateChange?: CoreOptions<T>['onStateChange']
66
+ renderFallbackValue?: CoreOptions<T>['renderFallbackValue']
51
67
}
52
68
53
- export interface TableProps<T> {
69
+ export interface TableProps<T extends TableData> extends TableOptions<T > {
54
70
/**
55
71
* The element or component this component should render as.
56
72
* @defaultValue 'div'
@@ -83,6 +99,11 @@ export interface TableProps<T> {
83
99
* @link [Guide](https://tanstack.com/table/v8/docs/guide/column-pinning)
84
100
*/
85
101
columnPinningOptions?: Omit<ColumnPinningOptions, 'onColumnPinningChange'>
102
+ /**
103
+ * @link [API Docs](https://tanstack.com/table/v8/docs/api/features/column-sizing#table-options)
104
+ * @link [Guide](https://tanstack.com/table/v8/docs/guide/column-sizing)
105
+ */
106
+ columnSizingOptions?: Omit<ColumnSizingOptions, 'onColumnSizingChange' | 'onColumnSizingInfoChange'>
86
107
/**
87
108
* @link [API Docs](https://tanstack.com/table/v8/docs/api/features/column-visibility#table-options)
88
109
* @link [Guide](https://tanstack.com/table/v8/docs/guide/column-visibility)
@@ -93,6 +114,11 @@ export interface TableProps<T> {
93
114
* @link [Guide](https://tanstack.com/table/v8/docs/guide/sorting)
94
115
*/
95
116
sortingOptions?: Omit<SortingOptions<T>, 'getSortedRowModel' | 'onSortingChange'>
117
+ /**
118
+ * @link [API Docs](https://tanstack.com/table/v8/docs/api/features/grouping#table-options)
119
+ * @link [Guide](https://tanstack.com/table/v8/docs/guide/grouping)
120
+ */
121
+ groupingOptions?: Omit<GroupingOptions, 'onGroupingChange'>
96
122
/**
97
123
* @link [API Docs](https://tanstack.com/table/v8/docs/api/features/expanding#table-options)
98
124
* @link [Guide](https://tanstack.com/table/v8/docs/guide/expanding)
@@ -103,6 +129,21 @@ export interface TableProps<T> {
103
129
* @link [Guide](https://tanstack.com/table/v8/docs/guide/row-selection)
104
130
*/
105
131
rowSelectionOptions?: Omit<RowSelectionOptions<T>, 'onRowSelectionChange'>
132
+ /**
133
+ * @link [API Docs](https://tanstack.com/table/v8/docs/api/features/row-pinning#table-options)
134
+ * @link [Guide](https://tanstack.com/table/v8/docs/guide/row-pinning)
135
+ */
136
+ rowPinningOptions?: Omit<RowPinningOptions<T>, 'onRowPinningChange'>
137
+ /**
138
+ * @link [API Docs](https://tanstack.com/table/v8/docs/api/features/pagination#table-options)
139
+ * @link [Guide](https://tanstack.com/table/v8/docs/guide/pagination)
140
+ */
141
+ paginationOptions?: Omit<PaginationOptions, 'onPaginationChange'>
142
+ /**
143
+ * @link [API Docs](https://tanstack.com/table/v8/docs/api/features/column-faceting#table-options)
144
+ * @link [Guide](https://tanstack.com/table/v8/docs/guide/column-faceting)
145
+ */
146
+ facetedOptions?: FacetedOptions<T>
106
147
class?: any
107
148
ui?: Partial<typeof table.slots>
108
149
}
@@ -120,9 +161,10 @@ export type TableSlots<T> = {
120
161
121
162
<script setup lang="ts" generic="T extends TableData">
122
163
import { computed } from 'vue'
123
- import { Primitive } from 'reka-ui'
124
- import { FlexRender, getCoreRowModel, getFilteredRowModel, getSortedRowModel, getExpandedRowModel, useVueTable } from '@tanstack/vue-table'
164
+ import { Primitive, useForwardProps } from 'reka-ui'
125
165
import { upperFirst } from 'scule'
166
+ import { FlexRender, getCoreRowModel, getFilteredRowModel, getSortedRowModel, getExpandedRowModel, useVueTable } from '@tanstack/vue-table'
167
+ import { reactiveOmit } from '@vueuse/core'
126
168
import { useLocale } from '../composables/useLocale'
127
169
128
170
const props = defineProps<TableProps<T>>()
@@ -142,13 +184,22 @@ const ui = computed(() => table({
142
184
143
185
const globalFilterState = defineModel<string>('globalFilter', { default: undefined })
144
186
const columnFiltersState = defineModel<ColumnFiltersState>('columnFilters', { default: [] })
187
+ const columnOrderState = defineModel<ColumnOrderState>('columnOrder', { default: [] })
145
188
const columnVisibilityState = defineModel<VisibilityState>('columnVisibility', { default: {} })
146
189
const columnPinningState = defineModel<ColumnPinningState>('columnPinning', { default: {} })
190
+ const columnSizingState = defineModel<ColumnSizingState>('columnSizing', { default: {} })
191
+ const columnSizingInfoState = defineModel<ColumnSizingInfoState>('columnSizingInfo', { default: {} })
147
192
const rowSelectionState = defineModel<RowSelectionState>('rowSelection', { default: {} })
193
+ const rowPinningState = defineModel<RowPinningState>('rowPinning', { default: {} })
148
194
const sortingState = defineModel<SortingState>('sorting', { default: [] })
195
+ const groupingState = defineModel<GroupingState>('grouping', { default: [] })
149
196
const expandedState = defineModel<ExpandedState>('expanded', { default: {} })
197
+ const paginationState = defineModel<PaginationState>('pagination', { default: {} })
198
+
199
+ const tableProps = useForwardProps(reactiveOmit(props, 'as', 'data', 'columns', 'caption', 'sticky', 'loading', 'loadingColor', 'loadingAnimation', 'class', 'ui'))
150
200
151
201
const tableApi = useVueTable({
202
+ ...tableProps,
152
203
data,
153
204
columns: columns.value,
154
205
getCoreRowModel: getCoreRowModel(),
@@ -157,25 +208,39 @@ const tableApi = useVueTable({
157
208
...(props.columnFiltersOptions || {}),
158
209
getFilteredRowModel: getFilteredRowModel(),
159
210
onColumnFiltersChange: updaterOrValue => valueUpdater(updaterOrValue, columnFiltersState),
211
+ onColumnOrderChange: updaterOrValue => valueUpdater(updaterOrValue, columnOrderState),
160
212
...(props.visibilityOptions || {}),
161
213
onColumnVisibilityChange: updaterOrValue => valueUpdater(updaterOrValue, columnVisibilityState),
162
214
...(props.columnPinningOptions || {}),
163
215
onColumnPinningChange: updaterOrValue => valueUpdater(updaterOrValue, columnPinningState),
216
+ ...(props.columnSizingOptions || {}),
217
+ onColumnSizingChange: updaterOrValue => valueUpdater(updaterOrValue, columnSizingState),
218
+ onColumnSizingInfoChange: updaterOrValue => valueUpdater(updaterOrValue, columnSizingInfoState),
164
219
...(props.rowSelectionOptions || {}),
165
220
onRowSelectionChange: updaterOrValue => valueUpdater(updaterOrValue, rowSelectionState),
221
+ ...(props.rowPinningOptions || {}),
222
+ onRowPinningChange: updaterOrValue => valueUpdater(updaterOrValue, rowPinningState),
166
223
...(props.sortingOptions || {}),
167
224
getSortedRowModel: getSortedRowModel(),
168
225
onSortingChange: updaterOrValue => valueUpdater(updaterOrValue, sortingState),
226
+ ...(props.groupingOptions || {}),
227
+ onGroupingChange: updaterOrValue => valueUpdater(updaterOrValue, groupingState),
169
228
...(props.expandedOptions || {}),
170
229
getExpandedRowModel: getExpandedRowModel(),
171
230
onExpandedChange: updaterOrValue => valueUpdater(updaterOrValue, expandedState),
231
+ ...(props.paginationOptions || {}),
232
+ onPaginationChange: updaterOrValue => valueUpdater(updaterOrValue, paginationState),
233
+ ...(props.facetedOptions || {}),
172
234
state: {
173
235
get globalFilter() {
174
236
return globalFilterState.value
175
237
},
176
238
get columnFilters() {
177
239
return columnFiltersState.value
178
240
},
241
+ get columnOrder() {
242
+ return columnOrderState.value
243
+ },
179
244
get columnVisibility() {
180
245
return columnVisibilityState.value
181
246
},
@@ -190,6 +255,21 @@ const tableApi = useVueTable({
190
255
},
191
256
get sorting() {
192
257
return sortingState.value
258
+ },
259
+ get grouping() {
260
+ return groupingState.value
261
+ },
262
+ get rowPinning() {
263
+ return rowPinningState.value
264
+ },
265
+ get columnSizing() {
266
+ return columnSizingState.value
267
+ },
268
+ get columnSizingInfo() {
269
+ return columnSizingInfoState.value
270
+ },
271
+ get pagination() {
272
+ return paginationState.value
193
273
}
194
274
}
195
275
})
0 commit comments