diff --git a/CHANGELOG.md b/CHANGELOG.md index 555b4f0ba..9f493764a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +### Fixed + +- (General) => Se vuelven a mostrar los parĂ¡metros en la url al aplicar un filtro + ## [2414.01] - 2024-04-04 ### Added diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue index 8787371bc..a7af0044b 100644 --- a/src/components/FormModel.vue +++ b/src/components/FormModel.vue @@ -101,16 +101,16 @@ onMounted(async () => { }); onBeforeRouteLeave((to, from, next) => { - if (!hasChanges.value) next(); - - quasar.dialog({ - component: VnConfirm, - componentProps: { - title: t('Unsaved changes will be lost'), - message: t('Are you sure exit without saving?'), - promise: () => next(), - }, - }); + if (hasChanges.value) + quasar.dialog({ + component: VnConfirm, + componentProps: { + title: t('Unsaved changes will be lost'), + message: t('Are you sure exit without saving?'), + promise: () => next(), + }, + }); + else next(); }); onUnmounted(() => { diff --git a/src/components/common/VnCurrency.vue b/src/components/common/VnCurrency.vue index 660c4e979..b892e5012 100644 --- a/src/components/common/VnCurrency.vue +++ b/src/components/common/VnCurrency.vue @@ -5,7 +5,7 @@ import { useCapitalize } from 'src/composables/useCapitalize'; import VnInput from 'src/components/common/VnInput.vue'; const props = defineProps({ - modelValue: { type: String, default: '' }, + modelValue: { type: [String, Number], default: '' }, }); const { t } = useI18n(); diff --git a/src/composables/useArrayData.js b/src/composables/useArrayData.js index b6b81f2d5..2c5a579c8 100644 --- a/src/composables/useArrayData.js +++ b/src/composables/useArrayData.js @@ -1,5 +1,5 @@ import { onMounted, ref, computed } from 'vue'; -import { useRouter, useRoute } from 'vue-router'; +import { useRoute } from 'vue-router'; import axios from 'axios'; import { useArrayDataStore } from 'stores/useArrayDataStore'; import { buildFilter } from 'filters/filterPanel'; @@ -15,7 +15,6 @@ export function useArrayData(key, userOptions) { const store = arrayDataStore.get(key); const hasMoreData = ref(false); - const router = useRouter(); const route = useRoute(); let canceller = null; @@ -105,7 +104,7 @@ export function useArrayData(key, userOptions) { for (const row of response.data) store.data.push(row); } else { store.data = response.data; - if (!document.querySelectorAll('[role="dialog"]')) + if (!document.querySelectorAll('[role="dialog"]').length) updateRouter && updateStateParams(); } @@ -188,11 +187,15 @@ export function useArrayData(key, userOptions) { if (store.userParams && Object.keys(store.userParams).length !== 0) query.params = JSON.stringify(store.userParams); - if (router) - router.replace({ - path: route.path, - query: query, - }); + const url = new URL(window.location.href); + const { hash: currentHash } = url; + const [currentRoute] = currentHash.split('?'); + + const params = new URLSearchParams(); + for (const param in query) params.append(param, query[param]); + + url.hash = currentRoute + '?' + params.toString(); + window.history.pushState({}, '', url.hash); } const totalRows = computed(() => (store.data && store.data.length) || 0); diff --git a/test/cypress/integration/vnSearchBar.spec.js b/test/cypress/integration/vnSearchBar.spec.js index 3db789773..f1f3a9e82 100644 --- a/test/cypress/integration/vnSearchBar.spec.js +++ b/test/cypress/integration/vnSearchBar.spec.js @@ -36,7 +36,7 @@ describe('VnSearchBar', () => { const checkCardListAndUrl = (expectedLength) => { cy.get(cardList).then(($cardList) => { expect($cardList.find('.q-card').length).to.equal(expectedLength); - cy.url().then((currentUrl) => expect(currentUrl).to.equal(url)); + cy.url().then((currentUrl) => expect(currentUrl).to.contain(url)); }); }; }); diff --git a/test/vitest/__tests__/composables/useArrayData.spec.js b/test/vitest/__tests__/composables/useArrayData.spec.js new file mode 100644 index 000000000..ae0ca7368 --- /dev/null +++ b/test/vitest/__tests__/composables/useArrayData.spec.js @@ -0,0 +1,31 @@ +import { describe, expect, it, beforeAll } from 'vitest'; +import { axios } from 'app/test/vitest/helper'; +import { useArrayData } from 'composables/useArrayData'; + +describe('useArrayData', () => { + let arrayData; + beforeAll(() => { + axios.get.mockResolvedValue({ data: [] }); + arrayData = useArrayData('InvoiceIn', { url: 'invoice-in/list' }); + Object.defineProperty(window.location, 'href', { + writable: true, + value: 'localhost:9000/invoice-in/list', + }); + + // Mock the window.history.pushState method within useArrayData + window.history.pushState = (data, title, url) => (window.location.href = url); + + // Mock the URL constructor within useArrayData + global.URL = class URL { + constructor(url) { + this.hash = url.split('localhost:9000/')[1]; + } + }; + }); + + it('should add the params to the url', async () => { + arrayData.store.userParams = { supplierFk: 2 }; + arrayData.updateStateParams(); + expect(window.location.href).contain('params=%7B%22supplierFk%22%3A2%7D'); + }); +});