add: delete load

This commit is contained in:
Alexandro Uc Santos
2023-12-14 21:59:45 -06:00
parent 292d125216
commit 4228ba5129
7 changed files with 179 additions and 78 deletions

10
package-lock.json generated
View File

@@ -11,6 +11,7 @@
"axios": "^1.6.2", "axios": "^1.6.2",
"pinia": "^2.1.7", "pinia": "^2.1.7",
"sass": "^1.69.5", "sass": "^1.69.5",
"sweetalert2": "^11.10.1",
"vue": "^3.3.4", "vue": "^3.3.4",
"vue-multiselect": "^3.0.0-beta.3", "vue-multiselect": "^3.0.0-beta.3",
"vue-router": "^4.2.5", "vue-router": "^4.2.5",
@@ -996,6 +997,15 @@
"kdbush": "^4.0.2" "kdbush": "^4.0.2"
} }
}, },
"node_modules/sweetalert2": {
"version": "11.10.1",
"resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.10.1.tgz",
"integrity": "sha512-qu145oBuFfjYr5yZW9OSdG6YmRxDf8CnkgT/sXMfrXGe+asFy2imC2vlaLQ/L/naZ/JZna1MPAY56G4qYM0VUQ==",
"funding": {
"type": "individual",
"url": "https://github.com/sponsors/limonte"
}
},
"node_modules/to-regex-range": { "node_modules/to-regex-range": {
"version": "5.0.1", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",

View File

@@ -11,6 +11,7 @@
"axios": "^1.6.2", "axios": "^1.6.2",
"pinia": "^2.1.7", "pinia": "^2.1.7",
"sass": "^1.69.5", "sass": "^1.69.5",
"sweetalert2": "^11.10.1",
"vue": "^3.3.4", "vue": "^3.3.4",
"vue-multiselect": "^3.0.0-beta.3", "vue-multiselect": "^3.0.0-beta.3",
"vue-router": "^4.2.5", "vue-router": "^4.2.5",

View File

@@ -3,6 +3,7 @@
import { getStatusPublished } from '../helpers/status'; import { getStatusPublished } from '../helpers/status';
import { getStatusLoad } from '../helpers/status'; import { getStatusLoad } from '../helpers/status';
import { useLoadsStore } from '../stores/loads'; import { useLoadsStore } from '../stores/loads';
import Swal from 'sweetalert2'
const loadsStore = useLoadsStore(); const loadsStore = useLoadsStore();
@@ -11,13 +12,55 @@
type: Object, type: Object,
required: true, required: true,
} }
}) });
const openAttachmentsModal = () => { const openAttachmentsModal = () => {
loadsStore.currentLoad = props.load; loadsStore.currentLoad = props.load;
loadsStore.openAttachmentsModal = true; loadsStore.openAttachmentsModal = true;
} }
const handleDeleteLoad = async() => {
Swal.fire({
title: 'Eliminar carga!',
text: '¿Estás seguro de eliminar esta carga?',
icon: 'warning',
showCancelButton: true,
cancelButtonColor: "#d33",
confirmButtonText: 'Eliminar',
cancelButtonText: 'Cancelar',
}).then(async(result) => {
if(result.isConfirmed) {
Swal.fire({
title: 'Por favor espere!',
html: 'Eliminando carga...',// add html attribute if you want or remove
allowOutsideClick: false,
didOpen: () => {
Swal.showLoading()
},
});
const resp = await loadsStore.deleteLoad(props.load._id);
if(resp != null) {
loadsStore.loads = loadsStore.loads.filter(load => load._id !== props.load._id);
Swal.fire({
title: "Carga eliminada!",
text: "Tu carga ha sido eliminada exitosamente.",
icon: "success"
});
} else {
Swal.fire({
title: "No eliminado!",
text: "Tu carga no se pudo eliminar, intente más tarde.",
icon: "error"
});
}
}
});
}
const openEditModal = () => { const openEditModal = () => {
loadsStore.currentLoad = props.load loadsStore.currentLoad = props.load
loadsStore.openModalEdit = true; loadsStore.openModalEdit = true;
@@ -74,7 +117,7 @@
<div class="btn-row"> <div class="btn-row">
<button <button
class="btn-primary-sm bg-dark" class="btn-primary-sm bg-dark"
data-toggle="modal" data-target="#editcompanymodal" @click="handleDeleteLoad"
><i class="fa-solid fa-ban clear-sm"></i> Cancelar</button> ><i class="fa-solid fa-ban clear-sm"></i> Cancelar</button>
<button v-if="load.status !== 'Draft' && load.load_status !== 'Published' && load.load_status !== 'Loading'" <button v-if="load.status !== 'Draft' && load.load_status !== 'Published' && load.load_status !== 'Loading'"
type="button" type="button"
@@ -86,11 +129,13 @@
Evidencias Evidencias
</button> </button>
<button <button
v-if="load.load_status !== 'Delivered'"
class="btn-primary-sm" class="btn-primary-sm"
data-toggle="modal" data-target="#formLoadModal" data-toggle="modal" data-target="#formLoadModal"
@click="openEditModal" @click="openEditModal"
><i class="fa-solid fa-pen-to-square clear-sm"></i> Editar carga</button> ><i class="fa-solid fa-pen-to-square clear-sm"></i> Editar carga</button>
<button <button
v-if="load.status !== 'Draft'"
class="btn-primary-sm" class="btn-primary-sm"
@click="openProposalsModal" @click="openProposalsModal"
data-toggle="modal" data-toggle="modal"

View File

@@ -6,13 +6,12 @@
import TruckTypes from './ui/TruckTypes.vue'; import TruckTypes from './ui/TruckTypes.vue';
import Cities from './ui/Cities.vue'; import Cities from './ui/Cities.vue';
import States from './ui/States.vue'; import States from './ui/States.vue';
import Spiner from './ui/Spiner.vue';
import Products from './ui/Products.vue'; import Products from './ui/Products.vue';
import { GoogleMap, Marker, Polyline } from "vue3-google-map"; import { GoogleMap, Marker, Polyline } from "vue3-google-map";
import useDirectionsRender from '../composables/useDirectionRender'; import useDirectionsRender from '../composables/useDirectionRender';
import { useAuthStore } from '../stores/auth'; import { useAuthStore } from '../stores/auth';
import { useRouter } from 'vue-router';
const router = useRouter()
const loadStore = useLoadsStore(); const loadStore = useLoadsStore();
const auth = useAuthStore(); const auth = useAuthStore();
const windowWidth = ref(window.innerWidth); const windowWidth = ref(window.innerWidth);
@@ -22,6 +21,7 @@
const destinationCoords = ref(null); const destinationCoords = ref(null);
const startLocation = ref(null); const startLocation = ref(null);
const endLocation = ref(null); const endLocation = ref(null);
const isLoading = ref(false);
const { geocodeAddress } = useDirectionsRender(); const { geocodeAddress } = useDirectionsRender();
@@ -61,8 +61,8 @@
formLoad.owner = loadStore.currentLoad.posted_by_name; formLoad.owner = loadStore.currentLoad.posted_by_name;
formLoad.notes = loadStore.currentLoad.notes; formLoad.notes = loadStore.currentLoad.notes;
formLoad.weight = loadStore.currentLoad.weight; formLoad.weight = loadStore.currentLoad.weight;
formLoad.dateLoad = loadStore.currentLoad.est_loading_date.substring(0, 10); formLoad.dateLoad = loadStore.currentLoad.est_loading_date?.substring(0, 10);
formLoad.dateDownload = loadStore.currentLoad.est_unloading_date.substring(0, 10); formLoad.dateDownload = loadStore.currentLoad.est_unloading_date?.substring(0, 10);
formLoad.truckType = {meta_value: loadStore.currentLoad.truck_type}; formLoad.truckType = {meta_value: loadStore.currentLoad.truck_type};
origin.locationName = loadStore.currentLoad.origin.company_name; origin.locationName = loadStore.currentLoad.origin.company_name;
@@ -84,6 +84,7 @@
} }
watch(origin, async() => { watch(origin, async() => {
console.log(origin);
if(origin.address && origin.city && origin.state) { if(origin.address && origin.city && origin.state) {
startLocation.value = origin.address + ', ' + origin.city.city_name + ', ' + origin.state.state_name + ', ' + origin.country + ', ' +origin.postalCode; startLocation.value = origin.address + ', ' + origin.city.city_name + ', ' + origin.state.state_name + ', ' + origin.country + ', ' +origin.postalCode;
originCoords.value = await geocodeAddress(startLocation.value); originCoords.value = await geocodeAddress(startLocation.value);
@@ -103,9 +104,13 @@
}) })
const getCoordsMap = async() => { const getCoordsMap = async() => {
if(loadStore.currentLoad.origin_formatted_address) {
originCoords.value = await geocodeAddress(loadStore.currentLoad.origin_formatted_address); originCoords.value = await geocodeAddress(loadStore.currentLoad.origin_formatted_address);
}
if(loadStore.currentLoad.destination_formatted_address){
destinationCoords.value = await geocodeAddress(loadStore.currentLoad.destination_formatted_address); destinationCoords.value = await geocodeAddress(loadStore.currentLoad.destination_formatted_address);
} }
}
const formLoad = reactive({ const formLoad = reactive({
@@ -158,8 +163,8 @@
country : origin.country, country : origin.country,
landmark : origin.ref, landmark : origin.ref,
zipcode : origin.postalCode, zipcode : origin.postalCode,
lat : originCoords.value.lat, lat : originCoords.value?.lat,
lng : originCoords.value.lng lng : originCoords.value?.lng
}, },
destination:{ destination:{
company_name : destination.locationName, company_name : destination.locationName,
@@ -169,8 +174,8 @@
country : destination.country, country : destination.country,
landmark : destination.ref, landmark : destination.ref,
zipcode : destination.postalCode, zipcode : destination.postalCode,
lat : destinationCoords.value.lat, lat : destinationCoords.value?.lat,
lng : destinationCoords.value.lng lng : destinationCoords.value?.lng
}, },
company: auth.user.company, company: auth.user.company,
posted_by: auth.user._id, posted_by: auth.user._id,
@@ -178,14 +183,18 @@
}; };
console.log('loadData: ', loadData); console.log('loadData: ', loadData);
isLoading.value = true;
if(loadStore.currentLoad){ if(loadStore.currentLoad){
const resp = await loadStore.updateLoad(loadStore.currentLoad._id, loadData); const resp = await loadStore.updateLoad(loadStore.currentLoad._id, loadData);
const index = loadStore.loads.findIndex((load) => load._id === resp._id); const index = loadStore.loads.findIndex((load) => load._id === resp._id);
isLoading.value = false;
loadStore.loads[index] = resp; loadStore.loads[index] = resp;
document.getElementById('btnCloseFormLoadModal').click(); document.getElementById('btnCloseFormLoadModal').click();
} else{ } else{
const resp = await loadStore.saveLoad(loadData); const resp = await loadStore.saveLoad(loadData);
loadStore.loads.push(resp); isLoading.value = false;
loadStore.loads.unshift(resp);
document.getElementById('btnCloseFormLoadModal').click();
} }
} }
</script> </script>
@@ -406,6 +415,8 @@
</GoogleMap> </GoogleMap>
</div> </div>
<div class="modal-footer custom-footer"> <div class="modal-footer custom-footer">
<Spiner v-if="isLoading"/>
<div v-else class="btns-footer">
<button <button
type="button" type="button"
class="btn btn-dark" class="btn btn-dark"
@@ -425,6 +436,7 @@
</div> </div>
</div> </div>
</div> </div>
</div>
</template> </template>
<style scoped> <style scoped>
@@ -455,6 +467,11 @@
justify-content: center; justify-content: center;
} }
.btns-footer {
display: flex;
gap: 1rem;
}
.radius-sm{ .radius-sm{
border-radius: 5px; border-radius: 5px;
} }

View File

@@ -4,6 +4,8 @@
import Spiner from './ui/Spiner.vue'; import Spiner from './ui/Spiner.vue';
import { getDateMonthDay } from '../helpers/date_formats'; import { getDateMonthDay } from '../helpers/date_formats';
import VehicleInfo from './VehicleInfo.vue'; import VehicleInfo from './VehicleInfo.vue';
import Swal from 'sweetalert2'
const loadsStore = useLoadsStore(); const loadsStore = useLoadsStore();
const isLoading = ref(false); const isLoading = ref(false);
@@ -32,7 +34,16 @@
}; };
} }
const handleCancelProposal = (proposal) => { const handleCancelProposal = async(proposal) => {
const {isConfirmed} = await Swal.fire({
title: 'Cancelar oferta!',
text: '¿Estás seguro de cancelar esta oferta?',
icon: 'question',
showCancelButton: true,
confirmButtonText: 'Si',
cancelButtonText: 'No'
})
if( isConfirmed ) {
const index = loadsStore.proposalsOfLoads.findIndex((p) => p._id === proposal._id); const index = loadsStore.proposalsOfLoads.findIndex((p) => p._id === proposal._id);
// console.log(loadsStore.proposalsOfLoads[index]) // console.log(loadsStore.proposalsOfLoads[index])
loadsStore.proposalsOfLoads[index] = { loadsStore.proposalsOfLoads[index] = {
@@ -40,6 +51,7 @@
is_accepted: false is_accepted: false
}; };
} }
}
</script> </script>
@@ -59,7 +71,8 @@
</div> </div>
<div class="modal-body view-proposals"> <div class="modal-body view-proposals">
<Spiner v-if="isLoading"/> <Spiner v-if="isLoading"/>
<div v-else v-for="proposal in loadsStore.proposalsOfLoads" class="card-fixed card-proposal"> <div v-else>
<div v-if="loadsStore.proposalsOfLoads.length > 0" v-for="proposal in loadsStore.proposalsOfLoads" class="card-fixed card-proposal">
<div class="row"> <div class="row">
<div class="col-lg-6 col-md-12"> <div class="col-lg-6 col-md-12">
<p>Empresa: <span>{{ proposal.carrier.company_name }}</span></p> <p>Empresa: <span>{{ proposal.carrier.company_name }}</span></p>
@@ -90,7 +103,7 @@
Aceptar Aceptar
</button> </button>
<button <button
v-if="proposal.load.load_status !== 'Delivered'" v-if="proposal.load.load_status !== 'Delivered' && proposal.is_accepted"
class="btn-primary-sm" class="btn-primary-sm"
@click="handleCancelProposal(proposal)" @click="handleCancelProposal(proposal)"
> >
@@ -99,6 +112,10 @@
</button> </button>
</div> </div>
</div> </div>
<div v-else>
No hay ofertas
</div>
</div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button <button

View File

@@ -23,8 +23,8 @@ export const getStatusLoad = (load) => {
color = "#000000"; color = "#000000";
break; break;
default: default:
status = 'Publicado'; status = 'Sin publicar';
color = "#428502"; color = "#000000";
break; break;
} }
return { return {

View File

@@ -23,7 +23,7 @@ export const useLoadsStore = defineStore('load', () => {
try { try {
const endpoint = `/loads?company=${companyid}&${filterStr}`; const endpoint = `/loads?company=${companyid}&${filterStr}`;
const {data} = await api.get(endpoint); const {data} = await api.get(endpoint);
console.log(data); // console.log(data);
loads.value = data.data; loads.value = data.data;
} catch (error) { } catch (error) {
loads.value = []; loads.value = [];
@@ -34,9 +34,8 @@ export const useLoadsStore = defineStore('load', () => {
const getProposalsOfLoads = async(filterQuery) => { const getProposalsOfLoads = async(filterQuery) => {
try { try {
const endpoint = `/proposals/?load=${filterQuery}`; const endpoint = `/proposals/?load=${filterQuery}`;
console.log(endpoint);
const {data} = await api.get(endpoint); const {data} = await api.get(endpoint);
console.log(data); // console.log(data);
proposalsOfLoads.value = data.data; proposalsOfLoads.value = data.data;
} catch (error) { } catch (error) {
proposalsOfLoads.value = []; proposalsOfLoads.value = [];
@@ -47,9 +46,8 @@ export const useLoadsStore = defineStore('load', () => {
const saveLoad = async(load) => { const saveLoad = async(load) => {
try { try {
const endpoint = `/loads/`; const endpoint = `/loads/`;
console.log(endpoint);
const {data} = await api.post(endpoint, load); const {data} = await api.post(endpoint, load);
console.log(data); // console.log(data);
return data; return data;
} catch (error) { } catch (error) {
console.log(error); console.log(error);
@@ -60,8 +58,20 @@ export const useLoadsStore = defineStore('load', () => {
const updateLoad = async(loadId, load) => { const updateLoad = async(loadId, load) => {
try { try {
const endpoint = `/loads/${loadId}`; const endpoint = `/loads/${loadId}`;
console.log(endpoint);
const {data} = await api.patch(endpoint, load); const {data} = await api.patch(endpoint, load);
// console.log(data);
return data;
} catch (error) {
console.log(error);
return null;
}
}
const deleteLoad = async(loadId) => {
try {
const endpoint = `/loads/${loadId}`;
console.log(endpoint);
const {data} = await api.delete(endpoint);
console.log(data); console.log(data);
return data; return data;
} catch (error) { } catch (error) {
@@ -77,6 +87,7 @@ export const useLoadsStore = defineStore('load', () => {
openAttachmentsModal, openAttachmentsModal,
getProposalsOfLoads, getProposalsOfLoads,
getCompanyLoads, getCompanyLoads,
deleteLoad,
saveLoad, saveLoad,
updateLoad, updateLoad,
loads, loads,