diff --git a/cypress.config.js b/cypress.config.js index d9cdbe728..cf9289fdc 100644 --- a/cypress.config.js +++ b/cypress.config.js @@ -44,6 +44,7 @@ export default defineConfig({ supportFile: 'test/cypress/support/index.js', videosFolder: 'test/cypress/videos', downloadsFolder: 'test/cypress/downloads', + tmpUploadFolder: '../salix/storage/tmp/dms', video: false, specPattern: 'test/cypress/integration/**/*.spec.js', experimentalRunAllSpecs: true, diff --git a/src/components/common/VnDms.vue b/src/components/common/VnDms.vue index bee300f4e..8553a92b6 100644 --- a/src/components/common/VnDms.vue +++ b/src/components/common/VnDms.vue @@ -4,6 +4,7 @@ import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; import axios from 'axios'; +import useNotify from 'src/composables/useNotify.js'; import FetchData from 'components/FetchData.vue'; import VnRow from 'components/ui/VnRow.vue'; import VnSelect from 'src/components/common/VnSelect.vue'; @@ -12,6 +13,7 @@ import FormModelPopup from 'components/FormModelPopup.vue'; const route = useRoute(); const { t } = useI18n(); +const { notify } = useNotify(); const emit = defineEmits(['onDataSaved']); const $props = defineProps({ @@ -79,11 +81,16 @@ function getUrl() { } async function save() { - const body = mapperDms(dms.value); - const response = await axios.post(getUrl(), body[0], body[1]); - emit('onDataSaved', body[1].params, response); - delete dms.value.files; - return response; + try { + const body = mapperDms(dms.value); + const response = await axios.post(getUrl(), body[0], body[1]); + emit('onDataSaved', body[1].params, response); + notify(t('globals.dataSaved'), 'positive'); + delete dms.value.files; + return response; + } catch (e) { + throw new Error(e.message); + } } function defaultData() { diff --git a/src/components/common/VnDmsList.vue b/src/components/common/VnDmsList.vue index aafa9f4ba..d1d40ac51 100644 --- a/src/components/common/VnDmsList.vue +++ b/src/components/common/VnDmsList.vue @@ -13,10 +13,12 @@ import VnDms from 'src/components/common/VnDms.vue'; import VnConfirm from 'components/ui/VnConfirm.vue'; import VnInputDate from 'components/common/VnInputDate.vue'; import { useSession } from 'src/composables/useSession'; +import useNotify from 'src/composables/useNotify.js'; const route = useRoute(); const quasar = useQuasar(); const { t } = useI18n(); +const { notify } = useNotify(); const rows = ref([]); const dmsRef = ref(); const formDialog = ref({}); @@ -88,7 +90,6 @@ const dmsFilter = { ], }, }, - where: { [$props.filter]: route.params.id }, }; const columns = computed(() => [ @@ -261,6 +262,7 @@ function deleteDms(dmsFk) { await axios.post(`${$props.deleteModel ?? $props.model}/${dmsFk}/removeFile`); const index = rows.value.findIndex((row) => row.id == dmsFk); rows.value.splice(index, 1); + notify(t('globals.dataDeleted'), 'positive'); }); } @@ -299,6 +301,7 @@ defineExpose({ :url="$props.model" :user-filter="dmsFilter" :order="['dmsFk DESC']" + :filter="{ where: { [$props.filter]: route.params.id } }" auto-load @on-fetch="setData" > diff --git a/src/pages/Route/Vehicle/Card/VehicleDmsImportForm.vue b/src/pages/Route/Vehicle/Card/VehicleDmsImportForm.vue new file mode 100644 index 000000000..2708cd07b --- /dev/null +++ b/src/pages/Route/Vehicle/Card/VehicleDmsImportForm.vue @@ -0,0 +1,62 @@ + + + diff --git a/src/pages/Route/Vehicle/VehicleDms.vue b/src/pages/Route/Vehicle/VehicleDms.vue new file mode 100644 index 000000000..c871877c2 --- /dev/null +++ b/src/pages/Route/Vehicle/VehicleDms.vue @@ -0,0 +1,42 @@ + + diff --git a/src/pages/Route/Vehicle/locale/en.yml b/src/pages/Route/Vehicle/locale/en.yml index c92022f9d..00ef5eae9 100644 --- a/src/pages/Route/Vehicle/locale/en.yml +++ b/src/pages/Route/Vehicle/locale/en.yml @@ -18,3 +18,9 @@ vehicle: params: vehicleTypeFk: Type vehicleStateFk: State + dms: + import: Import from existing + selectDocId: Select document id + document: Document + error: + documentIdEmpty: The document identifier can't be empty diff --git a/src/pages/Route/Vehicle/locale/es.yml b/src/pages/Route/Vehicle/locale/es.yml index c878f97ac..ea7ff4718 100644 --- a/src/pages/Route/Vehicle/locale/es.yml +++ b/src/pages/Route/Vehicle/locale/es.yml @@ -18,3 +18,9 @@ vehicle: params: vehicleTypeFk: Tipo vehicleStateFk: Estado + dms: + import: Importar desde existente + selectDocId: Introduzca id de gestion documental + document: Documento + error: + documentIdEmpty: El número de documento no puede estar vacío diff --git a/src/router/modules/route.js b/src/router/modules/route.js index 62765a49c..921a9a72e 100644 --- a/src/router/modules/route.js +++ b/src/router/modules/route.js @@ -166,7 +166,10 @@ const vehicleCard = { component: () => import('src/pages/Route/Vehicle/Card/VehicleCard.vue'), redirect: { name: 'VehicleSummary' }, meta: { - menu: ['VehicleBasicData'], + menu: [ + 'VehicleBasicData', + 'VehicleDms', + ], }, children: [ { @@ -187,6 +190,15 @@ const vehicleCard = { }, component: () => import('src/pages/Route/Vehicle/Card/VehicleBasicData.vue'), }, + { + name: 'VehicleDms', + path: 'dms', + meta: { + title: 'dms', + icon: 'cloud_upload', + }, + component: () => import('src/pages/Route/Vehicle/VehicleDms.vue'), + }, ], }; diff --git a/test/cypress/integration/route/vehicle/vehicleDms.spec.js b/test/cypress/integration/route/vehicle/vehicleDms.spec.js new file mode 100644 index 000000000..5e22e3507 --- /dev/null +++ b/test/cypress/integration/route/vehicle/vehicleDms.spec.js @@ -0,0 +1,108 @@ +describe('Vehicle DMS', () => { + const getSelector = (btnPosition) => + `tr:last-child > .text-right > .no-wrap > :nth-child(${btnPosition}) > .q-btn > .q-btn__content > .q-icon`; + + const selectors = { + lastRowDownloadBtn: getSelector(1), + lastRowEditBtn: getSelector(2), + lastRowDeleteBtn: getSelector(3), + lastRowReference: 'tr:last-child > :nth-child(5) > .q-tr > :nth-child(1) > span', + firstRowReference: + 'tr:first-child > :nth-child(5) > .q-tr > :nth-child(1) > span', + firstRowId: 'tr:first-child > :nth-child(2) > .q-tr > :nth-child(1) > span', + lastRowWorkerLink: 'tr:last-child > :nth-child(8) > .q-tr > .link', + descriptorTitle: '.descriptor .title', + descriptorGoToSummaryBtn: '.descriptor [data-cy="goToSummaryBtn"]', + summaryTitle: '.summaryHeader', + referenceInput: 'Reference_input', + companySelect: 'Company_select', + warehouseSelect: 'Warehouse_select', + typeSelect: 'Type_select', + fileInput: 'VnDms_inputFile', + importBtn: 'importBtn', + addBtn: 'addButton', + saveFormBtn: 'FormModelPopup_save', + }; + + const data = { + Reference: { val: 'Vehicle:1234-ABC' }, + Company: { val: 'VNL', type: 'select' }, + Warehouse: { val: 'Warehouse One', type: 'select' }, + Type: { val: 'Vehiculos', type: 'select' }, + }; + + const updateData = { + Reference: { val: 'Vehicle:5678-DEF' }, + Company: { val: 'CCs', type: 'select' }, + Warehouse: { val: 'Warehouse Two', type: 'select' }, + Type: { val: 'Facturas Recibidas', type: 'select' }, + }; + + beforeEach(() => { + cy.viewport(1920, 1080); + cy.login('developer'); + cy.visit(`/#/route/vehicle/1/dms`); + }); + + it('should display vehicle DMS', () => { + cy.get('.q-table') + .children() + .should('be.visible') + .should('have.length.greaterThan', 0); + }); + + it('Should create new DMS', () => { + const uploadFolder = Cypress.config('tmpUploadFolder'); + cy.dataCy(selectors.addBtn).click(); + cy.dataCy(selectors.referenceInput).type(`{selectall}${data.Reference.val}`); + cy.dataCy(selectors.fileInput).selectFile('test/cypress/fixtures/image.jpg', { + force: true, + }); + cy.dataCy(selectors.saveFormBtn).click(); + const fileName = 'image.jpg'; + cy.readFile(`${uploadFolder}/${fileName}`).should('exist'); + cy.checkNotification('Data saved'); + }); + + it('Should import DMS', () => { + const data = { + Document: { val: '10', type: 'select' }, + }; + cy.dataCy(selectors.importBtn).click(); + cy.fillInForm(data); + cy.dataCy(selectors.saveFormBtn).click(); + cy.checkNotification('Data created'); + cy.validateContent(selectors.lastRowReference, 'Vehicle:5678-DEF'); + }); + + it('Should edit DMS', () => { + cy.get(selectors.lastRowEditBtn).click(); + cy.fillInForm(updateData); + cy.dataCy(selectors.saveFormBtn).click(); + cy.checkNotification('Data saved'); + cy.validateContent(selectors.lastRowReference, updateData.Reference.val); + }); + + it('Should download DMS', () => { + const downloadsFolder = Cypress.config('downloadsFolder'); + cy.get(selectors.lastRowDownloadBtn).click(); + cy.wait(3000); + + const fileName = '1.txt'; + cy.readFile(`${downloadsFolder}/${fileName}`).should('exist'); + }); + + it('Should delete DMS', () => { + cy.get(selectors.lastRowDeleteBtn).click(); + cy.clickConfirm(); + cy.checkNotification('Data deleted'); + cy.validateContent(selectors.lastRowReference, 'Vehicle:3333-BAT'); + }); + + it('Should redirect to worker summary from worker descriptor pop-up', () => { + cy.get(selectors.lastRowWorkerLink).click(); + cy.get(selectors.descriptorTitle).should('contain', 'administrative'); + cy.get(selectors.descriptorGoToSummaryBtn).click(); + cy.containContent(selectors.summaryTitle, 'administrative'); + }); +});