From 91f317dfe67b87bdf860dbf485e8c53f72e559f9 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Tue, 11 Feb 2025 23:31:43 +0100 Subject: [PATCH 001/138] style: refs #7347 updates --- src/css/app.scss | 8 +- .../Supplier/Card/SupplierConsumption.vue | 332 +++++++++++++++--- src/pages/Zone/ZoneUpcoming.vue | 26 +- 3 files changed, 310 insertions(+), 56 deletions(-) diff --git a/src/css/app.scss b/src/css/app.scss index 2a60830bf..4c4a556a7 100644 --- a/src/css/app.scss +++ b/src/css/app.scss @@ -320,8 +320,12 @@ input::-webkit-inner-spin-button { .q-item > .q-item__section:has(.q-checkbox) { max-width: fit-content; } - -.row > .column:has(.q-checkbox) { +.vn-row > * .q-checkbox r { + min-width: 80%; + display: flex; + justify-content: space-between; +} +.vn-row > .q-checkbox.row.items-center { max-width: fit-content; } .q-field__inner { diff --git a/src/pages/Supplier/Card/SupplierConsumption.vue b/src/pages/Supplier/Card/SupplierConsumption.vue index 718de95dd..25ac773f0 100644 --- a/src/pages/Supplier/Card/SupplierConsumption.vue +++ b/src/pages/Supplier/Card/SupplierConsumption.vue @@ -8,8 +8,9 @@ import SendEmailDialog from 'components/common/SendEmailDialog.vue'; import SupplierConsumptionFilter from './SupplierConsumptionFilter.vue'; import ItemDescriptorProxy from 'src/pages/Item/Card/ItemDescriptorProxy.vue'; -import { dateRange, toDate } from 'src/filters'; -import { dashIfEmpty } from 'src/filters'; +import { dateRange, toCurrency, toDate } from 'src/filters'; + +import EntryDescriptorProxy from 'src/pages/Entry/Card/EntryDescriptorProxy.vue'; import { usePrintService } from 'composables/usePrintService'; import useNotify from 'src/composables/useNotify.js'; import axios from 'axios'; @@ -31,7 +32,81 @@ const arrayData = useArrayData('SupplierConsumption', { order: ['itemTypeFk', 'itemName', 'itemSize'], userFilter: { where: { supplierFk: route.params.id } }, }); +const headerColumns = computed(() => [ + { + name: 'id', + label: t('globals.entry'), + align: 'left', + field: 'id', + sortable: true, + }, + { + name: 'invoiceNumber', + label: t('globals.subItem'), + align: 'left', + field: 'invoiceNumber', + sortable: true, + }, + { + name: 'quantity', + label: t('globals.quantity'), + align: 'left', + field: 'quantity', + sortable: true, + }, + { + name: 'total', + label: t('globals.quantity'), + align: 'left', + field: 'total', + sortable: true, + }, + { + name: 'shipped', + label: t('globals.quantity'), + align: 'left', + field: 'shipped', + sortable: true, + }, +]); +const columns = computed(() => [ + { + name: 'itemName', + label: t('globals.item'), + align: 'left', + field: 'itemName', + sortable: true, + }, + { + name: 'subName', + label: t('globals.subItem'), + align: 'left', + field: 'subName', + sortable: true, + }, + { + name: 'quantity', + label: t('globals.quantity'), + align: 'left', + field: 'quantity', + sortable: true, + }, + { + name: 'price', + label: t('globals.price'), + align: 'left', + field: 'price', + sortable: true, + }, + { + name: 'total', + label: t('globals.total'), + align: 'left', + field: 'total', + sortable: true, + }, +]); const store = arrayData.store; onUnmounted(() => state.unset('SupplierConsumption')); @@ -122,13 +197,17 @@ const totalEntryPrice = (rows) => { totalQuantity = totalQuantity + quantity; } totalRows.value = { totalPrice, totalQuantity }; + // expanded.value = rows.map((r) => r.id); return rows; }; - +const tableRef = ref(null); onMounted(async () => { stateStore.rightDrawer = true; await getSupplierConsumptionData(); }); + +const expanded = ref([]); +// const initialExpanded = rows.filter((r, i) => i % 3 === 0).map((r) => r.index); - - + diff --git a/src/pages/Zone/ZoneUpcoming.vue b/src/pages/Zone/ZoneUpcoming.vue index c74ae6078..1b5ed87cf 100644 --- a/src/pages/Zone/ZoneUpcoming.vue +++ b/src/pages/Zone/ZoneUpcoming.vue @@ -61,11 +61,27 @@ onMounted(() => weekdayStore.initStore()); v-for="(detail, index) in details" :key="index" class="full-width flex q-mb-lg" + style="flex-direction: column" > - - {{ getHeaderTitle(detail.shipped) }} - - +
+
+ + {{ getHeaderTitle(detail.shipped) }} + + + {{ getHeaderTitle(detail.shipped) }} + + + {{ getHeaderTitle(detail.shipped) }} + +
+ +
@@ -73,7 +89,7 @@ onMounted(() => weekdayStore.initStore()); diff --git a/src/pages/Route/Vehicle/VehicleCalendar.vue b/src/pages/Route/Vehicle/VehicleCalendar.vue new file mode 100644 index 000000000..a7d51daa1 --- /dev/null +++ b/src/pages/Route/Vehicle/VehicleCalendar.vue @@ -0,0 +1,145 @@ + + + + + diff --git a/src/pages/Route/Vehicle/VehicleCalendarGrid.vue b/src/pages/Route/Vehicle/VehicleCalendarGrid.vue new file mode 100644 index 000000000..0fc440643 --- /dev/null +++ b/src/pages/Route/Vehicle/VehicleCalendarGrid.vue @@ -0,0 +1,210 @@ + + + + + \ No newline at end of file diff --git a/src/router/modules/route.js b/src/router/modules/route.js index 835324d20..c14e5f8d0 100644 --- a/src/router/modules/route.js +++ b/src/router/modules/route.js @@ -166,7 +166,7 @@ const vehicleCard = { component: () => import('src/pages/Route/Vehicle/Card/VehicleCard.vue'), redirect: { name: 'VehicleSummary' }, meta: { - menu: ['VehicleBasicData'], + menu: ['VehicleBasicData', 'VehicleEvents'], }, children: [ { @@ -187,6 +187,15 @@ const vehicleCard = { }, component: () => import('src/pages/Route/Vehicle/Card/VehicleBasicData.vue'), }, + { + name: 'VehicleEvents', + path: 'events', + meta: { + title: 'calendar', + icon: 'vn:calendar', + }, + component: () => import('src/pages/Route/Vehicle/Card/VehicleEvents.vue'), + }, ], }; From 398f76c6e7525eaeffcc453391a74e8c893f6b64 Mon Sep 17 00:00:00 2001 From: provira Date: Thu, 13 Feb 2025 07:49:12 +0100 Subject: [PATCH 003/138] feat: refs #8443 added select in form for vehicle state --- .../Card/VehicleEventInclusionForm.vue | 42 ++++++------------- .../Route/Vehicle/Card/VehicleEventsPanel.vue | 22 ---------- 2 files changed, 12 insertions(+), 52 deletions(-) diff --git a/src/pages/Route/Vehicle/Card/VehicleEventInclusionForm.vue b/src/pages/Route/Vehicle/Card/VehicleEventInclusionForm.vue index 360dc7830..800ef1b2b 100644 --- a/src/pages/Route/Vehicle/Card/VehicleEventInclusionForm.vue +++ b/src/pages/Route/Vehicle/Card/VehicleEventInclusionForm.vue @@ -11,6 +11,7 @@ import VnInput from 'src/components/common/VnInput.vue'; import { useArrayData } from 'src/composables/useArrayData'; import { useVnConfirm } from 'composables/useVnConfirm'; import axios from 'axios'; +import VnSelect from 'src/components/common/VnSelect.vue'; const props = defineProps({ event: { @@ -47,12 +48,13 @@ const arrayData = useArrayData('VehicleEvents'); const createVehicleEvent = async () => { vehicleFormData.value.vehicleFk = route.params.id; + vehicleFormData.value.userFk = 3; if (isNew.value) { await axios.post(`Vehicles/${route.params.id}/event`, vehicleFormData.value); } else { await axios.put( `Vehicles/${route.params.id}/event/${props.event?.id}`, - vehicleFormData.value + vehicleFormData.value, ); } @@ -90,42 +92,22 @@ onMounted(() => { :default-submit-button="false" > @@ -147,7 +129,7 @@ onMounted(() => { openConfirmationModal( t('vehicleForm.deleteTitle'), t('vehicleForm.deleteSubtitle'), - () => deleteVehicleEvent() + () => deleteVehicleEvent(), ) " /> @@ -166,4 +148,4 @@ onMounted(() => { Finished: Fin Add vehicle event: Agregar evento Edit vehicle event: Editar evento -
\ No newline at end of file + diff --git a/src/pages/Route/Vehicle/Card/VehicleEventsPanel.vue b/src/pages/Route/Vehicle/Card/VehicleEventsPanel.vue index 9ce2f44b4..3ff849c16 100644 --- a/src/pages/Route/Vehicle/Card/VehicleEventsPanel.vue +++ b/src/pages/Route/Vehicle/Card/VehicleEventsPanel.vue @@ -38,24 +38,10 @@ const fetchVehicleState = async () => { vehicleStates.value = vehicles.data; }; -const fetchUser = async (userId) => { - console.log(userId); - if (!userId || users.value[userId]) return; - - const usersData = await axios.get(`Accounts/2/user`); - users.value[userId] = usersData.data; - console.log(users.value[userId]); -}; - const getVehicleStateName = (id) => { return vehicleStates.value[id - 1] ?? dashIfEmpty(id - 1); }; -const getUserName = (id) => { - console.log(users.value?.nickname); - return users.value?.nickname ?? dashIfEmpty(id - 1); -}; - const params = computed(() => ({ vehicleFk: route.params.id, started: props.firstDay, @@ -101,10 +87,6 @@ const openInclusionForm = (event) => { onMounted(async () => { weekdayStore.initStore(); await fetchVehicleState(); - - for (let event of props.events) { - await fetchUser(event.userFk); - } }); @@ -135,10 +117,6 @@ onMounted(async () => { getVehicleStateName(event.vehicleStateFk).state }} - {{ t('globals.user') }}: - {{ getUserName(event.userFk) }} - Date: Thu, 20 Feb 2025 09:51:58 +0100 Subject: [PATCH 004/138] fix: refs #7347 remove duplicated css class --- src/pages/Supplier/Card/SupplierConsumption.vue | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/pages/Supplier/Card/SupplierConsumption.vue b/src/pages/Supplier/Card/SupplierConsumption.vue index 25ac773f0..5249e464e 100644 --- a/src/pages/Supplier/Card/SupplierConsumption.vue +++ b/src/pages/Supplier/Card/SupplierConsumption.vue @@ -6,7 +6,6 @@ import { useQuasar } from 'quasar'; import FetchedTags from 'components/ui/FetchedTags.vue'; import SendEmailDialog from 'components/common/SendEmailDialog.vue'; import SupplierConsumptionFilter from './SupplierConsumptionFilter.vue'; -import ItemDescriptorProxy from 'src/pages/Item/Card/ItemDescriptorProxy.vue'; import { dateRange, toCurrency, toDate } from 'src/filters'; @@ -454,19 +453,6 @@ const expanded = ref([]); background-color: var(--vn-page-color); border-bottom: 2px solid $primary; } - -.header { - flex: 1 0 33%; - display: flex; - align-items: center; - padding-left: 8px; - height: 35px; - border-bottom: 1px solid $primary; - background-color: var(--vn-page-color); - font-size: 19px; - font-weight: bold; - text-transform: uppercase; -} From 8ffc3e8f2d5588e9fa38fbddbc9a0bf8fe25052d Mon Sep 17 00:00:00 2001 From: provira Date: Mon, 3 Mar 2025 13:08:19 +0100 Subject: [PATCH 005/138] feat: refs #8443 added notifications and translations --- .../Card/VehicleEventInclusionForm.vue | 21 ++++++++----- .../Route/Vehicle/Card/VehicleEventsPanel.vue | 6 +++- .../Route/Vehicle/VehicleCalendarGrid.vue | 4 +-- src/pages/Route/Vehicle/locale/en.yml | 2 ++ src/pages/Route/Vehicle/locale/es.yml | 2 ++ .../route/vehicle/vehicleEvents.spec.js | 30 +++++++++++++++++++ 6 files changed, 55 insertions(+), 10 deletions(-) create mode 100644 test/cypress/integration/route/vehicle/vehicleEvents.spec.js diff --git a/src/pages/Route/Vehicle/Card/VehicleEventInclusionForm.vue b/src/pages/Route/Vehicle/Card/VehicleEventInclusionForm.vue index 800ef1b2b..0a21c05a6 100644 --- a/src/pages/Route/Vehicle/Card/VehicleEventInclusionForm.vue +++ b/src/pages/Route/Vehicle/Card/VehicleEventInclusionForm.vue @@ -10,8 +10,10 @@ import VnInput from 'src/components/common/VnInput.vue'; import { useArrayData } from 'src/composables/useArrayData'; import { useVnConfirm } from 'composables/useVnConfirm'; +import { useState } from 'src/composables/useState'; import axios from 'axios'; import VnSelect from 'src/components/common/VnSelect.vue'; +import useNotify from 'src/composables/useNotify.js'; const props = defineProps({ event: { @@ -32,7 +34,10 @@ const emit = defineEmits(['onSubmit', 'closeForm']); const route = useRoute(); const { t } = useI18n(); +const { notify } = useNotify(); const { openConfirmationModal } = useVnConfirm(); +const state = useState(); +const user = state.getUser(); const isNew = computed(() => props.isNewMode); const vehicleFormData = ref({ @@ -48,12 +53,13 @@ const arrayData = useArrayData('VehicleEvents'); const createVehicleEvent = async () => { vehicleFormData.value.vehicleFk = route.params.id; - vehicleFormData.value.userFk = 3; + vehicleFormData.value.userFk = user.value.id; if (isNew.value) { - await axios.post(`Vehicles/${route.params.id}/event`, vehicleFormData.value); + await axios.post(`VehicleEvents`, vehicleFormData.value); + notify(t('globals.dataSaved'), 'positive'); } else { - await axios.put( - `Vehicles/${route.params.id}/event/${props.event?.id}`, + await axios.patch( + `VehicleEvents/${props.event?.id}`, vehicleFormData.value, ); } @@ -64,7 +70,8 @@ const createVehicleEvent = async () => { const deleteVehicleEvent = async () => { if (!props.event) return; - await axios.delete(`Vehicles/${route.params.id}/event/${props.event?.id}`); + await axios.delete(`VehicleEvents/${props.event?.id}`); + notify(t('globals.dataSaved'), 'positive'); await refetchEvents(); }; @@ -127,8 +134,8 @@ onMounted(() => { class="q-mr-sm" @click=" openConfirmationModal( - t('vehicleForm.deleteTitle'), - t('vehicleForm.deleteSubtitle'), + t('vehicle.deleteTitle'), + t('vehicle.deleteSubtitle'), () => deleteVehicleEvent(), ) " diff --git a/src/pages/Route/Vehicle/Card/VehicleEventsPanel.vue b/src/pages/Route/Vehicle/Card/VehicleEventsPanel.vue index 3ff849c16..ead43b908 100644 --- a/src/pages/Route/Vehicle/Card/VehicleEventsPanel.vue +++ b/src/pages/Route/Vehicle/Card/VehicleEventsPanel.vue @@ -9,6 +9,7 @@ import { toDateFormat } from 'src/filters/date.js'; import { dashIfEmpty } from 'src/filters'; import { useWeekdayStore } from 'src/stores/useWeekdayStore'; import { useVnConfirm } from 'composables/useVnConfirm'; +import useNotify from 'src/composables/useNotify.js'; const props = defineProps({ firstDay: { @@ -28,6 +29,7 @@ const props = defineProps({ const emit = defineEmits(['openVehicleForm']); const { t } = useI18n(); const route = useRoute(); +const { notify } = useNotify(); const weekdayStore = useWeekdayStore(); const { openConfirmationModal } = useVnConfirm(); const vehicleStates = ref({}); @@ -72,7 +74,8 @@ watch( const deleteEvent = async (id) => { if (!id) return; - await axios.delete(`Vehicles/${route.params.id}/event/${id}`); + await axios.delete(`VehicleEvents/${id}`); + notify(t('dataSaved'), 'positive'); await fetchData(); }; @@ -121,6 +124,7 @@ onMounted(async () => { { const onDateSelected = (data) => emit('onDateSelected', data); onMounted(async () => { - let initialDate = new Date(); + let initialDate = Date.vnNew(); initialDate.setDate(1); initialDate.setHours(0, 0, 0, 0); date.value = initialDate; diff --git a/src/pages/Route/Vehicle/locale/en.yml b/src/pages/Route/Vehicle/locale/en.yml index c92022f9d..706f77e0c 100644 --- a/src/pages/Route/Vehicle/locale/en.yml +++ b/src/pages/Route/Vehicle/locale/en.yml @@ -15,6 +15,8 @@ vehicle: remove: Vehicle removed search: Search Vehicle searchInfo: Search by id or number plate + deleteTitle: This item will be deleted + deleteSubtitle: Are you sure you want to continue? params: vehicleTypeFk: Type vehicleStateFk: State diff --git a/src/pages/Route/Vehicle/locale/es.yml b/src/pages/Route/Vehicle/locale/es.yml index c878f97ac..23d163eaf 100644 --- a/src/pages/Route/Vehicle/locale/es.yml +++ b/src/pages/Route/Vehicle/locale/es.yml @@ -15,6 +15,8 @@ vehicle: remove: Vehículo eliminado search: Buscar Vehículo searchInfo: Buscar por id o matrícula + deleteTitle: Este elemento será eliminado + deleteSubtitle: ¿Seguro que quieres continuar? params: vehicleTypeFk: Tipo vehicleStateFk: Estado diff --git a/test/cypress/integration/route/vehicle/vehicleEvents.spec.js b/test/cypress/integration/route/vehicle/vehicleEvents.spec.js new file mode 100644 index 000000000..65d5aa8a1 --- /dev/null +++ b/test/cypress/integration/route/vehicle/vehicleEvents.spec.js @@ -0,0 +1,30 @@ +describe('Vehicle', () => { + beforeEach(() => { + cy.viewport(1920, 1080); + cy.login('deliveryAssistant'); + cy.visit(`/#/route/vehicle/3/events`); + }); + + it('should add a new vehicle event', () => { + cy.get('.q-page-sticky > div > .q-btn').click(); + cy.dataCy('Started_inputDate').type('05/02/2001'); + cy.dataCy('Finished_inputDate').type('08/02/2001'); + cy.get(':nth-child(5) > [label="Description"] > .q-field > .q-field__inner > .q-field__control > .q-field__control-container > [data-cy="Description_input"]').type('Test'); + cy.selectOption(':nth-child(5) > .q-select > .q-field__inner > .q-field__control > .q-field__control-container', 3); + cy.get('.q-mt-lg > .q-btn--standard').click(); + }); + + it('should edit a vehicle event', () => { + cy.get('[aria-label="Tuesday, February 6, 2001"] .q-btn__content').click(); + cy.dataCy('Started_inputDate').clear().type('03/02/2001'); + cy.dataCy('Finished_inputDate').clear().type('15/03/2001'); + cy.get(':nth-child(5) > [label="Description"] > .q-field > .q-field__inner > .q-field__control > .q-field__control-container > [data-cy="Description_input"]').clear().type('Test2'); + cy.selectOption(':nth-child(5) > .q-select > .q-field__inner > .q-field__control > .q-field__control-container', 5); + cy.get('.q-mt-lg > .q-btn--standard').click(); + }); + + it('should delete a vehicle event', () => { + cy.dataCy('delete_event').eq(0).click(); + cy.dataCy('VnConfirm_confirm').click(); + }); +}); From d7ba8868a654ecb36ea3d1c6c287fa5c3c633127 Mon Sep 17 00:00:00 2001 From: provira Date: Wed, 5 Mar 2025 07:49:42 +0100 Subject: [PATCH 006/138] feat: refs #7449 added new button on claimLines, prevented claimAction to import lines with 0 quantity --- src/components/CrudModel.vue | 6 +-- src/components/FormModel.vue | 4 +- src/i18n/locale/en.yml | 5 ++- src/i18n/locale/es.yml | 5 ++- src/pages/Claim/Card/ClaimAction.vue | 19 ++++++--- src/pages/Claim/Card/ClaimBasicData.vue | 1 + src/pages/Claim/Card/ClaimLines.vue | 52 +++++++++++++++++++------ src/router/modules/claim.js | 20 +++++----- 8 files changed, 78 insertions(+), 34 deletions(-) diff --git a/src/components/CrudModel.vue b/src/components/CrudModel.vue index 8c4f70f3b..b40f0c2fc 100644 --- a/src/components/CrudModel.vue +++ b/src/components/CrudModel.vue @@ -347,8 +347,8 @@ watch(formUrl, async () => { { :label="t && t('globals.pleaseWait')" color="primary" /> - + \ No newline at end of file diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue index c4d9a4149..ff1b9ec4f 100644 --- a/src/components/FormModel.vue +++ b/src/components/FormModel.vue @@ -368,8 +368,8 @@ defineExpose({ data-cy="saveAndContinueDefaultBtn" v-if="$props.goTo" @click="saveAndGo" - :label="tMobile('globals.saveAndContinue')" - :title="t('globals.saveAndContinue')" + :label="tMobile('globals.saveAndContinue') + ' ' + t('globals.' + $props.goTo.split('/').pop())" + :title="t('globals.saveAndContinue') + ' ' + t('globals.' + $props.goTo.split('/').pop())" :disable="!hasChanges" color="primary" icon="save" diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml index 5b667555e..6c0e470cc 100644 --- a/src/i18n/locale/en.yml +++ b/src/i18n/locale/en.yml @@ -28,7 +28,7 @@ globals: create: Create edit: Edit save: Save - saveAndContinue: Save and continue + saveAndContinue: Save and go to remove: Remove reset: Reset close: Close @@ -106,6 +106,8 @@ globals: from: From to: To notes: Notes + photos: Photos + due-day: Due day refresh: Refresh item: Item ticket: Ticket @@ -383,6 +385,7 @@ errors: updateUserConfig: Error updating user config tokenConfig: Error fetching token config writeRequest: The requested operation could not be completed + claimBeginningQuantity: Cannot import a line with a claimed quantity of 0 login: title: Login username: Username diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml index 3f004485d..9af2bd7c9 100644 --- a/src/i18n/locale/es.yml +++ b/src/i18n/locale/es.yml @@ -28,7 +28,7 @@ globals: create: Crear edit: Modificar save: Guardar - saveAndContinue: Guardar y continuar + saveAndContinue: Guardar e ir a remove: Eliminar reset: Restaurar close: Cerrar @@ -110,6 +110,8 @@ globals: from: Desde to: Hasta notes: Notas + photos: Fotos + due-day: Vencimiento refresh: Actualizar item: Artículo ticket: Ticket @@ -379,6 +381,7 @@ errors: updateUserConfig: Error al actualizar la configuración de usuario tokenConfig: Error al obtener configuración de token writeRequest: No se pudo completar la operación solicitada + claimBeginningQuantity: No se puede importar una linea sin una cantidad reclamada login: title: Inicio de sesión username: Nombre de usuario diff --git a/src/pages/Claim/Card/ClaimAction.vue b/src/pages/Claim/Card/ClaimAction.vue index baa36710c..4b2414d46 100644 --- a/src/pages/Claim/Card/ClaimAction.vue +++ b/src/pages/Claim/Card/ClaimAction.vue @@ -13,8 +13,10 @@ import ItemDescriptorProxy from 'src/pages/Item/Card/ItemDescriptorProxy.vue'; import TicketDescriptorProxy from 'src/pages/Ticket/Card/TicketDescriptorProxy.vue'; import { useArrayData } from 'composables/useArrayData'; import RightMenu from 'src/components/common/RightMenu.vue'; +import useNotify from 'src/composables/useNotify.js'; const { t } = useI18n(); +const { notify } = useNotify(); const quasar = useQuasar(); const route = useRoute(); const claim = ref(null); @@ -176,12 +178,17 @@ async function save(data) { } async function importToNewRefundTicket() { - await post(`ClaimBeginnings/${claimId}/importToNewRefundTicket`); - await claimActionsForm.value.reload(); - quasar.notify({ - message: t('globals.dataSaved'), - type: 'positive', - }); + try{ + await post(`ClaimBeginnings/${claimId}/importToNewRefundTicket`); + await claimActionsForm.value.reload(); + quasar.notify({ + message: t('globals.dataSaved'), + type: 'positive', + }); + } catch (error) { + const errorMessage = error.response?.data?.error?.message; + notify( t(errorMessage), 'negative' ); + } } async function post(query, params) { diff --git a/src/pages/Claim/Card/ClaimBasicData.vue b/src/pages/Claim/Card/ClaimBasicData.vue index 43941d1dc..62721703a 100644 --- a/src/pages/Claim/Card/ClaimBasicData.vue +++ b/src/pages/Claim/Card/ClaimBasicData.vue @@ -26,6 +26,7 @@ const workersOptions = ref([]); diff --git a/src/pages/Claim/Card/ClaimLines.vue b/src/pages/Claim/Card/ClaimLines.vue index dee03b95d..1df7fbeef 100644 --- a/src/pages/Claim/Card/ClaimLines.vue +++ b/src/pages/Claim/Card/ClaimLines.vue @@ -152,12 +152,33 @@ function showImportDialog() { .onOk(() => claimLinesForm.value.reload()); } -async function saveWhenHasChanges() { - if (claimLinesForm.value.getChanges().updates) { - await claimLinesForm.value.onSubmit(); - onFetch(claimLinesForm.value.formData); +function fillClaimedQuantities() { + const formData = claimLinesForm.value.formData; + let hasChanges = false; + + const selectedRows = formData.filter(row => selected.value.includes(row)); + + for (const row of selectedRows) { + if (row.quantity === 0 || row.quantity === null) { + row.quantity = row.sale.quantity; + hasChanges = true; + } + } + + if (hasChanges) { + quasar.notify({ + message: t('Cantidades rellenadas automáticamente'), + type: 'positive', + }); + } else { + quasar.notify({ + message: t('No hay cantidades para rellenar'), + type: 'info', + }); } } + + @@ -272,10 +293,7 @@ async function saveWhenHasChanges() { type="number" dense autofocus - @keyup.enter=" - saveWhenHasChanges() - " - @blur="saveWhenHasChanges()" + /> @@ -313,6 +331,18 @@ async function saveWhenHasChanges() {
+ diff --git a/src/router/modules/claim.js b/src/router/modules/claim.js index 4dfde08da..aa0fc2819 100644 --- a/src/router/modules/claim.js +++ b/src/router/modules/claim.js @@ -8,9 +8,9 @@ const claimCard = { meta: { menu: [ 'ClaimBasicData', + 'ClaimNotes', 'ClaimLines', 'ClaimPhotos', - 'ClaimNotes', 'ClaimDevelopment', 'ClaimAction', 'ClaimLog', @@ -36,6 +36,15 @@ const claimCard = { }, component: () => import('src/pages/Claim/Card/ClaimBasicData.vue'), }, + { + path: 'notes', + name: 'ClaimNotes', + meta: { + title: 'notes', + icon: 'draft', + }, + component: () => import('src/pages/Claim/Card/ClaimNotes.vue'), + }, { path: 'lines', name: 'ClaimLines', @@ -54,15 +63,6 @@ const claimCard = { }, component: () => import('src/pages/Claim/Card/ClaimPhoto.vue'), }, - { - path: 'notes', - name: 'ClaimNotes', - meta: { - title: 'notes', - icon: 'draft', - }, - component: () => import('src/pages/Claim/Card/ClaimNotes.vue'), - }, { path: 'development', name: 'ClaimDevelopment', From d4fe1e6a6db1826142eb690b74146432a6640842 Mon Sep 17 00:00:00 2001 From: provira Date: Tue, 11 Mar 2025 12:33:23 +0100 Subject: [PATCH 007/138] feat: refs #7449 added save button to claimNotes & added e2e tests --- src/components/ui/VnNotes.vue | 37 +++++++++++++++++-- src/i18n/locale/en.yml | 1 + src/i18n/locale/es.yml | 1 + src/pages/Claim/Card/ClaimNotes.vue | 2 + .../integration/claim/claimLines.spec.js | 23 ++++++++++++ 5 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 test/cypress/integration/claim/claimLines.spec.js diff --git a/src/components/ui/VnNotes.vue b/src/components/ui/VnNotes.vue index 6740934d4..5eb12f76b 100644 --- a/src/components/ui/VnNotes.vue +++ b/src/components/ui/VnNotes.vue @@ -1,10 +1,11 @@