UNPKG

vuestic-ui

Version:
167 lines (166 loc) 5.71 kB
import { ref, computed, watch } from "vue"; import { g as getItemKey } from "./useRows.mjs"; import { b as useSelectableProp, a as useItemsTrackByProp } from "./useCommonProps.mjs"; const useSelectableProps = { ...useSelectableProp, ...useItemsTrackByProp, modelValue: { type: Array }, selectMode: { type: String, default: "multiple" } }; const useSelectableRow = (paginatedRows, props, emit) => { const selectedItemsFallback = ref([]); const selectedItemsSync = computed({ get() { if (props.modelValue === void 0) { return selectedItemsFallback.value; } else { return props.modelValue; } }, set(modelValue) { if (props.modelValue === void 0) { selectedItemsFallback.value = modelValue; } emit("update:modelValue", modelValue); } }); const prevSelectedRowIndex = ref(-1); watch(() => props.selectMode, (newSelectMode, oldSelectMode) => { if (newSelectMode === "single" && oldSelectMode === "multiple") { selectedItemsSync.value = []; setPrevSelectedRowIndex(-1); } }); watch(paginatedRows, () => { setPrevSelectedRowIndex(-1); }); watch(selectedItemsSync, (currentSelectedItems, previousSelectedItems = []) => { emit("selectionChange", { currentSelectedItems, previousSelectedItems }); }, { immediate: true }); const getKey = (source) => getItemKey(source, props.itemsTrackBy); const noRowsSelected = computed(() => !paginatedRows.value.some(({ source }) => selectedItemsSync.value.includes(getKey(source)))); const allRowsSelected = computed(() => { if (paginatedRows.value.length === 0) { return false; } return paginatedRows.value.every(({ source }) => selectedItemsSync.value.includes(getKey(source))); }); const severalRowsSelected = computed(() => !noRowsSelected.value && !allRowsSelected.value); function isRowSelected(row) { return selectedItemsSync.value.includes(getKey(row.source)); } function selectAllRows() { selectedItemsSync.value = [.../* @__PURE__ */ new Set([ ...selectedItemsSync.value, ...paginatedRows.value.map((row) => getKey(row.source)) ])]; } function unselectAllRows() { const paginatedRowsKeys = paginatedRows.value.map((row) => getKey(row.source)); selectedItemsSync.value = selectedItemsSync.value.filter((item) => !paginatedRowsKeys.includes(item)); } function selectRow(row) { selectedItemsSync.value = [...selectedItemsSync.value, getKey(row.source)]; } function selectOnlyRow(row) { selectedItemsSync.value = [getKey(row.source)]; } function unselectRow(row) { const index = selectedItemsSync.value.findIndex((item) => item === getKey(row.source)); selectedItemsSync.value = [ ...selectedItemsSync.value.slice(0, index), ...selectedItemsSync.value.slice(index + 1) ]; } function setPrevSelectedRowIndex(rowInitialIndex) { if (rowInitialIndex === -1) { prevSelectedRowIndex.value = -1; } else { const prevSelectedRow = paginatedRows.value.find((row) => row.initialIndex === rowInitialIndex); prevSelectedRow ? prevSelectedRowIndex.value = paginatedRows.value.indexOf(prevSelectedRow) : prevSelectedRowIndex.value = -1; } } function getRowsToSelect(targetIndex) { let start; let end; if (isRowSelected(paginatedRows.value[prevSelectedRowIndex.value])) { start = Math.min(prevSelectedRowIndex.value, targetIndex); end = Math.max(prevSelectedRowIndex.value, targetIndex); } else { start = Math.min(prevSelectedRowIndex.value + 1, targetIndex); end = Math.max(prevSelectedRowIndex.value - 1, targetIndex); } return paginatedRows.value.slice(start, end + 1); } function mergeSelection(rowsToSelect) { const rowsToSelectedItems = rowsToSelect.map((row) => getKey(row.source)); if (noRowsSelected.value) { selectedItemsSync.value = rowsToSelectedItems; return; } const isInternalSelection = rowsToSelectedItems.every((item) => selectedItemsSync.value.includes(item)); if (isInternalSelection) { selectedItemsSync.value = selectedItemsSync.value.filter((item) => !rowsToSelectedItems.includes(item)); return; } selectedItemsSync.value = [.../* @__PURE__ */ new Set([ ...selectedItemsSync.value, ...rowsToSelectedItems ])]; } function toggleRowSelection(row) { if (!props.selectable) { return; } if (isRowSelected(row)) { unselectRow(row); props.selectMode === "single" ? setPrevSelectedRowIndex(-1) : setPrevSelectedRowIndex(row.initialIndex); } else { props.selectMode === "single" ? selectOnlyRow(row) : selectRow(row); setPrevSelectedRowIndex(row.initialIndex); } } function ctrlSelectRow(row) { if (!props.selectable) { return; } toggleRowSelection(row); } function shiftSelectRows(row) { if (!props.selectable) { return; } if (props.selectMode === "single" || prevSelectedRowIndex.value === -1) { return toggleRowSelection(row); } const targetIndex = paginatedRows.value.indexOf(row); mergeSelection(getRowsToSelect(targetIndex)); setPrevSelectedRowIndex(-1); } function toggleBulkSelection() { if (allRowsSelected.value) { unselectAllRows(); } else { selectAllRows(); } setPrevSelectedRowIndex(-1); } return { ctrlSelectRow, shiftSelectRows, toggleRowSelection, toggleBulkSelection, isRowSelected, noRowsSelected, severalRowsSelected, allRowsSelected }; }; export { useSelectableRow as a, useSelectableProps as u }; //# sourceMappingURL=useSelectableRow.mjs.map