@vuetify/v0 0.1.3 → 0.1.4
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/dist/adapter-BN-h5JbD.d.mts +344 -0
- package/dist/adapter-CJIj5ySf.d.mts +11 -0
- package/dist/adapter-D_0ptsPm.mjs +229 -0
- package/dist/adapters-BQ-Lr3PW.mjs +1 -0
- package/dist/adapters-DEXpW9If.mjs +1 -0
- package/dist/adapters-Q9WaOsJp.mjs +1 -0
- package/dist/adapters-SSDVth5e.mjs +1 -0
- package/dist/browser/index.js +359 -933
- package/dist/components/index.d.mts +19 -6
- package/dist/components/index.mjs +37 -5
- package/dist/{components-C0zEvP7w.mjs → components-CMuzTJdK.mjs} +11 -4
- package/dist/composables/index.d.mts +17 -4
- package/dist/composables/index.mjs +36 -4
- package/dist/consola-DiUk9j3y.d.mts +15 -0
- package/dist/consola-GBy8XRuL.mjs +31 -0
- package/dist/constants/index.d.mts +1 -1
- package/dist/constants/index.mjs +3 -3
- package/dist/constants-B8pMSkcW.mjs +1 -0
- package/dist/createDataTable-BJnmvxfb.mjs +387 -0
- package/dist/createGroup-CPhp6FUh.mjs +363 -0
- package/dist/createPagination-cyOWlpfH.mjs +234 -0
- package/dist/createSelection-uqEbFgha.mjs +261 -0
- package/dist/createSingle-B59ya3aa.mjs +179 -0
- package/dist/createTokens-BlhLdHXE.mjs +682 -0
- package/dist/createTrinity-EeHQSsb6.mjs +149 -0
- package/dist/data-table/adapters/client/index.d.mts +3 -0
- package/dist/data-table/adapters/client/index.mjs +9 -0
- package/dist/data-table/adapters/index.d.mts +5 -0
- package/dist/data-table/adapters/index.mjs +12 -0
- package/dist/data-table/adapters/server/index.d.mts +3 -0
- package/dist/data-table/adapters/server/index.mjs +7 -0
- package/dist/data-table/adapters/virtual/index.d.mts +3 -0
- package/dist/data-table/adapters/virtual/index.mjs +9 -0
- package/dist/data-table/index.d.mts +7 -0
- package/dist/data-table/index.mjs +25 -0
- package/dist/date/index.d.mts +1 -1
- package/dist/date/index.mjs +2 -2
- package/dist/features/adapters/flagsmith/index.d.mts +16 -0
- package/dist/features/adapters/flagsmith/index.mjs +3 -0
- package/dist/features/adapters/launchdarkly/index.d.mts +15 -0
- package/dist/features/adapters/launchdarkly/index.mjs +3 -0
- package/dist/features/adapters/posthog/index.d.mts +15 -0
- package/dist/features/adapters/posthog/index.mjs +4 -0
- package/dist/features/index.d.mts +17 -0
- package/dist/features/index.mjs +18 -0
- package/dist/flagsmith-CHmpPGR7.mjs +40 -0
- package/dist/{globals-BwYsH-rt.mjs → globals-B_GVfG06.mjs} +2 -2
- package/dist/index-7mWYFHA6.d.mts +251 -0
- package/dist/index-BDTbJClL.d.mts +11 -0
- package/dist/index-BuOz3Rgm.d.mts +32 -0
- package/dist/{index-Bmem4l8m.d.mts → index-Bv1VN_j5.d.mts} +1 -1
- package/dist/{index-DFM5iBqh.d.mts → index-CQrDeqsK.d.mts} +280 -279
- package/dist/{index-2wh69fk5.d.mts → index-Dd0m0LIJ.d.mts} +135 -1407
- package/dist/{index-DBZTizq2.d.mts → index-UNwEBkQT.d.mts} +16 -2
- package/dist/index.d.mts +20 -7
- package/dist/index.mjs +39 -7
- package/dist/json/web-types.json +1 -1
- package/dist/launchdarkly-W8t8ZANX.mjs +28 -0
- package/dist/locale/adapters/index.d.mts +3 -0
- package/dist/locale/adapters/index.mjs +6 -0
- package/dist/locale/adapters/v0/index.d.mts +3 -0
- package/dist/locale/adapters/v0/index.mjs +5 -0
- package/dist/locale/index.d.mts +17 -0
- package/dist/locale/index.mjs +17 -0
- package/dist/logger/adapters/consola/index.d.mts +3 -0
- package/dist/logger/adapters/consola/index.mjs +3 -0
- package/dist/logger/adapters/index.d.mts +5 -0
- package/dist/logger/adapters/index.mjs +8 -0
- package/dist/logger/adapters/pino/index.d.mts +3 -0
- package/dist/logger/adapters/pino/index.mjs +5 -0
- package/dist/logger/adapters/v0/index.d.mts +3 -0
- package/dist/logger/adapters/v0/index.mjs +5 -0
- package/dist/logger/index.d.mts +17 -0
- package/dist/logger/index.mjs +10 -0
- package/dist/memory-BsZGbGnG.mjs +27 -0
- package/dist/memory-DVjquu_v.d.mts +25 -0
- package/dist/permissions/adapters/index.d.mts +18 -0
- package/dist/permissions/adapters/index.mjs +6 -0
- package/dist/permissions/adapters/v0/index.d.mts +18 -0
- package/dist/permissions/adapters/v0/index.mjs +5 -0
- package/dist/permissions/index.d.mts +17 -0
- package/dist/permissions/index.mjs +15 -0
- package/dist/pino-01x_NmWp.mjs +49 -0
- package/dist/pino-p-jDkNQd.d.mts +24 -0
- package/dist/posthog-BrGBPPir.mjs +50 -0
- package/dist/server-6cs14bj1.d.mts +20 -0
- package/dist/server-ClCwiLMA.mjs +45 -0
- package/dist/storage/adapters/index.d.mts +3 -0
- package/dist/storage/adapters/index.mjs +3 -0
- package/dist/storage/adapters/memory/index.d.mts +2 -0
- package/dist/storage/adapters/memory/index.mjs +3 -0
- package/dist/storage/index.d.mts +17 -0
- package/dist/storage/index.mjs +37 -0
- package/dist/theme/adapters/index.d.mts +17 -0
- package/dist/theme/adapters/index.mjs +6 -0
- package/dist/theme/adapters/v0/index.d.mts +17 -0
- package/dist/theme/adapters/v0/index.mjs +5 -0
- package/dist/theme/index.d.mts +17 -0
- package/dist/theme/index.mjs +16 -0
- package/dist/toArray-DIeXVX1C.mjs +38 -0
- package/dist/types/index.d.mts +1 -1
- package/dist/useClickOutside-p8HP07At.mjs +4680 -0
- package/dist/useFeatures-C4JF3Hgr.mjs +122 -0
- package/dist/useLocale-DlbShzF-.mjs +85 -0
- package/dist/useLogger-CO9JwbSJ.mjs +283 -0
- package/dist/usePermissions-DQVT_4nD.mjs +128 -0
- package/dist/useTheme-Bcw1Ebyt.mjs +135 -0
- package/dist/utilities/index.d.mts +3 -3
- package/dist/utilities/index.mjs +3 -3
- package/dist/{utilities-BbKjbXTx.mjs → utilities-BqS1sC1W.mjs} +20 -3
- package/dist/v0-B40YkIQ-.mjs +21 -0
- package/dist/v0-BOxb3nD1.d.mts +33 -0
- package/dist/v0-BogbIzpM.mjs +41 -0
- package/dist/v0-BtQCSBOG.mjs +37 -0
- package/dist/v0-C-9dv_1S.d.mts +10 -0
- package/dist/v0-CtjuUUPl.mjs +73 -0
- package/dist/v0-DHMoZ7dS.d.mts +22 -0
- package/dist/v0-ONBWyQYQ.mjs +83 -0
- package/dist/v0-RepwEY1F.d.mts +9 -0
- package/dist/virtual-B3IPkHC0.d.mts +9 -0
- package/dist/virtual-BP9WXRzN.mjs +44 -0
- package/package.json +34 -2
- package/dist/useClickOutside-DrkNYxDe.mjs +0 -8871
- /package/dist/{adapter-D95FHAtt.d.mts → adapter-DcwxFryd.d.mts} +0 -0
- /package/dist/{constants-DHKqjdjH.mjs → adapters-BGJKsBrw.mjs} +0 -0
- /package/dist/{htmlElements-DO9n35bD.mjs → htmlElements-d8iBCGpO.mjs} +0 -0
- /package/dist/{index-BLK67J_-.d.mts → index-BFBN5Zl3.d.mts} +0 -0
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
import { l as isNullOrUndefined, p as isString, u as isNumber } from "./utilities-BqS1sC1W.mjs";
|
|
2
|
+
import { i as useContext, n as createContext, t as createTrinity } from "./createTrinity-EeHQSsb6.mjs";
|
|
3
|
+
import { t as createGroup } from "./createGroup-CPhp6FUh.mjs";
|
|
4
|
+
import { a as useLocale } from "./useLocale-DlbShzF-.mjs";
|
|
5
|
+
import { t as ClientAdapter } from "./v0-BogbIzpM.mjs";
|
|
6
|
+
import { computed, shallowReactive, shallowRef, toRef, watch } from "vue";
|
|
7
|
+
|
|
8
|
+
//#region src/composables/createDataTable/index.ts
|
|
9
|
+
/**
|
|
10
|
+
* @module createDataTable
|
|
11
|
+
*
|
|
12
|
+
* @remarks
|
|
13
|
+
* Composable data table that composes existing v0 primitives rather than
|
|
14
|
+
* reimplementing their logic. Uses createGroup's tri-state for sort direction
|
|
15
|
+
* and delegates the data pipeline (filter, sort, paginate) to an adapter.
|
|
16
|
+
*
|
|
17
|
+
* Key features:
|
|
18
|
+
* - Adapter pattern for pipeline strategy (client, server, virtual)
|
|
19
|
+
* - Sort via createGroup tri-state: selected=asc, mixed=desc, unselected=none
|
|
20
|
+
* - Selection strategies: single, page, all
|
|
21
|
+
* - Per-column custom sort/filter functions
|
|
22
|
+
* - Row selectability control via itemSelectable
|
|
23
|
+
* - Sort options: mandate, firstSortOrder
|
|
24
|
+
* - Row selection via lightweight Set (not registry-based)
|
|
25
|
+
* - Trinity pattern for dependency injection
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* Creates a data table instance with sort controls, selection, and an
|
|
29
|
+
* adapter-driven data pipeline.
|
|
30
|
+
*
|
|
31
|
+
* Must be called inside a component `setup()` or a Vue effect scope.
|
|
32
|
+
* Calling at module scope in SSR environments causes request state leakage.
|
|
33
|
+
*
|
|
34
|
+
* @param options Data table options
|
|
35
|
+
* @returns Data table context with pipeline stages and controls
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* import { createDataTable } from '@vuetify/v0'
|
|
40
|
+
*
|
|
41
|
+
* const table = createDataTable({
|
|
42
|
+
* items: users,
|
|
43
|
+
* columns: [
|
|
44
|
+
* { key: 'name', title: 'Name', sortable: true, filterable: true },
|
|
45
|
+
* { key: 'email', title: 'Email', sortable: true, filterable: true },
|
|
46
|
+
* { key: 'age', title: 'Age', sortable: true },
|
|
47
|
+
* ],
|
|
48
|
+
* })
|
|
49
|
+
*
|
|
50
|
+
* // Search
|
|
51
|
+
* table.search('john')
|
|
52
|
+
*
|
|
53
|
+
* // Sort
|
|
54
|
+
* table.sort.toggle('name') // asc
|
|
55
|
+
* table.sort.toggle('name') // desc
|
|
56
|
+
* table.sort.toggle('name') // none
|
|
57
|
+
* console.log(table.sort.columns.value) // [{ key: 'name', direction: 'asc' }]
|
|
58
|
+
*
|
|
59
|
+
* // Paginate
|
|
60
|
+
* table.pagination.next()
|
|
61
|
+
*
|
|
62
|
+
* // Select rows
|
|
63
|
+
* table.selection.toggle('user-1')
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
function createDataTable(options) {
|
|
67
|
+
const { items: _items, columns, itemValue = "id", filter: filterOptions = {}, pagination: paginationOptions = {}, sortMultiple = false, mandate = false, firstSortOrder = "asc", selectStrategy = "page", itemSelectable, groupBy, enroll = false, expandMultiple = true, locale: initialLocale, adapter = new ClientAdapter() } = options;
|
|
68
|
+
const _query = shallowRef("");
|
|
69
|
+
function search(value) {
|
|
70
|
+
_query.value = value;
|
|
71
|
+
}
|
|
72
|
+
const { selectedId: selectedLocale } = useLocale();
|
|
73
|
+
const locale = toRef(() => {
|
|
74
|
+
const selected = selectedLocale?.value;
|
|
75
|
+
if (!/* @__PURE__ */ isNullOrUndefined(selected)) return String(selected);
|
|
76
|
+
return initialLocale;
|
|
77
|
+
});
|
|
78
|
+
const sortable = columns.filter((col) => col.sortable === true);
|
|
79
|
+
const group = createGroup({ multiple: sortMultiple });
|
|
80
|
+
group.onboard(sortable.map((col) => ({
|
|
81
|
+
id: col.key,
|
|
82
|
+
value: col.key
|
|
83
|
+
})));
|
|
84
|
+
const order = shallowReactive([]);
|
|
85
|
+
function toggle(key) {
|
|
86
|
+
if (!group.has(key)) return;
|
|
87
|
+
const isAsc = group.selectedIds.has(key);
|
|
88
|
+
const isDesc = group.mixed(key);
|
|
89
|
+
function clearOthers() {
|
|
90
|
+
if (!sortMultiple) {
|
|
91
|
+
group.mixedIds.clear();
|
|
92
|
+
order.length = 0;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function setAsc() {
|
|
96
|
+
group.unmix(key);
|
|
97
|
+
group.select(key);
|
|
98
|
+
}
|
|
99
|
+
function setDesc() {
|
|
100
|
+
group.unselect(key);
|
|
101
|
+
group.mix(key);
|
|
102
|
+
}
|
|
103
|
+
function setNone() {
|
|
104
|
+
group.unselect(key);
|
|
105
|
+
group.unmix(key);
|
|
106
|
+
const idx = order.indexOf(key);
|
|
107
|
+
if (idx !== -1) order.splice(idx, 1);
|
|
108
|
+
}
|
|
109
|
+
if (!isAsc && !isDesc) {
|
|
110
|
+
clearOthers();
|
|
111
|
+
if (firstSortOrder === "desc") setDesc();
|
|
112
|
+
else setAsc();
|
|
113
|
+
order.push(key);
|
|
114
|
+
} else if (isAsc) if (firstSortOrder === "desc" && !mandate) setNone();
|
|
115
|
+
else setDesc();
|
|
116
|
+
else if (firstSortOrder === "asc" && !mandate) setNone();
|
|
117
|
+
else setAsc();
|
|
118
|
+
}
|
|
119
|
+
const sortBy = computed(() => {
|
|
120
|
+
const result = [];
|
|
121
|
+
for (const key of order) if (group.selectedIds.has(key)) result.push({
|
|
122
|
+
key,
|
|
123
|
+
direction: "asc"
|
|
124
|
+
});
|
|
125
|
+
else if (group.mixed(key)) result.push({
|
|
126
|
+
key,
|
|
127
|
+
direction: "desc"
|
|
128
|
+
});
|
|
129
|
+
return result;
|
|
130
|
+
});
|
|
131
|
+
function direction(key) {
|
|
132
|
+
if (group.selectedIds.has(key)) return "asc";
|
|
133
|
+
if (group.mixed(key)) return "desc";
|
|
134
|
+
return "none";
|
|
135
|
+
}
|
|
136
|
+
function priority(key) {
|
|
137
|
+
return order.indexOf(key);
|
|
138
|
+
}
|
|
139
|
+
function reset() {
|
|
140
|
+
group.unselectAll();
|
|
141
|
+
group.mixedIds.clear();
|
|
142
|
+
order.length = 0;
|
|
143
|
+
}
|
|
144
|
+
const sort = {
|
|
145
|
+
toggle,
|
|
146
|
+
columns: sortBy,
|
|
147
|
+
order,
|
|
148
|
+
direction,
|
|
149
|
+
priority,
|
|
150
|
+
reset
|
|
151
|
+
};
|
|
152
|
+
const filterable = columns.filter((col) => col.filterable === true).map((col) => col.key);
|
|
153
|
+
const customSorts = {};
|
|
154
|
+
for (const col of columns) if (col.sort) customSorts[col.key] = col.sort;
|
|
155
|
+
const customColumnFilters = {};
|
|
156
|
+
for (const col of columns) if (col.filter) customColumnFilters[col.key] = col.filter;
|
|
157
|
+
const { allItems, filteredItems, sortedItems, items: visible, pagination, total, loading = toRef(() => false), error = toRef(() => null) } = adapter.setup({
|
|
158
|
+
items: _items,
|
|
159
|
+
search: _query,
|
|
160
|
+
filterableKeys: filterable,
|
|
161
|
+
sortBy,
|
|
162
|
+
locale,
|
|
163
|
+
filterOptions,
|
|
164
|
+
paginationOptions,
|
|
165
|
+
customSorts,
|
|
166
|
+
customColumnFilters
|
|
167
|
+
});
|
|
168
|
+
const selectedIds = shallowReactive(/* @__PURE__ */ new Set());
|
|
169
|
+
function rowId(item) {
|
|
170
|
+
const value = item[itemValue];
|
|
171
|
+
if (/* @__PURE__ */ isString(value) || /* @__PURE__ */ isNumber(value)) return value;
|
|
172
|
+
throw new Error(`[v0:data-table] itemValue "${itemValue}" must resolve to a string or number`);
|
|
173
|
+
}
|
|
174
|
+
const selectableIds = computed(() => {
|
|
175
|
+
if (!itemSelectable) return null;
|
|
176
|
+
const ids = /* @__PURE__ */ new Set();
|
|
177
|
+
for (const item of allItems.value) if (item[itemSelectable]) ids.add(rowId(item));
|
|
178
|
+
return ids;
|
|
179
|
+
});
|
|
180
|
+
function isSelectable(id) {
|
|
181
|
+
return !selectableIds.value || selectableIds.value.has(id);
|
|
182
|
+
}
|
|
183
|
+
const scopeItems = toRef(() => {
|
|
184
|
+
if (selectStrategy === "single") return [];
|
|
185
|
+
return selectStrategy === "all" ? sortedItems.value : visible.value;
|
|
186
|
+
});
|
|
187
|
+
const selectableScope = computed(() => {
|
|
188
|
+
if (!itemSelectable) return scopeItems.value;
|
|
189
|
+
return scopeItems.value.filter((item) => !!item[itemSelectable]);
|
|
190
|
+
});
|
|
191
|
+
const selection = {
|
|
192
|
+
selectedIds,
|
|
193
|
+
select(id) {
|
|
194
|
+
if (!isSelectable(id)) return;
|
|
195
|
+
if (selectStrategy === "single") selectedIds.clear();
|
|
196
|
+
selectedIds.add(id);
|
|
197
|
+
},
|
|
198
|
+
unselect(id) {
|
|
199
|
+
selectedIds.delete(id);
|
|
200
|
+
},
|
|
201
|
+
toggle(id) {
|
|
202
|
+
if (selectedIds.has(id)) selectedIds.delete(id);
|
|
203
|
+
else selection.select(id);
|
|
204
|
+
},
|
|
205
|
+
isSelected(id) {
|
|
206
|
+
return selectedIds.has(id);
|
|
207
|
+
},
|
|
208
|
+
isSelectable,
|
|
209
|
+
selectAll() {
|
|
210
|
+
for (const item of selectableScope.value) selectedIds.add(rowId(item));
|
|
211
|
+
},
|
|
212
|
+
unselectAll() {
|
|
213
|
+
selectedIds.clear();
|
|
214
|
+
},
|
|
215
|
+
toggleAll() {
|
|
216
|
+
if (selectStrategy === "single") return;
|
|
217
|
+
if (selection.isAllSelected.value) for (const item of selectableScope.value) selectedIds.delete(rowId(item));
|
|
218
|
+
else selection.selectAll();
|
|
219
|
+
},
|
|
220
|
+
isAllSelected: computed(() => {
|
|
221
|
+
const items = selectableScope.value;
|
|
222
|
+
if (items.length === 0) return false;
|
|
223
|
+
return items.every((item) => selectedIds.has(rowId(item)));
|
|
224
|
+
}),
|
|
225
|
+
isMixed: computed(() => {
|
|
226
|
+
const items = selectableScope.value;
|
|
227
|
+
if (items.length === 0) return false;
|
|
228
|
+
return items.some((item) => selectedIds.has(rowId(item))) && !selection.isAllSelected.value;
|
|
229
|
+
})
|
|
230
|
+
};
|
|
231
|
+
const expandedIds = shallowReactive(/* @__PURE__ */ new Set());
|
|
232
|
+
const expansion = {
|
|
233
|
+
expandedIds,
|
|
234
|
+
expand(id) {
|
|
235
|
+
if (!expandMultiple) expandedIds.clear();
|
|
236
|
+
expandedIds.add(id);
|
|
237
|
+
},
|
|
238
|
+
collapse(id) {
|
|
239
|
+
expandedIds.delete(id);
|
|
240
|
+
},
|
|
241
|
+
toggle(id) {
|
|
242
|
+
if (expandedIds.has(id)) expandedIds.delete(id);
|
|
243
|
+
else expansion.expand(id);
|
|
244
|
+
},
|
|
245
|
+
isExpanded(id) {
|
|
246
|
+
return expandedIds.has(id);
|
|
247
|
+
},
|
|
248
|
+
expandAll() {
|
|
249
|
+
if (!expandMultiple) return;
|
|
250
|
+
for (const item of visible.value) expandedIds.add(rowId(item));
|
|
251
|
+
},
|
|
252
|
+
collapseAll() {
|
|
253
|
+
expandedIds.clear();
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
const openGroupKeys = shallowReactive(/* @__PURE__ */ new Set());
|
|
257
|
+
const groups = computed(() => {
|
|
258
|
+
if (!groupBy) return [];
|
|
259
|
+
const map = /* @__PURE__ */ new Map();
|
|
260
|
+
for (const item of sortedItems.value) {
|
|
261
|
+
const raw = item[groupBy];
|
|
262
|
+
const key = String(raw ?? "");
|
|
263
|
+
let entry = map.get(key);
|
|
264
|
+
if (!entry) {
|
|
265
|
+
entry = {
|
|
266
|
+
value: raw,
|
|
267
|
+
items: []
|
|
268
|
+
};
|
|
269
|
+
map.set(key, entry);
|
|
270
|
+
}
|
|
271
|
+
entry.items.push(item);
|
|
272
|
+
}
|
|
273
|
+
const result = [];
|
|
274
|
+
for (const [key, entry] of map) result.push({
|
|
275
|
+
key,
|
|
276
|
+
value: entry.value,
|
|
277
|
+
items: entry.items
|
|
278
|
+
});
|
|
279
|
+
return result;
|
|
280
|
+
});
|
|
281
|
+
if (enroll) {
|
|
282
|
+
for (const group$1 of groups.value) openGroupKeys.add(group$1.key);
|
|
283
|
+
if (groups.value.length === 0) {
|
|
284
|
+
const stop = watch(groups, (newGroups) => {
|
|
285
|
+
if (newGroups.length === 0) return;
|
|
286
|
+
for (const group$1 of newGroups) openGroupKeys.add(group$1.key);
|
|
287
|
+
stop();
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return {
|
|
292
|
+
items: visible,
|
|
293
|
+
allItems,
|
|
294
|
+
filteredItems,
|
|
295
|
+
sortedItems,
|
|
296
|
+
columns,
|
|
297
|
+
search,
|
|
298
|
+
query: _query,
|
|
299
|
+
sort,
|
|
300
|
+
pagination,
|
|
301
|
+
selection,
|
|
302
|
+
expansion,
|
|
303
|
+
grouping: {
|
|
304
|
+
groups,
|
|
305
|
+
toggle(groupKey) {
|
|
306
|
+
if (openGroupKeys.has(groupKey)) openGroupKeys.delete(groupKey);
|
|
307
|
+
else openGroupKeys.add(groupKey);
|
|
308
|
+
},
|
|
309
|
+
isOpen(groupKey) {
|
|
310
|
+
return openGroupKeys.has(groupKey);
|
|
311
|
+
},
|
|
312
|
+
open(groupKey) {
|
|
313
|
+
openGroupKeys.add(groupKey);
|
|
314
|
+
},
|
|
315
|
+
close(groupKey) {
|
|
316
|
+
openGroupKeys.delete(groupKey);
|
|
317
|
+
},
|
|
318
|
+
openAll() {
|
|
319
|
+
for (const group$1 of groups.value) openGroupKeys.add(group$1.key);
|
|
320
|
+
},
|
|
321
|
+
closeAll() {
|
|
322
|
+
openGroupKeys.clear();
|
|
323
|
+
}
|
|
324
|
+
},
|
|
325
|
+
total,
|
|
326
|
+
loading,
|
|
327
|
+
error
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Creates a data table context with dependency injection support.
|
|
332
|
+
*
|
|
333
|
+
* @param options Data table context options including namespace
|
|
334
|
+
* @returns A trinity tuple: [useDataTable, provideDataTable, defaultContext]
|
|
335
|
+
*
|
|
336
|
+
* @example
|
|
337
|
+
* ```ts
|
|
338
|
+
* import { createDataTableContext } from '@vuetify/v0'
|
|
339
|
+
*
|
|
340
|
+
* const [useDataTable, provideDataTable, context] = createDataTableContext({
|
|
341
|
+
* namespace: 'app:users',
|
|
342
|
+
* items: users,
|
|
343
|
+
* columns: [
|
|
344
|
+
* { key: 'name', title: 'Name', sortable: true },
|
|
345
|
+
* ],
|
|
346
|
+
* })
|
|
347
|
+
*
|
|
348
|
+
* // Parent component
|
|
349
|
+
* provideDataTable()
|
|
350
|
+
*
|
|
351
|
+
* // Child component
|
|
352
|
+
* const table = useDataTable()
|
|
353
|
+
* ```
|
|
354
|
+
*/
|
|
355
|
+
function createDataTableContext(_options) {
|
|
356
|
+
const { namespace = "v0:data-table", ...options } = _options;
|
|
357
|
+
const [useDataTableContext, _provideDataTableContext] = createContext(namespace);
|
|
358
|
+
const context = createDataTable(options);
|
|
359
|
+
function provideDataTableContext(_context = context, app) {
|
|
360
|
+
return _provideDataTableContext(_context, app);
|
|
361
|
+
}
|
|
362
|
+
return createTrinity(useDataTableContext, provideDataTableContext, context);
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Returns the current data table context from dependency injection.
|
|
366
|
+
*
|
|
367
|
+
* @typeParam T - Must be provided explicitly; cannot be inferred from namespace.
|
|
368
|
+
* Prefer the `useX` function from {@link createDataTableContext} for type-safe injection.
|
|
369
|
+
*
|
|
370
|
+
* @param namespace The namespace for the data table context. @default 'v0:data-table'
|
|
371
|
+
* @returns The current data table context
|
|
372
|
+
*
|
|
373
|
+
* @example
|
|
374
|
+
* ```vue
|
|
375
|
+
* <script setup lang="ts">
|
|
376
|
+
* import { useDataTable } from '@vuetify/v0'
|
|
377
|
+
*
|
|
378
|
+
* const table = useDataTable<User>()
|
|
379
|
+
* <\/script>
|
|
380
|
+
* ```
|
|
381
|
+
*/
|
|
382
|
+
function useDataTable(namespace = "v0:data-table") {
|
|
383
|
+
return useContext(namespace);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
//#endregion
|
|
387
|
+
export { createDataTableContext as n, useDataTable as r, createDataTable as t };
|