UNPKG

vuetify

Version:

Vue Material Component Framework

193 lines 5.11 kB
// Composables import { useProxiedModel } from "../../../composables/proxiedModel.js"; // Utilities import { computed, inject, provide, shallowRef, toRef } from 'vue'; import { deepEqual, propsFactory, wrapInArray } from "../../../util/index.js"; // 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; } }); const lastSelectedIndex = shallowRef(null); 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, index, event) { const items = []; index = index ?? currentPage.value.findIndex(i => i.value === item.value); if (props.selectStrategy !== 'single' && event?.shiftKey && lastSelectedIndex.value !== null) { const [start, end] = [lastSelectedIndex.value, index].sort((a, b) => a - b); items.push(...currentPage.value.slice(start, end + 1).filter(item => item.selectable)); } else { items.push(item); lastSelectedIndex.value = index; } select(items, !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 showSelectAll = toRef(() => selectStrategy.value.showSelectAll); const data = { toggleSelect, select, selectAll, isSelected, isSomeSelected, someSelected, allSelected, showSelectAll, lastSelectedIndex, selectStrategy }; provide(VDataTableSelectionSymbol, data); return data; } export function useSelection() { const data = inject(VDataTableSelectionSymbol); if (!data) throw new Error('Missing selection!'); return data; } //# sourceMappingURL=select.js.map