add: delete vehicle
This commit is contained in:
@@ -1,5 +1,7 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
|
import Swal from 'sweetalert2';
|
||||||
import { getDateMonthDayEs } from '../helpers/date_formats';
|
import { getDateMonthDayEs } from '../helpers/date_formats';
|
||||||
|
import { useVehiclesStore } from '../stores/vehicles';
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
vehicle: {
|
vehicle: {
|
||||||
@@ -10,6 +12,48 @@
|
|||||||
|
|
||||||
defineEmits(['set-vehicle']);
|
defineEmits(['set-vehicle']);
|
||||||
|
|
||||||
|
const vehicleStore = useVehiclesStore();
|
||||||
|
|
||||||
|
const handleDeleteVehicle = async() => {
|
||||||
|
Swal.fire({
|
||||||
|
title: `Eliminar vehiculo "${props.vehicle.vehicle_code}""`,
|
||||||
|
text: '¿Estás seguro de eliminar este vehiculo?',
|
||||||
|
icon: 'warning',
|
||||||
|
showCancelButton: true,
|
||||||
|
cancelButtonColor: "#d33",
|
||||||
|
confirmButtonText: 'Eliminar',
|
||||||
|
cancelButtonText: 'Cancelar',
|
||||||
|
}).then(async(result) => {
|
||||||
|
if(result.isConfirmed) {
|
||||||
|
Swal.fire({
|
||||||
|
title: 'Por favor espere!',
|
||||||
|
html: 'Eliminando vehiculo...',// add html attribute if you want or remove
|
||||||
|
allowOutsideClick: false,
|
||||||
|
didOpen: () => {
|
||||||
|
Swal.showLoading()
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const resp = await vehicleStore.deleteVehicleCompany(props.vehicle._id);
|
||||||
|
Swal.close();
|
||||||
|
|
||||||
|
if(resp != null) {
|
||||||
|
Swal.fire({
|
||||||
|
title: "vehiculo eliminado!",
|
||||||
|
text: "Tu vehiculo ha sido eliminado exitosamente.",
|
||||||
|
icon: "success"
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
Swal.fire({
|
||||||
|
title: "Error!",
|
||||||
|
text: "Tu vehiculo no se pudo eliminar, intente más tarde.",
|
||||||
|
icon: "error"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -19,7 +63,7 @@
|
|||||||
<p>Código: <span>{{ vehicle.vehicle_code }}</span></p>
|
<p>Código: <span>{{ vehicle.vehicle_code }}</span></p>
|
||||||
<p>Tipo de transporte: <span>{{ vehicle.truck_type }}</span></p>
|
<p>Tipo de transporte: <span>{{ vehicle.truck_type }}</span></p>
|
||||||
<p>Número de Serie: <span>{{ vehicle.vehicle_number }}</span></p>
|
<p>Número de Serie: <span>{{ vehicle.vehicle_number }}</span></p>
|
||||||
<p>Segmento: <span>{{ vehicle._categories }}</span></p>
|
<p>Segmento: <span>{{vehicle.categories?.map((e) => e.name).join(', ')}}</span></p>
|
||||||
<p>Conductor:
|
<p>Conductor:
|
||||||
<span>
|
<span>
|
||||||
<span v-if="vehicle?.driver">{{ vehicle?.driver?.first_name }} {{ vehicle?.driver?.last_name }} </span>
|
<span v-if="vehicle?.driver">{{ vehicle?.driver?.first_name }} {{ vehicle?.driver?.last_name }} </span>
|
||||||
@@ -59,6 +103,7 @@
|
|||||||
<div class="card-footer">
|
<div class="card-footer">
|
||||||
<button
|
<button
|
||||||
class="btn btn-dark radius-sm"
|
class="btn btn-dark radius-sm"
|
||||||
|
@click="handleDeleteVehicle"
|
||||||
>
|
>
|
||||||
<i class="fa-solid fa-trash" /> <span class="clear-xsm">Eliminar</span>
|
<i class="fa-solid fa-trash" /> <span class="clear-xsm">Eliminar</span>
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -2,10 +2,13 @@
|
|||||||
import { computed, onMounted, reactive, ref } from 'vue';
|
import { computed, onMounted, reactive, ref } from 'vue';
|
||||||
import CustomInput from './ui/CustomInput.vue';
|
import CustomInput from './ui/CustomInput.vue';
|
||||||
import TruckTypes from './ui/TruckTypes.vue';
|
import TruckTypes from './ui/TruckTypes.vue';
|
||||||
|
import { useAuthStore } from '../stores/auth';
|
||||||
import Segments from './ui/Segments.vue';
|
import Segments from './ui/Segments.vue';
|
||||||
import States from './ui/States.vue';
|
import States from './ui/States.vue';
|
||||||
import Cities from './ui/Cities.vue';
|
import Cities from './ui/Cities.vue';
|
||||||
import Spiner from './ui/Spiner.vue';
|
import Spiner from './ui/Spiner.vue';
|
||||||
|
import Swal from 'sweetalert2';
|
||||||
|
import { useVehiclesStore } from '../stores/vehicles';
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
vehicle: {
|
vehicle: {
|
||||||
@@ -29,10 +32,22 @@
|
|||||||
destino: '',
|
destino: '',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const errors = ref({
|
||||||
|
truck_type: null,
|
||||||
|
categories: null,
|
||||||
|
vehicle_number: null,
|
||||||
|
state: null,
|
||||||
|
city: null,
|
||||||
|
destino: null,
|
||||||
|
})
|
||||||
|
|
||||||
const vehicleForm = reactive({
|
const vehicleForm = reactive({
|
||||||
...initState
|
...initState
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const authStore = useAuthStore();
|
||||||
|
const vehicleStore = useVehiclesStore();
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
if(props.vehicle) {
|
if(props.vehicle) {
|
||||||
vehicleForm.truck_type = {
|
vehicleForm.truck_type = {
|
||||||
@@ -55,6 +70,69 @@
|
|||||||
const title = computed(() => {
|
const title = computed(() => {
|
||||||
return (props.vehicle) ? 'Editar vehiculo' : 'Agregar vehiculo';
|
return (props.vehicle) ? 'Editar vehiculo' : 'Agregar vehiculo';
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const handleSaveVehicle = async() => {
|
||||||
|
validations();
|
||||||
|
|
||||||
|
if(errors.value.vehicle_number || errors.value.truck_type || errors.value.categories || errors.value.city || errors.value.state || errors.value.destino ) return;
|
||||||
|
let vehicleData ={
|
||||||
|
vehicle_number : vehicleForm.vehicle_number,
|
||||||
|
city : vehicleForm.city?.city_name,
|
||||||
|
state : vehicleForm.state?.state_name,
|
||||||
|
truck_type : vehicleForm?.truck_type.meta_value,
|
||||||
|
trailer_plate_1: vehicleForm.trailer_plate_1,
|
||||||
|
trailer_plate_2: vehicleForm.trailer_plate_2,
|
||||||
|
circulation_serial_number: vehicleForm.circulation_serial_number,
|
||||||
|
notes: vehicleForm.notes,
|
||||||
|
company: authStore.user.company,
|
||||||
|
categories: vehicleForm.categories.length <= 0 ? null : vehicleForm.categories?.map((e) => e._id),
|
||||||
|
destino: vehicleForm.destino?.city_name,
|
||||||
|
available_date: new Date()
|
||||||
|
};
|
||||||
|
let localData = {};
|
||||||
|
let result = 'error';
|
||||||
|
let action = 'Creado';
|
||||||
|
loading.value = true;
|
||||||
|
if(props.vehicle) {
|
||||||
|
localData = {
|
||||||
|
categories: vehicleForm.categories,
|
||||||
|
driver: props.vehicle.driver
|
||||||
|
};
|
||||||
|
action = 'actualizado';
|
||||||
|
result = await vehicleStore.updateVehicleCompany(props.vehicle._id, vehicleData, localData);
|
||||||
|
} else {
|
||||||
|
localData = {
|
||||||
|
categories: vehicleForm.categories
|
||||||
|
}
|
||||||
|
action = 'añadido';
|
||||||
|
result = await vehicleStore.createVehicleCompany(vehicleData, localData);
|
||||||
|
}
|
||||||
|
|
||||||
|
loading.value = false;
|
||||||
|
if(result === 'success') {
|
||||||
|
document.getElementById('btnClosecreateVehicleModal').click();
|
||||||
|
Swal.fire({
|
||||||
|
title: `<strong>Vehiculo ${action} con éxito!</strong>`,
|
||||||
|
icon: 'success'
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
Swal.fire({
|
||||||
|
title: result,
|
||||||
|
icon: 'error'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const validations = () => {
|
||||||
|
errors.value = {
|
||||||
|
truck_type: (!vehicleForm.truck_type) ? 'Seleccione tipo de transporte' : null,
|
||||||
|
categories: (!vehicleForm.categories) ? 'Seleccione al menos un segmento' : null,
|
||||||
|
vehicle_number: (!vehicleForm.vehicle_number) ? 'Campo es requerido' : null,
|
||||||
|
state: (!vehicleForm.state) ? 'Seleccione estado' : null,
|
||||||
|
city: (!vehicleForm.city) ? 'Seleccione municipio' : null,
|
||||||
|
destino: (!vehicleForm.destino) ? 'Seleccione municipio destino' : null,
|
||||||
|
};
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -72,14 +150,14 @@
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body form-content">
|
<div class="modal-body form-content">
|
||||||
<form @submit.prevent="saveVehicle" autocomplete="off" class="vehicle-form">
|
<form @submit.prevent="handleSaveVehicle" autocomplete="off" class="vehicle-form">
|
||||||
<div class="row mt-4">
|
<div class="row mt-4">
|
||||||
<div class="col-lg-6 col-12">
|
<div class="col-lg-6 col-12">
|
||||||
<label class="custom-label">Tipo de Transporte*</label>
|
<label class="custom-label">Tipo de Transporte*</label>
|
||||||
<TruckTypes
|
<TruckTypes
|
||||||
v-model="vehicleForm.truck_type"
|
v-model="vehicleForm.truck_type"
|
||||||
/>
|
/>
|
||||||
<!-- <span class="error-msg" v-if="submited && errors.truckType">{{ errors.truckType }}</span> -->
|
<span class="error-msg" v-if="errors.truck_type">{{ errors.truck_type }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-lg-6 col-12">
|
<div class="col-lg-6 col-12">
|
||||||
<label class="custom-label">Segmento del transporte*</label>
|
<label class="custom-label">Segmento del transporte*</label>
|
||||||
@@ -87,7 +165,7 @@
|
|||||||
v-model="vehicleForm.categories"
|
v-model="vehicleForm.categories"
|
||||||
:multiple="true"
|
:multiple="true"
|
||||||
/>
|
/>
|
||||||
<!-- <span class="error-msg" v-if="submited && errors.segment">{{ errors.segment }}</span> -->
|
<span class="error-msg" v-if="errors.categories">{{ errors.categories }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row mt-4">
|
<div class="row mt-4">
|
||||||
@@ -97,6 +175,7 @@
|
|||||||
name="vehicle_number"
|
name="vehicle_number"
|
||||||
v-model:field="vehicleForm.vehicle_number"
|
v-model:field="vehicleForm.vehicle_number"
|
||||||
:filled="false"
|
:filled="false"
|
||||||
|
:error="errors.vehicle_number"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-lg-6 col-12">
|
<div class="col-lg-6 col-12">
|
||||||
@@ -132,14 +211,14 @@
|
|||||||
<States
|
<States
|
||||||
v-model="vehicleForm.state"
|
v-model="vehicleForm.state"
|
||||||
/>
|
/>
|
||||||
<!-- <span class="error-msg" v-if="submited && errors.truckType">{{ errors.truckType }}</span> -->
|
<span class="error-msg" v-if="errors.state">{{ errors.state }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-lg-6 col-12">
|
<div class="col-lg-6 col-12">
|
||||||
<label class="custom-label">Base de Carga por Municipio*</label>
|
<label class="custom-label">Base de Carga por Municipio*</label>
|
||||||
<Cities
|
<Cities
|
||||||
v-model="vehicleForm.city"
|
v-model="vehicleForm.city"
|
||||||
/>
|
/>
|
||||||
<!-- <span class="error-msg" v-if="submited && errors.segment">{{ errors.segment }}</span> -->
|
<span class="error-msg" v-if="errors.city">{{ errors.city }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-lg-6 col-12 mt-4">
|
<div class="col-lg-6 col-12 mt-4">
|
||||||
@@ -147,7 +226,7 @@
|
|||||||
<Cities
|
<Cities
|
||||||
v-model="vehicleForm.destino"
|
v-model="vehicleForm.destino"
|
||||||
/>
|
/>
|
||||||
<!-- <span class="error-msg" v-if="submited && errors.segment">{{ errors.segment }}</span> -->
|
<span class="error-msg" v-if="errors.destino">{{ errors.destino }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="d-flex flex-column mt-4">
|
<div class="d-flex flex-column mt-4">
|
||||||
<label class="custom-label" for="notes">Información Adicional del Transporte:</label>
|
<label class="custom-label" for="notes">Información Adicional del Transporte:</label>
|
||||||
@@ -163,7 +242,7 @@
|
|||||||
<Spiner v-if="loading"/>
|
<Spiner v-if="loading"/>
|
||||||
<button
|
<button
|
||||||
v-else
|
v-else
|
||||||
class="btn btn-dark" type="submit">Guardar</button>
|
class="btn-primary-sm radius-sm" type="submit">Guardar</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -42,8 +42,12 @@
|
|||||||
let vehicleData ={
|
let vehicleData ={
|
||||||
driver : driverSelected.value
|
driver : driverSelected.value
|
||||||
}
|
}
|
||||||
|
let localData ={
|
||||||
|
driver : driverSelected.value,
|
||||||
|
categories: props.vehicle.categories
|
||||||
|
}
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
const result = await vehicleStore.updateVehicleCompany(vehicle_id, vehicleData, vehicleData);
|
const result = await vehicleStore.updateVehicleCompany(vehicle_id, vehicleData, localData);
|
||||||
|
|
||||||
if( result === 'success' ) {
|
if( result === 'success' ) {
|
||||||
//Actualizamos el vehiculo
|
//Actualizamos el vehiculo
|
||||||
|
|||||||
@@ -62,7 +62,8 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
let localData = {
|
let localData = {
|
||||||
driver: props.vehicle.driver
|
driver: props.vehicle.driver,
|
||||||
|
categories: props.vehicle.categories
|
||||||
}
|
}
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
const result = await vehicleStore.updateVehicleCompany(props.vehicle._id, vehicleData, localData);
|
const result = await vehicleStore.updateVehicleCompany(props.vehicle._id, vehicleData, localData);
|
||||||
@@ -87,7 +88,6 @@
|
|||||||
city: (!formAvailiable.city) ? 'Seleccione municipio' : null,
|
city: (!formAvailiable.city) ? 'Seleccione municipio' : null,
|
||||||
destino: (!formAvailiable.destino) ? 'Seleccione municipio destino' : null,
|
destino: (!formAvailiable.destino) ? 'Seleccione municipio destino' : null,
|
||||||
};
|
};
|
||||||
console.log(errors.value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -47,9 +47,6 @@ export const getDateMonthDayEs = (value, isFull = false) => {
|
|||||||
} else {
|
} else {
|
||||||
month = monthsAbr[date.getMonth()]
|
month = monthsAbr[date.getMonth()]
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(date.getMonth());
|
|
||||||
|
|
||||||
return `${month} ${date.getDate()}, ${date.getFullYear()}`;
|
return `${month} ${date.getDate()}, ${date.getFullYear()}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import api from "../lib/axios";
|
|||||||
export const getVehicles = async(filter) => {
|
export const getVehicles = async(filter) => {
|
||||||
try {
|
try {
|
||||||
const endpoint = `/vehicles/${filter}`;
|
const endpoint = `/vehicles/${filter}`;
|
||||||
console.log('endpoint: ', endpoint);
|
|
||||||
const {data} = await api.get(endpoint);
|
const {data} = await api.get(endpoint);
|
||||||
return data;
|
return data;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -16,12 +15,32 @@ export const getVehicles = async(filter) => {
|
|||||||
export const updateVehicle = async(id, formData) => {
|
export const updateVehicle = async(id, formData) => {
|
||||||
try {
|
try {
|
||||||
const endpoint = `/vehicles/${id}`;
|
const endpoint = `/vehicles/${id}`;
|
||||||
console.log('endpoint: ', endpoint);
|
|
||||||
const {data} = await api.patch(endpoint, formData);
|
const {data} = await api.patch(endpoint, formData);
|
||||||
return data;
|
return data;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error);
|
console.log(error);
|
||||||
console.log(error.response);
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const deleteVehicle = async(id) => {
|
||||||
|
try {
|
||||||
|
const endpoint = `/vehicles/${id}`;
|
||||||
|
const {data} = await api.delete(endpoint);
|
||||||
|
return data;
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const createVehicle = async(formData) => {
|
||||||
|
try {
|
||||||
|
const endpoint = `/vehicles/`;
|
||||||
|
const {data} = await api.post(endpoint, formData);
|
||||||
|
return data;
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { defineStore } from "pinia";
|
import { defineStore } from "pinia";
|
||||||
import { ref } from "vue";
|
import { ref } from "vue";
|
||||||
import { getVehicles, updateVehicle } from "../services/vehicles";
|
import { createVehicle, deleteVehicle, getVehicles, updateVehicle } from "../services/vehicles";
|
||||||
export const useVehiclesStore = defineStore('vehicles', () => {
|
export const useVehiclesStore = defineStore('vehicles', () => {
|
||||||
|
|
||||||
const vehicles = ref([]);
|
const vehicles = ref([]);
|
||||||
@@ -13,7 +13,6 @@ export const useVehiclesStore = defineStore('vehicles', () => {
|
|||||||
if(cleanfilterArr.length > 0){
|
if(cleanfilterArr.length > 0){
|
||||||
filterStr ="?"+cleanfilterArr.join("&");
|
filterStr ="?"+cleanfilterArr.join("&");
|
||||||
}
|
}
|
||||||
console.log(filterStr);
|
|
||||||
if(vehicles.value.length <= 0 || reload === true) {
|
if(vehicles.value.length <= 0 || reload === true) {
|
||||||
const resp = await getVehicles(filterStr);
|
const resp = await getVehicles(filterStr);
|
||||||
console.log(resp.data);
|
console.log(resp.data);
|
||||||
@@ -23,6 +22,19 @@ export const useVehiclesStore = defineStore('vehicles', () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const createVehicleCompany = async(formData, localData = {}) => {
|
||||||
|
const data = await createVehicle(formData);
|
||||||
|
if(data) {
|
||||||
|
vehicles.value.push({
|
||||||
|
...data,
|
||||||
|
...localData
|
||||||
|
});
|
||||||
|
return 'success';
|
||||||
|
} else {
|
||||||
|
return 'Algo salio mal, intente más tarde';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const updateVehicleCompany = async(id, formData, localData = {}) => {
|
const updateVehicleCompany = async(id, formData, localData = {}) => {
|
||||||
const data = await updateVehicle(id, formData);
|
const data = await updateVehicle(id, formData);
|
||||||
if(data) {
|
if(data) {
|
||||||
@@ -41,10 +53,23 @@ export const useVehiclesStore = defineStore('vehicles', () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const deleteVehicleCompany = async(id) => {
|
||||||
|
const data = await deleteVehicle(id);
|
||||||
|
if(data) {
|
||||||
|
vehicles.value = vehicles.value.filter(vehicle => vehicle._id !== id);
|
||||||
|
return 'success';
|
||||||
|
} else {
|
||||||
|
return 'Algo salio mal, intente más tarde';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
vehicles,
|
vehicles,
|
||||||
fetchVehicles,
|
fetchVehicles,
|
||||||
updateVehicleCompany
|
createVehicleCompany,
|
||||||
|
updateVehicleCompany,
|
||||||
|
deleteVehicleCompany
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Reference in New Issue
Block a user