From 4d8799b4f9fd3ab2518f8eaecb7e97f591adaad7 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Tue, 6 Jun 2023 17:00:45 +0300 Subject: [PATCH] - added users dropdown field. Closed #1034 --- includes/admin/assets/js/um-admin-forms.js | 45 ++++++++++++++++-- includes/admin/core/class-admin-forms.php | 31 +++++++++---- includes/admin/core/class-admin-users.php | 53 ++++++++++------------ 3 files changed, 88 insertions(+), 41 deletions(-) diff --git a/includes/admin/assets/js/um-admin-forms.js b/includes/admin/assets/js/um-admin-forms.js index 314d6d24..bd183335 100644 --- a/includes/admin/assets/js/um-admin-forms.js +++ b/includes/admin/assets/js/um-admin-forms.js @@ -1,17 +1,48 @@ function um_admin_init_users_select() { if ( jQuery('.um-user-select-field').length ) { + function avatarformat( data ) { + var option; + if ( ! data.id ) { + return data.text; + } + if ( 'undefined' !== typeof data.img ) { + option = jQuery(' ' + data.text + ''); + } else { + var img = data.element.attributes['data-img']['value']; + if ( img ) { + option = jQuery(' ' + data.text + ''); + } else { + option = jQuery('' + data.text + ''); + } + } + return option; + } + var select2_atts = { ajax: { url: wp.ajax.settings.url, dataType: 'json', delay: 250, // delay in ms while typing when to perform a AJAX search data: function( params ) { - return { - search: params.term, // search query + var args = { action: 'um_get_users', // AJAX action for admin-ajax.php + search: params.term, // search query page: params.page || 1, // infinite scroll pagination nonce: um_admin_scripts.nonce }; + + jQuery.each( jQuery(this)[0].attributes, function() { + // this.attributes is not a plain object, but an array + // of attribute nodes, which contain both the name and value + if ( this.specified ) { + if ( -1 !== this.name.indexOf( 'data-ajax-args-' ) ) { + var arg_name = this.name.replace( 'data-ajax-args-', '' ).trim(); + args[ arg_name ] = this.value; + } + } + }); + + return args; }, processResults: function( response, params ) { params.page = params.page || 1; @@ -19,7 +50,11 @@ function um_admin_init_users_select() { if ( response.data.users ) { jQuery.each( response.data.users, function( index, text ) { - options.push( { id: text.ID, text: text.user_login + ' (#' + text.ID + ')' } ); + if ( typeof text.img !== 'undefined' ) { + options.push({ id: text.ID, text: text.user_login + ' (#' + text.ID + ')', img: text.img }); + } else { + options.push( { id: text.ID, text: text.user_login + ' (#' + text.ID + ')' } ); + } }); } @@ -38,7 +73,9 @@ function um_admin_init_users_select() { allowHtml: true, dropdownCssClass: 'um-select2-users-dropdown', containerCssClass : 'um-select2-users-container', - placeholder: jQuery(this).data('placeholder') + placeholder: jQuery(this).data('placeholder'), + templateSelection: avatarformat, + templateResult: avatarformat }; jQuery('.um-user-select-field').select2( select2_atts ); diff --git a/includes/admin/core/class-admin-forms.php b/includes/admin/core/class-admin-forms.php index 260d29a9..8ffc9424 100644 --- a/includes/admin/core/class-admin-forms.php +++ b/includes/admin/core/class-admin-forms.php @@ -576,33 +576,39 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) { * * @return bool|string */ - function render_users_dropdown( $field_data ) { + public function render_users_dropdown( $field_data ) { if ( empty( $field_data['id'] ) ) { return false; } $multiple = ! empty( $field_data['multi'] ) ? 'multiple' : ''; - $id = ( ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] : '' ) . '_' . $field_data['id']; + $id = ( ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] : '' ) . '_' . $field_data['id']; $id_attr = ' id="' . esc_attr( $id ) . '" '; - $class = ! empty( $field_data['class'] ) ? $field_data['class'] . ' ' : ' '; - $class .= ! empty( $field_data['size'] ) ? 'um-' . $field_data['size'] . '-field' : 'um-long-field'; + $class = ! empty( $field_data['class'] ) ? $field_data['class'] . ' ' : ' '; + $class .= ! empty( $field_data['size'] ) ? 'um-' . $field_data['size'] . '-field' : 'um-long-field'; $class_attr = ' class="um-forms-field um-user-select-field' . esc_attr( $class ) . '" '; $data = array( 'field_id' => $field_data['id'], + 'avatar' => ! empty( $field_data['avatar'] ) ? 1 : 0, ); + if ( ! empty( $field_data['data'] ) && is_array( $field_data['data'] ) ) { + $data = array_merge( $data, $field_data['data'] ); + } + $data_attr = ''; foreach ( $data as $key => $value ) { $data_attr .= ' data-' . $key . '="' . esc_attr( $value ) . '" '; } - $name = $field_data['id']; - $name = ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] . '[' . $name . ']' : $name; + $name = $field_data['id']; + $name = ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] . '[' . $name . ']' : $name; $hidden_name_attr = ' name="' . $name . '" '; - $name = $name . ( ! empty( $field_data['multi'] ) ? '[]' : '' ); + + $name = $name . ( ! empty( $field_data['multi'] ) ? '[]' : '' ); $name_attr = ' name="' . $name . '" '; $value = $this->get_field_value( $field_data ); @@ -620,15 +626,22 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) { $options = ''; if ( ! empty( $users ) ) { foreach ( $users as $user ) { - $options .= ''; + if ( ! empty( $field_data['avatar'] ) ) { + $url = get_avatar_url( $user->ID, 'size=20' ); + $options .= ''; + } else { + $options .= ''; + } } } + $placeholder = ! empty( $field_data['placeholder'] ) ? $field_data['placeholder'] : __( 'Select Users', 'ultimate-member' ); + $hidden = ''; if ( ! empty( $multiple ) ) { $hidden = ""; } - $html = "$hidden"; + $html = "$hidden"; return $html; } diff --git a/includes/admin/core/class-admin-users.php b/includes/admin/core/class-admin-users.php index 09cef460..e8c7c296 100644 --- a/includes/admin/core/class-admin-users.php +++ b/includes/admin/core/class-admin-users.php @@ -1,13 +1,12 @@ admin()->check_ajax_nonce(); $search_request = ! empty( $_REQUEST['search'] ) ? sanitize_text_field( $_REQUEST['search'] ) : ''; @@ -53,17 +51,26 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { $args = array( 'fields' => array( 'ID', 'user_login' ), 'paged' => $page, - 'number' => $per_page + 'number' => $per_page, ); if ( ! empty( $search_request ) ) { - $args['search'] = $search_request; + $args['search'] = '*' . $search_request . '*'; } + $args = apply_filters( 'um_get_users_list_ajax_args', $args ); + $users_query = new \WP_User_Query( $args ); $users = $users_query->get_results(); $total_count = $users_query->get_total(); + if ( ! empty( $_REQUEST['avatar'] ) ) { + foreach ( $users as $key => $user ) { + $url = get_avatar_url( $user->ID ); + $users[ $key ]->img = $url; + } + } + wp_send_json_success( array( 'users' => $users, @@ -72,7 +79,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { ); } - /** * Restrict the edit/delete users via wp-admin screen by the UM role capabilities * @@ -83,7 +89,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { * * @return mixed */ - function map_caps_by_role( $allcaps, $cap, $args, $user ) { + public function map_caps_by_role( $allcaps, $cap, $args, $user ) { if ( isset( $cap[0] ) && $cap[0] == 'edit_users' ) { if ( isset( $args[0] ) && isset( $args[1] ) && ! user_can( $args[1], 'administrator' ) && $args[0] == 'edit_user' ) { if ( isset( $args[2] ) && ! UM()->roles()->um_current_user_can( 'edit', $args[2] ) ) { @@ -107,13 +113,12 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { return $allcaps; } - /** * Does an action to user asap * * @param string $action */ - function user_action_hook( $action ) { + public function user_action_hook( $action ) { switch ( $action ) { default: /** @@ -176,12 +181,12 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { } } - /** * Add UM Bulk actions to Users List Table * */ - function restrict_manage_users() { ?> + public function restrict_manage_users() { + ?>
@@ -197,16 +202,16 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { - ID; $actions['frontend_profile'] = '' . __( 'View profile', 'ultimate-member' ) . ''; @@ -312,14 +316,13 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { return $actions; } - /** * Change default sorting at WP Users list table * * @param array $args * @return array */ - function hide_by_caps( $args ) { + public function hide_by_caps( $args ) { if ( ! current_user_can( 'administrator' ) ) { $can_view_roles = um_user( 'can_view_roles' ); if ( um_user( 'can_view_all' ) && ! empty( $can_view_roles ) ) { @@ -330,7 +333,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { return $args; } - /** * Change default sorting at WP Users list table * @@ -350,7 +352,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { return $query; } - /** * Filter WP users by UM Status * @@ -385,7 +386,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { return $query; } - /** * Add status links to WP Users List Table * @@ -474,7 +474,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { return $views; } - /** * Bulk user editing actions */ @@ -561,14 +560,13 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { } } - /** * Sets redirect URI after bulk action * * @param string $uri * @return string */ - function set_redirect_uri( $uri ) { + public function set_redirect_uri( $uri ) { if ( ! empty( $_REQUEST['s'] ) ) { $uri = add_query_arg( 's', sanitize_text_field( $_REQUEST['s'] ), $uri ); @@ -581,6 +579,5 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { return $uri; } - } }