0
0
Fork 0

Merge pull request '#7677 - Improve VnLocation' (!563) from 7677_vnLocation_perf into dev

Reviewed-on: verdnatura/salix-front#563
Reviewed-by: Alex Moreno <alexm@verdnatura.es>
This commit is contained in:
Javier Segarra 2024-09-17 08:29:23 +00:00
commit 907e6dbf4f
13 changed files with 111 additions and 36 deletions

View File

@ -2,21 +2,37 @@
import CreateNewPostcode from 'src/components/CreateNewPostcodeForm.vue'; import CreateNewPostcode from 'src/components/CreateNewPostcodeForm.vue';
import VnSelectDialog from 'components/common/VnSelectDialog.vue'; import VnSelectDialog from 'components/common/VnSelectDialog.vue';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import { ref } from 'vue';
const { t } = useI18n(); const { t } = useI18n();
const value = defineModel({ type: [String, Number, Object] }); const emit = defineEmits(['update:model-value', 'update:options']);
const props = defineProps({
location: {
type: Object,
default: null,
},
});
const modelValue = ref(
props.location
? `${props.location?.postcode} - ${props.location?.city}(${props.location?.province?.name}), ${props.location?.country?.name}`
: null
);
function showLabel(data) { function showLabel(data) {
return `${data.code} - ${data.town}(${data.province}), ${data.country}`; return `${data.code} - ${data.town}(${data.province}), ${data.country}`;
} }
const handleModelValue = (data) => {
emit('update:model-value', data);
};
</script> </script>
<template> <template>
<VnSelectDialog <VnSelectDialog
v-model="value" v-model="modelValue"
option-value="code"
option-filter-value="search" option-filter-value="search"
:option-label="(opt) => showLabel(opt)" :option-label="
(opt) => (typeof modelValue === 'string' ? modelValue : showLabel(opt))
"
url="Postcodes/filter" url="Postcodes/filter"
@update:model-value="handleModelValue"
:use-like="false" :use-like="false"
:label="t('Location')" :label="t('Location')"
:placeholder="t('search_by_postalcode')" :placeholder="t('search_by_postalcode')"
@ -27,7 +43,14 @@ function showLabel(data) {
:emit-value="false" :emit-value="false"
> >
<template #form> <template #form>
<CreateNewPostcode @on-data-saved="(newValue) => (value = newValue)" /> <CreateNewPostcode
@on-data-saved="
(newValue) => {
modelValue = newValue;
emit('update:model-value', newValue);
}
"
/>
</template> </template>
<template #option="{ itemProps, opt }"> <template #option="{ itemProps, opt }">
<QItem v-bind="itemProps"> <QItem v-bind="itemProps">

View File

@ -105,6 +105,7 @@ globals:
weight: Weight weight: Weight
pageTitles: pageTitles:
logIn: Login logIn: Login
addressEdit: Update address
summary: Summary summary: Summary
basicData: Basic data basicData: Basic data
log: Logs log: Logs

View File

@ -107,6 +107,7 @@ globals:
weight: Peso weight: Peso
pageTitles: pageTitles:
logIn: Inicio de sesión logIn: Inicio de sesión
addressEdit: Modificar consignatario
summary: Resumen summary: Resumen
basicData: Datos básicos basicData: Datos básicos
log: Historial log: Historial

View File

@ -5,15 +5,12 @@ import { useRoute, useRouter } from 'vue-router';
import axios from 'axios'; import axios from 'axios';
import FetchData from 'components/FetchData.vue';
const { t } = useI18n(); const { t } = useI18n();
const route = useRoute(); const route = useRoute();
const router = useRouter(); const router = useRouter();
const addresses = ref([]); const addresses = ref([]);
const client = ref(null); const client = ref(null);
const provincesLocation = ref([]);
const addressFilter = { const addressFilter = {
fields: [ fields: [
@ -41,7 +38,13 @@ const addressFilter = {
{ {
relation: 'province', relation: 'province',
scope: { scope: {
fields: ['id', 'name'], fields: ['id', 'name', 'countryFk'],
include: [
{
relation: 'country',
scope: { fields: ['id', 'name'] },
},
],
}, },
}, },
], ],
@ -83,13 +86,6 @@ const getClientData = async (id) => {
} }
}; };
const setProvince = (provinceFk) => {
const result = provincesLocation.value.filter(
(province) => province.id === provinceFk
);
return result[0]?.name || '';
};
const isDefaultAddress = (address) => { const isDefaultAddress = (address) => {
return client?.value?.defaultAddressFk === address.id ? 1 : 0; return client?.value?.defaultAddressFk === address.id ? 1 : 0;
}; };
@ -128,12 +124,6 @@ const toCustomerAddressEdit = (addressId) => {
</script> </script>
<template> <template>
<FetchData
@on-fetch="(data) => (provincesLocation = data)"
auto-load
url="Provinces/location"
/>
<div class="full-width flex justify-center"> <div class="full-width flex justify-center">
<QCard class="card-width q-pa-lg" v-if="addresses.length"> <QCard class="card-width q-pa-lg" v-if="addresses.length">
<QCardSection> <QCardSection>
@ -177,7 +167,7 @@ const toCustomerAddressEdit = (addressId) => {
<div>{{ item.street }}</div> <div>{{ item.street }}</div>
<div> <div>
{{ item.postalCode }} - {{ item.city }}, {{ item.postalCode }} - {{ item.city }},
{{ setProvince(item.provinceFk) }} {{ item.province.name }}
</div> </div>
<div> <div>
{{ item.phone }} {{ item.phone }}

View File

@ -94,7 +94,7 @@ function handleLocation(data, location) {
<VnLocation <VnLocation
:rules="validate('Worker.postcode')" :rules="validate('Worker.postcode')"
:acls="[{ model: 'Town', props: '*', accessType: 'WRITE' }]" :acls="[{ model: 'Town', props: '*', accessType: 'WRITE' }]"
v-model="data.postcode" :location="data"
@update:model-value="(location) => handleLocation(data, location)" @update:model-value="(location) => handleLocation(data, location)"
/> />
</VnRow> </VnRow>

View File

@ -177,7 +177,12 @@ function handleLocation(data, location) {
<VnLocation <VnLocation
:rules="validate('Worker.postcode')" :rules="validate('Worker.postcode')"
:acls="[{ model: 'Town', props: '*', accessType: 'WRITE' }]" :acls="[{ model: 'Town', props: '*', accessType: 'WRITE' }]"
v-model="data.postalCode" :location="{
postcode: data.postalCode,
city: data.city,
province: data.province,
country: data.province.country,
}"
@update:model-value="(location) => handleLocation(data, location)" @update:model-value="(location) => handleLocation(data, location)"
></VnLocation> ></VnLocation>
</div> </div>

View File

@ -26,7 +26,13 @@ const addressesFilter = {
{ {
relation: 'province', relation: 'province',
scope: { scope: {
fields: ['id', 'name'], fields: ['id', 'name', 'countryFk'],
include: [
{
relation: 'country',
scope: { fields: ['id', 'name'] },
},
],
}, },
}, },
], ],

View File

@ -21,6 +21,7 @@ const newAddressForm = reactive({
provinceFk: null, provinceFk: null,
phone: null, phone: null,
mobile: null, mobile: null,
province: null,
}); });
const onDataSaved = () => { const onDataSaved = () => {
@ -84,7 +85,16 @@ function handleLocation(data, location) {
<VnLocation <VnLocation
:rules="validate('Worker.postcode')" :rules="validate('Worker.postcode')"
:acls="[{ model: 'Town', props: '*', accessType: 'WRITE' }]" :acls="[{ model: 'Town', props: '*', accessType: 'WRITE' }]"
v-model="data.location" :location="
data.postalCode
? {
postcode: data.postalCode,
city: data.city,
province: data.province,
country: data.province.country,
}
: null
"
@update:model-value="(location) => handleLocation(data, location)" @update:model-value="(location) => handleLocation(data, location)"
> >
</VnLocation> </VnLocation>

View File

@ -19,8 +19,8 @@ const sageTransactionTypesOptions = ref([]);
const supplierActivitiesOptions = ref([]); const supplierActivitiesOptions = ref([]);
function handleLocation(data, location) { function handleLocation(data, location) {
const { town, code, provinceFk, countryFk } = location ?? {}; const { town, label, provinceFk, countryFk } = location ?? {};
data.postCode = code; data.postCode = label;
data.city = town; data.city = town;
data.provinceFk = provinceFk; data.provinceFk = provinceFk;
data.countryFk = countryFk; data.countryFk = countryFk;
@ -51,6 +51,23 @@ function handleLocation(data, location) {
:url="`Suppliers/${route.params.id}`" :url="`Suppliers/${route.params.id}`"
:url-update="`Suppliers/${route.params.id}/updateFiscalData`" :url-update="`Suppliers/${route.params.id}/updateFiscalData`"
model="supplier" model="supplier"
:filter="{
fields: ['id', 'name', 'city', 'postCode', 'countryFk', 'provinceFk'],
include: [
{
relation: 'province',
scope: {
fields: ['id', 'name'],
},
},
{
relation: 'country',
scope: {
fields: ['id', 'name'],
},
},
],
}"
auto-load auto-load
:clear-store-on-unmount="false" :clear-store-on-unmount="false"
> >
@ -130,7 +147,12 @@ function handleLocation(data, location) {
<VnLocation <VnLocation
:rules="validate('Worker.postcode')" :rules="validate('Worker.postcode')"
:acls="[{ model: 'Town', props: '*', accessType: 'WRITE' }]" :acls="[{ model: 'Town', props: '*', accessType: 'WRITE' }]"
v-model="data.postCode" :location="{
postcode: data.postCode,
city: data.city,
province: data.province,
country: data.country,
}"
@update:model-value="(location) => handleLocation(data, location)" @update:model-value="(location) => handleLocation(data, location)"
> >
</VnLocation> </VnLocation>

View File

@ -194,7 +194,6 @@ async function autofillBic(worker) {
<VnLocation <VnLocation
:rules="validate('Worker.postcode')" :rules="validate('Worker.postcode')"
:roles-allowed-to-create="['deliveryAssistant']" :roles-allowed-to-create="['deliveryAssistant']"
v-model="data.location"
@update:model-value="(location) => handleLocation(data, location)" @update:model-value="(location) => handleLocation(data, location)"
:disable="formData.isFreelance" :disable="formData.isFreelance"
> >

View File

@ -264,7 +264,6 @@ async function autofillBic(worker) {
<VnLocation <VnLocation
:acls="[{ model: 'Town', props: '*', accessType: 'WRITE' }]" :acls="[{ model: 'Town', props: '*', accessType: 'WRITE' }]"
:options="postcodesOptions" :options="postcodesOptions"
v-model="data.location"
@update:model-value="(location) => handleLocation(data, location)" @update:model-value="(location) => handleLocation(data, location)"
:disable="data.isFreelance" :disable="data.isFreelance"
> >

View File

@ -175,7 +175,7 @@ export default {
path: 'edit', path: 'edit',
name: 'CustomerAddressEdit', name: 'CustomerAddressEdit',
meta: { meta: {
title: 'address-edit', title: 'addressEdit',
}, },
component: () => component: () =>
import( import(

View File

@ -18,7 +18,7 @@ describe('VnLocation', () => {
cy.get(inputLocation).click(); cy.get(inputLocation).click();
cy.get(inputLocation).clear(); cy.get(inputLocation).clear();
cy.get(inputLocation).type('al'); cy.get(inputLocation).type('al');
cy.get(locationOptions).should('have.length.at.least', 3); cy.get(locationOptions).should('have.length.at.least', 4);
}); });
it('input filter location as "ecuador"', function () { it('input filter location as "ecuador"', function () {
cy.get(inputLocation).click(); cy.get(inputLocation).click();
@ -33,11 +33,29 @@ describe('VnLocation', () => {
cy.login('developer'); cy.login('developer');
cy.visit('/#/supplier/567/fiscal-data', { timeout: 7000 }); cy.visit('/#/supplier/567/fiscal-data', { timeout: 7000 });
cy.waitForElement('.q-form'); cy.waitForElement('.q-form');
cy.get(createLocationButton).click();
}); });
it('Fin by postalCode', () => {
const postCode = '46600';
const firstOption = '[role="listbox"] .q-item:nth-child(1)';
cy.get(inputLocation).click();
cy.get(inputLocation).clear();
cy.get(inputLocation).type(postCode);
cy.get(locationOptions).should('have.length.at.least', 2);
cy.get(firstOption).click();
cy.get('.q-btn-group > .q-btn--standard > .q-btn__content > .q-icon').click();
cy.reload();
cy.waitForElement('.q-form');
cy.get(inputLocation).should(
'have.value',
'46600 - Valencia(Province one), España'
);
});
it('Create postCode', () => { it('Create postCode', () => {
const postCode = '1234475'; const postCode = '1234475';
const province = 'Valencia'; const province = 'Valencia';
cy.get(createLocationButton).click();
cy.get('.q-card > h1').should('have.text', 'New postcode'); cy.get('.q-card > h1').should('have.text', 'New postcode');
cy.get(dialogInputs).eq(0).clear(); cy.get(dialogInputs).eq(0).clear();
cy.get(dialogInputs).eq(0).type(postCode); cy.get(dialogInputs).eq(0).type(postCode);
@ -54,6 +72,7 @@ describe('VnLocation', () => {
it('Create city', () => { it('Create city', () => {
const postCode = '9011'; const postCode = '9011';
const province = 'Saskatchew'; const province = 'Saskatchew';
cy.get(createLocationButton).click();
cy.get(dialogInputs).eq(0).type(postCode); cy.get(dialogInputs).eq(0).type(postCode);
// city create button // city create button
cy.get( cy.get(