38217-vm/wp-content/plugins/mainwp/class/class-mainwp-ui-select-sites.php
2026-02-05 17:08:59 +03:00

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
}
}