diff --git a/wp-admin/admin-ajax.php b/wp-admin/admin-ajax.php index 0627e3148..a896b738a 100644 --- a/wp-admin/admin-ajax.php +++ b/wp-admin/admin-ajax.php @@ -34,7 +34,7 @@ send_nosniff_header(); do_action( 'admin_init' ); -$core_actions_get = array( 'fetch-list', 'ajax-tag-search', 'wp-compression-test', 'imgedit-preview', 'oembed_cache' ); +$core_actions_get = array( 'fetch-list', 'ajax-tag-search', 'wp-compression-test', 'imgedit-preview', 'oembed_cache', 'autocomplete-user' ); $core_actions_post = array( 'oembed_cache', 'image-editor', 'delete-comment', 'delete-tag', 'delete-link', diff --git a/wp-admin/css/wp-admin.dev.css b/wp-admin/css/wp-admin.dev.css index 93f024bef..8512c426c 100644 --- a/wp-admin/css/wp-admin.dev.css +++ b/wp-admin/css/wp-admin.dev.css @@ -892,6 +892,45 @@ p.search-box { margin: 0; } +input[type="text"].ui-autocomplete-loading { + background: transparent url('../images/loading.gif') no-repeat right center; + visibility: visible; +} + +ul#add-to-blog-users { + margin: 0 0 0 14px; +} + +.ui-autocomplete { + padding: 0; + margin: 0; + list-style: none; + position: absolute; + z-index: 10000; + border-width: 1px; + border-style: solid; + + background-color: #ececec; + border-color: gray; +} + +.ui-autocomplete li { + padding: 2px 5px; + white-space: nowrap; + text-align: left; + color: #101010; +} + +.ui-autocomplete li a { + display: block; + height: 100%; + padding: 2px 5px; + color: #333; +} + +.ui-autocomplete li a.ui-state-hover { + background-color: #f0f0b8; +} /*------------------------------------------------------------------------------ 3.0 - Actions diff --git a/wp-admin/includes/ajax-actions.php b/wp-admin/includes/ajax-actions.php index f601ecfbf..0a5f9c4e2 100644 --- a/wp-admin/includes/ajax-actions.php +++ b/wp-admin/includes/ajax-actions.php @@ -149,6 +149,38 @@ function wp_ajax_oembed_cache() { wp_die( $return ); } +function wp_ajax_autocomplete_user() { + if ( !is_multisite() || !current_user_can( 'promote_users' ) || wp_is_large_network( 'users' ) || !is_super_admin() && apply_filters( 'autocomplete_users_for_site_admins', false ) ) + wp_die( -1 ); + + $return = array(); + + // Exclude current users of this blog + if ( isset( $_REQUEST['site_id'] ) ) + $id = absint( $_REQUEST['site_id'] ); + else + $id = get_current_blog_id(); + + $this_blog_users = get_users( array( 'blog_id' => $id, 'fields' => 'ID' ) ); + + $users = get_users( array( + 'blog_id' => false, + 'search' => '*' . $_REQUEST['term'] . '*', + 'exclude' => $this_blog_users, + 'search_columns' => array( 'user_login', 'user_nicename', 'user_email' ), + ) ); + + foreach ( $users as $user ) { + $return[] = array( + /* translators: 1: user_login, 2: user_email */ + 'label' => sprintf( __( '%1$s (%2$s)' ), $user->user_login, $user->user_email ), + 'value' => $user->user_login, + ); + } + + wp_die( json_encode( $return ) ); +} + /* * Ajax helper. */ diff --git a/wp-admin/js/user-search.dev.js b/wp-admin/js/user-search.dev.js new file mode 100644 index 000000000..f42cc5182 --- /dev/null +++ b/wp-admin/js/user-search.dev.js @@ -0,0 +1,9 @@ +jQuery( function($) { + var id = typeof( current_site_id ) != 'undefined' ? '&site_id=' + current_site_id : ''; + + $( '#adduser-email, #newuser' ).autocomplete({ + source: ajaxurl + '?action=autocomplete-user' + id, + delay: 500, + minLength: 2, + }); +}); \ No newline at end of file diff --git a/wp-admin/js/user-search.js b/wp-admin/js/user-search.js new file mode 100644 index 000000000..e69de29bb diff --git a/wp-admin/network/site-users.php b/wp-admin/network/site-users.php index b9835fd0c..9be8ed597 100644 --- a/wp-admin/network/site-users.php +++ b/wp-admin/network/site-users.php @@ -171,8 +171,18 @@ $title = sprintf( __('Edit Site: %s'), $site_url_no_http ); $parent_file = 'sites.php'; $submenu_file = 'sites.php'; +if ( current_user_can( 'promote_users' ) && apply_filters( 'show_network_site_users_add_existing_form', true ) && !wp_is_large_network( 'users' ) ) + wp_enqueue_script( 'user-search' ); + require('../admin-header.php'); ?> + + +

diff --git a/wp-admin/user-new.php b/wp-admin/user-new.php index 52db31410..472cb05e8 100644 --- a/wp-admin/user-new.php +++ b/wp-admin/user-new.php @@ -178,8 +178,10 @@ get_current_screen()->set_help_sidebar( wp_enqueue_script('wp-ajax-response'); wp_enqueue_script('user-profile'); +if ( is_multisite() && current_user_can( 'promote_users' ) && !wp_is_large_network( 'users' ) && is_super_admin() || apply_filters( 'autocomplete_users_for_site_admins', false ) ) + wp_enqueue_script( 'user-search' ); -require_once ('admin-header.php'); +require_once( 'admin-header.php' ); if ( isset($_GET['update']) ) { $messages = array(); diff --git a/wp-includes/script-loader.php b/wp-includes/script-loader.php index 3201e72f6..918c0860b 100644 --- a/wp-includes/script-loader.php +++ b/wp-includes/script-loader.php @@ -260,6 +260,8 @@ function wp_default_scripts( &$scripts ) { $scripts->add( 'user-profile', "/wp-admin/js/user-profile$suffix.js", array( 'jquery', 'password-strength-meter' ), false, 1 ); + $scripts->add( 'user-search', "/wp-admin/js/user-search$suffix.js", array( 'jquery-ui-autocomplete' ), false, 1 ); + $scripts->add( 'admin-bar', "/wp-includes/js/admin-bar$suffix.js", array(), false, 1 ); $scripts->add( 'wplink', "/wp-includes/js/wplink$suffix.js", array( 'jquery', 'wpdialogs' ), false, 1 );