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 @@
+
+
+
+ (dmsOptions = data)"
+ />
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+ {{ t('vehicle.dms.import') }}
+
+
+
+
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');
+ });
+});