PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.3-a.1
Jetpack – WP Security, Backup, Speed, & Growth v16.3-a.1
16.3-a.3 16.3-a.1 16.2 16.2-beta 12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 All 504 releases
← All changes | _inc/lib/admin-pages/class.jetpack-settings-page.php +95 -48 12.5.2 → 16.3-a.1 View file →
@@ -1,9 +1,16 @@
1 1 <?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2 2
3 +use Automattic\Jetpack\Admin_UI\Admin_Menu;
3 4 use Automattic\Jetpack\Assets;
5 +use Automattic\Jetpack\Redirect;
6 +use Automattic\Jetpack\Status;
4 7 use Automattic\Jetpack\Tracking;
5 8
9 +if ( ! defined( 'ABSPATH' ) ) {
10 + exit( 0 );
11 +}
12 +
6 13 require_once __DIR__ . '/class.jetpack-admin-page.php';
7 14 require_once JETPACK__PLUGIN_DIR . 'class.jetpack-modules-list-table.php';
8 15
9 16 /**
@@ -29,8 +36,26 @@
29 36 /**
30 37 * Adds the Settings sub menu.
31 38 */
32 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 + return Admin_Menu::add_menu(
49 + __( 'Jetpack Settings', 'jetpack' ),
50 + __( 'Modules', 'jetpack' ),
51 + 'jetpack_manage_modules',
52 + 'jetpack_modules',
53 + array( $this, 'render' ),
54 + Admin_Menu::POSITION_FIRST_FALLBACK
55 + );
56 + }
57 +
33 58 return add_submenu_page(
34 59 '',
35 60 __( 'Jetpack Settings', 'jetpack' ),
36 61 __( 'Settings', 'jetpack' ),
@@ -46,8 +71,17 @@
46 71 */
47 72 public function page_render() {
48 73 $list_table = new Jetpack_Modules_List_Table();
49 74
75 + // Currently selected product group filter (used to highlight the active View button).
76 + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- This is view logic.
77 + $current_group = isset( $_GET['product_group'] ) ? sanitize_text_field( wp_unslash( $_GET['product_group'] ) ) : '';
78 +
79 + $is_offline_mode = ( new Status() )->is_offline_mode();
80 + // Currently selected offline-availability filter (only meaningful in Offline Mode).
81 + // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- This is view logic.
82 + $current_availability = isset( $_GET['offline_available'] ) ? sanitize_text_field( wp_unslash( $_GET['offline_available'] ) ) : '';
83 +
50 84 // We have static.html so let's continue trying to fetch the others.
51 85 $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.
52 86 $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.
53 87
@@ -78,39 +112,62 @@
78 112 }
79 113 echo $noscript_notice; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
80 114 ?>
81 115
116 + <!-- Core relocates other plugins' notices to just after this marker. -->
117 + <div class="wrap"><div class="wp-header-end"></div></div>
82 118 <div class="jetpack-module-list">
119 + <?php if ( $is_offline_mode ) : ?>
120 + <div class="wrap">
121 + <div class="jetpack-offline-notice">
122 + <p class="jetpack-offline-notice__title"><?php esc_html_e( "You're working in Offline Mode", 'jetpack' ); ?></p>
123 + <p class="jetpack-offline-notice__text">
124 + <?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' ); ?>
125 + <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>
126 + </p>
127 + </div>
128 + </div>
129 + <?php endif; ?>
83 130 <div class="wrap">
84 - <div class="manage-left jp-static-block">
85 - <table class="table table-bordered fixed-top jetpack-modules">
86 - <thead>
87 - <tr>
88 - <th class="check-column"><input type="checkbox" class="checkall"></th>
89 - <th colspan="2">
90 - <?php $list_table->unprotected_display_tablenav( 'top' ); ?>
91 - <span class="filter-search">
92 - <button type="button" class="button">Filter</button>
93 - </span>
94 - </th>
95 - </tr>
96 - </thead>
97 - </table>
98 - <form class="jetpack-modules-list-table-form" onsubmit="return false;">
99 - <table class="<?php echo esc_attr( implode( ' ', $list_table->get_table_classes() ) ); ?>">
100 - <tbody id="the-list">
101 - <?php $list_table->display_rows_or_placeholder(); ?>
102 - </tbody>
103 - </table>
104 - </form>
131 + <div class="manage-left">
132 + <div class="jetpack-modules-card">
133 + <div class="jetpack-modules-card__bulk">
134 + <label class="jetpack-modules-card__checkall">
135 + <input type="checkbox" class="checkall" />
136 + <span><?php esc_html_e( 'Select all', 'jetpack' ); ?></span>
137 + </label>
138 + <?php $list_table->unprotected_display_tablenav( 'top' ); ?>
139 + <span class="filter-search">
140 + <button type="button" class="button"><?php esc_html_e( 'Filter', 'jetpack' ); ?></button>
141 + </span>
142 + </div>
143 + <form class="jetpack-modules-list-table-form" onsubmit="return false;">
144 + <table class="<?php echo esc_attr( implode( ' ', $list_table->get_table_classes() ) ); ?> jetpack-modules">
145 + <tbody id="the-list">
146 + <?php $list_table->display_rows_or_placeholder(); ?>
147 + </tbody>
148 + </table>
149 + </form>
150 + </div>
105 151 </div>
106 152 <div class="manage-right">
107 153 <div class="bumper">
108 154 <form class="navbar-form" role="search">
109 155 <input type="hidden" name="page" value="jetpack_modules" />
110 - <?php $list_table->search_box( __( 'Search', 'jetpack' ), 'srch-term' ); ?>
111 - <p><?php esc_html_e( 'View', 'jetpack' ); ?></p>
112 - <span class="dops-button-group button-group filter-active">
156 + <?php $list_table->search_box( __( 'Search modules…', 'jetpack' ), 'srch-term' ); ?>
157 + <?php if ( $is_offline_mode ) : ?>
158 + <p><?php esc_html_e( 'Available in offline mode', 'jetpack' ); ?></p>
159 + <span class="dops-button-group button-group availability-filter">
160 + <button type="button" class="dops-button is-compact button
161 + <?php echo 'all' === $current_availability ? 'active' : ''; ?>
162 + " data-availability="all"><?php esc_html_e( 'All', 'jetpack' ); ?></button>
163 + <button type="button" class="dops-button button
164 + <?php echo 'all' === $current_availability ? '' : 'active'; ?>
165 + " data-availability="hide-unavailable"><?php esc_html_e( 'Hide unavailable', 'jetpack' ); ?></button>
166 + </span>
167 + <?php endif; ?>
168 + <p><?php esc_html_e( 'State', 'jetpack' ); ?></p>
169 + <span class="dops-button-group button-group module-filter filter-state">
113 170 <button type="button" class="dops-button is-compact button
114 171 <?php // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- This is view logic.
115 172 if ( empty( $_GET['activated'] ) ) {
116 173 echo 'active';
@@ -132,39 +189,29 @@
132 189 }
133 190 ?>
134 191 " data-filter-by="activated" data-filter-value="false"><?php esc_html_e( 'Inactive', 'jetpack' ); ?></button>
135 192 </span>
136 - <p><?php esc_html_e( 'Sort by', 'jetpack' ); ?></p>
137 - <span class="dops-button-group button-group sort">
138 - <button type="button" class="dops-button button
139 - <?php // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- This is view logic.
140 - if ( empty( $_GET['sort_by'] ) ) {
141 - echo 'active';
193 + <p><?php esc_html_e( 'Purpose', 'jetpack' ); ?></p>
194 + <ul class="purpose-filter">
195 + <li class="all<?php echo '' === $current_group ? ' current' : ''; ?>"><a href="#" data-group=""><?php esc_html_e( 'All', 'jetpack' ); ?></a> <span class="count"></span></li>
196 + <?php
197 + foreach ( Jetpack_Modules_List_Table::PRODUCT_GROUP_ORDER as $group_slug ) {
198 + printf(
199 + '<li class="%1$s%2$s"><a href="#" data-group="%1$s">%3$s</a> <span class="count"></span></li>',
200 + esc_attr( $group_slug ),
201 + $group_slug === $current_group ? ' current' : '',
202 + esc_html( Jetpack_Modules_List_Table::get_product_group_name( $group_slug ) )
203 + );
142 204 }
143 205 ?>
144 - " data-sort-by="name"><?php esc_html_e( 'Alphabetical', 'jetpack' ); ?></button>
145 - <button type="button" class="dops-button button
146 - <?php // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- This is view logic.
147 - if ( ! empty( $_GET['sort_by'] ) && 'introduced' === $_GET['sort_by'] ) {
148 - echo 'active';
149 - }
150 - ?>
151 - " data-sort-by="introduced" data-sort-order="reverse"><?php esc_html_e( 'Newest', 'jetpack' ); ?></button>
152 - <button type="button" class="dops-button button
153 - <?php // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- This is view logic.
154 - if ( ! empty( $_GET['sort_by'] ) && 'sort' === $_GET['sort_by'] ) {
155 - echo 'active';
156 - }
157 - ?>
158 - " data-sort-by="sort"><?php esc_html_e( 'Popular', 'jetpack' ); ?></button>
159 - </span>
160 - <p><?php esc_html_e( 'Show', 'jetpack' ); ?></p>
206 + </ul>
207 + <p><?php esc_html_e( 'Tags', 'jetpack' ); ?></p>
161 208 <?php $list_table->views(); ?>
162 209 </form>
163 210 </div>
164 211 </div>
165 212 </div>
166 - </div><!-- /.content -->
213 + </div><!-- /.jetpack-module-list -->
167 214 <?php
168 215
169 216 $tracking = new Tracking();
170 217 $tracking->record_user_event( 'wpa_page_view', array( 'path' => 'old_settings' ) );