0
0
Fork 0

feat: improve VnSelectCache add find by Object

This commit is contained in:
Alex Moreno 2024-07-18 13:54:22 +02:00
parent 5833b4d856
commit f8026dd3f6
5 changed files with 49 additions and 25 deletions

View File

@ -48,6 +48,17 @@ const forceAttrs = {
label: $props.showTitle ? '' : $props.column.label, label: $props.showTitle ? '' : $props.column.label,
}; };
const selectComponent = {
component: markRaw(VnSelect),
event: updateEvent,
attrs: {
class: 'q-px-sm q-pb-xs q-pt-none fit',
dense: true,
filled: !$props.showTitle,
},
forceAttrs,
};
const components = { const components = {
input: { input: {
component: markRaw(VnInput), component: markRaw(VnInput),
@ -97,16 +108,8 @@ const components = {
}, },
forceAttrs, forceAttrs,
}, },
select: { select: selectComponent,
component: markRaw(VnSelect), rawSelect: selectComponent,
event: updateEvent,
attrs: {
class: 'q-px-sm q-pb-xs q-pt-none fit',
dense: true,
filled: !$props.showTitle,
},
forceAttrs,
},
}; };
async function addFilter(value) { async function addFilter(value) {

View File

@ -125,7 +125,8 @@ function filter(val, options) {
}); });
} }
const id = row.id; if (!row) return;
const id = row[$props.optionValue];
const optionLabel = String(row[$props.optionLabel]).toLowerCase(); const optionLabel = String(row[$props.optionLabel]).toLowerCase();
return id == search || optionLabel.includes(search); return id == search || optionLabel.includes(search);

View File

@ -8,18 +8,31 @@ const $props = defineProps({
default: null, default: null,
}, },
find: { find: {
type: String, type: [String, Object],
default: null, default: null,
}, },
}); });
const options = ref([]); const options = ref([]);
onBeforeMount(async () => { onBeforeMount(async () => {
const { url } = useAttrs(); const { url, optionValue, optionLabel } = useAttrs();
const findBy = $props.find ?? url?.charAt(0)?.toLocaleLowerCase() + url?.slice(1, -1); const findBy = $props.find ?? url?.charAt(0)?.toLocaleLowerCase() + url?.slice(1, -1);
if (findBy) options.value = [$props.row[findBy]]; if (!findBy || !$props.row) return;
// is object
if (typeof findBy == 'object') {
const { value, label } = findBy;
if (!$props.row[value] || !$props.row[label]) return;
return (options.value = [
{
[optionValue ?? 'id']: $props.row[value],
[optionLabel ?? 'name']: $props.row[label],
},
]);
}
// is string
if ($props.row[findBy]) options.value = [$props.row[findBy]];
}); });
</script> </script>
<template> <template>
<VnSelect v-bind="$attrs" :options="$attrs.options ?? options" /> <VnSelect v-bind="$attrs" :options="$attrs.options ?? options" />
</template> </template>

View File

@ -72,10 +72,7 @@ const columns = computed(() => [
label: t('globals.warehouse'), label: t('globals.warehouse'),
component: 'select', component: 'select',
attrs: { attrs: {
url: 'warehouses', options: warehouses.value,
fields: ['id', 'name'],
optionLabel: 'name',
optionValue: 'id',
}, },
}, },
{ {

View File

@ -57,9 +57,13 @@ const columns = computed(() => [
component: 'select', component: 'select',
attrs: { attrs: {
url: 'Workers/activeWithInheritedRole', url: 'Workers/activeWithInheritedRole',
fields: ['id', 'nickname'], fields: ['id', 'name'],
optionValue: 'id', useLike: false,
optionLabel: 'nickname', optionFilter: 'firstName',
find: {
value: 'workerFk',
label: 'workerUserName',
},
}, },
useLike: false, useLike: false,
cardVisible: true, cardVisible: true,
@ -76,8 +80,10 @@ const columns = computed(() => [
attrs: { attrs: {
url: 'agencyModes', url: 'agencyModes',
fields: ['id', 'name'], fields: ['id', 'name'],
optionLabel: 'name', find: {
optionValue: 'id', value: 'agencyModeFk',
label: 'agencyName',
},
}, },
}, },
{ {
@ -91,7 +97,10 @@ const columns = computed(() => [
url: 'vehicles', url: 'vehicles',
fields: ['id', 'numberPlate'], fields: ['id', 'numberPlate'],
optionLabel: 'numberPlate', optionLabel: 'numberPlate',
optionValue: 'id', find: {
value: 'vehicleFk',
label: 'vehiclePlateNumber',
},
}, },
}, },
{ {
@ -248,6 +257,7 @@ const openTicketsDialog = (id) => {
:is-editable="true" :is-editable="true"
:filter="routeFilter" :filter="routeFilter"
redirect="route" redirect="route"
:row-click="false"
:create="{ :create="{
urlCreate: 'Routes', urlCreate: 'Routes',
title: t('Create route'), title: t('Create route'),