Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 125
0.00% covered (danger)
0.00%
0 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
Jetpack_Settings_Page
0.00% covered (danger)
0.00%
0 / 121
0.00% covered (danger)
0.00%
0 / 5
506
0.00% covered (danger)
0.00%
0 / 1
 add_page_actions
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 get_page_hook
0.00% covered (danger)
0.00%
0 / 18
0.00% covered (danger)
0.00%
0 / 1
12
 page_render
0.00% covered (danger)
0.00%
0 / 94
0.00% covered (danger)
0.00%
0 / 1
272
 additional_styles
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 page_admin_scripts
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
2
1<?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2
3use Automattic\Jetpack\Admin_UI\Admin_Menu;
4use Automattic\Jetpack\Assets;
5use Automattic\Jetpack\Redirect;
6use Automattic\Jetpack\Status;
7use Automattic\Jetpack\Tracking;
8
9if ( ! defined( 'ABSPATH' ) ) {
10    exit( 0 );
11}
12
13require_once __DIR__ . '/class.jetpack-admin-page.php';
14require_once JETPACK__PLUGIN_DIR . 'class.jetpack-modules-list-table.php';
15
16/**
17 * Builds the settings page and its menu
18 */
19class Jetpack_Settings_Page extends Jetpack_Admin_Page {
20
21    /**
22     * Show the settings page only when Jetpack is connected or in dev mode.
23     *
24     * @var boolean
25     */
26    protected $dont_show_if_not_active = true;
27
28    /**
29     * Add page action.
30     *
31     * @param string $hook Hook of current page.
32     * @return void
33     */
34    public function add_page_actions( $hook ) {} //phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
35
36    /**
37     * Adds the Settings sub menu.
38     */
39    public function get_page_hook() {
40        /*
41         * In Offline Mode My Jetpack does not initialize, so nothing holds the top slot and
42         * WordPress points the top-level "Jetpack" link at whichever item sorts first. Pin
43         * Modules above the alphabetical run so that link lands here rather than on whatever
44         * feature page happens to sort first. Only reachable offline, where My Jetpack's -10
45         * is never registered.
46         */
47        if ( ( new Status() )->is_offline_mode() ) {
48            $position = defined( Admin_Menu::class . '::POSITION_FIRST_FALLBACK' ) ? Admin_Menu::POSITION_FIRST_FALLBACK : -5;
49
50            return Admin_Menu::add_menu(
51                __( 'Jetpack Settings', 'jetpack' ),
52                __( 'Modules', 'jetpack' ),
53                'jetpack_manage_modules',
54                'jetpack_modules',
55                array( $this, 'render' ),
56                $position
57            );
58        }
59
60        return add_submenu_page(
61            '',
62            __( 'Jetpack Settings', 'jetpack' ),
63            __( 'Settings', 'jetpack' ),
64            'jetpack_manage_modules',
65            'jetpack_modules',
66            array( $this, 'render' )
67        );
68    }
69
70    /**
71     * Renders the module list table where you can use bulk action or row
72     * actions to activate/deactivate and configure modules
73     */
74    public function page_render() {
75        $list_table = new Jetpack_Modules_List_Table();
76
77        // Currently selected product group filter (used to highlight the active View button).
78        // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- This is view logic.
79        $current_group = isset( $_GET['product_group'] ) ? sanitize_text_field( wp_unslash( $_GET['product_group'] ) ) : '';
80
81        $is_offline_mode = ( new Status() )->is_offline_mode();
82        // Currently selected offline-availability filter (only meaningful in Offline Mode).
83        // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- This is view logic.
84        $current_availability = isset( $_GET['offline_available'] ) ? sanitize_text_field( wp_unslash( $_GET['offline_available'] ) ) : '';
85
86        $noscript_notice = @file_get_contents( JETPACK__PLUGIN_DIR . '_inc/build/static-noscript-notice.html' ); //phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged, WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents, Not fetching a remote file.
87        $rest_api_notice = @file_get_contents( JETPACK__PLUGIN_DIR . '_inc/build/static-version-notice.html' ); //phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged, WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents, Not fetching a remote file.
88
89        $noscript_notice = str_replace(
90            '#HEADER_TEXT#',
91            esc_html__( 'You have JavaScript disabled', 'jetpack' ),
92            $noscript_notice
93        );
94        $noscript_notice = str_replace(
95            '#TEXT#',
96            esc_html__( "Turn on JavaScript to unlock Jetpack's full potential!", 'jetpack' ),
97            $noscript_notice
98        );
99
100        $rest_api_notice = str_replace(
101            '#HEADER_TEXT#',
102            esc_html( __( 'WordPress REST API is disabled', 'jetpack' ) ),
103            $rest_api_notice
104        );
105        $rest_api_notice = str_replace(
106            '#TEXT#',
107            esc_html( __( "Enable WordPress REST API to unlock Jetpack's full potential!", 'jetpack' ) ),
108            $rest_api_notice
109        );
110
111        if ( ! $this->is_rest_api_enabled() ) {
112            echo $rest_api_notice; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
113        }
114        echo $noscript_notice; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
115        ?>
116
117        <!-- Core relocates other plugins' notices to just after this marker. -->
118        <div class="wrap"><div class="wp-header-end"></div></div>
119        <div class="jetpack-module-list">
120            <?php if ( $is_offline_mode ) : ?>
121                <div class="wrap">
122                    <div class="jetpack-offline-notice">
123                        <p class="jetpack-offline-notice__title"><?php esc_html_e( "You're working in Offline Mode", 'jetpack' ); ?></p>
124                        <p class="jetpack-offline-notice__text">
125                            <?php esc_html_e( 'Jetpack is running in Offline Mode, so features that need a connection to WordPress.com are paused for now â€” this is completely normal for local and development sites. Go ahead and activate or configure any of the modules below that work offline.', 'jetpack' ); ?>
126                            <a href="<?php echo esc_url( Redirect::get_url( 'jetpack-support-development-mode' ) ); ?>" target="_blank" rel="noopener noreferrer"><?php esc_html_e( 'Learn more about Offline Mode.', 'jetpack' ); ?></a>
127                        </p>
128                    </div>
129                </div>
130            <?php endif; ?>
131            <div class="wrap">
132                <div class="manage-left">
133                    <div class="jetpack-modules-card">
134                        <div class="jetpack-modules-card__bulk">
135                            <label class="jetpack-modules-card__checkall">
136                                <input type="checkbox" class="checkall" />
137                                <span><?php esc_html_e( 'Select all', 'jetpack' ); ?></span>
138                            </label>
139                            <?php $list_table->unprotected_display_tablenav( 'top' ); ?>
140                            <span class="filter-search">
141                                <button type="button" class="button"><?php esc_html_e( 'Filter', 'jetpack' ); ?></button>
142                            </span>
143                        </div>
144                        <form class="jetpack-modules-list-table-form" onsubmit="return false;">
145                            <table class="<?php echo esc_attr( implode( ' ', $list_table->get_table_classes() ) ); ?> jetpack-modules">
146                                <tbody id="the-list">
147                                <?php $list_table->display_rows_or_placeholder(); ?>
148                                </tbody>
149                            </table>
150                        </form>
151                    </div>
152                </div>
153                <div class="manage-right">
154                    <div class="bumper">
155                        <form class="navbar-form" role="search">
156                            <input type="hidden" name="page" value="jetpack_modules" />
157                            <?php $list_table->search_box( __( 'Search modules…', 'jetpack' ), 'srch-term' ); ?>
158                            <?php if ( $is_offline_mode ) : ?>
159                                <p><?php esc_html_e( 'Available in offline mode', 'jetpack' ); ?></p>
160                                <span class="dops-button-group button-group availability-filter">
161                                    <button type="button" class="dops-button is-compact button
162                                    <?php echo 'all' === $current_availability ? 'active' : ''; ?>
163                                        " data-availability="all"><?php esc_html_e( 'All', 'jetpack' ); ?></button>
164                                    <button type="button" class="dops-button button
165                                    <?php echo 'all' === $current_availability ? '' : 'active'; ?>
166                                    " data-availability="hide-unavailable"><?php esc_html_e( 'Hide unavailable', 'jetpack' ); ?></button>
167                                </span>
168                            <?php endif; ?>
169                            <p><?php esc_html_e( 'State', 'jetpack' ); ?></p>
170                            <span class="dops-button-group button-group module-filter filter-state">
171                                <button type="button" class="dops-button is-compact button
172                                <?php // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- This is view logic.
173                                if ( empty( $_GET['activated'] ) ) {
174                                    echo 'active';
175                                }
176                                ?>
177                                    ">
178                                <?php esc_html_e( 'All', 'jetpack' ); ?></button>
179                                <button type="button" class="dops-button button
180                                <?php // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- This is view logic.
181                                if ( ! empty( $_GET['activated'] ) && 'true' === $_GET['activated'] ) {
182                                    echo 'active';
183                                }
184                                ?>
185                                " data-filter-by="activated" data-filter-value="true"><?php esc_html_e( 'Active', 'jetpack' ); ?></button>
186                                <button type="button" class="dops-button button
187                                <?php // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- This is view logic.
188                                if ( ! empty( $_GET['activated'] ) && 'false' === $_GET['activated'] ) {
189                                    echo 'active';
190                                }
191                                ?>
192                                " data-filter-by="activated" data-filter-value="false"><?php esc_html_e( 'Inactive', 'jetpack' ); ?></button>
193                            </span>
194                            <p><?php esc_html_e( 'Purpose', 'jetpack' ); ?></p>
195                            <ul class="purpose-filter">
196                                <li class="all<?php echo '' === $current_group ? ' current' : ''; ?>"><a href="#" data-group=""><?php esc_html_e( 'All', 'jetpack' ); ?></a> <span class="count"></span></li>
197                                <?php
198                                foreach ( Jetpack_Modules_List_Table::PRODUCT_GROUP_ORDER as $group_slug ) {
199                                    printf(
200                                        '<li class="%1$s%2$s"><a href="#" data-group="%1$s">%3$s</a> <span class="count"></span></li>',
201                                        esc_attr( $group_slug ),
202                                        $group_slug === $current_group ? ' current' : '',
203                                        esc_html( Jetpack_Modules_List_Table::get_product_group_name( $group_slug ) )
204                                    );
205                                }
206                                ?>
207                            </ul>
208                            <p><?php esc_html_e( 'Tags', 'jetpack' ); ?></p>
209                            <?php $list_table->views(); ?>
210                        </form>
211                    </div>
212                </div>
213            </div>
214        </div><!-- /.jetpack-module-list -->
215        <?php
216
217        $tracking = new Tracking();
218        $tracking->record_user_event( 'wpa_page_view', array( 'path' => 'old_settings' ) );
219    }
220
221    /**
222     * Load styles for static page.
223     *
224     * @since 4.3.0
225     */
226    public function additional_styles() {
227        Jetpack_Admin_Page::load_wrapper_styles();
228    }
229
230    /**
231     * Javascript logic specific to the list table
232     */
233    public function page_admin_scripts() {
234        wp_enqueue_script(
235            'jetpack-admin-js',
236            Assets::get_file_url_for_environment( '_inc/build/jetpack-admin.min.js', '_inc/jetpack-admin.js' ),
237            array( 'jquery' ),
238            JETPACK__VERSION,
239            true
240        );
241    }
242}