diff --git a/Jenkinsfile b/Jenkinsfile index a9db9d369..59bf09e22 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -125,7 +125,7 @@ pipeline { sh "docker-compose ${env.COMPOSE_PARAMS} pull db" sh "docker-compose ${env.COMPOSE_PARAMS} up -d" - def modules = sh(script: 'node test/cypress/docker/find/find.js', returnStdout: true).trim() + def modules = sh(script: "node test/cypress/docker/find/find.js ${env.COMPOSE_TAG}", returnStdout: true).trim() echo "E2E MODULES: ${modules}" image.inside("--network ${env.COMPOSE_PROJECT}_default -e CI -e TZ --init") { sh "sh test/cypress/docker/cypressParallel.sh 1 '${modules}'" diff --git a/src/components/FilterTravelForm.vue b/src/components/FilterTravelForm.vue index 4aad327b2..f2a7a09eb 100644 --- a/src/components/FilterTravelForm.vue +++ b/src/components/FilterTravelForm.vue @@ -156,6 +156,9 @@ const selectTravel = ({ id }) => { option-label="name" option-value="id" v-model="travelFilterParams.warehouseOutFk" + :where="{ + isOrigin: true, + }" /> { option-label="name" option-value="id" v-model="travelFilterParams.warehouseInFk" + :where="{ + isDestiny: true, + }" /> { url="Warehouses" @on-fetch="(data) => (warehousesOptions = data)" auto-load + :where="{ + isInventory: true, + }" /> ({}), }, + multiCheck: { + type: Object, + default: () => ({}), + }, crudModel: { type: Object, default: () => ({}), @@ -157,6 +162,7 @@ const CARD_MODE = 'card'; const TABLE_MODE = 'table'; const mode = ref(CARD_MODE); const selected = ref([]); +const selectAll = ref(false); const hasParams = ref(false); const CrudModelRef = ref({}); const showForm = ref(false); @@ -195,10 +201,10 @@ const onVirtualScroll = ({ to }) => { handleScroll(); const virtualScrollContainer = tableRef.value?.$el?.querySelector('.q-table__middle'); if (virtualScrollContainer) { - virtualScrollContainer.dispatchEvent(new CustomEvent('scroll')); - if (vnScrollRef.value) { - vnScrollRef.value.updateScrollContainer(virtualScrollContainer); - } + virtualScrollContainer.dispatchEvent(new CustomEvent('scroll')); + if (vnScrollRef.value) { + vnScrollRef.value.updateScrollContainer(virtualScrollContainer); + } } }; @@ -208,7 +214,7 @@ onBeforeMount(() => { }); onMounted(async () => { - if ($props.isEditable) document.addEventListener('click', clickHandler); + if ($props.isEditable) document.addEventListener('mousedown', mousedownHandler); mode.value = quasar.platform.is.mobile && !$props.disableOption?.card ? CARD_MODE @@ -231,7 +237,7 @@ onMounted(async () => { }); onUnmounted(async () => { - if ($props.isEditable) document.removeEventListener('click', clickHandler); + if ($props.isEditable) document.removeEventListener('mousedown', mousedownHandler); }); watch( @@ -341,11 +347,11 @@ function handleOnDataSaved(_) { else $props.create.onDataSaved(_); } function handleScroll() { - if ($props.crudModel.disableInfiniteScroll) return; - const tMiddle = tableRef.value.$el.querySelector('.q-table__middle'); - const { scrollHeight, scrollTop, clientHeight } = tMiddle; - const isAtBottom = Math.abs(scrollHeight - scrollTop - clientHeight) <= 40; - if (isAtBottom) CrudModelRef.value.vnPaginateRef.paginate(); + if ($props.crudModel.disableInfiniteScroll) return; + const tMiddle = tableRef.value.$el.querySelector('.q-table__middle'); + const { scrollHeight, scrollTop, clientHeight } = tMiddle; + const isAtBottom = Math.abs(scrollHeight - scrollTop - clientHeight) <= 40; + if (isAtBottom) CrudModelRef.value.vnPaginateRef.paginate(); } function handleSelection({ evt, added, rows: selectedRows }, rows) { if (evt?.shiftKey && added) { @@ -379,7 +385,7 @@ function hasEditableFormat(column) { if (isEditableColumn(column)) return 'editable-text'; } -const clickHandler = async (event) => { +const mousedownHandler = async (event) => { const clickedElement = event.target.closest('td'); const isDateElement = event.target.closest('.q-date'); const isTimeElement = event.target.closest('.q-time'); @@ -402,6 +408,7 @@ const clickHandler = async (event) => { } if (isEditableColumn(column)) { + event.preventDefault(); await renderInput(Number(rowIndex), colField, clickedElement); } }; @@ -638,6 +645,23 @@ const rowCtrlClickFunction = computed(() => { }; return () => {}; }); +const handleMultiCheck = (value) => { + if (value) { + selected.value = tableRef.value.rows; + } else { + selected.value = []; + } + emit('update:selected', selected.value); +}; + +const handleSelectedAll = (data) => { + if (data) { + selected.value = data; + } else { + selected.value = []; + } + emit('update:selected', selected.value); +}; - diff --git a/src/components/common/VnBankDetailsForm.vue b/src/components/common/VnBankDetailsForm.vue new file mode 100644 index 000000000..4e13a4d86 --- /dev/null +++ b/src/components/common/VnBankDetailsForm.vue @@ -0,0 +1,93 @@ + + diff --git a/src/components/common/VnCard.vue b/src/components/common/VnCard.vue index 0b9cc2cce..fb3ece207 100644 --- a/src/components/common/VnCard.vue +++ b/src/components/common/VnCard.vue @@ -33,7 +33,7 @@ onBeforeRouteLeave(() => { }); onBeforeMount(async () => { - stateStore.cardDescriptorChangeValue(markRaw(props.descriptor)); + if (props.visual) stateStore.cardDescriptorChangeValue(markRaw(props.descriptor)); const route = router.currentRoute.value; try { diff --git a/src/components/common/VnDmsList.vue b/src/components/common/VnDmsList.vue index 345870aa4..d175a4167 100644 --- a/src/components/common/VnDmsList.vue +++ b/src/components/common/VnDmsList.vue @@ -4,6 +4,7 @@ import { useI18n } from 'vue-i18n'; import { useRoute } from 'vue-router'; import { useQuasar, QCheckbox, QBtn, QInput } from 'quasar'; import axios from 'axios'; +import { usePrintService } from 'composables/usePrintService'; import VnUserLink from '../ui/VnUserLink.vue'; import { downloadFile } from 'src/composables/downloadFile'; @@ -23,6 +24,7 @@ const rows = ref([]); const dmsRef = ref(); const formDialog = ref({}); const token = useSession().getTokenMultimedia(); +const { openReport } = usePrintService(); const $props = defineProps({ model: { @@ -199,12 +201,7 @@ const columns = computed(() => [ color: 'primary', }), click: (prop) => - downloadFile( - prop.row.id, - $props.downloadModel, - undefined, - prop.row.download, - ), + openReport(`dms/${prop.row.id}/downloadFile`, {}, '_blank'), }, { component: QBtn, diff --git a/src/components/common/VnInputBic.vue b/src/components/common/VnInputBic.vue deleted file mode 100644 index b29644912..000000000 --- a/src/components/common/VnInputBic.vue +++ /dev/null @@ -1,44 +0,0 @@ - - diff --git a/src/components/common/VnLog.vue b/src/components/common/VnLog.vue index 7020c8489..6e9128a43 100644 --- a/src/components/common/VnLog.vue +++ b/src/components/common/VnLog.vue @@ -1,5 +1,5 @@ + + + +en: + Select all: 'Select all ({rows})' +fr: + Select all: 'Sélectionner tout ({rows})' +es: + Select all: 'Seleccionar todo ({rows})' +de: + Select all: 'Alle auswählen ({rows})' +it: + Select all: 'Seleziona tutto ({rows})' +pt: + Select all: 'Selecionar tudo ({rows})' + diff --git a/src/components/common/VnSelect.vue b/src/components/common/VnSelect.vue index 70167229a..97fec882c 100644 --- a/src/components/common/VnSelect.vue +++ b/src/components/common/VnSelect.vue @@ -370,7 +370,6 @@ function getCaption(opt) { hide-bottom-space :input-debounce="useURL ? '300' : '0'" :loading="someIsLoading" - :disable="someIsLoading" @virtual-scroll="onScroll" @popup-hide="isMenuOpened = false" @popup-show="isMenuOpened = true" diff --git a/src/components/common/__tests__/VnBankDetailsForm.spec.js b/src/components/common/__tests__/VnBankDetailsForm.spec.js new file mode 100644 index 000000000..9d6ade902 --- /dev/null +++ b/src/components/common/__tests__/VnBankDetailsForm.spec.js @@ -0,0 +1,43 @@ +import { createWrapper } from 'app/test/vitest/helper'; +import VnBankDetailsForm from 'components/common/VnBankDetailsForm.vue'; +import { vi, afterEach, expect, it, beforeEach, describe } from 'vitest'; + +describe('VnBankDetail Component', () => { + let vm; + let wrapper; + const bankEntities = [ + { id: 2100, bic: 'CAIXESBBXXX', name: 'CaixaBank' }, + { id: 1234, bic: 'TESTBIC', name: 'Test Bank' }, + ]; + const correctIban = 'ES6621000418401234567891'; + + beforeAll(() => { + wrapper = createWrapper(VnBankDetailsForm, { + $props: { + iban: null, + bankEntityFk: null, + disableElement: false, + }, + }); + vm = wrapper.vm; + wrapper = wrapper.wrapper; + }); + + afterEach(() => { + vi.clearAllMocks(); + }); + + it('should update bankEntityFk when IBAN exists in bankEntities', async () => { + vm.bankEntities = bankEntities; + + await vm.autofillBic(correctIban); + expect(vm.bankEntityFk).toBe(2100); + }); + + it('should set bankEntityFk to null when IBAN bank code is not found', async () => { + vm.bankEntities = bankEntities; + + await vm.autofillBic('ES1234567891324567891234'); + expect(vm.bankEntityFk).toBe(null); + }); +}); diff --git a/src/components/ui/EntityDescriptor.vue b/src/components/ui/EntityDescriptor.vue index 751a6bd9c..e4baabe34 100644 --- a/src/components/ui/EntityDescriptor.vue +++ b/src/components/ui/EntityDescriptor.vue @@ -1,8 +1,6 @@