469 lines
23 KiB
PHP
469 lines
23 KiB
PHP
<?php
|
|
/**
|
|
* MainWP UI Select Sites.
|
|
*
|
|
* @package MainWP/Dashboard
|
|
*/
|
|
|
|
namespace MainWP\Dashboard;
|
|
|
|
/**
|
|
* Class MainWP_UI_Select_Sites
|
|
*
|
|
* @package MainWP\Dashboard
|
|
*/
|
|
class MainWP_UI_Select_Sites { // phpcs:ignore Generic.Classes.OpeningBraceSameLine.ContentAfterBrace -- NOSONAR.
|
|
|
|
/**
|
|
* Method get_class_name()
|
|
*
|
|
* Get Class Name.
|
|
*
|
|
* @return object
|
|
*/
|
|
public static function get_class_name() {
|
|
return __CLASS__;
|
|
}
|
|
|
|
/**
|
|
* Method select_sites_box()
|
|
*
|
|
* Select sites box.
|
|
*
|
|
* @param array $params {
|
|
* An array of params for sites selection. Default empty array.
|
|
* @type string $type Input type, radio.
|
|
* @type bool $show_group Whether or not to show group, Default: true.
|
|
* @type bool $show_select_all Whether to show select all.
|
|
* @type string $class Default = ''.
|
|
* @type string $style Default = ''.
|
|
* @type array $selected_sites Selected Child Sites.
|
|
* @type array $selected_groups Selected Groups.
|
|
* @type bool $enableOfflineSites (bool) True, if offline sites is enabled. False if not.
|
|
* @type integer $postId Post Meta ID.
|
|
* @type bool $show_client (bool) True, if show clients. False if not.
|
|
* @type bool $enable_suspended_clients (bool) True, if enable suspended clients. False if not.
|
|
* @type array $selected_clients Selected Clients.
|
|
* }
|
|
*
|
|
* @uses \MainWP\Dashboard\MainWP_System_Utility::maybe_unserialyze()
|
|
*/
|
|
public static function select_sites_box( $params = array() ) { // phpcs:ignore -- NOSONAR - complex function. Current complexity is the only way to achieve desired results, pull request solutions appreciated.
|
|
|
|
$type = isset( $params['type'] ) ? $params['type'] : 'checkbox';
|
|
$show_group = isset( $params['show_group'] ) ? $params['show_group'] : true;
|
|
$show_select_all = isset( $params['show_select_all'] ) ? $params['show_select_all'] : true;
|
|
$show_selectall_disc = isset( $params['show_select_all_disconnect'] ) ? $params['show_select_all_disconnect'] : false;
|
|
$show_new_tag = isset( $params['show_create_tag'] ) ? $params['show_create_tag'] : true;
|
|
$selected_sites = isset( $params['selected_sites'] ) ? $params['selected_sites'] : array();
|
|
$selected_groups = isset( $params['selected_groups'] ) ? $params['selected_groups'] : array();
|
|
$enableOfflineSites = isset( $params['enable_offline_sites'] ) ? $params['enable_offline_sites'] : false;
|
|
$postId = isset( $params['post_id'] ) ? $params['post_id'] : 0;
|
|
$show_client = isset( $params['show_client'] ) ? $params['show_client'] : false;
|
|
$enableSuspendedClients = isset( $params['enable_suspended_clients'] ) ? $params['enable_suspended_clients'] : false;
|
|
$selected_clients = isset( $params['selected_clients'] ) ? $params['selected_clients'] : array();
|
|
$add_edit_client_id = isset( $params['add_edit_client_id'] ) ? $params['add_edit_client_id'] : false;
|
|
|
|
if ( $postId ) {
|
|
|
|
$sites_val = get_post_meta( $postId, '_selected_sites', true );
|
|
$selected_sites = MainWP_System_Utility::maybe_unserialyze( $sites_val );
|
|
|
|
if ( empty( $selected_sites ) ) {
|
|
$selected_sites = array();
|
|
}
|
|
|
|
$groups_val = get_post_meta( $postId, '_selected_groups', true );
|
|
$selected_groups = MainWP_System_Utility::maybe_unserialyze( $groups_val );
|
|
|
|
if ( empty( $selected_groups ) ) {
|
|
$selected_groups = array();
|
|
}
|
|
|
|
$selected_clients = get_post_meta( $postId, '_selected_clients', true );
|
|
|
|
if ( empty( $selected_clients ) ) {
|
|
$selected_clients = array();
|
|
}
|
|
}
|
|
|
|
if ( empty( $selected_sites ) && isset( $_GET['selected_sites'] ) && ! empty( $_GET['selected_sites'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
|
|
$selected_sites = explode( '-', sanitize_text_field( wp_unslash( $_GET['selected_sites'] ) ) ); // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- sanitize ok.
|
|
$selected_sites = array_map( 'intval', $selected_sites );
|
|
$selected_sites = array_filter( $selected_sites );
|
|
}
|
|
|
|
/**
|
|
* Action: mainwp_before_seclect_sites
|
|
*
|
|
* Fires before the Select Sites box.
|
|
*
|
|
* @since 4.1
|
|
*/
|
|
do_action( 'mainwp_before_seclect_sites' );
|
|
$params = array(
|
|
'type' => $type,
|
|
'show_group' => $show_group,
|
|
'show_select_all' => $show_select_all,
|
|
'show_select_all_disconnect' => $show_selectall_disc,
|
|
'show_create_tag' => $show_new_tag,
|
|
'selected_sites' => $selected_sites,
|
|
'selected_groups' => $selected_groups,
|
|
'enable_offline_sites' => $enableOfflineSites,
|
|
'post_id' => $postId,
|
|
'show_client' => $show_client,
|
|
'enable_suspended_clients' => $enableSuspendedClients,
|
|
'selected_clients' => $selected_clients,
|
|
'add_edit_client_id' => $add_edit_client_id,
|
|
);
|
|
?>
|
|
<div id="mainwp-select-sites" class="mainwp_select_sites_wrapper">
|
|
<?php static::select_sites_box_body( $params ); ?>
|
|
</div>
|
|
<?php
|
|
/**
|
|
* Action: mainwp_after_seclect_sites
|
|
*
|
|
* Fires after the Select Sites box.
|
|
*
|
|
* @since 4.1
|
|
*/
|
|
do_action( 'mainwp_after_seclect_sites' );
|
|
}
|
|
|
|
/**
|
|
* Method select_sites_box_body()
|
|
*
|
|
* Select sites box Body.
|
|
*
|
|
* @param array $params {
|
|
*
|
|
* An array of params for sites selection. Default empty array.
|
|
*
|
|
* @type string $type Input type, radio.
|
|
* @type bool $show_group Whether or not to show group, Default: true.
|
|
* @type bool $show_select_all Whether to show select all.
|
|
* @type array $selected_sites Selected Child Sites.
|
|
* @type array $selected_groups Selected Groups.
|
|
* @type bool $enableOfflineSites (bool) True, if offline sites is enabled. False if not.
|
|
* @type integer $postId Post Meta ID.
|
|
* @type bool $show_client (bool) True, if show clients. False if not.
|
|
* @type array $selected_clients Selected clients.
|
|
* @type bool $enable_suspended_clients (bool) True, if suspended clients is enabled. False if not.
|
|
* }
|
|
*/
|
|
public static function select_sites_box_body( $params = array() ) { // phpcs:ignore -- NOSONAR - complex function. Current complexity is the only way to achieve desired results, pull request solutions appreciated.
|
|
|
|
$type = isset( $params['type'] ) ? $params['type'] : 'checkbox';
|
|
$show_group = isset( $params['show_group'] ) ? $params['show_group'] : true;
|
|
$show_select_all = isset( $params['show_select_all'] ) ? $params['show_select_all'] : true;
|
|
$show_selectall_disc = isset( $params['show_select_all_disconnect'] ) ? $params['show_select_all_disconnect'] : false;
|
|
$show_new_tag = isset( $params['show_create_tag'] ) ? $params['show_create_tag'] : true;
|
|
$selected_sites = isset( $params['selected_sites'] ) ? $params['selected_sites'] : array();
|
|
$selected_groups = isset( $params['selected_groups'] ) ? $params['selected_groups'] : array();
|
|
$enableOfflineSites = isset( $params['enable_offline_sites'] ) ? $params['enable_offline_sites'] : false;
|
|
$postId = isset( $params['post_id'] ) ? $params['post_id'] : 0;
|
|
$show_client = isset( $params['show_client'] ) ? $params['show_client'] : false;
|
|
$enableSuspendedClients = isset( $params['enable_suspended_clients'] ) ? $params['enable_suspended_clients'] : false;
|
|
$selected_clients = isset( $params['selected_clients'] ) ? $params['selected_clients'] : array();
|
|
$add_edit_client_id = isset( $params['add_edit_client_id'] ) ? $params['add_edit_client_id'] : false;
|
|
|
|
if ( ! \mainwp_current_user_can( 'dashboard', 'manage_clients' ) ) {
|
|
$show_client = false;
|
|
}
|
|
|
|
if ( 'all' !== $selected_sites && ! is_array( $selected_sites ) ) {
|
|
$selected_sites = array();
|
|
}
|
|
|
|
if ( ! is_array( $selected_groups ) ) {
|
|
$selected_groups = array();
|
|
}
|
|
|
|
$selectedby = 'site';
|
|
if ( ! empty( $selected_groups ) ) {
|
|
$selectedby = 'group';
|
|
} elseif ( ! empty( $selected_clients ) ) {
|
|
$selectedby = 'client';
|
|
}
|
|
|
|
$websites = MainWP_DB::instance()->query( MainWP_DB::instance()->get_sql_websites_for_current_user( false, null, 'wp.name' ) );
|
|
$groups = MainWP_DB_Common::instance()->get_not_empty_groups( null, $enableOfflineSites );
|
|
|
|
// support staging extension.
|
|
$staging_enabled = is_plugin_active( 'mainwp-staging-extension/mainwp-staging-extension.php' ) || is_plugin_active( 'mainwp-timecapsule-extension/mainwp-timecapsule-extension.php' );
|
|
|
|
$edit_site_id = false;
|
|
if ( $postId ) {
|
|
$edit_site_id = get_post_meta( $postId, '_mainwp_edit_post_site_id', true );
|
|
$edit_site_id = intval( $edit_site_id );
|
|
}
|
|
|
|
if ( $edit_site_id ) {
|
|
$show_group = false;
|
|
}
|
|
// to fix layout with multi sites selector.
|
|
$tab_id = wp_rand();
|
|
|
|
MainWP_UI::render_select_sites_header( $tab_id, $staging_enabled, $selectedby, $show_group, $show_client );
|
|
|
|
$select_all_disconnected = '';
|
|
|
|
if ( $show_selectall_disc ) {
|
|
$select_all_disconnected = '<div onClick="return mainwp_ss_select_disconnected( this, true )" class="mainwp-ss-select-disconnected"><i class="square outline icon"></i> ' . esc_attr__( 'Select All Disconnected', 'mainwp' ) . '</div>';
|
|
$select_all_disconnected .= '<div onClick="return mainwp_ss_select_disconnected( this, false )" class="mainwp-ss-deselect-disconnected" style="display:none;padding-top:0;"><i class="check square outline icon"></i> ' . esc_attr__( 'Deselect All Disconnected', 'mainwp' ) . '</div>';
|
|
}
|
|
|
|
if ( $show_select_all || $show_selectall_disc || $show_new_tag ) :
|
|
?>
|
|
<div id="mainwp-select-sites-select-all-actions" class="ui two column grid">
|
|
<div class="ui middle aligned twelve wide column">
|
|
<?php if ( $show_select_all ) : ?>
|
|
<button onClick="return mainwp_ss_select( this, true )" onKeyUp="" class="mainwp-ss-select mainwp-sites-select-deselect-button ui mini basic grey button"><i class="square outline icon"></i> <?php esc_attr_e( 'Select All', 'mainwp' ); ?></button>
|
|
<button onClick="return mainwp_ss_select( this, false )" onKeyUp="" class="mainwp-ss-deselect mainwp-sites-select-deselect-button ui mini basic grey button" style="display:none;"><i class="check square outline icon"></i> <?php esc_attr_e( 'Deselect All', 'mainwp' ); ?></button>
|
|
<?php endif; ?>
|
|
<?php echo $select_all_disconnected; //phpcs:ignore WordPress.Security.EscapeOutput ?>
|
|
</div>
|
|
<div class="ui right aligned middle aligned four wide column">
|
|
<?php if ( $show_new_tag ) { ?>
|
|
<a class="ui mini basic icon button" href="javascript:void(0)" id="mainwp-create-new-tag-button" aria-label="<?php esc_attr_e( 'Create a tag with selected sites.', 'mainwp' ); ?>" data-tooltip="<?php esc_attr_e( 'Create a tag with selected sites.', 'mainwp' ); ?>" data-position="left center" data-inverted=""><i class="tag icon"></i></a>
|
|
<?php } ?>
|
|
</div>
|
|
</div>
|
|
<div class="ui hidden divider"></div>
|
|
<?php
|
|
endif;
|
|
?>
|
|
<div class="ui tab <?php echo 'site' === $selectedby ? 'active' : ''; ?>" data-tab="mainwp-select-sites-<?php echo esc_attr( $tab_id ); ?>" id="mainwp-select-sites">
|
|
<?php
|
|
MainWP_UI::render_select_sites( $websites, $type, $selected_sites, $enableOfflineSites, $edit_site_id, $show_select_all, $add_edit_client_id, $show_selectall_disc );
|
|
?>
|
|
</div>
|
|
<?php if ( $staging_enabled ) { ?>
|
|
<div class="ui tab <?php echo 'staging' === $selectedby ? 'active' : ''; ?>" data-tab="mainwp-select-staging-sites-<?php echo esc_attr( $tab_id ); ?>">
|
|
<?php
|
|
MainWP_UI::render_select_sites_staging( $selected_sites, $edit_site_id, $type );
|
|
?>
|
|
</div>
|
|
<?php
|
|
}
|
|
|
|
if ( $show_group ) {
|
|
?>
|
|
<div class="ui tab <?php echo 'group' === $selectedby ? 'active' : ''; ?>" data-tab="mainwp-select-groups-<?php echo esc_attr( $tab_id ); ?>" id="mainwp-select-groups">
|
|
<?php
|
|
MainWP_UI::render_select_sites_group( $groups, $selected_groups, $type );
|
|
?>
|
|
</div>
|
|
<?php
|
|
}
|
|
|
|
if ( $show_client ) {
|
|
$clients = MainWP_DB_Client::instance()->get_wp_client_by( 'all' );
|
|
$params = array(
|
|
'clients' => $clients,
|
|
'type' => $type,
|
|
'selected_clients' => $selected_clients,
|
|
'enable_suspended_clients' => $enableSuspendedClients,
|
|
);
|
|
?>
|
|
<div class="ui tab <?php echo 'client' === $selectedby ? 'active' : ''; ?>" data-tab="mainwp-select-clients-<?php echo esc_attr( $tab_id ); ?>" id="mainwp-select-clients">
|
|
<?php
|
|
static::render_select_clients( $params );
|
|
?>
|
|
</div>
|
|
<?php
|
|
}
|
|
|
|
if ( $show_new_tag ) {
|
|
static::render_create_tag_modal();
|
|
}
|
|
?>
|
|
<script type="text/javascript">
|
|
jQuery( document ).ready( function () {
|
|
jQuery( '#mainwp-create-new-tag-button' ).on( 'click', function() {
|
|
jQuery( '#mainwp-create-group-sites-modal' ).modal( {
|
|
onHide: function () {
|
|
window.location.href = location.href;
|
|
return false;
|
|
},
|
|
} ).modal( 'show' );
|
|
} );
|
|
// Create a new group (Select Sites UI)
|
|
jQuery( document ).on( 'click', '#mainwp-save-new-tag-button', function () {
|
|
let newName = jQuery( '#mainwp-create-group-sites-modal' ).find( '#mainwp-group-name' ).val().trim();
|
|
let newColor = jQuery( '#mainwp-create-group-sites-modal' ).find( '#mainwp-group-color' ).val();
|
|
if('' == newName ){
|
|
return false;
|
|
}
|
|
jQuery(this).attr('disabled', 'disabled');
|
|
let selected_sites = [ ];
|
|
jQuery( "input[name='selected_sites[]']:checked" ).each( function () {
|
|
selected_sites.push( jQuery( this ).val() );
|
|
} );
|
|
let data = mainwp_secure_data( {
|
|
action: 'mainwp_group_sites_add',
|
|
selected_sites: selected_sites,
|
|
newName: newName,
|
|
newColor: newColor
|
|
} );
|
|
jQuery.post( ajaxurl, data, function ( response ) {
|
|
try {
|
|
if ( response.error != undefined ){
|
|
jQuery('#mainwp-message-zone-tag').show().find('.ui.message').html(response.error);
|
|
return;
|
|
}
|
|
} catch ( err ) {
|
|
// to fix js error.
|
|
}
|
|
jQuery( '#mainwp-create-group-sites-modal' ).modal( 'hide' );
|
|
}, 'json' );
|
|
return false;
|
|
} );
|
|
} );
|
|
</script>
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Method render_select_clients()
|
|
*
|
|
* @param array $params {
|
|
*
|
|
* An array of params for clients selection. Default empty array.
|
|
*
|
|
* @type object $clients Object containing Clients info.
|
|
* @type string $type Selector type.
|
|
* @type array $selected_clients Selected clients.
|
|
* @type bool $enable_suspended_clients (bool) True, if suspended clients is enabled. False if not.
|
|
* @type mixed $tab_id Datatab ID.
|
|
* }
|
|
*
|
|
* @return void Render Select Clients html.
|
|
*/
|
|
public static function render_select_clients( $params = array() ) { // phpcs:ignore -- NOSONAR - complex.
|
|
|
|
$clients = isset( $params['clients'] ) ? $params['clients'] : array();
|
|
$type = isset( $params['type'] ) ? $params['type'] : 'checkbox';
|
|
$selected_clients = isset( $params['selected_clients'] ) ? $params['selected_clients'] : array();
|
|
$enableSuspendedClients = isset( $params['enable_suspended_clients'] ) ? $params['enable_suspended_clients'] : false;
|
|
|
|
if ( ! is_array( $clients ) ) {
|
|
$clients = array();
|
|
}
|
|
|
|
if ( ! is_array( $selected_clients ) && ( 'all' !== $selected_clients ) ) {
|
|
$selected_clients = array();
|
|
}
|
|
|
|
/**
|
|
* Action: mainwp_before_select_clients_list
|
|
*
|
|
* Fires before the Select Clients list.
|
|
*
|
|
* @param object $clients Object containing Clients info.
|
|
*
|
|
* @since 4.1
|
|
*/
|
|
do_action( 'mainwp_before_select_clients_list', $clients );
|
|
?>
|
|
<div id="mainwp-select-sites-body">
|
|
<div class="ui relaxed selection list" id="mainwp-select-clients-list">
|
|
<?php if ( ! $clients ) : ?>
|
|
<h2 class="ui icon header">
|
|
<i class="folder open outline icon"></i>
|
|
<div class="content"><?php esc_html_e( 'No Clients!', 'mainwp' ); ?></div>
|
|
<div class="ui divider hidden"></div>
|
|
<a href="admin.php?page=ClientAddNew" class="ui green button basic"><?php esc_html_e( 'Add Client', 'mainwp' ); ?></a>
|
|
</h2>
|
|
<?php
|
|
else :
|
|
foreach ( $clients as $client ) {
|
|
$selected = false;
|
|
if ( 0 === (int) $client->suspended || $enableSuspendedClients ) {
|
|
$selected = ( 'all' === $selected_clients || in_array( $client->client_id, $selected_clients ) );
|
|
?>
|
|
<div title="<?php echo esc_html( $client->name ); ?>" class="mainwp_selected_clients_item ui <?php echo esc_html( $type ); ?> item <?php echo $selected ? 'selected_clients_item_checked' : ''; ?>">
|
|
<input type="<?php echo esc_attr( $type ); ?>" name="<?php echo 'radio' === $type ? 'selected_clients' : 'selected_clients[]'; ?>" siteid="<?php echo intval( $client->client_id ); ?>" value="<?php echo intval( $client->client_id ); ?>" id="selected_clients_<?php echo intval( $client->client_id ); ?>" <?php echo $selected ? 'checked="true"' : ''; ?> />
|
|
<label for="selected_clients_<?php echo intval( $client->client_id ); ?>">
|
|
<span class="client-contact-name"><?php echo esc_html( $client->name ); ?></span>
|
|
</label>
|
|
</div>
|
|
<?php
|
|
} else {
|
|
?>
|
|
<div title="<?php echo esc_html( $client->name ); ?>" class="mainwp_selected_clients_item item ui <?php echo esc_html( $type ); ?> <?php echo $selected ? 'selected_clients_item_checked' : ''; ?>">
|
|
<input type="<?php echo esc_html( $type ); ?>" disabled="disabled"/>
|
|
<label for="selected_clients_<?php echo intval( $client->client_id ); ?>">
|
|
<span class="client-contact-name"><?php echo esc_html( stripslashes( $client->name ) ); ?></span>
|
|
</label>
|
|
</div>
|
|
<?php
|
|
}
|
|
}
|
|
endif;
|
|
?>
|
|
</div>
|
|
</div>
|
|
<?php
|
|
/**
|
|
* Action: mainwp_after_select_clients_list
|
|
*
|
|
* Fires after the Select Clients list.
|
|
*
|
|
* @param object $clients Object containing Clients info.
|
|
*
|
|
* @since 4.1
|
|
*/
|
|
do_action( 'mainwp_after_select_clients_list', $clients );
|
|
}
|
|
|
|
/**
|
|
* Method render_create_tag_modal()
|
|
*
|
|
* Renders the Create Tag modal.
|
|
*/
|
|
public static function render_create_tag_modal() {
|
|
?>
|
|
<div class="ui mini modal" id="mainwp-create-group-sites-modal">
|
|
<i class="close icon"></i>
|
|
<div class="header"><?php echo esc_html__( 'Create Tag', 'mainwp' ); ?></div>
|
|
<div class="content">
|
|
<div id="mainwp-message-zone-tag" style="display: none;">
|
|
<div class="ui message red"></div>
|
|
</div>
|
|
<div class="ui form">
|
|
<div class="field">
|
|
<label><?php esc_html_e( 'Enter tag name', 'mainwp' ); ?></label>
|
|
<input type="text" value="" name="mainwp-group-name" id="mainwp-group-name">
|
|
</div>
|
|
<div class="field">
|
|
<label><?php esc_html_e( 'Select tag color', 'mainwp' ); ?></label>
|
|
<input type="color" name="mainwp-group-color" class="mainwp-color-picker-input" id="mainwp-group-color" value="" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="actions">
|
|
<div class="ui two columns grid">
|
|
<div class="left aligned column">
|
|
|
|
</div>
|
|
<div class="right aligned column">
|
|
<a class="ui green button" id="mainwp-save-new-tag-button" href="javascript:void(0);"><?php echo esc_html__( 'Create Tag', 'mainwp' ); ?></a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<style>
|
|
.mainwp-ui .ui.modal .wp-picker-clear {
|
|
display:none;
|
|
}
|
|
.mainwp-ui .ui.modal #mainwp-group-color {
|
|
height: 28px;
|
|
margin-left: 5px;
|
|
}
|
|
</style>
|
|
</div>
|
|
<?php
|
|
}
|
|
}
|