From f0f6a7e9a305e71be230ce3722f90a272c94df80 Mon Sep 17 00:00:00 2001 From: robert Date: Fri, 22 Nov 2024 14:10:46 +0100 Subject: [PATCH 01/81] feat: refs #6629 addressObservation --- .../components/CustomerAddressEdit.vue | 46 +++++++++++++++---- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/src/pages/Customer/components/CustomerAddressEdit.vue b/src/pages/Customer/components/CustomerAddressEdit.vue index 0ea8315d6..af15962fa 100644 --- a/src/pages/Customer/components/CustomerAddressEdit.vue +++ b/src/pages/Customer/components/CustomerAddressEdit.vue @@ -2,7 +2,7 @@ import { onBeforeMount, ref } from 'vue'; import { useI18n } from 'vue-i18n'; import { useRoute, useRouter } from 'vue-router'; - +import { useQuasar } from 'quasar'; import axios from 'axios'; import VnLocation from 'src/components/common/VnLocation.vue'; import FetchData from 'components/FetchData.vue'; @@ -12,11 +12,12 @@ import VnInput from 'src/components/common/VnInput.vue'; import VnSelect from 'src/components/common/VnSelect.vue'; import VnSelectDialog from 'src/components/common/VnSelectDialog.vue'; import CustomerNewCustomsAgent from 'src/pages/Customer/components/CustomerNewCustomsAgent.vue'; +import VnConfirm from 'components/ui/VnConfirm.vue'; const { t } = useI18n(); const route = useRoute(); const router = useRouter(); - +const quasar = useQuasar(); const urlUpdate = ref(''); const agencyModes = ref([]); const incoterms = ref([]); @@ -27,7 +28,7 @@ let originalNotes = []; const deletes = ref([]); onBeforeMount(() => { - urlUpdate.value = `Clients/${route.params.id}/updateAddress/${route.params.addressId}`; + updateAddress(); }); const getData = async (observations) => { @@ -82,6 +83,14 @@ const deleteNote = (id, index) => { notes.value.splice(index, 1); }; +const updateAddress = () => { + urlUpdate.value = `Clients/${route.params.id}/updateAddress/${route.params.addressId}`; +}; +const resetAndSend = async (payload) => { + await axios.post('AddressObservations/crud', payload); + notes.value = []; + deletes.value = []; +}; const onDataSaved = async () => { let payload = { creates: notes.value.filter((note) => note.$isNew), @@ -100,11 +109,30 @@ const onDataSaved = async () => { where: { id: note.id }, })), }; - - await axios.post('AddressObservations/crud', payload); - notes.value = []; - deletes.value = []; - toCustomerAddress(); + if (payload.updates.length) { + quasar + .dialog({ + component: VnConfirm, + componentProps: { + title: t( + 'Do you also want to modify the states of all the tickets that are about to be served?' + ), + message: t('confirmDeletionMessage'), + }, + }) + .onOk(async () => { + resetAndSend(payload); + updateAddress(payload); + toCustomerAddress(); + }) + .onCancel(async () => { + resetAndSend(payload); + toCustomerAddress(); + }); + // .hide(toCustomerAddress); + } else { + resetAndSend(payload); + } }; const toCustomerAddress = () => { @@ -142,7 +170,7 @@ function handleLocation(data, location) { :observe-form-changes="false" :url-update="urlUpdate" :url="`Addresses/${route.params.addressId}`" - @on-data-saved="onDataSaved()" + @on-data-saved="onDataSaved" auto-load model="client" > From b07286d43dc013b2ea87d85ef0472e7f364f6e86 Mon Sep 17 00:00:00 2001 From: robert Date: Tue, 26 Nov 2024 13:06:41 +0100 Subject: [PATCH 02/81] feat: refs #6629 update --- src/components/FormModel.vue | 4 +- .../components/CustomerAddressEdit.vue | 46 +++++++++++++------ 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue index bfb470c48..75f0648c8 100644 --- a/src/components/FormModel.vue +++ b/src/components/FormModel.vue @@ -207,7 +207,9 @@ async function save() { isLoading.value = true; try { formData.value = trimData(formData.value); - const body = $props.mapper ? $props.mapper(formData.value) : formData.value; + const body = $props.mapper + ? $props.mapper(formData.value, originalData.value) + : formData.value; const method = $props.urlCreate ? 'post' : 'patch'; const url = $props.urlCreate || $props.urlUpdate || $props.url || arrayData.store.url; diff --git a/src/pages/Customer/components/CustomerAddressEdit.vue b/src/pages/Customer/components/CustomerAddressEdit.vue index af15962fa..8e464dd7c 100644 --- a/src/pages/Customer/components/CustomerAddressEdit.vue +++ b/src/pages/Customer/components/CustomerAddressEdit.vue @@ -28,7 +28,7 @@ let originalNotes = []; const deletes = ref([]); onBeforeMount(() => { - updateAddress(); + urlUpdate.value = `Clients/${route.params.id}/updateAddress/${route.params.addressId}`; }); const getData = async (observations) => { @@ -83,16 +83,21 @@ const deleteNote = (id, index) => { notes.value.splice(index, 1); }; -const updateAddress = () => { - urlUpdate.value = `Clients/${route.params.id}/updateAddress/${route.params.addressId}`; +const updateAddress = async () => { + /* await axios.patch( + `Clients/${route.params.id}/updateAddress/${route.params.addressId}?updateObservations=true` + );*/ + urlUpdate.value = `Clients/${route.params.id}/updateAddress/${route.params.addressId}?updateObservations=true`; + + console.log('gg'); }; const resetAndSend = async (payload) => { await axios.post('AddressObservations/crud', payload); notes.value = []; deletes.value = []; }; -const onDataSaved = async () => { - let payload = { +function getPayload() { + return { creates: notes.value.filter((note) => note.$isNew), deletes: deletes.value, updates: notes.value @@ -109,7 +114,17 @@ const onDataSaved = async () => { where: { id: note.id }, })), }; - if (payload.updates.length) { +} +const onDataSaved = async (payload) => { + await axios.post('AddressObservations/crud', payload); + notes.value = []; + deletes.value = []; + toCustomerAddress(); +}; + +async function handleDialog(data) { + console.error(data); + if (getPayload().updates.length) { quasar .dialog({ component: VnConfirm, @@ -121,19 +136,22 @@ const onDataSaved = async () => { }, }) .onOk(async () => { - resetAndSend(payload); - updateAddress(payload); - toCustomerAddress(); + // await resetAndSend(payload); + await updateAddress(); + await onDataSaved(data); }) .onCancel(async () => { - resetAndSend(payload); - toCustomerAddress(); + // await resetAndSend(payload); + await onDataSaved(data); }); // .hide(toCustomerAddress); } else { - resetAndSend(payload); + console.log('sinModificarObservation'); + await onDataSaved(data); + // await resetAndSend(payload); + // toCustomerAddress(); } -}; +} const toCustomerAddress = () => { router.push({ @@ -170,7 +188,7 @@ function handleLocation(data, location) { :observe-form-changes="false" :url-update="urlUpdate" :url="`Addresses/${route.params.addressId}`" - @on-data-saved="onDataSaved" + :save-fn="handleDialog" auto-load model="client" > From 8a0b65998ea2c437a801eb56a88c72fefaa4d7ab Mon Sep 17 00:00:00 2001 From: robert Date: Tue, 26 Nov 2024 13:41:26 +0100 Subject: [PATCH 03/81] feat: refs #6629 customerAddressEdit --- .../components/CustomerAddressEdit.vue | 46 +++++++++++-------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/src/pages/Customer/components/CustomerAddressEdit.vue b/src/pages/Customer/components/CustomerAddressEdit.vue index 8e464dd7c..b403d1012 100644 --- a/src/pages/Customer/components/CustomerAddressEdit.vue +++ b/src/pages/Customer/components/CustomerAddressEdit.vue @@ -83,19 +83,27 @@ const deleteNote = (id, index) => { notes.value.splice(index, 1); }; -const updateAddress = async () => { - /* await axios.patch( - `Clients/${route.params.id}/updateAddress/${route.params.addressId}?updateObservations=true` - );*/ - urlUpdate.value = `Clients/${route.params.id}/updateAddress/${route.params.addressId}?updateObservations=true`; +const updateAddress = async (data) => { + await axios.patch(urlUpdate.value, data); +}; + +const updateAddressTicket = async () => { + urlUpdate.value += '?updateObservations=true'; console.log('gg'); }; -const resetAndSend = async (payload) => { + +const updateObservations = async (payload) => { await axios.post('AddressObservations/crud', payload); notes.value = []; deletes.value = []; + toCustomerAddress(); }; +async function updateAll({ data, payload }) { + console.log('Si no hay notas modificadas'); + await updateAddress(data); + await updateObservations(payload); +} function getPayload() { return { creates: notes.value.filter((note) => note.$isNew), @@ -115,16 +123,12 @@ function getPayload() { })), }; } -const onDataSaved = async (payload) => { - await axios.post('AddressObservations/crud', payload); - notes.value = []; - deletes.value = []; - toCustomerAddress(); -}; async function handleDialog(data) { console.error(data); - if (getPayload().updates.length) { + const payload = getPayload(); + const body = { data, payload }; + if (payload.updates.length) { quasar .dialog({ component: VnConfirm, @@ -136,24 +140,30 @@ async function handleDialog(data) { }, }) .onOk(async () => { + console.log('Actualiza notas'); // await resetAndSend(payload); - await updateAddress(); - await onDataSaved(data); + await updateAll(body); + await updateAddressTicket(); + toCustomerAddress(); }) .onCancel(async () => { // await resetAndSend(payload); - await onDataSaved(data); + console.log('Actualiza datos'); + await updateAll(body); + toCustomerAddress(); }); // .hide(toCustomerAddress); } else { - console.log('sinModificarObservation'); - await onDataSaved(data); + updateAll(body); + toCustomerAddress(); // await resetAndSend(payload); // toCustomerAddress(); } } const toCustomerAddress = () => { + notes.value = []; + deletes.value = []; router.push({ name: 'CustomerAddress', params: { From 632f7bbdeb957b368e9dfa9ee238edca950ad798 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Tue, 10 Dec 2024 15:36:25 +0100 Subject: [PATCH 04/81] feat: refs #7308 remove warning --- src/boot/axios.js | 12 ++++++------ src/composables/useSession.js | 14 +------------- src/router/index.js | 14 +++++++------- src/utils/session.js | 23 +++++++++++++++++++++++ 4 files changed, 37 insertions(+), 26 deletions(-) create mode 100644 src/utils/session.js diff --git a/src/boot/axios.js b/src/boot/axios.js index aee38e887..d71928505 100644 --- a/src/boot/axios.js +++ b/src/boot/axios.js @@ -3,8 +3,8 @@ import { useSession } from 'src/composables/useSession'; import { Router } from 'src/router'; import useNotify from 'src/composables/useNotify.js'; import { useStateQueryStore } from 'src/stores/useStateQueryStore'; +import { getToken, isLoggedIn } from 'src/utils/session'; -const session = useSession(); const { notify } = useNotify(); const stateQuery = useStateQueryStore(); const baseUrl = '/api/'; @@ -13,7 +13,7 @@ axios.defaults.baseURL = baseUrl; const axiosNoError = axios.create({ baseURL: baseUrl }); const onRequest = (config) => { - const token = session.getToken(); + const token = getToken(); if (token.length && !config.headers.Authorization) { config.headers.Authorization = token; } @@ -36,15 +36,15 @@ const onResponse = (response) => { return response; }; -const onResponseError = (error) => { +const onResponseError = async (error) => { stateQuery.remove(error.config); - if (session.isLoggedIn() && error.response?.status === 401) { - session.destroy(false); + if (isLoggedIn() && error.response?.status === 401) { + await useSession().destroy(false); const hash = window.location.hash; const url = hash.slice(1); Router.push(`/login?redirect=${url}`); - } else if (!session.isLoggedIn()) { + } else if (!isLoggedIn()) { return Promise.reject(error); } diff --git a/src/composables/useSession.js b/src/composables/useSession.js index 633a30bb0..e69819a68 100644 --- a/src/composables/useSession.js +++ b/src/composables/useSession.js @@ -6,6 +6,7 @@ import axios from 'axios'; import { useRouter } from 'vue-router'; import useNotify from './useNotify'; import { useTokenConfig } from './useTokenConfig'; +import { getToken, getTokenMultimedia } from 'src/utils/session'; const TOKEN_MULTIMEDIA = 'tokenMultimedia'; const TOKEN = 'token'; @@ -15,19 +16,6 @@ export function useSession() { let isCheckingToken = false; let intervalId = null; - function getToken() { - const localToken = localStorage.getItem(TOKEN); - const sessionToken = sessionStorage.getItem(TOKEN); - - return localToken || sessionToken || ''; - } - function getTokenMultimedia() { - const localTokenMultimedia = localStorage.getItem(TOKEN_MULTIMEDIA); - const sessionTokenMultimedia = sessionStorage.getItem(TOKEN_MULTIMEDIA); - - return localTokenMultimedia || sessionTokenMultimedia || ''; - } - function setSession(data) { let keepLogin = data.keepLogin; const storage = keepLogin ? localStorage : sessionStorage; diff --git a/src/router/index.js b/src/router/index.js index 18541c0b2..f2817f64d 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -1,4 +1,4 @@ -import { route } from 'quasar/wrappers'; +import { route as defineRouter } from 'quasar/wrappers'; import { createRouter, createMemoryHistory, @@ -8,14 +8,13 @@ import { import routes from './routes'; import { i18n } from 'src/boot/i18n'; import { useState } from 'src/composables/useState'; -import { useSession } from 'src/composables/useSession'; import { useRole } from 'src/composables/useRole'; import { useUserConfig } from 'src/composables/useUserConfig'; import { useTokenConfig } from 'src/composables/useTokenConfig'; import { useAcl } from 'src/composables/useAcl'; +import { isLoggedIn } from 'src/utils/session'; +import { useSession } from 'src/composables/useSession'; -const state = useState(); -const session = useSession(); const { t, te } = i18n.global; const createHistory = process.env.SERVER @@ -43,11 +42,12 @@ const Router = createRouter({ * with the Router instance. */ export { Router }; -export default route(function (/* { store, ssrContext } */) { +export default defineRouter(function (/* { store, ssrContext } */) { + const state = useState(); Router.beforeEach(async (to, from, next) => { - const { isLoggedIn } = session; + const session = useSession(); const outLayout = Router.options.routes[0].children.map((r) => r.name); - if (!isLoggedIn() && !outLayout.includes(to.name)) { + if (!session.isLoggedIn() && !outLayout.includes(to.name)) { return next({ name: 'Login', query: { redirect: to.fullPath } }); } diff --git a/src/utils/session.js b/src/utils/session.js new file mode 100644 index 000000000..2a8c6a744 --- /dev/null +++ b/src/utils/session.js @@ -0,0 +1,23 @@ +const TOKEN_MULTIMEDIA = 'tokenMultimedia'; +const TOKEN = 'token'; + +function getToken() { + const localToken = localStorage.getItem(TOKEN); + const sessionToken = sessionStorage.getItem(TOKEN); + + return localToken || sessionToken || ''; +} +function getTokenMultimedia() { + const localTokenMultimedia = localStorage.getItem(TOKEN_MULTIMEDIA); + const sessionTokenMultimedia = sessionStorage.getItem(TOKEN_MULTIMEDIA); + + return localTokenMultimedia || sessionTokenMultimedia || ''; +} +function isLoggedIn() { + const localToken = localStorage.getItem(TOKEN); + const sessionToken = sessionStorage.getItem(TOKEN); + + return !!(localToken || sessionToken); +} + +export { getToken, getTokenMultimedia, isLoggedIn }; From 8b3076640d999df985992624ead8f3859439ed61 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Tue, 10 Dec 2024 15:36:35 +0100 Subject: [PATCH 05/81] test: refs #7308 fix axios.spec.js --- test/vitest/__tests__/boot/axios.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/vitest/__tests__/boot/axios.spec.js b/test/vitest/__tests__/boot/axios.spec.js index 19d396ec5..8818cb645 100644 --- a/test/vitest/__tests__/boot/axios.spec.js +++ b/test/vitest/__tests__/boot/axios.spec.js @@ -21,7 +21,7 @@ describe('Axios boot', () => { describe('onRequest()', async () => { it('should set the "Authorization" property on the headers', async () => { const config = { headers: {} }; - + localStorage.setItem('token', 'DEFAULT_TOKEN'); const resultConfig = onRequest(config); expect(resultConfig).toEqual( From 37a87fa8e1a54fa3d788f5194e2a9f3734e511b7 Mon Sep 17 00:00:00 2001 From: jtubau Date: Fri, 27 Dec 2024 13:45:01 +0100 Subject: [PATCH 06/81] refactor: refs #8316 used VnSection and VnCardBeta --- src/pages/Customer/Card/CustomerCard.vue | 19 +- src/pages/Customer/CustomerList.vue | 147 ++-- src/pages/Customer/locale/en.yml | 2 + src/pages/Customer/locale/es.yml | 4 +- src/router/modules/customer.js | 882 ++++++++++++----------- 5 files changed, 528 insertions(+), 526 deletions(-) diff --git a/src/pages/Customer/Card/CustomerCard.vue b/src/pages/Customer/Card/CustomerCard.vue index 139917d05..f46884834 100644 --- a/src/pages/Customer/Card/CustomerCard.vue +++ b/src/pages/Customer/Card/CustomerCard.vue @@ -1,25 +1,12 @@ + diff --git a/src/pages/Customer/CustomerList.vue b/src/pages/Customer/CustomerList.vue index fdfd7ff9c..d0f533bb1 100644 --- a/src/pages/Customer/CustomerList.vue +++ b/src/pages/Customer/CustomerList.vue @@ -5,18 +5,19 @@ import { useRouter } from 'vue-router'; import { useSummaryDialog } from 'src/composables/useSummaryDialog'; import { toDate } from 'src/filters'; -import RightMenu from 'src/components/common/RightMenu.vue'; import CustomerSummary from './Card/CustomerSummary.vue'; import CustomerFilter from './CustomerFilter.vue'; import VnTable from 'components/VnTable/VnTable.vue'; import VnLocation from 'src/components/common/VnLocation.vue'; -import VnSearchbar from 'components/ui/VnSearchbar.vue'; import VnLinkPhone from 'src/components/ui/VnLinkPhone.vue'; import VnSelectWorker from 'src/components/common/VnSelectWorker.vue'; +import VnSection from 'src/components/common/VnSection.vue'; const { t } = useI18n(); const router = useRouter(); const tableRef = ref(); +const dataKey = 'CustomerList'; + const columns = computed(() => [ { align: 'left', @@ -390,82 +391,86 @@ function handleLocation(data, location) {