From 0e55f7abdc863b00967028a45262c5568cb49bb8 Mon Sep 17 00:00:00 2001 From: wbuezas <wbuezas@verdnatura.es> Date: Mon, 25 Nov 2024 09:18:11 -0300 Subject: [PATCH 01/40] test: order catalog tests --- src/components/ui/VnFilterPanel.vue | 1 + .../Order/Card/CatalogFilterValueDialog.vue | 4 +- src/pages/Order/Card/OrderCatalog.vue | 4 +- src/pages/Order/Card/OrderCatalogFilter.vue | 5 + .../claim/Order/catalogTests.spec.js | 122 ++++++++++++++++++ test/cypress/support/commands.js | 4 + 6 files changed, 138 insertions(+), 2 deletions(-) create mode 100644 test/cypress/integration/claim/Order/catalogTests.spec.js diff --git a/src/components/ui/VnFilterPanel.vue b/src/components/ui/VnFilterPanel.vue index b9aa5e114..eca4e0995 100644 --- a/src/components/ui/VnFilterPanel.vue +++ b/src/components/ui/VnFilterPanel.vue @@ -249,6 +249,7 @@ function sanitizer(params) { :key="chip.label" :removable="!unremovableParams?.includes(chip.label)" @remove="remove(chip.label)" + data-cy="vnFilterPanelChip" > <slot name="tags" :tag="chip" :format-fn="formatValue"> <div class="q-gutter-x-xs"> diff --git a/src/pages/Order/Card/CatalogFilterValueDialog.vue b/src/pages/Order/Card/CatalogFilterValueDialog.vue index 9593e08c4..5855f91f4 100644 --- a/src/pages/Order/Card/CatalogFilterValueDialog.vue +++ b/src/pages/Order/Card/CatalogFilterValueDialog.vue @@ -50,7 +50,7 @@ const getSelectedTagValues = async (tag) => { <template> <QForm @submit="applyTags()" class="all-pointer-events"> - <QCard class="q-pa-sm column q-pa-lg"> + <QCard class="q-pa-sm column q-pa-lg" data-cy="catalogFilterValueDialog"> <VnSelect :label="t('params.tag')" v-model="selectedTag" @@ -64,6 +64,7 @@ const getSelectedTagValues = async (tag) => { :emit-value="false" use-input @update:model-value="getSelectedTagValues" + data-cy="catalogFilterValueDialogTagSelect" /> <div v-for="(value, index) in tagValues" @@ -94,6 +95,7 @@ const getSelectedTagValues = async (tag) => { :disable="!value" is-outlined class="col" + data-cy="catalogFilterValueDialogValueInput" /> <QBtn icon="delete" diff --git a/src/pages/Order/Card/OrderCatalog.vue b/src/pages/Order/Card/OrderCatalog.vue index 90bce38fd..f3e70cd6f 100644 --- a/src/pages/Order/Card/OrderCatalog.vue +++ b/src/pages/Order/Card/OrderCatalog.vue @@ -98,7 +98,7 @@ watch( /> </QScrollArea> </QDrawer> - <QPage class="column items-center q-pa-md"> + <QPage class="column items-center q-pa-md" data-cy="orderCatalogPage"> <div class="full-width"> <VnPaginate :data-key="dataKey" @@ -106,6 +106,7 @@ watch( :limit="50" :user-params="catalogParams" :auto-load="autoLoad" + data-cy="orderCatalogPage" > <template #body="{ rows }"> <div class="catalog-list"> @@ -118,6 +119,7 @@ watch( :item="row" is-catalog class="fill-icon" + data-cy="orderCatalogItem" /> </div> </template> diff --git a/src/pages/Order/Card/OrderCatalogFilter.vue b/src/pages/Order/Card/OrderCatalogFilter.vue index 03c479ef4..079141606 100644 --- a/src/pages/Order/Card/OrderCatalogFilter.vue +++ b/src/pages/Order/Card/OrderCatalogFilter.vue @@ -179,6 +179,7 @@ function addOrder(value, field, params) { ? resetCategory(params, searchFn) : removeTagGroupParam(params, searchFn, valIndex) " + data-cy="catalogFilterCustomTag" > <strong v-if="customTag.label === 'categoryFk' && categoryList"> {{ @@ -212,6 +213,7 @@ function addOrder(value, field, params) { :name="category.icon" class="category-icon" @click="selectCategory(params, category, searchFn)" + data-cy="catalogFilterCategory" > <QTooltip> {{ t(category.name) }} @@ -235,6 +237,7 @@ function addOrder(value, field, params) { sort-by="name ASC" :disable="!params.categoryFk" @update:model-value="searchFn()" + data-cy="catalogFilterType" > <template #option="{ itemProps, opt }"> <QItem v-bind="itemProps"> @@ -286,6 +289,7 @@ function addOrder(value, field, params) { :is-clearable="false" v-model="searchByTag" @keyup.enter="(val) => onSearchByTag(val, params)" + data-cy="catalogFilterValueInput" > <template #prepend> <QIcon name="search" /> @@ -298,6 +302,7 @@ function addOrder(value, field, params) { color="primary" size="md" dense + data-cy="catalogFilterValueDialogBtn" /> <QPopupProxy> <CatalogFilterValueDialog diff --git a/test/cypress/integration/claim/Order/catalogTests.spec.js b/test/cypress/integration/claim/Order/catalogTests.spec.js new file mode 100644 index 000000000..da0e7869a --- /dev/null +++ b/test/cypress/integration/claim/Order/catalogTests.spec.js @@ -0,0 +1,122 @@ +/// <reference types="cypress" /> +describe('OrderCatalog', () => { + beforeEach(() => { + cy.login('developer'); + cy.viewport(1920, 720); + cy.visit('/#/order/8/catalog'); + }); + + const checkCustomFilterTag = (filterName = 'Plant') => { + cy.dataCy('catalogFilterCustomTag').should('exist'); + cy.dataCy('catalogFilterCustomTag').contains(filterName); + }; + + const checkFilterTag = (filterName = 'Plant') => { + cy.dataCy('vnFilterPanelChip').should('exist'); + cy.dataCy('vnFilterPanelChip').contains(filterName); + }; + + const selectCategory = (categoryIndex = 1, categoryName = 'Plant') => { + cy.get( + `div.q-page-container div:nth-of-type(${categoryIndex}) > [data-cy='catalogFilterCategory']` + ).should('exist'); + cy.get( + `div.q-page-container div:nth-of-type(${categoryIndex}) > [data-cy='catalogFilterCategory']` + ).click(); + checkCustomFilterTag(categoryName); + }; + + const searchByCustomTagInput = (option) => { + cy.dataCy('catalogFilterValueInput').find('input').last().focus(); + cy.dataCy('catalogFilterValueInput').find('input').last().type(option); + cy.dataCy('catalogFilterValueInput').find('input').last().type('{enter}'); + checkCustomFilterTag(option); + }; + + const selectTypeFilter = (option) => { + cy.selectOption( + 'div.q-page-container div.list > div:nth-of-type(2) div:nth-of-type(3)', + option + ); + checkFilterTag(option); + }; + + it('Shows empty state', () => { + // PASS; + cy.dataCy('orderCatalogPage').should('exist'); + cy.dataCy('orderCatalogPage').contains('No data to display'); + }); + + it('filter by category', () => { + // PASS; + selectCategory(); + cy.dataCy('orderCatalogItem').should('exist'); + }); + + it('filters by type', () => { + // PASS; + selectCategory(); + selectTypeFilter('Anthurium'); + }); + + it('filters by custom value select', () => { + // PASS + selectCategory(); + searchByCustomTagInput('Silver'); + }); + + it('filters by custom value dialog', () => { + // PASS + Cypress.on('uncaught:exception', (err) => { + if (err.message.includes('canceled')) { + return false; + } + }); + selectCategory(); + cy.dataCy('catalogFilterValueDialogBtn').should('exist'); + cy.dataCy('catalogFilterValueDialogBtn').last().click(); + cy.dataCy('catalogFilterValueDialogTagSelect').should('exist'); + cy.selectOption( + "[data-cy='catalogFilterValueDialog'] > label > div > div > div", + 'Tallos' + ); + cy.dataCy('catalogFilterValueDialogValueInput').find('input').focus(); + cy.dataCy('catalogFilterValueDialogValueInput').find('input').type('2'); + cy.dataCy('catalogFilterValueDialogValueInput').find('input').type('{enter}'); + checkCustomFilterTag('2'); + }); + + it('removes a secondary tag', () => { + // PASS + selectCategory(); + selectTypeFilter('Anthurium'); + cy.dataCy('vnFilterPanelChip').should('exist'); + cy.get( + "div.q-page-container [data-cy='vnFilterPanelChip'] > i.q-chip__icon--remove" + ) + .contains('cancel') + .should('exist'); + cy.get( + "div.q-page-container [data-cy='vnFilterPanelChip'] > i.q-chip__icon--remove" + ) + .contains('cancel') + .click(); + cy.dataCy('vnFilterPanelChip').should('not.exist'); + }); + + it('Removes category tag', () => { + // PASS + selectCategory(); + cy.get( + "div.q-page-container [data-cy='catalogFilterCustomTag'] > i.q-chip__icon--remove" + ) + .contains('cancel') + .should('exist'); + cy.get( + "div.q-page-container [data-cy='catalogFilterCustomTag'] > i.q-chip__icon--remove" + ) + .contains('cancel') + .click(); + cy.dataCy('catalogFilterCustomTag').should('not.exist'); + }); +}); diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js index 8d48dc71a..86436dcce 100755 --- a/test/cypress/support/commands.js +++ b/test/cypress/support/commands.js @@ -262,3 +262,7 @@ Cypress.Commands.add('openUserPanel', () => { '.column > .q-avatar > .q-avatar__content > .q-img > .q-img__container > .q-img__image' ).click(); }); + +Cypress.Commands.add('dataCy', (dataTestId, attr = 'data-cy') => { + return cy.get(`[${attr}="${dataTestId}"]`); +}); From c0d427ecb91d1c8ad71c35e02c4b144372da15c5 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Mon, 25 Nov 2024 23:20:15 +0100 Subject: [PATCH 02/40] Revert "test: rename client by customer" This reverts commit 30a2da027b42f7bf4d2de5de2699b0b034675527. --- .../clientAddress.spec.js} | 0 .../clientBalance.spec.js} | 0 .../clientBasicData.spec.js} | 0 .../clientBillingData.spec.js} | 2 +- .../integration/client/clientCredits.spec.js | 13 +++++++++++++ .../clientFiscalData.spec.js} | 0 .../clientGreuges.spec.js} | 0 .../clientList.spec.js} | 0 .../clientNotes.spec.js} | 0 .../integration/client/clientRecoveries.spec.js | 13 +++++++++++++ .../clientSms.spec.js} | 0 .../clientWebAccess.spec.js} | 0 .../clientCreditContracts.spec.js} | 4 ++-- .../credit-management/clientCreditOpinion.spec.js | 13 +++++++++++++ .../client/others/clientConsumption.spec.js | 13 +++++++++++++ .../others/clientContacts.spec.js} | 0 .../client/others/clientMandates.spec.js | 13 +++++++++++++ .../integration/client/others/clientSamples.spec.js | 13 +++++++++++++ .../others/clientUnpaid.spec.js} | 0 .../client/others/clientWebPayments.spec.js | 13 +++++++++++++ test/cypress/support/commands.js | 3 +-- 21 files changed, 95 insertions(+), 5 deletions(-) rename test/cypress/integration/{customer/customerAddress.spec.js => client/clientAddress.spec.js} (100%) rename test/cypress/integration/{customer/customerBalance.spec.js => client/clientBalance.spec.js} (100%) rename test/cypress/integration/{customer/customerBasicData.spec.js => client/clientBasicData.spec.js} (100%) rename test/cypress/integration/{customer/customerBillingData.spec.js => client/clientBillingData.spec.js} (86%) create mode 100644 test/cypress/integration/client/clientCredits.spec.js rename test/cypress/integration/{customer/customerFiscalData.spec.js => client/clientFiscalData.spec.js} (100%) rename test/cypress/integration/{customer/customerGreuges.spec.js => client/clientGreuges.spec.js} (100%) rename test/cypress/integration/{customer/customerList.spec.js => client/clientList.spec.js} (100%) rename test/cypress/integration/{customer/customerNotes.spec.js => client/clientNotes.spec.js} (100%) create mode 100644 test/cypress/integration/client/clientRecoveries.spec.js rename test/cypress/integration/{customer/customerSms.spec.js => client/clientSms.spec.js} (100%) rename test/cypress/integration/{customer/customerWebAccess.spec.js => client/clientWebAccess.spec.js} (100%) rename test/cypress/integration/{customer/credit-management/customerCreditContracts.spec.js => client/credit-management/clientCreditContracts.spec.js} (75%) create mode 100644 test/cypress/integration/client/credit-management/clientCreditOpinion.spec.js create mode 100644 test/cypress/integration/client/others/clientConsumption.spec.js rename test/cypress/integration/{customer/others/customerContacts.spec.js => client/others/clientContacts.spec.js} (100%) create mode 100644 test/cypress/integration/client/others/clientMandates.spec.js create mode 100644 test/cypress/integration/client/others/clientSamples.spec.js rename test/cypress/integration/{customer/others/customerUnpaid.spec.js => client/others/clientUnpaid.spec.js} (100%) create mode 100644 test/cypress/integration/client/others/clientWebPayments.spec.js diff --git a/test/cypress/integration/customer/customerAddress.spec.js b/test/cypress/integration/client/clientAddress.spec.js similarity index 100% rename from test/cypress/integration/customer/customerAddress.spec.js rename to test/cypress/integration/client/clientAddress.spec.js diff --git a/test/cypress/integration/customer/customerBalance.spec.js b/test/cypress/integration/client/clientBalance.spec.js similarity index 100% rename from test/cypress/integration/customer/customerBalance.spec.js rename to test/cypress/integration/client/clientBalance.spec.js diff --git a/test/cypress/integration/customer/customerBasicData.spec.js b/test/cypress/integration/client/clientBasicData.spec.js similarity index 100% rename from test/cypress/integration/customer/customerBasicData.spec.js rename to test/cypress/integration/client/clientBasicData.spec.js diff --git a/test/cypress/integration/customer/customerBillingData.spec.js b/test/cypress/integration/client/clientBillingData.spec.js similarity index 86% rename from test/cypress/integration/customer/customerBillingData.spec.js rename to test/cypress/integration/client/clientBillingData.spec.js index 00af82e39..16e8fc0fc 100644 --- a/test/cypress/integration/customer/customerBillingData.spec.js +++ b/test/cypress/integration/client/clientBillingData.spec.js @@ -8,6 +8,6 @@ describe('Client billing data', () => { }); }); it('Should load layout', () => { - cy.get('.q-card').should('be.visible'); + cy.get('.q-page').should('be.visible'); }); }); diff --git a/test/cypress/integration/client/clientCredits.spec.js b/test/cypress/integration/client/clientCredits.spec.js new file mode 100644 index 000000000..5f303b40d --- /dev/null +++ b/test/cypress/integration/client/clientCredits.spec.js @@ -0,0 +1,13 @@ +/// <reference types="cypress" /> +describe('Client credits', () => { + beforeEach(() => { + cy.viewport(1280, 720); + cy.login('developer'); + cy.visit('#/customer/1110/credits', { + timeout: 5000, + }); + }); + it('Should load layout', () => { + cy.get('.q-page').should('be.visible'); + }); +}); diff --git a/test/cypress/integration/customer/customerFiscalData.spec.js b/test/cypress/integration/client/clientFiscalData.spec.js similarity index 100% rename from test/cypress/integration/customer/customerFiscalData.spec.js rename to test/cypress/integration/client/clientFiscalData.spec.js diff --git a/test/cypress/integration/customer/customerGreuges.spec.js b/test/cypress/integration/client/clientGreuges.spec.js similarity index 100% rename from test/cypress/integration/customer/customerGreuges.spec.js rename to test/cypress/integration/client/clientGreuges.spec.js diff --git a/test/cypress/integration/customer/customerList.spec.js b/test/cypress/integration/client/clientList.spec.js similarity index 100% rename from test/cypress/integration/customer/customerList.spec.js rename to test/cypress/integration/client/clientList.spec.js diff --git a/test/cypress/integration/customer/customerNotes.spec.js b/test/cypress/integration/client/clientNotes.spec.js similarity index 100% rename from test/cypress/integration/customer/customerNotes.spec.js rename to test/cypress/integration/client/clientNotes.spec.js diff --git a/test/cypress/integration/client/clientRecoveries.spec.js b/test/cypress/integration/client/clientRecoveries.spec.js new file mode 100644 index 000000000..ea6f14407 --- /dev/null +++ b/test/cypress/integration/client/clientRecoveries.spec.js @@ -0,0 +1,13 @@ +/// <reference types="cypress" /> +describe('Client recoveries', () => { + beforeEach(() => { + cy.viewport(1280, 720); + cy.login('developer'); + cy.visit('#/customer/1101/recoveries', { + timeout: 5000, + }); + }); + it('Should load layout', () => { + cy.get('.q-page').should('be.visible'); + }); +}); diff --git a/test/cypress/integration/customer/customerSms.spec.js b/test/cypress/integration/client/clientSms.spec.js similarity index 100% rename from test/cypress/integration/customer/customerSms.spec.js rename to test/cypress/integration/client/clientSms.spec.js diff --git a/test/cypress/integration/customer/customerWebAccess.spec.js b/test/cypress/integration/client/clientWebAccess.spec.js similarity index 100% rename from test/cypress/integration/customer/customerWebAccess.spec.js rename to test/cypress/integration/client/clientWebAccess.spec.js diff --git a/test/cypress/integration/customer/credit-management/customerCreditContracts.spec.js b/test/cypress/integration/client/credit-management/clientCreditContracts.spec.js similarity index 75% rename from test/cypress/integration/customer/credit-management/customerCreditContracts.spec.js rename to test/cypress/integration/client/credit-management/clientCreditContracts.spec.js index 3c35d5ed0..1c2f935fc 100644 --- a/test/cypress/integration/customer/credit-management/customerCreditContracts.spec.js +++ b/test/cypress/integration/client/credit-management/clientCreditContracts.spec.js @@ -1,5 +1,5 @@ /// <reference types="cypress" /> -describe('Client credit opinion', () => { +describe('Client credit contracts', () => { beforeEach(() => { cy.viewport(1280, 720); cy.login('developer'); @@ -8,6 +8,6 @@ describe('Client credit opinion', () => { }); }); it('Should load layout', () => { - cy.get('.q-card').should('be.visible'); + cy.get('.q-page').should('be.visible'); }); }); diff --git a/test/cypress/integration/client/credit-management/clientCreditOpinion.spec.js b/test/cypress/integration/client/credit-management/clientCreditOpinion.spec.js new file mode 100644 index 000000000..c32215f01 --- /dev/null +++ b/test/cypress/integration/client/credit-management/clientCreditOpinion.spec.js @@ -0,0 +1,13 @@ +/// <reference types="cypress" /> +describe('Client credit opinion', () => { + beforeEach(() => { + cy.viewport(1280, 720); + cy.login('developer'); + cy.visit('#/customer/1110/credit-management/credit-opinion', { + timeout: 5000, + }); + }); + it('Should load layout', () => { + cy.get('.q-page').should('be.visible'); + }); +}); diff --git a/test/cypress/integration/client/others/clientConsumption.spec.js b/test/cypress/integration/client/others/clientConsumption.spec.js new file mode 100644 index 000000000..bbc11998e --- /dev/null +++ b/test/cypress/integration/client/others/clientConsumption.spec.js @@ -0,0 +1,13 @@ +/// <reference types="cypress" /> +describe('Client consumption', () => { + beforeEach(() => { + cy.viewport(1280, 720); + cy.login('developer'); + cy.visit('#/customer/1101/others/consumption', { + timeout: 5000, + }); + }); + it('Should load layout', () => { + cy.get('.q-page').should('be.visible'); + }); +}); diff --git a/test/cypress/integration/customer/others/customerContacts.spec.js b/test/cypress/integration/client/others/clientContacts.spec.js similarity index 100% rename from test/cypress/integration/customer/others/customerContacts.spec.js rename to test/cypress/integration/client/others/clientContacts.spec.js diff --git a/test/cypress/integration/client/others/clientMandates.spec.js b/test/cypress/integration/client/others/clientMandates.spec.js new file mode 100644 index 000000000..055eda2d0 --- /dev/null +++ b/test/cypress/integration/client/others/clientMandates.spec.js @@ -0,0 +1,13 @@ +/// <reference types="cypress" /> +describe('Client mandates', () => { + beforeEach(() => { + cy.viewport(1280, 720); + cy.login('developer'); + cy.visit('#/customer/1110/others/mandates', { + timeout: 5000, + }); + }); + it('Should load layout', () => { + cy.get('.q-page').should('be.visible'); + }); +}); diff --git a/test/cypress/integration/client/others/clientSamples.spec.js b/test/cypress/integration/client/others/clientSamples.spec.js new file mode 100644 index 000000000..a50120402 --- /dev/null +++ b/test/cypress/integration/client/others/clientSamples.spec.js @@ -0,0 +1,13 @@ +/// <reference types="cypress" /> +describe('Client samples', () => { + beforeEach(() => { + cy.viewport(1280, 720); + cy.login('developer'); + cy.visit('#/customer/1101/others/samples', { + timeout: 5000, + }); + }); + it('Should load layout', () => { + cy.get('.q-page').should('be.visible'); + }); +}); diff --git a/test/cypress/integration/customer/others/customerUnpaid.spec.js b/test/cypress/integration/client/others/clientUnpaid.spec.js similarity index 100% rename from test/cypress/integration/customer/others/customerUnpaid.spec.js rename to test/cypress/integration/client/others/clientUnpaid.spec.js diff --git a/test/cypress/integration/client/others/clientWebPayments.spec.js b/test/cypress/integration/client/others/clientWebPayments.spec.js new file mode 100644 index 000000000..f35b12612 --- /dev/null +++ b/test/cypress/integration/client/others/clientWebPayments.spec.js @@ -0,0 +1,13 @@ +/// <reference types="cypress" /> +describe('Client web payments', () => { + beforeEach(() => { + cy.viewport(1280, 720); + cy.login('developer'); + cy.visit('#/customer/1101/others/web-payment', { + timeout: 5000, + }); + }); + it('Should load layout', () => { + cy.get('.q-page').should('be.visible'); + }); +}); diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js index 75b5eeec3..64c159f6d 100755 --- a/test/cypress/support/commands.js +++ b/test/cypress/support/commands.js @@ -254,9 +254,8 @@ Cypress.Commands.add('validateContent', (selector, expectedValue) => { }); Cypress.Commands.add('openActionsDescriptor', () => { - cy.get('[data-cy="descriptor-more-opts"]').click(); + cy.get('.header > :nth-child(3) > .q-btn__content > .q-icon').click(); }); - Cypress.Commands.add('clickButtonsDescriptor', (id) => { cy.get(`.actions > .q-card__actions> .q-btn:nth-child(${id})`) .invoke('removeAttr', 'target') From 6c6144864f8a545f97a282f2bf0fea79e5d3a171 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Mon, 25 Nov 2024 23:21:32 +0100 Subject: [PATCH 03/40] revert: remove customer test --- .../credit-management/customerCreditOpinion.spec.js | 13 ------------- .../integration/customer/customerCredits.spec.js | 13 ------------- .../integration/customer/customerRecoveries.spec.js | 13 ------------- .../customer/others/customerConsumption.spec.js | 13 ------------- .../customer/others/customerMandates.spec.js | 13 ------------- .../customer/others/customerSamples.spec.js | 13 ------------- .../customer/others/customerWebPayments.spec.js | 13 ------------- 7 files changed, 91 deletions(-) delete mode 100644 test/cypress/integration/customer/credit-management/customerCreditOpinion.spec.js delete mode 100644 test/cypress/integration/customer/customerCredits.spec.js delete mode 100644 test/cypress/integration/customer/customerRecoveries.spec.js delete mode 100644 test/cypress/integration/customer/others/customerConsumption.spec.js delete mode 100644 test/cypress/integration/customer/others/customerMandates.spec.js delete mode 100644 test/cypress/integration/customer/others/customerSamples.spec.js delete mode 100644 test/cypress/integration/customer/others/customerWebPayments.spec.js diff --git a/test/cypress/integration/customer/credit-management/customerCreditOpinion.spec.js b/test/cypress/integration/customer/credit-management/customerCreditOpinion.spec.js deleted file mode 100644 index c32215f01..000000000 --- a/test/cypress/integration/customer/credit-management/customerCreditOpinion.spec.js +++ /dev/null @@ -1,13 +0,0 @@ -/// <reference types="cypress" /> -describe('Client credit opinion', () => { - beforeEach(() => { - cy.viewport(1280, 720); - cy.login('developer'); - cy.visit('#/customer/1110/credit-management/credit-opinion', { - timeout: 5000, - }); - }); - it('Should load layout', () => { - cy.get('.q-page').should('be.visible'); - }); -}); diff --git a/test/cypress/integration/customer/customerCredits.spec.js b/test/cypress/integration/customer/customerCredits.spec.js deleted file mode 100644 index 5f303b40d..000000000 --- a/test/cypress/integration/customer/customerCredits.spec.js +++ /dev/null @@ -1,13 +0,0 @@ -/// <reference types="cypress" /> -describe('Client credits', () => { - beforeEach(() => { - cy.viewport(1280, 720); - cy.login('developer'); - cy.visit('#/customer/1110/credits', { - timeout: 5000, - }); - }); - it('Should load layout', () => { - cy.get('.q-page').should('be.visible'); - }); -}); diff --git a/test/cypress/integration/customer/customerRecoveries.spec.js b/test/cypress/integration/customer/customerRecoveries.spec.js deleted file mode 100644 index ea6f14407..000000000 --- a/test/cypress/integration/customer/customerRecoveries.spec.js +++ /dev/null @@ -1,13 +0,0 @@ -/// <reference types="cypress" /> -describe('Client recoveries', () => { - beforeEach(() => { - cy.viewport(1280, 720); - cy.login('developer'); - cy.visit('#/customer/1101/recoveries', { - timeout: 5000, - }); - }); - it('Should load layout', () => { - cy.get('.q-page').should('be.visible'); - }); -}); diff --git a/test/cypress/integration/customer/others/customerConsumption.spec.js b/test/cypress/integration/customer/others/customerConsumption.spec.js deleted file mode 100644 index bbc11998e..000000000 --- a/test/cypress/integration/customer/others/customerConsumption.spec.js +++ /dev/null @@ -1,13 +0,0 @@ -/// <reference types="cypress" /> -describe('Client consumption', () => { - beforeEach(() => { - cy.viewport(1280, 720); - cy.login('developer'); - cy.visit('#/customer/1101/others/consumption', { - timeout: 5000, - }); - }); - it('Should load layout', () => { - cy.get('.q-page').should('be.visible'); - }); -}); diff --git a/test/cypress/integration/customer/others/customerMandates.spec.js b/test/cypress/integration/customer/others/customerMandates.spec.js deleted file mode 100644 index 055eda2d0..000000000 --- a/test/cypress/integration/customer/others/customerMandates.spec.js +++ /dev/null @@ -1,13 +0,0 @@ -/// <reference types="cypress" /> -describe('Client mandates', () => { - beforeEach(() => { - cy.viewport(1280, 720); - cy.login('developer'); - cy.visit('#/customer/1110/others/mandates', { - timeout: 5000, - }); - }); - it('Should load layout', () => { - cy.get('.q-page').should('be.visible'); - }); -}); diff --git a/test/cypress/integration/customer/others/customerSamples.spec.js b/test/cypress/integration/customer/others/customerSamples.spec.js deleted file mode 100644 index a50120402..000000000 --- a/test/cypress/integration/customer/others/customerSamples.spec.js +++ /dev/null @@ -1,13 +0,0 @@ -/// <reference types="cypress" /> -describe('Client samples', () => { - beforeEach(() => { - cy.viewport(1280, 720); - cy.login('developer'); - cy.visit('#/customer/1101/others/samples', { - timeout: 5000, - }); - }); - it('Should load layout', () => { - cy.get('.q-page').should('be.visible'); - }); -}); diff --git a/test/cypress/integration/customer/others/customerWebPayments.spec.js b/test/cypress/integration/customer/others/customerWebPayments.spec.js deleted file mode 100644 index f35b12612..000000000 --- a/test/cypress/integration/customer/others/customerWebPayments.spec.js +++ /dev/null @@ -1,13 +0,0 @@ -/// <reference types="cypress" /> -describe('Client web payments', () => { - beforeEach(() => { - cy.viewport(1280, 720); - cy.login('developer'); - cy.visit('#/customer/1101/others/web-payment', { - timeout: 5000, - }); - }); - it('Should load layout', () => { - cy.get('.q-page').should('be.visible'); - }); -}); From 4e5754ccb5a5d87339116d61e8389d342633147f Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Mon, 25 Nov 2024 23:49:24 +0100 Subject: [PATCH 04/40] test: perf clientList descriptor action --- .../integration/client/clientList.spec.js | 19 +++++++++++++------ test/cypress/support/commands.js | 10 ++++++++++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/test/cypress/integration/client/clientList.spec.js b/test/cypress/integration/client/clientList.spec.js index 93e53b9f6..a528907e2 100644 --- a/test/cypress/integration/client/clientList.spec.js +++ b/test/cypress/integration/client/clientList.spec.js @@ -6,7 +6,11 @@ describe('Client list', () => { cy.visit('/#/customer/list', { timeout: 5000, onBeforeLoad(win) { - cy.stub(win, 'open'); + cy.stub(win, 'open') + .callsFake((url) => { + return win.open.wrappedMethod.call(win, url, '_self'); + }) + .as('Open'); }, }); }); @@ -47,17 +51,20 @@ describe('Client list', () => { it('Client founded create ticket', () => { const search = 'Jessica Jones'; cy.searchByLabel('Name', search); - cy.clickButtonsDescriptor(2); + cy.openActionDescriptor('Create ticket'); cy.waitForElement('#formModel'); - cy.waitForElement('.q-form'); - cy.checkValueForm(1, search); + cy.waitForElement('.q-form', { timeout: 5000 }); + + cy.get('.grid-create >:nth-child(1)').find('input').should('have.value', search); + cy.get('.grid-create >:nth-child(2)').find('input').should('have.value', search); }); it('Client founded create order', () => { const search = 'Jessica Jones'; cy.searchByLabel('Name', search); - cy.clickButtonsDescriptor(4); + cy.openActionDescriptor('New order'); cy.waitForElement('#formModel'); cy.waitForElement('.q-form'); - cy.checkValueForm(2, search); + cy.get('.grid-create >:nth-child(2)').find('input').should('have.value', search); + cy.get('.grid-create >:nth-child(4)').find('input').should('have.value', search); }); }); diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js index 64c159f6d..2350d1231 100755 --- a/test/cypress/support/commands.js +++ b/test/cypress/support/commands.js @@ -249,6 +249,7 @@ Cypress.Commands.add('writeSearchbar', (value) => { value ); }); + Cypress.Commands.add('validateContent', (selector, expectedValue) => { cy.get(selector).should('have.text', expectedValue); }); @@ -256,6 +257,14 @@ Cypress.Commands.add('validateContent', (selector, expectedValue) => { Cypress.Commands.add('openActionsDescriptor', () => { cy.get('.header > :nth-child(3) > .q-btn__content > .q-icon').click(); }); + +Cypress.Commands.add('openActionDescriptor', (opt) => { + cy.openActionsDescriptor(); + const listItem = '[role="menu"] .q-list .q-item'; + cy.contains(listItem, opt).click(); + 1; +}); + Cypress.Commands.add('clickButtonsDescriptor', (id) => { cy.get(`.actions > .q-card__actions> .q-btn:nth-child(${id})`) .invoke('removeAttr', 'target') @@ -267,6 +276,7 @@ Cypress.Commands.add('openUserPanel', () => { '.column > .q-avatar > .q-avatar__content > .q-img > .q-img__container > .q-img__image' ).click(); }); + Cypress.Commands.add('checkNotification', (text) => { cy.get('.q-notification') .should('be.visible') From e28d026ca99aafae1abe5d06ef3cd4a649b7426e Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Mon, 25 Nov 2024 23:53:14 +0100 Subject: [PATCH 05/40] test: perf clientList descriptor action --- test/cypress/integration/client/clientList.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cypress/integration/client/clientList.spec.js b/test/cypress/integration/client/clientList.spec.js index a528907e2..e2d323d65 100644 --- a/test/cypress/integration/client/clientList.spec.js +++ b/test/cypress/integration/client/clientList.spec.js @@ -32,7 +32,7 @@ describe('Client list', () => { cy.get('.q-mt-lg > .q-btn--standard').click(); - cy.checkNotification('created'); + cy.checkNotification('Data saved'); cy.url().should('include', '/summary'); }); it('Client list search client', () => { From c3510aea60dab2c4016bc87e01473c760715c9e9 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Tue, 26 Nov 2024 00:18:42 +0100 Subject: [PATCH 06/40] feat: add Options Style in AddressList from TicketCrete --- src/pages/Ticket/TicketList.vue | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/pages/Ticket/TicketList.vue b/src/pages/Ticket/TicketList.vue index aa666be98..a66a0b7f6 100644 --- a/src/pages/Ticket/TicketList.vue +++ b/src/pages/Ticket/TicketList.vue @@ -273,9 +273,8 @@ const fetchAddresses = async (formData) => { if (!formData.clientId) return; const filter = { - fields: ['nickname', 'street', 'city', 'id'], - where: { isActive: true }, - order: 'nickname ASC', + fields: ['nickname', 'street', 'city', 'id', 'isActive'], + order: ['isDefaultAddress DESC', 'isActive DESC', 'nickname ASC'], }; const params = { filter: JSON.stringify(filter) }; const { data } = await axios.get(`Clients/${formData.clientId}/addresses`, { @@ -643,7 +642,22 @@ function setReference(data) { @update:model-value="() => fetchAvailableAgencies(data)" > <template #option="scope"> - <QItem v-bind="scope.itemProps"> + <QItem + v-bind="scope.itemProps" + :class="{ disabled: !scope.opt.isActive }" + > + <QItemSection style="min-width: min-content" avatar> + <QIcon + v-if=" + scope.opt.isActive && + selectedClient?.defaultAddressFk === scope.opt.id + " + size="sm" + color="grey" + name="star" + class="fill-icon" + /> + </QItemSection> <QItemSection> <QItemLabel> {{ scope.opt.nickname }} From 63536ea0f5c7ce1f161a57d277708d6bae070a99 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Tue, 26 Nov 2024 12:17:33 +0100 Subject: [PATCH 07/40] feat: add Options style in AddressList from OrderCreate --- src/pages/Order/OrderList.vue | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/pages/Order/OrderList.vue b/src/pages/Order/OrderList.vue index 52d108595..fa182bc39 100644 --- a/src/pages/Order/OrderList.vue +++ b/src/pages/Order/OrderList.vue @@ -149,7 +149,12 @@ onMounted(() => { }); async function fetchClientAddress(id, formData = {}) { const { data } = await axios.get(`Clients/${id}`, { - params: { filter: { include: { relation: 'addresses' } } }, + params: { + filter: { + order: ['isDefaultAddress DESC', 'isActive DESC', 'nickname ASC'], + include: { relation: 'addresses' }, + }, + }, }); addressesList.value = data.addresses; formData.addressId = data.defaultAddressFk; @@ -191,7 +196,7 @@ const getDateColor = (date) => { urlCreate: 'Orders/new', title: t('module.cerateOrder'), onDataSaved: (url) => { - tableRef.redirect(`${url}/catalog`); + tableRef.redirect(`${url}/catalog`); }, formInitialData: { active: true, @@ -240,12 +245,28 @@ const getDateColor = (date) => { @update:model-value="() => fetchAgencies(data)" > <template #option="scope"> - <QItem v-bind="scope.itemProps"> + <QItem + v-bind="scope.itemProps" + :class="{ disabled: !scope.opt.isActive }" + > + <QItemSection style="min-width: min-content" avatar> + <QIcon + v-if=" + scope.opt.isActive && data.addressId === scope.opt.id + " + size="sm" + color="grey" + name="star" + class="fill-icon" + /> + </QItemSection> <QItemSection> <QItemLabel> - {{ scope.opt?.nickname }}: {{ scope.opt?.street }}, - {{ scope.opt?.city }}</QItemLabel - > + {{ scope.opt.nickname }} + </QItemLabel> + <QItemLabel caption> + {{ `${scope.opt.street}, ${scope.opt.city}` }} + </QItemLabel> </QItemSection> </QItem> </template> From ac1153b14ca9804aacfda202ee8a1f269a943b54 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Tue, 26 Nov 2024 12:26:18 +0100 Subject: [PATCH 08/40] feat: add Options style in AddressList from OrderCreate --- src/pages/Order/OrderList.vue | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/pages/Order/OrderList.vue b/src/pages/Order/OrderList.vue index fa182bc39..ced3b9b30 100644 --- a/src/pages/Order/OrderList.vue +++ b/src/pages/Order/OrderList.vue @@ -235,7 +235,20 @@ const getDateColor = (date) => { v-model="data.clientFk" :label="t('module.customer')" @update:model-value="(id) => fetchClientAddress(id, data)" - /> + > + <template #option="scope"> + <QItem v-bind="scope.itemProps"> + <QItemSection> + <QItemLabel> + {{ scope.opt.name }} + </QItemLabel> + <QItemLabel caption> + {{ `#${scope.opt.id}` }} + </QItemLabel> + </QItemSection> + </QItem> + </template> + </VnSelect> <VnSelect v-model="data.addressId" :options="addressesList" From 21eda340a8c5dad2f9b70456cab471aa9e389f3b Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Tue, 26 Nov 2024 22:57:47 +0100 Subject: [PATCH 09/40] fix: #6818 VnLinkPhone using spanish prefix --- src/components/ui/VnLinkPhone.vue | 7 ++++--- src/filters/index.js | 2 ++ src/filters/parsePhone.js | 15 +++++++++++++++ 3 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 src/filters/parsePhone.js diff --git a/src/components/ui/VnLinkPhone.vue b/src/components/ui/VnLinkPhone.vue index 4c045968f..4068498cd 100644 --- a/src/components/ui/VnLinkPhone.vue +++ b/src/components/ui/VnLinkPhone.vue @@ -1,6 +1,7 @@ <script setup> import { reactive, useAttrs, onBeforeMount, capitalize } from 'vue'; import axios from 'axios'; +import { parsePhone } from 'src/filters'; const props = defineProps({ phoneNumber: { type: [String, Number], default: null }, channel: { type: Number, default: null }, @@ -24,9 +25,9 @@ onBeforeMount(async () => { .data; if (!channel) channel = defaultChannel; - config[ - type - ].href = `${url}?customerIdentity=%2B${props.phoneNumber}&channelId=${channel}`; + config[type].href = `${url}?customerIdentity=%2B${parsePhone( + props.phoneNumber + )}&channelId=${channel}`; } }); </script> diff --git a/src/filters/index.js b/src/filters/index.js index ce5c44706..1f7ac77dd 100644 --- a/src/filters/index.js +++ b/src/filters/index.js @@ -12,10 +12,12 @@ import dateRange from './dateRange'; import toHour from './toHour'; import dashOrCurrency from './dashOrCurrency'; import getParamWhere from './getParamWhere'; +import parsePhone from './parsePhone'; import isDialogOpened from './isDialogOpened'; export { isDialogOpened, + parsePhone, toLowerCase, toLowerCamel, toDate, diff --git a/src/filters/parsePhone.js b/src/filters/parsePhone.js new file mode 100644 index 000000000..b2d1ed7b8 --- /dev/null +++ b/src/filters/parsePhone.js @@ -0,0 +1,15 @@ +export default function (phone, prefix = 34) { + if (phone.startsWith('+')) { + console.log('a'); + return `${phone.slice(1)}`; + } + if (phone.startsWith('00')) { + console.log('b'); + return `${phone.slice(2)}`; + } + if (phone.startsWith(prefix) && phone.length === prefix.length + 9) { + console.log('c'); + return `${prefix}${phone.slice(prefix.length)}`; + } + return `${prefix}${phone}`; +} From 1b3500bbce1cdfcf84bb91e11b648beb892a80e1 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Tue, 26 Nov 2024 22:58:36 +0100 Subject: [PATCH 10/40] test: add vitest VnLinkPhone filter --- src/filters/parsePhone.js | 3 -- .../components/common/VnLinkPhone.spec.js | 29 +++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 test/vitest/__tests__/components/common/VnLinkPhone.spec.js diff --git a/src/filters/parsePhone.js b/src/filters/parsePhone.js index b2d1ed7b8..696f55007 100644 --- a/src/filters/parsePhone.js +++ b/src/filters/parsePhone.js @@ -1,14 +1,11 @@ export default function (phone, prefix = 34) { if (phone.startsWith('+')) { - console.log('a'); return `${phone.slice(1)}`; } if (phone.startsWith('00')) { - console.log('b'); return `${phone.slice(2)}`; } if (phone.startsWith(prefix) && phone.length === prefix.length + 9) { - console.log('c'); return `${prefix}${phone.slice(prefix.length)}`; } return `${prefix}${phone}`; diff --git a/test/vitest/__tests__/components/common/VnLinkPhone.spec.js b/test/vitest/__tests__/components/common/VnLinkPhone.spec.js new file mode 100644 index 000000000..1d679d979 --- /dev/null +++ b/test/vitest/__tests__/components/common/VnLinkPhone.spec.js @@ -0,0 +1,29 @@ +import { describe, it, expect } from 'vitest'; +import parsePhone from 'src/filters/parsePhone'; + +describe.only('parsePhone filter', () => { + it("adds prefix +34 if it doesn't have one", () => { + const resultado = parsePhone('123456789', '34'); + expect(resultado).toBe('34123456789'); + }); + + it('maintains prefix +34 if it is already correct', () => { + const resultado = parsePhone('+34123456789', '34'); + expect(resultado).toBe('34123456789'); + }); + + it('converts prefix 0034 to +34', () => { + const resultado = parsePhone('0034123456789', '34'); + expect(resultado).toBe('34123456789'); + }); + + it('converts prefix 34 without symbol to +34', () => { + const resultado = parsePhone('34123456789', '34'); + expect(resultado).toBe('34123456789'); + }); + + it.only('replaces incorrect prefix with the correct one', () => { + const resultado = parsePhone('+44123456789', '34'); + expect(resultado).toBe('44123456789'); + }); +}); From 4539a73efcbd4b420a8118acfd2fbbcf46ada909 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Tue, 26 Nov 2024 23:34:57 +0100 Subject: [PATCH 11/40] test: improve clientList --- .../integration/client/clientList.spec.js | 17 +++++++---------- test/cypress/support/commands.js | 6 +++--- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/test/cypress/integration/client/clientList.spec.js b/test/cypress/integration/client/clientList.spec.js index 5529e5c65..e89b5fc77 100644 --- a/test/cypress/integration/client/clientList.spec.js +++ b/test/cypress/integration/client/clientList.spec.js @@ -17,12 +17,14 @@ describe('Client list', () => { it('Client list create new client', () => { cy.get('.q-page-sticky > div > .q-btn > .q-btn__content > .q-icon').click(); + const randomInt = Math.floor(Math.random() * 90) + 10; + const data = { - Name: { val: 'Name 1' }, - 'Social name': { val: 'TEST 1' }, - 'Tax number': { val: '20852113Z' }, - 'Web user': { val: 'user_test_1' }, - Street: { val: 'C/ STREET 1' }, + Name: { val: `Name ${randomInt}` }, + 'Social name': { val: `TEST ${randomInt}` }, + 'Tax number': { val: `20852${randomInt.length}3Z` }, + 'Web user': { val: `user_test_${randomInt}` }, + Street: { val: `C/ STREET ${randomInt}` }, Email: { val: 'user.test@1.com' }, 'Sales person': { val: 'employee', type: 'select' }, Location: { val: '46000, Valencia(Province one), España', type: 'select' }, @@ -54,11 +56,8 @@ describe('Client list', () => { cy.openActionDescriptor('Create ticket'); cy.waitForElement('#formModel'); cy.waitForElement('.q-form'); - cy.checkValueForm(1, search); cy.checkValueForm(2, search); - cy.get('.grid-create >:nth-child(1)').find('input').should('have.value', search); - cy.get('.grid-create >:nth-child(2)').find('input').should('have.value', search); }); it('Client founded create order', () => { const search = 'Jessica Jones'; @@ -68,7 +67,5 @@ describe('Client list', () => { cy.waitForElement('.q-form'); cy.checkValueForm(1, search); cy.checkValueForm(2, search); - cy.get('.grid-create >:nth-child(2)').find('input').should('have.value', search); - cy.get('.grid-create >:nth-child(4)').find('input').should('have.value', search); }); }); diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js index e5ebc37d7..cb1d3de44 100755 --- a/test/cypress/support/commands.js +++ b/test/cypress/support/commands.js @@ -323,9 +323,9 @@ Cypress.Commands.add('openActions', (row) => { }); Cypress.Commands.add('checkValueForm', (id, search) => { - cy.get( - `.grid-create > :nth-child(${id}) > .q-field__inner > .q-field__control > .q-field__control-container > .q-field__native > .q-field__input` - ).should('have.value', search); + cy.get(`.grid-create > :nth-child(${id}) `) + .find('input') + .should('have.value', search); }); Cypress.Commands.add('checkValueSelectForm', (id, search) => { From bc0d7f110d0e8e1a77ce4a0e5472b68db9d86e84 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Tue, 26 Nov 2024 23:48:47 +0100 Subject: [PATCH 12/40] fix: apply dataByOrder --- src/pages/Order/OrderList.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/Order/OrderList.vue b/src/pages/Order/OrderList.vue index ced3b9b30..c47a9b2ec 100644 --- a/src/pages/Order/OrderList.vue +++ b/src/pages/Order/OrderList.vue @@ -15,6 +15,7 @@ import CustomerDescriptorProxy from '../Customer/Card/CustomerDescriptorProxy.vu import WorkerDescriptorProxy from '../Worker/Card/WorkerDescriptorProxy.vue'; import { toDateTimeFormat } from 'src/filters/date'; import { useRoute } from 'vue-router'; +import dataByOrder from 'src/utils/dataByOrder'; const { t } = useI18n(); const { viewSummary } = useSummaryDialog(); @@ -167,7 +168,7 @@ async function fetchAgencies({ landed, addressId }) { const { data } = await axios.get('Agencies/landsThatDay', { params: { addressFk: addressId, landed }, }); - agencyList.value = data; + agencyList.value = dataByOrder(data, 'agencyMode ASC'); } const getDateColor = (date) => { From ff91ca2dfe6699ae40a6d17867baf18364280f40 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Tue, 26 Nov 2024 23:57:10 +0100 Subject: [PATCH 13/40] feat: remove More options separator --- src/i18n/locale/en.yml | 1 - src/pages/Customer/CustomerFilter.vue | 69 +++++----- src/pages/InvoiceIn/InvoiceInFilter.vue | 1 - src/pages/InvoiceOut/InvoiceOutFilter.vue | 54 ++++---- src/pages/Ticket/TicketFilter.vue | 148 +++++++++++----------- 5 files changed, 128 insertions(+), 145 deletions(-) diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml index e2e0e4238..3e3df7a0f 100644 --- a/src/i18n/locale/en.yml +++ b/src/i18n/locale/en.yml @@ -861,7 +861,6 @@ components: cardDescriptor: mainList: Main list summary: Summary - moreOptions: More options leftMenu: addToPinned: Add to pinned removeFromPinned: Remove from pinned diff --git a/src/pages/Customer/CustomerFilter.vue b/src/pages/Customer/CustomerFilter.vue index 79d48a667..cd567d415 100644 --- a/src/pages/Customer/CustomerFilter.vue +++ b/src/pages/Customer/CustomerFilter.vue @@ -101,8 +101,8 @@ const exprBuilder = (param, value) => { </QItemSection> </QItem> <QItem class="q-mb-sm"> - <QItemSection - ><VnSelect + <QItemSection> + <VnSelect url="Provinces" :label="t('Province')" v-model="params.provinceFk" @@ -120,32 +120,31 @@ const exprBuilder = (param, value) => { /> </QItemSection> </QItem> - <QItem class="q-mb-md"> + <QItem class="q-mb-sm"> <QItemSection> <VnInput :label="t('City')" v-model="params.city" is-outlined /> </QItemSection> </QItem> - <QSeparator /> - <QExpansionItem :label="t('More options')" expand-separator> - <QItem> - <QItemSection> - <VnInput :label="t('Phone')" v-model="params.phone" is-outlined> - <template #prepend> - <QIcon name="phone" size="xs" /> - </template> - </VnInput> - </QItemSection> - </QItem> - <QItem> - <QItemSection> - <VnInput :label="t('Email')" v-model="params.email" is-outlined> - <template #prepend> - <QIcon name="email" size="sm" /> - </template> - </VnInput> - </QItemSection> - </QItem> - <QItem> + <QItem class="q-mb-sm"> + <QItemSection> + <VnInput :label="t('Phone')" v-model="params.phone" is-outlined> + <template #prepend> + <QIcon name="phone" size="xs" /> + </template> + </VnInput> + </QItemSection> + </QItem> + <QItem class="q-mb-sm"> + <QItemSection> + <VnInput :label="t('Email')" v-model="params.email" is-outlined> + <template #prepend> + <QIcon name="email" size="sm" /> + </template> + </VnInput> + </QItemSection> + </QItem> + <QItem class="q-mb-sm"> + <QItemSection> <VnSelect url="Zones" :label="t('Zone')" @@ -160,18 +159,17 @@ const exprBuilder = (param, value) => { outlined rounded auto-load + /></QItemSection> + </QItem> + <QItem class="q-mb-sm"> + <QItemSection> + <VnInput + :label="t('Postcode')" + v-model="params.postcode" + is-outlined /> - </QItem> - <QItem> - <QItemSection> - <VnInput - :label="t('Postcode')" - v-model="params.postcode" - is-outlined - /> - </QItemSection> - </QItem> - </QExpansionItem> + </QItemSection> + </QItem> </template> </VnFilterPanel> </template> @@ -203,7 +201,6 @@ es: Salesperson: Comercial Province: Provincia City: Ciudad - More options: Más opciones Phone: Teléfono Email: Email Zone: Zona diff --git a/src/pages/InvoiceIn/InvoiceInFilter.vue b/src/pages/InvoiceIn/InvoiceInFilter.vue index d1c0856b5..130a77960 100644 --- a/src/pages/InvoiceIn/InvoiceInFilter.vue +++ b/src/pages/InvoiceIn/InvoiceInFilter.vue @@ -184,5 +184,4 @@ es: Amount: Importe Issued: Fecha factura Id or supplier: Id o proveedor - More options: Más opciones </i18n> diff --git a/src/pages/InvoiceOut/InvoiceOutFilter.vue b/src/pages/InvoiceOut/InvoiceOutFilter.vue index 9ce8cc254..dc1d833a2 100644 --- a/src/pages/InvoiceOut/InvoiceOutFilter.vue +++ b/src/pages/InvoiceOut/InvoiceOutFilter.vue @@ -83,36 +83,29 @@ const states = ref(); /> </QItemSection> </QItem> - <QSeparator /> - <QExpansionItem :label="t('More options')" expand-separator> - <QItem> - <QItemSection> - <VnInputDate - v-model="params.issued" - :label="t('Issued')" - is-outlined - /> - </QItemSection> - </QItem> - <QItem> - <QItemSection> - <VnInputDate - v-model="params.created" - :label="t('Created')" - is-outlined - /> - </QItemSection> - </QItem> - <QItem> - <QItemSection> - <VnInputDate - v-model="params.dued" - :label="t('Dued')" - is-outlined - /> - </QItemSection> - </QItem> - </QExpansionItem> + <QItem> + <QItemSection> + <VnInputDate + v-model="params.issued" + :label="t('Issued')" + is-outlined + /> + </QItemSection> + </QItem> + <QItem> + <QItemSection> + <VnInputDate + v-model="params.created" + :label="t('Created')" + is-outlined + /> + </QItemSection> + </QItem> + <QItem> + <QItemSection> + <VnInputDate v-model="params.dued" :label="t('Dued')" is-outlined /> + </QItemSection> + </QItem> </template> </VnFilterPanel> </template> @@ -149,5 +142,4 @@ es: Issued: Fecha emisión Created: Fecha creación Dued: Fecha vencimiento - More options: Más opciones </i18n> diff --git a/src/pages/Ticket/TicketFilter.vue b/src/pages/Ticket/TicketFilter.vue index 6f1cac83b..bde27f30e 100644 --- a/src/pages/Ticket/TicketFilter.vue +++ b/src/pages/Ticket/TicketFilter.vue @@ -212,81 +212,78 @@ const getGroupedStates = (data) => { /> </QItemSection> </QItem> - <QSeparator /> - <QExpansionItem :label="t('More options')" expand-separator> - <QItem> - <QItemSection v-if="!provinces"> - <QSkeleton type="QInput" class="full-width" /> - </QItemSection> - <QItemSection v-if="provinces"> - <QSelect - :label="t('Province')" - v-model="params.provinceFk" - @update:model-value="searchFn()" - :options="provinces" - option-value="id" - option-label="name" - emit-value - map-options - use-input - dense - outlined - rounded - /> - </QItemSection> - </QItem> - <QItem> - <QItemSection v-if="!agencies"> - <QSkeleton type="QInput" class="full-width" /> - </QItemSection> - <QItemSection v-if="agencies"> - <QSelect - :label="t('Agency')" - v-model="params.agencyModeFk" - @update:model-value="searchFn()" - :options="agencies" - option-value="id" - option-label="name" - emit-value - map-options - use-input - dense - outlined - rounded - /> - </QItemSection> - </QItem> - <QItem> - <QItemSection v-if="!warehouses"> - <QSkeleton type="QInput" class="full-width" /> - </QItemSection> - <QItemSection v-if="warehouses"> - <QSelect - :label="t('Warehouse')" - v-model="params.warehouseFk" - @update:model-value="searchFn()" - :options="warehouses" - option-value="id" - option-label="name" - emit-value - map-options - use-input - dense - outlined - rounded - /> - </QItemSection> - </QItem> - <QItem> - <QItemSection> - <VnInput - v-model="params.collectionFk" - :label="t('Collection')" - is-outlined - /> - </QItemSection> - </QItem> - </QExpansionItem> + <QItem> + <QItemSection v-if="!provinces"> + <QSkeleton type="QInput" class="full-width" /> + </QItemSection> + <QItemSection v-if="provinces"> + <QSelect + :label="t('Province')" + v-model="params.provinceFk" + @update:model-value="searchFn()" + :options="provinces" + option-value="id" + option-label="name" + emit-value + map-options + use-input + dense + outlined + rounded + /> + </QItemSection> + </QItem> + <QItem> + <QItemSection v-if="!agencies"> + <QSkeleton type="QInput" class="full-width" /> + </QItemSection> + <QItemSection v-if="agencies"> + <QSelect + :label="t('Agency')" + v-model="params.agencyModeFk" + @update:model-value="searchFn()" + :options="agencies" + option-value="id" + option-label="name" + emit-value + map-options + use-input + dense + outlined + rounded + /> + </QItemSection> + </QItem> + <QItem> + <QItemSection v-if="!warehouses"> + <QSkeleton type="QInput" class="full-width" /> + </QItemSection> + <QItemSection v-if="warehouses"> + <QSelect + :label="t('Warehouse')" + v-model="params.warehouseFk" + @update:model-value="searchFn()" + :options="warehouses" + option-value="id" + option-label="name" + emit-value + map-options + use-input + dense + outlined + rounded + /> + </QItemSection> + </QItem> + <QItem> + <QItemSection> + <VnInput + v-model="params.collectionFk" + :label="t('Collection')" + is-outlined + /> + </QItemSection> + </QItem> </template> </VnFilterPanel> </template> @@ -340,7 +337,6 @@ es: With problems: Con problemas Invoiced: Facturado Routed: Enrutado - More options: Más opciones Province: Provincia Agency: Agencia Warehouse: Almacén From a2d84c48c0cfcde23cb52a66694716756ffcaaa8 Mon Sep 17 00:00:00 2001 From: wbuezas <wbuezas@verdnatura.es> Date: Tue, 26 Nov 2024 21:05:47 -0300 Subject: [PATCH 14/40] refactor: remove unnecesary things --- src/pages/Order/Card/OrderCatalog.vue | 1 - test/cypress/integration/claim/Order/catalogTests.spec.js | 7 ------- 2 files changed, 8 deletions(-) diff --git a/src/pages/Order/Card/OrderCatalog.vue b/src/pages/Order/Card/OrderCatalog.vue index f3e70cd6f..a71065521 100644 --- a/src/pages/Order/Card/OrderCatalog.vue +++ b/src/pages/Order/Card/OrderCatalog.vue @@ -106,7 +106,6 @@ watch( :limit="50" :user-params="catalogParams" :auto-load="autoLoad" - data-cy="orderCatalogPage" > <template #body="{ rows }"> <div class="catalog-list"> diff --git a/test/cypress/integration/claim/Order/catalogTests.spec.js b/test/cypress/integration/claim/Order/catalogTests.spec.js index da0e7869a..06e0d7820 100644 --- a/test/cypress/integration/claim/Order/catalogTests.spec.js +++ b/test/cypress/integration/claim/Order/catalogTests.spec.js @@ -42,31 +42,26 @@ describe('OrderCatalog', () => { }; it('Shows empty state', () => { - // PASS; cy.dataCy('orderCatalogPage').should('exist'); cy.dataCy('orderCatalogPage').contains('No data to display'); }); it('filter by category', () => { - // PASS; selectCategory(); cy.dataCy('orderCatalogItem').should('exist'); }); it('filters by type', () => { - // PASS; selectCategory(); selectTypeFilter('Anthurium'); }); it('filters by custom value select', () => { - // PASS selectCategory(); searchByCustomTagInput('Silver'); }); it('filters by custom value dialog', () => { - // PASS Cypress.on('uncaught:exception', (err) => { if (err.message.includes('canceled')) { return false; @@ -87,7 +82,6 @@ describe('OrderCatalog', () => { }); it('removes a secondary tag', () => { - // PASS selectCategory(); selectTypeFilter('Anthurium'); cy.dataCy('vnFilterPanelChip').should('exist'); @@ -105,7 +99,6 @@ describe('OrderCatalog', () => { }); it('Removes category tag', () => { - // PASS selectCategory(); cy.get( "div.q-page-container [data-cy='catalogFilterCustomTag'] > i.q-chip__icon--remove" From e3bdea2197624047e62aa27712783053c45ee822 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Wed, 27 Nov 2024 01:15:16 +0100 Subject: [PATCH 15/40] fix: ticketSale keyup.enter --- src/pages/Ticket/Card/TicketSale.vue | 50 ++++++++++++++-------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/pages/Ticket/Card/TicketSale.vue b/src/pages/Ticket/Card/TicketSale.vue index 08cdcb9df..95ef3118e 100644 --- a/src/pages/Ticket/Card/TicketSale.vue +++ b/src/pages/Ticket/Card/TicketSale.vue @@ -181,17 +181,34 @@ const resetChanges = async () => { arrayData.fetch({ append: false }); tableRef.value.reload(); }; +const rowToUpdate = ref(null); +const changeQuantity = async (sale) => { + canProceed.value = await isSalePrepared(sale); + if (!canProceed.value) return; + if ( + !sale.itemFk || + sale.quantity == null || + edit.value?.oldQuantity === sale.quantity + ) + return; + if (!sale.id) return addSale(sale); -const updateQuantity = async (sale) => { - const params = { quantity: sale.quantity }; try { - await axios.post(`Sales/${sale.id}/updateQuantity`, params); + if (!rowToUpdate.value) return; + rowToUpdate.value = null; + await updateQuantity(sale); } catch (e) { - sale.quantity = tableRef.value.CrudModelRef.originalData.find( + const { quantity } = tableRef.value.CrudModelRef.originalData.find( (s) => s.id === sale.id - ).quantity; + ); + sale.quantity = quantity; throw e; } +}; + +const updateQuantity = async ({ quantity, id }) => { + const params = { quantity: quantity }; + await axios.post(`Sales/${id}/updateQuantity`, params); notify('globals.dataSaved', 'positive'); }; @@ -219,19 +236,6 @@ const addSale = async (sale) => { window.location.reload(); }; -const changeQuantity = async (sale) => { - canProceed.value = await isSalePrepared(sale); - if (!canProceed.value) return; - if ( - !sale.itemFk || - sale.quantity == null || - edit.value?.oldQuantity === sale.quantity - ) - return; - if (!sale.id) return addSale(sale); - await updateQuantity(sale); -}; - const updateConcept = async (sale) => { canProceed.value = await isSalePrepared(sale); if (!canProceed.value) return; @@ -768,16 +772,12 @@ watch( </template> <template #column-quantity="{ row }"> <VnInput - v-if="row.isNew" - v-model.number="row.quantity" + v-if="row.isNew || isTicketEditable" type="number" - @blur="changeQuantity(row)" - @focus="edit.oldQuantity = row.quantity" - /> - <VnInput - v-else-if="isTicketEditable" v-model.number="row.quantity" @blur="changeQuantity(row)" + @keyup.enter="changeQuantity(row)" + @update:model-value="() => (rowToUpdate = row)" @focus="edit.oldQuantity = row.quantity" /> <span v-else>{{ row.quantity }}</span> From 72a481ae5b4aed6768b7db6be2fdbb3c7520093b Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Wed, 27 Nov 2024 01:30:42 +0100 Subject: [PATCH 16/40] test: remove only --- test/vitest/__tests__/components/common/VnLinkPhone.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/vitest/__tests__/components/common/VnLinkPhone.spec.js b/test/vitest/__tests__/components/common/VnLinkPhone.spec.js index 1d679d979..e460ab2fc 100644 --- a/test/vitest/__tests__/components/common/VnLinkPhone.spec.js +++ b/test/vitest/__tests__/components/common/VnLinkPhone.spec.js @@ -1,7 +1,7 @@ import { describe, it, expect } from 'vitest'; import parsePhone from 'src/filters/parsePhone'; -describe.only('parsePhone filter', () => { +describe('parsePhone filter', () => { it("adds prefix +34 if it doesn't have one", () => { const resultado = parsePhone('123456789', '34'); expect(resultado).toBe('34123456789'); @@ -22,7 +22,7 @@ describe.only('parsePhone filter', () => { expect(resultado).toBe('34123456789'); }); - it.only('replaces incorrect prefix with the correct one', () => { + it('replaces incorrect prefix with the correct one', () => { const resultado = parsePhone('+44123456789', '34'); expect(resultado).toBe('44123456789'); }); From 4a562acd9226216f3245dfd28e7ca8ac88966801 Mon Sep 17 00:00:00 2001 From: wbuezas <wbuezas@verdnatura.es> Date: Tue, 26 Nov 2024 21:58:30 -0300 Subject: [PATCH 17/40] test: change selector --- test/cypress/integration/claim/Order/catalogTests.spec.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/test/cypress/integration/claim/Order/catalogTests.spec.js b/test/cypress/integration/claim/Order/catalogTests.spec.js index 06e0d7820..45eda6f1f 100644 --- a/test/cypress/integration/claim/Order/catalogTests.spec.js +++ b/test/cypress/integration/claim/Order/catalogTests.spec.js @@ -71,10 +71,7 @@ describe('OrderCatalog', () => { cy.dataCy('catalogFilterValueDialogBtn').should('exist'); cy.dataCy('catalogFilterValueDialogBtn').last().click(); cy.dataCy('catalogFilterValueDialogTagSelect').should('exist'); - cy.selectOption( - "[data-cy='catalogFilterValueDialog'] > label > div > div > div", - 'Tallos' - ); + cy.selectOption("[data-cy='catalogFilterValueDialogTagSelect']", 'Tallos'); cy.dataCy('catalogFilterValueDialogValueInput').find('input').focus(); cy.dataCy('catalogFilterValueDialogValueInput').find('input').type('2'); cy.dataCy('catalogFilterValueDialogValueInput').find('input').type('{enter}'); From 07ba02aec87970886f32616fb95fe4707d3e6125 Mon Sep 17 00:00:00 2001 From: Jon <jon@verdnatura.es> Date: Wed, 27 Nov 2024 08:02:18 +0100 Subject: [PATCH 18/40] fix: fixed delete event and dated value when excluding a day --- src/pages/Zone/Card/ZoneEventExclusionForm.vue | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/pages/Zone/Card/ZoneEventExclusionForm.vue b/src/pages/Zone/Card/ZoneEventExclusionForm.vue index 1027fc54f..9c6825c48 100644 --- a/src/pages/Zone/Card/ZoneEventExclusionForm.vue +++ b/src/pages/Zone/Card/ZoneEventExclusionForm.vue @@ -1,5 +1,5 @@ <script setup> -import { ref, computed, onMounted } from 'vue'; +import { ref, computed, onMounted, reactive } from 'vue'; import { useI18n } from 'vue-i18n'; import { useRoute } from 'vue-router'; @@ -43,7 +43,7 @@ const { t } = useI18n(); const { openConfirmationModal } = useVnConfirm(); const isNew = computed(() => props.isNewMode); -const dated = ref(props.date); +const dated = reactive(props.date); const tickedNodes = ref(); const _excludeType = ref('all'); @@ -68,12 +68,11 @@ const exclusionGeoCreate = async () => { const exclusionCreate = async () => { if (isNew.value) - await axios.post(`Zones/${route.params.id}/exclusions`, [{ dated: dated.value }]); + await axios.post(`Zones/${route.params.id}/exclusions`, [{ dated: dated }]); else await axios.post(`Zones/${route.params.id}/exclusions`, { - dated: dated.value, + dated: dated, }); - await refetchEvents(); }; @@ -84,7 +83,8 @@ const onSubmit = async () => { const deleteEvent = async () => { if (!props.event) return; - await axios.delete(`Zones/${route.params.id}/exclusions`); + const exclusionId = props.event?.zoneExclusionFk || props.event?.id; + await axios.delete(`Zones/${route.params.id}/exclusions/${exclusionId}`); await refetchEvents(); }; From e764f4066ff3e63a2d95ca588a32fc5602c7d20c Mon Sep 17 00:00:00 2001 From: Jon <jon@verdnatura.es> Date: Wed, 27 Nov 2024 12:53:07 +0100 Subject: [PATCH 19/40] fix: ticket notes translation and deleted useless code --- src/pages/Ticket/Card/TicketSummary.vue | 2 +- src/pages/Zone/Card/ZoneEventExclusionForm.vue | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/pages/Ticket/Card/TicketSummary.vue b/src/pages/Ticket/Card/TicketSummary.vue index 1ff0d6d80..6697f644a 100644 --- a/src/pages/Ticket/Card/TicketSummary.vue +++ b/src/pages/Ticket/Card/TicketSummary.vue @@ -269,7 +269,7 @@ function toTicketUrl(section) { <QCard class="vn-one" v-if="entity.notes.length"> <VnTitle :url="toTicketUrl('observation')" - :text="t('ticket.pageTitles.notes')" + :text="t('globals.pageTitles.notes')" /> <QVirtualScroll :items="entity.notes" diff --git a/src/pages/Zone/Card/ZoneEventExclusionForm.vue b/src/pages/Zone/Card/ZoneEventExclusionForm.vue index 9c6825c48..adbf8f47e 100644 --- a/src/pages/Zone/Card/ZoneEventExclusionForm.vue +++ b/src/pages/Zone/Card/ZoneEventExclusionForm.vue @@ -67,12 +67,7 @@ const exclusionGeoCreate = async () => { }; const exclusionCreate = async () => { - if (isNew.value) - await axios.post(`Zones/${route.params.id}/exclusions`, [{ dated: dated }]); - else - await axios.post(`Zones/${route.params.id}/exclusions`, { - dated: dated, - }); + await axios.post(`Zones/${route.params.id}/exclusions`, [{ dated: dated }]); await refetchEvents(); }; From 7d28037c29a89ed9a9a09cd7afcb99e6d557541f Mon Sep 17 00:00:00 2001 From: Jon <jon@verdnatura.es> Date: Wed, 27 Nov 2024 14:09:37 +0100 Subject: [PATCH 20/40] fix: fixed ref filter in InvoiceOutList --- src/pages/InvoiceOut/InvoiceOutList.vue | 38 ++++++++++++------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/src/pages/InvoiceOut/InvoiceOutList.vue b/src/pages/InvoiceOut/InvoiceOutList.vue index 092844386..f5a4f7d80 100644 --- a/src/pages/InvoiceOut/InvoiceOutList.vue +++ b/src/pages/InvoiceOut/InvoiceOutList.vue @@ -43,16 +43,17 @@ const columns = computed(() => [ { align: 'left', name: 'ref', - label: t('invoiceOutList.tableVisibleColumns.ref'), + label: t('globals.reference'), isTitle: true, component: 'select', attrs: { url: MODEL, optionLabel: 'ref', - optionValue: 'id', + optionValue: 'ref', }, - columnField: { - component: null, + columnField: { component: null }, + columnFilter: { + inWhere: true, }, }, { @@ -147,25 +148,22 @@ function openPdf(id) { } function downloadPdf() { - if (selectedRows.value.size === 0) return; - const selectedCardsArray = Array.from(selectedRows.value.values()); + if (selectedRows.value.size === 0) return; + const selectedCardsArray = Array.from(selectedRows.value.values()); - if (selectedRows.value.size === 1) { - const [invoiceOut] = selectedCardsArray; - openPdf(invoiceOut.id); - } else { - const invoiceOutIdsArray = selectedCardsArray.map( - (invoiceOut) => invoiceOut.id - ); - const invoiceOutIds = invoiceOutIdsArray.join(','); + if (selectedRows.value.size === 1) { + const [invoiceOut] = selectedCardsArray; + openPdf(invoiceOut.id); + } else { + const invoiceOutIdsArray = selectedCardsArray.map((invoiceOut) => invoiceOut.id); + const invoiceOutIds = invoiceOutIdsArray.join(','); - const params = { - ids: invoiceOutIds, - }; - - openReport(`${MODEL}/downloadZip`, params); - } + const params = { + ids: invoiceOutIds, + }; + openReport(`${MODEL}/downloadZip`, params); + } } watchEffect(selectedRows); From 33de645e37bd9ac0d9942e6d8d07ca7a0445c5c4 Mon Sep 17 00:00:00 2001 From: jorgep <jorgep@verdnatura.es> Date: Wed, 27 Nov 2024 17:02:41 +0100 Subject: [PATCH 21/40] fix: not fetch on mounted --- src/components/ui/VnPaginate.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ui/VnPaginate.vue b/src/components/ui/VnPaginate.vue index f3f6d64f1..3649ba8f5 100644 --- a/src/components/ui/VnPaginate.vue +++ b/src/components/ui/VnPaginate.vue @@ -133,7 +133,7 @@ const addFilter = async (filter, params) => { async function fetch(params) { useArrayData(props.dataKey, params); arrayData.reset(['filter.skip', 'skip', 'page']); - await arrayData.fetch({ append: false }); + await arrayData.fetch({ append: false, updateRouter: mounted.value }); return emitStoreData(); } From 63f0db459c8aec1eac2f8741f61f502bb1ebf193 Mon Sep 17 00:00:00 2001 From: wbuezas <wbuezas@verdnatura.es> Date: Wed, 27 Nov 2024 16:17:37 -0300 Subject: [PATCH 22/40] test: change file name and path --- .../Order/catalogTests.spec.js => Order/orderCatalog.spec.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename test/cypress/integration/{claim/Order/catalogTests.spec.js => Order/orderCatalog.spec.js} (100%) diff --git a/test/cypress/integration/claim/Order/catalogTests.spec.js b/test/cypress/integration/Order/orderCatalog.spec.js similarity index 100% rename from test/cypress/integration/claim/Order/catalogTests.spec.js rename to test/cypress/integration/Order/orderCatalog.spec.js From 507b78f5e8c50082592133ff3568ad511e3431de Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Wed, 27 Nov 2024 22:33:00 +0100 Subject: [PATCH 23/40] perf: refs #8061 filter autonomy --- src/components/CreateNewCityForm.vue | 2 ++ src/components/CreateNewPostcodeForm.vue | 4 ++++ src/components/CreateNewProvinceForm.vue | 28 +++++++++--------------- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/components/CreateNewCityForm.vue b/src/components/CreateNewCityForm.vue index e51a18ef8..1cbba42fc 100644 --- a/src/components/CreateNewCityForm.vue +++ b/src/components/CreateNewCityForm.vue @@ -47,11 +47,13 @@ const onDataSaved = (...args) => { :label="t('Name')" v-model="data.name" :rules="validate('city.name')" + required /> <VnSelectProvince :province-selected="$props.provinceSelected" :country-fk="$props.countryFk" v-model="data.provinceFk" + required /> </VnRow> </template> diff --git a/src/components/CreateNewPostcodeForm.vue b/src/components/CreateNewPostcodeForm.vue index 907e49499..66b2a30d3 100644 --- a/src/components/CreateNewPostcodeForm.vue +++ b/src/components/CreateNewPostcodeForm.vue @@ -174,6 +174,7 @@ async function onProvinceCreated(data) { v-model="data.code" :rules="validate('postcode.code')" clearable + required /> <VnSelectDialog :label="t('City')" @@ -188,6 +189,7 @@ async function onProvinceCreated(data) { :acls="[{ model: 'Town', props: '*', accessType: 'WRITE' }]" :emit-value="false" :clearable="true" + required > <template #option="{ itemProps, opt }"> <QItem v-bind="itemProps"> @@ -220,8 +222,10 @@ async function onProvinceCreated(data) { v-model="data.provinceFk" @on-province-fetched="handleProvinces" @on-province-created="onProvinceCreated" + required /> <VnSelect + required :label="t('Country')" @update:options="handleCountries" :options="countriesOptions" diff --git a/src/components/CreateNewProvinceForm.vue b/src/components/CreateNewProvinceForm.vue index a0e681f77..887ca957c 100644 --- a/src/components/CreateNewProvinceForm.vue +++ b/src/components/CreateNewProvinceForm.vue @@ -2,7 +2,6 @@ import { computed, reactive, ref } from 'vue'; import { useI18n } from 'vue-i18n'; -import FetchData from 'components/FetchData.vue'; import VnRow from 'components/ui/VnRow.vue'; import VnSelect from 'src/components/common/VnSelect.vue'; import VnInput from 'src/components/common/VnInput.vue'; @@ -21,15 +20,11 @@ const $props = defineProps({ type: Number, default: null, }, - provinces: { - type: Array, - default: () => [], - }, }); -const autonomiesOptions = ref([]); +const autonomiesRef = ref([]); const onDataSaved = (dataSaved, requestResponse) => { - requestResponse.autonomy = autonomiesOptions.value.find( + requestResponse.autonomy = autonomiesRef.value.opts.find( (autonomy) => autonomy.id == requestResponse.autonomyFk ); emit('onDataSaved', dataSaved, requestResponse); @@ -43,16 +38,6 @@ const where = computed(() => { </script> <template> - <FetchData - @on-fetch="(data) => (autonomiesOptions = data)" - auto-load - :filter="{ - where, - }" - url="Autonomies/location" - :sort-by="['name ASC']" - :limit="30" - /> <FormModelPopup :title="t('New province')" :subtitle="t('Please, ensure you put the correct data!')" @@ -67,10 +52,17 @@ const where = computed(() => { :label="t('Name')" v-model="data.name" :rules="validate('province.name')" + required /> <VnSelect + required + ref="autonomiesRef" + auto-load + :where="where" + url="Autonomies/location" + :sort-by="['name ASC']" + :limit="30" :label="t('Autonomy')" - :options="autonomiesOptions" hide-selected option-label="name" option-value="id" From 3a695bdfe12ff3e667846c4361df1f7d07c4328a Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Wed, 27 Nov 2024 22:42:18 +0100 Subject: [PATCH 24/40] perf: refs #8061 use opts from VnSelect --- src/components/CreateNewPostcodeForm.vue | 37 +++++------------------- 1 file changed, 8 insertions(+), 29 deletions(-) diff --git a/src/components/CreateNewPostcodeForm.vue b/src/components/CreateNewPostcodeForm.vue index 66b2a30d3..141dcb142 100644 --- a/src/components/CreateNewPostcodeForm.vue +++ b/src/components/CreateNewPostcodeForm.vue @@ -23,9 +23,8 @@ const postcodeFormData = reactive({ }); const townsFetchDataRef = ref(false); -const countriesFetchDataRef = ref(false); +const countriesRef = ref(false); const provincesFetchDataRef = ref(false); -const countriesOptions = ref([]); const provincesOptions = ref([]); const townsOptions = ref([]); const town = ref({}); @@ -42,7 +41,7 @@ function onDataSaved(formData) { ({ id }) => id === formData.provinceFk ); newPostcode.province = provinceObject?.name; - const countryObject = countriesOptions.value.find( + const countryObject = countriesRef.value.opts.find( ({ id }) => id === formData.countryFk ); newPostcode.country = countryObject?.name; @@ -80,16 +79,6 @@ async function filterTowns(name) { await townsFetchDataRef.value?.fetch(); } } -async function filterCountries(name) { - if (name !== '') { - countryFilter.value.where = { - name: { - like: `%${name}%`, - }, - }; - await countriesFetchDataRef.value?.fetch(); - } -} async function fetchTowns(countryFk) { if (!countryFk) return; @@ -111,10 +100,6 @@ async function handleTowns(data) { townsOptions.value = data; } -async function handleCountries(data) { - countriesOptions.value = data; -} - async function setProvince(id, data) { const newProvince = provincesOptions.value.find((province) => province.id == id); if (!newProvince) return; @@ -148,15 +133,6 @@ async function onProvinceCreated(data) { auto-load url="Towns/location" /> - <FetchData - ref="countriesFetchDataRef" - :limit="30" - :filter="countryFilter" - :sort-by="['name ASC']" - @on-fetch="handleCountries" - auto-load - url="Countries" - /> <FormModelPopup url-create="postcodes" @@ -225,12 +201,15 @@ async function onProvinceCreated(data) { required /> <VnSelect + ref="countriesRef" + :limit="30" + :filter="countryFilter" + :sort-by="['name ASC']" + auto-load + url="Countries" required :label="t('Country')" - @update:options="handleCountries" - :options="countriesOptions" hide-selected - @filter="filterCountries" option-label="name" option-value="id" v-model="data.countryFk" From 89a2486f6286aeab5f80c6998f83f7470a275c97 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Wed, 27 Nov 2024 23:33:39 +0100 Subject: [PATCH 25/40] fix: refs #8061 improve code dependencies --- src/components/CreateNewPostcodeForm.vue | 56 +++++++----------------- test/cypress/support/commands.js | 3 +- 2 files changed, 18 insertions(+), 41 deletions(-) diff --git a/src/components/CreateNewPostcodeForm.vue b/src/components/CreateNewPostcodeForm.vue index 141dcb142..232f86a49 100644 --- a/src/components/CreateNewPostcodeForm.vue +++ b/src/components/CreateNewPostcodeForm.vue @@ -1,5 +1,5 @@ <script setup> -import { reactive, ref } from 'vue'; +import { computed, reactive, ref } from 'vue'; import { useI18n } from 'vue-i18n'; import FetchData from 'components/FetchData.vue'; @@ -24,9 +24,9 @@ const postcodeFormData = reactive({ const townsFetchDataRef = ref(false); const countriesRef = ref(false); +const townsRef = ref(false); const provincesFetchDataRef = ref(false); const provincesOptions = ref([]); -const townsOptions = ref([]); const town = ref({}); const townFilter = ref({}); const countryFilter = ref({}); @@ -69,35 +69,8 @@ async function setCountry(countryFk, data) { data.countryFk = countryFk; } -async function filterTowns(name) { - if (name !== '') { - townFilter.value.where = { - name: { - like: `%${name}%`, - }, - }; - await townsFetchDataRef.value?.fetch(); - } -} - -async function fetchTowns(countryFk) { - if (!countryFk) return; - townFilter.value.where = { - provinceFk: { - inq: provincesOptions.value.map(({ id }) => id), - }, - }; - await townsFetchDataRef.value?.fetch(); -} - async function handleProvinces(data) { provincesOptions.value = data; - if (postcodeFormData.countryFk) { - await fetchTowns(postcodeFormData.countryFk); - } -} -async function handleTowns(data) { - townsOptions.value = data; } async function setProvince(id, data) { @@ -113,6 +86,14 @@ async function onProvinceCreated(data) { }); postcodeFormData.provinceFk = data.id; } + +const whereTowns = computed(() => { + return { + provinceFk: { + inq: provincesOptions.value.map(({ id }) => id), + }, + }; +}); </script> <template> @@ -124,15 +105,6 @@ async function onProvinceCreated(data) { auto-load url="Provinces/location" /> - <FetchData - ref="townsFetchDataRef" - :sort-by="['name ASC']" - :limit="30" - :filter="townFilter" - @on-fetch="handleTowns" - auto-load - url="Towns/location" - /> <FormModelPopup url-create="postcodes" @@ -153,12 +125,16 @@ async function onProvinceCreated(data) { required /> <VnSelectDialog + ref="townsRef" + :sort-by="['name ASC']" + :limit="30" + auto-load + url="Towns/location" + :where="whereTowns" :label="t('City')" @update:model-value="(value) => setTown(value, data)" - @filter="filterTowns" :tooltip="t('Create city')" v-model="data.townFk" - :options="townsOptions" option-label="name" option-value="id" :rules="validate('postcode.city')" diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js index 53f9d1d73..dbaa7871c 100755 --- a/test/cypress/support/commands.js +++ b/test/cypress/support/commands.js @@ -86,9 +86,10 @@ Cypress.Commands.add('getValue', (selector) => { }); // Fill Inputs -Cypress.Commands.add('selectOption', (selector, option) => { +Cypress.Commands.add('selectOption', (selector, option, timeout) => { cy.waitForElement(selector); cy.get(selector).click(); + cy.wait(timeout || 1000); cy.get('.q-menu .q-item').contains(option).click(); }); Cypress.Commands.add('countSelectOptions', (selector, option) => { From 1a0406b5b1b73c16157d673a18668e7c3410f59a Mon Sep 17 00:00:00 2001 From: Jon <jon@verdnatura.es> Date: Thu, 28 Nov 2024 07:21:02 +0100 Subject: [PATCH 26/40] fix: fixed exclusionCreate when excluding an event already excluded --- src/pages/Zone/Card/ZoneEventExclusionForm.vue | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/pages/Zone/Card/ZoneEventExclusionForm.vue b/src/pages/Zone/Card/ZoneEventExclusionForm.vue index 333c5d934..6635ce385 100644 --- a/src/pages/Zone/Card/ZoneEventExclusionForm.vue +++ b/src/pages/Zone/Card/ZoneEventExclusionForm.vue @@ -67,7 +67,12 @@ const exclusionGeoCreate = async () => { }; const exclusionCreate = async () => { - await axios.post(`Zones/${route.params.id}/exclusions`, [{ dated: dated }]); + if (isNew.value) + await axios.post(`Zones/${route.params.id}/exclusions`, [{ dated: dated }]); + else + await axios.put(`Zones/${route.params.id}/exclusions/${props.event?.id}`, { + dated: dated, + }); await refetchEvents(); }; From aaab41fe97df7319b5a1c7c29a25f66dd5bcde8e Mon Sep 17 00:00:00 2001 From: Jon <jon@verdnatura.es> Date: Thu, 28 Nov 2024 07:37:50 +0100 Subject: [PATCH 27/40] fix: translations --- src/pages/Zone/locale/en.yml | 1 + src/pages/Zone/locale/es.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/src/pages/Zone/locale/en.yml b/src/pages/Zone/locale/en.yml index bf7d8f0de..a9cd700df 100644 --- a/src/pages/Zone/locale/en.yml +++ b/src/pages/Zone/locale/en.yml @@ -76,6 +76,7 @@ eventsInclusionForm: rangeOfDates: Range of dates from: From to: To + day: Day upcomingDeliveries: province: Province closing: Closing diff --git a/src/pages/Zone/locale/es.yml b/src/pages/Zone/locale/es.yml index 91541bea3..c4820a6c0 100644 --- a/src/pages/Zone/locale/es.yml +++ b/src/pages/Zone/locale/es.yml @@ -76,5 +76,6 @@ eventsInclusionForm: rangeOfDates: Rango de fechas from: Desde to: Hasta + day: Día upcomingDeliveries: province: Provincia From 55b9e3ddcdea6edd213cc9df08f610e62d09088a Mon Sep 17 00:00:00 2001 From: guillermo <guillermo@verdnatura.es> Date: Thu, 28 Nov 2024 08:21:09 +0100 Subject: [PATCH 28/40] fix: refs #7266 Bad report --- src/pages/Entry/EntryBuysTableDialog.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/Entry/EntryBuysTableDialog.vue b/src/pages/Entry/EntryBuysTableDialog.vue index c885c2485..77b31aaa3 100644 --- a/src/pages/Entry/EntryBuysTableDialog.vue +++ b/src/pages/Entry/EntryBuysTableDialog.vue @@ -86,7 +86,7 @@ const entriesTableColumns = computed(() => [ color="primary" icon="print" :loading="isLoading" - @click="openReport(`Entries/${entityId}/print`)" + @click="openReport(`Entries/${entityId}/buy-label-supplier`)" unelevated autofocus /> From 41fb880c0eec149b8e9d70e0c5d241758fa42b67 Mon Sep 17 00:00:00 2001 From: guillermo <guillermo@verdnatura.es> Date: Thu, 28 Nov 2024 08:59:13 +0100 Subject: [PATCH 29/40] fix: refs #7266 Minor fixes --- src/pages/Entry/EntryBuysTableDialog.vue | 8 +++++--- src/pages/Entry/MyEntries.vue | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/pages/Entry/EntryBuysTableDialog.vue b/src/pages/Entry/EntryBuysTableDialog.vue index 77b31aaa3..3975bff19 100644 --- a/src/pages/Entry/EntryBuysTableDialog.vue +++ b/src/pages/Entry/EntryBuysTableDialog.vue @@ -82,11 +82,11 @@ const entriesTableColumns = computed(() => [ </QCardSection> <QCardActions align="right"> <QBtn - :label="t('printLabels')" + :label="t('myEntries.printLabels')" color="primary" icon="print" :loading="isLoading" - @click="openReport(`Entries/${entityId}/buy-label-supplier`)" + @click="openReport(`Entries/${entityId}/labelSupplier`)" unelevated autofocus /> @@ -126,7 +126,9 @@ const entriesTableColumns = computed(() => [ " unelevated > - <QTooltip>{{ t('viewLabel') }}</QTooltip> + <QTooltip>{{ + t('myEntries.viewLabel') + }}</QTooltip> </QBtn> </QTr> </template> diff --git a/src/pages/Entry/MyEntries.vue b/src/pages/Entry/MyEntries.vue index 2c37c2c42..91a29b190 100644 --- a/src/pages/Entry/MyEntries.vue +++ b/src/pages/Entry/MyEntries.vue @@ -101,7 +101,7 @@ const columns = computed(() => [ name: 'tableActions', actions: [ { - title: t('printLabels'), + title: t('myEntries.printLabels'), icon: 'print', isPrimary: true, action: (row) => printBuys(row.id), From 5c79c6bfef842d9edba07d745e35213f460bf427 Mon Sep 17 00:00:00 2001 From: robert <robert@verdnatura.es> Date: Thu, 28 Nov 2024 09:38:28 +0100 Subject: [PATCH 30/40] feat: refs #245362 itemTags --- src/pages/Item/Card/ItemTags.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/Item/Card/ItemTags.vue b/src/pages/Item/Card/ItemTags.vue index 461aaef4b..b26e08612 100644 --- a/src/pages/Item/Card/ItemTags.vue +++ b/src/pages/Item/Card/ItemTags.vue @@ -66,6 +66,7 @@ const insertTag = (rows) => { <FetchData url="Tags" :filter="{ fields: ['id', 'name', 'isFree', 'sourceTable'] }" + :sort-by="'name'" @on-fetch="(data) => (tagOptions = data)" auto-load /> From 97c12bced3f493b08b221eaa4829cb84f7348f2e Mon Sep 17 00:00:00 2001 From: robert <robert@verdnatura.es> Date: Thu, 28 Nov 2024 11:36:59 +0100 Subject: [PATCH 31/40] feat: refs #245362 change request --- src/pages/Item/Card/ItemTags.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/Item/Card/ItemTags.vue b/src/pages/Item/Card/ItemTags.vue index b26e08612..f4ab90d93 100644 --- a/src/pages/Item/Card/ItemTags.vue +++ b/src/pages/Item/Card/ItemTags.vue @@ -66,7 +66,7 @@ const insertTag = (rows) => { <FetchData url="Tags" :filter="{ fields: ['id', 'name', 'isFree', 'sourceTable'] }" - :sort-by="'name'" + sort-by="name" @on-fetch="(data) => (tagOptions = data)" auto-load /> From 61d0d71538da93b9ae1f4170822e5502849294c1 Mon Sep 17 00:00:00 2001 From: Jon <jon@verdnatura.es> Date: Thu, 28 Nov 2024 12:26:33 +0100 Subject: [PATCH 32/40] fix: fixed functionality like Salix --- .../Zone/Card/ZoneEventExclusionForm.vue | 12 +++----- src/pages/Zone/Card/ZoneEvents.vue | 15 ++++++---- src/pages/Zone/Card/ZoneEventsPanel.vue | 30 ++++--------------- 3 files changed, 19 insertions(+), 38 deletions(-) diff --git a/src/pages/Zone/Card/ZoneEventExclusionForm.vue b/src/pages/Zone/Card/ZoneEventExclusionForm.vue index 6635ce385..62cf7cf8d 100644 --- a/src/pages/Zone/Card/ZoneEventExclusionForm.vue +++ b/src/pages/Zone/Card/ZoneEventExclusionForm.vue @@ -67,7 +67,7 @@ const exclusionGeoCreate = async () => { }; const exclusionCreate = async () => { - if (isNew.value) + if (isNew.value || props.event?.type) await axios.post(`Zones/${route.params.id}/exclusions`, [{ dated: dated }]); else await axios.put(`Zones/${route.params.id}/exclusions/${props.event?.id}`, { @@ -119,11 +119,7 @@ onMounted(() => { > <template #form-inputs> <VnRow class="row q-gutter-md q-mb-lg"> - <VnInputDate - :label="t('eventsInclusionForm.day')" - v-model="dated" - :required="true" - /> + <VnInputDate :label="t('eventsInclusionForm.day')" v-model="dated" /> </VnRow> <div class="column q-gutter-y-sm q-mb-md"> <QRadio @@ -173,8 +169,8 @@ onMounted(() => { class="q-mr-sm" @click=" openConfirmationModal( - t('zone.deleteTitle'), - t('zone.deleteSubtitle'), + t('eventsPanel.deleteTitle'), + t('eventsPanel.deleteSubtitle'), () => deleteEvent() ) " diff --git a/src/pages/Zone/Card/ZoneEvents.vue b/src/pages/Zone/Card/ZoneEvents.vue index 3452849bc..6d5b37096 100644 --- a/src/pages/Zone/Card/ZoneEvents.vue +++ b/src/pages/Zone/Card/ZoneEvents.vue @@ -24,13 +24,14 @@ const zoneEventsFormProps = reactive({ date: null, }); -const openForm = (data) => { +const openForm = (data, isBtnAdd) => { const { date = null, isNewMode, event, eventType, geoIds = [] } = data; zoneEventsFormProps.date = date; zoneEventsFormProps.isNewMode = isNewMode; zoneEventsFormProps.event = event; zoneEventsFormProps.eventType = eventType; if (geoIds.length) zoneEventsFormProps.geoIds = geoIds; + if (isBtnAdd) formModeName.value = 'include'; showZoneEventForm.value = true; }; @@ -51,7 +52,6 @@ onUnmounted(() => (stateStore.rightDrawer = false)); :last-day="lastDay" :events="events" v-model:formModeName="formModeName" - @open-zone-form="openForm" /> </QScrollArea> </QDrawer> @@ -65,7 +65,7 @@ onUnmounted(() => (stateStore.rightDrawer = false)); /> <QDialog v-model="showZoneEventForm" @hide="onZoneEventFormClose()"> <ZoneEventInclusionForm - v-if="formModeName === 'include'" + v-if="!formModeName || formModeName === 'include'" v-bind="zoneEventsFormProps" @close-form="onZoneEventFormClose()" /> @@ -78,9 +78,12 @@ onUnmounted(() => (stateStore.rightDrawer = false)); <QPageSticky :offset="[20, 20]"> <QBtn @click=" - openForm({ - isNewMode: true, - }) + openForm( + { + isNewMode: true, + }, + true + ) " color="primary" fab diff --git a/src/pages/Zone/Card/ZoneEventsPanel.vue b/src/pages/Zone/Card/ZoneEventsPanel.vue index 4a030cbea..da1c0cf71 100644 --- a/src/pages/Zone/Card/ZoneEventsPanel.vue +++ b/src/pages/Zone/Card/ZoneEventsPanel.vue @@ -11,6 +11,10 @@ import { dashIfEmpty } from 'src/filters'; import { useWeekdayStore } from 'src/stores/useWeekdayStore'; import { useVnConfirm } from 'composables/useVnConfirm'; +const formModeName = defineModel('formModeName', { + type: String, + required: true, +}); const props = defineProps({ firstDay: { type: Date, @@ -27,25 +31,13 @@ const props = defineProps({ required: true, default: () => [], }, - formModeName: { - type: String, - required: true, - default: 'include', - }, }); -const emit = defineEmits(['openZoneForm', 'update:formModeName']); - const { t } = useI18n(); const route = useRoute(); const weekdayStore = useWeekdayStore(); const { openConfirmationModal } = useVnConfirm(); -const formName = computed({ - get: () => props.formModeName, - set: (value) => emit('update:formModeName', value), -}); - const params = computed(() => ({ zoneFk: route.params.id, started: props.firstDay, @@ -88,16 +80,6 @@ const deleteEvent = async (id) => { await fetchData(); }; -const openInclusionForm = (event) => { - formName.value = 'include'; - emit('openZoneForm', { - date: event.dated, - event, - isNewMode: false, - eventType: 'event', - }); -}; - onMounted(async () => { weekdayStore.initStore(); }); @@ -110,13 +92,13 @@ onMounted(async () => { t('eventsPanel.editMode') }}</span> <QRadio - v-model="formName" + v-model="formModeName" dense val="include" :label="t('eventsPanel.include')" /> <QRadio - v-model="formName" + v-model="formModeName" dense val="exclude" :label="t('eventsPanel.exclude')" From 6263481a3e1e87b41f3db7ecd336dff34461abde Mon Sep 17 00:00:00 2001 From: Jon <jon@verdnatura.es> Date: Thu, 28 Nov 2024 13:42:22 +0100 Subject: [PATCH 33/40] refactor: exclusionCreate function and translations --- src/pages/Supplier/SupplierList.vue | 5 ++--- src/pages/Zone/Card/ZoneEventExclusionForm.vue | 12 ++++++------ src/pages/Zone/locale/en.yml | 2 ++ src/pages/Zone/locale/es.yml | 2 ++ 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/pages/Supplier/SupplierList.vue b/src/pages/Supplier/SupplierList.vue index 69f826201..a54012b34 100644 --- a/src/pages/Supplier/SupplierList.vue +++ b/src/pages/Supplier/SupplierList.vue @@ -124,8 +124,7 @@ const columns = computed(() => [ </template> <i18n> -en: - Search suppliers: Search suppliers -es: + es: Search suppliers: Buscar proveedores + Create Supplier: Crear proveedor </i18n> diff --git a/src/pages/Zone/Card/ZoneEventExclusionForm.vue b/src/pages/Zone/Card/ZoneEventExclusionForm.vue index 62cf7cf8d..0882036c1 100644 --- a/src/pages/Zone/Card/ZoneEventExclusionForm.vue +++ b/src/pages/Zone/Card/ZoneEventExclusionForm.vue @@ -67,12 +67,12 @@ const exclusionGeoCreate = async () => { }; const exclusionCreate = async () => { - if (isNew.value || props.event?.type) - await axios.post(`Zones/${route.params.id}/exclusions`, [{ dated: dated }]); - else - await axios.put(`Zones/${route.params.id}/exclusions/${props.event?.id}`, { - dated: dated, - }); + const url = `Zones/${route.params.id}/exclusions`; + const body = { + dated, + }; + if (isNew.value || props.event?.type) await axios.post(`${url}`, [body]); + else await axios.put(`${url}/${props.event?.id}`, body); await refetchEvents(); }; diff --git a/src/pages/Zone/locale/en.yml b/src/pages/Zone/locale/en.yml index a9cd700df..ba4982311 100644 --- a/src/pages/Zone/locale/en.yml +++ b/src/pages/Zone/locale/en.yml @@ -61,6 +61,8 @@ eventsPanel: events: Events everyday: Everyday delete: Delete + deleteTitle: This item will be deleted + deleteSubtitle: Are you sure you want to continue? eventsExclusionForm: addExclusion: Add exclusion editExclusion: Edit exclusion diff --git a/src/pages/Zone/locale/es.yml b/src/pages/Zone/locale/es.yml index c4820a6c0..d0bab83f4 100644 --- a/src/pages/Zone/locale/es.yml +++ b/src/pages/Zone/locale/es.yml @@ -61,6 +61,8 @@ eventsPanel: events: Eventos everyday: Todos los días delete: Eliminar + deleteTitle: Eliminar evento + deleteSubtitle: ¿Seguro que quieres eliminar este evento? eventsExclusionForm: addExclusion: Añadir exclusión editExclusion: Editar exclusión From 280a70a14528878d7ecfe7a277fad68d4a683b34 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Thu, 28 Nov 2024 14:05:04 +0100 Subject: [PATCH 34/40] fix: remove message when setWeigth ticket --- src/i18n/locale/en.yml | 1 + src/pages/Ticket/Card/TicketDescriptorMenu.vue | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml index 3e3df7a0f..e2e0e4238 100644 --- a/src/i18n/locale/en.yml +++ b/src/i18n/locale/en.yml @@ -861,6 +861,7 @@ components: cardDescriptor: mainList: Main list summary: Summary + moreOptions: More options leftMenu: addToPinned: Add to pinned removeFromPinned: Remove from pinned diff --git a/src/pages/Ticket/Card/TicketDescriptorMenu.vue b/src/pages/Ticket/Card/TicketDescriptorMenu.vue index b8e64cb79..60a703f84 100644 --- a/src/pages/Ticket/Card/TicketDescriptorMenu.vue +++ b/src/pages/Ticket/Card/TicketDescriptorMenu.vue @@ -676,7 +676,7 @@ async function uploadDocuware(force) { <VnConfirm ref="weightDialog" :title="t('Set weight')" - :message="t('This ticket may be invoiced, do you want to continue?')" + :message="false" :promise="actions.setWeight" > <template #customHTML> @@ -741,7 +741,6 @@ es: Ticket invoiced: Ticket facturado Set weight: Establecer peso Weight set: Peso establecido - This ticket may be invoiced, do you want to continue?: Es posible que se facture este ticket, desea continuar? invoiceIds: "Se han generado las facturas con los siguientes ids: {invoiceIds}" This ticket will be removed from current route! Continue anyway?: ¡Se eliminará el ticket de la ruta actual! ¿Continuar de todas formas? You are going to delete this ticket: Vas a eliminar este ticket From 67c257ce0eda180dc7a88bd7691797a7f0445d9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= <carlosap@verdnatura.es> Date: Thu, 28 Nov 2024 19:24:13 +0100 Subject: [PATCH 35/40] fix: translations travel --- src/i18n/locale/en.yml | 2 +- src/i18n/locale/es.yml | 2 +- src/pages/Travel/Card/TravelBasicData.vue | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml index e2e0e4238..31a6931a4 100644 --- a/src/i18n/locale/en.yml +++ b/src/i18n/locale/en.yml @@ -766,7 +766,7 @@ travel: thermographs: Thermographs hb: HB basicData: - daysInForward: Days in forward + daysInForward: Automatic movement (Raid) isRaid: Raid thermographs: temperature: Temperature diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml index 58ddc98ef..ccc21e225 100644 --- a/src/i18n/locale/es.yml +++ b/src/i18n/locale/es.yml @@ -760,7 +760,7 @@ travel: thermographs: Termógrafos hb: HB basicData: - daysInForward: Días redada + daysInForward: Desplazamiento automatico (redada) isRaid: Redada thermographs: temperature: Temperatura diff --git a/src/pages/Travel/Card/TravelBasicData.vue b/src/pages/Travel/Card/TravelBasicData.vue index fd02b28cd..4b9aa28ed 100644 --- a/src/pages/Travel/Card/TravelBasicData.vue +++ b/src/pages/Travel/Card/TravelBasicData.vue @@ -104,7 +104,7 @@ const warehousesOptionsIn = ref([]); <i18n> es: - raidDays: Si se marca "Redada", la fecha de entrega se moverá automáticamente los días indicados. + raidDays: El travel se desplaza automáticamente cada día para estar desde hoy al número de días indicado. Si se deja vacio no se moverá en: - raidDays: If "Raid" is checked, the landing date will automatically shift by the specified number of days. + raidDays: The travel adjusts itself daily to match the number of days set, starting from today. If left blank, it won’t move </i18n> From 36de1ad4003c716e94b96f62f710cd39e8ef5ed3 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Fri, 29 Nov 2024 07:27:14 +0100 Subject: [PATCH 36/40] fix(MailForwarding): add try catch --- src/pages/Account/Card/AccountMailForwarding.vue | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/pages/Account/Card/AccountMailForwarding.vue b/src/pages/Account/Card/AccountMailForwarding.vue index aa92e5072..30849d44a 100644 --- a/src/pages/Account/Card/AccountMailForwarding.vue +++ b/src/pages/Account/Card/AccountMailForwarding.vue @@ -41,8 +41,12 @@ const fetchAccountExistence = async () => { }; const fetchMailForwards = async () => { - const response = await axios.get(`MailForwards/${route.params.id}`); - return response.data; + try { + const response = await axios.get(`MailForwards/${route.params.id}`); + return response.data; + } catch { + return null; + } }; const deleteMailForward = async () => { From d364e30cf0a87cb2e311fcaf357be0e7dbf6b565 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Fri, 29 Nov 2024 09:38:58 +0100 Subject: [PATCH 37/40] feat(SupplierAccount): add autoBic when change bankEntity --- src/components/CrudModel.vue | 4 +-- src/components/common/VnSelect.vue | 21 +++++++++++-- src/pages/Supplier/Card/SupplierAccounts.vue | 33 ++++++++++++++++++-- 3 files changed, 50 insertions(+), 8 deletions(-) diff --git a/src/components/CrudModel.vue b/src/components/CrudModel.vue index 1234ce123..b770e591f 100644 --- a/src/components/CrudModel.vue +++ b/src/components/CrudModel.vue @@ -176,8 +176,8 @@ async function saveChanges(data) { const changes = data || getChanges(); try { await axios.post($props.saveUrl || $props.url + '/crud', changes); - } catch (e) { - return (isLoading.value = false); + } finally { + isLoading.value = false; } originalData.value = JSON.parse(JSON.stringify(formData.value)); if (changes.creates?.length) await vnPaginateRef.value.fetch(); diff --git a/src/components/common/VnSelect.vue b/src/components/common/VnSelect.vue index f24f054a5..14005e1cc 100644 --- a/src/components/common/VnSelect.vue +++ b/src/components/common/VnSelect.vue @@ -284,9 +284,9 @@ async function onScroll({ to, direction, from, index }) { :loading="isLoading" @virtual-scroll="onScroll" > - <template v-if="isClearable" #append> + <template #append> <QIcon - v-show="value" + v-show="isClearable && value" name="close" @click.stop=" () => { @@ -299,7 +299,22 @@ async function onScroll({ to, direction, from, index }) { /> </template> <template v-for="(_, slotName) in $slots" #[slotName]="slotData" :key="slotName"> - <slot :name="slotName" v-bind="slotData ?? {}" :key="slotName" /> + <div v-if="slotName == 'append'"> + <QIcon + v-show="isClearable && value" + name="close" + @click.stop=" + () => { + value = null; + emit('remove'); + } + " + class="cursor-pointer" + size="xs" + /> + <slot name="append" v-if="$slots.append" v-bind="slotData ?? {}" /> + </div> + <slot v-else :name="slotName" v-bind="slotData ?? {}" :key="slotName" /> </template> </QSelect> </template> diff --git a/src/pages/Supplier/Card/SupplierAccounts.vue b/src/pages/Supplier/Card/SupplierAccounts.vue index 428ab05c2..c2934830a 100644 --- a/src/pages/Supplier/Card/SupplierAccounts.vue +++ b/src/pages/Supplier/Card/SupplierAccounts.vue @@ -24,13 +24,14 @@ const supplier = ref(null); const supplierAccountRef = ref(null); const wireTransferFk = ref(null); const bankEntitiesOptions = ref([]); +const filteredBankEntitiesOptions = ref([]); const onBankEntityCreated = async (dataSaved, rowData) => { await bankEntitiesRef.value.fetch(); rowData.bankEntityFk = dataSaved.id; }; -const onChangesSaved = () => { +const onChangesSaved = async () => { if (supplier.value.payMethodFk !== wireTransferFk.value) quasar .dialog({ @@ -55,12 +56,35 @@ const setWireTransfer = async () => { await axios.patch(`Suppliers/${route.params.id}`, params); notify('globals.dataSaved', 'positive'); }; + +function findBankFk(value, row) { + row.bankEntityFk = null; + if (!value) return; + + const bankEntityFk = bankEntitiesOptions.value.find((b) => b.id == value.slice(4, 8)); + if (bankEntityFk) row.bankEntityFk = bankEntityFk.id; +} + +function bankEntityFilter(val, update) { + update(() => { + const needle = val.toLowerCase(); + filteredBankEntitiesOptions.value = bankEntitiesOptions.value.filter( + (bank) => + bank.bic.toLowerCase().startsWith(needle) || + bank.name.toLowerCase().includes(needle) + ); + }); +} </script> <template> <FetchData ref="bankEntitiesRef" url="BankEntities" - @on-fetch="(data) => (bankEntitiesOptions = data)" + @on-fetch=" + (data) => { + (bankEntitiesOptions = data), (filteredBankEntitiesOptions = data); + } + " auto-load /> <FetchData @@ -98,6 +122,7 @@ const setWireTransfer = async () => { <VnInput :label="t('supplier.accounts.iban')" v-model="row.iban" + @update:model-value="(value) => findBankFk(value, row)" :required="true" > <template #append> @@ -109,7 +134,9 @@ const setWireTransfer = async () => { <VnSelectDialog :label="t('worker.create.bankEntity')" v-model="row.bankEntityFk" - :options="bankEntitiesOptions" + :options="filteredBankEntitiesOptions" + :default-filter="false" + @filter="(val, update) => bankEntityFilter(val, update)" option-label="bic" option-value="id" hide-selected From f1fc5edac30b753285f25fed6890ce518ec0481f Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Fri, 29 Nov 2024 09:39:42 +0100 Subject: [PATCH 38/40] chore: duplicate isLoading.value = false; --- src/components/CrudModel.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/CrudModel.vue b/src/components/CrudModel.vue index b770e591f..b1c7606e6 100644 --- a/src/components/CrudModel.vue +++ b/src/components/CrudModel.vue @@ -183,7 +183,6 @@ async function saveChanges(data) { if (changes.creates?.length) await vnPaginateRef.value.fetch(); hasChanges.value = false; - isLoading.value = false; emit('saveChanges', data); quasar.notify({ type: 'positive', From 8428c7a20500ccb6b547a3af0d1928b26b530d2b Mon Sep 17 00:00:00 2001 From: guillermo <guillermo@verdnatura.es> Date: Fri, 29 Nov 2024 09:48:09 +0100 Subject: [PATCH 39/40] fix: refs #7920 Changed shelving option value --- src/pages/Ticket/Card/TicketSaleTracking.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/Ticket/Card/TicketSaleTracking.vue b/src/pages/Ticket/Card/TicketSaleTracking.vue index 03e2336eb..7a33df795 100644 --- a/src/pages/Ticket/Card/TicketSaleTracking.vue +++ b/src/pages/Ticket/Card/TicketSaleTracking.vue @@ -471,7 +471,7 @@ const qCheckBoxController = (sale, action) => { url="Shelvings" hide-selected option-label="code" - option-value="code" + option-value="id" v-model="row.shelvingFk" @update:model-value="updateShelving(row)" style="max-width: 120px" From 068b2dc9aa29b873dcd7407ef157bf3123922035 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Fri, 29 Nov 2024 10:36:22 +0100 Subject: [PATCH 40/40] fix: e2e --- test/cypress/integration/vnComponent/vnBreadcrumbs.spec.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/cypress/integration/vnComponent/vnBreadcrumbs.spec.js b/test/cypress/integration/vnComponent/vnBreadcrumbs.spec.js index 3c839c1c7..e996a65d5 100644 --- a/test/cypress/integration/vnComponent/vnBreadcrumbs.spec.js +++ b/test/cypress/integration/vnComponent/vnBreadcrumbs.spec.js @@ -3,6 +3,7 @@ describe('VnBreadcrumbs', () => { const firstCard = '.q-infinite-scroll > :nth-child(1)'; const lastBreadcrumb = '.q-breadcrumbs--last > .q-breadcrumbs__el'; beforeEach(() => { + cy.viewport(1920, 1080); cy.login('developer'); cy.visit('/'); });