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:
Hotel Raxa Dev
2025-07-11 07:43:22 +02:00
commit 5b1e2453c7
9816 changed files with 2784509 additions and 0 deletions

View File

@@ -0,0 +1,330 @@
<?php
/**
* Bow Shadow.
*
* @package ReduxPro
* @subpackage Redux_Box_Shadow
* @author Kevin Provance (kprovance)
* @version 1.0.0
*/
defined( 'ABSPATH' ) || exit;
if ( ! class_exists( 'Redux_Box_Shadow', false ) ) {
/**
* Main Redux_Box_Shadow class
*
* @since 4.0.0
*/
class Redux_Box_Shadow extends Redux_Field {
/**
* Set defaults.
*/
public function set_defaults() {
$defaults = array(
'inset-shadow' => true,
'drop-shadow' => true,
'preview-color' => '#f1f1f1',
);
$this->field = Redux_Functions::parse_args( $this->field, $defaults );
$defaults = array(
'inset' => true,
'drop' => true,
'inset-shadow' => array(
'checked' => false,
'color' => '#ABABAB',
'horizontal' => 0,
'vertical' => 0,
'blur' => 10,
'spread' => 0,
),
'drop-shadow' => array(
'checked' => true,
'color' => '#dddddd',
'horizontal' => 5,
'vertical' => 5,
'blur' => 5,
'spread' => 1,
),
);
$this->value = Redux_Functions::parse_args( $this->value, $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() {
$shadow_arr = array(
'inset',
'drop',
);
echo '<div class="box-shadow-inset">';
echo '<div class="box-shadow-controls row">';
foreach ( $shadow_arr as $shadow_type ) {
if ( $this->field[ $shadow_type . '-shadow' ] ) {
$disabled = ' pro-disabled';
if ( $this->value[ $shadow_type . '-shadow' ]['checked'] ) {
$disabled = '';
}
$slider_disable = disabled( filter_var( $this->value[ $shadow_type . '-shadow' ]['checked'], FILTER_VALIDATE_BOOLEAN ), false, false );
echo '<div class="col-2 shadow-' . esc_attr( $shadow_type ) . ' " data-shadow="' . esc_attr( $shadow_type ) . '">';
echo '<ul>';
echo '<li>';
echo '<label for="' . esc_attr( $this->field['id'] ) . '-' . esc_attr( $shadow_type ) . '-shadow" class="' . esc_attr( $disabled ) . '">';
echo '<input type="checkbox" id="' . esc_attr( $this->field['id'] ) . '-' . esc_attr( $shadow_type ) . '-shadow" class="checkbox" value="1"' . checked( $this->value[ $shadow_type . '-shadow' ]['checked'], '1', false ) . '/>';
echo '<input type="hidden" data-val="1" value="' . esc_attr( $this->value[ $shadow_type . '-shadow' ]['checked'] ) . '" class="checkbox-check" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[' . esc_attr( $shadow_type ) . '-shadow][checked]"/>';
echo esc_html( ucfirst( $shadow_type ) ) . ' ' . esc_html__( 'Shadow', 'redux-framework' );
echo '</label>';
echo '</li>';
echo '<li>';
$def_color = $this->field['default'][ $shadow_type . '-shadow' ]['color'] ?? '';
echo '<input ';
echo 'data-id="' . esc_attr( $this->field['id'] ) . '"';
echo 'name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[' . esc_attr( $shadow_type ) . '-shadow][color]"';
echo 'id="' . esc_attr( $this->field['id'] ) . '-' . esc_attr( $shadow_type ) . '-color"';
echo 'class="color-picker redux-color redux-box-shadow-' . esc_attr( $shadow_type ) . '-input redux-color-init ' . esc_attr( $this->field['class'] ) . '"';
echo 'type="text" value="' . esc_attr( $this->value[ $shadow_type . '-shadow' ]['color'] ) . '"';
echo 'data-default-color="' . esc_attr( $def_color ) . '"';
echo '/>';
echo '</li>';
echo '<li>';
echo '<div class="slider-' . esc_attr( $shadow_type ) . '-horizontal">';
echo esc_html__( 'Horizontal Length', 'redux-framework' ) . ': <strong>' . esc_html( $this->value[ $shadow_type . '-shadow' ]['horizontal'] ) . 'px</strong>';
echo '<div
class="redux-box-shadow-slider redux-box-shadow-' . esc_attr( $shadow_type ) . ' redux-' . esc_attr( $shadow_type ) . '-horizontal ' . esc_attr( $shadow_type ) . '-horizontal-input ' . esc_attr( $this->field['class'] ) . '"
id="' . esc_attr( $this->field['id'] ) . '"
data-id="' . esc_attr( $this->field['id'] ) . '-' . esc_attr( $shadow_type ) . '-horizontal"
data-min="-50"
data-max="50"
data-step="1"
data-rtl="' . esc_attr( is_rtl() ) . '"
data-label="' . esc_attr__( 'Horizontal Length', 'redux-framework' ) . '"
data-default = "' . esc_attr( $this->value[ $shadow_type . '-shadow' ]['horizontal'] ) . '" ' . esc_html( $slider_disable ) . '>
</div>';
echo '<input
type="hidden"
id="redux-slider-value-' . esc_attr( $this->field['id'] ) . '-' . esc_attr( $shadow_type ) . '-horizontal"
class="' . esc_attr( $shadow_type ) . '-horizontal"
name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[' . esc_attr( $shadow_type ) . '-shadow][horizontal]"
value="' . esc_attr( $this->value[ $shadow_type . '-shadow' ]['horizontal'] ) . '"
data-id="' . esc_attr( $this->field['id'] ) . '"
/>';
echo '</div>';
echo '</li>';
echo '<li>';
echo '<div class="slider-' . esc_attr( $shadow_type ) . '-vertical">';
echo esc_html__( 'Vertical Length', 'redux-framework' ) . ': <strong>' . esc_html( $this->value[ $shadow_type . '-shadow' ]['vertical'] ) . 'px</strong>';
echo '<div
class="redux-box-shadow-slider redux-box-shadow-' . esc_attr( $shadow_type ) . ' redux-' . esc_attr( $shadow_type ) . '-vertical ' . esc_attr( $shadow_type ) . '-vertical-input ' . esc_attr( $this->field['class'] ) . '"
id="' . esc_attr( $this->field['id'] ) . '"
data-id="' . esc_attr( $this->field['id'] ) . '-' . esc_attr( $shadow_type ) . '-vertical"
data-min="-50"
data-max="50"
data-step="1"
data-rtl="' . esc_attr( is_rtl() ) . '"
data-label="' . esc_attr__( 'Vertical Length', 'redux-framework' ) . '"
data-default = "' . esc_attr( $this->value[ $shadow_type . '-shadow' ]['vertical'] ) . '" ' . esc_html( $slider_disable ) . '>
</div>';
echo '<input
type="hidden"
id="redux-slider-value-' . esc_attr( $this->field['id'] ) . '-' . esc_attr( $shadow_type ) . '-vertical"
class="' . esc_attr( $shadow_type ) . '-vertical"
name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[' . esc_attr( $shadow_type ) . '-shadow][vertical]"
value="' . esc_attr( $this->value[ $shadow_type . '-shadow' ]['vertical'] ) . '"
data-id="' . esc_attr( $this->field['id'] ) . '"
/>';
echo '</div>';
echo '</li>';
echo '<li>';
echo '<div class="slider-' . esc_attr( $shadow_type ) . '-blur">';
echo esc_html__( 'Blur Radius', 'redux-framework' ) . ': <strong>' . esc_html( $this->value[ $shadow_type . '-shadow' ]['blur'] ) . 'px</strong>';
echo '<div
class="redux-box-shadow-slider redux-box-shadow-' . esc_attr( $shadow_type ) . ' redux-' . esc_attr( $shadow_type ) . '-blur ' . esc_attr( $shadow_type ) . '-blur-input ' . esc_attr( $this->field['class'] ) . '"
id="' . esc_attr( $this->field['id'] ) . '"
data-id="' . esc_attr( $this->field['id'] ) . '-' . esc_attr( $shadow_type ) . '-blur"
data-min="0"
data-max="100"
data-step="1"
data-rtl="' . esc_attr( is_rtl() ) . '"
data-label="' . esc_attr__( 'Blur Radius', 'redux-framework' ) . '"
data-default = "' . esc_attr( $this->value[ $shadow_type . '-shadow' ]['blur'] ) . '" ' . esc_html( $slider_disable ) . '>
</div>';
echo '<input
type="hidden"
id="redux-slider-value-' . esc_attr( $this->field['id'] ) . '-' . esc_attr( $shadow_type ) . '-blur"
class="' . esc_attr( $shadow_type ) . '-blur"
name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[' . esc_attr( $shadow_type ) . '-shadow][blur]"
value="' . esc_attr( $this->value[ $shadow_type . '-shadow' ]['blur'] ) . '"
data-id="' . esc_attr( $this->field['id'] ) . '"
/>';
echo '</div>';
echo '</li>';
echo '<li>';
echo '<div class="slider-' . esc_attr( $shadow_type ) . '-spread">';
echo esc_html__( 'Spread', 'redux-framework' ) . ': <strong>' . esc_html( $this->value[ $shadow_type . '-shadow' ]['spread'] ) . 'px</strong>';
echo '<div
class="redux-box-shadow-slider redux-box-shadow-' . esc_attr( $shadow_type ) . ' redux-' . esc_attr( $shadow_type ) . '-spread ' . esc_attr( $shadow_type ) . '-spread-input ' . esc_attr( $this->field['class'] ) . '"
id="' . esc_attr( $this->field['id'] ) . '"
data-id="' . esc_attr( $this->field['id'] ) . '-' . esc_attr( $shadow_type ) . '-spread"
data-min="-100"
data-max="100"
data-step="1"
data-rtl="' . esc_attr( is_rtl() ) . '"
data-label="' . esc_attr__( 'Spread', 'redux-framework' ) . '"
data-default = "' . esc_attr( $this->value[ $shadow_type . '-shadow' ]['spread'] ) . '" ' . esc_html( $slider_disable ) . '>
</div>';
echo '<input
type="hidden"
id="redux-slider-value-' . esc_attr( $this->field['id'] ) . '-' . esc_attr( $shadow_type ) . '-spread"
class="' . esc_attr( $shadow_type ) . '-spread"
name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[' . esc_attr( $shadow_type ) . '-shadow][spread]"
value="' . esc_attr( $this->value[ $shadow_type . '-shadow' ]['spread'] ) . '"
data-id="' . esc_attr( $this->field['id'] ) . '"
/>';
echo '</div>';
echo '</li>';
echo '</ul>';
echo '</div>';
}
}
$css = $this->css_style( $this->value );
$css .= 'background:' . esc_html( $this->field['preview-color'] );
echo '</div>';
echo '<div class="" id="shadow-result" style="' . $css . '"></div>'; // phpcs:ignore WordPress.Security.EscapeOutput
echo '</div>';
}
/**
* Compile CSS output.
*
* @param mixed $data Data.
*
* @return string
*/
public function css_style( $data ): string {
$css = '';
if ( $this->field['inset-shadow'] ) {
$inset = $data['inset-shadow'];
if ( filter_var( $inset['checked'], FILTER_VALIDATE_BOOLEAN ) ) {
$h = $inset['horizontal'];
$v = $inset['vertical'];
$b = $inset['blur'];
$s = $inset['spread'];
$color = $inset['color'];
$css .= 'inset ' . $h . 'px ' . $v . 'px ' . $b . 'px ' . $s . 'px ' . $color;
}
}
if ( $this->field['drop-shadow'] ) {
$drop = $data['drop-shadow'];
if ( filter_var( $drop['checked'], FILTER_VALIDATE_BOOLEAN ) ) {
$h = $drop['horizontal'];
$v = $drop['vertical'];
$b = $drop['blur'];
$s = $drop['spread'];
$color = $drop['color'];
if ( '' !== $css ) {
$css .= ',';
}
$css .= $h . 'px ' . $v . 'px ' . $b . 'px ' . $s . 'px ' . $color;
}
}
if ( '' !== $css ) {
$css = 'box-shadow:' . $css . ';-webkit-box-shadow:' . $css . ';-moz-box-shadow:' . $css . ';-o-box-shadow:' . $css . ';';
}
return $css;
}
/**
* Do enqueue for each field instance.
*
* @return void
*/
public function always_enqueue() {
if ( isset( $this->field['color_alpha'] ) && ( $this->field['color_alpha'] || ( $this->field['color_alpha']['inset-shadow'] || $this->field['color_alpha']['drop-shadow'] ) ) ) {
wp_enqueue_script( 'redux-wp-color-picker-alpha' );
}
}
/**
* 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();
if ( ! wp_style_is( 'wp-color-picker' ) ) {
wp_enqueue_style( 'wp-color-picker' );
}
$dep_array = array( 'jquery', 'wp-color-picker', 'redux-js' );
wp_enqueue_script(
'redux-field-box-shadow',
Redux_Core::$url . 'inc/fields/box_shadow/redux-box-shadow' . $min . '.js',
$dep_array,
$this->timestamp,
true
);
wp_enqueue_style(
'redux-nouislider',
Redux_Core::$url . 'assets/css/vendor/nouislider' . $min . '.css',
array(),
'5.0.0'
);
wp_enqueue_script(
'redux-nouislider',
Redux_Core::$url . 'assets/js/vendor/nouislider/redux.jquery.nouislider' . $min . '.js',
array( 'jquery' ),
'5.0.0',
true
);
if ( $this->parent->args['dev_mode'] ) {
wp_enqueue_style(
'redux-field-box-shadow',
Redux_Core::$url . 'inc/fields/box_shadow/redux-box-shadow.css',
array(),
time()
);
wp_enqueue_style( 'redux-color-picker' );
}
}
}
}

View File

@@ -0,0 +1,8 @@
<?php
/**
* Silence is golden.
*
* @package Redux
*/
echo null;

View File

@@ -0,0 +1,27 @@
.redux-main .redux-container-box_shadow .box-shadow-inset { margin: 0 auto; }
.redux-main .redux-container-box_shadow .box-shadow-inset #shadow-result { padding: 20px; margin-bottom: 20px; margin-top: 20px; min-height: 180px; border: 0 solid #ddd; background: #f1f1f1; -webkit-transition: all 0.2s ease; transition: all 0.2s ease; }
.redux-main .redux-container-box_shadow .box-shadow-inset .row-content:after, .redux-main .redux-container-box_shadow .box-shadow-inset .row:after { clear: both; content: " "; display: block; height: 0; visibility: hidden; }
.redux-main .redux-container-box_shadow .box-shadow-inset .row .col-2 { width: 50%; float: left; -webkit-box-sizing: border-box; box-sizing: border-box; }
.redux-main .redux-container-box_shadow .box-shadow-inset .row .col-2.disabled label strong { color: #cccccc; }
.redux-main .redux-container-box_shadow .box-shadow-inset .row .col-2 label { color: #999999; }
.redux-main .redux-container-box_shadow .box-shadow-inset .row .col-2 .wp-picker-container.disabled { pointer-events: none; opacity: 0.4; z-index: 200; background: 0; padding: 0 !important; }
.redux-main .redux-container-box_shadow .box-shadow-inset .row .col-2 .wp-picker-container.disabled button { background-color: #888; }
.redux-main .redux-container-box_shadow .box-shadow-inset .row .col-2 .wp-picker-container.disabled a { z-index: -1; }
.redux-main .redux-container-box_shadow .box-shadow-inset .row .col-2 ul li { padding-bottom: 10px; }
.redux-main .redux-container-box_shadow .box-shadow-inset .row .col-2:first-child { padding-right: 20px; }
.redux-main .redux-container-box_shadow .box-shadow-inset .row .col-2:last-child { padding-left: 20px; }
/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdXgtYm94LXNoYWRvdy5jc3MiLCJzb3VyY2VzIjpbInJlZHV4LWJveC1zaGFkb3cuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxBQUVRLFdBRkcsQ0FDUCwyQkFBMkIsQ0FDdkIsaUJBQWlCLENBQUMsRUFDZCxNQUFNLEVBQUUsTUFBTSxHQXdFakI7O0FBM0VULEFBS1ksV0FMRCxDQUNQLDJCQUEyQixDQUN2QixpQkFBaUIsQ0FHYixjQUFjLENBQUMsRUFDWCxPQUFPLEVBQUUsSUFBSSxFQUNiLGFBQWEsRUFBRSxJQUFJLEVBQ25CLFVBQVUsRUFBRSxJQUFJLEVBQ2hCLFVBQVUsRUFBRSxLQUFLLEVBQ2pCLE1BQU0sRUFBRSxZQUFZLEVBQ3BCLFVBQVUsRUFBRSxPQUFPLEVBQ25CLFVBQVUsRUFBRSxhQUFhLEdBRTVCOztBQWRiLEFBZ0JZLFdBaEJELENBQ1AsMkJBQTJCLENBQ3ZCLGlCQUFpQixDQWNiLFlBQVksQUFBQSxNQUFNLEVBaEI5QixXQUFXLENBQ1AsMkJBQTJCLENBQ3ZCLGlCQUFpQixDQWViLElBQUksQUFBQSxNQUFNLENBQUMsRUFDUCxLQUFLLEVBQUUsSUFBSSxFQUNYLE9BQU8sRUFBRSxHQUFHLEVBQ1osT0FBTyxFQUFFLEtBQUssRUFDZCxNQUFNLEVBQUUsQ0FBQyxFQUNULFVBQVUsRUFBRSxNQUFNLEdBQ3JCOztBQXZCYixBQTBCZ0IsV0ExQkwsQ0FDUCwyQkFBMkIsQ0FDdkIsaUJBQWlCLENBdUJiLElBQUksQ0FDQSxNQUFNLENBQUMsRUFDSCxLQUFLLEVBQUUsR0FBRyxFQUNWLEtBQUssRUFBRSxJQUFJLEVBQ1gsVUFBVSxFQUFFLFVBQVUsR0E0Q3pCOztBQXpFakIsQUFpQzRCLFdBakNqQixDQUNQLDJCQUEyQixDQUN2QixpQkFBaUIsQ0F1QmIsSUFBSSxDQUNBLE1BQU0sQUFLRCxTQUFTLENBQ04sS0FBSyxDQUNELE1BQU0sQ0FBQyxFQUNILEtBQUssRUFBRSxPQUFPLEdBQ2pCOztBQW5DN0IsQUF1Q29CLFdBdkNULENBQ1AsMkJBQTJCLENBQ3ZCLGlCQUFpQixDQXVCYixJQUFJLENBQ0EsTUFBTSxDQWFGLEtBQUssQ0FBQyxFQUNGLEtBQUssRUFBRSxPQUFPLEdBQ2pCOztBQXpDckIsQUE0Q3dCLFdBNUNiLENBQ1AsMkJBQTJCLENBQ3ZCLGlCQUFpQixDQXVCYixJQUFJLENBQ0EsTUFBTSxDQWlCRixvQkFBb0IsQUFDZixTQUFTLENBQUMsRUFDUCxjQUFjLEVBQUMsSUFBSSxFQU1uQixPQUFPLEVBQUUsR0FBRyxFQUNaLE9BQU8sRUFBRSxHQUFHLEVBQ1osVUFBVSxFQUFFLENBQUMsRUFDYixPQUFPLEVBQUUsQ0FBQyxDQUFBLFVBQVUsR0FLdkI7O0FBM0R6QixBQStDNEIsV0EvQ2pCLENBQ1AsMkJBQTJCLENBQ3ZCLGlCQUFpQixDQXVCYixJQUFJLENBQ0EsTUFBTSxDQWlCRixvQkFBb0IsQUFDZixTQUFTLENBR04sTUFBTSxDQUFDLEVBQ0gsZ0JBQWdCLEVBQUUsSUFBSSxHQUN6Qjs7QUFqRDdCLEFBd0Q0QixXQXhEakIsQ0FDUCwyQkFBMkIsQ0FDdkIsaUJBQWlCLENBdUJiLElBQUksQ0FDQSxNQUFNLENBaUJGLG9CQUFvQixBQUNmLFNBQVMsQ0FZTixDQUFDLENBQUMsRUFDRSxPQUFPLEVBQUUsRUFBRSxHQUNkOztBQTFEN0IsQUE4RG9CLFdBOURULENBQ1AsMkJBQTJCLENBQ3ZCLGlCQUFpQixDQXVCYixJQUFJLENBQ0EsTUFBTSxDQW9DRixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQ0YsY0FBYyxFQUFFLElBQUksR0FDdkI7O0FBaEVyQixBQWtFb0IsV0FsRVQsQ0FDUCwyQkFBMkIsQ0FDdkIsaUJBQWlCLENBdUJiLElBQUksQ0FDQSxNQUFNLEFBd0NELFlBQVksQ0FBQyxFQUNWLGFBQWEsRUFBRSxJQUFJLEdBQ3RCOztBQXBFckIsQUFzRW9CLFdBdEVULENBQ1AsMkJBQTJCLENBQ3ZCLGlCQUFpQixDQXVCYixJQUFJLENBQ0EsTUFBTSxBQTRDRCxXQUFXLENBQUMsRUFDVCxZQUFZLEVBQUUsSUFBSSxHQUNyQiJ9 */
/*# sourceMappingURL=redux-box-shadow.css.map */

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,206 @@
/**
* Field Box Shadow (box_shadow)
*
* Author: Kevin Provance (kprovance)
*/
/* global jQuery, document, redux, redux_change */
(function ( $ ) {
'use strict';
redux.field_objects = redux.field_objects || {};
redux.field_objects.box_shadow = redux.field_objects.box_shadow || {};
redux.field_objects.box_shadow.init = function ( selector ) {
if ( ! selector ) {
selector = $( document ).find( '.redux-group-tab:visible' ).find( '.redux-container-box_shadow: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;
}
redux.field_objects.box_shadow.colorPicker( el );
redux.field_objects.box_shadow.sliderInit( el );
el.find( '.checkbox' ).on(
'click',
function () {
var val = 0;
var col = $( this ).parents( '.col-2' );
var slider = col.find( '.redux-box-shadow-slider' );
var color = col.find( '.wp-picker-container' );
var label = $( this ).parent( 'label' );
if ( $( this ).is( ':checked' ) ) {
val = $( this ).parent().find( '.checkbox-check' ).attr( 'data-val' );
color.removeClass( 'disabled' );
slider.attr( 'disabled', false );
label.removeClass( 'pro-disabled' );
} else {
color.addClass( 'disabled' );
slider.attr( 'disabled', true );
label.addClass( 'pro-disabled' );
}
$( this ).parent().find( '.checkbox-check' ).val( val );
redux.field_objects.box_shadow.changeValue( $( this ), true );
}
);
}
);
};
redux.field_objects.box_shadow.colorPicker = function ( el ) {
var colorPicker = el.find( '.redux-color-init' ).wpColorPicker(
{
change: function ( e, ui ) {
$( this ).val( ui.color.toString() );
redux.field_objects.box_shadow.changeValue( $( this ), true );
},
clear: function ( e, ui ) {
$( this ).val( ui.color.toString() );
redux.field_objects.box_shadow.changeValue( $( this ).parent().find( '.redux-color-init' ), true );
}
}
);
var id = el.data( 'id' );
colorPicker.each(
function () {
var column = $( this ).parents( '.col-2' );
var shadow = column.data( 'shadow' );
var label = column.find( 'label[for="' + id + '-' + shadow + '-shadow"]' );
var container = column.find( '.wp-picker-container' );
if ( label.hasClass( 'pro-disabled' ) ) {
container.addClass( 'disabled' );
}
}
);
};
redux.field_objects.box_shadow.sliderInit = function ( el ) {
el.find( '.redux-box-shadow-slider' ).each(
function () {
var mainID = $( this ).data( 'id' );
var minVal = $( this ).data( 'min' );
var maxVal = $( this ).data( 'max' );
var step = $( this ).data( 'step' );
var def = $( this ).data( 'default' );
var label = $( this ).data( 'label' );
var rtl = Boolean( $( this ).data( 'rtl' ) );
var range = [minVal, maxVal];
var slider = $( this ).reduxNoUiSlider(
{
range: range,
start: def,
handles: 1,
step: step,
connect: 'lower',
behaviour: 'tap-drag',
rtl: rtl,
serialization: {
resolution: step
},
slide: function () {
var val = slider.val();
$( this ).next( '#redux-slider-value-' + mainID ).attr( 'value', val );
$( this ).prev( 'label' ).html(
label + ': <strong>' + val + 'px</strong>'
);
redux.field_objects.box_shadow.changeValue( $( this ), true );
}
}
);
}
);
};
redux.field_objects.box_shadow.changeValue = function ( el, update ) {
var parent = el.parents( '.redux-container-box_shadow' );
var container = parent.find( '.box-shadow-controls' );
var inset = container.find( '.shadow-inset' );
var drop = container.find( '.shadow-drop' );
var mainID = parent.data( 'id' );
var preview = parent.find( '#shadow-result' );
var css = '';
var insetColor;
var insetH;
var insetV;
var insetB;
var insetS;
var dropColor;
var dropH;
var dropV;
var dropB;
var dropS;
if ( inset.length > 0 ) {
if ( inset.find( '.checkbox' ).is( ':checked' ) ) {
insetColor = parent.find( '#' + mainID + '-inset-color' ).val();
insetH = parent.find( '#redux-slider-value-' + mainID + '-inset-horizontal' ).val();
insetV = parent.find( '#redux-slider-value-' + mainID + '-inset-vertical' ).val();
insetB = parent.find( '#redux-slider-value-' + mainID + '-inset-blur' ).val();
insetS = parent.find( '#redux-slider-value-' + mainID + '-inset-spread' ).val();
css = 'inset ' + insetH + 'px ' + insetV + 'px ' + insetB + 'px ' + insetS + 'px ' + insetColor;
}
}
if ( drop.length > 0 ) {
if ( drop.find( '.checkbox' ).is( ':checked' ) ) {
dropColor = parent.find( '#' + mainID + '-drop-color' ).val();
dropH = parent.find( '#redux-slider-value-' + mainID + '-drop-horizontal' ).val();
dropV = parent.find( '#redux-slider-value-' + mainID + '-drop-vertical' ).val();
dropB = parent.find( '#redux-slider-value-' + mainID + '-drop-blur' ).val();
dropS = parent.find( '#redux-slider-value-' + mainID + '-drop-spread' ).val();
if ( '' !== css ) {
css = css + ',';
}
css = css + dropH + 'px ' + dropV + 'px ' + dropB + 'px ' + dropS + 'px ' + dropColor;
}
}
preview.css(
{
'box-shadow': css,
'-webkit-box-shadow': css,
'-moz-box-shadow': css,
'-o-box-shadow': css
}
);
if ( update ) {
redux_change( el );
}
};
} )( jQuery );

View File

@@ -0,0 +1 @@
!function(l){"use strict";redux.field_objects=redux.field_objects||{},redux.field_objects.box_shadow=redux.field_objects.box_shadow||{},redux.field_objects.box_shadow.init=function(e){e=e||l(document).find(".redux-group-tab:visible").find(".redux-container-box_shadow:visible"),l(e).each(function(){var e=l(this),d=e;(d=e.hasClass("redux-field-container")?d:e.parents(".redux-field-container:first")).is(":hidden")||d.hasClass("redux-field-init")&&(d.removeClass("redux-field-init"),redux.field_objects.box_shadow.colorPicker(e),redux.field_objects.box_shadow.sliderInit(e),e.find(".checkbox").on("click",function(){var e=0,d=l(this).parents(".col-2"),i=d.find(".redux-box-shadow-slider"),d=d.find(".wp-picker-container"),a=l(this).parent("label");l(this).is(":checked")?(e=l(this).parent().find(".checkbox-check").attr("data-val"),d.removeClass("disabled"),i.attr("disabled",!1),a.removeClass("pro-disabled")):(d.addClass("disabled"),i.attr("disabled",!0),a.addClass("pro-disabled")),l(this).parent().find(".checkbox-check").val(e),redux.field_objects.box_shadow.changeValue(l(this),!0)}))})},redux.field_objects.box_shadow.colorPicker=function(e){var d=e.find(".redux-color-init").wpColorPicker({change:function(e,d){l(this).val(d.color.toString()),redux.field_objects.box_shadow.changeValue(l(this),!0)},clear:function(e,d){l(this).val(d.color.toString()),redux.field_objects.box_shadow.changeValue(l(this).parent().find(".redux-color-init"),!0)}}),i=e.data("id");d.each(function(){var e=l(this).parents(".col-2"),d=e.data("shadow"),d=e.find('label[for="'+i+"-"+d+'-shadow"]'),e=e.find(".wp-picker-container");d.hasClass("pro-disabled")&&e.addClass("disabled")})},redux.field_objects.box_shadow.sliderInit=function(e){e.find(".redux-box-shadow-slider").each(function(){var d=l(this).data("id"),e=l(this).data("min"),i=l(this).data("max"),a=l(this).data("step"),o=l(this).data("default"),s=l(this).data("label"),r=Boolean(l(this).data("rtl")),e=[e,i],t=l(this).reduxNoUiSlider({range:e,start:o,handles:1,step:a,connect:"lower",behaviour:"tap-drag",rtl:r,serialization:{resolution:a},slide:function(){var e=t.val();l(this).next("#redux-slider-value-"+d).attr("value",e),l(this).prev("label").html(s+": <strong>"+e+"px</strong>"),redux.field_objects.box_shadow.changeValue(l(this),!0)}})})},redux.field_objects.box_shadow.changeValue=function(e,d){var i=e.parents(".redux-container-box_shadow"),a=i.find(".box-shadow-controls"),o=a.find(".shadow-inset"),a=a.find(".shadow-drop"),s=i.data("id"),r=i.find("#shadow-result"),t="";0<o.length&&o.find(".checkbox").is(":checked")&&(o=i.find("#"+s+"-inset-color").val(),t="inset "+i.find("#redux-slider-value-"+s+"-inset-horizontal").val()+"px "+i.find("#redux-slider-value-"+s+"-inset-vertical").val()+"px "+i.find("#redux-slider-value-"+s+"-inset-blur").val()+"px "+i.find("#redux-slider-value-"+s+"-inset-spread").val()+"px "+o),0<a.length&&a.find(".checkbox").is(":checked")&&(o=i.find("#"+s+"-drop-color").val(),""!==t&&(t+=","),t=t+i.find("#redux-slider-value-"+s+"-drop-horizontal").val()+"px "+i.find("#redux-slider-value-"+s+"-drop-vertical").val()+"px "+i.find("#redux-slider-value-"+s+"-drop-blur").val()+"px "+i.find("#redux-slider-value-"+s+"-drop-spread").val()+"px "+o),r.css({"box-shadow":t,"-webkit-box-shadow":t,"-moz-box-shadow":t,"-o-box-shadow":t}),d&&redux_change(e)}}(jQuery);

View File

@@ -0,0 +1,78 @@
.redux-main {
.redux-container-box_shadow {
.box-shadow-inset {
margin: 0 auto;
#shadow-result {
padding: 20px;
margin-bottom: 20px;
margin-top: 20px;
min-height: 180px;
border: 0 solid #ddd;
background: #f1f1f1;
transition: all 0.2s ease;
}
.row-content:after,
.row:after {
clear: both;
content: " ";
display: block;
height: 0;
visibility: hidden;
}
.row {
.col-2 {
width: 50%;
float: left;
box-sizing: border-box;
&.disabled {
label {
strong {
color: #cccccc;
}
}
}
label {
color: #999999;
}
.wp-picker-container {
&.disabled {
pointer-events:none;
button {
background-color: #888;
}
opacity: 0.4;
z-index: 200;
background: 0;
padding: 0!important;
a {
z-index: -1;
}
}
}
ul li {
padding-bottom: 10px;
}
&:first-child {
padding-right: 20px;
}
&:last-child {
padding-left: 20px;
}
}
}
}
}
}