#7136 - Enable paginate event in VnSelectFilter #255

Closed
jsegarra wants to merge 86 commits from 7136_vnselectFilter_paginate into dev
2 changed files with 51 additions and 11 deletions
Showing only changes of commit 83f5351774 - Show all commits

View File

@ -78,6 +78,7 @@ const requiredFieldRule = (val) => val ?? t('globals.fieldRequired');
const { optionLabel, optionValue, optionFilter, options, modelValue } = toRefs($props);
const myOptions = ref([]);
const myOptionsFiltered = ref([]);
const myOptionsOriginal = ref([]);
const vnSelectRef = ref();
const dataRef = ref();
@ -91,7 +92,7 @@ const value = computed({
},
});
Outdated
Review

'' es false
$props.url ? $props.url : $attrs.label

'' es false `$props.url ? $props.url : $attrs.label`
function setOptions(data, append = false) {
function setOptions(data, append = true) {
// if (isLoading.value) {
// data.unshift(...myOptions.value);
// }
jsegarra marked this conversation as resolved Outdated
Outdated
Review

Si lo estas definiendo no puede ser null no?

Si lo estas definiendo no puede ser null no?
@ -102,7 +103,7 @@ function setOptions(data, append = false) {
// // myOptionsOriginal.value = JSON.parse(JSON.stringify(data));
// } else {
myOptions.value = JSON.parse(JSON.stringify(data));
myOptionsOriginal.value = JSON.parse(JSON.stringify(data));
if (append) myOptionsOriginal.value = JSON.parse(JSON.stringify(data));
jsegarra marked this conversation as resolved Outdated
Outdated
Review

De primeras diria que esta linea no hace falta, dado que la primera ja lo hace

De primeras diria que esta linea no hace falta, dado que la primera ja lo hace

Pero quiero evitar que haga fetch
Un caso de uso sería: se lo declaro en el componente o una variable

Pero quiero evitar que haga fetch Un caso de uso sería: se lo declaro en el componente o una variable
Outdated
Review

updateRouter: false sino podrá cosas en la url

`updateRouter: false` sino podrá cosas en la url
// }
Outdated
Review

Esta parte solo debe hacerla si hay url. Y por como esta ahora ya habria hecho la peticion al entrar en if (useURL.value)

Esta parte solo debe hacerla si hay url. Y por como esta ahora ya habria hecho la peticion al entrar en `if (useURL.value)`

Lo cambio para dejarlo asi
if (!$props.options) fetchFilter($props.modelValue);

Lo cambio para dejarlo asi if (!$props.options) fetchFilter($props.modelValue);
}
const useURL = computed(() => $props.url?.length > 0);
@ -117,11 +118,13 @@ const arrayData = useURL.value
: ref(null);
onMounted(async () => {
setOptions(options.value);
if ($props.url && $props.modelValue) fetchFilter($props.modelValue);
else {
if (useURL.value) {
const { data } = await arrayData.fetch({ append: true });
setOptions(data);
return;
}
if ($props.options) setOptions($props.options);
else fetchFilter($props.modelValue);
});
Outdated
Review

El useLike no me lo quites pls

El useLike no me lo quites pls

hecho

hecho
watch(modelValue, (newValue) => {
@ -136,7 +139,7 @@ function filter(val, options) {
if (!search) return options;
return options.filter((row) => {
const optionsFiltered = options.filter((row) => {
if ($props.filterOptions.length) {
return $props.filterOptions.some((prop) => {
const propValue = String(row[prop]).toLowerCase();
@ -149,23 +152,42 @@ function filter(val, options) {
return id == search || optionLabel.includes(search);
});
return optionsFiltered;
}
async function fetchFilter(val) {
if (!$props.url || !dataRef.value) return;
function buildwhere(val) {
if (!useURL.value || !dataRef.value) return;
const { fields, sortBy, limit } = $props;
let key = optionLabel.value;
if (new RegExp(/\d/g).test(val)) key = optionFilter.value ?? optionValue.value;
const where = { ...{ [key]: { like: `%${val}%` } }, ...$props.where };
return where;
}
async function fetchFilter(val) {
const { fields, sortBy, limit } = $props;
const where = buildwhere(val);
return dataRef.value.fetch({ fields, where, order: sortBy, limit });
jsegarra marked this conversation as resolved Outdated
Outdated
Review

Quitar

Quitar
}
async function filterHandler(val, update) {
if (!$props.defaultFilter) return update();
const newOptions = filter(val, myOptionsOriginal.value);
let newOptions = [];
if (myOptionsFiltered.value.length > 0) {
newOptions = filter(val, myOptionsFiltered.value);
myOptionsFiltered.value = [];
} else newOptions = filter(val, myOptionsOriginal.value);
if (useURL.value && myOptions.value.length < 1) {
// arrayData.store.filter.where = { [optionLabel.value]: val };
arrayData.store.filter.where = { [optionFilter.value]: val };
// arrayData.store.filter.where = buildwhere(val);
const { data } = await arrayData.fetch({ append: false });
newOptions = data;
myOptionsFiltered.value = data;
// setOptions(data, false);
}
update(
() => {
myOptions.value = newOptions;
@ -184,7 +206,7 @@ async function onScroll(scrollEv) {
const lastIndex = myOptions.value.length - 1;
if (from === 0 && index === 0) return;
if (!$props.url && !$props.fetchRef) return;
if (!useURL.value && !$props.fetchRef) return;
if (direction === 'decrease') return;
if (to === lastIndex && arrayData.store.hasMoreData && !isLoading.value) {
isLoading.value = true;
@ -198,7 +220,7 @@ async function onScroll(scrollEv) {
<template>
<FetchData
v-if="$props.url"
v-if="useURL"
ref="dataRef"
:url="$props.url"
@on-fetch="(data) => setOptions(data)"

View File

@ -40,6 +40,23 @@ const filterOptions = {
};
</script>
<template>
<FetchData
url="ContactChannels"
@on-fetch="(data) => (contactChannels = data)"
auto-load
/>
<FetchData
url="BusinessTypes"
@on-fetch="(data) => (businessTypes = data)"
auto-load
/>
<FetchData
:filter="filter"
@on-fetch="(data) => (clients = data)"
auto-load
url="Clients"
/>
<FormModel :url="`Clients/${route.params.id}`" auto-load model="customer">
<template #form="{ data, validate, filter }">
<VnRow class="row q-gutter-md q-mb-md">
@ -113,6 +130,7 @@ const filterOptions = {
map-options
option-label="name"
option-value="id"
option-filter="firstName"
use-input
v-model="data.salesPersonFk"
>