Skip to content

Instantly share code, notes, and snippets.

@mizradev
Created January 24, 2020 14:53
Show Gist options
  • Save mizradev/bde97c62ea2258ae8cd4b87bcd145a00 to your computer and use it in GitHub Desktop.
Save mizradev/bde97c62ea2258ae8cd4b87bcd145a00 to your computer and use it in GitHub Desktop.
Create Request View
<template>
<div class="h-100">
<div class="row h-100">
<div class="col-sm-4 steps-container">
<div class="progressbar-wrapper">
<ul class="progressbar">
<li
:class="{'active': currentStep == 1, 'filled':step1Filled}"
@click="navigateToStep(1)"
>Datos del viaje</li>
<li
:class="{'active': currentStep == 2, 'filled':step2Filled}"
@click="navigateToStep(2)"
>Datos del Pasajero</li>
<li
:class="{'active': currentStep == 3, 'filled':step3Filled}"
@click="navigateToStep(3)"
>Datos del Vehiculo</li>
</ul>
</div>
<div class="form-wrapper">
<div v-show="currentStep==1" class="step-1">
<AddressField :isInvalid=pickupIsValid :withInitData=true labelText="Punto de Recogida." placeholderText="Escribe aqui una dirección" v-on:didSelectAddress="didSelectPickUp"/>
<AddressField ref="refDropOff" :isInvalid=dropoffIsValid :withInitData=false labelText="Punto de Destino." placeholderText="Escribe aqui una dirección" v-on:didSelectAddress="didSelectDropOff" />
<div class="form-group">
<label for="puntoDeReferencia">Punto de referencia del lugar de recogida.</label>
<textarea class="form-control" v-model="pickupReference" id="puntoDeReferencia" rows="3"></textarea>
</div>
<div>
<button @click="navigateToStep(2)" type="button" class="btn btn-primary">
<span class="cui-contrast"></span>Siguiente
</button>
</div>
</div>
<div v-show="currentStep==2" class="step-2">
<div class="form-group">
<label for="firstName">Nombre</label>
<input v-model="firstName" :class="{'is-invalid': firstNameIsValid}" type="text" class="form-control" id="firstName" placeholder="Escribe el Nombre "
/>
<div class="invalid-feedback">Este campo no puede estar vacio</div>
</div>
<div class="form-group">
<label for="lastName">Apellido</label>
<input v-model="lastName" :class="{'is-invalid': lastNameIsValid}" type="text" class="form-control" id="lastName" placeholder="Escribe el Apellido "
/>
<div class="invalid-feedback">Este campo no puede estar vacio</div>
</div>
<div class="form-group">
<label for="telephone">Teléfono</label>
<VuePhoneNumberInput v-model="telephone" size="sm" :class="{'is-invalid': telephoneIsValid}"
default-country-code="HN" color="#515b65"
required :translations="translation" :dark-color="darkModeTelephoneInput"
:dark="true" :clearable="true" @update="getDataInputNumberPhone($event)" />
<!-- <input v-model="telephone" :class="{'is-invalid': telephoneIsValid}" type="number" class="form-control" id="telephone" placeholder="Teléfono " /> -->
<div class="invalid-feedback">Este campo no puede estar vacio</div>
</div>
<div class="form-group">
<label for="telephone">Correo electrónico</label>
<div class="input-group">
<span class="input-group-prepend">
<span class="input-group-text">
<i class="fa fa-envelope"></i>
</span>
</span>
<input type="email" class="form-control" id="email" placeholder="cpagua@larez.com" v-model="email" autocomplete="off">
</div>
<small class="text-muted">ej. juan@miempresa.com</small>
<div class="invalid-feedback">Este campo no puede estar vacio</div>
</div>
<div>
<button @click="navigateToStep(1)" type="button" class="btn btn-secondary spacing">
<span class="cui-contrast"></span> Atrás
</button>
<button @click="navigateToStep(3)" type="button" class="btn btn-primary spacing">
<span class="cui-contrast"></span>Siguiente
</button>
</div>
</div>
<div v-show="currentStep==3" class="step-3">
<div class="form-group">
<label for="puntoDeReferencia">Selecciona Tipo de Vehiculo</label>
<div class="scrolling-wrapper-flexbox">
<VehicleTypeCard v-for="vehicle in vehicleTypeList" v-on:didSelectTypeVehicle="didSelectTypeVehicle" :vehicleType="vehicle" :key="vehicle.id" />
</div>
<p class="text-danger" v-if="typeVehicleIsValid">Seleccione un tipo de vehiculo para hacer la solicitud</p>
</div>
<div class="form-group">
<div class="scrolling-wrapper-flexbox">
<PaymentMethodsBtnRadio :methodPayment="paymentMethods" @didSelectPayment='methodDidSelectPayment($event)' labelName="Seleccione un método de pago" />
</div>
<p class="text-danger" v-if="typeVehicleIsValid">Seleccione una forma de pago para pedir el Ryte.</p>
</div>
<!-- <div v-if="methodPaymentSelected === 3" class="form-group">
<div>
<label for="envio">Seleccione un método de envío</label>
<select name="envio" id="" v-model="sendRemotePayment" class="form-control">
<option value="1" >SMS</option>
<option value="2">Email</option>
</select>
</div>
<p class="text-danger" v-if="typeVehicleIsValid">Seleccione una forma de pago para hacer la solicitud</p>
</div> -->
<div class="form-group">
<label for="observation">Observación</label>
<textarea class="form-control" v-model="observation" id="observation" rows="3"></textarea>
</div>
<div>
<button @click="navigateToStep(2)" type="button" class="btn btn-secondary spacing">
<span class="cui-contrast"></span> Atrás
</button>
<button @click="requestBooking" type="button" class="btn btn-primary spacing">
<span class="cui-contrast"></span>Pedir un Ryte
</button>
</div>
</div>
</div>
</div>
<div class="col-sm-4">
<div class="d-flex justify-content-center">
<h2>En espera</h2>
</div>
<div class="row" v-if="bookingsArrived.length === 0">
<div class="col-12 text-center">
<span>No hay Rytes en espera</span>
</div>
</div>
<div v-else v-for="booking in getBookingsArrived" :key="booking.bookingId">
<Booking v-on:didRemoveBooking="didRemoveBooking" @click.native="didSelectBooking(booking)" :booking="booking" :key="booking.bookingId" />
</div>
</div>
<div class="col-sm-4 last-column">
<div class="d-flex justify-content-center">
<h2>En el Ryte</h2>
</div>
<div class="row" v-if="bookingOnTrip.length === 0">
<div v-if="bookingsArrived" class="col-12 text-center">
<span>No hay Rytes en curso</span>
</div>
</div>
<div v-else v-for="booking in getBookingOnTrip" :key="booking.bookingId">
<Booking v-on:didRemoveBooking="didRemoveBooking" @click.native="didSelectBooking(booking)" :booking="booking" :key="booking.bookingId" />
</div>
</div>
</div>
<BookingDetailsAside v-on:didRemoveBooking="didRemoveBooking" @ocultar="showAside = false" :booking="selectedBooking" class="bookingDetails" v-if="showAside" />
</div>
</template>
<script>
import Booking from '@/components/Booking.vue';
import VehicleTypeCard from '@/components/VehicleTypeCard.vue';
import GMapGeocoder from '@/components/GMapGeocoder.vue';
import AddressField from '@/components/AddressField.vue';
import BookingDetailsAside from '@/components/BookingDetailsAside.vue';
import PaymentMethodsBtnRadio from '@/components/PaymentMethodsBtnRadio.vue'
import Api from "../services/Api";
import VuePhoneNumberInput from 'vue-phone-number-input';
import 'vue-phone-number-input/dist/vue-phone-number-input.css';
import { getObjectFromLocalStorage, setObjectToLocalStorage, removeFromList, getDateWithFormat, verifyBookingStatus } from "../shared/utils"
import swal from "sweetalert";
export default {
name: 'createRequest',
components:{
Booking,
GMapGeocoder,
VehicleTypeCard,
AddressField,
BookingDetailsAside,
PaymentMethodsBtnRadio,
VuePhoneNumberInput
},
data() {
return {
sendRemotePayment: 1,
pickupIsValid: false,
dropoffIsValid: false,
firstNameIsValid: false,
lastNameIsValid: false,
telephoneIsValid: false,
emailIsValid: false,
typeVehicleIsValid: false,
showAside: false,
bookingsArrived:[],
bookingOnTrip:[],
userData: {},
firstName:null,
lastName:null,
telephone:null,
email: null,
pickupReference:null,
observation:null,
expanded: 0,
currentStep: 1,
step1Filled: false,
step2Filled: false,
step3Filled: false,
pickupData: null,
dropoffData: null,
vehicleTypeList: [],
selectedVehicle: null,
selectedBooking: {},
dispatchPointId:null,
methodPaymentSelected:Api._methodPayment,
paymentMethods : [
{
value: 1,
text: "Efectivo"
},
{
value: 2,
text: "Tarjeta de Crédito"
},
{
value: 3,
text: "Pago Remoto"
}
],
sendRemotePayment:1,
translation:{
countrySelectorLabel: 'Código de pais',
phoneNumberLabel: 'Número de teléfono',
example: 'Ejemplo :'
},
darkModeTelephoneInput : '#515b65',
countryCodeNumber: null
}
},
methods: {
initiateMqtt(){
this.$mqtt.launch((message, topic) => {
// Si existe un topic, aca devuelve los mensajes de ese topic
if (topic){
var booking = message;
console.log(message);
booking.textBookingStatus = this.setTextBookingStatus(booking.status)
this.setBookingToList(booking);
this.setBookingsOnGoingInStorage(booking);
this.removeBooking(booking);
}else{
console.log('MQTT Conectado Correctamente', message)
this.getTopicForDispatchPoint(this.$mqtt);
console.log(this.$mqtt);
}
})
},
setBookingToList(booking) {
removeFromList(this.bookingsArrived,booking.bookingId)
removeFromList(this.bookingOnTrip,booking.bookingId)
if (booking.status === 1 || booking.status === 2 || booking.status === 6 || booking.status === 7) {
this.bookingsArrived.push(booking)
}else if(booking => booking.status === 9 || booking.status === 12 || booking.status === 5){
this.bookingOnTrip.push(booking)
}
this.$toasted.show(booking.textBookingStatus, {
theme: "toasted-primary",
position: "top-center",
duration : 1000
})
},
setBookingsOnGoingInStorage(booking){
console.log('Booking entrante:: ', booking);
let currentBookingsOnGoing = null;
if(getObjectFromLocalStorage("bookingsOnGoing") != null && getObjectFromLocalStorage("bookingsOnGoing").length >= 0){
currentBookingsOnGoing = getObjectFromLocalStorage("bookingsOnGoing");
}else{
currentBookingsOnGoing = [];
setObjectToLocalStorage("bookingsOnGoing", currentBookingsOnGoing);
}
if (booking.status === 1 || booking.status === 2 || booking.status === 6 || booking.status === 7) {
console.log('desde SetBookingsOnGoingInStorage ====',booking);
currentBookingsOnGoing.push(booking);
setObjectToLocalStorage("bookingsOnGoing", currentBookingsOnGoing);
// var resp = currentBookingsOnGoing.find(currentBooking => currentBooking.id === booking.bookingId);
// if(Object.prototype.toString.call(resp) === '[object Object]'){
// console.log('Ya esta en localStorage: ',resp);
// }else if(resp === undefined){
// currentBookingsOnGoing.push(resp);
// setObjectToLocalStorage("bookingsOnGoing", currentBookingsOnGoing);
// }
}else if(booking => booking.status === 9){
currentBookingsOnGoing.push(booking);
setObjectToLocalStorage("bookingsOnGoing", currentBookingsOnGoing);
// var resp = currentBookingsOnGoing.find(currentBooking => currentBooking.id === booking.bookingId);
// if(Object.prototype.toString.call(resp) === '[object Object]'){
// console.log('Ya esta en localStorage: ',resp);
// }else if(resp === undefined){
// currentBookingsOnGoing.push(resp);
// setObjectToLocalStorage("bookingsOnGoing", currentBookingsOnGoing);
// }
}
//this.getBookingsOnGoingInStorage();
},
removeBooking(booking){
if(!(getObjectFromLocalStorage("bookingsOnGoing") === null) &&
(getObjectFromLocalStorage("bookingsOnGoing")).length > 0){
if(booking.status === 12 || booking.status === 30 ){
let currentBookings = getObjectFromLocalStorage("bookingsOnGoing");
let indexBookingToDelete = null;
indexBookingToDelete = currentBookings.findIndex(b => b.status === 12 || booking.status === 30 || booking.status === 5);
currentBookings.splice(indexBookingToDelete,1);
setObjectToLocalStorage("bookingsOnGoing",currentBookings);
}
}
},
getBookingsOnGoingInStorage(){
console.log("Booking desde Storage, antes de validacion +++ ",JSON.parse(localStorage.getItem("bookingsOnGoing")));
if(!(getObjectFromLocalStorage("bookingsOnGoing") === null)){
if((getObjectFromLocalStorage("bookingsOnGoing")).length > 0){
Api.getBookingsLogsByDispatchPointId(this.dispatchPoint.dispatchPointId)
.then(result => {
let bookingsLogs = result.data;
console.log('Bookings Logs===== ', bookingsLogs);
// let bookingsLocal = getObjectFromLocalStorage("bookingsOnGoing");
let bookingsLocal = JSON.parse(localStorage.getItem("bookingsOnGoing"));
console.log('bookingsLocal', bookingsLocal)
let BookingVerificated = {};
let BookingsLogsUpdated = [];
bookingsLogs.forEach( item => {
BookingVerificated = verifyBookingStatus(bookingsLocal, item.bookingLogsBookingId);
if(BookingVerificated != null){
BookingVerificated.status = item.bookingLogsStatus;
//console.log('BookingVerificated: ',BookingVerificated);
//BookingsLogsUpdated.push(BookingVerificated)
this.setBookingToList(BookingVerificated);
}
});
//this.setBookingsOnGoingInStorage("bookingsOnGoing",BookingsLogsUpdated);
}).catch(err => console.log(err));
}else{
console.log('BookingsOnGoing VACIO >>>>>>>>>');
}
}else {
console.log('BookingsOnGoing No existe >>>>>>>>>');
}
},
setTextBookingStatus(status) {
if(status === 1){
return 'Enviando solicitud';
}else if(status === 2){
return 'Ryte Aceptado';
}else if(status === 5){
return 'Ryte Cancelado por el conductor';
}else if(status === 6){
return 'Conductor en camino';
}else if(status === 7){
return 'Llegado';
}else if(status === 9){
return 'En Ryte';
}else if(status === 12){
return 'Ryte completado';
}
},
navigateToStep(step) {
let _this = this;
switch (step) {
case 1:
_this.step1Filled = true;
_this.currentStep = step;
break;
case 2:
_this.step1Filled = true;
_this.step2Filled = true;
if (this.pickupData && this.dropoffData){
this.getFareEstimateAll()
_this.currentStep = step;
}else{
this.pickupIsValid = !this.pickupData
this.dropoffIsValid = !this.dropoffData
}
break;
case 3:
console.log("3")
_this.step1Filled = true;
_this.step2Filled = true;
_this.step3Filled = true;
if (this.firstName && this.lastName && this.telephone){
_this.currentStep = step;
}else{
this.firstNameIsValid = !this.firstName
this.lastNameIsValid = !this.lastName
this.telephoneIsValid = !this.telephone
}
break;
}
},
getFareEstimateAll: function() {
var pickupLatLong = this.pickupData.latitude+","+this.pickupData.longitude
var dropLatLong = this.dropoffData.latitude+","+this.dropoffData.longitude
var formData = new FormData();
formData.append('pickupLatLong', pickupLatLong);
formData.append('pickup', this.pickupData.address);
formData.append('dropLatLong', dropLatLong);
formData.append('drop', this.dropoffData.address);
Api.getFareEstimateAll(formData).then(response => {
this.vehicleTypeList = []
var fares = response.data
var vehicleTypes = response.vehicleTypes
for (var i = 0; i < fares.length; i++) {
var fare = fares[i];
var vehicle = vehicleTypes[i];
var item = {}
item.typeId = vehicle.typeId;
item.typeName = vehicle.typeName;
item.vehicleImgOn = vehicle.vehicleImgOn;
item.amount = fare.finalAmount;
item.timeFare = fare.durationCharged;
item.distFare = fare.distanceCharged;
item.distance = fare.distance;
item.duration = fare.duration;
item.estimateId = fare.estimateId;
item.currencySymbol = fare.currencySymbol;
this.vehicleTypeList.push(item)
}
}).catch(error => {
console.log(error)
}).finally(()=>{
});
},
didSelectTypeVehicle: function(vehicleType){
//console.log(vehicleType)
this.selectedVehicle = vehicleType
},
didSelectDropOff: function(address){
console.log(address)
this.dropoffData = address
},
didSelectPickUp: function(address){
console.log(address)
this.pickupData = address
},
cleanForm: function(){
var currentDispatchPoint = getObjectFromLocalStorage('_currentDispatchPoint')
this.currentStep = 1
this.pickupIsValid = false;
this.dropoffIsValid = false;
this.firstNameIsValid = false;
this.lastNameIsValid = false;
this.telephoneIsValid = false;
this.typeVehicleIsValid = false;
this.firstName = null;
this.lastName = null;
this.telephone = null;
this.pickupReference = null;
this.observation = null;
this.currentStep = 1;
this.step1Filled = false;
this.step2Filled = false;
this.step3Filled = false;
this.pickupData = {
title : currentDispatchPoint.address,
latitude : currentDispatchPoint.latitude,
longitude : currentDispatchPoint.longitude
};
this.dropoffData = null;
this.vehicleTypeList = [];
this.selectedVehicle = null;
this.email = null;
this.$refs.refDropOff.cleanFields();
},
requestBooking: function() {
var formData = new FormData();
if (!this.selectedVehicle){
this.typeVehicleIsValid = true
return
}
//"2019-01-29 14:30:56"
formData.append('vehicleTypeId', this.selectedVehicle.typeId);
formData.append('bookingDate', getDateWithFormat());
formData.append('deviceTime', getDateWithFormat());
formData.append('amount', this.selectedVehicle.amount);
formData.append('timeFare', this.selectedVehicle.timeFare);
formData.append('distFare', this.selectedVehicle.distFare);
formData.append('distance', this.selectedVehicle.distance);
formData.append('duration', this.selectedVehicle.duration);
formData.append('pickupAddress', this.pickupData.address);
formData.append('pickupLongitude', this.pickupData.longitude);
formData.append('pickupLatitude', this.pickupData.latitude);
formData.append('dropAddress', this.dropoffData.address);
formData.append('dropLongitude', this.dropoffData.longitude);
formData.append('dropLatitude', this.dropoffData.latitude);
formData.append('customerName', this.firstName + " " + this.lastName);
formData.append('customerLastName', this.lastName);
formData.append('customerNumber', this.telephone);
//formData.append('customerEmail', this.email);
formData.append('customerCountryCode', `\+${this.countryCodeNumber}`);
formData.append('dispatchPointId', this.dispatchPoint.dispatchPointId);
formData.append('corporateId', this.userData.corporateId);
formData.append('pickupReference', this.pickupReference);
formData.append('observation', this.observation);
formData.append('estimateId',this.selectedVehicle.estimateId);
if(this.methodPaymentSelected === 2){
formData.append('paymentMethod', 1);
}else{
formData.append('paymentMethod', this.methodPaymentSelected);
}
formData.append('sendRemotePayment', this.sendRemotePayment);
Api.requestBooking(formData).then(response => {
var booking = response.data
booking.status = 1
booking.someOne = {"name": this.firstName + " " + this.lastName, "mobile": this.telephone}
booking.textBookingStatus = this.setTextBookingStatus(booking.status);
this.setBookingToList(booking)
swal("Exitoso","Pedido realizado correctamente.","success" ,{
buttons: false,
timer: 3000,
}).then(resp => {
if(this.methodPaymentSelected === 3){
swal("Pago remoto",`Para realiza el pago ingrese al siguiente enlace: <a href="${response.data.tinyUrl}" target="_blank">${response.data.tinyUrl}<a>`, 'success');
}
}).catch(err => console.log(err))
this.cleanForm();
}).catch(error => {
swal("Error","No se pudo realizar el pedido","error");
console.log("Error al pedir Ryte: ",error);
});
//window.location.href = "/#/createRequest";
},
didSelectBooking(booking){
this.selectedBooking = booking
if (booking.status == 6 || booking.status == 7 || booking.status === 9){
if(this.showAside){
this.showAside = false
}else{
this.showAside = true
}
}
},
getTopicForDispatchPoint: function($mqtt) {
Api.getTopicForDispatchPoint(this.dispatchPoint.dispatchPointId).then(response => {
var topicsList = response.data;
topicsList.forEach(function(topic, index) {
$mqtt.subscribe(topic)
})
}).catch(error => {
console.log(error)
}).finally(()=>{
});
},
didRemoveBooking: function(bookingId){
console.log(bookingId);
removeFromList(this.bookingsArrived, bookingId)
removeFromList(this.bookingOnTrip, bookingId)
},
methodDidSelectPayment: function(p){
this.methodPaymentSelected = p;
},
getDataInputNumberPhone(payload){
this.countryCodeNumber = payload.countryCallingCode;
}
},
mounted(){
this.userData = getObjectFromLocalStorage("_userData")
this.dispatchPoint = getObjectFromLocalStorage("_currentDispatchPoint");
this.initiateMqtt();
console.log('Bookings Arrived++++<desde Mounted >++++ ',this.bookingsArrived);
console.log('Bookings On trip++++<desde Mounted >++++ ',this.bookingOnTrip);
console.log(getDateWithFormat());
this.getBookingsOnGoingInStorage();
console.log(this.activeMethods);
//console.log('SURAAA',this.$data)
},
computed:{
getBookingsArrived(){
return this.bookingsArrived.reverse();
},
getBookingOnTrip(){
return this.bookingOnTrip.reverse();
}
// bookingsArrivedIsEmpty(){
// return this.bookingsArrived.length == 0
// },
// bookingOnTripIsEmpty(){
// return this.bookingOnTrip.length == 0
// }
}
}
</script>
<style scoped>
.bookingDetails{
position: fixed;
z-index:2;
right:0;
bottom:0;
}
</style>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment