Changeset 2636487
- Timestamp:
- 11/28/2021 10:46:41 AM (4 years ago)
- Location:
- easyreservations/trunk
- Files:
-
- 12 edited
-
assets/js/frontend/date-selection.js (modified) (5 diffs)
-
assets/js/frontend/date-selection.min.js (modified) (1 diff)
-
easyReservations.php (modified) (1 diff)
-
includes/abstracts/abstract-er-form.php (modified) (1 diff)
-
includes/admin/list-tables/class-er-admin-list-table-resources.php (modified) (1 diff)
-
includes/admin/settings/class-er-settings-general.php (modified) (1 diff)
-
includes/class-easyreservations.php (modified) (1 diff)
-
includes/class-er-ajax.php (modified) (3 diffs)
-
includes/data-stores/class-er-customer-data-store.php (modified) (1 diff)
-
includes/er-form-functions.php (modified) (2 diffs)
-
includes/er-order-functions.php (modified) (1 diff)
-
readme.txt (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
easyreservations/trunk/assets/js/frontend/date-selection.js
r2514805 r2636487 33 33 done = false, 34 34 slots = false, 35 currentMonth = false,35 currentMonth = new Date().getMonth() + 1, 36 36 resourceQuantity = false, 37 37 arrival = false, … … 328 328 .datepicker( 329 329 $.extend( { 330 minDate: arrival ? arrival : settings.minDate,330 minDate: arrival ? arrival : ( settings.minDate ? settings.minDate : null ), 331 331 maxDate: maxDate ? maxDate : null, 332 332 dateFormat: dateFormat, … … 335 335 onChangeMonthYear: function( year, month, inst ) { 336 336 currentMonth = month; 337 if ( ! slots || ( ! arrivalTime && settings.time ) || ( arrival && ! settings.time ) ) {337 if ( ! slots || ( ! arrivalTime && settings.time ) || ( arrival && ! settings.time ) || ! arrival ) { 338 338 loadData( dateFormat.replace( 'dd', '01' ).replace( 'mm', month ).replace( 'yy', year ) ); 339 339 } … … 467 467 const departureString = v.departure.split( ' ' ); 468 468 if ( departure === departureString[ 0 ] ) { 469 const timeString = departureString .split( ':' );469 const timeString = departureString[ 1 ].split( ':' ); 470 470 setDepartureTime( timeString[ 0 ], timeString[ 1 ] ); 471 471 return false; … … 671 671 672 672 if ( data.hasOwnProperty( 'max' ) && data.max ) { 673 //TODO: reintroduce feature WEIRD BUG still present as of 0 2 2020673 //TODO: reintroduce feature WEIRD BUG still present as of 08 2021 674 674 //calendarContainer.datepicker('option', 'maxDate', data['max']); 675 675 676 calendarContainer.datepicker( 'refresh' ); 677 678 if( easyStringToDate( data.max ).getMonth() === currentMonth - 1 ){ 679 calendarContainer.find( '.ui-datepicker-next' ).addClass( 'ui-state-disabled' ).unbind(); 680 } 676 681 } else { 677 682 calendarContainer.datepicker( 'refresh' ); -
easyreservations/trunk/assets/js/frontend/date-selection.min.js
r2514805 r2636487 1 (function(a){a.fn.isInViewport=function(){const c=a(this).offset().top;const e=c+a(this).outerHeight();const b=a(window).scrollTop();const d=b+a(window).height();return e>b&&c<d};a.fn.dateSelection=function(f){const u=a(this),i=u.find(".datepicker"),g=erDatepickerArgs(),n=[],v=a.extend({resource:0,arrivalHour:false,arrivalMinute:false,departureHour:false,departureMinute:false,minDate:g.minDate,init:true,departure:true,numberOfMonths:1,time:false,price:false},f);let pageLoad=true,data=false,lastRequest=false,done=false,slots=false,currentMonth= false,resourceQuantity=false,arrival=false,arrivalTime=false,frequency=false,departure=false,departureTime=false;if(v.resource===0){v.resource=a("*[name=resource]").val()}if(v.resource&&v.resource>0){frequency=er_both_params.resources[v.resource].frequency;resourceQuantity=er_both_params.resources[v.resource].quantity}u.find("div.arrival").on("click",function(){q()});u.find("div.departure").on("click",function(){if(arrival&&(arrivalTime||!v.time)){b();if(!i.hasClass("hasDatepicker")){u.find(".departure .text .date").addClass("important").html(er_date_picker_params.wait);c(arrival);t()}else{u.find(".time-picker > td > div").slideUp(50,function(){i.find(".ui-state-active").removeClass("ui-state-highlight").removeClass("ui-state-active");a(this).closest(".time-picker").remove()})}}});a("*[name=resource]").on("change",function(){s();b();v.resource=a(this).val();frequency=er_both_params.resources[v.resource].frequency;resourceQuantity=er_both_params.resources[v.resource].quantity;q()});if(v.init&&u.find("input[name=arrival]").val()===""&&v.resource&&v.resource>0){q()}function q(){u.find(".calendar").css("display","block");if(i.hasClass("hasDatepicker")){l(q)}else{u.find(".text .time").html("");data=false;slots=false;s();b();u.find(".arrival .text .date").addClass("important").html(er_date_picker_params.wait);u.find("input[name=slot]").val(-1);c(arrival?arrival:0);t()}}function d(){if(!done){if(departure){if(departureTime||!v.time){l(o);done=true}else{h()}}else{if(arrival){if(arrivalTime!==false||!v.time){if(v.departure){u.find(".departure .text .date").addClass("important").html(er_date_picker_params.wait);t()}else{if(i.hasClass("hasDatepicker")){l(d)}else{if(slots){const x=data[arrival][arrivalTime][0].departure.split(" ");const e=x[1].split(":");k(x[0]);w(e[0],e[1])}o()}done=true}}else{h()}}}}}function h(){const x=a.datepicker.formatDate("DD, d M yy",i.datepicker("getDate"));u.find("a.ui-state-active").parent().parent().after('<tr class="time-picker"><td colspan="7"><div>'+x+'<div class="insert"></div></div></td></tr>');let timeOptions="";if(slots){if(arrivalTime!==false){a.each(data[arrival][arrivalTime],function(A,z){const C=z.departure.split(" ");if(C[0]!==departure){return}const B=C[1].split(":"),D=z.availability<1?"unavailable":(z.availability<resourceQuantity?"partially":"available");let label=easyFormatTime(B[0],B[1],er_both_params.time_format);if(z.price){label+='<span class="price">'+z.price+"</span>"}timeOptions+='<li class="easy-button '+D+'" data-hour="'+B[0]+'" data-minute="'+B[1]+'" data-id="'+z.key+'">'+label+"</li>"})}else{a.each(data[arrival],function(A,z){const B=A.split(":");a.each(z,function(D,C){const G=C.availability<1?"unavailable":(C.availability<resourceQuantity?"partially":"available");let label=easyFormatTime(B[0],B[1],er_both_params.time_format),attributes="";if(!v.departure){const F=C.departure.split(" ");const E=F[1].split(":");label+=" -";if(arrival!==F[0]){label+=" "+F[0]}label+=" "+easyFormatTime(E[0],E[1],er_both_params.time_format);if(C.price){label+='<span class="price">'+C.price+"</span>"}attributes+=' data-departure=" '+F[0]+'"';attributes+=' data-departure-hour=" '+E[0]+'"';attributes+=' data-departure-minute=" '+E[1]+'"'}timeOptions+='<li class="easy-button '+G+'" data-hour="'+B[0]+'" data-minute="'+B[1]+'" data-id="'+C.key+'" '+attributes+">"+label+"</li>";if(v.departure){return false}})})}if(timeOptions!==""){u.find(".time-picker .insert").html('<ul class="option-buttons">'+timeOptions+"</ul>");u.find(".time-picker > td > div").slideDown(350);u.find("ul.option-buttons li.available, ul.option-buttons li.partially").on("click",function(){if(arrivalTime!==false){u.find("input[name=slot]").val(a(this).attr("data-id"));w(a(this).attr("data-hour"),a(this).attr("data-minute"))}else{if(!v.departure){u.find("input[name=slot]").val(a(this).attr("data-id"));k(a(this).attr("data-departure"));w(a(this).attr("data-departure-hour"),a(this).attr("data-departure-minute"))}p(a(this).attr("data-hour"),a(this).attr("data-minute"))}l(d)})}}else{if(data[departure?departure:arrival].availability&&data[departure?departure:arrival].availability===parseInt(data[departure?departure:arrival].availability,10)){u.find("div.time-prototype").contents().clone(true).appendTo(u.find(".time-picker .insert")).attr("disabled");let minMax;if(departure){minMax=data[departure].time}else{minMax=data[arrival].time}const y=data.first_possible.split(" ");if(y[0]===(departure?departure:arrival)){const e=y[1].split(":");minMax[0]=parseInt(minMax[0],10)<e[0]?parseInt(e[0],10):minMax[0]}u.find(".time-picker select[name=time_hour] option").each(function(){const z=parseInt(a(this).val());if(z<minMax[0]||z>minMax[1]){a(this).attr("disabled",true).prop("selected",false).css("display","none")}else{a(this).attr("disabled",false).css("display","block")}});if(departure){if(v.departureHour&&v.departureHour>minMax[0]&&v.departureHour<minMax[1]){u.find(".time-picker select[name=time_hour]").val(v.departureHour)}}else{if(v.arrivalHour&&v.arrivalHour>minMax[0]&&v.arrivalHour<minMax[1]){u.find(".time-picker select[name=time_hour]").val(v.arrivalHour)}}u.find(".time-picker .apply-time").on("click",function(){const z=u.find(".time-picker select[name=time_hour]");if(z.length>0){const A=parseInt(u.find(".time-picker select[name=time_minute]").val());if(arrivalTime!==false){w(z.val(),A)}else{p(z.val(),A);if(v.departure){c(arrival)}}l(d)}})}else{a.each(data[departure?departure:arrival].availability,function(A,z){const B=A.split(" ");const C=B[0].split(":");const D=z<1?"unavailable":(z<resourceQuantity?"partially":"available");timeOptions+='<div class="time-option '+D+'" data-hour="'+C[0]+'" data-minute="'+C[1]+'">'+easyFormatTime(C[0],C[1])+"</div>"});u.find(".time-picker .insert").html('<div class="option-buttons">'+timeOptions+"</div>");u.find(".time-picker .time-option.available, .time-picker .time-option.partially").on("click",function(){if(arrivalTime!==false){w(a(this).attr("data-hour"),a(this).attr("data-minute"))}else{p(a(this).attr("data-hour"),a(this).attr("data-minute"));if(v.departure){c(arrival)}}l(d)})}u.find(".time-picker > td > div").slideDown(350)}}function t(x){let dateFormat="dd.mm.yy";if(er_both_params.date_format==="Y/m/d"){dateFormat="yy/mm/dd"}else{if(er_both_params.date_format==="m/d/Y"){dateFormat="mm/dd/yy"}else{if(er_both_params.date_format==="Y-m-d"){dateFormat="yy-mm-dd"}else{if(er_both_params.date_format==="d-m-Y"){dateFormat="dd-mm-yy"}}}}i.datepicker(a.extend({minDate:arrival?arrival:v.minDate,maxDate:x?x:null,dateFormat:dateFormat,numberOfMonths:v.numberOfMonths,beforeShowDay:j,onChangeMonthYear:function(y,A,z){currentMonth=A;if(!slots||(!arrivalTime&&v.time)||(arrival&&!v.time)){c(dateFormat.replace("dd","01").replace("mm",A).replace("yy",y))}u.find("div.time").slideUp(300);if(arrival&&(arrivalTime||!v.time)){b();u.find(".departure .text .date").addClass("important").html(er_date_picker_params.wait)}else{s();u.find(".arrival .text .date").addClass("important").html(er_date_picker_params.wait)}},onSelect:m},g)).datepicker("setDate",null).slideDown("300");const e=i.parent().parent();if(!pageLoad&&resourceQuantity&&i.hasClass("hasDatepicker")&&!e.isInViewport()){a([document.documentElement,document.body]).animate({scrollTop:e.offset().top-30},500)}pageLoad=false;i.find(".ui-datepicker").removeClass("ui-datepicker").addClass("easy-datepicker");i.find(".ui-state-active").removeClass("ui-state-highlight").removeClass("ui-state-hover").removeClass("ui-state-active");a.each(er_date_picker_params.datepicker,function(z,y){i.datepicker("option",z,JSON.parse(y))})}function s(){arrival=false;arrivalTime=false;u.find(".arrival .text .date").addClass("important").html(er_date_picker_params.select);u.find(".arrival .text .time").html("");u.find("input[name=arrival]").val("");u.find("input[name=departure_hour]").val("");u.find("input[name=departure_minute]").val("")}function b(){departure=false;departureTime=false;done=false;if(arrival){u.find(".departure .text .date").addClass("important").html(er_date_picker_params.select)}else{u.find(".departure .text .date").removeClass("important").html("—")}u.find(".departure .text .time").html("");u.find("input[name=departure]").val("");u.find("input[name=departure_hour]").val("");u.find("input[name=departure_minute]").val("");u.find(".departure").removeClass("active")}function r(e){arrival=e;u.find(".arrival .text .date").removeClass("important").html(e);u.find("input[name=arrival]").val(e);u.find("input[name=arrival_hour]").val("");u.find("input[name=arrival_minute]").val("")}function k(e){departure=e;u.find("input[name=departure]").val(e);u.find(".departure").addClass("active");u.find(".departure .text .date").removeClass("important").html(e)}function p(e,y,x){e=easyAddZero(e);y=easyAddZero(y);if(!x){x=easyFormatTime(e,y)}arrivalTime=e+":"+y;u.find("input[name=arrival_hour]").val(e);u.find("input[name=arrival_minute]").val(y);u.find(".arrival .text .time").html(x)}function w(e,y,x){e=easyAddZero(e);y=easyAddZero(y);if(!x){x=easyFormatTime(e,y)}departureTime=e+":"+y;u.find("input[name=departure_hour]").val(e);u.find("input[name=departure_minute]").val(y);u.find(".departure .text .time").html(x)}function m(z,e){if(arrival&&(arrivalTime!==false||!v.time)){if(departure===z){b();u.find(".time-picker > td > div").slideUp(50,function(){i.find(".ui-state-active").removeClass("ui-state-highlight").removeClass("ui-state-active")});return false}k(z);if(v.time){setTimeout(h,1)}else{if(slots){const x=false;a.each(data[arrival][arrivalTime],function(B,A){const D=A.departure.split(" ");if(departure===D[0]){const C=D.split(":");w(C[0],C[1]);return false}})}else{w(v.departureHour?v.departureHour:data[departure].time[0],v.departureMinute?v.departureMinute:0)}l(d)}}else{if(arrival===z){s();u.find(".time-picker > td > div").slideUp(50,function(){i.find(".ui-state-active").removeClass("ui-state-highlight").removeClass("ui-state-active")});return false}r(z);if(v.time){setTimeout(h,1)}else{let hour=12,minute=v.arrivalHour?v.arrivalMinute:0;if(slots){const y=Object.keys(data[arrival])[0].split(":");hour=y[0];minute=y[1]}else{hour=v.arrivalHour?v.arrivalHour:data[arrival].time[1]}p(hour,minute);if(v.departure){u.find(".departure .text .date").addClass("important").html(er_date_picker_params.wait);c(arrival)}l(d)}}}function l(e){i.slideUp(350,function(){a(this).datepicker("destroy").removeClass("hasDatepicker").removeAttr("id");if(e){e()}})}function j(x){let className="";if(data){const e=easyFormatDate(x,false);if(slots&&arrival&&arrivalTime!==false){if(easyStringToDate(arrival)>x){return[false,"past",""]}let toReturn=[false,"unavailable",""],iterate;if(arrivalTime!==false&&v.time){iterate=data[arrival][arrivalTime]}else{iterate=data[arrival][Object.keys(data[arrival])[0]]}a.each(iterate,function(z,y){const A=y.departure.split(" ");if(A[0]===e){toReturn=[true,"available",""];return true}});return toReturn}if(data.hasOwnProperty(e)){if(data[e].price){className="datepicker-content-"+data[e].price.hashCode();if(a.inArray(className,n)===-1){a("head").append("<style>.easy-date-selection td."+className+" a:after {content: '"+data[e].price+"'}</style>");n.push(className)}}else{if(v.price&&!slots&&frequency===86400){className="price-placeholder"}}if(data[e].availability&&data[e].availability===parseInt(data[e].availability,10)){if(data[e].availability<0){return[false,"unavailable rule "+className,""]}if(data[e].availability<1){return[false,"unavailable "+className,""]}if(data[e].availability<resourceQuantity){return[true,"partially "+className,""]}}else{let amountAvailable=0,hasAvailableSlot=false,total;if(slots){total=data[e];a.each(total,function(z,y){if(y[0]&&y[0].availability>0){hasAvailableSlot=true;amountAvailable++}})}else{total=data[e].availability;a.each(total,function(z,y){if(y>0){hasAvailableSlot=true;amountAvailable++}})}if(!hasAvailableSlot){return[false,"unavailable "+className,""]}if(Object.keys(total).length>amountAvailable){return[true,"partially "+className,""]}}return[true,"available "+className,""]}}if(v.price&&!slots&&frequency===86400){className="price-placeholder"}return[false,"past "+className,""]}function c(x){const e=Date.now(),y={action:"easyreservations_calendar",date:x===0?0:x,arrival:arrival&&(arrivalTime!==false||!v.time)?arrival:0,arrivalTime:arrivalTime,months:v.numberOfMonths,adults:a("*[name=adults]").val(),children:a("*[name=children]").val(),resource:v.resource,price:v.price,minDate:v.minDate,security:u.find('input[name="easy-date-selection-nonce"]').val()};lastRequest=e;data=false;if(!y.resource){alert("no resource field in form, please fix");return}a.post(er_both_params.ajaxurl,y,function(A){if(lastRequest===e){if(arrival&&(arrivalTime||!v.time)){u.find(".departure .text .date").addClass("important").html(er_date_picker_params.select)}else{u.find(".arrival .text .date").html(er_date_picker_params.select)}data=A;slots=data.hasOwnProperty("slots")&&data.slots;if(data.hasOwnProperty("first_possible")&&data.first_possible){const z=data.first_possible.split(" "),B=easyStringToDate(z[0]);if(arrival&&(!currentMonth||currentMonth===B.getMonth()+1)){i.datepicker("option","minDate",B)}}if(data.hasOwnProperty("max")&&data.max){i.datepicker("refresh")}else{i.datepicker("refresh")}i.find(".ui-datepicker-today a, .ui-datepicker-current-day a").removeClass("ui-state-highlight").removeClass("ui-state-hover").removeClass("ui-state-active")}})}function o(){u.find("input[name=arrival]").trigger("change")}}}(jQuery));Object.defineProperty(String.prototype,"hashCode",{value:function(){var c=0,a,b;for(a=0;a<this.length;a++){b=this.charCodeAt(a);c=((c<<5)-c)+b;c|=0}return c}});1 (function(a){a.fn.isInViewport=function(){const c=a(this).offset().top;const e=c+a(this).outerHeight();const b=a(window).scrollTop();const d=b+a(window).height();return e>b&&c<d};a.fn.dateSelection=function(f){const u=a(this),i=u.find(".datepicker"),g=erDatepickerArgs(),n=[],v=a.extend({resource:0,arrivalHour:false,arrivalMinute:false,departureHour:false,departureMinute:false,minDate:g.minDate,init:true,departure:true,numberOfMonths:1,time:false,price:false},f);let pageLoad=true,data=false,lastRequest=false,done=false,slots=false,currentMonth=new Date().getMonth()+1,resourceQuantity=false,arrival=false,arrivalTime=false,frequency=false,departure=false,departureTime=false;if(v.resource===0){v.resource=a("*[name=resource]").val()}if(v.resource&&v.resource>0){frequency=er_both_params.resources[v.resource].frequency;resourceQuantity=er_both_params.resources[v.resource].quantity}u.find("div.arrival").on("click",function(){q()});u.find("div.departure").on("click",function(){if(arrival&&(arrivalTime||!v.time)){b();if(!i.hasClass("hasDatepicker")){u.find(".departure .text .date").addClass("important").html(er_date_picker_params.wait);c(arrival);t()}else{u.find(".time-picker > td > div").slideUp(50,function(){i.find(".ui-state-active").removeClass("ui-state-highlight").removeClass("ui-state-active");a(this).closest(".time-picker").remove()})}}});a("*[name=resource]").on("change",function(){s();b();v.resource=a(this).val();frequency=er_both_params.resources[v.resource].frequency;resourceQuantity=er_both_params.resources[v.resource].quantity;q()});if(v.init&&u.find("input[name=arrival]").val()===""&&v.resource&&v.resource>0){q()}function q(){u.find(".calendar").css("display","block");if(i.hasClass("hasDatepicker")){l(q)}else{u.find(".text .time").html("");data=false;slots=false;s();b();u.find(".arrival .text .date").addClass("important").html(er_date_picker_params.wait);u.find("input[name=slot]").val(-1);c(arrival?arrival:0);t()}}function d(){if(!done){if(departure){if(departureTime||!v.time){l(o);done=true}else{h()}}else{if(arrival){if(arrivalTime!==false||!v.time){if(v.departure){u.find(".departure .text .date").addClass("important").html(er_date_picker_params.wait);t()}else{if(i.hasClass("hasDatepicker")){l(d)}else{if(slots){const x=data[arrival][arrivalTime][0].departure.split(" ");const e=x[1].split(":");k(x[0]);w(e[0],e[1])}o()}done=true}}else{h()}}}}}function h(){const x=a.datepicker.formatDate("DD, d M yy",i.datepicker("getDate"));u.find("a.ui-state-active").parent().parent().after('<tr class="time-picker"><td colspan="7"><div>'+x+'<div class="insert"></div></div></td></tr>');let timeOptions="";if(slots){if(arrivalTime!==false){a.each(data[arrival][arrivalTime],function(A,z){const C=z.departure.split(" ");if(C[0]!==departure){return}const B=C[1].split(":"),D=z.availability<1?"unavailable":(z.availability<resourceQuantity?"partially":"available");let label=easyFormatTime(B[0],B[1],er_both_params.time_format);if(z.price){label+='<span class="price">'+z.price+"</span>"}timeOptions+='<li class="easy-button '+D+'" data-hour="'+B[0]+'" data-minute="'+B[1]+'" data-id="'+z.key+'">'+label+"</li>"})}else{a.each(data[arrival],function(A,z){const B=A.split(":");a.each(z,function(D,C){const G=C.availability<1?"unavailable":(C.availability<resourceQuantity?"partially":"available");let label=easyFormatTime(B[0],B[1],er_both_params.time_format),attributes="";if(!v.departure){const F=C.departure.split(" ");const E=F[1].split(":");label+=" -";if(arrival!==F[0]){label+=" "+F[0]}label+=" "+easyFormatTime(E[0],E[1],er_both_params.time_format);if(C.price){label+='<span class="price">'+C.price+"</span>"}attributes+=' data-departure=" '+F[0]+'"';attributes+=' data-departure-hour=" '+E[0]+'"';attributes+=' data-departure-minute=" '+E[1]+'"'}timeOptions+='<li class="easy-button '+G+'" data-hour="'+B[0]+'" data-minute="'+B[1]+'" data-id="'+C.key+'" '+attributes+">"+label+"</li>";if(v.departure){return false}})})}if(timeOptions!==""){u.find(".time-picker .insert").html('<ul class="option-buttons">'+timeOptions+"</ul>");u.find(".time-picker > td > div").slideDown(350);u.find("ul.option-buttons li.available, ul.option-buttons li.partially").on("click",function(){if(arrivalTime!==false){u.find("input[name=slot]").val(a(this).attr("data-id"));w(a(this).attr("data-hour"),a(this).attr("data-minute"))}else{if(!v.departure){u.find("input[name=slot]").val(a(this).attr("data-id"));k(a(this).attr("data-departure"));w(a(this).attr("data-departure-hour"),a(this).attr("data-departure-minute"))}p(a(this).attr("data-hour"),a(this).attr("data-minute"))}l(d)})}}else{if(data[departure?departure:arrival].availability&&data[departure?departure:arrival].availability===parseInt(data[departure?departure:arrival].availability,10)){u.find("div.time-prototype").contents().clone(true).appendTo(u.find(".time-picker .insert")).attr("disabled");let minMax;if(departure){minMax=data[departure].time}else{minMax=data[arrival].time}const y=data.first_possible.split(" ");if(y[0]===(departure?departure:arrival)){const e=y[1].split(":");minMax[0]=parseInt(minMax[0],10)<e[0]?parseInt(e[0],10):minMax[0]}u.find(".time-picker select[name=time_hour] option").each(function(){const z=parseInt(a(this).val());if(z<minMax[0]||z>minMax[1]){a(this).attr("disabled",true).prop("selected",false).css("display","none")}else{a(this).attr("disabled",false).css("display","block")}});if(departure){if(v.departureHour&&v.departureHour>minMax[0]&&v.departureHour<minMax[1]){u.find(".time-picker select[name=time_hour]").val(v.departureHour)}}else{if(v.arrivalHour&&v.arrivalHour>minMax[0]&&v.arrivalHour<minMax[1]){u.find(".time-picker select[name=time_hour]").val(v.arrivalHour)}}u.find(".time-picker .apply-time").on("click",function(){const z=u.find(".time-picker select[name=time_hour]");if(z.length>0){const A=parseInt(u.find(".time-picker select[name=time_minute]").val());if(arrivalTime!==false){w(z.val(),A)}else{p(z.val(),A);if(v.departure){c(arrival)}}l(d)}})}else{a.each(data[departure?departure:arrival].availability,function(A,z){const B=A.split(" ");const C=B[0].split(":");const D=z<1?"unavailable":(z<resourceQuantity?"partially":"available");timeOptions+='<div class="time-option '+D+'" data-hour="'+C[0]+'" data-minute="'+C[1]+'">'+easyFormatTime(C[0],C[1])+"</div>"});u.find(".time-picker .insert").html('<div class="option-buttons">'+timeOptions+"</div>");u.find(".time-picker .time-option.available, .time-picker .time-option.partially").on("click",function(){if(arrivalTime!==false){w(a(this).attr("data-hour"),a(this).attr("data-minute"))}else{p(a(this).attr("data-hour"),a(this).attr("data-minute"));if(v.departure){c(arrival)}}l(d)})}u.find(".time-picker > td > div").slideDown(350)}}function t(x){let dateFormat="dd.mm.yy";if(er_both_params.date_format==="Y/m/d"){dateFormat="yy/mm/dd"}else{if(er_both_params.date_format==="m/d/Y"){dateFormat="mm/dd/yy"}else{if(er_both_params.date_format==="Y-m-d"){dateFormat="yy-mm-dd"}else{if(er_both_params.date_format==="d-m-Y"){dateFormat="dd-mm-yy"}}}}i.datepicker(a.extend({minDate:arrival?arrival:(v.minDate?v.minDate:null),maxDate:x?x:null,dateFormat:dateFormat,numberOfMonths:v.numberOfMonths,beforeShowDay:j,onChangeMonthYear:function(y,A,z){currentMonth=A;if(!slots||(!arrivalTime&&v.time)||(arrival&&!v.time)||!arrival){c(dateFormat.replace("dd","01").replace("mm",A).replace("yy",y))}u.find("div.time").slideUp(300);if(arrival&&(arrivalTime||!v.time)){b();u.find(".departure .text .date").addClass("important").html(er_date_picker_params.wait)}else{s();u.find(".arrival .text .date").addClass("important").html(er_date_picker_params.wait)}},onSelect:m},g)).datepicker("setDate",null).slideDown("300");const e=i.parent().parent();if(!pageLoad&&resourceQuantity&&i.hasClass("hasDatepicker")&&!e.isInViewport()){a([document.documentElement,document.body]).animate({scrollTop:e.offset().top-30},500)}pageLoad=false;i.find(".ui-datepicker").removeClass("ui-datepicker").addClass("easy-datepicker");i.find(".ui-state-active").removeClass("ui-state-highlight").removeClass("ui-state-hover").removeClass("ui-state-active");a.each(er_date_picker_params.datepicker,function(z,y){i.datepicker("option",z,JSON.parse(y))})}function s(){arrival=false;arrivalTime=false;u.find(".arrival .text .date").addClass("important").html(er_date_picker_params.select);u.find(".arrival .text .time").html("");u.find("input[name=arrival]").val("");u.find("input[name=departure_hour]").val("");u.find("input[name=departure_minute]").val("")}function b(){departure=false;departureTime=false;done=false;if(arrival){u.find(".departure .text .date").addClass("important").html(er_date_picker_params.select)}else{u.find(".departure .text .date").removeClass("important").html("—")}u.find(".departure .text .time").html("");u.find("input[name=departure]").val("");u.find("input[name=departure_hour]").val("");u.find("input[name=departure_minute]").val("");u.find(".departure").removeClass("active")}function r(e){arrival=e;u.find(".arrival .text .date").removeClass("important").html(e);u.find("input[name=arrival]").val(e);u.find("input[name=arrival_hour]").val("");u.find("input[name=arrival_minute]").val("")}function k(e){departure=e;u.find("input[name=departure]").val(e);u.find(".departure").addClass("active");u.find(".departure .text .date").removeClass("important").html(e)}function p(e,y,x){e=easyAddZero(e);y=easyAddZero(y);if(!x){x=easyFormatTime(e,y)}arrivalTime=e+":"+y;u.find("input[name=arrival_hour]").val(e);u.find("input[name=arrival_minute]").val(y);u.find(".arrival .text .time").html(x)}function w(e,y,x){e=easyAddZero(e);y=easyAddZero(y);if(!x){x=easyFormatTime(e,y)}departureTime=e+":"+y;u.find("input[name=departure_hour]").val(e);u.find("input[name=departure_minute]").val(y);u.find(".departure .text .time").html(x)}function m(z,e){if(arrival&&(arrivalTime!==false||!v.time)){if(departure===z){b();u.find(".time-picker > td > div").slideUp(50,function(){i.find(".ui-state-active").removeClass("ui-state-highlight").removeClass("ui-state-active")});return false}k(z);if(v.time){setTimeout(h,1)}else{if(slots){const x=false;a.each(data[arrival][arrivalTime],function(B,A){const D=A.departure.split(" ");if(departure===D[0]){const C=D[1].split(":");w(C[0],C[1]);return false}})}else{w(v.departureHour?v.departureHour:data[departure].time[0],v.departureMinute?v.departureMinute:0)}l(d)}}else{if(arrival===z){s();u.find(".time-picker > td > div").slideUp(50,function(){i.find(".ui-state-active").removeClass("ui-state-highlight").removeClass("ui-state-active")});return false}r(z);if(v.time){setTimeout(h,1)}else{let hour=12,minute=v.arrivalHour?v.arrivalMinute:0;if(slots){const y=Object.keys(data[arrival])[0].split(":");hour=y[0];minute=y[1]}else{hour=v.arrivalHour?v.arrivalHour:data[arrival].time[1]}p(hour,minute);if(v.departure){u.find(".departure .text .date").addClass("important").html(er_date_picker_params.wait);c(arrival)}l(d)}}}function l(e){i.slideUp(350,function(){a(this).datepicker("destroy").removeClass("hasDatepicker").removeAttr("id");if(e){e()}})}function j(x){let className="";if(data){const e=easyFormatDate(x,false);if(slots&&arrival&&arrivalTime!==false){if(easyStringToDate(arrival)>x){return[false,"past",""]}let toReturn=[false,"unavailable",""],iterate;if(arrivalTime!==false&&v.time){iterate=data[arrival][arrivalTime]}else{iterate=data[arrival][Object.keys(data[arrival])[0]]}a.each(iterate,function(z,y){const A=y.departure.split(" ");if(A[0]===e){toReturn=[true,"available",""];return true}});return toReturn}if(data.hasOwnProperty(e)){if(data[e].price){className="datepicker-content-"+data[e].price.hashCode();if(a.inArray(className,n)===-1){a("head").append("<style>.easy-date-selection td."+className+" a:after {content: '"+data[e].price+"'}</style>");n.push(className)}}else{if(v.price&&!slots&&frequency===86400){className="price-placeholder"}}if(data[e].availability&&data[e].availability===parseInt(data[e].availability,10)){if(data[e].availability<0){return[false,"unavailable rule "+className,""]}if(data[e].availability<1){return[false,"unavailable "+className,""]}if(data[e].availability<resourceQuantity){return[true,"partially "+className,""]}}else{let amountAvailable=0,hasAvailableSlot=false,total;if(slots){total=data[e];a.each(total,function(z,y){if(y[0]&&y[0].availability>0){hasAvailableSlot=true;amountAvailable++}})}else{total=data[e].availability;a.each(total,function(z,y){if(y>0){hasAvailableSlot=true;amountAvailable++}})}if(!hasAvailableSlot){return[false,"unavailable "+className,""]}if(Object.keys(total).length>amountAvailable){return[true,"partially "+className,""]}}return[true,"available "+className,""]}}if(v.price&&!slots&&frequency===86400){className="price-placeholder"}return[false,"past "+className,""]}function c(x){const e=Date.now(),y={action:"easyreservations_calendar",date:x===0?0:x,arrival:arrival&&(arrivalTime!==false||!v.time)?arrival:0,arrivalTime:arrivalTime,months:v.numberOfMonths,adults:a("*[name=adults]").val(),children:a("*[name=children]").val(),resource:v.resource,price:v.price,minDate:v.minDate,security:u.find('input[name="easy-date-selection-nonce"]').val()};lastRequest=e;data=false;if(!y.resource){alert("no resource field in form, please fix");return}a.post(er_both_params.ajaxurl,y,function(A){if(lastRequest===e){if(arrival&&(arrivalTime||!v.time)){u.find(".departure .text .date").addClass("important").html(er_date_picker_params.select)}else{u.find(".arrival .text .date").html(er_date_picker_params.select)}data=A;slots=data.hasOwnProperty("slots")&&data.slots;if(data.hasOwnProperty("first_possible")&&data.first_possible){const z=data.first_possible.split(" "),B=easyStringToDate(z[0]);if(arrival&&(!currentMonth||currentMonth===B.getMonth()+1)){i.datepicker("option","minDate",B)}}if(data.hasOwnProperty("max")&&data.max){i.datepicker("refresh");if(easyStringToDate(data.max).getMonth()===currentMonth-1){i.find(".ui-datepicker-next").addClass("ui-state-disabled").unbind()}}else{i.datepicker("refresh")}i.find(".ui-datepicker-today a, .ui-datepicker-current-day a").removeClass("ui-state-highlight").removeClass("ui-state-hover").removeClass("ui-state-active")}})}function o(){u.find("input[name=arrival]").trigger("change")}}}(jQuery));Object.defineProperty(String.prototype,"hashCode",{value:function(){var c=0,a,b;for(a=0;a<this.length;a++){b=this.charCodeAt(a);c=((c<<5)-c)+b;c|=0}return c}}); -
easyreservations/trunk/easyReservations.php
r2523284 r2636487 4 4 * Plugin URI: http://www.easyreservations.org 5 5 * Description: This powerful property and reservation management plugin allows you to receive, schedule and handle your bookings easily! 6 * Version: 6.0-alpha.2 26 * Version: 6.0-alpha.23 7 7 * Author: Feryaz Beer 8 8 * Author URI: http://www.feryaz.de -
easyreservations/trunk/includes/abstracts/abstract-er-form.php
r2262833 r2636487 83 83 } 84 84 85 if( empty( $form_field ) ){ 86 $form_field = do_shortcode( '[' . $field . ']' ); 87 } 88 85 89 $form_template = str_replace( '[' . $field . ']', $form_field, $form_template ); 90 86 91 break; 87 92 } -
easyreservations/trunk/includes/admin/list-tables/class-er-admin-list-table-resources.php
r2426503 r2636487 181 181 $all_reservations = $wpdb->get_var( 182 182 $wpdb->prepare( 183 "SELECT COUNT(*) FROM {$wpdb->prefix}reservations WHERE status ='yes'AND resource=%d", $this->object->get_id()183 "SELECT COUNT(*) FROM {$wpdb->prefix}reservations WHERE status IN ('" . implode( "', '", er_reservation_get_approved_statuses() ) . "') AND resource=%d", $this->object->get_id() 184 184 ) 185 185 ); -
easyreservations/trunk/includes/admin/settings/class-er-settings-general.php
r2464400 r2636487 298 298 [arrival] 299 299 300 <b>Dura rtion</b>300 <b>Duration</b> 301 301 [billing_units]d 302 302 -
easyreservations/trunk/includes/class-easyreservations.php
r2544378 r2636487 19 19 * @var string 20 20 */ 21 public $version = '6.0-alpha.2 2';21 public $version = '6.0-alpha.23'; 22 22 23 23 /** -
easyreservations/trunk/includes/class-er-ajax.php
r2544378 r2636487 179 179 $date = clone $now; 180 180 181 if ( ! empty( $_POST['minDate'] ) ) {181 if ( ! empty( $_POST['minDate'] ) && $_POST['minDate'] !== 'false' ) { 182 182 if ( is_numeric( $_POST['minDate'] ) ) { 183 183 $date->add( new DateInterval( 'PT' . intval( $_POST['minDate'] ) * 86400 . 'S' ) ); … … 467 467 468 468 if ( ! $was_unavailable && $latest_departure >= $earliest_possible_departure ) { 469 $avail = $availability->check_spaces( $resource->availability_by( 'unit' ) ? $arrival : $last_departure, $departure, 'departure' );470 471 469 if ( $display_price ) { 472 470 $reservation = new ER_Reservation( 0 ); … … 483 481 $price = sprintf( er_get_price_format(), html_entity_decode( er_get_currency_symbol() ), intval( $reservation->get_total() ) ); 484 482 } 483 484 $avail = $availability->check_spaces( $resource->availability_by( 'unit' ) ? $arrival : $last_departure, $departure, 'departure' ); 485 485 486 486 //If an availability filter is matched the check returns a numeric value instead -
easyreservations/trunk/includes/data-stores/class-er-customer-data-store.php
r2503176 r2636487 266 266 $prop_key = substr( $prop, 8 ); 267 267 268 if ( ! isset( $changed_props[' billing'] ) || ! array_key_exists( $prop_key, $changed_props['billing'] ) ) {268 if ( ! isset( $changed_props['address'] ) || ! array_key_exists( $prop_key, $changed_props['address'] ) ) { 269 269 continue; 270 270 } -
easyreservations/trunk/includes/er-form-functions.php
r2514805 r2636487 542 542 $opt = array( 543 543 'resource' => isset( $tag['resource'] ) ? intval( $tag['resource'] ) : 0, 544 'minDate' => isset( $tag['mindate'] ) ? sanitize_text_field( $tag['mindate'] ) : false, 544 545 'arrivalHour' => isset( $tag['arrivalhour'] ) ? intval( $tag['arrivalhour'] ) : false, 545 546 'arrivalMinute' => isset( $tag['arrivalminute'] ) ? intval( $tag['arrivalminute'] ) : 0, … … 828 829 829 830 default: 830 return apply_filters( 'easyreservations_form_field', $tag, $form_hash );831 return ''; 831 832 break; 832 833 } -
easyreservations/trunk/includes/er-order-functions.php
r2544378 r2636487 628 628 * 629 629 * @return array List of orders ID. 630 */ 631 function er_order_search( $term ) { 630 631 */ 632 function er_search_orders( $term ) { 632 633 $data_store = ER_Data_Store::load( 'order' ); 633 634 -
easyreservations/trunk/readme.txt
r2523284 r2636487 55 55 == Changelog == 56 56 57 = 6.0-alpha.22 - 2020-04-29 = 57 = 6.0-alpha.23 - 2021-11-28 = 58 * Added - Calendar minDate attribute 59 * Enhancement - Forms can contain any shortcode now 60 * Enhancement - Calendar disable selecting next month if departure is impossible then 61 * Fix - Calendar slots departure selection 62 * Fix - User meta data 63 * Fix - Reservation count in resources table 64 * Fix - Paypal payment check uses amount due instead of total 65 66 = 6.0-alpha.22 - 2021-04-29 = 58 67 * Enhancement - Keep name field when option to hide address fields is enabled 59 68 * Fix - Calendar departure day … … 62 71 * Fix - PayPal live mode sometimes redirected to sandbox 63 72 64 = 6.0-alpha.21 - 202 0-04-14 =73 = 6.0-alpha.21 - 2021-04-14 = 65 74 * Added - Upcoming category in reservation table 66 75 * Added - Check to prevent double bookings when adding a reservation as admin … … 78 87 * Fix - Filter submit 79 88 80 = 6.0-alpha.20 - 202 0-03-25 =89 = 6.0-alpha.20 - 2021-03-25 = 81 90 * Added - Apple Pay and Payment Request button with stripe 82 91 * Added - Credit notes for refunds … … 99 108 * Dev - Added new actions and filters 100 109 101 = 6.0-alpha.19 - 202 0-02-26 =110 = 6.0-alpha.19 - 2021-02-26 = 102 111 * Enhancement - Setting order to processing or completed only possible if all reservations are approved 103 112 * Enhancement - Added option to add a price display suffix in tax settings … … 124 133 * Removed - Option to display custom field when adding reservations 125 134 126 = 6.0-alpha.18 - 202 0-01-28 =135 = 6.0-alpha.18 - 2021-01-28 = 127 136 * Enhancement - Stylesheets for twenty twentyone wordpress theme 128 137 * Enhancement - Improved automatic order notes for changes in reservation … … 138 147 * Fix - Miscellaneous stylesheet fixes 139 148 140 = 6.0-alpha.17 - 202 0-01-04 =149 = 6.0-alpha.17 - 2021-01-04 = 141 150 * Enhancement - Default arrival and departure time in date selection 142 151 * Enhancement - Stylesheets for wordpress themes
Note: See TracChangeset
for help on using the changeset viewer.