Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 56
0.00% covered (danger)
0.00%
0 / 8
CRAP
0.00% covered (danger)
0.00%
0 / 1
Customberg
0.00% covered (danger)
0.00%
0 / 56
0.00% covered (danger)
0.00%
0 / 8
182
0.00% covered (danger)
0.00%
0 / 1
 instance
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 init_hooks
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 add_wp_admin_page
0.00% covered (danger)
0.00%
0 / 12
0.00% covered (danger)
0.00%
0 / 1
6
 get_show_powered_by
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
 jetpack_search_admin_page
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
 load_assets
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 load_assets_with_parameters
0.00% covered (danger)
0.00%
0 / 20
0.00% covered (danger)
0.00%
0 / 1
2
 should_add_page
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2/**
3 * A class that adds a search customization interface to wp-admin.
4 *
5 * @package automattic/jetpack-search
6 */
7
8namespace Automattic\Jetpack\Search;
9
10use Automattic\Jetpack\Assets;
11use Automattic\Jetpack\Connection\Manager as Connection_Manager;
12use Automattic\Jetpack\Status;
13use Automattic\Jetpack\Tracking;
14
15/**
16 * Responsible for adding a search customization interface to wp-admin.
17 *
18 * @package Automattic\Jetpack\Search
19 */
20class Customberg {
21    /**
22     * The singleton instance of this class.
23     *
24     * @var Customberg
25     */
26    protected static $instance;
27
28    /**
29     * Search Plan class.
30     *
31     * @var Plan
32     */
33    public $plan;
34
35    /**
36     * Get the singleton instance of the class.
37     *
38     * @return Customberg
39     */
40    public static function instance() {
41        if ( ! isset( self::$instance ) ) {
42            self::$instance = new static();
43            self::$instance->init_hooks();
44        }
45
46        return self::$instance;
47    }
48
49    /**
50     * Adds action hooks.
51     */
52    public function init_hooks() {
53        add_action( 'admin_menu', array( $this, 'add_wp_admin_page' ), 999 );
54        add_filter( 'pre_option_jetpack_search_show_powered_by', array( $this, 'get_show_powered_by' ) );
55        $this->plan = new Plan();
56    }
57
58    /**
59     * Adds a wp-admin page without adding a sidebar submenu item.
60     */
61    public function add_wp_admin_page() {
62        if ( ! $this->should_add_page() ) {
63            return;
64        }
65
66        // Intentionally omits adding a submenu via the first empty argument.
67        $hook = add_submenu_page(
68            '',
69            /** "Search" is a product name, do not translate. */
70            'Jetpack Search',
71            'Search',
72            'manage_options', // Must be an admin.
73            'jetpack-search-configure',
74            array( $this, 'jetpack_search_admin_page' )
75        );
76
77        add_action( "admin_print_scripts-$hook", array( $this, 'load_assets' ) );
78        add_action( 'admin_footer', array( 'Automattic\Jetpack\Search\Helper', 'print_instant_search_sidebar' ) );
79    }
80
81    /**
82     * Force option value to be true if in free plan.
83     *
84     * @param string $value The incoming value to be replaced.
85     */
86    public function get_show_powered_by( $value ) {
87        if ( $this->plan->is_free_plan() ) {
88            return true;
89        }
90        return $value;
91    }
92
93    /**
94     * Prints the dashboard container.
95     */
96    public function jetpack_search_admin_page() {
97        // TODO: Spin this function off into a static helper function in a helper class for code reuse.
98        $static_url = apply_filters( 'jetpack_static_url', '//en.wordpress.com/i/loading/loading-64.gif' );
99        ?>
100            <div id="jp-search-configure" class="jp-search-configure-dashboard" style="height: calc(100vh - 100px);">
101                <div class="hide-if-no-js" style="height: 100%;">
102                    <img class="jp-search-loader" width="32" height="32" alt="<?php esc_attr_e( 'Loading&hellip;', 'jetpack-search-pkg' ); ?>" src="<?php echo esc_url( $static_url ); ?>" style="
103                        position: absolute;
104                        left: 50%;
105                        top: 50%;
106                    "/>
107                </div>
108                <div class="hide-if-js"><?php esc_html_e( 'Your Jetpack Search customization page requires JavaScript to function properly.', 'jetpack-search-pkg' ); ?></div>
109            </div>
110        <?php
111    }
112
113    /**
114     * Loads assets for the customization experience.
115     */
116    public function load_assets() {
117            $this->load_assets_with_parameters( Package::get_installed_path() );
118    }
119
120    /**
121     * Loads script and style assets according to parameters provided.
122     *
123     * @param string $package_base_path - Base path for the search package.
124     */
125    public function load_assets_with_parameters( $package_base_path ) {
126        Tracking::register_tracks_functions_scripts( true );
127
128        Assets::register_script(
129            'jp-search-configure',
130            'build/customberg/jp-search-configure.js',
131            $package_base_path . '/src', // A full path to a file or a directory inside a plugin.
132            array(
133                'css_dependencies' => array(
134                    'wp-components',
135                    'wp-block-editor',
136                ),
137                'in_footer'        => true,
138                'textdomain'       => 'jetpack-search-pkg',
139            )
140        );
141        Assets::enqueue_script( 'jp-search-configure' );
142
143        // Use wp_add_inline_script instead of wp_localize_script, see https://core.trac.wordpress.org/ticket/25280.
144        wp_add_inline_script( 'jp-search-configure', 'var JetpackInstantSearchOptions=' . wp_json_encode( Helper::generate_initial_javascript_state(), JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP ) . ';', 'before' );
145        wp_add_inline_script(
146            'jp-search-configure',
147            "window.jetpackSearchConfigureInit( 'jp-search-configure' )"
148        );
149    }
150
151    /**
152     * Determine if the requisite page should be added to wp-admin.
153     *
154     * @return boolean
155     */
156    protected function should_add_page() {
157        $is_offline_mode = ( new Status() )->is_offline_mode();
158        $is_connected    = ( new Connection_Manager( Package::SLUG ) )->is_connected();
159        $supports_search = ( new Plan() )->supports_instant_search();
160
161        return (
162            ! $is_offline_mode && // Must be online.
163            $is_connected && // Must be connected.
164            $supports_search // Must have plan supporting Jetpack (Instant) Search.
165        );
166    }
167}