feat(Front): add purchase vue form.

This commit is contained in:
Mono Mono 2024-09-21 13:03:22 -05:00
parent cf93fecf9f
commit ffbb2e53d8
2 changed files with 162 additions and 1 deletions

View File

@ -0,0 +1,161 @@
<template>
<v-app>
<v-navigation-drawer app>
<v-list>
<v-list-item v-for="item in menuItems" :key="item.title" @click="navigate(item.route)">
<v-list-item-title>{{ item.title }}</v-list-item-title>
</v-list-item>
</v-list>
</v-navigation-drawer>
<v-app-bar app>
<v-toolbar-title>Compra</v-toolbar-title>
</v-app-bar>
<v-container>
<v-form ref="form" v-model="valid">
<v-text-field
v-model="purchase.date"
label="Fecha"
type="date"
:rules="[rules.required]"
required
></v-text-field>
<v-text-field
v-model="purchase.client"
label="Cliente"
:rules="[rules.required]"
required
></v-text-field>
<v-textarea
v-model="purchase.notes"
label="Notas"
></v-textarea>
<v-divider></v-divider>
<v-subheader>Productos</v-subheader>
<div v-for="(line, index) in purchase.lines" :key="line.id">
<v-row>
<v-col>
<v-text-field
v-model="line.product"
label="Producto"
:rules="[rules.required]"
required
></v-text-field>
</v-col>
<v-col>
<v-text-field
v-model.number="line.price"
label="Precio"
type="number"
:rules="[rules.required]"
required
></v-text-field>
</v-col>
<v-col>
<v-text-field
v-model.number="line.quantity"
label="Cantidad"
type="number"
:rules="[rules.required]"
required
></v-text-field>
</v-col>
<v-col>
<v-text-field
:value="calculateSubtotal(line)"
label="Subtotal"
readonly
></v-text-field>
</v-col>
<v-col>
<v-btn @click="removeLine(index)" color="red">Eliminar</v-btn>
</v-col>
</v-row>
</div>
<v-btn @click="addLine" color="blue">Agregar</v-btn>
<v-divider></v-divider>
<v-text-field
:value="calculateTotal"
label="Total"
readonly
></v-text-field>
<v-btn @click="submit" color="green">Comprar</v-btn>
</v-form>
</v-container>
</v-app>
</template>
<script>
export default {
name: 'DonConfiao',
props: {
msg: String
},
data() {
return {
valid: false,
purchase: {
date: '',
client: '',
notes: '',
lines: [{product:'', price: 0, quantity: 0}],
},
rules: {
required: value => !!value || 'Requerido.',
},
menuItems: [
{ title: 'Inicio', route: '/'},
{ title: 'Compras', route:'/compras'},
],
};
},
computed: {
calculateTotal() {
return this.purchase.lines.reduce((total, line) => {
return total + this.calculateSubtotal(line);
}, 0);
},
},
methods: {
addLine() {
this.purchase.lines.push({ product: '', price: 0, quantity:0 });
},
removeLine(index) {
this.purchase.lines.splice(index, 1);
},
calculateSubtotal(line) {
return line.price * line.quantity;
},
async submit() {
if (this.$refs.form.validate()) {
try {
const response = await fetch('http://localhost:8000/don_confiao/', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(this.purchase),
});
if (response.ok) {
const data = await response.json();
console.log('Compra enviada:', data);
} else {
console.error('Error al enviar la compra:', response.statusText);
}
} catch (error) {
console.error('Error de red:', error);
}
}
},
navigate(route) {
this.$route.push(route);
},
},
};
</script>
<style>
</style>

View File

@ -1,5 +1,5 @@
<template>
<HelloWorld />
<Purchase />
</template>
<script setup>