From ac8e9cbfd25e2391627943e0ab50990438886b87 Mon Sep 17 00:00:00 2001 From: jtubau Date: Wed, 29 Jan 2025 12:43:02 +0100 Subject: [PATCH 01/31] refactor: refs #7414 update VnLog component to change display order value changes on update action --- src/components/common/VnLog.vue | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/components/common/VnLog.vue b/src/components/common/VnLog.vue index fdf2e52ee..d1d8d8360 100644 --- a/src/components/common/VnLog.vue +++ b/src/components/common/VnLog.vue @@ -641,16 +641,7 @@ watch( > {{ prop.nameI18n }}: - - - #{{ prop.val.id }} - - - ← - #{{ prop.old.id }} + + → + + + #{{ prop.val.id }} + From 3172ce8cecad5659239f2c7f66e4f86f43dff21b Mon Sep 17 00:00:00 2001 From: jtubau Date: Mon, 10 Feb 2025 09:40:43 +0100 Subject: [PATCH 02/31] fix: refs #7414 updated default value rendering for non-update scenarios --- src/components/common/VnLog.vue | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/components/common/VnLog.vue b/src/components/common/VnLog.vue index a90766c84..5a70edf6c 100644 --- a/src/components/common/VnLog.vue +++ b/src/components/common/VnLog.vue @@ -641,24 +641,20 @@ watch( > {{ prop.nameI18n }}: - - - #{{ prop.old.id }} - + + + #{{ prop.old.id }} + - - #{{ prop.val.id }} + + #{{ prop.val.id }} + + + + #{{ prop.old.id }} From 12aeb63f27ad9e10e844a55a8bee4b5396db249e Mon Sep 17 00:00:00 2001 From: jtubau Date: Wed, 12 Feb 2025 12:27:57 +0100 Subject: [PATCH 03/31] fix: refs #7414 update VnLog.vue to correctly display log actions and values --- src/components/common/VnLog.vue | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/components/common/VnLog.vue b/src/components/common/VnLog.vue index a90766c84..8f106a9f1 100644 --- a/src/components/common/VnLog.vue +++ b/src/components/common/VnLog.vue @@ -641,7 +641,8 @@ watch( > {{ prop.nameI18n }}: - + #{{ prop.old.id }} - → - - - #{{ prop.val.id }} + + + #{{ prop.val.id }} + + + + #{{ prop.old.id }} From 5fc221b52c7bd16987355fc1bf81181453de2f28 Mon Sep 17 00:00:00 2001 From: jtubau Date: Fri, 21 Feb 2025 09:11:09 +0100 Subject: [PATCH 04/31] test: refs #8620 add RouteAutonomous e2e test --- .../integration/route/routeAutonomous.spec.js | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 test/cypress/integration/route/routeAutonomous.spec.js diff --git a/test/cypress/integration/route/routeAutonomous.spec.js b/test/cypress/integration/route/routeAutonomous.spec.js new file mode 100644 index 000000000..acf82bd95 --- /dev/null +++ b/test/cypress/integration/route/routeAutonomous.spec.js @@ -0,0 +1,121 @@ +describe('RouteAutonomous', () => { + const getLinkSelector = (colField) => + `tr:first-child > [data-col-field="${colField}"] > .no-padding > .link`; + + const selectors = { + reference: 'Reference_input', + date: 'tr:first-child > [data-col-field="dated"]', + total: '.value > .text-h6', + received: getLinkSelector('invoiceInFk'), + autonomous: getLinkSelector('supplierName'), + firstRowCheckbox: '.q-virtual-scroll__content tr:first-child .q-checkbox__bg', + secondRowCheckbox: '.q-virtual-scroll__content tr:nth-child(2) .q-checkbox__bg', + createInvoiceBtn: '.q-card > .q-btn', + saveFormBtn: 'FormModelPopup_save', + summaryIcon: 'tableAction-0', + summaryPopupBtn: '.header > :nth-child(2) > .q-btn__content > .q-icon', + summaryHeader: '.summaryHeader > :nth-child(2)', + descriptorHeader: '.summaryHeader > div', + descriptorTitle: '.q-item__label--header > .title > span', + summaryGoToSummaryBtn: '.header > .q-icon', + descriptorGoToSummaryBtn: '.descriptor > .header > a[href] > .q-btn', + }; + + const data = { + reference: 'Test invoice', + total: '€206.40', + supplier: 'PLANTS SL', + route: 'first route', + }; + + const summaryUrl = '/summary'; + const dataSaved = 'Data saved'; + + beforeEach(() => { + cy.viewport(1920, 1080); + cy.login('developer'); + cy.visit(`/#/route/agency-term`); + cy.typeSearchbar('{enter}'); + }); + + it('Should list autonomous routes', () => { + cy.get('.q-table') + .children() + .should('be.visible') + .should('have.length.greaterThan', 0); + }); + + it('Should create invoice in to selected route', () => { + cy.get(selectors.firstRowCheckbox).click(); + cy.get(selectors.createInvoiceBtn).click(); + cy.dataCy(selectors.reference).type(data.reference); + cy.get('.q-file').selectFile('test/cypress/fixtures/image.jpg', { + force: true, + }); + cy.dataCy(selectors.saveFormBtn).click(); + cy.checkNotification(dataSaved); + cy.typeSearchbar('{enter}'); + }); + + it('Should display the total price of the selected rows', () => { + cy.get(selectors.firstRowCheckbox).click(); + cy.get(selectors.secondRowCheckbox).click(); + cy.validateContent(selectors.total, data.total); + }); + + it('Should redirect to the summary when clicking a route', () => { + cy.get(selectors.date).click(); + cy.get(selectors.summaryHeader).should('contain', data.route); + cy.url().should('include', summaryUrl); + }); + + describe('Received pop-ups', () => { + it('Should redirect to invoice in summary from the received descriptor pop-up', () => { + cy.get(selectors.received).click(); + cy.validateContent(selectors.descriptorTitle, data.reference); + cy.get(selectors.descriptorGoToSummaryBtn).click(); + cy.get(selectors.descriptorHeader).should('contain', data.supplier); + cy.url().should('include', summaryUrl); + }); + + it('Should redirect to the invoiceIn summary from summary pop-up from the received descriptor pop-up', () => { + cy.get(selectors.received).click(); + cy.validateContent(selectors.descriptorTitle, data.reference); + cy.get(selectors.summaryPopupBtn).click(); + cy.get(selectors.descriptorHeader).should('contain', data.supplier); + cy.get(selectors.summaryGoToSummaryBtn).click(); + cy.get(selectors.descriptorHeader).should('contain', data.supplier); + cy.url().should('include', summaryUrl); + }); + }); + + describe('Autonomous pop-ups', () => { + it('Should redirect to the supplier summary from the received descriptor pop-up', () => { + cy.get(selectors.autonomous).click(); + cy.validateContent(selectors.descriptorTitle, data.supplier); + cy.get(selectors.descriptorGoToSummaryBtn).click(); + cy.get(selectors.summaryHeader).should('contain', data.supplier); + cy.url().should('include', summaryUrl); + }); + + it('Should redirect to the supplier summary from summary pop-up from the autonomous descriptor pop-up', () => { + cy.get(selectors.autonomous).click(); + cy.get(selectors.descriptorTitle).should('contain', data.supplier); + cy.get(selectors.summaryPopupBtn).click(); + cy.get(selectors.summaryHeader).should('contain', data.supplier); + cy.get(selectors.summaryGoToSummaryBtn).click(); + cy.get(selectors.summaryHeader).should('contain', data.supplier); + cy.url().should('include', summaryUrl); + }); + }); + + describe('Route pop-ups', () => { + it('Should redirect to the summary from the route summary pop-up', () => { + cy.dataCy(selectors.summaryIcon).first().click(); + cy.get(selectors.summaryHeader).should('contain', data.route); + cy.get(selectors.summaryGoToSummaryBtn).click(); + cy.get(selectors.summaryHeader).should('contain', data.route); + cy.url().should('include', summaryUrl); + }); + }); +}); From 9e1ab1028d76bbd13bdfcc4b7c58bf1d885e78f1 Mon Sep 17 00:00:00 2001 From: jtubau Date: Fri, 21 Feb 2025 09:11:55 +0100 Subject: [PATCH 05/31] fix: refs #8620 add module name to InvoiceInSummary --- src/pages/InvoiceIn/Card/InvoiceInSummary.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/InvoiceIn/Card/InvoiceInSummary.vue b/src/pages/InvoiceIn/Card/InvoiceInSummary.vue index d358601d3..18602f043 100644 --- a/src/pages/InvoiceIn/Card/InvoiceInSummary.vue +++ b/src/pages/InvoiceIn/Card/InvoiceInSummary.vue @@ -185,6 +185,7 @@ const getLink = (param) => `#/invoice-in/${entityId.value}/${param}`; data-key="InvoiceInSummary" :url="`InvoiceIns/${entityId}/summary`" @on-fetch="(data) => init(data)" + module-name="InvoiceIn" > From faa245899708a0cb01b06b532d400b11b6b8243e Mon Sep 17 00:00:00 2001 From: jtubau Date: Fri, 21 Feb 2025 12:02:38 +0100 Subject: [PATCH 07/31] test: refs #8594 add vehicle summary component and integration tests for vehicle list functionality --- .../Route/Vehicle/Card/VehicleSummary.vue | 7 ++- .../route/vehicle/vehicleList.spec.js | 58 +++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 test/cypress/integration/route/vehicle/vehicleList.spec.js diff --git a/src/pages/Route/Vehicle/Card/VehicleSummary.vue b/src/pages/Route/Vehicle/Card/VehicleSummary.vue index 981870cb2..e4b0a9497 100644 --- a/src/pages/Route/Vehicle/Card/VehicleSummary.vue +++ b/src/pages/Route/Vehicle/Card/VehicleSummary.vue @@ -22,7 +22,12 @@ const links = { }; diff --git a/src/pages/Item/Card/ItemLastEntries.vue b/src/pages/Item/Card/ItemLastEntries.vue index 7d8890c2b..1eaaa931f 100644 --- a/src/pages/Item/Card/ItemLastEntries.vue +++ b/src/pages/Item/Card/ItemLastEntries.vue @@ -11,7 +11,6 @@ import { toCurrency } from 'filters/index'; import { useArrayData } from 'composables/useArrayData'; import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue'; import SupplierDescriptorProxy from 'src/pages/Supplier/Card/SupplierDescriptorProxy.vue'; - const { t } = useI18n(); const route = useRoute(); const from = ref(); @@ -41,7 +40,7 @@ const itemLastEntries = ref([]); const columns = computed(() => [ { - label: 'Nv', + label: 'NV', name: 'ig', align: 'center', }, @@ -70,6 +69,7 @@ const columns = computed(() => [ field: 'reference', align: 'center', format: (_, row) => toCurrency(row.price2) + ' / ' + toCurrency(row.price3), + style: (row) => highlightedRow(row), }, { label: t('lastEntries.printedStickers'), @@ -84,6 +84,7 @@ const columns = computed(() => [ field: 'stickers', align: 'center', format: (val) => dashIfEmpty(val), + style: (row) => highlightedRow(row), }, { label: 'Packing', @@ -102,12 +103,14 @@ const columns = computed(() => [ name: 'stems', field: 'stems', align: 'center', + style: (row) => highlightedRow(row), }, { label: t('lastEntries.quantity'), name: 'quantity', field: 'quantity', align: 'center', + style: (row) => highlightedRow(row), }, { label: t('lastEntries.cost'), @@ -120,12 +123,14 @@ const columns = computed(() => [ name: 'weight', field: 'weight', align: 'center', + style: (row) => highlightedRow(row), }, { label: t('lastEntries.cube'), name: 'cube', field: 'packagingFk', align: 'center', + style: (row) => highlightedRow(row), }, { label: t('lastEntries.supplier'), @@ -203,11 +208,28 @@ onMounted(async () => { if (nTo && nTo != oTo) nTo = getDate(new Date(nTo), 'to'); updateFilter(); }); + + const rows = document.querySelectorAll('tr'); + console.log('rows: ', rows); + rows.forEach((row) => { + const td = row.querySelector('td[data-is-inventory="1"]'); + if (td) { + row.classList.add('inventory-row'); + } + }); }); function getBadgeClass(groupingMode, expectedGrouping) { return groupingMode === expectedGrouping ? 'accent-badge' : 'simple-badge'; } + +function highlightedRow(row) { + return row?.isInventorySupplier + ? { + 'background-color': 'var(--vn-section-hover-color)', + } + : ''; +}