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:
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
/**
|
||||
* Redux Date/Time Extension Class
|
||||
*
|
||||
* @package Redux
|
||||
* @author Kevin Provance <kevin.provance@gmail.com>
|
||||
* @class Redux_Extension_Datetime
|
||||
*
|
||||
* @version 4.3.15
|
||||
*/
|
||||
|
||||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
// Don't duplicate me!
|
||||
if ( ! class_exists( 'Redux_Extension_Datetime', false ) ) {
|
||||
|
||||
/**
|
||||
* Class Redux_Extension_Datetime
|
||||
*/
|
||||
class Redux_Extension_Datetime extends Redux_Extension_Abstract {
|
||||
|
||||
/**
|
||||
* Extension version.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public static $version = '4.3.15';
|
||||
|
||||
/**
|
||||
* Extension friendly name.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $extension_name = 'Date/Time';
|
||||
|
||||
/**
|
||||
* Redux_Extension_Datetime constructor.
|
||||
*
|
||||
* @param object $redux ReduxFramework pointer.
|
||||
*/
|
||||
public function __construct( $redux ) {
|
||||
parent::__construct( $redux, __FILE__ );
|
||||
|
||||
$this->add_field( 'datetime' );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,275 @@
|
||||
<?php
|
||||
/**
|
||||
* Redux Date/Time Field Class
|
||||
*
|
||||
* @package Redux Extentions
|
||||
* @author Kevin Provance <kevin.provance@gmail.com>
|
||||
* @class Redux_Datetime
|
||||
*/
|
||||
|
||||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
// Don't duplicate me!
|
||||
if ( ! class_exists( 'Redux_Datetime', false ) ) {
|
||||
|
||||
/**
|
||||
* Class Redux_Datetime
|
||||
*/
|
||||
class Redux_Datetime extends Redux_Field {
|
||||
|
||||
/**
|
||||
* Set field defaults.
|
||||
*/
|
||||
public function set_defaults() {
|
||||
$defaults = array(
|
||||
'date-format' => 'mm-dd-yy',
|
||||
'time-format' => 'hh:mm TT z',
|
||||
'split' => false,
|
||||
'separator' => ' ',
|
||||
'date-picker' => true,
|
||||
'time-picker' => true,
|
||||
'control-type' => 'slider',
|
||||
'num-of-months' => 1,
|
||||
|
||||
// DO NOT CHANGE THESE!!!!
|
||||
// It will make this file's javascript sister
|
||||
// cry like a deflowered virgin on prom night.
|
||||
'timezone-list' => null,
|
||||
'timezone' => '0',
|
||||
'hour-min' => 0,
|
||||
'hour-max' => 23,
|
||||
'minute-min' => 0,
|
||||
'minute-max' => 59,
|
||||
'date-min' => - 1,
|
||||
'date-max' => - 1,
|
||||
);
|
||||
|
||||
$this->field = wp_parse_args( $this->field, $defaults );
|
||||
}
|
||||
|
||||
/**
|
||||
* Field Render Function.
|
||||
* Takes the vars and outputs the HTML for the field in the settings
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function render() {
|
||||
$num_of_months = $this->field['num-of-months'];
|
||||
if ( 0 === $num_of_months ) {
|
||||
$num_of_months = 1;
|
||||
}
|
||||
|
||||
// Validate min/max values.
|
||||
$hour_min = $this->field['hour-min'];
|
||||
$hour_max = $this->field['hour-max'];
|
||||
$min_min = $this->field['minute-min'];
|
||||
$min_max = $this->field['minute-max'];
|
||||
|
||||
if ( $hour_min < 0 || $hour_min > 23 ) {
|
||||
$hour_min = 0;
|
||||
}
|
||||
|
||||
if ( $hour_max < 0 || $hour_max > 23 ) {
|
||||
$hour_max = 23;
|
||||
}
|
||||
|
||||
if ( $min_min < 0 || $min_min > 59 ) {
|
||||
$min_min = 0;
|
||||
}
|
||||
|
||||
if ( $min_max < 0 || $min_max > 59 ) {
|
||||
$min_max = 59;
|
||||
}
|
||||
|
||||
// Validate min date month.
|
||||
if ( is_array( $this->field['date-min'] ) ) {
|
||||
if ( isset( $this->field['date-min']['month'] ) ) {
|
||||
if ( $this->field['date-min']['month'] < 1 || $this->field['date-min']['month'] > 12 ) {
|
||||
$this->field['date-min']['month'] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if ( isset( $this->field['date-min']['day'] ) ) {
|
||||
if ( $this->field['date-min']['day'] < 1 || $this->field['date-min']['day'] > 31 ) {
|
||||
$this->field['date-min']['day'] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Validate max date month.
|
||||
if ( is_array( $this->field['date-max'] ) ) {
|
||||
if ( isset( $this->field['date-max']['month'] ) ) {
|
||||
if ( $this->field['date-max']['month'] < 1 || $this->field['date-max']['month'] > 12 ) {
|
||||
$this->field['date-max']['month'] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Validate max date day (imperfect, so we'll just use 31).
|
||||
if ( isset( $this->field['date-max']['day'] ) ) {
|
||||
if ( $this->field['date-max']['day'] < 1 || $this->field['date-max']['day'] > 31 ) {
|
||||
$this->field['date-max']['day'] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Assignment, make it easier to read.
|
||||
$field_id = $this->field['id'];
|
||||
$field_name = $this->field['name'];
|
||||
$split = $this->field['split'];
|
||||
$control_type = $this->field['control-type'];
|
||||
|
||||
// Sanitize width
|
||||
// Sanitize default value.
|
||||
if ( true === $split ) {
|
||||
if ( ! is_array( $this->value ) ) {
|
||||
$this->value = array();
|
||||
$this->value['time'] = '';
|
||||
$this->value['date'] = '';
|
||||
}
|
||||
} elseif ( is_array( $this->value ) ) {
|
||||
$this->value = '';
|
||||
}
|
||||
|
||||
// Dummy check, in case something other than select or slider
|
||||
// is entered.
|
||||
switch ( $control_type ) {
|
||||
case 'select':
|
||||
case 'slider':
|
||||
break;
|
||||
default:
|
||||
$control_type = 'slider';
|
||||
}
|
||||
|
||||
// Set placeholder based on mode.
|
||||
if ( true === $split ) {
|
||||
$date_placeholder = $this->field['placeholder']['date'] ?? __( 'Date', 'your-domain-here' );
|
||||
$time_placeholder = $this->field['placeholder']['time'] ?? __( 'Time', 'your-domain-here' );
|
||||
} else {
|
||||
$date_placeholder = $this->field['placeholder'] ?? __( 'Date / Time', 'your-domain-here' );
|
||||
}
|
||||
|
||||
// Output defaults to div, so JS can read it.
|
||||
// Broken up for readability; coz I'm the one who has to debug it!
|
||||
echo '<div id="' . esc_attr( $field_id ) . '" class="redux-datetime-container"
|
||||
data-dev-mode="' . esc_attr( $this->parent->args['dev_mode'] ) . '"
|
||||
data-version="' . esc_attr( Redux_Extension_Datetime::$version ) . '"
|
||||
data-id="' . esc_attr( $field_id ) . '"
|
||||
data-mode="' . esc_attr( $split ) . '"
|
||||
data-separator="' . esc_attr( $this->field['separator'] ) . '"
|
||||
data-control-type="' . esc_attr( $control_type ) . '"
|
||||
data-rtl="' . esc_attr( is_rtl() ) . '"
|
||||
data-num-of-months="' . esc_attr( $num_of_months ) . '"
|
||||
data-hour-min="' . esc_attr( $hour_min ) . '"
|
||||
data-hour-max="' . esc_attr( $hour_max ) . '"
|
||||
data-minute-min="' . esc_attr( $min_min ) . '"
|
||||
data-minute-max="' . esc_attr( $min_max ) . '"
|
||||
data-date-min="' . rawurlencode( wp_json_encode( $this->field['date-min'] ) ) . '"
|
||||
data-date-max="' . rawurlencode( wp_json_encode( $this->field['date-max'] ) ) . '"
|
||||
data-timezone="' . esc_attr( $this->field['timezone'] ) . '"
|
||||
data-timezone-list="' . rawurlencode( wp_json_encode( $this->field['timezone-list'] ) ) . '"
|
||||
data-date-picker="' . esc_attr( $this->field['date-picker'] ) . '"
|
||||
data-time-picker="' . esc_attr( $this->field['time-picker'] ) . '"
|
||||
data-time-format="' . esc_attr( $this->field['time-format'] ) . '"
|
||||
data-date-format="' . esc_attr( $this->field['date-format'] ) . '">';
|
||||
|
||||
// If split mode is on, output two text boxes.
|
||||
if ( true === $split ) {
|
||||
echo '<div class="redux-date-input input_wrapper">';
|
||||
echo '<label for="' . esc_attr( $field_id ) . '-date" class="redux-date-input-label">' . esc_html( $date_placeholder ) . '</label>';
|
||||
echo ' <input
|
||||
data-id="' . esc_attr( $field_id ) . '"
|
||||
type="text"
|
||||
id="' . esc_attr( $field_id ) . '-date"
|
||||
name="' . esc_attr( $field_name ) . '[date]"
|
||||
placeholder="' . esc_attr( $date_placeholder ) . '"
|
||||
value="' . esc_attr( $this->value['date'] ) . '"
|
||||
class="redux-date-picker ' . esc_attr( $this->field['class'] ) . '" /> ';
|
||||
|
||||
echo '</div>';
|
||||
|
||||
echo '<div class="redux-time-input input_wrapper">';
|
||||
echo '<label for="' . esc_attr( $field_id ) . '-time" class="redux-time-input-label">' . esc_html( $time_placeholder ) . '</label>';
|
||||
echo ' <input
|
||||
data-id="' . esc_attr( $field_id ) . '"
|
||||
type="text"
|
||||
id="' . esc_attr( $field_id ) . '-time"
|
||||
name="' . esc_attr( $field_name ) . '[time]"
|
||||
placeholder="' . esc_attr( $time_placeholder ) . '"
|
||||
value="' . esc_attr( $this->value['time'] ) . '"
|
||||
class="redux-time-picker ' . esc_attr( $this->field['class'] ) . '" />';
|
||||
|
||||
// Otherwise, just one.
|
||||
} else {
|
||||
echo '<div class="redux-datetime-input single_wrapper">';
|
||||
echo '<label for="' . esc_attr( $field_id ) . '-date" class="redux-datetime-input-label">' . esc_attr( $date_placeholder ) . '</label>';
|
||||
echo ' <input
|
||||
data-id="' . esc_attr( $field_id ) . '"
|
||||
type="text"
|
||||
id="' . esc_attr( $field_id ) . '-date"
|
||||
name="' . esc_attr( $field_name ) . '"
|
||||
placeholder="' . esc_attr( $date_placeholder ) . '"
|
||||
value="' . esc_attr( $this->value ) . '"
|
||||
class="redux-date-picker ' . esc_attr( $this->field['class'] ) . '" />';
|
||||
|
||||
}
|
||||
|
||||
echo '</div>';
|
||||
|
||||
// Close da div, main!
|
||||
echo '</div>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Enqueue Function.
|
||||
* If this field requires any scripts, or css define this function and register/enqueue the scripts/css
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function enqueue() {
|
||||
$min = Redux_Functions::is_min();
|
||||
|
||||
wp_enqueue_script(
|
||||
'redux-datetime-slider',
|
||||
$this->url . 'vendor/jquery-ui-sliderAccess' . $min . '.js',
|
||||
array( 'jquery' ),
|
||||
'0.3',
|
||||
true
|
||||
);
|
||||
|
||||
wp_enqueue_script(
|
||||
'redux-datetime',
|
||||
$this->url . 'vendor/jquery-ui-timepicker-addon' . $min . '.js',
|
||||
array(
|
||||
'jquery',
|
||||
'jquery-ui-datepicker',
|
||||
'jquery-ui-widget',
|
||||
'jquery-ui-slider',
|
||||
'redux-datetime-slider',
|
||||
),
|
||||
'1.6.3',
|
||||
true
|
||||
);
|
||||
|
||||
wp_enqueue_script(
|
||||
'redux-field-datetime',
|
||||
$this->url . 'redux-datetime' . $min . '.js',
|
||||
array( 'jquery', 'redux-datetime', 'redux-js' ),
|
||||
Redux_Extension_Datetime::$version,
|
||||
true
|
||||
);
|
||||
|
||||
if ( $this->parent->args['dev_mode'] ) {
|
||||
wp_enqueue_style(
|
||||
'redux-field-datetime',
|
||||
$this->url . 'redux-datetime.css',
|
||||
array(),
|
||||
Redux_Extension_Datetime::$version,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
<?php
|
||||
/**
|
||||
* Silence is golden.
|
||||
*
|
||||
* @package Redux Framework
|
||||
*/
|
||||
|
||||
echo null;
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,177 @@
|
||||
/* global redux, jQuery */
|
||||
|
||||
( function( $ ) {
|
||||
'use strict';
|
||||
|
||||
redux.field_objects = redux.field_objects || {};
|
||||
redux.field_objects.datetime = redux.field_objects.datetime || {};
|
||||
|
||||
redux.field_objects.datetime.init = function( selector ) {
|
||||
if ( ! selector ) {
|
||||
selector = $( document ).find( '.redux-group-tab:visible' ).find( '.redux-container-datetime:visible' );
|
||||
}
|
||||
|
||||
$( selector ).each(
|
||||
function() {
|
||||
var el = $( this );
|
||||
var parent = el;
|
||||
|
||||
if ( ! el.hasClass( 'redux-field-container' ) ) {
|
||||
parent = el.parents( '.redux-field-container:first' );
|
||||
}
|
||||
|
||||
if ( parent.is( ':hidden' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( parent.hasClass( 'redux-field-init' ) ) {
|
||||
parent.removeClass( 'redux-field-init' );
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
el.find( '.redux-date-picker' ).each(
|
||||
function() {
|
||||
var dateFormat;
|
||||
var timeFormat;
|
||||
var separator;
|
||||
var rtl;
|
||||
var numOfMonths;
|
||||
var hourMin;
|
||||
var hourMax;
|
||||
var minuteMin;
|
||||
var minuteMax;
|
||||
var controlType;
|
||||
var datePicker;
|
||||
var timePicker;
|
||||
var timeOnly = false;
|
||||
var timezoneList;
|
||||
var dateMin;
|
||||
var minDate;
|
||||
var dateMax;
|
||||
var maxDate;
|
||||
var timezone;
|
||||
var split;
|
||||
var altField = '';
|
||||
var timePickerID;
|
||||
|
||||
var mainID = $( this ).parents( '.redux-datetime-container:first' ).attr( 'id' );
|
||||
var id = $( '#' + mainID );
|
||||
|
||||
dateFormat = id.data( 'date-format' );
|
||||
dateFormat = String( ( '' === dateFormat ) ? 'mm-dd-yy' : dateFormat );
|
||||
|
||||
timeFormat = id.data( 'time-format' );
|
||||
timeFormat = String( ( '' === timeFormat ) ? 'h:mm TT' : timeFormat );
|
||||
|
||||
separator = id.data( 'separator' );
|
||||
separator = String( ( '' === separator ) ? ' ' : separator );
|
||||
|
||||
rtl = id.data( 'rtl' );
|
||||
rtl = Boolean( ( '' === rtl ) ? false : rtl );
|
||||
|
||||
numOfMonths = id.data( 'num-of-months' );
|
||||
hourMin = id.data( 'hour-min' );
|
||||
hourMax = id.data( 'hour-max' );
|
||||
minuteMin = id.data( 'minute-min' );
|
||||
minuteMax = id.data( 'minute-max' );
|
||||
|
||||
controlType = id.data( 'control-type' );
|
||||
controlType = String( ( '' === controlType ) ? 'slider' : controlType );
|
||||
|
||||
datePicker = id.data( 'date-picker' );
|
||||
datePicker = Boolean( ( '' === datePicker ) ? false : datePicker );
|
||||
|
||||
timePicker = id.data( 'time-picker' );
|
||||
timePicker = Boolean( ( '' === timePicker ) ? false : timePicker );
|
||||
|
||||
if ( false === datePicker ) {
|
||||
timeOnly = true;
|
||||
}
|
||||
|
||||
timezoneList = id.data( 'timezone-list' );
|
||||
timezoneList = decodeURIComponent( timezoneList );
|
||||
timezoneList = JSON.parse( timezoneList );
|
||||
|
||||
dateMin = id.data( 'date-min' );
|
||||
dateMin = decodeURIComponent( dateMin );
|
||||
dateMin = JSON.parse( dateMin );
|
||||
|
||||
if ( dateMin === - 1 ) {
|
||||
minDate = null;
|
||||
} else if ( 'object' === typeof dateMin ) {
|
||||
minDate = new Date( dateMin.year, dateMin.month, dateMin.day );
|
||||
} else {
|
||||
minDate = dateMin;
|
||||
}
|
||||
|
||||
dateMax = id.data( 'date-max' );
|
||||
dateMax = decodeURIComponent( dateMax );
|
||||
dateMax = JSON.parse( dateMax );
|
||||
|
||||
if ( dateMax === - 1 ) {
|
||||
maxDate = null;
|
||||
} else if ( 'object' === typeof dateMax ) {
|
||||
maxDate = new Date( dateMax.year, dateMax.month, dateMax.day );
|
||||
} else {
|
||||
maxDate = dateMax;
|
||||
}
|
||||
|
||||
timezone = id.data( 'timezone' );
|
||||
|
||||
split = id.data( 'mode' );
|
||||
split = Boolean( ( '' === split ) ? false : split );
|
||||
|
||||
if ( true === split ) {
|
||||
timePickerID = el.find( 'input.redux-time-picker' ).data( 'id' );
|
||||
altField = '#' + timePickerID + '-time'; // '.redux-time-picker';
|
||||
}
|
||||
|
||||
$( this ).datetimepicker(
|
||||
{
|
||||
beforeShow: function( input, instance ) {
|
||||
var el = $( '#ui-datepicker-div' );
|
||||
var popover = instance.dpDiv;
|
||||
|
||||
$( '.redux-container:first' ).append( el );
|
||||
el.hide();
|
||||
|
||||
setTimeout(
|
||||
function() {
|
||||
popover.position(
|
||||
{
|
||||
my: 'left top',
|
||||
at: 'left bottom',
|
||||
collision: 'none',
|
||||
of: input
|
||||
}
|
||||
);
|
||||
},
|
||||
1
|
||||
);
|
||||
},
|
||||
altField: altField,
|
||||
dateFormat: dateFormat,
|
||||
timeFormat: timeFormat,
|
||||
separator: separator,
|
||||
showTimepicker: timePicker,
|
||||
timeOnly: timeOnly,
|
||||
controlType: controlType,
|
||||
isRTL: rtl,
|
||||
timezoneList: timezoneList,
|
||||
timezone: timezone,
|
||||
hourMin: hourMin,
|
||||
hourMax: hourMax,
|
||||
minuteMin: minuteMin,
|
||||
minuteMax: minuteMax,
|
||||
minDate: minDate,
|
||||
maxDate: maxDate,
|
||||
numberOfMonths: numOfMonths
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
};
|
||||
} )( jQuery );
|
||||
@@ -0,0 +1 @@
|
||||
.redux-container-datetime .redux-datetime-container .input_wrapper,.redux-container-datetime .redux-datetime-container single_wrapper{display:block;position:relative;margin:0 4px 0 5px;padding:0;width:25%;max-width:25%;min-width:70px;float:left;clear:none;height:57px;-webkit-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box;vertical-align:baseline}.redux-container-datetime .redux-datetime-container .single_wrapper{width:50% !important;max-width:50% !important}.redux-container-datetime .redux-datetime-container label{display:block;position:relative;font-size:12px !important;text-align:left;color:#999;margin:4px 0 2px 0 !important;cursor:default}.redux-container-datetime .redux-datetime-container .redux-date-picker{width:100%}.redux-container-datetime .redux-datetime-container .redux-time-picker{width:100%}.ui-tpicker-grid-label{background:0;border:0;margin:0;padding:0}.ui-timepicker-div .ui-widget-header{margin-bottom:8px}.ui-timepicker-div dl{text-align:left}.ui-timepicker-div dl dt{float:left;clear:left;padding:0 0 0 5px}.ui-timepicker-div dl dd{margin:0 10px 10px 40%}.ui-timepicker-div td{font-size:90%}.ui-timepicker-div .ui_tpicker_unit_hide{display:none}.ui-timepicker-div .ui_tpicker_time .ui_tpicker_time_input{background:0;color:inherit;border:0;outline:0;border-bottom:solid 1px #555;width:95%}.ui-timepicker-div .ui_tpicker_time .ui_tpicker_time_input:focus{border-bottom-color:#aaa}.ui-timepicker-div.ui-timepicker-oneLine{padding-right:2px}.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time,.ui-timepicker-div.ui-timepicker-oneLine dt{display:none}.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time_label{display:block;padding-top:2px}.ui-timepicker-div.ui-timepicker-oneLine dl{text-align:right}.ui-timepicker-div.ui-timepicker-oneLine dl dd,.ui-timepicker-div.ui-timepicker-oneLine dl dd>div{display:inline-block;margin:0}.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_millisec:before,.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_microsec:before{content:'.';display:inline-block}.ui-timepicker-div.ui-timepicker-oneLine dd.ui_tpicker_minute:before,.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_second:before{content:':';display:inline-block}.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide,.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide:before{display:none}.ui-timepicker-div .ui-widget-header{margin-bottom:8px}.ui-timepicker-div .ui-slider{position:relative;text-align:left}.ui-timepicker-div .ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-timepicker-div .ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-timepicker-div .ui-slider.ui-state-disabled .ui-slider-handle,.ui-timepicker-div .ui-slider.ui-state-disabled .ui-slider-range{-webkit-filter:inherit;filter:inherit}.ui-timepicker-div .ui-slider-horizontal{height:.8em}.ui-timepicker-div .ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-timepicker-div .ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-timepicker-div .ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-timepicker-div .ui-slider-horizontal .ui-slider-range-min{left:0}.ui-timepicker-div .ui-slider-horizontal .ui-slider-range-max{right:0}.ui-timepicker-div .ui-slider-vertical{width:.8em;height:100px}.ui-timepicker-div .ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-timepicker-div .ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-timepicker-div .ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-timepicker-div .ui-slider-vertical .ui-slider-range-max{top:0}.ui-timepicker-rtl{direction:rtl}.ui-timepicker-rtl dl{text-align:right;padding:0 5px 0 0}.ui-timepicker-rtl dl dt{float:right;clear:right}.ui-timepicker-rtl dl dd{margin:0 40% 10px 10px}
|
||||
@@ -0,0 +1 @@
|
||||
!function(j){"use strict";redux.field_objects=redux.field_objects||{},redux.field_objects.datetime=redux.field_objects.datetime||{},redux.field_objects.datetime.init=function(e){e=e||j(document).find(".redux-group-tab:visible").find(".redux-container-datetime:visible"),j(e).each(function(){var y=j(this),e=y;(e=y.hasClass("redux-field-container")?e:y.parents(".redux-field-container:first")).is(":hidden")||e.hasClass("redux-field-init")&&(e.removeClass("redux-field-init"),y.find(".redux-date-picker").each(function(){var e,t,a,i,d,n,o,r,m,s,u,c,l,f,p=!1,x="",h=j(this).parents(".redux-datetime-container:first").attr("id"),h=j("#"+h),b=h.data("date-format");b=String(""===b?"mm-dd-yy":b),e=h.data("time-format"),e=String(""===e?"h:mm TT":e),t=h.data("separator"),t=String(""===t?" ":t),a=h.data("rtl"),a=Boolean(""!==a&&a),i=h.data("num-of-months"),d=h.data("hour-min"),n=h.data("hour-max"),o=h.data("minute-min"),r=h.data("minute-max"),m=h.data("control-type"),m=String(""===m?"slider":m),u=h.data("date-picker"),u=Boolean(""!==u&&u),s=h.data("time-picker"),s=Boolean(""!==s&&s),!1===u&&(p=!0),u=h.data("timezone-list"),u=decodeURIComponent(u),u=JSON.parse(u),c=h.data("date-min"),c=decodeURIComponent(c),c=-1===(c=JSON.parse(c))?null:"object"==typeof c?new Date(c.year,c.month,c.day):c,l=h.data("date-max"),l=decodeURIComponent(l),l=-1===(l=JSON.parse(l))?null:"object"==typeof l?new Date(l.year,l.month,l.day):l,f=h.data("timezone"),h=h.data("mode"),!0===Boolean(""!==h&&h)&&(x="#"+y.find("input.redux-time-picker").data("id")+"-time"),j(this).datetimepicker({beforeShow:function(e,t){var a=j("#ui-datepicker-div"),i=t.dpDiv;j(".redux-container:first").append(a),a.hide(),setTimeout(function(){i.position({my:"left top",at:"left bottom",collision:"none",of:e})},1)},altField:x,dateFormat:b,timeFormat:e,separator:t,showTimepicker:s,timeOnly:p,controlType:m,isRTL:a,timezoneList:u,timezone:f,hourMin:d,hourMax:n,minuteMin:o,minuteMax:r,minDate:c,maxDate:l,numberOfMonths:i})}))})}}(jQuery);
|
||||
@@ -0,0 +1,234 @@
|
||||
.redux-container-datetime {
|
||||
.redux-datetime-container {
|
||||
.input_wrapper,
|
||||
.single_wrapper {
|
||||
display: block;
|
||||
position: relative;
|
||||
margin: 0 4px 0 5px;
|
||||
padding: 0;
|
||||
width: 25%;
|
||||
max-width: 25%;
|
||||
min-width: 70px;
|
||||
float: left;
|
||||
clear: none;
|
||||
height: 57px;
|
||||
box-sizing: border-box;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
.single_wrapper {
|
||||
width: 50%!important;
|
||||
max-width: 50%!important;
|
||||
}
|
||||
|
||||
label {
|
||||
display: block;
|
||||
position: relative;
|
||||
font-size: 12px !important;
|
||||
text-align: left;
|
||||
color: #999999;
|
||||
margin: 4px 0 2px 0 !important;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.redux-date-picker {
|
||||
width: 100%
|
||||
}
|
||||
|
||||
.redux-time-picker {
|
||||
width: 100%
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.ui-tpicker-grid-label {
|
||||
background: none;
|
||||
border: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.ui-timepicker-div {
|
||||
.ui-widget-header {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
dl {
|
||||
text-align: left;
|
||||
|
||||
dt {
|
||||
float: left;
|
||||
clear:left;
|
||||
padding: 0 0 0 5px;
|
||||
}
|
||||
|
||||
dd {
|
||||
margin: 0 10px 10px 40%;
|
||||
}
|
||||
}
|
||||
|
||||
td {
|
||||
font-size: 90%;
|
||||
}
|
||||
|
||||
.ui_tpicker_unit_hide{
|
||||
display: none;
|
||||
}
|
||||
|
||||
.ui_tpicker_time .ui_tpicker_time_input {
|
||||
background: none;
|
||||
color: inherit;
|
||||
border: none;
|
||||
outline: none;
|
||||
border-bottom: solid 1px #555;
|
||||
width: 95%;
|
||||
|
||||
&:focus {
|
||||
border-bottom-color: #aaa;
|
||||
}
|
||||
}
|
||||
|
||||
&.ui-timepicker-oneLine {
|
||||
padding-right: 2px;
|
||||
|
||||
.ui_tpicker_time,
|
||||
dt {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.ui_tpicker_time_label {
|
||||
display: block; padding-top: 2px;
|
||||
}
|
||||
|
||||
dl {
|
||||
text-align: right;
|
||||
|
||||
dd,
|
||||
dd > div {
|
||||
display:inline-block;
|
||||
margin:0;
|
||||
}
|
||||
|
||||
dd.ui_tpicker_millisec:before,
|
||||
dd.ui_tpicker_microsec:before {
|
||||
content:'.';
|
||||
display:inline-block;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
dd.ui_tpicker_minute:before,
|
||||
dl dd.ui_tpicker_second:before {
|
||||
content:':';
|
||||
display:inline-block;
|
||||
}
|
||||
|
||||
.ui_tpicker_unit_hide,
|
||||
.ui_tpicker_unit_hide:before{
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.ui-widget-header {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.ui-slider {
|
||||
position: relative;
|
||||
text-align: left;
|
||||
|
||||
.ui-slider-handle {
|
||||
position: absolute;
|
||||
z-index: 2;
|
||||
width: 1.2em;
|
||||
height: 1.2em;
|
||||
cursor: default;
|
||||
-ms-touch-action: none;
|
||||
touch-action: none;
|
||||
}
|
||||
|
||||
.ui-slider-range {
|
||||
position: absolute;
|
||||
z-index: 1;
|
||||
font-size: .7em;
|
||||
display: block;
|
||||
border: 0;
|
||||
background-position: 0 0;
|
||||
}
|
||||
|
||||
&.ui-state-disabled .ui-slider-handle,
|
||||
&.ui-state-disabled .ui-slider-range {
|
||||
filter: inherit;
|
||||
}
|
||||
}
|
||||
|
||||
.ui-slider-horizontal {
|
||||
height: .8em;
|
||||
|
||||
.ui-slider-handle {
|
||||
top: -.3em;
|
||||
margin-left: -.6em;
|
||||
}
|
||||
|
||||
.ui-slider-handle {
|
||||
top: -.3em;
|
||||
margin-left: -.6em;
|
||||
}
|
||||
|
||||
.ui-slider-range {
|
||||
top: 0;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.ui-slider-range-min {
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.ui-slider-range-max {
|
||||
right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.ui-slider-vertical {
|
||||
width: .8em;
|
||||
height: 100px;
|
||||
|
||||
.ui-slider-handle {
|
||||
left: -.3em;
|
||||
margin-left: 0;
|
||||
margin-bottom: -.6em;
|
||||
}
|
||||
|
||||
.ui-slider-range {
|
||||
left: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.ui-slider-range-min {
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
.ui-slider-range-max {
|
||||
top: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.ui-timepicker-rtl{
|
||||
direction: rtl;
|
||||
|
||||
dl {
|
||||
text-align: right;
|
||||
padding: 0 5px 0 0;
|
||||
|
||||
dt{
|
||||
float: right;
|
||||
clear: right;
|
||||
}
|
||||
|
||||
dd {
|
||||
margin: 0 40% 10px 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
<?php
|
||||
/**
|
||||
* Silence is golden.
|
||||
*
|
||||
* @package Redux Framework
|
||||
*/
|
||||
|
||||
echo null;
|
||||
Reference in New Issue
Block a user