// Composables import { useProxiedModel } from "../../../composables/proxiedModel.mjs"; // Utilities import { computed, inject, provide } from 'vue'; import { deepEqual, propsFactory, wrapInArray } from "../../../util/index.mjs"; // Types const singleSelectStrategy = { showSelectAll: false, allSelected: () => [], select: _ref => { let { items, value } = _ref; return new Set(value ? [items[0]?.value] : []); }, selectAll: _ref2 => { let { selected } = _ref2; return selected; } }; const pageSelectStrategy = { showSelectAll: true, allSelected: _ref3 => { let { currentPage } = _ref3; return currentPage; }, select: _ref4 => { let { items, value, selected } = _ref4; for (const item of items) { if (value) selected.add(item.value);else selected.delete(item.value); } return selected; }, selectAll: _ref5 => { let { value, currentPage, selected } = _ref5; return pageSelectStrategy.select({ items: currentPage, value, selected }); } }; const allSelectStrategy = { showSelectAll: true, allSelected: _ref6 => { let { allItems } = _ref6; return allItems; }, select: _ref7 => { let { items, value, selected } = _ref7; for (const item of items) { if (value) selected.add(item.value);else selected.delete(item.value); } return selected; }, selectAll: _ref8 => { let { value, allItems, selected } = _ref8; return allSelectStrategy.select({ items: allItems, value, selected }); } }; export const makeDataTableSelectProps = propsFactory({ showSelect: Boolean, selectStrategy: { type: [String, Object], default: 'page' }, modelValue: { type: Array, default: () => [] }, valueComparator: { type: Function, default: deepEqual } }, 'DataTable-select'); export const VDataTableSelectionSymbol = Symbol.for('vuetify:data-table-selection'); export function provideSelection(props, _ref9) { let { allItems, currentPage } = _ref9; const selected = useProxiedModel(props, 'modelValue', props.modelValue, v => { return new Set(wrapInArray(v).map(v => { return allItems.value.find(item => props.valueComparator(v, item.value))?.value ?? v; })); }, v => { return [...v.values()]; }); const allSelectable = computed(() => allItems.value.filter(item => item.selectable)); const currentPageSelectable = computed(() => currentPage.value.filter(item => item.selectable)); const selectStrategy = computed(() => { if (typeof props.selectStrategy === 'object') return props.selectStrategy; switch (props.selectStrategy) { case 'single': return singleSelectStrategy; case 'all': return allSelectStrategy; case 'page': default: return pageSelectStrategy; } }); function isSelected(items) { return wrapInArray(items).every(item => selected.value.has(item.value)); } function isSomeSelected(items) { return wrapInArray(items).some(item => selected.value.has(item.value)); } function select(items, value) { const newSelected = selectStrategy.value.select({ items, value, selected: new Set(selected.value) }); selected.value = newSelected; } function toggleSelect(item) { select([item], !isSelected([item])); } function selectAll(value) { const newSelected = selectStrategy.value.selectAll({ value, allItems: allSelectable.value, currentPage: currentPageSelectable.value, selected: new Set(selected.value) }); selected.value = newSelected; } const someSelected = computed(() => selected.value.size > 0); const allSelected = computed(() => { const items = selectStrategy.value.allSelected({ allItems: allSelectable.value, currentPage: currentPageSelectable.value }); return !!items.length && isSelected(items); }); const data = { toggleSelect, select, selectAll, isSelected, isSomeSelected, someSelected, allSelected, showSelectAll: selectStrategy.value.showSelectAll }; provide(VDataTableSelectionSymbol, data); return data; } export function useSelection() { const data = inject(VDataTableSelectionSymbol); if (!data) throw new Error('Missing selection!'); return data; } //# sourceMappingURL=select.mjs.map