vuestic-ui
Version:
Vue 3 UI Framework
167 lines (166 loc) • 5.71 kB
JavaScript
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