From f1b8cbdce11fb05a3dca68301593e5b0544321d6 Mon Sep 17 00:00:00 2001 From: Mono Mono <monomono@disroot.org> Date: Mon, 11 Nov 2024 21:17:12 -0500 Subject: [PATCH 1/4] fix(Purchase): validation of form. --- .../frontend/don-confiao/src/components/Purchase.vue | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue b/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue index 65bca7b..238f9d5 100644 --- a/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue +++ b/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue @@ -1,6 +1,6 @@ <template> <v-container> - <v-form ref="form" v-model="valid"> + <v-form ref="purchase" v-model="valid" > <v-row> <v-col> <v-autocomplete @@ -123,6 +123,8 @@ item-title="text" item-value="value" label="Pago en" + :rules="[rules.required]" + required ></v-select> <v-btn @click="openCasherModal" v-if="purchase.payment_method === 'CASH'">Calcular Devuelta</v-btn> <CasherModal :total_purchase="calculateTotal" ref="casherModal"</CasherModal> @@ -276,9 +278,10 @@ return line.unit_price * line.quantity; }, async submit() { - if (this.$refs.form.validate()) { - const hasInvalidQuantity = this.purchase.saleline_set.some(line => line.quantity <= 0); - if (hasInvalidQuantity) { + this.$refs.purchase.validate(); + if (this.valid) { + const hasInvalidQuantity = this.purchase.saleline_set.some(line => line.quantity <= 0); + if (hasInvalidQuantity) { this.errorMessage = 'La cantidad de cada línea de compra debe ser mayor que cero.'; console.log(this.errorMessage); From a5ac06704b79340efd3c0f3c903c5f083986e512 Mon Sep 17 00:00:00 2001 From: Mono Mono <monomono@disroot.org> Date: Mon, 11 Nov 2024 21:42:13 -0500 Subject: [PATCH 2/4] feat(Purchase): warn user when try eliminate the last line --- .../don-confiao/src/components/Purchase.vue | 25 ++++++++----------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue b/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue index 238f9d5..e7f977c 100644 --- a/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue +++ b/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue @@ -104,8 +104,11 @@ <v-col> <v-btn @click="removeLine(index)" color="red">Eliminar</v-btn> </v-col> - </v-row> - </v-container> + </v-row> + <v-alert type="warning" :duration="2000" closable v-model="show_alert_lines"> + No se puede eliminar la única línea. + </v-alert> + </v-container> <v-btn @click="addLine" color="blue">Agregar</v-btn> </v-container> <v-divider></v-divider> @@ -150,6 +153,7 @@ data() { return { valid: false, + show_alert_lines: false, client_search: '', product_search: '', payment_methods: null, @@ -266,12 +270,13 @@ this.purchase.saleline_set.push({ product: '', unit_price: 0, quantity:0, measuring_unit: ''}); }, removeLine(index) { - // Solo elimina si hay más de una línea if (this.purchase.saleline_set.length > 1) { this.purchase.saleline_set.splice(index, 1); } else { - // Opcional: puedes mostrar un mensaje o alerta si lo deseas - console.log("No se puede eliminar la única línea."); + this.show_alert_lines = true; + setTimeout(() => { + this.show_alert_lines = false; + }, 2000); } }, calculateSubtotal(line) { @@ -280,16 +285,6 @@ async submit() { this.$refs.purchase.validate(); if (this.valid) { - const hasInvalidQuantity = this.purchase.saleline_set.some(line => line.quantity <= 0); - if (hasInvalidQuantity) { - this.errorMessage = 'La cantidad de cada línea de compra debe ser mayor que cero.'; - - console.log(this.errorMessage); - return; // Detener el submit si hay cantidades inválidas - } - - this.errorMessage = ''; // Limpiar el mensaje de error - try { const response = await fetch('/don_confiao/api/sales/', { method: 'POST', From 201333ab4bfef0bdebfb7566682e46745ce2a29f Mon Sep 17 00:00:00 2001 From: Mono Mono <monomono@disroot.org> Date: Mon, 11 Nov 2024 21:47:46 -0500 Subject: [PATCH 3/4] feat(Purchase): warn user invalid form #71 --- .../frontend/don-confiao/src/components/Purchase.vue | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue b/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue index e7f977c..8866909 100644 --- a/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue +++ b/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue @@ -133,6 +133,9 @@ <CasherModal :total_purchase="calculateTotal" ref="casherModal"</CasherModal> </v-container> <v-btn @click="submit" color="green">Comprar</v-btn> + <v-alert type="error" :duration="2000" closable v-model="show_alert_purchase"> + Verifique los campos obligatorios. + </v-alert> </v-form> </v-container> </template> @@ -154,6 +157,7 @@ return { valid: false, show_alert_lines: false, + show_alert_purchase: false, client_search: '', product_search: '', payment_methods: null, @@ -306,6 +310,11 @@ } catch (error) { console.error('Error de red:', error); } + } else { + this.show_alert_purchase = true; + setTimeout(() => { + this.show_alert_purchase = false; + }, 4000); } }, navigate(route) { From 159bd737c40252a519673704391cd853509352d1 Mon Sep 17 00:00:00 2001 From: Mono Mono <monomono@disroot.org> Date: Mon, 11 Nov 2024 22:45:47 -0500 Subject: [PATCH 4/4] feat(Purchase): warn user whit browser actions #67. --- .../don-confiao/src/components/Purchase.vue | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue b/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue index 8866909..dcca9d2 100644 --- a/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue +++ b/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue @@ -1,6 +1,6 @@ <template> <v-container> - <v-form ref="purchase" v-model="valid" > + <v-form ref="purchase" v-model="valid" @change="onFormChange"> <v-row> <v-col> <v-autocomplete @@ -10,6 +10,7 @@ no-data-text="No se hallaron clientes" item-title="name" item-value="id" + @update:model-value="onFormChange" label="Cliente" :rules="[rules.required]" required @@ -156,6 +157,7 @@ data() { return { valid: false, + form_changed: false, show_alert_lines: false, show_alert_purchase: false, client_search: '', @@ -189,6 +191,12 @@ this.drawer = false }, }, + beforeMount() { + window.addEventListener('beforeunload', this.confirmLeave); + }, + beforeDestroy() { + window.removeEventListener('beforeunload', this.confirmLeave); + }, computed: { calculateTotal() { return this.purchase.saleline_set.reduce((total, saleline) => { @@ -218,9 +226,20 @@ openModal() { this.$refs.customerModal.openModal(); }, + onFormChange() { + this.form_changed = true; + }, openCasherModal() { this.$refs.casherModal.dialog = true }, + confirmLeave(event) { + if (this.form_changed) { + const message = '¿seguro que quieres salir? Perderas la información diligenciada'; + event.preventDefault(); + event.returnValue = message; + return message; + } + }, getCurrentDate() { const today = new Date(); const yyyy = today.getFullYear(); @@ -233,7 +252,6 @@ const selectedProductId = this.purchase.saleline_set[index].product; const selectedProduct = this.products.find(p => p.id == selectedProductId); this.purchase.saleline_set[index].unit_price = selectedProduct.price; - console.log(selectedProduct.measuring_unit); this.purchase.saleline_set[index].measuring_unit = selectedProduct.measuring_unit; }, fetchClients() {