Hotel Raxa - Advanced Booking System Implementation
🏨 Hotel Booking Enhancements: - Implemented Eagle Booking Advanced Pricing add-on - Added Booking.com-style rate management system - Created professional calendar interface for pricing - Integrated deals and discounts functionality 💰 Advanced Pricing Features: - Dynamic pricing models (per room, per person, per adult) - Base rates, adult rates, and child rates management - Length of stay discounts and early bird deals - Mobile rates and secret deals implementation - Seasonal promotions and flash sales 📅 Availability Management: - Real-time availability tracking - Stop sell and restriction controls - Closed to arrival/departure functionality - Minimum/maximum stay requirements - Automatic sold-out management 💳 Payment Integration: - Maintained Redsys payment gateway integration - Seamless integration with existing Eagle Booking - No modifications to core Eagle Booking plugin 🛠️ Technical Implementation: - Custom database tables for advanced pricing - WordPress hooks and filters integration - AJAX-powered admin interface - Data migration from existing Eagle Booking - Professional calendar view for revenue management 📊 Admin Interface: - Booking.com-style management dashboard - Visual rate and availability calendar - Bulk operations for date ranges - Statistics and analytics dashboard - Modal dialogs for quick editing 🔧 Code Quality: - WordPress coding standards compliance - Secure database operations with prepared statements - Proper input validation and sanitization - Error handling and logging - Responsive admin interface 🤖 Generated with Claude Code (https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
497
wp-content/plugins/under-construction-page/js/ucp-admin.js
Normal file
497
wp-content/plugins/under-construction-page/js/ucp-admin.js
Normal file
@@ -0,0 +1,497 @@
|
||||
/*
|
||||
* UnderConstructionPage
|
||||
* Main backend JS
|
||||
* (c) WebFactory Ltd, 2015 - 2023
|
||||
*/
|
||||
|
||||
|
||||
jQuery(document).ready(function($) {
|
||||
var old_settings = $('#ucp_form *').not('.skip-save').serialize();
|
||||
var ad_name = '';
|
||||
|
||||
// init tabs
|
||||
$('#ucp_tabs').tabs({
|
||||
activate: function(event, ui) {
|
||||
Cookies.set('ucp_tabs', $('#ucp_tabs').tabs('option', 'active'), { expires: 365 });
|
||||
},
|
||||
active: Cookies.get('ucp_tabs')
|
||||
}).show();
|
||||
|
||||
// init 2nd level of tabs
|
||||
$('.ucp-tabs-2nd-level').each(function() {
|
||||
$(this).tabs({
|
||||
activate: function(event, ui) {
|
||||
Cookies.set($(this).attr('id'), $(this).tabs('option', 'active'), { expires: 365 });
|
||||
},
|
||||
active: Cookies.get($(this).attr('id'))
|
||||
});
|
||||
});
|
||||
|
||||
// init select2
|
||||
$('#whitelisted_users').select2({ 'placeholder': ucp.whitelisted_users_placeholder});
|
||||
|
||||
|
||||
// autosize textareas
|
||||
$.each($('textarea[data-autoresize]'), function() {
|
||||
var offset = this.offsetHeight - this.clientHeight;
|
||||
|
||||
var resizeTextarea = function(el) {
|
||||
$(el).css('height', 'auto').css('height', el.scrollHeight + offset + 2);
|
||||
};
|
||||
$(this).on('keyup input click', function() { resizeTextarea(this); }).removeAttr('data-autoresize');
|
||||
});
|
||||
|
||||
|
||||
// maybe init survey dialog
|
||||
$('#features-survey-dialog').dialog({'dialogClass': 'wp-dialog ucp-dialog ucp-survey-dialog',
|
||||
'modal': 1,
|
||||
'resizable': false,
|
||||
'zIndex': 9999,
|
||||
'width': 550,
|
||||
'height': 'auto',
|
||||
'show': 'fade',
|
||||
'hide': 'fade',
|
||||
'open': function(event, ui) { ucp_fix_dialog_close(event, ui); },
|
||||
'close': function(event, ui) { },
|
||||
'autoOpen': ucp.open_survey,
|
||||
'closeOnEscape': true
|
||||
});
|
||||
|
||||
|
||||
// turn questions into checkboxes
|
||||
$('.question-wrapper').on('click', function(e) {
|
||||
$('.question-wrapper').removeClass('selected');
|
||||
$(this).addClass('selected');
|
||||
|
||||
e.preventDefault();
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
// dismiss survey forever
|
||||
$('.dismiss-survey').on('click', function(e) {
|
||||
$('#features-survey-dialog').dialog('close');
|
||||
|
||||
$.post(ajaxurl, { survey: $(this).data('survey'),
|
||||
_ajax_nonce: ucp.nonce_dismiss_survey,
|
||||
action: 'ucp_dismiss_survey'
|
||||
});
|
||||
|
||||
e.preventDefault();
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
// submit and hide survey
|
||||
$('.submit-survey').on('click', function(e) {
|
||||
if ($('.question-wrapper.selected').length != 1) {
|
||||
alert('Please choose the way you use UCP.');
|
||||
return false;
|
||||
}
|
||||
|
||||
answers = $('.question-wrapper.selected').data('value');
|
||||
answers += '-' + $('.question-wrapper').index($('.question-wrapper.selected'));
|
||||
|
||||
$.post(ajaxurl, { survey: $(this).data('survey'),
|
||||
answers: answers,
|
||||
emailme: $('#features-survey-dialog #emailme:checked').val(),
|
||||
_ajax_nonce: ucp.nonce_submit_survey,
|
||||
action: 'ucp_submit_survey'
|
||||
});
|
||||
|
||||
alert('Thank you for your time! We appriciate your input!');
|
||||
|
||||
$('#features-survey-dialog').dialog('close');
|
||||
e.preventDefault();
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
// send support message
|
||||
$('#ucp-send-support-message').on('click', function(e) {
|
||||
e.preventDefault();
|
||||
button = $(this);
|
||||
|
||||
if ($('#support_email').val().length < 5 || /\S+@\S+\.\S+/.test($('#support_email').val()) == false) {
|
||||
alert('We need your email address, don\'t you think?');
|
||||
$('#support_email').select().focus();
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($('#support_message').val().length < 15) {
|
||||
alert('A message that short won\'t do anybody any good.');
|
||||
$('#support_message').select().focus();
|
||||
return false;
|
||||
}
|
||||
|
||||
button.addClass('loading');
|
||||
$.post(ajaxurl, { support_email: $('#support_email').val(),
|
||||
support_message: $('#support_message').val(),
|
||||
support_info: $('#support_info:checked').val(),
|
||||
_ajax_nonce: ucp.nonce_submit_support_message,
|
||||
action: 'ucp_submit_support_message'},
|
||||
function(data) {
|
||||
if (data.success) {
|
||||
alert('Message sent! Our agents will get back to you ASAP.');
|
||||
} else {
|
||||
alert(data.data);
|
||||
}
|
||||
}).fail(function() {
|
||||
alert('Something is not right. Please reload the page and try again');
|
||||
}).always(function() {
|
||||
button.removeClass('loading');
|
||||
});
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
// fix for enter press in support email
|
||||
$('#support_email').on('keypress', function(e) {
|
||||
if (e.which == 13) {
|
||||
e.preventDefault();
|
||||
$('#ucp-send-support-message').trigger('click');
|
||||
return false;
|
||||
}
|
||||
}); // if enter on support email
|
||||
|
||||
|
||||
// activate theme via thumb and save
|
||||
$('.ucp-thumb .activate-theme').on('click', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
theme_id = $(this).parents('.ucp-thumb').data('theme-id');
|
||||
$('#theme_id').val(theme_id);
|
||||
$('#ucp_tabs #submit').trigger('click');
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
// init datepicker
|
||||
$('.datepicker').AnyTime_picker({ format: "%Y-%m-%d %H:%i", firstDOW: 1, earliest: new Date(), labelTitle: "Select the date & time when construction mode will be disabled" } );
|
||||
|
||||
|
||||
// fix when opening datepicker
|
||||
$('.show-datepicker').on('click', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
$(this).prevAll('input.datepicker').focus();
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
$('#ga_tracking_id_toggle').on('change', function(e, is_triggered) {
|
||||
if ($(this).is(':checked')) {
|
||||
if (is_triggered) {
|
||||
$('#ga_tracking_id_wrapper').show();
|
||||
} else {
|
||||
$('#ga_tracking_id_wrapper').slideDown();
|
||||
}
|
||||
} else {
|
||||
if (is_triggered) {
|
||||
$('#ga_tracking_id_wrapper').hide();
|
||||
} else {
|
||||
$('#ga_tracking_id_wrapper').slideUp();
|
||||
}
|
||||
}
|
||||
}).triggerHandler('change', true);
|
||||
|
||||
$('#end_date_toggle').on('change', function(e, is_triggered) {
|
||||
if ($(this).is(':checked')) {
|
||||
if (is_triggered) {
|
||||
$('#end_date_wrapper').show();
|
||||
} else {
|
||||
$('#end_date_wrapper').slideDown();
|
||||
}
|
||||
} else {
|
||||
if (is_triggered) {
|
||||
$('#end_date_wrapper').hide();
|
||||
} else {
|
||||
$('#end_date_wrapper').slideUp();
|
||||
}
|
||||
}
|
||||
}).triggerHandler('change', true);
|
||||
|
||||
|
||||
$('.settings_page_ucp .wrap').on('click', '.reset-settings', function(e) {
|
||||
if (!confirm('Are you sure you want to reset all UCP settings to their default values? There is NO undo.')) {
|
||||
e.preventDefault();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}); // reset-settings
|
||||
|
||||
|
||||
// warning if there are unsaved changes when previewing
|
||||
$('.settings_page_ucp .wrap').on('click', '#ucp_preview', function(e) {
|
||||
if ($('#ucp_form *').not('.skip-save').serialize() != old_settings) {
|
||||
if (!confirm('There are unsaved changes that will not be visible in the preview. Please save changes first.\nContinue?')) {
|
||||
e.preventDefault();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
|
||||
|
||||
// check if there are invalid fields
|
||||
// assume they are social icons
|
||||
$('.settings_page_ucp .wrap').on('click', '#submit', function(e) {
|
||||
if ($('#ucp_form input:invalid').not('.skip-save').length) {
|
||||
$('#ucp_tabs').tabs('option', 'active', 2);
|
||||
$('#ucp_form input:invalid').first().focus();
|
||||
alert('Please correct the errors before saving.');
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}); // form submit
|
||||
|
||||
|
||||
// show all social icons
|
||||
$('.settings_page_ucp .wrap').on('click', '#show-social-icons', function(e) {
|
||||
$(this).hide();
|
||||
$('#ucp-social-icons tr').removeClass('hidden');
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
// helper for linking anchors in different tabs
|
||||
$('.settings_page_ucp').on('click', '.change_tab', function(e) {
|
||||
e.preventDefault();
|
||||
$('#ucp_tabs').tabs('option', 'active', $(this).data('tab'));
|
||||
|
||||
// get the link anchor and scroll to it
|
||||
target = this.href.split('#')[1];
|
||||
if (target) {
|
||||
$.scrollTo('#' + target, 500, {offset: {top:-50, left:0}});
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
// upsell dialog init
|
||||
$('#upsell-dialog').dialog({'dialogClass': 'wp-dialog ucp-dialog ucp-upsell-dialog',
|
||||
'modal': 1,
|
||||
'resizable': false,
|
||||
'title': 'UCP Upsell',
|
||||
'zIndex': 9999,
|
||||
'width': 900,
|
||||
'height': 'auto',
|
||||
'show': 'fade',
|
||||
'hide': 'fade',
|
||||
'open': function(event, ui) {
|
||||
ucp_fix_dialog_close(event, ui);
|
||||
$(this).siblings().find('span.ui-dialog-title').html(ucp.dialog_upsell_title);
|
||||
},
|
||||
'close': function(event, ui) { },
|
||||
'autoOpen': false,
|
||||
'closeOnEscape': true
|
||||
});
|
||||
$(window).resize(function(e){
|
||||
$('#upsell-dialog').dialog("option", "position", {my: "center", at: "center", of: window});
|
||||
});
|
||||
|
||||
$('#weglot-upsell-dialog').dialog({'dialogClass': 'wp-dialog ucp-dialog weglot-upsell-dialog',
|
||||
'modal': 1,
|
||||
'resizable': false,
|
||||
'title': 'Translate your under construction page to any language',
|
||||
'zIndex': 9999,
|
||||
'width': 550,
|
||||
'height': 'auto',
|
||||
'show': 'fade',
|
||||
'hide': 'fade',
|
||||
'open': function(event, ui) {
|
||||
ucp_fix_dialog_close(event, ui);
|
||||
$(this).siblings().find('span.ui-dialog-title').html(ucp.weglot_dialog_upsell_title);
|
||||
},
|
||||
'close': function(event, ui) { },
|
||||
'autoOpen': false,
|
||||
'closeOnEscape': true
|
||||
});
|
||||
$(window).resize(function(e) {
|
||||
$('#weglot-upsell-dialog').dialog("option", "position", {my: "center", at: "center", of: window});
|
||||
});
|
||||
|
||||
|
||||
jQuery('#install-weglot').on('click',function(e){
|
||||
$('#weglot-upsell-dialog').dialog('close');
|
||||
jQuery('body').append('<div style="width:550px;height:450px; position:fixed;top:10%;left:50%;margin-left:-275px; color:#444; background-color: #fbfbfb;border:1px solid #DDD; border-radius:4px;box-shadow: 0px 0px 0px 4000px rgba(0, 0, 0, 0.85);z-index: 9999999;"><iframe src="' + ucp.weglot_install_url + '" style="width:100%;height:100%;border:none;" /></div>');
|
||||
jQuery('#wpwrap').css('pointer-events', 'none');
|
||||
e.preventDefault();
|
||||
return false;
|
||||
});
|
||||
|
||||
// zebra on pricing table, per column
|
||||
$('#ucp-pricing-table').find('tr').each(function() {
|
||||
$(this).find('td').eq(1).addClass('hover');
|
||||
});
|
||||
|
||||
$('.settings_page_ucp').on('click change', '.open-ucp-upsell', function(e) {
|
||||
if ($(this).is('select') && $(this).val() != '-1') {
|
||||
return true;
|
||||
}
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
if (ucp.is_activated) {
|
||||
$('#ucp_tabs').tabs('option', 'active', 5);
|
||||
$.scrollTo('#license_key');
|
||||
$('#license_key').focus();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
ad_name = $(this).attr('id');
|
||||
if (!ad_name) {
|
||||
ad_name = $(this).data('pro-ad');
|
||||
}
|
||||
if (!ad_name) {
|
||||
ad_name = '';
|
||||
}
|
||||
|
||||
$('.promo-button, .promo-link').each(function(ind, el) {
|
||||
tmp = $(el).data('href-org');
|
||||
tmp = tmp.replace('pricing-table', ad_name);
|
||||
$(el).attr('href', tmp);
|
||||
});
|
||||
|
||||
if ($(this).is('select')) {
|
||||
$(this).find('option').attr('selected', '');
|
||||
$(this).find('option:first').attr('selected', 'selected');
|
||||
}
|
||||
$(this).blur();
|
||||
|
||||
$('#upsell-dialog').dialog('open');
|
||||
|
||||
if ($(this).data('tab') == 'buy') {
|
||||
$('#tabs_upsell').tabs('option', 'active', 0);
|
||||
}
|
||||
if ($(this).data('tab') == 'features') {
|
||||
$('#tabs_upsell').tabs('option', 'active', 1);
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
$('.settings_page_ucp').on('click', '.open-weglot-upsell', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
$(this).blur();
|
||||
|
||||
$('#weglot-upsell-dialog').dialog('open');
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
$('.settings_page_ucp').on('click change', '.open-smush-install', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
$('#smush-install-link').trigger('click');
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
$('#tabs_upsell').on('tabsactivate', function(event, ui) {
|
||||
$('#upsell-dialog').dialog("option", "position", {my: "center", at: "center", of: window});
|
||||
});
|
||||
|
||||
$('.settings_page_ucp').on('click', '.go-to-license-key', function(e) {
|
||||
$('#upsell-dialog').dialog('close');
|
||||
$('#ucp_tabs').tabs('option', 'active', 5);
|
||||
$.scrollTo('#license_key');
|
||||
$('#license_key').focus();
|
||||
});
|
||||
|
||||
$('#license_key').on('keypress', function(e) {
|
||||
if (e.which == 13) {
|
||||
e.preventDefault();
|
||||
$('#license-submit').trigger('click');
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
if (!Date.now) {
|
||||
Date.now = function() { return new Date().getTime(); }
|
||||
}
|
||||
|
||||
function ucp_update_timer() {
|
||||
out = '';
|
||||
timer = $('.ucp-countdown');
|
||||
|
||||
if (timer.length == 0) {
|
||||
clearInterval(ucp_countdown_interval);
|
||||
}
|
||||
|
||||
now = Math.round(new Date().getTime()/1000);
|
||||
timer_end = ucp.promo_countdown;
|
||||
delta = timer_end - now;
|
||||
seconds = Math.floor( (delta) % 60 );
|
||||
minutes = Math.floor( (delta/60) % 60 );
|
||||
hours = Math.floor( (delta/(60*60)) % 24 );
|
||||
|
||||
if (delta <= 0) {
|
||||
clearInterval(ucp_countdown_interval);
|
||||
}
|
||||
|
||||
if (hours) {
|
||||
out += hours + 'h ';
|
||||
}
|
||||
if (minutes || out) {
|
||||
out += minutes + 'min ';
|
||||
}
|
||||
if (seconds || out) {
|
||||
out += seconds + 'sec';
|
||||
}
|
||||
if (delta <= 0 || !out) {
|
||||
out = 'discount is no longer available';
|
||||
}
|
||||
|
||||
$(timer).html(out);
|
||||
|
||||
return true;
|
||||
} // ucp_update_timer
|
||||
|
||||
if (ucp.promo_countdown) {
|
||||
ucp_countdown_interval = setInterval(ucp_update_timer, 1000);
|
||||
}
|
||||
|
||||
function ucp_position_wpfssl_ad() {
|
||||
pos_left = Math.round($('#ucp_tabs').width()) + 220;
|
||||
pos_top = Math.round($('.ucp-logo').offset().top) + 10;
|
||||
|
||||
$('#ucp-sidebar-ads').css('top', pos_top + 'px').css('left', pos_left + 'px');
|
||||
$('#ucp-sidebar-ads').show();
|
||||
} // ucp_position_wpfssl_ad
|
||||
|
||||
ucp_position_wpfssl_ad();
|
||||
$(window).on('resize', function() {
|
||||
ucp_position_wpfssl_ad();
|
||||
})
|
||||
|
||||
$('.install-wpfssl').on('click',function(e){
|
||||
if (!confirm('The free WP Force SSL plugin will be installed & activated from the official WordPress repository.')) {
|
||||
return;
|
||||
}
|
||||
|
||||
jQuery('body').append('<div style="width:550px;height:450px; position:fixed;top:10%;left:50%;margin-left:-275px; color:#444; background-color: #fbfbfb;border:1px solid #DDD; border-radius:4px;box-shadow: 0px 0px 0px 4000px rgba(0, 0, 0, 0.85);z-index: 9999999;"><iframe src="' + ucp.wpfssl_install_url + '" style="width:100%;height:100%;border:none;" /></div>');
|
||||
jQuery('#wpwrap').css('pointer-events', 'none');
|
||||
|
||||
e.preventDefault();
|
||||
return false;
|
||||
});
|
||||
}); // on ready
|
||||
|
||||
|
||||
function ucp_fix_dialog_close(event, ui) {
|
||||
jQuery('.ui-widget-overlay').bind('click', function(){
|
||||
jQuery('#' + event.target.id).dialog('close');
|
||||
});
|
||||
} // ucp_fix_dialog_close
|
||||
Reference in New Issue
Block a user