PluginProbe
MainWP Dashboard: Self-hosted WordPress Management for Agencies / 6.2.1
MainWP Dashboard: Self-hosted WordPress Management for Agencies v6.2.1
6.2.3 6.2.2 6.2.1 6.2 6.1.8 6.1.7 6.1.6 6.1.5 6.1.4 6.1.3 6.1.2 6.1.1 6.1 6.0.12 6.0.11 4.6.0.1 5.0 5.0.1 5.0.2 5.0.3 5.0.3.1 5.0.3.2 5.1 5.1.1 5.2 All 156 releases
← All changes | widgets/widget-mainwp-connection-status.php +761 -529 5.0.1 → 6.2.1 View file →
@@ -1,9 +1,9 @@
1 1 <?php
2 2 /**
3 3 * MainWP Connection Status
4 4 *
5 - * Build the MainWP Overview page Connection Status Widget.
5 + * Build the MainWP Operations page Connection Status Widget.
6 6 *
7 7 * @package MainWP/Dashboard
8 8 */
9 9
@@ -8,573 +8,805 @@
8 8 */
9 9
10 10 namespace MainWP\Dashboard;
11 11
12 +// Exit if accessed directly.
13 +if ( ! defined( 'ABSPATH' ) ) {
14 + exit;
15 +}
16 +
12 17 /**
13 18 * Class MainWP_Connection_Status
14 19 *
15 20 * Build the Connection Status Widget.
16 21 */
17 -class MainWP_Connection_Status {
22 +class MainWP_Connection_Status { // phpcs:ignore Generic.Classes.OpeningBraceSameLine.ContentAfterBrace -- NOSONAR.
18 23
19 - /**
20 - * Method get_class_name()
21 - *
22 - * @return string __CLASS__ Class Name
23 - */
24 - public static function get_class_name() {
25 - return __CLASS__;
26 - }
24 + /**
25 + * Public variable to hold Items information.
26 + *
27 + * @var array
28 + */
29 + public $items;
27 30
28 - /**
29 - * Method render()
30 - *
31 - * @return mixed render_sites()
32 - */
33 - public static function render() {
34 - self::render_sites();
35 - }
31 + /**
32 + * Public variable to hold total items number.
33 + *
34 + * @var integer
35 + */
36 + public $total_items;
36 37
37 - /**
38 - * Method render_sites()
39 - *
40 - * Build the Connection Status Widget
41 - * Displays $SYNCERRORS|$UP|$ALL.
42 - *
43 - * @uses \MainWP\Dashboard\MainWP_DB::query()
44 - * @uses \MainWP\Dashboard\MainWP_DB::get_sql_websites_by_id()
45 - * @uses \MainWP\Dashboard\MainWP_DB::get_websites_by_id()
46 - * @uses \MainWP\Dashboard\MainWP_DB::get_sql_search_websites_for_current_user()
47 - * @uses \MainWP\Dashboard\MainWP_DB::fetch_object()
48 - * @uses \MainWP\Dashboard\MainWP_DB::data_seek()
49 - * @uses \MainWP\Dashboard\MainWP_DB::free_result()
50 - * @uses \MainWP\Dashboard\MainWP_System_Utility::get_current_wpid()
51 - * @uses \MainWP\Dashboard\MainWP_Utility::format_timestamp()
52 - * @uses \MainWP\Dashboard\MainWP_Utility::get_timestamp()
53 - */
54 - public static function render_sites() { // phpcs:ignore -- current complexity required to achieve desired results. Pull request solutions appreciated.
55 - $current_wpid = MainWP_System_Utility::get_current_wpid();
38 + /**
39 + * Private static variable to hold the single instance of the class.
40 + *
41 + * @static
42 + *
43 + * @var mixed Default null
44 + */
45 + private static $instance = null;
56 46
57 - if ( $current_wpid ) {
58 - $sql = MainWP_DB::instance()->get_sql_website_by_id( $current_wpid );
59 - } else {
60 - $sql = MainWP_DB::instance()->get_sql_websites_for_current_user();
61 - }
47 + /**
48 + * Method instance()
49 + *
50 + * Return public static instance.
51 + *
52 + * @static
53 + * @return self
54 + */
55 + public static function instance() {
56 + if ( null === static::$instance ) {
57 + static::$instance = new self();
58 + }
59 + return static::$instance;
60 + }
62 61
63 - $websites = MainWP_DB::instance()->query( $sql );
64 62
65 - $count_connected = 0;
66 - $count_disconnected = 0;
63 + /**
64 + * Method get_class_name()
65 + *
66 + * @return string __CLASS__ Class Name
67 + */
68 + public static function get_class_name() {
69 + return __CLASS__;
70 + }
67 71
68 - // Loop 3 times.
69 - $SYNCERRORS = 0;
70 - $UP = 1;
71 - $ALL = 2;
72 + /**
73 + * Method render()
74 + *
75 + * @return mixed render_sites()
76 + */
77 + public static function render() {
78 + static::render_widget_content();
79 + }
72 80
73 - $html_online_sites = '';
74 - $html_other_sites = '';
75 - $html_all_sites = '';
81 + /**
82 + * Method render_widget_content()
83 + *
84 + * Build the Connection Status Widget
85 + * Displays $SYNCERRORS|$UP|$ALL.
86 + *
87 + * @uses \MainWP\Dashboard\MainWP_DB::query()
88 + * @uses \MainWP\Dashboard\MainWP_DB::get_sql_websites_by_id()
89 + * @uses \MainWP\Dashboard\MainWP_DB::get_websites_by_id()
90 + * @uses \MainWP\Dashboard\MainWP_DB::get_sql_search_websites_for_current_user()
91 + * @uses \MainWP\Dashboard\MainWP_DB::fetch_object()
92 + * @uses \MainWP\Dashboard\MainWP_DB::data_seek()
93 + * @uses \MainWP\Dashboard\MainWP_DB::free_result()
94 + * @uses \MainWP\Dashboard\MainWP_Utility::format_timestamp()
95 + * @uses \MainWP\Dashboard\MainWP_Utility::get_timestamp()
96 + */
97 + public static function render_widget_content() { // phpcs:ignore -- NOSONAR - current complexity required to achieve desired results. Pull request solutions appreciated.
76 98
77 - $disconnect_site_ids = array();
99 + $counts = MainWP_DB::instance()->get_sites_connections_status();
78 100
79 - for ( $j = 0; $j < 3; $j++ ) {
80 - MainWP_DB::data_seek( $websites, 0 );
81 - while ( $websites && ( $website = MainWP_DB::fetch_object( $websites ) ) ) {
82 - if ( empty( $website ) ) {
83 - continue;
84 - }
101 + if ( ! is_array( $counts ) ) {
102 + $counts = array();
103 + }
85 104
86 - $hasSyncErrors = ( '' !== $website->sync_errors );
87 - $isUp = ! $hasSyncErrors;
105 + $count_connected = ! empty( $counts['connected_sites'] ) ? (int) $counts['connected_sites'] : 0;
106 + $count_disconnected = ! empty( $counts['disconnected_sites'] ) ? (int) $counts['disconnected_sites'] : 0;
88 107
89 - if ( $j !== $ALL ) {
90 - if ( $j === $SYNCERRORS ) {
91 - if ( ! $hasSyncErrors ) {
92 - continue;
93 - }
94 - }
95 - if ( $j === $UP ) {
96 - if ( ! $isUp ) {
97 - continue;
98 - }
99 - }
100 - }
108 + static::render_content( $count_connected, $count_disconnected );
101 109
102 - $lastSyncTime = ! empty( $website->dtsSync ) ? MainWP_Utility::format_timestamp( MainWP_Utility::get_timestamp( $website->dtsSync ) ) : '';
110 + MainWP_UI::render_modal_reconnect();
111 + }
103 112
104 - ob_start();
113 + /**
114 + * The renders the MainWP Operations page Connection Status Widget Header and Drop down Box.
115 + *
116 + * @param int $count_connected Number of connected sites.
117 + * @param int $count_disconnected Number of disconnected sites.
118 + */
119 + public static function render_content( $count_connected, $count_disconnected ) {
120 + ?>
121 + <div class="mainwp-widget-header">
122 + <div class="ui grid">
123 + <div class="twelve wide column">
124 + <h2 class="ui header handle-drag">
125 + <?php
126 + /**
127 + * Filter: mainwp_connection_status_widget_title
128 + *
129 + * Filters the Connection Status widget title text.
130 + *
131 + * @since 4.1
132 + */
133 + echo esc_html( apply_filters( 'mainwp_connection_status_widget_title', esc_html__( 'Connection Status', 'mainwp' ) ) );
134 + ?>
135 + <div class="sub header"><?php esc_html_e( 'Child sites connection status', 'mainwp' ); ?></div>
136 + </h2>
137 + </div>
105 138
106 - if ( $j === $ALL ) {
107 - self::render_all_item( $website, $lastSyncTime, $hasSyncErrors );
108 - } elseif ( $j === $UP ) {
109 - self::render_up_item( $website, $lastSyncTime );
110 - } else {
111 - self::render_down_item( $website, $lastSyncTime );
112 - }
139 + <div class="four wide column right aligned">
140 + <div id="widget-connect-status-dropdown-selector" class="ui dropdown top right tiny pointing not-auto-init mainwp-dropdown-tab">
141 + <i class="vertical ellipsis icon"></i>
142 + <div class="menu">
143 + <a class="item" data-tab="all-sites" data-value="all-sites" data-position="left center" data-inverted="" data-tooltip="<?php esc_attr_e( 'View all child sites', 'mainwp' ); ?>" href="#"><?php esc_html_e( 'All Sites', 'mainwp' ); ?></a>
144 + <a class="item" data-tab="connected" data-value="connected" data-position="left center" data-inverted="" data-tooltip="<?php esc_attr_e( 'View all connected child sites', 'mainwp' ); ?>" href="#"><?php esc_html_e( 'Connected', 'mainwp' ); ?></a>
145 + <a class="item" data-tab="disconnected" data-value="disconnected" data-position="left center" data-inverted="" data-tooltip="<?php esc_attr_e( 'View all disconnected child sites', 'mainwp' ); ?>" href="#"><?php esc_html_e( 'Disconnected', 'mainwp' ); ?></a>
146 + <a class="item" data-tab="no-sites" data-value="no-sites" data-inverted="" data-position="left center" data-tooltip="<?php esc_attr_e( 'Hide the child sites list', 'mainwp' ); ?>" href="#"><?php esc_html_e( 'Hide Details', 'mainwp' ); ?></a>
147 + </div>
148 + </div>
149 + </div>
150 + </div>
151 + <div>
152 + <?php static::render_multi_status( $count_connected, $count_disconnected ); ?>
153 + </div>
154 + </div>
113 155
114 - /**
115 - * Action: mainwp_connection_status_widget_bottom
116 - *
117 - * Fires at the bottom of the Connection Status widget.
118 - *
119 - * @since 4.1
120 - */
121 - do_action( 'mainwp_connection_status_widget_bottom' );
156 + <?php
157 + /**
158 + * Action: mainwp_connection_status_widget_top
159 + *
160 + * Fires at the top of the Connection Status widget.
161 + *
162 + * @since 4.1
163 + */
164 + do_action( 'mainwp_connection_status_widget_top' );
165 + ?>
122 166
123 - $output = ob_get_clean();
167 + <div class="mainwp-scrolly-overflow" id="widget-connections-status-details">
168 + <?php
169 + foreach ( array( 'all-sites', 'connected', 'disconnected' ) as $tab ) {
170 + static::render_tab( $tab );
171 + }
172 + ?>
173 + <div class="ui tab" data-tab="no-sites"></div>
174 + </div>
175 + <div class="ui two column grid mainwp-widget-footer">
176 + <div class="left aligned middle aligned column">
177 + <?php
178 + /**
179 + * Action: mainwp_connection_status_widget_footer_left
180 + *
181 + * Fires in the left column of the Connection status widget
182 + *
183 + * @since 5.3
184 + */
185 + do_action( 'mainwp_connection_status_widget_footer_left' )
186 + ?>
187 + </div>
188 + <div class="right aligned middle aligned column">
189 + <?php
190 + /**
191 + * Action: mainwp_connection_status_widget_footer_right
192 + *
193 + * Fires in the right column of the Connection status widget
194 + *
195 + * @since 5.3
196 + */
197 + do_action( 'mainwp_connection_status_widget_footer_right' )
198 + ?>
199 + </div>
200 + </div>
201 + <script type="text/javascript">
124 202
125 - if ( $j === $ALL ) {
126 - $html_all_sites .= $output;
127 - } elseif ( $j === $UP ) {
128 - $html_online_sites .= $output;
129 - ++$count_connected;
130 - } elseif ( ! in_array( $website->id, $disconnect_site_ids ) ) {
131 - $disconnect_site_ids[] = $website->id;
132 - $html_other_sites .= $output;
133 - ++$count_disconnected;
134 - }
135 - }
136 - }
203 + let mainwp_widgets_connections_status_get_table = function(tab){
204 + switch(tab){
205 + case 'all-sites':
206 + return $widget_connections_status_table_all_sites;
207 + case 'connected':
208 + return $widget_connections_status_table_connected;
209 + case 'disconnected':
210 + return $widget_connections_status_table_disconnected;
211 + default:
212 + return null;
213 + }
214 + };
137 215
138 - MainWP_DB::free_result( $websites );
216 + let mainwp_widgets_connections_status_tab_onchange = function( current_tab ){
217 + if( ! ['all-sites', 'connected', 'disconnected'].includes(current_tab) || jQuery('#widget-connections-status-details div[data-tab=' + current_tab +'][loaded-data="loaded"]').length > 0 ){
218 + return;
219 + }
220 + let current_page = jQuery('#widget-connections-status-details div[data-tab=' + current_tab + ']').attr('current-page');
221 + mainwp_widgets_connections_status_get_table(current_tab).ajax.reload();
222 + }
139 223
140 - self::render_status( $current_wpid );
224 + jQuery( document ).ready( function () {
225 + setTimeout(() => {
226 + jQuery( '#widget-connect-status-dropdown-selector' ).dropdown( {
227 + onChange: function( val ) {
228 + if ( typeof( Storage ) !== 'undefined' ) {
229 + localStorage.setItem( 'lsWidgetConnectStatusDropdownVal', val );
230 + mainwp_widgets_connections_status_tab_onchange( val );
231 + }
232 + }
233 + } );
234 + jQuery( '#widget-connect-status-dropdown-selector .menu .item' ).tab();
235 + if ( typeof( Storage ) !== "undefined" ) {
236 + let val = localStorage.getItem( 'lsWidgetConnectStatusDropdownVal' );
237 + if(!['all-sites', 'connected', 'disconnected', 'no-sites'].includes(val)) {
238 + val = 'all-sites';
239 + }
240 + jQuery( '#widget-connect-status-dropdown-selector' ).dropdown( 'set selected',val );
241 + jQuery( '#widget-connect-status-dropdown-selector' ).closest( '.mainwp-widget' ).find( 'div.ui.tab' ).removeClass( 'active');
242 + jQuery( '#widget-connect-status-dropdown-selector' ).closest( '.mainwp-widget' ).find( 'div[data-tab="' + val + '"]' ).addClass( 'active' );
243 + mainwp_widgets_connections_status_tab_onchange( val );
244 + }
245 + }, 1000);
246 + } );
247 + </script>
248 + <?php
249 + }
141 250
142 - if ( empty( $current_wpid ) ) {
251 + /**
252 + * The renders the connections status tab.
253 + *
254 + * @param string $tab The tab.
255 + */
256 + public static function render_tab( $tab ) {
257 + $sites_per_page = 25;
258 + $tbl_id = 'widget-connections-status-details-table-' . $tab;
143 259
144 - self::render_multi_status( $count_connected, $count_disconnected );
145 - } else {
146 - // Get site by ID $current_wpid.
147 - $site = MainWP_DB::instance()->get_website_by_id( $current_wpid );
148 - self::render_current_status( $site, $count_connected );
149 - }
260 + if ( 'all-sites' === $tab ) {
261 + $hook_before = 'mainwp_connection_status_before_all_sites_list';
262 + $hook_after = 'mainwp_connection_status_after_all_sites_list';
263 + } elseif ( 'connected' === $tab ) {
264 + $hook_before = 'mainwp_connection_status_before_connected_sites_list';
265 + $hook_after = 'mainwp_connection_status_after_connected_sites_list';
266 + } else {
267 + $hook_before = 'mainwp_connection_status_before_disconnected_sites_list';
268 + $hook_after = 'mainwp_connection_status_after_disconnected_sites_list';
269 + }
150 270
151 - self::render_details( $html_all_sites, $html_online_sites, $html_other_sites );
152 - }
271 + ?>
153 272
154 - /**
155 - * The renders the MainWP Overview page Connection Status Widget Header and Drop down Box.
156 - *
157 - * @param mixed $current_wpid Current Website ID.
158 - */
159 - public static function render_status( $current_wpid ) {
160 - ?>
161 - <div class="ui grid mainwp-widget-header">
162 - <div class="twelve wide column">
163 - <h3 class="ui header handle-drag">
164 - <?php
165 - /**
166 - * Filter: mainwp_connection_status_widget_title
167 - *
168 - * Filters the Connection Status widget title text.
169 - *
170 - * @since 4.1
171 - */
172 - echo esc_html( apply_filters( 'mainwp_connection_status_widget_title', esc_html__( 'Connection Status', 'mainwp' ) ) );
173 - ?>
174 - <div class="sub header"><?php esc_html_e( 'Child sites connection status', 'mainwp' ); ?></div>
175 - </h3>
176 - </div>
177 - <?php if ( empty( $current_wpid ) ) { ?>
178 - <div class="four wide column right aligned">
179 - <div id="widget-connect-status-dropdown-selector" class="ui dropdown top right pointing not-auto-init mainwp-dropdown-tab">
180 - <div class="text"><?php esc_html_e( 'All Sites', 'mainwp' ); ?></div>
181 - <i class="dropdown icon"></i>
182 - <div class="menu">
183 - <a class="item" data-tab="all-sites" data-value="all-sites" data-position="left center" data-inverted="" data-tooltip="<?php esc_attr_e( 'See all child sites', 'mainwp' ); ?>" href="#"><?php esc_html_e( 'All Sites', 'mainwp' ); ?></a>
184 - <a class="item" data-tab="connected" data-value="connected" data-position="left center" data-inverted="" data-tooltip="<?php esc_attr_e( 'See all connected child sites', 'mainwp' ); ?>" href="#"><?php esc_html_e( 'Connected', 'mainwp' ); ?></a>
185 - <a class="item" data-tab="disconnected" data-value="disconnected" data-position="left center" data-inverted="" data-tooltip="<?php esc_attr_e( 'See all disconnected child sites', 'mainwp' ); ?>" href="#"><?php esc_html_e( 'Disconnected', 'mainwp' ); ?></a>
186 - <a class="item" data-tab="no-sites" data-value="no-sites" data-inverted="" data-position="left center" data-tooltip="<?php esc_attr_e( 'Hide the child sites list', 'mainwp' ); ?>" href="#"><?php esc_html_e( 'Hide Details', 'mainwp' ); ?></a>
187 - </div>
188 - </div>
189 - </div>
273 + <div class="ui tab" data-tab="<?php echo esc_attr( $tab ); ?>" loaded-data="no" current-page="1">
274 + <div class="ui message widget-connections-status-message-zone" style="display:none;" ></div>
190 275
191 - <script type="text/javascript">
192 - jQuery( document ).ready( function () {
193 - jQuery( '#widget-connect-status-dropdown-selector' ).dropdown( {
194 - onChange: function( val ) {
195 - if ( typeof( Storage ) !== 'undefined' ) {
196 - localStorage.setItem( 'lsWidgetConnectStatusDropdownVal', val );
197 - }
198 - }
199 - } );
200 - if ( typeof( Storage ) !== "undefined" ) {
201 - if ( val = localStorage.getItem( 'lsWidgetConnectStatusDropdownVal' ) ) {
202 - jQuery( '#widget-connect-status-dropdown-selector' ).dropdown( 'set selected',val );
203 - jQuery( '#widget-connect-status-dropdown-selector' ).closest( '.mainwp-widget' ).find( 'div[data-tab="' + val + '"]' ).addClass( 'active' );
204 - }
205 - }
206 - } );
207 - </script>
276 + <?php
277 + /**
278 + * Fires before the list of all sites in the connection status widgets
279 + *
280 + * @since 4.1
281 + */
282 + do_action( $hook_before );
283 + ?>
284 + <div class="widget-connections-status-details-table-list-container">
285 + <table id="<?php echo esc_attr( $tbl_id ); ?>" style="width:100%" class="ui single line unstackable table">
286 + <thead>
287 + <tr><?php static::print_column_headers(); ?></tr>
288 + </thead>
289 + </table>
290 + </div>
291 + <?php
292 + /**
293 + * Fires after the list of all sites in the connection status widgets
294 + *
295 + * @since 4.1
296 + */
297 + do_action( $hook_after );
298 + ?>
299 + </div>
300 + <?php
208 301
209 - <?php } ?>
210 - </div>
211 - <?php
212 - /**
213 - * Action: mainwp_connection_status_widget_top
214 - *
215 - * Fires at the top of the Connection Status widget.
216 - *
217 - * @since 4.1
218 - */
219 - do_action( 'mainwp_connection_status_widget_top' );
220 - }
302 + $table_features = array(
303 + 'searching' => 'false',
304 + 'paging' => 'true',
305 + 'pagingType' => 'full_numbers',
306 + 'info' => 'false',
307 + 'colReorder' => '{columns:":not(.check-column):not(:last-child)"}',
308 + 'stateSave' => 'false',
309 + 'stateDuration' => '60 * 60 * 24 * 30',
310 + 'order' => '[]',
311 + 'scrollX' => 'true',
312 + 'responsive' => 'true',
313 + 'fixedColumns' => '',
314 + 'searchDelay' => 350,
315 + 'numbers' => 3,
316 + );
221 317
222 - /**
223 - * Render the MainWP Overview page Conection Status Widget Content.
224 - *
225 - * @param mixed $site Site list.
226 - * @param mixed $count_connected Connection Count.
227 - */
228 - public static function render_current_status( $site, $count_connected ) {
229 - /**
230 - * Action: mainwp_connection_status_widget_single_top
231 - *
232 - * Fires at the top of the Connection Status widget.
233 - *
234 - * @param object $site Object containing the child site info.
235 - *
236 - * @since 4.1
237 - */
238 - do_action( 'mainwp_connection_status_widget_single_top', $site );
239 - if ( $count_connected > 0 ) :
240 - ?>
241 - <div class="ui grid stackable">
242 - <div class="fourteen wide column">
243 - <h2 class="ui header">
244 - <?php if ( '1' === $site->suspended ) { ?>
245 - <i class="pause yellow circle icon"></i>
246 - <div class="content"><?php esc_html_e( 'Suspended', 'mainwp' ); ?></div>
247 - <?php } else { ?>
248 - <i class="green check icon"></i>
249 - <div class="content"><?php esc_html_e( 'Connected', 'mainwp' ); ?></div>
250 - <?php } ?>
251 - </h2>
252 - </div>
253 - <div class="column two wide center aligned">
254 - <div class="ui mini icon buttons">
255 - <a href="<?php echo esc_url( $site->url ); ?>" class="ui mini button" target="_blank" data-tooltip="<?php esc_html_e( 'Go to the site front page', 'mainwp' ); ?>" data-inverted=""><?php esc_html_e( 'Go to Site', 'mainwp' ); ?></a>
256 - <a href="<?php echo 'admin.php?page=SiteOpen&newWindow=yes&websiteid=' . intval( $site->id ); ?>&_opennonce=<?php echo esc_html( wp_create_nonce( 'mainwp-admin-nonce' ) ); ?>" class="ui mini button" target="_blank" data-tooltip="<?php esc_html_e( 'Go to the site WP Admin', 'mainwp' ); ?>" data-inverted=""><?php esc_html_e( ' Go to WP Admin', 'mainwp' ); ?></a>
257 - <a href="javascript:void(0)" class="ui button mini green" siteid="<?php echo intval( $site->id ); ?>" onClick="updatesoverview_wp_sync( '<?php echo intval( $site->id ); ?>' )" data-tooltip="Sync <?php echo esc_attr( stripslashes( $site->name ) ); ?> data." data-inverted=""><?php esc_html_e( 'Sync Data', 'mainwp' ); ?></a>
258 - </div>
259 - </div>
260 - </div>
261 - <?php else : ?>
262 - <div class="ui grid stackable mainwp_wp_sync" site_id="<?php echo intval( $site->id ); ?>">
263 - <div class="fourteen wide column">
264 - <h2 class="ui header">
265 - <i class="red unlink icon"></i>
266 - <div class="content"><?php esc_html_e( 'Disconnected', 'mainwp' ); ?></div>
267 - </h2>
268 - </div>
269 - <div class="column two wide center aligned ">
270 - <div class="ui mini icon buttons">
271 - <a href="<?php echo esc_url( $site->url ); ?>" class="ui mini button" target="_blank" data-tooltip="<?php esc_html_e( 'Go to the site front page', 'mainwp' ); ?>" data-inverted=""><?php esc_html_e( 'Go to Site', 'mainwp' ); ?></a>
272 - <a href="#" class="mainwp-updates-overview-reconnect-site ui mini green basic button" siteid="<?php echo intval( $site->id ); ?>" data-tooltip="Reconnect <?php echo esc_attr( stripslashes( $site->name ) ); ?>" data-inverted=""><?php esc_html_e( 'Reconnect', 'mainwp' ); ?></a>
273 - </div>
274 - </div>
275 - </div>
276 - <?php
277 - endif;
278 - /**
279 - * Action: mainwp_connection_status_widget_single_bottom
280 - *
281 - * Fires at the bottom of the Connection Status widget.
282 - *
283 - * @param object $site Object containing the child site info.
284 - *
285 - * @since 4.1
286 - */
287 - do_action( 'mainwp_connection_status_widget_single_bottom', $site );
288 - }
318 + $pages_length = array(
319 + 25 => '25',
320 + );
289 321
290 - /**
291 - * Render connection status summary section.
292 - *
293 - * @param int $count_connected Connected Count.
294 - * @param int $count_disconnected Disconnected Count.
295 - */
296 - public static function render_multi_status( $count_connected, $count_disconnected ) {
297 - $count_total = $count_connected + $count_disconnected;
298 - ?>
299 - <div class="ui two column stackable grid mainwp-widget-header">
300 - <div class="ui multiple progress" id="mainwp-site-status-progress" style="width:100%" data-total="<?php echo esc_attr( $count_total ); ?>" data-value="<?php echo esc_attr( $count_connected ) . ',' . esc_attr( $count_disconnected ); ?>">
301 - <div class="green bar"><div class="centered progress"></div></div>
302 - <div class="red bar"><div class="centered progress"></div></div>
303 - <div class="label">
304 - <a href="javascript:void(0);" onclick="jQuery( '#widget-connect-status-dropdown-selector' ).dropdown( 'set selected','connected' );jQuery( '#widget-connect-status-dropdown-selector' ).closest( '.mainwp-widget' ).find( 'div[data-tab=connected]' ).addClass( 'active' );jQuery( '#widget-connect-status-dropdown-selector' ).closest( '.mainwp-widget' ).find( 'div[data-tab=disconnected]' ).removeClass( 'active' );"><?php echo esc_html( $count_connected ) . ' Connected'; ?></a> - <a href="javascript:void(0);" onclick="jQuery( '#widget-connect-status-dropdown-selector' ).dropdown( 'set selected','disconnected' );jQuery( '#widget-connect-status-dropdown-selector' ).closest( '.mainwp-widget' ).find( 'div[data-tab=disconnected]' ).addClass( 'active' );jQuery( '#widget-connect-status-dropdown-selector' ).closest( '.mainwp-widget' ).find( 'div[data-tab=connected]' ).removeClass( 'active' );"><?php echo esc_html( $count_disconnected ) . ' Disconnected'; ?></a>
305 - </div>
306 - </div>
307 - </div>
308 - <script type="text/javascript">
309 - jQuery('#mainwp-site-status-progress').progress();
310 - </script>
311 - <?php
312 - }
322 + $pagelength_val = implode( ',', array_keys( $pages_length ) );
323 + $pagelength_title = implode( ',', array_values( $pages_length ) );
313 324
314 - /**
315 - * Render See All Sites List.
316 - *
317 - * @param mixed $html_all_sites All sites html.
318 - * @param mixed $html_online_sites Online sites html.
319 - * @param mixed $html_other_sites Other sites html.
320 - */
321 - public static function render_details( $html_all_sites, $html_online_sites, $html_other_sites ) {
322 - ?>
323 - <div class="mainwp-scrolly-overflow">
324 - <div class="ui tab" data-tab="all-sites">
325 - <?php
326 - /**
327 - * Action: mainwp_connection_status_before_all_sites_list
328 - *
329 - * Fires before the list of all sites in the connection status widgets
330 - *
331 - * @since 4.1
332 - */
333 - do_action( 'mainwp_connection_status_before_all_sites_list' )
334 - ?>
335 - <div class="ui middle aligned divided selection list">
336 - <?php echo $html_all_sites; // phpcs:ignore WordPress.Security.EscapeOutput ?>
337 - </div>
338 - <?php
339 - /**
340 - * Action: mainwp_connection_status_after_all_sites_list
341 - *
342 - * Fires after the list of all sites in the connection status widgets
343 - *
344 - * @since 4.1
345 - */
346 - do_action( 'mainwp_connection_status_after_all_sites_list' )
347 - ?>
348 - </div>
325 + ?>
326 + <script type="text/javascript">
327 + let $widget_connections_status_table_<?php echo esc_js( str_replace( '-', '_', $tab ) ); ?> = null;
328 + jQuery( document ).ready( function ($) {
329 + let responsive = true;
330 + if( jQuery( window ).width() > 1140 ) {
331 + responsive = false;
332 + }
333 + let manage_tbl_id = '#<?php echo esc_js( $tbl_id ); ?>';
334 + $widget_connections_status_table_<?php echo esc_js( str_replace( '-', '_', $tab ) ); ?> = jQuery( manage_tbl_id ).on( 'processing.dt', function ( e, settings, processing ) {
335 + jQuery( '#mainwp-loading-sites' ).css( 'display', processing ? 'block' : 'none' );
336 + if (!processing) {
337 + $( manage_tbl_id + ' .ui.dropdown' ).dropdown();
338 + }
339 + } ).DataTable( {
340 + "ajax": {
341 + "url": ajaxurl,
342 + "type": "POST",
343 + "data": function ( d ) {
344 + let data = mainwp_secure_data( {
345 + action: 'mainwp_widgets_connections_status_details_display_rows',
346 + current_tab: '<?php echo esc_js( $tab ); ?>',
347 + } );
348 + return $.extend( {}, d, data );
349 + },
350 + "dataSrc": function ( json ) {
351 + for ( let i=0, ien=json.data.length ; i < ien ; i++ ) {
352 + json.data[i].rowClass = json.rowsInfo[i].rowClass;
353 + json.data[i].site_id = json.rowsInfo[i].site_id;
354 + }
355 + return json.data;
356 + }
357 + },
358 + "layout": {
359 + "topStart": null,
360 + "topEnd": null,
361 + "bottomEnd": {
362 + "paging": {
363 + "numbers": <?php echo intval( $table_features['numbers'] ); ?>
364 + }
365 + }
366 + },
367 + 'responsive': responsive,
368 + 'deferLoading': 0,
369 + 'searching' : <?php echo esc_js( $table_features['searching'] ); ?>,
370 + "paging" : <?php echo esc_js( $table_features['paging'] ); ?>,
371 + "pagingType" : "<?php echo esc_js( $table_features['pagingType'] ); ?>",
372 + "info" : <?php echo esc_js( $table_features['info'] ); ?>,
373 + "colReorder" : <?php echo $table_features['colReorder']; // phpcs:ignore -- specical chars. ?>,
374 + "scrollX" : <?php echo esc_js( $table_features['scrollX'] ); ?>,
375 + "stateSave" : <?php echo esc_js( $table_features['stateSave'] ); ?>,
376 + "order" : <?php echo $table_features['order']; // phpcs:ignore -- specical chars. ?>,
377 + "fixedColumns" : <?php echo ! empty( $table_features['fixedColumns'] ) ? esc_js( $table_features['fixedColumns'] ) : '""'; ?>,
378 + "lengthMenu" : [ [<?php echo esc_js( $pagelength_val ); ?>], [<?php echo esc_js( $pagelength_title ); ?>] ],
379 + "serverSide": true,
380 + "pageLength": <?php echo intval( $sites_per_page ); ?>,
381 + "columnDefs": "[]",
382 + "columns": [{"data":"status_details"}],
383 + "language": {
384 + "emptyTable": "<?php echo esc_html__( 'No sites found.', 'mainwp' ); ?>"
385 + },
386 + "drawCallback": function( settings ) {
387 + setTimeout(() => {
388 + jQuery( manage_tbl_id + ' .ui.dropdown').dropdown();
389 + mainwp_datatable_fix_menu_overflow(manage_tbl_id, -60, -30);
390 + }, 1000);
391 + },
392 + "initComplete": function( settings, json ) {
393 + },
394 + rowCallback: function (row, data) {
395 + jQuery( row ).addClass(data.rowClass);
396 + },
397 + orderMulti: false,
398 + searchDelay: <?php echo intval( $table_features['searchDelay'] ); ?>
399 + })
400 + } );
401 + </script>
402 + <?php
403 + }
349 404
350 - <div class="ui tab" data-tab="connected">
351 - <?php
352 - /**
353 - * Action: mainwp_connection_status_before_connected_sites_list
354 - *
355 - * Fires before the list of connected sites in the connection status widgets
356 - *
357 - * @since 4.1
358 - */
359 - do_action( 'mainwp_connection_status_before_connected_sites_list' )
360 - ?>
361 - <div class="ui middle aligned divided selection list">
362 - <?php echo $html_online_sites; // phpcs:ignore WordPress.Security.EscapeOutput ?>
363 - </div>
364 - <?php
365 - /**
366 - * Action: mainwp_connection_status_after_connected_sites_list
367 - *
368 - * Fires after the list of connected sites in the connection status widgets
369 - *
370 - * @since 4.1
371 - */
372 - do_action( 'mainwp_connection_status_after_connected_sites_list' )
373 - ?>
374 - </div>
375 405
376 - <div class="ui tab" data-tab="disconnected">
377 - <?php
378 - /**
379 - * Action: mainwp_connection_status_before_disconnected_sites_list
380 - *
381 - * Fires before the list of disconnected sites in the connection status widgets
382 - *
383 - * @since 4.1
384 - */
385 - do_action( 'mainwp_connection_status_before_disconnected_sites_list' )
386 - ?>
387 - <div class="ui middle aligned divided selection list">
388 - <?php echo $html_other_sites; // phpcs:ignore WordPress.Security.EscapeOutput ?>
389 - </div>
390 - <?php
391 - /**
392 - * Action: mainwp_connection_status_after_disconnected_sites_list
393 - *
394 - * Fires after the list of disconnected sites in the connection status widgets
395 - *
396 - * @since 4.1
397 - */
398 - do_action( 'mainwp_connection_status_after_disconnected_sites_list' )
399 - ?>
400 - </div>
401 - <div class="ui tab" data-tab="no-sites"></div>
402 - </div>
403 - <?php
404 - }
406 + /**
407 + * Echo the column headers.
408 + *
409 + * @return void
410 + */
411 + public static function get_columns() {
412 + return array(
413 + 'status_details' => esc_html__( 'Detail', 'mainwp' ),
414 + );
415 + }
405 416
417 + /**
418 + * Echo the column headers.
419 + *
420 + * @return void
421 + */
422 + public static function print_column_headers() {
406 423
407 - /**
408 - * Render all items list.
409 - *
410 - * @param mixed $website Website Info.
411 - * @param mixed $lastSyncTime Last time the Child Site was synced to.
412 - * @param mixed $hasSyncErrors Collected errors.
413 - */
414 - public static function render_all_item( $website, $lastSyncTime, $hasSyncErrors ) {
415 - $is_demo = MainWP_Demo_Handle::is_demo_mode();
416 - ?>
417 - <div class="item mainwp_wp_sync" site_id="<?php echo intval( $website->id ); ?>" site_name="<?php echo esc_attr( rawurlencode( $website->name ) ); ?>">
418 - <div class="ui stackable grid">
419 - <div class="twelve wide column middle aligned">
420 - <div>
421 - <a href="
422 - <?php
423 - /**
424 - * Filter: mainwp_connection_status_list_item_title_url
425 - *
426 - * Filters the Connection Status widget list item title URL.
427 - *
428 - * @since 4.1
429 - */
430 - echo esc_url( apply_filters( 'mainwp_connection_status_list_item_title_url', 'admin.php?page=managesites&dashboard=' . $website->id, $website ) );
431 - ?>
432 - ">
433 - <?php
434 - /**
435 - * Filter: mainwp_connection_status_list_item_title
436 - *
437 - * Filters the Connection Status widget list item title text.
438 - *
439 - * @since 4.1
440 - */
441 - echo esc_html( stripslashes( apply_filters( 'mainwp_connection_status_list_item_title', $website->name, $website ) ) );
442 - ?>
443 - </a>
444 - </div>
445 - <span class="ui small text"><?php esc_html_e( 'Last Synced: ', 'mainwp' ); ?> <?php echo esc_html( $lastSyncTime ); ?></span>
446 - </div>
447 - <div class="four wide middle aligned column reconnect-wrapper">
448 - <div class="ui mini icon fluid buttons">
449 - <?php if ( $is_demo ) : ?>
450 - <a class="ui button" href="<?php echo esc_html( $website->url ) . 'wp-admin.html'; ?>" target="_blank" data-tooltip="<?php esc_attr_e( 'Go to the site WP Admin', 'mainwp' ); ?>" data-inverted=""><i class="sign in alternate icon"></i></a>
451 - <?php else : ?>
452 - <a class="ui button" href="<?php echo 'admin.php?page=SiteOpen&newWindow=yes&websiteid=' . intval( $website->id ); ?>&_opennonce=<?php echo esc_html( wp_create_nonce( 'mainwp-admin-nonce' ) ); ?>" target="_blank" data-tooltip="<?php esc_attr_e( 'Go to the site WP Admin', 'mainwp' ); ?>" data-inverted="" data-position="left center"><i class="sign in alternate icon"></i></a>
453 - <?php endif; ?>
454 - <a class="ui button" href="<?php echo esc_html( $website->url ); ?>" target="_blank" data-tooltip="<?php esc_attr_e( 'Go to the site front page', 'mainwp' ); ?>" data-inverted="" data-position="left center"><i class="external alternate icon"></i></a>
455 - <?php if ( $hasSyncErrors ) : ?>
456 - <a href="javascript:void(0)" class="mainwp-updates-overview-reconnect-site ui button green basic" siteid="<?php echo intval( $website->id ); ?>" data-tooltip="Reconnect <?php echo esc_html( stripslashes( $website->name ) ); ?>" data-inverted="" data-position="left center"><i class="linkify icon"></i></a>
457 - <?php else : ?>
458 - <a href="javascript:void(0)" class="ui button green" siteid="<?php echo intval( $website->id ); ?>" onClick="updatesoverview_wp_sync( '<?php echo intval( $website->id ); ?>' )" data-tooltip="Sync <?php echo esc_html( stripslashes( $website->name ) ); ?> data" data-inverted="" data-position="left center"><i class="sync alternate icon"></i></a>
459 - <?php endif; ?>
460 - </div>
461 - </div>
462 - </div>
463 - </div>
464 - <?php
465 - }
424 + $columns = static::get_columns();
466 425
467 - /**
468 - * Render Connected Sites List.
469 - *
470 - * @param object $website Object containing the child site info.
471 - * @param string $lastSyncTime Last time the Child Site was synced to.
472 - */
473 - public static function render_up_item( $website, $lastSyncTime ) {
474 - $is_demo = MainWP_Demo_Handle::is_demo_mode();
475 - ?>
476 - <div class="item mainwp_wp_sync" site_id="<?php echo intval( $website->id ); ?>" site_name="<?php echo esc_attr( rawurlencode( $website->name ) ); ?>">
477 - <div class="ui stackable grid">
478 - <div class="six wide column middle aligned">
479 - <a href="
480 - <?php
481 - /**
482 - * Filter: mainwp_connection_status_list_item_title_url
483 - *
484 - * Filters the Connection Status widget list item title URL.
485 - *
486 - * @since 4.1
487 - */
488 - echo esc_url( apply_filters( 'mainwp_connection_status_list_item_title_url', 'admin.php?page=managesites&dashboard=' . $website->id, $website ) );
489 - ?>
490 - ">
491 - <?php
492 - /**
493 - * Filter: mainwp_connection_status_list_item_title
494 - *
495 - * Filters the Connection Status widget list item title text.
496 - *
497 - * @since 4.1
498 - */
499 - echo esc_html( stripslashes( apply_filters( 'mainwp_connection_status_list_item_title', $website->name, $website ) ) );
500 - ?>
501 - </a>
502 - </div>
503 - <div class="one wide column middle aligned">
504 - <?php if ( $is_demo ) : ?>
505 - <a class="ui button" href="<?php echo esc_html( $website->url ) . 'wp-admin.html'; ?>" target="_blank" data-tooltip="<?php esc_attr_e( 'Go to the site WP Admin', 'mainwp' ); ?>" data-inverted=""><i class="sign in alternate icon"></i></a>
506 - <?php else : ?>
507 - <a href="<?php echo 'admin.php?page=SiteOpen&newWindow=yes&websiteid=' . intval( $website->id ); ?>&_opennonce=<?php echo esc_html( wp_create_nonce( 'mainwp-admin-nonce' ) ); ?>" target="_blank" data-tooltip="<?php esc_attr_e( 'Go to the site WP Admin', 'mainwp' ); ?>" data-inverted=""><i class="sign in alternate icon"></i></a>
508 - <?php endif; ?>
509 - </div>
510 - <div class="one wide column middle aligned">
511 - <a href="<?php echo esc_html( $website->url ); ?>" target="_blank" data-tooltip="<?php esc_attr_e( 'Go to the site front page', 'mainwp' ); ?>" data-inverted=""><i class="external alternate icon"></i></a>
512 - </div>
513 - <div class="four wide column middle aligned">
514 - <span><?php echo esc_attr( $lastSyncTime ); ?></span>
515 - </div>
516 - <div class="four wide column middle aligned">
517 - <a href="javascript:void(0)" class="ui button mini green" siteid="<?php echo intval( $website->id ); ?>" onClick="updatesoverview_wp_sync( '<?php echo intval( $website->id ); ?>' )" data-tooltip="Sync <?php echo esc_html( stripslashes( $website->name ) ); ?> data." data-inverted=""><?php esc_html_e( 'Sync Data', 'mainwp' ); ?></a>
518 - </div>
519 - </div>
520 - </div>
521 - <?php
522 - }
426 + foreach ( $columns as $column_event_key => $column_display_name ) {
523 427
524 - /**
525 - * Render Disconected Sites List.
526 - *
527 - * @param object $website Object containing the child site info.
528 - * @param string $lastSyncTime Last time the Child Site was synced to.
529 - */
530 - public static function render_down_item( $website, $lastSyncTime ) {
531 - $is_demo = MainWP_Demo_Handle::is_demo_mode();
532 - ?>
533 - <div class="item mainwp_wp_sync" site_id="<?php echo intval( $website->id ); ?>" site_name="<?php echo esc_attr( rawurlencode( $website->name ) ); ?>">
534 - <div class="ui stackable grid">
535 - <div class="six wide column middle aligned">
536 - <a href="
537 - <?php
538 - /**
539 - * Filter: mainwp_connection_status_list_item_title_url
540 - *
541 - * Filters the Connection Status widget list item title URL.
542 - *
543 - * @since 4.1
544 - */
545 - echo esc_url( apply_filters( 'mainwp_connection_status_list_item_title_url', 'admin.php?page=managesites&dashboard=' . $website->id, $website ) );
546 - ?>
547 - ">
548 - <?php
549 - /**
550 - * Filter: mainwp_connection_status_list_item_title
551 - *
552 - * Filters the Connection Status widget list item title text.
553 - *
554 - * @since 4.1
555 - */
556 - echo esc_attr( stripslashes( apply_filters( 'mainwp_connection_status_list_item_title', $website->name, $website ) ) );
557 - ?>
558 - </a>
559 - </div>
560 - <div class="one wide column middle aligned">
561 - <?php if ( $is_demo ) : ?>
562 - <a class="ui button" href="<?php echo esc_html( $website->url ) . 'wp-admin.html'; ?>" target="_blank" data-tooltip="<?php esc_attr_e( 'Go to the site WP Admin', 'mainwp' ); ?>" data-inverted=""><i class="sign in alternate icon"></i></a>
563 - <?php else : ?>
564 - <a href="<?php echo 'admin.php?page=SiteOpen&newWindow=yes&websiteid=' . intval( $website->id ); ?>&_opennonce=<?php echo esc_html( wp_create_nonce( 'mainwp-admin-nonce' ) ); ?>" target="_blank" data-tooltip="<?php esc_attr_e( 'Go to the site WP Admin', 'mainwp' ); ?>" data-inverted=""><i class="sign in alternate icon"></i></a>
565 - <?php endif; ?>
566 - </div>
567 - <div class="one wide column middle aligned">
568 - <a href="<?php echo esc_html( $website->url ); ?>" target="_blank" data-tooltip="<?php esc_attr_e( 'Go to the site front page', 'mainwp' ); ?>" data-inverted=""><i class="external alternate icon"></i></a>
569 - </div>
570 - <div class="four wide column middle aligned">
571 - <span><?php echo esc_attr( $lastSyncTime ); ?></span>
572 - </div>
573 - <div class="four wide column middle aligned reconnect-wrapper">
574 - <a href="#" class="mainwp-updates-overview-reconnect-site" siteid="<?php echo intval( $website->id ); ?>" data-tooltip="Reconnect <?php echo esc_html( stripslashes( $website->name ) ); ?>" data-inverted=""><?php esc_html_e( 'Reconnect', 'mainwp' ); ?></a>
575 - </div>
576 - </div>
577 - </div>
578 - <?php
579 - }
428 + $class = array( 'manage-' . $column_event_key . '-column' );
429 + $attr = '';
430 +
431 + $class[] = 'no-sort';
432 +
433 + $tag = 'th';
434 + $id = "id='$column_event_key'";
435 +
436 + if ( ! empty( $class ) ) {
437 + $class = "class='" . join( ' ', $class ) . "'";
438 + }
439 +
440 + echo "<$tag $id $class $attr style=\"display:none;\">$column_display_name</$tag>"; // phpcs:ignore WordPress.Security.EscapeOutput
441 + }
442 + }
443 +
444 + /**
445 + * The renders the connections status tab.
446 + *
447 + * @param string $current_tab The current tab.
448 + */
449 + public function prepare_items( $current_tab ) {
450 +
451 + // phpcs:disable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
452 +
453 + if ( ! in_array( $current_tab, array( 'all-sites', 'connected', 'disconnected' ), true ) ) {
454 + wp_die( wp_json_encode( array( 'error' => __( 'The selected site\'s status is invalid. Please try again.', 'mainwp' ) ) ) );
455 + }
456 +
457 + $per_page = isset( $_POST['per_page'] ) ? intval( wp_unslash( $_POST['per_page'] ) ) : 25; // phpcs:ignore -- NOSONAR - ok.
458 + $page = isset( $_POST['page'] ) ? intval( wp_unslash( $_POST['page'] ) ) : 1; // phpcs:ignore -- NOSONAR - ok.
459 +
460 + $perPage = isset( $_REQUEST['length'] ) ? intval( $_REQUEST['length'] ) : 25;
461 + $start = isset( $_REQUEST['start'] ) ? intval( $_REQUEST['start'] ) : 0;
462 +
463 + // phpcs:enable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
464 +
465 + $status = $current_tab;
466 +
467 + if ( 'all-sites' === $status ) {
468 + $status = 'any';
469 + }
470 +
471 + $wpsite_fields = array( 'id', 'name', 'url', 'adminname' );
472 + $sync_fields = array( 'sync_errors', 'dtsSync' );
473 +
474 + $args = array(
475 + 'select_wp_fields' => $wpsite_fields,
476 + 'select_sync_fields' => $sync_fields,
477 + 'status' => $status,
478 + 'offset' => $start,
479 + 'rowcount' => $perPage,
480 + 'orderby' => 'wp.url',
481 + 'view' => 'custom_view',
482 + 'others_fields' => array(),
483 + );
484 +
485 + $results = MainWP_DB::instance()->query(
486 + MainWP_DB::instance()->get_sql_websites_for_current_user_by_params(
487 + apply_filters(
488 + 'mainwp_connection_status_widget_get_sites_query_params',
489 + $args
490 + )
491 + )
492 + );
493 +
494 + $items = array();
495 +
496 + while ( $results && $website = MainWP_DB::fetch_object( $results ) ) {
497 + $items[] = $website;
498 + }
499 + MainWP_DB::free_result( $results );
500 +
501 + $args['count_sql'] = true;
502 +
503 + $total_sql = MainWP_DB::instance()->get_sql_websites_for_current_user_by_params(
504 + apply_filters(
505 + 'mainwp_connection_status_widget_get_sites_query_params',
506 + $args
507 + )
508 + );
509 +
510 + $total_items = MainWP_DB::instance()->get_var_field( $total_sql );
511 +
512 + $this->items = $items;
513 + $this->total_items = $total_items ? (int) $total_items : 0;
514 + unset( $items );
515 + }
516 +
517 +
518 + /**
519 + * Method ajax_display_rows()
520 + *
521 + * Display table rows.
522 + */
523 + public function ajax_display_rows() {
524 + MainWP_Post_Handler::instance()->check_security( 'mainwp_widgets_connections_status_details_display_rows' );
525 + $current_tab = isset( $_POST['current_tab'] ) ? sanitize_text_field( wp_unslash( $_POST['current_tab'] ) ) : ''; // phpcs:ignore -- NOSONAR - ok.
526 + $this->prepare_items( $current_tab );
527 + $output = $this->ajax_get_datatable_rows( $current_tab );
528 + wp_send_json( $output );
529 + }
530 +
531 + /**
532 + * Get table rows.
533 + *
534 + * @param string $current_tab The current tab.
535 + *
536 + * @return array Rows html.
537 + */
538 + public function ajax_get_datatable_rows( $current_tab ) {
539 +
540 + $all_rows = array();
541 + $info_rows = array();
542 +
543 + $columns = static::get_columns();
544 +
545 + if ( $this->items ) {
546 + foreach ( $this->items as $site ) {
547 + $rw_classes = 'mainwp-connect-status-item-' . intval( $site->id );
548 +
549 + $info_item = array(
550 + 'rowClass' => esc_html( $rw_classes ),
551 + 'site_id' => $site->id,
552 + );
553 +
554 + $cols_data = array();
555 + foreach ( $columns as $column_name => $column_display_name ) {
556 + ob_start();
557 + echo $this->column_default( $site, $column_name, $current_tab ); // phpcs:ignore WordPress.Security.EscapeOutput
558 + $cols_data[ $column_name ] = ob_get_clean();
559 + }
560 + $all_rows[] = $cols_data;
561 + $info_rows[] = $info_item;
562 + }
563 + }
564 + return array(
565 + 'data' => $all_rows,
566 + 'recordsTotal' => (int) $this->total_items,
567 + 'recordsFiltered' => (int) $this->total_items,
568 + 'rowsInfo' => $info_rows,
569 + );
570 + }
571 +
572 + /**
573 + * Returns the column content for the provided item and column.
574 + *
575 + * @param object $website Website data.
576 + * @param string $column_name Column name.
577 + * @param string $current_tab The current tab.
578 + *
579 + * @return string $out Output.
580 + */
581 + public function column_default( $website, $column_name, $current_tab ) { //phpcs:ignore -- NOSONAR -complex.
582 +
583 + $status = $current_tab;
584 +
585 + if ( 'all-sites' === $current_tab ) {
586 + $status = 'any';
587 + }
588 +
589 + $SYNCERRORS = 'disconnected';
590 + $UP = 'connected';
591 + $ALL = 'any';
592 +
593 + $output = '';
594 + if ( 'status_details' === $column_name ) {
595 + $hasSyncErrors = ( '' !== $website->sync_errors );
596 + $lastSyncTime = ! empty( $website->dtsSync ) ? MainWP_Utility::format_timestamp( MainWP_Utility::get_timestamp( $website->dtsSync ) ) : '';
597 +
598 + ob_start();
599 +
600 + if ( $status === $ALL ) {
601 + static::render_all_item( $website, $lastSyncTime, $hasSyncErrors );
602 + } elseif ( $status === $UP ) {
603 + static::render_up_item( $website, $lastSyncTime );
604 + } elseif ( $status === $SYNCERRORS ) {
605 + static::render_down_item( $website, $lastSyncTime );
606 + }
607 +
608 + /**
609 + * Action: mainwp_connection_status_widget_bottom
610 + *
611 + * Fires at the bottom of the Connection Status widget.
612 + *
613 + * @since 4.1
614 + */
615 + do_action( 'mainwp_connection_status_widget_bottom' );
616 +
617 + $output = ob_get_clean();
618 + }
619 +
620 + if ( empty( $output ) ) {
621 + return '';
622 + }
623 + return $output; //phpcs:ignore -- escaped.
624 + }
625 +
626 +
627 +
628 + /**
629 + * Render connection status summary section.
630 + *
631 + * @param int $count_connected Connected Count.
632 + * @param int $count_disconnected Disconnected Count.
633 + */
634 + public static function render_multi_status( $count_connected, $count_disconnected ) {
635 + ?>
636 + <div class="ui mainwp-cards small cards">
637 + <div class="ui card">
638 + <div class="content">
639 + <div class="header">
640 + <span class="ui large text"><i class="ui een check icon"></i> <?php echo esc_html( MainWP_Utility::short_number_format( $count_connected ) ); ?></span>
641 + </div>
642 + <div class="description"><strong><?php esc_html_e( 'Connected Sites', 'mainwp' ); ?></strong></div>
643 + </div>
644 + </div>
645 + <div class="ui card">
646 + <div class="content">
647 + <div class="header">
648 + <span class="ui large text"><i class="ui unlink icon"></i> <?php echo esc_html( MainWP_Utility::short_number_format( $count_disconnected ) ); ?></span>
649 + </div>
650 + <div class="description"><strong><?php esc_html_e( 'Disconnected Sites', 'mainwp' ); ?></strong></div>
651 + </div>
652 + </div>
653 + </div>
654 + <?php
655 + }
656 +
657 + /**
658 + * Render all items list.
659 + *
660 + * @param mixed $website Website Info.
661 + * @param mixed $lastSyncTime Last time the Child Site was synced to.
662 + * @param mixed $hasSyncErrors Collected errors.
663 + */
664 + public static function render_all_item( $website, $lastSyncTime, $hasSyncErrors ) {
665 + ?>
666 + <div class="item mainwp_wp_sync" site_id="<?php echo intval( $website->id ); ?>" site_name="<?php echo esc_attr( rawurlencode( $website->name ) ); ?>">
667 + <div class="right floated">
668 + <div class="ui right pointing dropdown">
669 + <i class="ellipsis vertical icon"></i>
670 + <div class="menu">
671 + <?php if ( $hasSyncErrors ) : ?>
672 + <a href="javascript:void(0)" class="mainwp-updates-overview-reconnect-site item" adminuser="<?php echo esc_attr( $website->adminname ); ?>" siteid="<?php echo intval( $website->id ); ?>"><?php esc_html_e( 'Reconnect Site', 'mainwp' ); ?></a>
673 + <?php else : ?>
674 + <a href="javascript:void(0)" class="item" siteid="<?php echo intval( $website->id ); ?>" onClick="updatesoverview_wp_sync( '<?php echo intval( $website->id ); ?>' )"><?php esc_html_e( 'Sync Site', 'mainwp' ); ?></a>
675 + <a href="<?php MainWP_Site_Open::get_open_site_admin_link( $website->id, true ); ?>" target="_blank" class="item"><?php esc_html_e( 'Go to WP Admin', 'mainwp' ); ?></a>
676 + <?php endif; ?>
677 + <a href="<?php echo esc_html( $website->url ); ?>" class="item" target="_blank"><?php esc_html_e( 'Visit Site', 'mainwp' ); ?></a>
678 + </div>
679 + </div>
680 + </div>
681 + <?php if ( ! $hasSyncErrors ) : ?>
682 + <a href="<?php MainWP_Site_Open::get_open_site_admin_link( $website->id, true ); ?>" target="_blank"><i class="sign in alternate icon"></i></a>
683 + <?php endif; ?>
684 + <a href="
685 + <?php
686 + /**
687 + * Filter: mainwp_connection_status_list_item_title_url
688 + *
689 + * Filters the Connection Status widget list item title URL.
690 + *
691 + * @since 4.1
692 + */
693 + echo esc_url( apply_filters( 'mainwp_connection_status_list_item_title_url', 'admin.php?page=managesites&dashboard=' . $website->id, $website ) );
694 + ?>
695 + ">
696 + <?php
697 + /**
698 + * Filter: mainwp_connection_status_list_item_title
699 + *
700 + * Filters the Connection Status widget list item title text.
701 + *
702 + * @since 4.1
703 + */
704 + echo esc_html( stripslashes( apply_filters( 'mainwp_connection_status_list_item_title', $website->name, $website ) ) );
705 + ?>
706 + </a>
707 + <?php if ( $hasSyncErrors ) : ?>
708 + <span class="ui mini red label"><?php esc_html_e( 'Disconnected', 'mainwp' ); ?></span>
709 + <?php endif; ?>
710 + <br/><span class="ui small text"><?php esc_html_e( 'Last synced: ', 'mainwp' ); ?> <?php echo esc_html( $lastSyncTime ); ?></span>
711 + </div>
712 +
713 + <?php
714 + }
715 +
716 + /**
717 + * Render Connected Sites List.
718 + *
719 + * @param object $website Object containing the child site info.
720 + * @param string $lastSyncTime Last time the Child Site was synced to.
721 + */
722 + public static function render_up_item( $website, $lastSyncTime ) {
723 + ?>
724 + <div class="item mainwp_wp_sync" site_id="<?php echo intval( $website->id ); ?>" site_name="<?php echo esc_attr( rawurlencode( $website->name ) ); ?>">
725 + <div class="right floated">
726 + <div class="ui right pointing dropdown">
727 + <i class="ellipsis vertical icon"></i>
728 + <div class="menu">
729 + <a href="javascript:void(0)" class="item" siteid="<?php echo intval( $website->id ); ?>" onClick="updatesoverview_wp_sync( '<?php echo intval( $website->id ); ?>' )"><?php esc_html_e( 'Sync Site', 'mainwp' ); ?></a>
730 + <a href="<?php MainWP_Site_Open::get_open_site_admin_link( $website->id, true ); ?>" target="_blank" class="item"><?php esc_html_e( 'Go to WP Admin', 'mainwp' ); ?></a>
731 + <a href="<?php echo esc_html( $website->url ); ?>" class="item" target="_blank"><?php esc_html_e( 'Visit Site', 'mainwp' ); ?></a>
732 + </div>
733 + </div>
734 + </div>
735 + <a href="<?php MainWP_Site_Open::get_open_site_admin_link( $website->id, true ); ?>" target="_blank"><i class="sign in alternate icon"></i></a>
736 + <a href="
737 + <?php
738 + /**
739 + * Filter: mainwp_connection_status_list_item_title_url
740 + *
741 + * Filters the Connection Status widget list item title URL.
742 + *
743 + * @since 4.1
744 + */
745 + echo esc_url( apply_filters( 'mainwp_connection_status_list_item_title_url', 'admin.php?page=managesites&dashboard=' . $website->id, $website ) );
746 + ?>
747 + ">
748 + <?php
749 + /**
750 + * Filter: mainwp_connection_status_list_item_title
751 + *
752 + * Filters the Connection Status widget list item title text.
753 + *
754 + * @since 4.1
755 + */
756 + echo esc_html( stripslashes( apply_filters( 'mainwp_connection_status_list_item_title', $website->name, $website ) ) );
757 + ?>
758 + </a>
759 + <br/><span class="ui small text"><?php esc_html_e( 'Last synced: ', 'mainwp' ); ?> <?php echo esc_html( $lastSyncTime ); ?></span>
760 + </div>
761 +
762 + <?php
763 + }
764 +
765 + /**
766 + * Render Disconected Sites List.
767 + *
768 + * @param object $website Object containing the child site info.
769 + * @param string $lastSyncTime Last time the Child Site was synced to.
770 + */
771 + public static function render_down_item( $website, $lastSyncTime ) {
772 + ?>
773 + <div class="red item mainwp_wp_sync" site_id="<?php echo intval( $website->id ); ?>" site_name="<?php echo esc_attr( rawurlencode( $website->name ) ); ?>">
774 + <div class="right floated">
775 + <div class="ui right pointing dropdown">
776 + <i class="ellipsis vertical icon"></i>
777 + <div class="menu">
778 + <a href="javascript:void(0)" class="mainwp-updates-overview-reconnect-site item" adminuser="<?php echo esc_attr( $website->adminname ); ?>" siteid="<?php echo intval( $website->id ); ?>"><?php esc_html_e( 'Reconnect Site', 'mainwp' ); ?></a>
779 + <a href="<?php echo esc_html( $website->url ); ?>" class="item" target="_blank"><?php esc_html_e( 'Visit Site', 'mainwp' ); ?></a>
780 + </div>
781 + </div>
782 + </div>
783 + <a href="
784 + <?php
785 + /**
786 + * Filter: mainwp_connection_status_list_item_title_url
787 + *
788 + * Filters the Connection Status widget list item title URL.
789 + *
790 + * @since 4.1
791 + */
792 + echo esc_url( apply_filters( 'mainwp_connection_status_list_item_title_url', 'admin.php?page=managesites&dashboard=' . $website->id, $website ) );
793 + ?>
794 + ">
795 + <?php
796 + /**
797 + * Filter: mainwp_connection_status_list_item_title
798 + *
799 + * Filters the Connection Status widget list item title text.
800 + *
801 + * @since 4.1
802 + */
803 + echo esc_html( stripslashes( apply_filters( 'mainwp_connection_status_list_item_title', $website->name, $website ) ) );
804 + ?>
805 + </a>
806 + <span class="ui mini red label"><?php esc_html_e( 'Disconnected', 'mainwp' ); ?></span>
807 + <br/><span class="ui small text"><?php esc_html_e( 'Last synced: ', 'mainwp' ); ?> <?php echo esc_html( $lastSyncTime ); ?></span>
808 + </div>
809 +
810 + <?php
811 + }
580 812 }