Advertisement
arie_cristianD

schema style bug

Oct 3rd, 2023
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 53.04 KB | None | 0 0
  1. <?php
  2. /**
  3.  * This customizer plugin branch of Kirki Customizer Plugin.
  4.  * https://github.com/aristath/kirki
  5.  *
  6.  * @author Jegstudio
  7.  * @since 1.0.0
  8.  * @package jeg-framework
  9.  */
  10.  
  11. namespace Jeg\Customizer;
  12.  
  13. use Jeg\Customizer\Partial\Lazy_Partial;
  14. use Jeg\Customizer\Setting\Default_Setting;
  15. use Jeg\Util\Font;
  16. use Jeg\Util\Sanitize;
  17. use Jeg\Util\Style_Generator;
  18.  
  19. /**
  20.  * Class Customizer
  21.  *
  22.  * @package Jeg
  23.  */
  24. class Customizer {
  25.  
  26.     /**
  27.      * Customizer
  28.      *
  29.      * @var Customizer Customizer Instance
  30.      */
  31.     private static $instance;
  32.  
  33.     /**
  34.      * An array containing all panels.
  35.      *
  36.      * @access private
  37.      * @var array
  38.      */
  39.     private $panels = array();
  40.  
  41.     /**
  42.      * An array containing all sections.
  43.      *
  44.      * @access private
  45.      * @var array
  46.      */
  47.     private $sections = array();
  48.  
  49.     /**
  50.      * An array containing all fields.
  51.      *
  52.      * @access private
  53.      * @var array
  54.      */
  55.     private $fields = array();
  56.  
  57.     /**
  58.      * Cached Array for faster access
  59.      *
  60.      * @var array
  61.      */
  62.     private $cache_fields = array();
  63.  
  64.     /**
  65.      * An array containing partial refresh
  66.      *
  67.      * @access private
  68.      * @var array
  69.      */
  70.     private $partial_refresh = array();
  71.  
  72.     /**
  73.      * Version of Customizer
  74.      *
  75.      * @var string
  76.      */
  77.     private $version;
  78.  
  79.     /**
  80.      * Endpoint used for ajax request
  81.      *
  82.      * @var string
  83.      */
  84.     public $endpoint = 'customizer';
  85.  
  86.     /**
  87.      * Get Instance of Customizer
  88.      *
  89.      * @return Customizer
  90.      */
  91.     public static function get_instance() {
  92.         if ( null === static::$instance ) {
  93.             static::$instance = new static();
  94.         }
  95.  
  96.         return static::$instance;
  97.     }
  98.  
  99.     /**
  100.      * Init constructor.
  101.      */
  102.     private function __construct() {
  103.         $this->set_version();
  104.  
  105.         add_action( 'customize_register', array( $this, 'register_control_types' ) );
  106.         add_action( 'customize_register', array( $this, 'register_section_types' ) );
  107.         add_action( 'customize_register', array( $this, 'register_panel_types' ) );
  108.         add_action( 'customize_register', array( $this, 'deploy_panels' ), 97 );
  109.         add_action( 'customize_register', array( $this, 'deploy_sections' ), 98 );
  110.         add_action( 'customize_register', array( $this, 'deploy_fields' ), 96 );
  111.         add_action( 'customize_register', array( $this, 'register_customizer' ) );
  112.         add_action( 'customize_preview_init', array( $this, 'preview_init' ), 99 );
  113.         add_action( 'customize_controls_print_styles', array( $this, 'customizer_styles' ), 99 );
  114.         add_action( 'customize_controls_enqueue_scripts', array( $this, 'register_scripts' ) );
  115.         add_action( 'customize_controls_enqueue_scripts', array( $this, 'enqueue_control_script' ), 11 );
  116.         add_action( 'upload_mimes', array( $this, 'allow_mime' ) );
  117.  
  118.         // Partial Refresh.
  119.         add_filter( 'customize_partial_render', array( $this, 'partial_render' ), null, 3 );
  120.         add_filter( 'customize_dynamic_partial_args', array( $this, 'filter_dynamic_partial_args' ), 10, 2 );
  121.         add_filter( 'customize_dynamic_partial_class', array( $this, 'filter_dynamic_partial_class' ), 10, 2 );
  122.  
  123.         // Handle dynamic setting save.
  124.         add_filter( 'customize_dynamic_setting_args', array( $this, 'filter_dynamic_setting_args' ), 10, 2 );
  125.         add_filter( 'customize_dynamic_setting_class', array( $this, 'filter_dynamic_setting_class' ), 10, 2 );
  126.         add_filter( 'query_vars', array( $this, 'ajax_query_vars' ) );
  127.         add_action( 'parse_request', array( $this, 'ajax_parse_request' ) );
  128.  
  129.         // Javascript Template.
  130.         add_action( 'customize_controls_print_footer_scripts', array( $this, 'search_template' ) );
  131.         add_action( 'customize_controls_print_footer_scripts', array( $this, 'widget_template' ) );
  132.     }
  133.  
  134.     /**
  135.      * Register query var for lazy section ajax request
  136.      *
  137.      * @param array $vars Query var endpoint.
  138.      *
  139.      * @return array
  140.      */
  141.     public function ajax_query_vars( $vars ) {
  142.         $vars[] = $this->endpoint;
  143.         $vars[] = 'sections';
  144.         $vars[] = 'search';
  145.         $vars[] = 'nonce';
  146.  
  147.         return $vars;
  148.     }
  149.  
  150.     /**
  151.      * Handle ajax request for retrieving lazy section
  152.      *
  153.      * @param \WP $wp Handle request.
  154.      */
  155.     public function ajax_parse_request( $wp ) {
  156.         if ( array_key_exists( $this->endpoint, $wp->query_vars ) ) {
  157.             add_filter( 'wp_doing_ajax', '__return_true' );
  158.  
  159.             if ( isset( $wp->query_vars['nonce'] ) && wp_verify_nonce( $wp->query_vars['nonce'], $this->endpoint ) ) {
  160.                 if ( isset( $wp->query_vars['sections'] ) ) {
  161.                     $section = $wp->query_vars['sections'];
  162.                     $this->get_lazy_section_control( $section );
  163.                 }
  164.  
  165.                 if ( isset( $wp->query_vars['search'] ) ) {
  166.                     $search = $wp->query_vars['search'];
  167.                     $this->get_search_result( $search );
  168.                 }
  169.             }
  170.  
  171.             die();
  172.         }
  173.     }
  174.  
  175.     /**
  176.      * Check total search match
  177.      *
  178.      * @param string $keywords Search keyword.
  179.      * @param string $description Search description.
  180.      *
  181.      * @return int
  182.      */
  183.     public function match_search( $keywords, $description ) {
  184.         preg_match_all( '/\w+/i', $keywords, $words );
  185.         $total = 0;
  186.  
  187.         foreach ( $words[0] as $search ) {
  188.             $found = preg_match_all( "/($search)/i", $description );
  189.  
  190.             if ( 0 === $found ) {
  191.                 return 0;
  192.             } else {
  193.                 $total += $found;
  194.             }
  195.         }
  196.  
  197.         return $total;
  198.     }
  199.  
  200.     /**
  201.      * Return search result
  202.      *
  203.      * @param string $search Search keyword.
  204.      */
  205.     public function get_search_result( $search ) {
  206.         $fields  = $this->get_all_fields();
  207.         $results = array();
  208.  
  209.         foreach ( $fields as $key => $field ) {
  210.             $field['title']       = isset( $field['title'] ) ? $field['title'] : '';
  211.             $field['description'] = isset( $field['description'] ) ? $field['description'] : '';
  212.             $match                = $this->match_search( $search, implode( ' ', array(
  213.                 $field['title'],
  214.                 $field['description'],
  215.             ) ) );
  216.  
  217.             if ( $match > 0 ) {
  218.                 $results[ $key ] = array(
  219.                     'id'          => $field['id'],
  220.                     'label'       => $field['label'],
  221.                     'description' => $field['description'],
  222.                     'section'     => $field['section'],
  223.                     'match'       => $match,
  224.                 );
  225.             }
  226.         }
  227.  
  228.         wp_send_json_success( $results );
  229.     }
  230.  
  231.     /**
  232.      * Get file location for lazy section
  233.      *
  234.      * @param string $id ID of lazy section to be searched.
  235.      *
  236.      * @return mixed
  237.      */
  238.     public function get_lazy_section_files( $id ) {
  239.         $sections = $this->get_registered_lazy_section();
  240.  
  241.         if ( isset( $sections[ $id ] ) ) {
  242.             return $sections[ $id ];
  243.         }
  244.  
  245.         return array();
  246.     }
  247.  
  248.     /**
  249.      * Find lazy setting
  250.      *
  251.      * @param array $options Array of lazy option.
  252.      * @param string $name Name of setting to be searched for.
  253.      *
  254.      * @return mixed
  255.      */
  256.     public function filter_lazy_setting( $options, $name ) {
  257.         foreach ( $options as $key => $option ) {
  258.             if ( $option['id'] === $name ) {
  259.                 return $option;
  260.             }
  261.         }
  262.  
  263.         return null;
  264.     }
  265.  
  266.     /**
  267.      * Find partial setting
  268.      *
  269.      * @param array $options Array of partial setting option.
  270.      * @param string $name Name of setting to be searched for.
  271.      *
  272.      * @return mixed
  273.      */
  274.     public function filter_lazy_partial_setting( $options, $name ) {
  275.         foreach ( $options as $key => $option ) {
  276.             if ( isset( $option['partial_refresh'] ) ) {
  277.                 $partials = $option['partial_refresh'];
  278.                 if ( array_key_exists( $name, $partials ) ) {
  279.                     return [
  280.                         'setting' => $option['id'],
  281.                         'partial' => $partials[ $name ],
  282.                     ];
  283.                 }
  284.             }
  285.         }
  286.  
  287.         return null;
  288.     }
  289.  
  290.     /**
  291.      * Get WP Customize Instance. if its empty then we need to create one
  292.      *
  293.      * @return \WP_Customize_Manager
  294.      */
  295.     public function wp_customize() {
  296.         global $wp_customize;
  297.  
  298.         if ( empty( $wp_customize ) || ! ( $wp_customize instanceof \WP_Customize_Manager ) ) {
  299.             require_once ABSPATH . WPINC . '/class-wp-customize-manager.php';
  300.             $wp_customize = new \WP_Customize_Manager();
  301.         }
  302.  
  303.         return $wp_customize;
  304.     }
  305.  
  306.     /**
  307.      * Find setting class for option
  308.      *
  309.      * @param string $class Class name for setting.
  310.      * @param \WP_Customize_Setting|string $id Customize Setting object, or ID.
  311.      *
  312.      * @return string
  313.      */
  314.     public function filter_dynamic_setting_class( $class, $id ) {
  315.         if ( preg_match( Default_Setting::$lazy_pattern, $id, $matches ) ) {
  316.             $option = $this->get_lazy_field( $matches['section'], $matches['id'], array(
  317.                 $this,
  318.                 'filter_lazy_setting',
  319.             ) );
  320.             $class  = $this->get_setting_class( $option['type'] );
  321.         }
  322.  
  323.         return $class;
  324.     }
  325.  
  326.     /**
  327.      * Find setting arguemnt for option
  328.      *
  329.      * @param array $setting_args Array of properties for the new WP_Customize_Setting. Default empty array.
  330.      * @param \WP_Customize_Setting|string $setting_id Customize Setting object, or ID.
  331.      *
  332.      * @return mixed
  333.      */
  334.     public function filter_dynamic_setting_args( $setting_args, $setting_id ) {
  335.         if ( preg_match( Default_Setting::$lazy_pattern, $setting_id, $matches ) ) {
  336.             $option       = $this->get_lazy_field( $matches['section'], $matches['id'], array(
  337.                 $this,
  338.                 'filter_lazy_setting',
  339.             ) );
  340.             $field        = $this->filter_field( $option, true );
  341.             $setting_args = $field['setting'];
  342.         }
  343.  
  344.         return $setting_args;
  345.     }
  346.  
  347.     /**
  348.      * Partial render
  349.      *
  350.      * @param string|array|false $rendered The partial value. Default false.
  351.      * @param \WP_Customize_Partial $partial WP_Customize_Setting instance.
  352.      * @param array $container_context Optional array of context data associated with
  353.      *                                                 the target container.
  354.      *
  355.      * @return mixed|string
  356.      */
  357.     public function partial_render( $rendered, \WP_Customize_Partial $partial, $container_context ) {
  358.         if ( preg_match( Lazy_Partial::$pattern, $partial->id, $matches ) ) {
  359.             $option = $this->get_lazy_field( $matches['section'], $matches['id'], array(
  360.                 $this,
  361.                 'filter_lazy_partial_setting',
  362.             ) );
  363.  
  364.             if ( $option ) {
  365.                 ob_start();
  366.                 $return_render = call_user_func( $option['partial']['render_callback'], $this, $container_context );
  367.                 $ob_render     = ob_get_clean();
  368.  
  369.                 if ( null !== $return_render && '' !== $ob_render ) {
  370.                     _doing_it_wrong( __FUNCTION__, esc_html__( 'Partial render must echo the content or return the content string (or array), but not both.', 'jeg' ), '4.5.0' );
  371.                 }
  372.  
  373.                 $rendered = null !== $return_render ? $return_render : $ob_render;
  374.             }
  375.         }
  376.  
  377.         return $rendered;
  378.     }
  379.  
  380.     /**
  381.      * Filters a dynamic partial's constructor arguments.
  382.      *
  383.      * @param false|array $args The arguments to the WP_Customize_Partial constructor.
  384.      * @param string $id ID for dynamic partial.
  385.      *
  386.      * @return array
  387.      */
  388.     public function filter_dynamic_partial_args( $args, $id ) {
  389.         if ( preg_match( Lazy_Partial::$pattern, $id, $matches ) ) {
  390.             $option = $this->get_lazy_field( $matches['section'], $matches['id'], array(
  391.                 $this,
  392.                 'filter_lazy_partial_setting',
  393.             ) );
  394.             $args   = array(
  395.                 'selector'            => $option['partial']['selector'],
  396.                 'settings'            => array( Default_Setting::create_lazy_setting( $matches['section'], $option['setting'] ) ),
  397.                 'container_inclusive' => false,
  398.                 'fallback_refresh'    => false,
  399.             );
  400.         }
  401.  
  402.         return $args;
  403.     }
  404.  
  405.     /**
  406.      * Filters the class used to construct partials.
  407.      *
  408.      * Allow non-statically created partials to be constructed with custom WP_Customize_Partial subclass.
  409.      *
  410.      * @param string $class WP_Customize_Partial or a subclass.
  411.      * @param string $id ID for dynamic partial.
  412.      *
  413.      * @return string
  414.      */
  415.     public function filter_dynamic_partial_class( $class, $id ) {
  416.         if ( preg_match( Lazy_Partial::$pattern, $id, $matches ) ) {
  417.             $class = 'Jeg\Customizer\Partial\Lazy_Partial';
  418.         }
  419.  
  420.         return $class;
  421.     }
  422.  
  423.     /**
  424.      * Get all option
  425.      *
  426.      * @param array|callable $file Callback or path to option.
  427.      *
  428.      * @return array|mixed
  429.      */
  430.     public function get_lazy_options( $file ) {
  431.         $options = array();
  432.  
  433.         if ( is_array( $file ) ) {
  434.             $options = call_user_func_array( $file['function'], $file['parameter'] );
  435.         } elseif ( file_exists( $file ) ) {
  436.             $options = include $file;
  437.         }
  438.  
  439.         $options = apply_filters( 'jeg_customizer_get_lazy_options', $options );
  440.  
  441.         return $options;
  442.     }
  443.  
  444.     /**
  445.      * Get filtered lazy field
  446.      *
  447.      * @param string $section Section of lazy field.
  448.      * @param string $name name of setting or option.
  449.      * @param callable $callback filtered callback.
  450.      *
  451.      * @return mixed
  452.      */
  453.     public function get_lazy_field( $section, $name, $callback ) {
  454.         $section = $this->get_lazy_section_files( $section );
  455.  
  456.         if ( ! empty( $section ) ) {
  457.             foreach ( $section as $file ) {
  458.                 $options = $this->get_lazy_options( $file );
  459.  
  460.                 return call_user_func_array( $callback, array( $options, $name ) );
  461.             }
  462.         }
  463.  
  464.         return null;
  465.     }
  466.  
  467.     /**
  468.      * Preparing lazy fields
  469.      *
  470.      * @param array $section Array of section.
  471.      * @param string $section_id Name of section.
  472.      *
  473.      * @return array
  474.      */
  475.     public function compose_lazy_fields( $section, $section_id ) {
  476.         $this->wp_customize();
  477.         $results = array();
  478.  
  479.         foreach ( $section as $file ) {
  480.             $options = $this->get_lazy_options( $file );
  481.  
  482.             foreach ( $options as $option ) {
  483.                 $results[ $option['id'] ] = $this->compose_lazy_option( $option, $section_id );
  484.             }
  485.         }
  486.  
  487.         return $results;
  488.     }
  489.  
  490.     /**
  491.      * Prepare lazy option to fit with customizer setting
  492.      *
  493.      * @param array $option Raw option.
  494.      * @param string $section_id Name of section.
  495.      *
  496.      * @return array
  497.      */
  498.     public function compose_lazy_option( $option, $section_id ) {
  499.         $result = array();
  500.  
  501.         // force assign section & dynamic control.
  502.         $option['section'] = $section_id;
  503.         $option['dynamic'] = true;
  504.         $field             = $this->filter_field( $option, true );
  505.  
  506.         // Assign Setting ID.
  507.         $setting_id          = Default_Setting::create_lazy_setting( $section_id, $option['id'] );
  508.         $result['settingId'] = $setting_id;
  509.  
  510.         // assign setting json.
  511.         $setting           = $field['setting'];
  512.         $setting_instance  = $this->do_add_setting( $setting, $setting_id );
  513.         $result['setting'] = $setting_instance->json();
  514.  
  515.         // assign control json.
  516.         $control           = $field['control'];
  517.         $control_instance  = $this->do_add_control( $control, $setting_instance );
  518.         $result['control'] = $control_instance->json();
  519.  
  520.         return $result;
  521.     }
  522.  
  523.     /**
  524.      * Get lazy section control control
  525.      *
  526.      * @param array $sections array of sections.
  527.      */
  528.     public function get_lazy_section_control( $sections ) {
  529.         $results = array();
  530.  
  531.         foreach ( $sections as $section_id ) {
  532.             $section = $this->get_lazy_section_files( $section_id );
  533.  
  534.             if ( ! empty( $section ) ) {
  535.                 $results[ $section_id ] = $this->compose_lazy_fields( $section, $section_id );
  536.             }
  537.         }
  538.  
  539.         wp_send_json_success( $results );
  540.     }
  541.  
  542.     /**
  543.      * Get all registered section and their respective file
  544.      *
  545.      * @return mixed
  546.      */
  547.     public function get_registered_lazy_section() {
  548.         $sections = apply_filters( 'jeg_register_lazy_section', array() );
  549.  
  550.         return $sections;
  551.     }
  552.  
  553.     /**
  554.      * Get theme version if using themes
  555.      */
  556.     public function set_version() {
  557.         $this->version = jeg_get_version();
  558.     }
  559.  
  560.     /**
  561.      * Create register customizer hook specifically for Jeg Framework
  562.      */
  563.     public function register_customizer() {
  564.         do_action( 'jeg_register_customizer_option', $this );
  565.     }
  566.  
  567.     /**
  568.      * Allow mime for font
  569.      *
  570.      * @param array $mimes List of allowed mime.
  571.      *
  572.      * @return array
  573.      */
  574.     public function allow_mime( $mimes ) {
  575.         return array_merge( $mimes, array(
  576.             'webm' => 'video/webm',
  577.             'ico'  => 'image/vnd.microsoft.icon',
  578.             'ttf'  => 'application/octet-stream',
  579.             'otf'  => 'application/octet-stream',
  580.             'woff' => 'application/x-font-woff',
  581.             'svg'  => 'image/svg+xml',
  582.             'eot'  => 'application/vnd.ms-fontobject',
  583.             'ogg'  => 'audio/ogg',
  584.             'ogv'  => 'video/ogg',
  585.         ) );
  586.     }
  587.  
  588.     /**
  589.      * Load All font for typography on customizer
  590.      *
  591.      * @return mixed
  592.      */
  593.     public function load_all_font() {
  594.         $standard_fonts = Font::get_standard_fonts();
  595.         $google_fonts   = Font::get_google_fonts();
  596.         $all_variants   = Font::get_all_variants();
  597.         $all_subsets    = Font::get_google_font_subsets();
  598.  
  599.         $standard_fonts_final = array();
  600.         foreach ( $standard_fonts as $key => $value ) {
  601.             $standard_fonts_final[] = array(
  602.                 'family'      => $value['stack'],
  603.                 'label'       => $value['label'],
  604.                 'subsets'     => array(),
  605.                 'is_standard' => true,
  606.                 'variants'    => array(
  607.                     array(
  608.                         'id'    => 'regular',
  609.                         'label' => $all_variants['regular'],
  610.                     ),
  611.                     array(
  612.                         'id'    => 'italic',
  613.                         'label' => $all_variants['italic'],
  614.                     ),
  615.                     array(
  616.                         'id'    => '700',
  617.                         'label' => $all_variants['700'],
  618.                     ),
  619.                     array(
  620.                         'id'    => '700italic',
  621.                         'label' => $all_variants['700italic'],
  622.                     ),
  623.                 ),
  624.                 'type'        => 'native',
  625.             );
  626.         }
  627.  
  628.         $google_fonts_final = array();
  629.         foreach ( $google_fonts as $family => $args ) {
  630.             $label    = ( isset( $args['label'] ) ) ? $args['label'] : $family;
  631.             $variants = ( isset( $args['variants'] ) ) ? $args['variants'] : array( 'regular', '700' );
  632.             $subsets  = ( isset( $args['subsets'] ) ) ? $args['subsets'] : array();
  633.  
  634.             $available_variants = array();
  635.             foreach ( $variants as $variant ) {
  636.                 if ( array_key_exists( $variant, $all_variants ) ) {
  637.                     $available_variants[] = array(
  638.                         'id'    => $variant,
  639.                         'label' => $all_variants[ $variant ],
  640.                     );
  641.                 }
  642.             }
  643.  
  644.             $available_subsets = array();
  645.             foreach ( $subsets as $subset ) {
  646.                 if ( array_key_exists( $subset, $all_subsets ) ) {
  647.                     $available_subsets[] = array(
  648.                         'id'    => $subset,
  649.                         'label' => $all_subsets[ $subset ],
  650.                     );
  651.                 }
  652.             }
  653.  
  654.             $google_fonts_final[] = array(
  655.                 'family'   => $family,
  656.                 'label'    => $label,
  657.                 'variants' => $available_variants,
  658.                 'subsets'  => $available_subsets,
  659.             );
  660.         }
  661.  
  662.         return apply_filters( 'jeg_font_typography', array_merge( $standard_fonts_final, $google_fonts_final ) );
  663.     }
  664.  
  665.     /**
  666.      * Load script for preview init
  667.      */
  668.     public function preview_init() {
  669.         add_action( 'wp_enqueue_scripts', array( $this, 'previewer_script' ) );
  670.     }
  671.  
  672.     /**
  673.      * Add panel functionality exposed to public
  674.      *
  675.      * @param array $panel Panel option.
  676.      */
  677.     public function add_panel( $panel ) {
  678.         $this->panels[ $panel['id'] ] = $panel;
  679.     }
  680.  
  681.     /**
  682.      * Section functionality exposed to public
  683.      *
  684.      * @param array $section Section option.
  685.      */
  686.     public function add_section( $section ) {
  687.         $section = apply_filters( 'jeg_customizer_add_section', $section );
  688.  
  689.         $this->sections[ $section['id'] ] = $section;
  690.     }
  691.  
  692.     /**
  693.      * Add field functionality exposed to public
  694.      *
  695.      * @param array $field Add option.
  696.      */
  697.     public function add_field( $field ) {
  698.         $field = apply_filters( 'jeg_customizer_add_field', $field );
  699.  
  700.         $this->fields[ $field['id'] ] = $field;
  701.  
  702.         if ( isset( $field['partial_refresh'] ) ) {
  703.             $this->partial_refresh[ $field['id'] ] = $field['partial_refresh'];
  704.         }
  705.     }
  706.  
  707.     /**
  708.      * Deploy registered panel
  709.      */
  710.     public function deploy_panels() {
  711.         $wp_customize          = $this->wp_customize();
  712.         $active_callback_class = Active_Callback::get_instance();
  713.  
  714.         foreach ( $this->panels as $panel ) {
  715.             $panel['type'] = isset( $panel['type'] ) ? $panel['type'] : 'default';
  716.  
  717.             switch ( $panel['type'] ) {
  718.                 case 'alert':
  719.                     $panel_class = 'Jeg\Customizer\Panel\Alert_Panel';
  720.                     break;
  721.                 default:
  722.                     $panel_class = 'WP_Customize_Panel';
  723.                     break;
  724.             }
  725.  
  726.             $wp_customize->add_panel( new $panel_class( $wp_customize, $panel['id'], array(
  727.                 'title'           => $panel['title'],
  728.                 'description'     => $panel['description'],
  729.                 'priority'        => $panel['priority'],
  730.                 'active_callback' => isset( $panel['active_callback'] ) ? function () use ( $panel, $active_callback_class ) {
  731.                     return $active_callback_class->evaluate( $panel['active_callback'] );
  732.                 } : '__return_true',
  733.             ) ) );
  734.         }
  735.     }
  736.  
  737.     /**
  738.      * Deploy registered section
  739.      */
  740.     public function deploy_sections() {
  741.         $wp_customize          = $this->wp_customize();
  742.         $active_callback_class = Active_Callback::get_instance();
  743.  
  744.         foreach ( $this->sections as $section ) {
  745.             $section['type'] = isset( $section['type'] ) ? $section['type'] : 'default';
  746.  
  747.             switch ( $section['type'] ) {
  748.                 case 'jeg-helper-section':
  749.                     $section_class = 'Jeg\Customizer\Section\Helper_Section';
  750.                     break;
  751.                 case 'jeg-lazy-section':
  752.                     $section_class = 'Jeg\Customizer\Section\Lazy_Section';
  753.                     break;
  754.                 case 'jeg-link-section':
  755.                     $section_class = 'Jeg\Customizer\Section\Link_Section';
  756.                     break;
  757.                 default:
  758.                     $section_class = 'Jeg\Customizer\Section\Default_Section';
  759.                     break;
  760.             }
  761.  
  762.             $wp_customize->add_section( new $section_class( $wp_customize, $section['id'], array(
  763.                 'title'           => $section['title'],
  764.                 'panel'           => isset( $section['panel'] ) ? $section['panel'] : '',
  765.                 'priority'        => $section['priority'],
  766.                 'dependency'      => isset( $section['dependency'] ) ? $section['dependency'] : [],
  767.                 'url'             => isset( $section['url'] ) ? $section['url'] : '',
  768.                 'label'           => isset( $section['label'] ) ? $section['label'] : '',
  769.                 'active_callback' => isset( $section['active_callback'] ) ? function () use ( $section, $active_callback_class ) {
  770.                     return $active_callback_class->evaluate( $section['active_callback'] );
  771.                 } : '__return_true',
  772.             ) ) );
  773.         }
  774.     }
  775.  
  776.     /**
  777.      * Deploy all registered field
  778.      */
  779.     public function deploy_fields() {
  780.         foreach ( $this->fields as $field ) {
  781.             $filtered_field = $this->filter_field( $field );
  782.             $this->do_add_setting( $filtered_field['setting'] );
  783.             $this->do_add_control( $filtered_field['control'] );
  784.         }
  785.  
  786.         $this->register_partial_refresh();
  787.     }
  788.  
  789.     /**
  790.      * Setup_partial_refresh
  791.      */
  792.     public function register_partial_refresh() {
  793.         $wp_customize = $this->wp_customize();
  794.  
  795.         if ( ! isset( $wp_customize->selective_refresh ) ) {
  796.             return;
  797.         }
  798.  
  799.         foreach ( $this->fields as $field_id => $args ) {
  800.             if ( isset( $args['partial_refresh'] ) && ! empty( $args['partial_refresh'] ) ) {
  801.                 // Start going through each item in the array of partial refreshes.
  802.                 foreach ( $args['partial_refresh'] as $partial_refresh => $partial_refresh_args ) {
  803.                     // If we have all we need, create the selective refresh call.
  804.                     if ( isset( $partial_refresh_args['render_callback'] ) && isset( $partial_refresh_args['selector'] ) ) {
  805.                         $wp_customize->selective_refresh->add_partial( $partial_refresh, array(
  806.                             'selector'            => $partial_refresh_args['selector'],
  807.                             'settings'            => array( $args['id'] ),
  808.                             'render_callback'     => $partial_refresh_args['render_callback'],
  809.                             'container_inclusive' => isset( $partial_refresh_args['container_inclusive'] ) ? $partial_refresh_args['container_inclusive'] : false,
  810.                             'fallback_refresh'    => false,
  811.                         ) );
  812.                     }
  813.                 }
  814.             }
  815.         }
  816.     }
  817.  
  818.     /**
  819.      * Prepare single setting
  820.      *
  821.      * @param array $field Unfiltered setting.
  822.      *
  823.      * @return array
  824.      */
  825.     public function compose_setting( $field ) {
  826.         $setting = array();
  827.  
  828.         $setting['id']           = $field['id'];
  829.         $setting['type']         = isset( $field['option_type'] ) ? $field['option_type'] : 'theme_mod';
  830.         $setting['default']      = isset( $field['default'] ) ? $field['default'] : '';
  831.         $setting['transport']    = isset( $field['transport'] ) ? $field['transport'] : 'refresh';
  832.         $setting['sanitize']     = isset( $field['sanitize'] ) ? $field['sanitize'] : $this->sanitize_handler( $field['type'] );
  833.         $setting['control_type'] = $field['type'];
  834.  
  835.         return $setting;
  836.     }
  837.  
  838.     /**
  839.      * Prepare single control
  840.      *
  841.      * @param array $field Unfiltered control.
  842.      * @param boolean $dynamic flag for dynamic control.
  843.      *
  844.      * @return array
  845.      */
  846.     public function compose_control( $field, $dynamic ) {
  847.         $control               = array();
  848.         $active_callback_class = Active_Callback::get_instance();
  849.  
  850.         $control['id']            = $field['id'];
  851.         $control['type']          = $field['type'];
  852.         $control['label']         = isset( $field['label'] ) ? $field['label'] : '';
  853.         $control['section']       = isset( $field['section'] ) ? $field['section'] : '';
  854.         $control['description']   = isset( $field['description'] ) ? $field['description'] : '';
  855.         $control['multiple']      = isset( $field['multiple'] ) ? $field['multiple'] : 0;
  856.         $control['default']       = isset( $field['default'] ) ? $field['default'] : 0;
  857.         $control['choices']       = isset( $field['choices'] ) ? $field['choices'] : array();
  858.         $control['fields']        = isset( $field['fields'] ) ? $field['fields'] : array();
  859.         $control['row_label']     = isset( $field['row_label'] ) ? $field['row_label'] : esc_html__( 'Row', 'jeg' );
  860.         $control['wrapper_class'] = isset( $field['wrapper_class'] ) ? $field['wrapper_class'] : array();
  861.         $control['ajax_action']   = isset( $field['ajax_action'] ) ? $field['ajax_action'] : '';
  862.  
  863.         // additional control option.
  864.         $control['partial_refresh'] = isset( $field['partial_refresh'] ) ? $field['partial_refresh'] : null;
  865.         $control['active_rule']     = isset( $field['active_callback'] ) ? $field['active_callback'] : null;
  866.         $control['output']          = isset( $field['output'] ) ? $field['output'] : null;
  867.         $control['postvar']         = isset( $field['postvar'] ) ? $field['postvar'] : [];
  868.         $control['dynamic']         = isset( $field['dynamic'] ) ? $field['dynamic'] : false;
  869.  
  870.         // only load active callback on normal field.
  871.         if ( ! $dynamic ) {
  872.             $control['active_callback'] = isset( $field['active_callback'] ) ? function () use ( $field, $active_callback_class ) {
  873.                 return $active_callback_class->evaluate( $field['active_callback'] );
  874.             } : '__return_true';
  875.         }
  876.  
  877.         // Code Editor
  878.         if ( isset( $field['input_attrs'] ) ) {
  879.             $control['input_attrs'] = $field['input_attrs'];
  880.         }
  881.         if ( isset( $field['code_type'] ) ) {
  882.             $control['code_type'] = $field['code_type'];
  883.         }
  884.  
  885.         return $control;
  886.     }
  887.  
  888.     /**
  889.      * Create Customizer setting, control, and partial refresh
  890.      *
  891.      * @param array $field Unfiltered control.
  892.      * @param boolean $dynamic flag for dynamic control.
  893.      *
  894.      * @return array
  895.      */
  896.     public function filter_field( $field, $dynamic = false ) {
  897.         $setting = $this->compose_setting( $field );
  898.         $control = $this->compose_control( $field, $dynamic );
  899.         $partial = $this->setup_partial_refresh( $field );
  900.  
  901.         // Hack transport to have postMessage.
  902.         if ( ! empty( $partial ) ) {
  903.             $setting['transport'] = 'postMessage';
  904.         }
  905.  
  906.         return [
  907.             'setting' => $setting,
  908.             'control' => $control,
  909.         ];
  910.     }
  911.  
  912.     /**
  913.      * Prepare partial refresh
  914.      *
  915.      * @param array $field Partial refresh field.
  916.      *
  917.      * @return array
  918.      */
  919.     public function setup_partial_refresh( $field ) {
  920.         if ( ! isset( $field['partial_refresh'] ) ) {
  921.             $field['partial_refresh'] = array();
  922.         }
  923.  
  924.         foreach ( $field['partial_refresh'] as $id => $args ) {
  925.             if ( ! is_array( $args ) || ! isset( $args['selector'] ) || ! isset( $args['render_callback'] ) || ! is_callable( $args['render_callback'] ) ) {
  926.                 unset( $this->partial_refresh[ $id ] );
  927.                 continue;
  928.             }
  929.         }
  930.  
  931.         return $field['partial_refresh'];
  932.     }
  933.  
  934.     /**
  935.      * Register control type
  936.      */
  937.     public function register_control_types() {
  938.         $wp_customize = $this->wp_customize();
  939.         $handler      = $this->get_all_control_class();
  940.  
  941.         foreach ( $handler as $handle ) {
  942.             $wp_customize->register_control_type( $handle );
  943.         }
  944.     }
  945.  
  946.     /**
  947.      * Register Section Type
  948.      */
  949.     public function register_section_types() {
  950.         $wp_customize = $this->wp_customize();
  951.  
  952.         $wp_customize->register_section_type( 'Jeg\Customizer\Section\Helper_Section' );
  953.         $wp_customize->register_section_type( 'Jeg\Customizer\Section\Lazy_Section' );
  954.         $wp_customize->register_section_type( 'Jeg\Customizer\Section\Link_Section' );
  955.         $wp_customize->register_section_type( 'Jeg\Customizer\Section\Default_Section' );
  956.     }
  957.  
  958.     /**
  959.      * Register Panel Type
  960.      */
  961.     public function register_panel_types() {
  962.         $wp_customize = $this->wp_customize();
  963.  
  964.         $wp_customize->register_control_type( 'Jeg\Customizer\Panel\Alert_Panel' );
  965.     }
  966.  
  967.     /**
  968.      * Get all Control Class
  969.      *
  970.      * @return array
  971.      */
  972.     public function get_all_control_class() {
  973.         $handler = array(
  974.             'jeg-alert'           => 'Jeg\Customizer\Control\Alert',
  975.             'jeg-header'          => 'Jeg\Customizer\Control\Header',
  976.             'jeg-color'           => 'Jeg\Customizer\Control\Color',
  977.             'jeg-toggle'          => 'Jeg\Customizer\Control\Toggle',
  978.             'jeg-slider'          => 'Jeg\Customizer\Control\Slider',
  979.             'jeg-number'          => 'Jeg\Customizer\Control\Number',
  980.             'jeg-select'          => 'Jeg\Customizer\Control\Select',
  981.             'jeg-ajax-select'     => 'Jeg\Customizer\Control\Ajax_Select',
  982.             'jeg-range-slider'    => 'Jeg\Customizer\Control\Range_Slider',
  983.             'jeg-radio-image'     => 'Jeg\Customizer\Control\Radio_Image',
  984.             'jeg-radio-buttonset' => 'Jeg\Customizer\Control\Radio_Button_Set',
  985.             'jeg-preset'          => 'Jeg\Customizer\Control\Preset',
  986.             'jeg-preset-image'    => 'Jeg\Customizer\Control\Preset_Image',
  987.             'jeg-text'            => 'Jeg\Customizer\Control\Text',
  988.             'jeg-password'        => 'Jeg\Customizer\Control\Password',
  989.             'jeg-textarea'        => 'Jeg\Customizer\Control\Textarea',
  990.             'jeg-code-editor'     => 'Jeg\Customizer\Control\Code_Editor',
  991.             'jeg-radio'           => 'Jeg\Customizer\Control\Radio',
  992.             'jeg-image'           => 'Jeg\Customizer\Control\Image',
  993.             'jeg-upload'          => 'Jeg\Customizer\Control\Upload',
  994.             'jeg-spacing'         => 'Jeg\Customizer\Control\Spacing',
  995.             'jeg-repeater'        => 'Jeg\Customizer\Control\Repeater',
  996.             'jeg-typography'      => 'Jeg\Customizer\Control\Typography',
  997.             'jeg-gradient'        => 'Jeg\Customizer\Control\Gradient',
  998.         );
  999.  
  1000.         return $handler;
  1001.     }
  1002.  
  1003.     /**
  1004.      * Get control class
  1005.      *
  1006.      * @param string $type Type of control field.
  1007.      *
  1008.      * @return mixed
  1009.      * @throws \InvalidArgumentException Throw if type of customizer have issue.
  1010.      */
  1011.     public function get_control_class( $type ) {
  1012.         $handler = $this->get_all_control_class();
  1013.  
  1014.         if ( array_key_exists( $type, $handler ) ) {
  1015.             return $handler[ $type ];
  1016.         } else {
  1017.             throw new \InvalidArgumentException( 'Unrecognized Type. Please update your plugin to latest version.' );
  1018.         }
  1019.     }
  1020.  
  1021.     /**
  1022.      * Add control to wp customize instance
  1023.      *
  1024.      * @param array $field Array of field.
  1025.      * @param \WP_Customize_Setting $setting instance of Setting.
  1026.      *
  1027.      * @return mixed
  1028.      */
  1029.     public function do_add_control( $field, $setting = null ) {
  1030.         $wp_customize  = $this->wp_customize();
  1031.         $control_class = $this->get_control_class( $field['type'] );
  1032.  
  1033.         if ( null !== $setting && $setting instanceof \WP_Customize_Setting ) {
  1034.             $field['settings'] = $setting->id;
  1035.         }
  1036.  
  1037.         $control_instance = new $control_class( $wp_customize, $field['id'], $field );
  1038.         $wp_customize->add_control( $control_instance );
  1039.  
  1040.         return $control_instance;
  1041.     }
  1042.  
  1043.  
  1044.     /**
  1045.      * Handle input sanitize for every type
  1046.      *
  1047.      * @param string $type Type of control and what kind sanitized to be used.
  1048.      *
  1049.      * @return array|string
  1050.      */
  1051.     public function sanitize_handler( $type ) {
  1052.         $sanitize_class = Sanitize::get_instance();
  1053.  
  1054.         switch ( $type ) {
  1055.             case 'checkbox':
  1056.             case 'jeg-toggle':
  1057.                 $sanitize = array( $sanitize_class, 'sanitize_checkbox' );
  1058.                 break;
  1059.             case 'image':
  1060.             case 'upload':
  1061.                 $sanitize = array( $sanitize_class, 'sanitize_url' );
  1062.                 break;
  1063.             case 'jeg-typography':
  1064.                 $sanitize = array( $sanitize_class, 'sanitize_typography' );
  1065.                 break;
  1066.             case 'jeg-number':
  1067.             case 'jeg-slider':
  1068.                 $sanitize = array( $sanitize_class, 'sanitize_number' );
  1069.                 break;
  1070.             case 'repeater':
  1071.             case 'jeg-repeater':
  1072.                 $sanitize = array( $sanitize_class, 'by_pass' );
  1073.                 break;
  1074.             default:
  1075.                 $sanitize = array( $sanitize_class, 'sanitize_input' );
  1076.                 break;
  1077.         }
  1078.  
  1079.         return $sanitize;
  1080.     }
  1081.  
  1082.     /**
  1083.      * Get setting class
  1084.      *
  1085.      * @param string $type Type of class for setting option.
  1086.      *
  1087.      * @return string
  1088.      */
  1089.     public function get_setting_class( $type ) {
  1090.         switch ( $type ) {
  1091.             case 'jeg-repeater':
  1092.                 $setting_class = 'Jeg\Customizer\Setting\Repeater_Setting';
  1093.                 break;
  1094.             case 'jeg-spacing':
  1095.                 $setting_class = 'Jeg\Customizer\Setting\Spacing_Setting';
  1096.                 break;
  1097.             default:
  1098.                 $setting_class = 'Jeg\Customizer\Setting\Default_Setting';
  1099.                 break;
  1100.         }
  1101.  
  1102.         return $setting_class;
  1103.     }
  1104.  
  1105.     /**
  1106.      * Add Setting to wp customize instance base on what kind of class instance used
  1107.      *
  1108.      * @param array $setting Array of setting.
  1109.      * @param string $setting_id Name of setting ID.
  1110.      *
  1111.      * @return \WP_Customize_Setting
  1112.      */
  1113.     public function do_add_setting( $setting, $setting_id = null ) {
  1114.         $wp_customize = $this->wp_customize();
  1115.  
  1116.         if ( null === $setting_id ) {
  1117.             $setting_id = $setting['id'];
  1118.         }
  1119.  
  1120.         $setting_class    = $this->get_setting_class( $setting['control_type'] );
  1121.         $setting_instance = new $setting_class( $wp_customize, $setting_id, $setting );
  1122.         $wp_customize->add_setting( $setting_instance );
  1123.  
  1124.         return $setting_instance;
  1125.     }
  1126.  
  1127.     /**
  1128.      * Only Normal Field
  1129.      *
  1130.      * @return array
  1131.      */
  1132.     public function get_fields() {
  1133.         return $this->fields;
  1134.     }
  1135.  
  1136.  
  1137.     /**
  1138.      * Get all registered lazy fields
  1139.      *
  1140.      * @return array
  1141.      */
  1142.     public function get_lazy_fields() {
  1143.         $fields   = array();
  1144.         $sections = $this->get_registered_lazy_section();
  1145.  
  1146.         foreach ( $sections as $key => $section ) {
  1147.             foreach ( $section as $file ) {
  1148.                 $options = $this->get_lazy_options( $file );
  1149.                 foreach ( $options as $option ) {
  1150.                     $fields[ $option['id'] ]            = $option;
  1151.                     $fields[ $option['id'] ]['section'] = $key;
  1152.                 }
  1153.             }
  1154.         }
  1155.  
  1156.         return $fields;
  1157.     }
  1158.  
  1159.     /**
  1160.      * Get both normal & lazy loaded fields
  1161.      *
  1162.      * @param array $extract Callable for excluding field.
  1163.      *
  1164.      * @return array
  1165.      */
  1166.     public function get_all_fields( $extract = null ) {
  1167.         $extract   = is_callable( $extract ) ? $extract : array( $this, 'extract_fields' );
  1168.         $cache_key = $extract[1];
  1169.  
  1170.         if ( ! isset( $this->cache_fields[ $cache_key ] ) ) {
  1171.             $lazy_fields   = $this->get_lazy_fields();
  1172.             $normal_fields = $this->get_fields();
  1173.             $fields        = array_merge( $normal_fields, $lazy_fields );
  1174.             $results       = array();
  1175.  
  1176.             foreach ( $fields as $key => $field ) {
  1177.                 $result = call_user_func_array( $extract, array( $field, $key ) );
  1178.                 if ( $result ) {
  1179.                     $results[ $key ] = $result;
  1180.                 }
  1181.             }
  1182.  
  1183.             $this->cache_fields[ $cache_key ] = $results;
  1184.         }
  1185.  
  1186.         return $this->cache_fields[ $cache_key ];
  1187.     }
  1188.  
  1189.     /**
  1190.      * Return Fields without Partial Refresh
  1191.      *
  1192.      * @param array $field Field.
  1193.      *
  1194.      * @return mixed
  1195.      */
  1196.     public function extract_fields( $field ) {
  1197.         unset( $field['partial_refresh'] );
  1198.  
  1199.         return $field;
  1200.     }
  1201.  
  1202.     /**
  1203.      * Get all registered section
  1204.      *
  1205.      * @return array
  1206.      */
  1207.     public function get_sections() {
  1208.         return $this->sections;
  1209.     }
  1210.  
  1211.     /**
  1212.      * Get all registered panel
  1213.      *
  1214.      * @return array
  1215.      */
  1216.     public function get_panels() {
  1217.         return $this->panels;
  1218.     }
  1219.  
  1220.     /**
  1221.      * Build search template
  1222.      */
  1223.     public function search_template() {
  1224.         ?>
  1225.         <script type="text/html" id="tmpl-search-wrapper">
  1226.             <div class='customizer-search-wrapper'>
  1227.                 <a href='#' class='customizer-search-toggle'>
  1228.                     <i class='fa fa-search'></i>
  1229.                 </a>
  1230.                 <form class='customizer-form-search'>
  1231.                     <input type='text' name='customizer-form-input'/>
  1232.                 </form>
  1233.             </div>
  1234.             <div class='customizer-search-result'>
  1235.                 <div class='customizer-search-result-wrapper'></div>
  1236.                 <div class='search-loader hidden'>
  1237.                     <div class='loader'></div>
  1238.                 </div>
  1239.             </div>
  1240.         </script>
  1241.  
  1242.         <script type="text/html" id="tmpl-search-overlay">
  1243.             <div class='customizer-search-overlay'></div>
  1244.         </script>
  1245.  
  1246.         <script type="text/html" id="tmpl-search-control">
  1247.             <ul>
  1248.                 <# for ( key in data ) { #>
  1249.                 <# var control = data[key]; #>
  1250.                 <li class='search-li' data-section='{{ control.section }}' data-control='{{ control.id }}'>
  1251.                     <span>{{ control.path }}</span>
  1252.                     <h3>{{ control.label }}</h3>
  1253.                     <em>{{ control.description }}</em>
  1254.                 </li>
  1255.                 <# } #>
  1256.             </ul>
  1257.         </script>
  1258.         <?php
  1259.     }
  1260.  
  1261.     /**
  1262.      * Build widget template
  1263.      */
  1264.     public function widget_template() {
  1265.         ?>
  1266.         <script type="text/html" id="tmpl-widget-alert">
  1267.             <div class='customize-alert customize-alert-info'>
  1268.                 <label>
  1269.                     <strong class='customize-control-title'>{{ data.title }}</strong>
  1270.                     <div class='description customize-control-description'>
  1271.                         <ul>
  1272.                             <# for ( word in data.words ) { #>
  1273.                             <li>{{ data.words[word] }}</li>
  1274.                             <# } #>
  1275.                         </ul>
  1276.                     </div>
  1277.                 </label>
  1278.             </div>
  1279.         </script>
  1280.         <?php
  1281.     }
  1282.  
  1283.     /**
  1284.      * Register scripts for Jeg Customizer.
  1285.      */
  1286.     public function register_scripts() {
  1287.         $wp_scripts = wp_scripts();
  1288.  
  1289.         $handle    = 'jeg-extend-widget';
  1290.         $src       = JEG_URL . '/assets/js/customizer/widget-extend.js';
  1291.         $deps      = array( 'jquery', 'customize-widgets' );
  1292.         $in_footer = 1;
  1293.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1294.  
  1295.         $handle    = 'selectize';
  1296.         $src       = JEG_URL . '/assets/js/vendor/selectize.js';
  1297.         $deps      = array( 'jquery' );
  1298.         $in_footer = 1;
  1299.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1300.  
  1301.         $handle    = 'serialize-js';
  1302.         $src       = JEG_URL . '/assets/js/vendor/serialize.js';
  1303.         $deps      = array();
  1304.         $in_footer = 1;
  1305.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1306.  
  1307.         $handle    = 'wp-color-picker-alpha';
  1308.         $src       = JEG_URL . '/assets/js/vendor/wp-color-picker-alpha.js';
  1309.         $deps      = array( 'wp-color-picker' );
  1310.         $in_footer = 1;
  1311.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1312.  
  1313.         $wp_scripts->localize(
  1314.             'wp-color-picker-alpha',
  1315.             'wpColorPickerL10n',
  1316.             array(
  1317.                 'clear'            => esc_html__( 'Clear', 'jeg' ),
  1318.                 'clearAriaLabel'   => esc_html__( 'Clear color', 'jeg' ),
  1319.                 'defaultString'    => esc_html__( 'Default', 'jeg' ),
  1320.                 'defaultAriaLabel' => esc_html__( 'Select default color', 'jeg' ),
  1321.                 'pick'             => esc_html__( 'Select color', 'jeg' ),
  1322.                 'defaultLabel'     => esc_html__( 'Color value', 'jeg' ),
  1323.             )
  1324.         );
  1325.  
  1326.         $handle    = 'codemirror';
  1327.         $src       = JEG_URL . '/assets/js/vendor/codemirror/lib/codemirror.js';
  1328.         $deps      = array( 'jquery', 'jquery-ui-core', 'jquery-ui-button' );
  1329.         $in_footer = 1;
  1330.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1331.  
  1332.         $handle    = 'jeg-validate-css';
  1333.         $src       = JEG_URL . '/assets/js/customizer/validate-css-value.js';
  1334.         $deps      = array( 'jquery' );
  1335.         $in_footer = 1;
  1336.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1337.  
  1338.         $handle    = 'jeg-active-callback';
  1339.         $src       = JEG_URL . '/assets/js/customizer/active-callback.js';
  1340.         $deps      = array( 'underscore' );
  1341.         $in_footer = 1;
  1342.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1343.  
  1344.         $handle    = 'jeg-search-customizer';
  1345.         $src       = JEG_URL . '/assets/js/customizer/search-control.js';
  1346.         $deps      = array( 'jquery', 'underscore' );
  1347.         $in_footer = 1;
  1348.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1349.  
  1350.         $handle    = 'jeg-customizer-late-init';
  1351.         $src       = JEG_URL . '/assets/js/customizer/late-init-customizer.js';
  1352.         $deps      = array( 'jquery' );
  1353.         $in_footer = 1;
  1354.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1355.  
  1356.         $handle    = 'ion-range-slider';
  1357.         $src       = JEG_URL . '/assets/js/vendor/ion.rangeSlider.min.js';
  1358.         $deps      = array( 'jquery' );
  1359.         $in_footer = 1;
  1360.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1361.  
  1362.         $handle    = 'jeg-set-setting-value';
  1363.         $src       = JEG_URL . '/assets/js/customizer/set-setting-value.js';
  1364.         $deps      = array( 'jquery' );
  1365.         $in_footer = 1;
  1366.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1367.  
  1368.         // ... Control
  1369.         $handle    = 'jeg-default-control';
  1370.         $src       = JEG_URL . '/assets/js/customizer-control/control-default.js';
  1371.         $deps      = array( 'customize-controls', 'underscore' );
  1372.         $in_footer = 1;
  1373.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1374.  
  1375.         $handle    = 'jeg-alert-control';
  1376.         $src       = JEG_URL . '/assets/js/customizer-control/control-alert.js';
  1377.         $deps      = array( 'jeg-default-control' );
  1378.         $in_footer = 1;
  1379.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1380.  
  1381.         $handle    = 'jeg-header-control';
  1382.         $src       = JEG_URL . '/assets/js/customizer-control/control-header.js';
  1383.         $deps      = array( 'jeg-default-control' );
  1384.         $in_footer = 1;
  1385.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1386.  
  1387.         $handle    = 'jeg-color-control';
  1388.         $src       = JEG_URL . '/assets/js/customizer-control/control-color.js';
  1389.         $deps      = array(
  1390.             'jquery',
  1391.             'customize-controls',
  1392.             'wp-color-picker-alpha',
  1393.             'jeg-default-control',
  1394.         );
  1395.         $in_footer = 1;
  1396.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1397.  
  1398.         $handle    = 'jeg-toggle-control';
  1399.         $src       = JEG_URL . '/assets/js/customizer-control/control-toggle.js';
  1400.         $deps      = array( 'jquery', 'jeg-default-control' );
  1401.         $in_footer = 1;
  1402.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1403.  
  1404.         $handle    = 'jeg-slider-control';
  1405.         $src       = JEG_URL . '/assets/js/customizer-control/control-slider.js';
  1406.         $deps      = array( 'jquery', 'jeg-default-control' );
  1407.         $in_footer = 1;
  1408.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1409.  
  1410.         $handle    = 'jeg-number-control';
  1411.         $src       = JEG_URL . '/assets/js/customizer-control/control-number.js';
  1412.         $deps      = array( 'jquery', 'jeg-default-control', 'jquery-ui-spinner' );
  1413.         $in_footer = 1;
  1414.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1415.  
  1416.         $handle    = 'jeg-select-control';
  1417.         $src       = JEG_URL . '/assets/js/customizer-control/control-select.js';
  1418.         $deps      = array( 'jquery', 'jeg-default-control', 'selectize' );
  1419.         $in_footer = 1;
  1420.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1421.  
  1422.         $handle    = 'jeg-ajax-select-control';
  1423.         $src       = JEG_URL . '/assets/js/customizer-control/control-ajax-select.js';
  1424.         $deps      = array( 'jquery', 'jeg-default-control', 'selectize' );
  1425.         $in_footer = 1;
  1426.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1427.  
  1428.         $handle    = 'jeg-range-slider-control';
  1429.         $src       = JEG_URL . '/assets/js/customizer-control/control-range-slider.js';
  1430.         $deps      = array( 'jquery', 'jeg-default-control', 'ion-range-slider' );
  1431.         $in_footer = 1;
  1432.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1433.  
  1434.         $handle    = 'jeg-radio-image-control';
  1435.         $src       = JEG_URL . '/assets/js/customizer-control/control-radio-image.js';
  1436.         $deps      = array( 'jquery', 'jeg-default-control' );
  1437.         $in_footer = 1;
  1438.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1439.  
  1440.         $handle    = 'jeg-radio-buttonset-control';
  1441.         $src       = JEG_URL . '/assets/js/customizer-control/control-radio-buttonset.js';
  1442.         $deps      = array( 'jquery', 'jeg-default-control' );
  1443.         $in_footer = 1;
  1444.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1445.  
  1446.         $handle    = 'jeg-preset-control';
  1447.         $src       = JEG_URL . '/assets/js/customizer-control/control-preset.js';
  1448.         $deps      = array( 'jquery', 'jeg-default-control', 'jeg-set-setting-value' );
  1449.         $in_footer = 1;
  1450.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1451.  
  1452.         $handle    = 'jeg-preset-image-control';
  1453.         $src       = JEG_URL . '/assets/js/customizer-control/control-preset-image.js';
  1454.         $deps      = array( 'jquery', 'jeg-default-control', 'selectize' );
  1455.         $in_footer = 1;
  1456.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1457.  
  1458.         $handle    = 'jeg-text-control';
  1459.         $src       = JEG_URL . '/assets/js/customizer-control/control-text.js';
  1460.         $deps      = array( 'jeg-default-control' );
  1461.         $in_footer = 1;
  1462.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1463.  
  1464.         $handle    = 'jeg-password-control';
  1465.         $src       = JEG_URL . '/assets/js/customizer-control/control-text.js';
  1466.         $deps      = array( 'jeg-default-control' );
  1467.         $in_footer = 1;
  1468.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1469.  
  1470.         $handle    = 'jeg-textarea-control';
  1471.         $src       = JEG_URL . '/assets/js/customizer-control/control-textarea.js';
  1472.         $deps      = array( 'jeg-default-control' );
  1473.         $in_footer = 1;
  1474.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1475.  
  1476.         $handle    = 'jeg-code-editor-control';
  1477.         $src       = JEG_URL . '/assets/js/customizer-control/control-code-editor.js';
  1478.         $deps      = array( 'jeg-default-control' );
  1479.         $in_footer = 1;
  1480.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1481.  
  1482.         $handle    = 'jeg-radio-control';
  1483.         $src       = JEG_URL . '/assets/js/customizer-control/control-radio.js';
  1484.         $deps      = array( 'jeg-default-control' );
  1485.         $in_footer = 1;
  1486.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1487.  
  1488.         $handle    = 'jeg-image-control';
  1489.         $src       = JEG_URL . '/assets/js/customizer-control/control-image.js';
  1490.         $deps      = array( 'jeg-default-control' );
  1491.         $in_footer = 1;
  1492.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1493.  
  1494.         $handle    = 'jeg-upload-control';
  1495.         $src       = JEG_URL . '/assets/js/customizer-control/control-upload.js';
  1496.         $deps      = array( 'jeg-default-control' );
  1497.         $in_footer = 1;
  1498.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1499.  
  1500.         $handle    = 'jeg-spacing-control';
  1501.         $src       = JEG_URL . '/assets/js/customizer-control/control-spacing.js';
  1502.         $deps      = array( 'jeg-default-control', 'jeg-validate-css' );
  1503.         $in_footer = 1;
  1504.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1505.  
  1506.         $handle    = 'jeg-repeater-control';
  1507.         $src       = JEG_URL . '/assets/js/customizer-control/control-repeater.js';
  1508.         $deps      = array(
  1509.             'jeg-default-control',
  1510.             'jquery-ui-sortable',
  1511.             'wp-color-picker',
  1512.             'selectize',
  1513.             'serialize-js',
  1514.         );
  1515.         $in_footer = 1;
  1516.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1517.  
  1518.         $handle    = 'jeg-typography-control';
  1519.         $src       = JEG_URL . '/assets/js/customizer-control/control-typography.js';
  1520.         $deps      = array( 'jeg-default-control', 'selectize', 'wp-color-picker-alpha' );
  1521.         $in_footer = 1;
  1522.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1523.  
  1524.         $handle    = 'jeg-gradient-control';
  1525.         $src       = JEG_URL . '/assets/js/customizer-control/control-gradient.js';
  1526.         $deps      = array( 'jeg-default-control', 'selectize', 'wp-color-picker-alpha' );
  1527.         $in_footer = 1;
  1528.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1529.  
  1530.         // ... Section
  1531.         $handle    = 'jeg-default-section';
  1532.         $src       = JEG_URL . '/assets/js/customizer-section/default-section.js';
  1533.         $deps      = array( 'jquery' );
  1534.         $in_footer = 1;
  1535.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1536.  
  1537.         $handle    = 'jeg-link-section';
  1538.         $src       = JEG_URL . '/assets/js/customizer-section/link-section.js';
  1539.         $deps      = array( 'jquery' );
  1540.         $in_footer = 1;
  1541.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1542.  
  1543.         $handle    = 'jeg-lazy-section';
  1544.         $src       = JEG_URL . '/assets/js/customizer-section/lazy-section.js';
  1545.         $deps      = array(
  1546.             'jquery',
  1547.             'underscore',
  1548.             'jeg-default-section',
  1549.             'jeg-alert-control',
  1550.             'jeg-header-control',
  1551.             'jeg-color-control',
  1552.             'jeg-toggle-control',
  1553.             'jeg-slider-control',
  1554.             'jeg-number-control',
  1555.             'jeg-select-control',
  1556.             'jeg-ajax-select-control',
  1557.             'jeg-range-slider-control',
  1558.             'jeg-radio-image-control',
  1559.             'jeg-radio-buttonset-control',
  1560.             'jeg-preset-control',
  1561.             'jeg-preset-image-control',
  1562.             'jeg-text-control',
  1563.             'jeg-textarea-control',
  1564.             'jeg-code-editor-control',
  1565.             'jeg-radio-control',
  1566.             'jeg-image-control',
  1567.             'jeg-upload-control',
  1568.             'jeg-spacing-control',
  1569.             'jeg-repeater-control',
  1570.             'jeg-typography-control',
  1571.             'jeg-gradient-control',
  1572.         );
  1573.         $in_footer = 1;
  1574.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1575.  
  1576.         // ... Connect To Previewer
  1577.         $handle    = 'jeg-previewer-sync';
  1578.         $src       = JEG_URL . '/assets/js/customizer/previewer-sync.js';
  1579.         $deps      = array(
  1580.             'underscore',
  1581.             'customize-controls',
  1582.         );
  1583.         $in_footer = 1;
  1584.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1585.     }
  1586.  
  1587.     /**
  1588.      * Load css on Customizer Panel
  1589.      */
  1590.     public function customizer_styles() {
  1591.         wp_enqueue_style( 'selectize', JEG_URL . '/assets/css/selectize.default.css', null, $this->version );
  1592.         wp_enqueue_style( 'jeg-customizer-css', JEG_URL . '/assets/css/customizer.css', array( 'wp-color-picker' ), $this->version );
  1593.         wp_enqueue_style( 'codemirror', JEG_URL . '/assets/js/vendor/codemirror/lib/codemirror.css', null, $this->version );
  1594.         wp_enqueue_style( 'font-awesome', JEG_URL . '/assets/font/font-awesome/font-awesome.css', null, $this->version );
  1595.  
  1596.         wp_enqueue_style( 'ion-range-slider', JEG_URL . '/assets/css/ion.rangeSlider.css', null, $this->version );
  1597.         wp_enqueue_style( 'ion-range-slider-skin', JEG_URL . '/assets/css/ion.rangeSlider.skinFlat.css', null, $this->version );
  1598.  
  1599.         if ( is_rtl() ) {
  1600.             wp_enqueue_style( 'jeg-customizer-css-rtl', JEG_URL . '/assets/css/customizer-rtl.css', null, $this->version );
  1601.         }
  1602.     }
  1603.  
  1604.     /**
  1605.      * Load script on Customizer Panel
  1606.      */
  1607.     public function enqueue_control_script() {
  1608.         wp_enqueue_script( 'jeg-customizer-late-init' );
  1609.         wp_enqueue_script( 'jeg-active-callback' );
  1610.         wp_enqueue_script( 'jeg-previewer-sync' );
  1611.         wp_enqueue_script( 'jeg-lazy-section' );
  1612.         wp_enqueue_script( 'jeg-link-section' );
  1613.         wp_enqueue_script( 'jeg-search-customizer' );
  1614.         wp_enqueue_script( 'jeg-extend-widget' );
  1615.  
  1616.         wp_localize_script( 'jeg-typography-control', 'jegAllFonts',
  1617.             $this->load_all_font()
  1618.         );
  1619.  
  1620.         wp_localize_script( 'jeg-lazy-section', 'lazySetting', array(
  1621.             'ajaxUrl' => add_query_arg( array( $this->endpoint => 'jeg' ), esc_url( home_url( '/', 'relative' ) ) ),
  1622.             'nonce'   => wp_create_nonce( $this->endpoint ),
  1623.         ) );
  1624.  
  1625.         wp_localize_script( 'jeg-search-customizer', 'searchSetting', array(
  1626.             'ajaxUrl' => add_query_arg( array( $this->endpoint => 'jeg' ), esc_url( home_url( '/', 'relative' ) ) ),
  1627.             'nonce'   => wp_create_nonce( $this->endpoint ),
  1628.         ) );
  1629.  
  1630.         wp_localize_script( 'jeg-previewer-sync', 'partialSetting', array(
  1631.             'patternTemplate' => Lazy_Partial::js_pattern_template(),
  1632.         ) );
  1633.  
  1634.         wp_localize_script( 'jeg-extend-widget', 'widgetLang', array(
  1635.             'title' => esc_html__( 'Notice', 'jeg' ),
  1636.             'words' => array(
  1637.                 esc_html__( 'To improve customizer load speed, we disable widget option on customizer for element.', 'jeg' ),
  1638.                 esc_html__( 'You can still modify widget content from Widget Panel on Admin Page', 'jeg' ),
  1639.             ),
  1640.         ) );
  1641.     }
  1642.  
  1643.     /**
  1644.      * Get all excluded font
  1645.      *
  1646.      * @return mixed
  1647.      */
  1648.     public function get_excluded_font() {
  1649.         return apply_filters( 'jeg_not_google_font', array() );
  1650.     }
  1651.  
  1652.     /**
  1653.      * Load script at Customizer Preview
  1654.      */
  1655.     public function previewer_script() {
  1656.         $wp_scripts = wp_scripts();
  1657.  
  1658.         // ... Customizer Preview Script
  1659.         $handle    = 'jeg-customizer-preview';
  1660.         $src       = JEG_URL . '/assets/js/customizer/customizer-preview.js';
  1661.         $deps      = array(
  1662.             'underscore',
  1663.             'customize-preview',
  1664.         );
  1665.         $in_footer = 1;
  1666.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1667.  
  1668.         $handle    = 'jeg-customizer-output-preview';
  1669.         $src       = JEG_URL . '/assets/js/customizer/style-output-preview.js';
  1670.         $deps      = array(
  1671.             'jquery',
  1672.             'underscore',
  1673.             'customize-preview',
  1674.         );
  1675.         $in_footer = 1;
  1676.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1677.  
  1678.         $handle    = 'jeg-customizer-partial-preview';
  1679.         $src       = JEG_URL . '/assets/js/customizer/partial-refresh-preview.js';
  1680.         $deps      = array(
  1681.             'jquery',
  1682.             'underscore',
  1683.             'customize-preview',
  1684.         );
  1685.         $in_footer = 1;
  1686.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1687.  
  1688.         $handle    = 'vex';
  1689.         $src       = JEG_URL . '/assets/js/customizer/vex.combined.min.js';
  1690.         $deps      = array(
  1691.             'jquery',
  1692.         );
  1693.         $in_footer = 1;
  1694.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1695.  
  1696.  
  1697.         $handle    = 'jeg-customizer-redirect-tag-preview';
  1698.         $src       = JEG_URL . '/assets/js/customizer/redirect-tag-preview.js';
  1699.         $deps      = array(
  1700.             'vex',
  1701.             'jquery',
  1702.             'underscore',
  1703.             'customize-preview',
  1704.         );
  1705.         $in_footer = 1;
  1706.         $wp_scripts->add( $handle, $src, $deps, $this->version, $in_footer );
  1707.  
  1708.         // enqueue script.
  1709.         wp_enqueue_script( 'jeg-customizer-preview' );
  1710.         wp_enqueue_script( 'jeg-customizer-output-preview' );
  1711.         wp_enqueue_script( 'jeg-customizer-partial-preview' );
  1712.         wp_enqueue_script( 'jeg-customizer-redirect-tag-preview' );
  1713.  
  1714.  
  1715.         wp_localize_script( 'jeg-customizer-output-preview', 'outputSetting', [
  1716.             'excludeFont'     => $this->get_excluded_font(),
  1717.             'settingPattern'  => Default_Setting::$lazy_js_pattern,
  1718.             'inlinePrefix'    => Style_Generator::$inline_prefix,
  1719.             'redirectTag'     => $this->redirect_tag(),
  1720.             'redirectSetting' => [
  1721.                 'changeNotice' => wp_kses( __( "Change you made not showing on this page.<br/> Do you want to be redirected to the appropriate page to see change you just made?", 'jeg' ), wp_kses_allowed_html() ),
  1722.                 'yes'          => esc_html__( 'Yes', 'jeg' ),
  1723.             ]
  1724.         ] );
  1725.  
  1726.         // ... Load style
  1727.         wp_enqueue_style( 'vex', JEG_URL . '/assets/css/vex.css', null, $this->version );
  1728.         wp_enqueue_style( 'theme-customizer', JEG_URL . '/assets/css/theme-customizer.css', null, $this->version );
  1729.     }
  1730.  
  1731.     /**
  1732.      * Redirect Tag List
  1733.      *
  1734.      * @return array
  1735.      */
  1736.     public function redirect_tag() {
  1737.         return apply_filters( 'jeg_redirect_tag', [] );
  1738.     }
  1739. }
  1740.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement