Skip to content

Instantly share code, notes, and snippets.

@yigitcanakkaya
Created April 15, 2020 11:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yigitcanakkaya/21b08889efaccdb6e0cd25578ecfa393 to your computer and use it in GitHub Desktop.
Save yigitcanakkaya/21b08889efaccdb6e0cd25578ecfa393 to your computer and use it in GitHub Desktop.
(function ($) {
new Vue({
el:'#bravo_tour_book_app',
data:{
id:'',
extra_price:[],
person_types:[],
message:{
content:'',
type:false
},
html:'',
onSubmit:false,
start_date:'',
start_date_html:'',
step:1,
guests:1,
price:0,
max_guests:1,
start_date_obj:'',
duration:0,
allEvents:[],
buyer_fees:[],
},
watch:{
extra_price:{
handler:function f() {
this.step = 1;
},
deep:true
},
start_date(){
this.step = 1;
},
guests(){
this.step = 1;
},
person_types:{
handler:function f() {
this.step = 1;
},
deep:true
},
},
computed:{
total_price:function(){
var me = this;
if (me.start_date !== "") {
var total = 0;
var total_guests = 0;
var startDate = new Date(me.start_date).getTime();
for (var ix in me.allEvents) {
var item = me.allEvents[ix];
var cur_date = new Date(item.start).getTime();
if (cur_date === startDate) {
if (item.person_types != null) {
me.person_types = Object.assign([], item.person_types);
} else {
me.person_types = null
}
me.max_guests = parseInt(item.max_guests);
me.price = parseFloat(item.price);
}
}
// for person types
if (me.person_types != null) {
for (var ix in me.person_types) {
var person_type = me.person_types[ix];
total += parseFloat(person_type.price) * parseInt(person_type.number);
total_guests += parseInt(person_type.number);
}
}else{
// for default
total_guests = me.guests;
total += me.guests * me.price;
}
for (var ix in me.extra_price) {
var item = me.extra_price[ix];
var type_total = 0;
if (item.enable === true) {
switch (item.type) {
case "one_time":
type_total += parseFloat(item.price);
break;
case "per_hour":
if (me.duration > 0) {
type_total += parseFloat(item.price) * parseFloat(me.duration);
}
break;
case "per_day":
if (me.duration > 0) {
type_total += parseFloat(item.price) * Math.ceil(parseFloat(me.duration) / 24);
}
break;
}
if (typeof item.per_person !== "undefined") {
type_total = type_total * total_guests;
}
total += type_total;
}
}
for (var ix in me.buyer_fees) {
var item = me.buyer_fees[ix];
var type_total = 0;
type_total += parseFloat(item.price);
if (typeof item.per_person !== "undefined") {
type_total = type_total * total_guests;
}
total += type_total;
}
return total;
}
return 0;
},
total_price_html:function(){
if(!this.total_price) return '';
return window.bravo_format_money(this.total_price);
},
daysOfWeekDisabled(){
var res = [];
for(var k in this.open_hours)
{
if(typeof this.open_hours[k].enable == 'undefined' || this.open_hours[k].enable !=1 ){
if(k == 7){
res.push(0);
}else{
res.push(k);
}
}
}
return res;
}
},
created:function(){
for(var k in bravo_booking_data){
this[k] = bravo_booking_data[k];
}
},
mounted(){
var me = this;
/*$(".bravo_tour_book").sticky({
topSpacing:30,
bottomSpacing:$(document).height() - $('.end_tour_sticky').offset().top + 40
});*/
var options = {
singleDatePicker: true,
showCalendar: false,
sameDate: true,
autoApply : true,
disabledPast : true,
dateFormat : bookingCore.date_format,
enableLoading : true,
showEventTooltip : true,
classNotAvailable : ['disabled', 'off'],
disableHightLight: true,
minDate:this.minDate,
opens:'left',
isInvalidDate:function (date) {
for(var k = 0 ; k < me.allEvents.length ; k++){
var item = me.allEvents[k];
if(item.start == date.format('YYYY-MM-DD')){
return item.active ? false : true;
}
}
return false;
}
};
if (typeof daterangepickerLocale == 'object') {
options.locale = _.merge(daterangepickerLocale,options.locale);
}
this.$nextTick(function () {
$(this.$refs.start_date).daterangepicker(options).on('apply.daterangepicker',
function (ev, picker) {
me.start_date = picker.startDate.format('YYYY-MM-DD');
me.start_date_html = picker.startDate.format(bookingCore.date_format);
})
.on('update-calendar',function (e,obj) {
me.fetchEvents(obj.leftCalendar.calendar[0][0], obj.leftCalendar.calendar[5][6])
});
});
},
methods:{
handleTotalPrice: function () {
},
fetchEvents(start,end){
var me = this;
var data = {
start: start.format('YYYY-MM-DD'),
end: end.format('YYYY-MM-DD'),
id:bravo_booking_data.id,
for_single:1
};
console.log(data);
$.ajax({
url: bravo_booking_i18n.load_dates_url,
dataType:"json",
type:'get',
data:data,
beforeSend: function() {
$('.daterangepicker').addClass("loading");
},
success:function (json) {
me.allEvents = json;
var drp = $(me.$refs.start_date).data('daterangepicker');
drp.allEvents = json;
drp.renderCalendar('left');
if (!drp.singleDatePicker) {
drp.renderCalendar('right');
}
$('.daterangepicker').removeClass("loading");
},
error:function (e) {
console.log(e);
console.log("Can not get availability");
}
});
},
formatMoney: function (m) {
return window.bravo_format_money(m);
},
validate(){
if(!this.start_date)
{
this.message.status = false;
this.message.content = bravo_booking_i18n.no_date_select;
return false;
}
return true;
},
addPersonType(type){
type.number = parseInt(type.number);
if(type.number < parseInt(type.max) || !type.max) type.number +=1;
},
minusPersonType(type){
type.number = parseInt(type.number);
if(type.number > type.min) type.number -=1;
},
addGuestsType(){
var me = this;
if(me.guests < parseInt(me.max_guests) || !me.max_guests) me.guests +=1;
},
minusGuestsType(){
var me = this;
if(me.guests > 1) me.guests -=1;
},
doSubmit:function (e) {
e.preventDefault();
if(this.onSubmit) return false;
if(!this.validate()) return false;
this.onSubmit = true;
var me = this;
this.message.content = '';
if(this.step == 1){
this.html = '';
}
$.ajax({
url:bookingCore.url+'/booking/addToCart',
data:{
service_id:this.id,
service_type:'tour',
start_date:this.start_date,
person_types:this.person_types,
extra_price:this.extra_price,
step:this.step,
guests:this.guests
},
dataType:'json',
type:'post',
success:function(res){
if(!res.status){
me.onSubmit = false;
}
if(res.message)
{
me.message.content = res.message;
me.message.type = res.status;
}
if(res.step){
me.step = res.step;
}
if(res.html){
me.html = res.html
}
if(res.url){
window.location.href = res.url
}
if(res.errors && typeof res.errors == 'object')
{
var html = '';
for(var i in res.errors){
html += res.errors[i]+'<br>';
}
me.message.content = html;
}
},
error:function (e) {
console.log(e);
me.onSubmit = false;
bravo_handle_error_response(e);
if(e.status == 401){
$('.bravo_single_book_wrap').modal('hide');
}
if(e.status != 401 && e.responseJSON){
me.message.content = e.responseJSON.message ? e.responseJSON.message : 'Can not booking';
me.message.type = false;
}
}
})
},
openStartDate(){
$(this.$refs.start_date).trigger('click');
}
}
});
$('.bravo-video-popup').click(function() {
let video_url = $(this).data( "src" );
let target = $(this).data( "target" );
$(target).find(".bravo_embed_video").attr('src',video_url + "?autoplay=0&amp;modestbranding=1&amp;showinfo=0" );
$(target).on('hidden.bs.modal', function () {
$(target).find(".bravo_embed_video").attr('src',"" );
});
});
$(window).on("load", function () {
var urlHash = window.location.href.split("#")[1];
if (urlHash && $('.' + urlHash).length ){
var offset_other = 70
if(urlHash === "review-list"){
offset_other = 330;
}
$('html,body').animate({
scrollTop: $('.' + urlHash).offset().top - offset_other
}, 1000);
}
});
$(".bravo-button-book-mobile").click(function () {
$('.bravo_single_book_wrap').modal('show');
});
$(".bravo_detail_tour .g-faq .item .header").click(function () {
$(this).parent().toggleClass("active");
});
$(".bravo_detail_tour .g-itinerary").each(function () {
$(this).find(".owl-carousel").owlCarousel({
items: 3,
loop: true,
margin: 15,
nav: false,
responsive: {
0: {
items: 1
},
768: {
items: 2
},
1000: {
items: 3
}
}
})
});
})(jQuery);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment