@mcabreradev/filter
Version:
A powerful, SQL-like array filtering library for TypeScript and JavaScript with advanced pattern matching, MongoDB-style operators, deep object comparison, and zero dependencies
65 lines (64 loc) • 2.31 kB
JavaScript
import { ref, computed, unref } from 'vue';
import { filter } from '../../core';
import { DEFAULT_PAGE_SIZE, DEFAULT_INITIAL_PAGE } from './vue.constants';
import { getPageData, createPaginationResult, validatePageNumber, validatePageSize, } from '../shared';
export function usePaginatedFilter(data, expression, initialPageSize = DEFAULT_PAGE_SIZE, options) {
const currentPage = ref(DEFAULT_INITIAL_PAGE);
const pageSize = ref(validatePageSize(initialPageSize));
const filtered = computed(() => {
const dataValue = unref(data);
const expressionValue = unref(expression);
if (!dataValue || dataValue.length === 0) {
return [];
}
try {
return filter(dataValue, expressionValue, options);
}
catch {
return [];
}
});
const isFiltering = computed(() => {
const dataValue = unref(data);
return filtered.value.length !== dataValue.length;
});
const paginationState = computed(() => ({
currentPage: currentPage.value,
pageSize: pageSize.value,
totalItems: filtered.value.length,
}));
const pageData = computed(() => {
return getPageData(filtered.value, currentPage.value, pageSize.value);
});
const pagination = computed(() => {
return createPaginationResult(pageData.value, filtered.value, paginationState.value);
});
const nextPage = () => {
const validated = validatePageNumber(currentPage.value + 1, pagination.value.totalPages);
currentPage.value = validated;
};
const previousPage = () => {
const validated = validatePageNumber(currentPage.value - 1, pagination.value.totalPages);
currentPage.value = validated;
};
const goToPage = (page) => {
const validated = validatePageNumber(page, pagination.value.totalPages);
currentPage.value = validated;
};
const setPageSize = (size) => {
const validated = validatePageSize(size);
pageSize.value = validated;
currentPage.value = DEFAULT_INITIAL_PAGE;
};
return {
filtered,
isFiltering,
pagination,
currentPage,
pageSize,
nextPage,
previousPage,
goToPage,
setPageSize,
};
}