Skip to:
Content

BuddyPress.org

Ticket #8045: 8045.4.patch

File 8045.4.patch, 49.2 KB (added by imath, 6 years ago)
  • new file src/bp-core/bp-core-rest-api.php

    diff --git src/bp-core/bp-core-rest-api.php src/bp-core/bp-core-rest-api.php
    new file mode 100644
    index 000000000..d4ad8319c
    - +  
     1<?php
     2/**
     3 * Core REST API functions.
     4 *
     5 * @package BuddyPress
     6 * @subpackage Core
     7 * @since 5.0.0
     8 */
     9
     10// Exit if accessed directly.
     11defined( 'ABSPATH' ) || exit;
     12
     13/**
     14 * Is the BP REST plugin is active?
     15 *
     16 * @since 5.0.0
     17 *
     18 * @return boolean True if the BP REST plugin is active. False otherwise.
     19 */
     20function bp_rest_is_plugin_active() {
     21    return (bool) has_action( 'bp_rest_api_init', 'bp_rest', 5 );
     22}
     23
     24/**
     25 * Check the availability of the BP REST API.
     26 *
     27 * @since 5.0.0
     28 *
     29 * @return boolean True if the BP REST API is available. False otherwise.
     30 */
     31function bp_rest_api_is_available() {
     32    /**
     33     * Filter here to disable the BP REST API.
     34     *
     35     * The BP REST API requires at least WordPress 4.7.0
     36     *
     37     * @since 5.0.0
     38     *
     39     * @param boolean $value True if the BP REST API is available. False otherwise.
     40     */
     41    return apply_filters( 'bp_rest_api_is_available', function_exists( 'create_initial_rest_routes' ) && bp_rest_is_plugin_active() );
     42}
     43
     44/**
     45 * Register the jQuery.ajax wrapper for BP REST API requests.
     46 *
     47 * @since 5.0.0
     48 */
     49function bp_rest_api_register_request_script() {
     50    if ( ! bp_rest_api_is_available() ) {
     51        return;
     52    }
     53
     54    $dependencies = array( 'jquery' );
     55
     56    // The wrapper for WP REST API requests was introduced in WordPress 4.9.0
     57    if ( wp_script_is( 'wp-api-request', 'registered' ) ) {
     58        $dependencies = array( 'wp-api-request' );
     59    }
     60
     61    wp_register_script(
     62        'bp-api-request',
     63        sprintf( '%1$sbp-core/js/bp-api-request%2$s.js', buddypress()->plugin_url, bp_core_get_minified_asset_suffix() ),
     64        $dependencies,
     65        bp_get_version(),
     66        true
     67    );
     68    wp_localize_script(
     69        'bp-api-request',
     70        'bpApiSettings',
     71        array(
     72            'root'  => esc_url_raw( get_rest_url() ),
     73            'nonce' => wp_create_nonce( 'wp_rest' ),
     74        )
     75    );
     76}
     77add_action( 'bp_init', 'bp_rest_api_register_request_script' );
  • new file src/bp-core/js/bp-api-request.js

    diff --git src/bp-core/js/bp-api-request.js src/bp-core/js/bp-api-request.js
    new file mode 100644
    index 000000000..adae8c848
    - +  
     1/**
     2 * jQuery.ajax wrapper for BP REST API requests.
     3 *
     4 * @since  5.0.0
     5 * @output bp-core/js/bp-api-request.js
     6 */
     7/* global bpApiSettings */
     8window.bp = window.bp || {};
     9
     10( function( wp, bp, $ ) {
     11    // Bail if not set
     12    if ( typeof bpApiSettings === 'undefined' ) {
     13        return;
     14    }
     15
     16    bp.isRestEnabled = true;
     17
     18    // Polyfill wp.apiRequest if WordPress < 4.9
     19    bp.apiRequest = wp.apiRequest || function( options ) {
     20        var url = bpApiSettings.root;
     21
     22        if ( options.path ) {
     23            url = url + options.path.replace( /^\//, '' );
     24        }
     25
     26        options.url = url;
     27        options.beforeSend = function( xhr ) {
     28            xhr.setRequestHeader( 'X-WP-Nonce', bpApiSettings.nonce );
     29        };
     30
     31        return $.ajax( options );
     32    };
     33
     34} )( window.wp || {}, window.bp, jQuery );
  • src/bp-groups/admin/css/admin-rtl.css

    diff --git src/bp-groups/admin/css/admin-rtl.css src/bp-groups/admin/css/admin-rtl.css
    index cf0df3cf0..bb0fbd45b 100644
    table.bp-group-members .urole-column { 
    140140        padding-left: 20px;
    141141}
    142142
     143#group-manage-members-ui .subnav-filters .filter.last {
     144        float: left;
     145}
     146
     147#group-manage-members-ui .subnav-filters .left-menu {
     148        float: right;
     149}
     150
     151#group-manage-members-ui .subnav-filters .group-members-paginate-button:last-child {
     152        margin-left: 2em;
     153}
     154
     155#group-manage-members-ui .subnav-filters .dashicons {
     156        padding-top: 2px;
     157}
     158
     159#group-manage-members-ui .uname-column .profile-photo {
     160        margin-left: 1em;
     161}
     162
    143163@media screen and (max-width: 782px) {
    144164
    145165        .bp-groups-settings-section label {
  • src/bp-groups/admin/css/admin.css

    diff --git src/bp-groups/admin/css/admin.css src/bp-groups/admin/css/admin.css
    index 0a7887a10..0770218aa 100644
    table.bp-group-members .urole-column { 
    140140        padding-right: 20px;
    141141}
    142142
     143#group-manage-members-ui .subnav-filters .filter.last {
     144        float: right;
     145}
     146
     147#group-manage-members-ui .subnav-filters .left-menu {
     148        float: left;
     149}
     150
     151#group-manage-members-ui .subnav-filters .group-members-paginate-button:last-child {
     152        margin-right: 2em;
     153}
     154
     155#group-manage-members-ui .subnav-filters .dashicons {
     156        padding-top: 2px;
     157}
     158
     159#group-manage-members-ui .uname-column .profile-photo {
     160        margin-right: 1em;
     161}
     162
    143163@media screen and (max-width: 782px) {
    144164
    145165        .bp-groups-settings-section label {
  • src/bp-groups/bp-groups-admin.php

    diff --git src/bp-groups/bp-groups-admin.php src/bp-groups/bp-groups-admin.php
    index dd504673a..56338699a 100644
    function bp_groups_admin_edit_metabox_add_new_members( $item ) { 
    891891 * @param BP_Groups_Group $item The BP_Groups_Group object for the current group.
    892892 */
    893893function bp_groups_admin_edit_metabox_members( $item ) {
     894        // Use the BP REST API if it supported.
     895        if ( bp_rest_api_is_available() && bp_groups_has_manage_group_members_templates() ) {
     896                wp_enqueue_script( 'bp-group-manage-members' );
     897                wp_localize_script(
     898                        'bp-group-manage-members',
     899                        'bpGroupManageMembersSettings',
     900                        bp_groups_get_group_manage_members_script_data( $item->id )
     901                );
     902
     903                bp_get_template_part( 'common/js-templates/group-members/index' );
     904
     905                /**
     906                 * Echo out the JavaScript variable.
     907                 * This seems to be required by the autocompleter, leaving this here for now...
     908                 */
     909                echo '<script type="text/javascript">var group_id = "' . esc_js( $item->id ) . '";</script>';
     910                return;
     911        }
    894912
    895913        // Pull up a list of group members, so we can separate out the types
    896914        // We'll also keep track of group members here to place them into a
  • new file src/bp-groups/bp-groups-cssjs.php

    diff --git src/bp-groups/bp-groups-cssjs.php src/bp-groups/bp-groups-cssjs.php
    new file mode 100644
    index 000000000..61368a56a
    - +  
     1<?php
     2/**
     3 * Groups component CSS/JS
     4 *
     5 * @package BuddyPress
     6 * @subpackage GroupsScripts
     7 * @since 5.0.0
     8 */
     9
     10// Exit if accessed directly.
     11defined( 'ABSPATH' ) || exit;
     12
     13/**
     14 * Register Groups JavaScripts.
     15 *
     16 * @since 5.0.0
     17 */
     18function bp_groups_register_scripts() {
     19    wp_register_script(
     20        'bp-group-manage-members',
     21        sprintf( '%1$sbp-groups/js/manage-members%2$s.js', buddypress()->plugin_url, bp_core_get_minified_asset_suffix() ),
     22        array( 'json2', 'wp-backbone', 'bp-api-request' ),
     23        bp_get_version(),
     24        true
     25    );
     26}
     27add_action( 'bp_enqueue_scripts',       'bp_groups_register_scripts', 1 );
     28add_action( 'bp_admin_enqueue_scripts', 'bp_groups_register_scripts', 1 );
     29
     30/**
     31 * Get JavaScript data for the Manage Group Members UI.
     32 *
     33 * @since 5.0.0
     34 *
     35 * @param  integer $group_id Required. The Group ID whose members has to be managed.
     36 * @return array   The JavaScript data.
     37 */
     38function bp_groups_get_group_manage_members_script_data( $group_id = 0 ) {
     39        if ( ! $group_id ) {
     40                return array();
     41        } else {
     42                $group_id = (int) $group_id;
     43        }
     44
     45        $path = sprintf( '/%1$s/%2$s/%3$s/%4$s/members?exclude_admins=false',
     46                bp_rest_namespace(),
     47                bp_rest_version(),
     48                buddypress()->groups->id,
     49                $group_id
     50        );
     51
     52        $preloaded_members = array();
     53        if ( function_exists( 'rest_preload_api_request' ) ) {
     54                $preloaded_members = rest_preload_api_request( '', $path );
     55        }
     56
     57        return array(
     58                'path'      => remove_query_arg( 'exclude_admins', $path ),
     59                'preloaded' => reset( $preloaded_members ),
     60                'roles'     => bp_groups_get_group_roles(),
     61        );
     62}
  • src/bp-groups/bp-groups-functions.php

    diff --git src/bp-groups/bp-groups-functions.php src/bp-groups/bp-groups-functions.php
    index b391afd76..e51263ca1 100644
    function groups_avatar_upload_dir( $group_id = 0 ) { 
    11111111
    11121112/** Group Member Status Checks ************************************************/
    11131113
     1114/**
     1115 * Get the Group roles.
     1116 *
     1117 * @since 5.0.0
     1118 *
     1119 * @return array The list of Group role objects.
     1120 */
     1121function bp_groups_get_group_roles() {
     1122        return array(
     1123                'admin' => (object) array(
     1124                        'id'           => 'admin',
     1125                        'name'         => __( 'Administrator', 'buddypress' ),
     1126                        'is_admin'     => true,
     1127                        'is_banned'    => false,
     1128                        'is_confirmed' => true,
     1129                        'is_mod'       => false,
     1130                ),
     1131                'mod' => (object) array(
     1132                        'id'           => 'mod',
     1133                        'name'         => __( 'Moderator', 'buddypress' ),
     1134                        'is_admin'     => false,
     1135                        'is_banned'    => false,
     1136                        'is_confirmed' => true,
     1137                        'is_mod'       => true,
     1138                ),
     1139                'member' => (object) array(
     1140                        'id'           => 'member',
     1141                        'name'         => __( 'Member', 'buddypress' ),
     1142                        'is_admin'     => false,
     1143                        'is_banned'    => false,
     1144                        'is_confirmed' => true,
     1145                        'is_mod'       => false,
     1146                ),
     1147                'banned' => (object) array(
     1148                        'id'           => 'banned',
     1149                        'name'         => __( 'Banned', 'buddypress' ),
     1150                        'is_admin'     => false,
     1151                        'is_banned'    => true,
     1152                        'is_confirmed' => true,
     1153                        'is_mod'       => false,
     1154                ),
     1155        );
     1156}
     1157
    11141158/**
    11151159 * Check whether a user is an admin of a given group.
    11161160 *
  • src/bp-groups/bp-groups-template.php

    diff --git src/bp-groups/bp-groups-template.php src/bp-groups/bp-groups-template.php
    index 575eeaceb..9096c4b39 100644
    function bp_groups_get_profile_stats( $args = '' ) { 
    62176217         */
    62186218        return apply_filters( 'bp_groups_get_profile_stats', $r['output'], $r );
    62196219}
     6220
     6221/**
     6222 * Check if the active template pack includes the Group Membership management UI templates.
     6223 *
     6224 * @since 5.0.0
     6225 *
     6226 * @return boolean True if the active template pack includes the Group Membership management UI templates.
     6227 *                 False otherwise.
     6228 */
     6229function bp_groups_has_manage_group_members_templates() {
     6230        return file_exists( bp_locate_template( 'common/js-templates/group-members/index.php' ) );
     6231}
  • src/bp-groups/classes/class-bp-groups-component.php

    diff --git src/bp-groups/classes/class-bp-groups-component.php src/bp-groups/classes/class-bp-groups-component.php
    index f7d45658d..99c5a7f31 100644
    class BP_Groups_Component extends BP_Component { 
    128128                        'template',
    129129                        'adminbar',
    130130                        'functions',
    131                         'notifications'
     131                        'notifications',
     132                        'cssjs',
    132133                );
    133134
    134135                // Conditional includes.
  • new file src/bp-groups/js/manage-members.js

    diff --git src/bp-groups/js/manage-members.js src/bp-groups/js/manage-members.js
    new file mode 100644
    index 000000000..ce01bb0a2
    - +  
     1/* global bpGroupManageMembersSettings, _, Backbone */
     2/* @version 5.0.0 */
     3
     4( function( wp, bp, $ ) {
     5
     6        // Bail if not set
     7        if ( typeof bpGroupManageMembersSettings === 'undefined' || ! bp.isRestEnabled ) {
     8                return;
     9        }
     10
     11        // Copy useful WP Objects into BP.
     12        _.extend( bp, _.pick( wp, 'Backbone', 'template' ) );
     13
     14        bp.Models      = bp.Models || {};
     15        bp.Collections = bp.Collections || {};
     16        bp.Views       = bp.Views || {};
     17
     18        /**
     19         * Model for the Member of the displayed group.
     20         */
     21        bp.Models.groupMember = Backbone.Model.extend( {
     22                defaults: {
     23                        id: 0,
     24                        name: '',
     25                        avatar_urls : {},
     26                        is_admin: false,
     27                        is_banned: false,
     28                        is_confirmed: false,
     29                        is_mod: false,
     30                        link: ''
     31                },
     32                options : {
     33                        path: bpGroupManageMembersSettings.path,
     34                        type: 'POST',
     35                        data: {},
     36                        dataType: 'json'
     37                },
     38
     39                initialize: function() {
     40                        // Make sure to reset data & path on model's sync.
     41                        this.on( 'sync', this.resetRequestOptions, this );
     42                },
     43
     44                resetRequestOptions: function() {
     45                        this.options.data = {};
     46                        this.options.path = bpGroupManageMembersSettings.path;
     47                },
     48
     49                sync: function( method, model, options ) {
     50                        options  = options || {};
     51                        options.context = this;
     52                        var data = options.data || {};
     53                        this.options.path = this.options.path.concat( '/' + model.get( 'id' ) );
     54
     55                        _.extend( options, this.options );
     56                        _.extend( options.data, data );
     57
     58                        if ( 'delete' === method || 'update' === method ) {
     59                                if ( 'delete' === method ) {
     60                                        options.headers = { 'X-HTTP-Method-Override': 'DELETE' };
     61                                } else {
     62                                        options.headers = { 'X-HTTP-Method-Override': 'PUT' };
     63                                }
     64
     65                                return bp.apiRequest( options );
     66                        }
     67                },
     68
     69                parse: function( response ) {
     70                        if ( _.isArray( response ) ) {
     71                                response = _.first( response );
     72                        }
     73
     74                        return response;
     75                }
     76        } );
     77
     78        /**
     79         * Collection for the Members of the displayed group.
     80         */
     81        bp.Collections.groupMembers = Backbone.Collection.extend( {
     82                model: bp.Models.groupMember,
     83                options : {
     84                        path: bpGroupManageMembersSettings.path,
     85                        type: 'GET',
     86                        data: {},
     87                        dataType: 'json'
     88                },
     89
     90                initialize: function() {
     91                        // Make sure to reset data on collection's reset.
     92                        this.on( 'reset', function() {
     93                                this.options.data = {};
     94                        }, this );
     95                },
     96
     97                sync: function( method, collection, options ) {
     98                        options  = options || {};
     99                        options.context = this;
     100                        var data = options.data || {};
     101
     102                        _.extend( options, this.options );
     103                        _.extend( options.data, data );
     104
     105                        if ( 'read' === method ) {
     106                                var self = this, success = options.success;
     107                                options.success = function( data, textStatus, request ) {
     108                                        if ( ! _.isUndefined( request ) ) {
     109                                                self.totalPages        = parseInt( request.getResponseHeader( 'X-WP-TotalPages' ), 10 );
     110                                                self.totalGroupMembers = parseInt( request.getResponseHeader( 'X-WP-Total' ), 10 );
     111                                        }
     112
     113                                        self.currentPage = options.data.page || 1;
     114
     115                                        if ( success ) {
     116                                                return success.apply( this, arguments );
     117                                        }
     118                                };
     119
     120                                return bp.apiRequest( options );
     121                        }
     122                }
     123        } );
     124
     125        // Extend wp.Backbone.View with .prepare().
     126        bp.View = bp.View || bp.Backbone.View.extend( {
     127                prepare: function() {
     128                        if ( ! _.isUndefined( this.model ) && _.isFunction( this.model.toJSON ) ) {
     129                                return this.model.toJSON();
     130                        } else {
     131                                return {};
     132                        }
     133                }
     134        } );
     135
     136        bp.Views.GroupMemberUpdatingInfo = bp.View.extend( {
     137                tagName: 'p',
     138                template : bp.template( 'bp-manage-members-updating' ),
     139
     140                initialize: function() {
     141                        this.model = new Backbone.Model( {
     142                                type: this.options.value
     143                        } );
     144                }
     145        } );
     146
     147        bp.Views.GroupMemberErrorInfo = bp.View.extend( {
     148                tagName: 'p',
     149                template : bp.template( 'bp-manage-members-error' ),
     150
     151                initialize: function() {
     152                        this.model = new Backbone.Model( {
     153                                message: this.options.value
     154                        } );
     155                }
     156        } );
     157
     158        bp.Views.GroupsMembersLabel = bp.Views.GroupMemberUpdatingInfo.extend( {
     159                tagName: 'label',
     160                template:  bp.template( 'bp-manage-members-label' )
     161        } );
     162
     163        bp.Views.GroupRolesDropDown = bp.View.extend( {
     164                tagName: 'select',
     165                filters: _.extend( { all: { name: 'All members' } }, bpGroupManageMembersSettings.roles ),
     166
     167                events: {
     168                        change: 'change'
     169                },
     170
     171                initialize: function() {
     172                        if ( this.options.omits ) {
     173                                this.filters = _.omit( this.filters, this.options.omits );
     174                        }
     175
     176                        // Build `<option>` elements.
     177                        this.$el.html( _.chain( this.filters ).map( function( filter, value ) {
     178                                var optionOutput = $( '<option></option>' ).val( value ).html( filter.name )[0];
     179
     180                                if ( this.options.currentRole && value === this.options.currentRole ) {
     181                                        return {
     182                                                el: $( optionOutput ).prop( 'selected', true )
     183                                        };
     184                                } else {
     185                                        return {
     186                                                el: optionOutput
     187                                        };
     188                                }
     189                        }, this ).pluck( 'el' ).value() );
     190                },
     191
     192                change: function( event ) {
     193                        var role =  $( event.target ).val(), queryArgs = { roles: [ role ] };
     194
     195                        if ( ! this.collection ) {
     196                                return;
     197                        }
     198
     199                        if ( 'all' === role ) {
     200                                // Unset the current role.
     201                                this.collection.currentRole = '';
     202
     203                                queryArgs = { 'exclude_admins': false };
     204                        } else {
     205                                // Set the current role.
     206                                this.collection.currentRole = role;
     207                        }
     208
     209                        // Reset the current page.
     210                        this.collection.currentPage = 1;
     211
     212                        queryArgs.page = 1;
     213                        $( '#manage-members-search' ).val( '' );
     214
     215                        this.collection.fetch( {
     216                                data: queryArgs,
     217                                reset: true
     218                        } );
     219                }
     220        } );
     221
     222        bp.Views.GroupMembersSearch = bp.View.extend( {
     223                className: 'bp-dir-search-form',
     224                tagName: 'form',
     225                template:  bp.template( 'bp-manage-members-search' ),
     226
     227                events: {
     228                        'click #manage-members-search-submit' : 'searchMember'
     229                },
     230
     231                searchMember: function( event ) {
     232                        event.preventDefault();
     233
     234                        var searchTerms = $( '#manage-members-search' ).val(),
     235                            queryArgs = _.extend( this.collection.options.data, { search: searchTerms, page: 1 } );
     236
     237                        // Reset the current page.
     238                        this.collection.currentPage = 1;
     239
     240                        if ( ! this.collection.currentRole ) {
     241                                queryArgs.exclude_admins = false;
     242                        } else {
     243                                queryArgs.roles = [ this.collection.currentRole ];
     244                        }
     245
     246                        this.collection.fetch( {
     247                                data: queryArgs,
     248                                reset: true
     249                        } );
     250                }
     251        } );
     252
     253        bp.Views.GroupsMembersPagination = bp.View.extend( {
     254                className: 'bp-pagination',
     255                template:  bp.template( 'bp-manage-members-paginate' ),
     256
     257                events: {
     258                        'click .group-members-paginate-button' : 'queryPage'
     259                },
     260
     261                initialize: function() {
     262                        this.collection.on( 'reset', this.setPagination, this );
     263                },
     264
     265                setPagination: function( collection ) {
     266                        var attributes = _.pick( collection, [ 'currentPage', 'totalGroupMembers', 'totalPages' ] );
     267
     268                        if ( attributes.totalPages > 1 ) {
     269                                attributes.nextPage = attributes.currentPage + 1;
     270                                attributes.prevPage = attributes.currentPage - 1;
     271                        }
     272
     273                        this.model = new Backbone.Model( attributes );
     274                        this.render();
     275                },
     276
     277                queryPage: function( event ) {
     278                        event.preventDefault();
     279
     280                        var page = $( event.currentTarget ).data( 'page' ),
     281                            searchTerms = $( '#manage-members-search' ).val(),
     282                            queryArgs = _.extend( this.collection.options.data, { search: searchTerms, page: page } );
     283
     284                        if ( ! this.collection.currentRole ) {
     285                                queryArgs.exclude_admins = false;
     286                        } else {
     287                                queryArgs.roles = [ this.collection.currentRole ];
     288                        }
     289
     290                        this.collection.fetch( {
     291                                data: queryArgs,
     292                                reset: true
     293                        } );
     294                }
     295        } );
     296
     297        bp.Views.GroupMembersListRow = bp.View.extend( {
     298                tagName: 'tr',
     299                template : bp.template( 'bp-manage-members-row' ),
     300
     301                events: {
     302                        'click .group-member-actions a' : 'doMemberAction',
     303                        'change .group-member-edit select' : 'editMemberRole'
     304                },
     305
     306                initialize: function() {
     307                        var roleProps = [ 'is_admin', 'is_banned', 'is_confirmed', 'is_mod' ],
     308                                self = this;
     309
     310                        _.each( bpGroupManageMembersSettings.roles, function( props ) {
     311                                if ( _.isMatch( self.model.attributes,  _.pick( props, roleProps ) ) ) {
     312                                        self.model.set( 'role', _.pick( props, ['id', 'name'] ), { silent: true } );
     313                                }
     314                        } );
     315
     316                        this.model.collection.on( 'reset', this.clearRow, this );
     317                },
     318
     319                clearRow: function() {
     320                        this.views.view.remove();
     321                },
     322
     323                renderEditForm: function() {
     324                        var userId = this.model.get( 'id' );
     325
     326                        this.render();
     327
     328                        this.views.set( '#edit-group-member-' + userId, [
     329                                new bp.Views.GroupsMembersLabel( { value: userId, attributes: { 'for': 'group-member' + userId + '-role' } } ),
     330                                new bp.Views.GroupRolesDropDown( { id: 'group-member' + userId + '-role', omits: [ 'all', 'banned' ], currentRole: this.model.get( 'role' ).id } ).render()
     331                        ] );
     332                },
     333
     334                resetRow: function() {
     335                        this.model.set( 'editing', false );
     336
     337                        return this.render();
     338                },
     339
     340                getRoleObject: function( roleId ) {
     341                        var roles = bpGroupManageMembersSettings.roles;
     342
     343                        if ( _.isUndefined( roles[ roleId ] ) ) {
     344                                return {};
     345                        }
     346
     347                        return _.extend(
     348                                { role: _.pick( roles[ roleId ], ['id', 'name'] ) },
     349                                _.pick( roles[ roleId ], [ 'is_admin', 'is_banned', 'is_confirmed', 'is_mod' ] )
     350                        );
     351                },
     352
     353                doMemberAction: function( event ) {
     354                        event.preventDefault();
     355
     356                        var action = $( event.target ).data( 'action' ), self = this;
     357
     358                        if ( 'edit' === action ) {
     359                                this.model.set( 'editing', true );
     360                                return this.renderEditForm();
     361
     362                        } else if ( 'abort' === action ) {
     363                                return this.resetRow();
     364
     365                        } else if ( 'ban' === action || 'unban' === action ) {
     366                                var newRole = ( 'ban' === action ) ? 'banned' : 'member', roleObject = this.getRoleObject( newRole );
     367
     368                                if ( ! roleObject ) {
     369                                        return this.resetRow();
     370                                } else {
     371                                        this.model.set( 'managingBan', true );
     372                                        this.render();
     373                                }
     374
     375                                // Display user feedback.
     376                                this.views.set( '#edit-group-member-' + this.model.get( 'id' ), new bp.Views.GroupMemberUpdatingInfo( { value: action } ).render() );
     377
     378                                // Update Group member's role.
     379                                this.model.save( roleObject, {
     380                                        wait: true,
     381                                        data: { action: action },
     382                                        success: function( model) {
     383                                                self.model.collection.remove( model );
     384                                                return self.clearRow();
     385                                        },
     386                                        error: function( model, response ) {
     387                                                self.views.set( '#edit-group-member-' + model.get( 'id' ), new bp.Views.GroupMemberErrorInfo( { value: response.responseJSON.message } ).render() );
     388
     389                                                // Make sure to reset request options.
     390                                                model.resetRequestOptions();
     391                                                model.set( 'managingBan', false );
     392                                        }
     393                                } );
     394                        } else if ( 'remove' === action ) {
     395                                this.model.set( 'removing', true );
     396                                this.render();
     397
     398                                // Display user feedback.
     399                                this.views.set( '#edit-group-member-' + this.model.get( 'id' ), new bp.Views.GroupMemberUpdatingInfo( { value: action } ).render() );
     400
     401                                // Destroy the membership model.
     402                                this.model.destroy( {
     403                                        wait: true,
     404                                        data: {},
     405                                        success: function() {
     406                                                return self.clearRow();
     407                                        },
     408                                        error: function( model, response ) {
     409                                                self.views.set( '#edit-group-member-' + model.get( 'id' ), new bp.Views.GroupMemberErrorInfo( { value: response.responseJSON.message } ).render() );
     410
     411                                                // Make sure to reset request options.
     412                                                model.resetRequestOptions();
     413                                                model.set( 'removing', false );
     414                                        }
     415                                } );
     416                        }
     417                },
     418
     419                editMemberRole: function( event ) {
     420                        var newRole = $( event.target ).val(), roleObject = this.getRoleObject( newRole ),
     421                            currentRole = this.model.get( 'role').id, roleAction = 'promote', self = this;
     422
     423                        if ( newRole === this.model.get( 'role' ).id || ! roleObject ) {
     424                                return this.resetRow();
     425                        }
     426
     427                        this.views.set( '#edit-group-member-' + this.model.get( 'id' ), new bp.Views.GroupMemberUpdatingInfo().render() );
     428
     429                        if ( 'admin' === currentRole || ( 'mod' === currentRole && 'member' === newRole ) ) {
     430                                roleAction = 'demote';
     431                        }
     432
     433                        // Update Group member's role
     434                        this.model.save( roleObject, {
     435                                wait: true,
     436                                data: {
     437                                        action: roleAction,
     438                                        role: newRole
     439                                },
     440                                success: function( model ) {
     441                                        if ( self.model.collection.currentRole && newRole !== self.model.collection.currentRole ) {
     442                                                self.model.collection.remove( model );
     443                                                return self.clearRow();
     444                                        } else {
     445                                                return self.resetRow();
     446                                        }
     447                                },
     448                                error: function( model, response ) {
     449                                        self.views.set( '#edit-group-member-' + model.get( 'id' ), new bp.Views.GroupMemberErrorInfo( { value: response.responseJSON.message } ).render() );
     450
     451                                        // Make sure to reset request options.
     452                                        model.resetRequestOptions();
     453                                        model.set( 'editing', false );
     454                                }
     455                        } );
     456                }
     457        } );
     458
     459        bp.Views.GroupMembersListHeader = bp.View.extend( {
     460                tagName: 'thead',
     461                template : bp.template( 'bp-manage-members-header' )
     462        } );
     463
     464        bp.Views.GroupMembersListTable = bp.View.extend( {
     465                tagName: 'tbody',
     466
     467                initialize: function() {
     468                        var preloaded = bpGroupManageMembersSettings.preloaded || {},
     469                            models = [];
     470
     471                        this.collection.on( 'reset', this.addListTableRows, this );
     472
     473                        if ( preloaded.body && preloaded.body.length > 0 ) {
     474                                _.each( preloaded.body, function( member ) {
     475                                        models.push( new bp.Models.groupMember( member ) );
     476                                } );
     477
     478                                this.collection.currentPage = 1;
     479                                if ( preloaded.headers && preloaded.headers[ 'X-WP-TotalPages' ] ) {
     480                                        this.collection.totalPages = parseInt( preloaded.headers[ 'X-WP-TotalPages' ], 10 );
     481                                }
     482
     483                                if ( preloaded.headers && preloaded.headers[ 'X-WP-Total' ] ) {
     484                                        this.collection.totalGroupMembers = parseInt( preloaded.headers[ 'X-WP-Total' ], 10 );
     485                                }
     486
     487                                this.collection.reset( models );
     488                        } else {
     489                                this.collection.fetch( {
     490                                        data: { 'exclude_admins': false },
     491                                        reset: true
     492                                } );
     493                        }
     494                },
     495
     496                addListTableRows: function( collection ) {
     497                        _.each( collection.models, function( member ) {
     498                                this.views.add( new bp.Views.GroupMembersListRow( { model: member } ) );
     499                        }, this );
     500                }
     501        } );
     502
     503        bp.Views.GroupMembersUI = bp.View.extend( {
     504                className: 'group-members',
     505
     506                initialize: function() {
     507                        var groupMembers = new bp.Collections.groupMembers();
     508
     509                        // Set filters.
     510                        this.views.set( '#group-roles-filter', [
     511                                new bp.Views.GroupsMembersLabel( { attributes: { 'for': 'group-members-role-filter' } } ),
     512                                new bp.Views.GroupRolesDropDown( { id: 'group-members-role-filter', collection: groupMembers } )
     513                        ] );
     514
     515                        // Set the search form.
     516                        this.views.set( '#group-members-search-form', new bp.Views.GroupMembersSearch( { id: 'group-members-search', collection: groupMembers } ) );
     517
     518                        // Set Paginate links.
     519                        this.views.set( '#group-members-pagination', new bp.Views.GroupsMembersPagination( { collection: groupMembers } ) );
     520
     521                        // Set Group members list header and body.
     522                        this.views.set( '#group-members-list-table', [
     523                                new bp.Views.GroupMembersListHeader(),
     524                                new bp.Views.GroupMembersListTable( { collection: groupMembers } )
     525                        ] );
     526                }
     527        } );
     528
     529        // Inject the UI to manage Group Members into the DOM.
     530        bp.manageGroupMembersUI = new bp.Views.GroupMembersUI( { el:'#group-manage-members-ui' } ).render();
     531
     532} )( window.wp || {}, window.bp || {}, jQuery );
  • new file src/bp-templates/bp-nouveau/buddypress/common/js-templates/group-members/index.php

    diff --git src/bp-templates/bp-nouveau/buddypress/common/js-templates/group-members/index.php src/bp-templates/bp-nouveau/buddypress/common/js-templates/group-members/index.php
    new file mode 100644
    index 000000000..f405e612e
    - +  
     1<?php
     2/**
     3 * BP Nouveau single group's membership management main template.
     4 *
     5 * This template is used to inject the BuddyPress Backbone views
     6 * dealing with a group's membership management.
     7 *
     8 * @since 5.0.0
     9 * @version 5.0.0
     10 */
     11?>
     12
     13<?php
     14/**
     15 * Placeholder to inject elements of the UI
     16 * to manage Group members.
     17 *
     18 * @since 5.0.0
     19 * @version 5.0.0
     20 */
     21?>
     22<div id="group-manage-members-ui" class="standard-form">
     23        <ul class="subnav-filters">
     24                <li id="group-roles-filter" class="last filter"><?php // Placeholder for the Group Role Tabs ?></li>
     25                <li id="group-members-pagination" class="left-menu"><?php // Placeholder for paginate links ?></li>
     26                <li id="group-members-search-form" class="bp-search"><?php // Placeholder for search form ?></li>
     27        </ul>
     28        <table id="group-members-list-table" class="<?php echo is_admin() ? 'widefat bp-group-members' : 'bp-list'; ?>"><?php // Placeholder to list members ?></table>
     29</div>
     30
     31<script type="text/html" id="tmpl-bp-manage-members-updating">
     32        <# if ( ! data.type ) { #>
     33                <small><?php echo esc_html_x( 'Updating role... Please wait.', 'group manage members update feedback', 'buddypress' ); ?></small>
     34        <# } else if ( 'ban' === data.type ) { #>
     35                <small><?php echo esc_html_x( 'Banning member... Please wait.', 'group manage members ban feedback', 'buddypress' ); ?></small>
     36        <# } else if ( 'unban' === data.type ) { #>
     37                <small><?php echo esc_html_x( 'Unbanning member... Please wait.', 'group manage members unban feedback', 'buddypress' ); ?></small>
     38        <# } else if ( 'remove' === data.type ) { #>
     39                <small><?php echo esc_html_x( 'Removing member... Please wait.', 'group manage members remove feedback', 'buddypress' ); ?></small>
     40        <# } #>
     41</script>
     42
     43<script type="text/html" id="tmpl-bp-manage-members-error">
     44   <small>{{data.message}}</small>
     45</script>
     46
     47<script type="text/html" id="tmpl-bp-manage-members-header">
     48        <tr>
     49                <th><?php echo esc_html_x( 'Group Members', 'group manage members table header', 'buddypress' ); ?></th>
     50                <th><?php echo esc_html_x( 'Roles', 'group manage members table header', 'buddypress' ); ?></th>
     51        </tr>
     52</script>
     53
     54<script type="text/html" id="tmpl-bp-manage-members-label">
     55        <# if ( data.type && 'filter' !== data.type ) { #>
     56                <?php echo esc_html_x( 'Change role for:', 'group manage members row edit', 'buddypress' ); ?>
     57        <# } else { #>
     58                <?php echo esc_html_x( 'Filter:', 'group manage members roles filter', 'buddypress' ); ?></small>
     59        <# } #>
     60</script>
     61
     62<script type="text/html" id="tmpl-bp-manage-members-row">
     63        <td class="uname-column">
     64                <div class="group-member">
     65                        <a href="{{{data.link}}}">
     66                                <img src="{{{data.avatar_urls.thumb}}}" alt="{{data.name}}" class="avatar profile-photo alignleft"/>
     67                                {{data.name}}
     68                        </a>
     69                </div>
     70                <div class="group-member-actions row-actions">
     71                        <# if ( ! data.editing && ! data.is_banned ) { #>
     72                                <span class="edit"><a href="#edit-role" data-action="edit"><?php echo esc_html_x( 'Edit', 'group member edit role link', 'buddypress' ); ?></a> | </span>
     73                        <# } #>
     74                        <# if ( data.editing ) { #>
     75                                <span><a href="#edit-role-abort" data-action="abort"><?php echo esc_html_x( 'Stop editing', 'group member edit role abort link', 'buddypress' ); ?></a> | </span>
     76                        <# } #>
     77                        <# if ( ! data.is_banned ) { #>
     78                                <span class="spam"><a href="#ban" class="submitdelete" data-action="ban"><?php echo esc_html_x( 'Ban', 'group member ban link', 'buddypress' ); ?></a> | </span>
     79                        <# } else { #>
     80                                <span class="ham"><a href="#unban" data-action="unban"><?php echo esc_html_x( 'Unban', 'group member unban link', 'buddypress' ); ?></a> | </span>
     81                        <# } #>
     82                        <span class="delete"><a href="#remove" class="submitdelete" data-action="remove"><?php echo esc_html_x( 'Remove', 'group member ban link', 'buddypress' ); ?></a></span>
     83                </div>
     84        </td>
     85        <td class="urole-column">
     86                <# if ( ! data.editing  && ! data.managingBan && ! data.removing ) { #>
     87                        {{data.role.name}}
     88                <# } else { #>
     89                        <div id="edit-group-member-{{data.id}}" class="group-member-edit"><?php // Placeholder for the Edit Role Dropdown. ;?></div>
     90                <# } #>
     91        </td>
     92</script>
     93
     94<script type="text/html" id="tmpl-bp-manage-members-search">
     95        <?php
     96                $button_classes = array( 'bp-button', 'bp-search' );
     97                $screen_reader_class = 'bp-screen-reader-text';
     98
     99                if ( is_admin() ) {
     100                        $button_classes[]    = 'button-secondary';
     101                        $screen_reader_class = 'screen-reader-text';
     102                }
     103        ?>
     104        <label for="manage-members-search" class="<?php echo sanitize_html_class( $screen_reader_class ); ?>">
     105                <?php esc_html_e( 'Search Members', 'buddypress' ); ?>
     106        </label>
     107        <input type="search" id="manage-members-search" class="small" placeholder="<?php echo esc_attr_x( 'Search', 'search placeholder text', 'buddypress' ); ?>"/>
     108        <button type="submit" id="manage-members-search-submit" class="<?php echo join( ' ', array_map( 'sanitize_html_class', $button_classes ) ); ?>">
     109                <span class="dashicons dashicons-search" aria-hidden="true"></span>
     110                <span class="<?php echo sanitize_html_class( $screen_reader_class ); ?>"><?php echo esc_html_x( 'Search', 'button', 'buddypress' ); ?></span>
     111        </button>
     112</script>
     113
     114<script type="text/html" id="tmpl-bp-manage-members-paginate">
     115        <?php
     116                $button_classes = array( 'group-members-paginate-button' );
     117                $screen_reader_class = 'bp-screen-reader-text';
     118
     119                if ( is_admin() ) {
     120                        $button_classes[]    = 'button-secondary';
     121                        $screen_reader_class = 'screen-reader-text';
     122                }
     123        ?>
     124        <# if ( 1 !== data.currentPage && data.totalPages ) { #>
     125                <button class="<?php echo join( ' ', array_map( 'sanitize_html_class', $button_classes ) ); ?>" data-page="{{data.prevPage}}">
     126                        <span class="dashicons dashicons-arrow-left"></span>
     127                        <span class="<?php echo sanitize_html_class( $screen_reader_class ); ?>"><?php echo esc_html_x( 'Prev.', 'link', 'buddypress' ); ?></span>
     128                </button>
     129        <# } #>
     130        <# if ( data.totalPages !== data.currentPage ) { #>
     131                <button class="<?php echo join( ' ', array_map( 'sanitize_html_class', $button_classes ) ); ?>" data-page="{{data.nextPage}}">
     132                        <span class="<?php echo sanitize_html_class( $screen_reader_class ); ?>"><?php echo esc_html_x( 'Next', 'link', 'buddypress' ); ?></span>
     133                        <span class="dashicons dashicons-arrow-right"></span>
     134                </button>
     135        <# } #>
     136</script>
  • src/bp-templates/bp-nouveau/buddypress/groups/single/admin/manage-members.php

    diff --git src/bp-templates/bp-nouveau/buddypress/groups/single/admin/manage-members.php src/bp-templates/bp-nouveau/buddypress/groups/single/admin/manage-members.php
    index f29e351db..6aa50ec19 100644
     
    33 * BP Nouveau Group's manage members template.
    44 *
    55 * @since 3.0.0
    6  * @version 3.1.0
     6 * @version 5.0.0
    77 */
    88?>
    99
     
    1111        <?php esc_html_e( 'Manage Group Members', 'buddypress' ); ?>
    1212</h2>
    1313
    14         <p class="bp-help-text"><?php esc_html_e( 'Manage your group members; promote to moderators, admins or demote or ban.', 'buddypress' ); ?></p>
     14<p class="bp-help-text"><?php esc_html_e( 'Manage your group members; promote to moderators, admins or demote or ban.', 'buddypress' ); ?></p>
     15
     16<?php if ( bp_rest_api_is_available() ) :
     17        /**
     18         * Get the templates to manage Group Members using the BP REST API.
     19         *
     20         * @since 5.0.0
     21         */
     22        bp_get_template_part( 'common/js-templates/group-members/index' );
     23
     24else : ?>
    1525
    1626        <dl class="groups-manage-members-list">
    1727
     
    119129
    120130                bp_nouveau_user_feedback( 'group-manage-members-none' );
    121131
    122         endif; ?>
     132        endif;
    123133
     134endif;
  • src/bp-templates/bp-nouveau/common-styles/_bp_groups_management.scss

    diff --git src/bp-templates/bp-nouveau/common-styles/_bp_groups_management.scss src/bp-templates/bp-nouveau/common-styles/_bp_groups_management.scss
    index 1ce2caf19..966f7458c 100644
     
    139139        }
    140140
    141141} //close .groups-manage-members-list
     142
     143#group-manage-members-ui {
     144
     145        #group-members-search-form {
     146
     147                button[type="submit"] {
     148                        float: right;
     149                        font-size: inherit;
     150                        font-weight: 400;
     151                        line-height: 1.5;
     152                        text-align: center;
     153                        text-transform: none;
     154
     155                        span {
     156                                font-family: dashicons;
     157
     158                                @include font-size(18);
     159                                line-height: 1.6;
     160                        }
     161                }
     162        }
     163
     164        #group-members-pagination {
     165
     166                button:last-child {
     167                        margin-right: 2em;
     168                }
     169        }
     170}
  • src/bp-templates/bp-nouveau/common-styles/_bp_search.scss

    diff --git src/bp-templates/bp-nouveau/common-styles/_bp_search.scss src/bp-templates/bp-nouveau/common-styles/_bp_search.scss
    index bba309151..ae4fa53ce 100644
     
    88
    99        form.bp-dir-search-form,
    1010        form.bp-messages-search-form,
    11         form[data-bp-search].bp-invites-search-form {
     11        form[data-bp-search].bp-invites-search-form,
     12        form#group-members-search {
    1213                border: 1px solid $bp-border-color;
    1314
    1415                width: 100%;
     
    6869
    6970        } // close form
    7071
     72        form#group-members-search {
     73
     74                &:hover {
     75                        border: 1px solid darken($bp-border-color, 10%);
     76                        box-shadow: inset 0 0 3px #eee;
     77                }
     78        }
     79
    7180        // this block needs to be moved really.
    7281        ul.filters {
    7382
  • src/bp-templates/bp-nouveau/css/buddypress-rtl.css

    diff --git src/bp-templates/bp-nouveau/css/buddypress-rtl.css src/bp-templates/bp-nouveau/css/buddypress-rtl.css
    index 892aa1fdc..605edf758 100644
    body.no-js .single-item-header .js-self-profile-button { 
    25592559        }
    25602560}
    25612561
     2562#group-manage-members-ui #group-members-search-form button[type="submit"] {
     2563        float: left;
     2564        font-size: inherit;
     2565        font-weight: 400;
     2566        line-height: 1.5;
     2567        text-align: center;
     2568        text-transform: none;
     2569}
     2570
     2571#group-manage-members-ui #group-members-search-form button[type="submit"] span {
     2572        font-family: dashicons;
     2573        font-size: 18px;
     2574        line-height: 1.6;
     2575}
     2576
     2577#group-manage-members-ui #group-members-pagination button:last-child {
     2578        margin-left: 2em;
     2579}
     2580
    25622581/**
    25632582*-----------------------------------------
    25642583* @subsection 5.2.1.2 - Group Members List
    body.no-js .buddypress #messages-bulk-management #select-all-messages { 
    36913710
    36923711.buddypress-wrap form.bp-dir-search-form,
    36933712.buddypress-wrap form.bp-messages-search-form,
    3694 .buddypress-wrap form[data-bp-search].bp-invites-search-form {
     3713.buddypress-wrap form[data-bp-search].bp-invites-search-form,
     3714.buddypress-wrap form#group-members-search {
    36953715        border: 1px solid #eee;
    36963716        width: 100%;
    36973717}
    36983718
    36993719.buddypress-wrap form.bp-dir-search-form label,
    37003720.buddypress-wrap form.bp-messages-search-form label,
    3701 .buddypress-wrap form[data-bp-search].bp-invites-search-form label {
     3721.buddypress-wrap form[data-bp-search].bp-invites-search-form label,
     3722.buddypress-wrap form#group-members-search label {
    37023723        margin: 0;
    37033724}
    37043725
    body.no-js .buddypress #messages-bulk-management #select-all-messages { 
    37103731.buddypress-wrap form.bp-messages-search-form button[type="submit"],
    37113732.buddypress-wrap form[data-bp-search].bp-invites-search-form input[type="search"],
    37123733.buddypress-wrap form[data-bp-search].bp-invites-search-form input[type="text"],
    3713 .buddypress-wrap form[data-bp-search].bp-invites-search-form button[type="submit"] {
     3734.buddypress-wrap form[data-bp-search].bp-invites-search-form button[type="submit"],
     3735.buddypress-wrap form#group-members-search input[type="search"],
     3736.buddypress-wrap form#group-members-search input[type="text"],
     3737.buddypress-wrap form#group-members-search button[type="submit"] {
    37143738        background: none;
    37153739        border: 0;
    37163740        border-radius: 0;
    body.no-js .buddypress #messages-bulk-management #select-all-messages { 
    37223746.buddypress-wrap form.bp-messages-search-form input[type="search"],
    37233747.buddypress-wrap form.bp-messages-search-form input[type="text"],
    37243748.buddypress-wrap form[data-bp-search].bp-invites-search-form input[type="search"],
    3725 .buddypress-wrap form[data-bp-search].bp-invites-search-form input[type="text"] {
     3749.buddypress-wrap form[data-bp-search].bp-invites-search-form input[type="text"],
     3750.buddypress-wrap form#group-members-search input[type="search"],
     3751.buddypress-wrap form#group-members-search input[type="text"] {
    37263752        float: right;
    37273753        line-height: 1.5;
    37283754        padding: 3px 10px;
    body.no-js .buddypress #messages-bulk-management #select-all-messages { 
    37313757
    37323758.buddypress-wrap form.bp-dir-search-form button[type="submit"],
    37333759.buddypress-wrap form.bp-messages-search-form button[type="submit"],
    3734 .buddypress-wrap form[data-bp-search].bp-invites-search-form button[type="submit"] {
     3760.buddypress-wrap form[data-bp-search].bp-invites-search-form button[type="submit"],
     3761.buddypress-wrap form#group-members-search button[type="submit"] {
    37353762        float: left;
    37363763        font-size: inherit;
    37373764        font-weight: 400;
    body.no-js .buddypress #messages-bulk-management #select-all-messages { 
    37443771
    37453772.buddypress-wrap form.bp-dir-search-form button[type="submit"] span,
    37463773.buddypress-wrap form.bp-messages-search-form button[type="submit"] span,
    3747 .buddypress-wrap form[data-bp-search].bp-invites-search-form button[type="submit"] span {
     3774.buddypress-wrap form[data-bp-search].bp-invites-search-form button[type="submit"] span,
     3775.buddypress-wrap form#group-members-search button[type="submit"] span {
    37483776        font-family: dashicons;
    37493777        font-size: 18px;
    37503778        line-height: 1.6;
    body.no-js .buddypress #messages-bulk-management #select-all-messages { 
    37523780
    37533781.buddypress-wrap form.bp-dir-search-form button[type="submit"].bp-show,
    37543782.buddypress-wrap form.bp-messages-search-form button[type="submit"].bp-show,
    3755 .buddypress-wrap form[data-bp-search].bp-invites-search-form button[type="submit"].bp-show {
     3783.buddypress-wrap form[data-bp-search].bp-invites-search-form button[type="submit"].bp-show,
     3784.buddypress-wrap form#group-members-search button[type="submit"].bp-show {
    37563785        height: auto;
    37573786        right: 0;
    37583787        overflow: visible;
    body.no-js .buddypress #messages-bulk-management #select-all-messages { 
    37623791
    37633792.buddypress-wrap form.bp-dir-search-form input[type="search"]::-webkit-search-cancel-button,
    37643793.buddypress-wrap form.bp-messages-search-form input[type="search"]::-webkit-search-cancel-button,
    3765 .buddypress-wrap form[data-bp-search].bp-invites-search-form input[type="search"]::-webkit-search-cancel-button {
     3794.buddypress-wrap form[data-bp-search].bp-invites-search-form input[type="search"]::-webkit-search-cancel-button,
     3795.buddypress-wrap form#group-members-search input[type="search"]::-webkit-search-cancel-button {
    37663796        -webkit-appearance: searchfield-cancel-button;
    37673797}
    37683798
    body.no-js .buddypress #messages-bulk-management #select-all-messages { 
    37713801.buddypress-wrap form.bp-messages-search-form input[type="search"]::-webkit-search-results-button,
    37723802.buddypress-wrap form.bp-messages-search-form input[type="search"]::-webkit-search-results-decoration,
    37733803.buddypress-wrap form[data-bp-search].bp-invites-search-form input[type="search"]::-webkit-search-results-button,
    3774 .buddypress-wrap form[data-bp-search].bp-invites-search-form input[type="search"]::-webkit-search-results-decoration {
     3804.buddypress-wrap form[data-bp-search].bp-invites-search-form input[type="search"]::-webkit-search-results-decoration,
     3805.buddypress-wrap form#group-members-search input[type="search"]::-webkit-search-results-button,
     3806.buddypress-wrap form#group-members-search input[type="search"]::-webkit-search-results-decoration {
    37753807        display: none;
    37763808}
    37773809
     3810.buddypress-wrap form#group-members-search:hover {
     3811        border: 1px solid #d5d4d4;
     3812        box-shadow: inset 0 0 3px #eee;
     3813}
     3814
    37783815.buddypress-wrap ul.filters li form label input {
    37793816        line-height: 1.4;
    37803817        padding: 0.1em 0.7em;
  • src/bp-templates/bp-nouveau/css/buddypress.css

    diff --git src/bp-templates/bp-nouveau/css/buddypress.css src/bp-templates/bp-nouveau/css/buddypress.css
    index 91f7f965e..4ab7ec9d8 100644
    body.no-js .single-item-header .js-self-profile-button { 
    25592559        }
    25602560}
    25612561
     2562#group-manage-members-ui #group-members-search-form button[type="submit"] {
     2563        float: right;
     2564        font-size: inherit;
     2565        font-weight: 400;
     2566        line-height: 1.5;
     2567        text-align: center;
     2568        text-transform: none;
     2569}
     2570
     2571#group-manage-members-ui #group-members-search-form button[type="submit"] span {
     2572        font-family: dashicons;
     2573        font-size: 18px;
     2574        line-height: 1.6;
     2575}
     2576
     2577#group-manage-members-ui #group-members-pagination button:last-child {
     2578        margin-right: 2em;
     2579}
     2580
    25622581/**
    25632582*-----------------------------------------
    25642583* @subsection 5.2.1.2 - Group Members List
    body.no-js .buddypress #messages-bulk-management #select-all-messages { 
    36913710
    36923711.buddypress-wrap form.bp-dir-search-form,
    36933712.buddypress-wrap form.bp-messages-search-form,
    3694 .buddypress-wrap form[data-bp-search].bp-invites-search-form {
     3713.buddypress-wrap form[data-bp-search].bp-invites-search-form,
     3714.buddypress-wrap form#group-members-search {
    36953715        border: 1px solid #eee;
    36963716        width: 100%;
    36973717}
    36983718
    36993719.buddypress-wrap form.bp-dir-search-form label,
    37003720.buddypress-wrap form.bp-messages-search-form label,
    3701 .buddypress-wrap form[data-bp-search].bp-invites-search-form label {
     3721.buddypress-wrap form[data-bp-search].bp-invites-search-form label,
     3722.buddypress-wrap form#group-members-search label {
    37023723        margin: 0;
    37033724}
    37043725
    body.no-js .buddypress #messages-bulk-management #select-all-messages { 
    37103731.buddypress-wrap form.bp-messages-search-form button[type="submit"],
    37113732.buddypress-wrap form[data-bp-search].bp-invites-search-form input[type="search"],
    37123733.buddypress-wrap form[data-bp-search].bp-invites-search-form input[type="text"],
    3713 .buddypress-wrap form[data-bp-search].bp-invites-search-form button[type="submit"] {
     3734.buddypress-wrap form[data-bp-search].bp-invites-search-form button[type="submit"],
     3735.buddypress-wrap form#group-members-search input[type="search"],
     3736.buddypress-wrap form#group-members-search input[type="text"],
     3737.buddypress-wrap form#group-members-search button[type="submit"] {
    37143738        background: none;
    37153739        border: 0;
    37163740        border-radius: 0;
    body.no-js .buddypress #messages-bulk-management #select-all-messages { 
    37223746.buddypress-wrap form.bp-messages-search-form input[type="search"],
    37233747.buddypress-wrap form.bp-messages-search-form input[type="text"],
    37243748.buddypress-wrap form[data-bp-search].bp-invites-search-form input[type="search"],
    3725 .buddypress-wrap form[data-bp-search].bp-invites-search-form input[type="text"] {
     3749.buddypress-wrap form[data-bp-search].bp-invites-search-form input[type="text"],
     3750.buddypress-wrap form#group-members-search input[type="search"],
     3751.buddypress-wrap form#group-members-search input[type="text"] {
    37263752        float: left;
    37273753        line-height: 1.5;
    37283754        padding: 3px 10px;
    body.no-js .buddypress #messages-bulk-management #select-all-messages { 
    37313757
    37323758.buddypress-wrap form.bp-dir-search-form button[type="submit"],
    37333759.buddypress-wrap form.bp-messages-search-form button[type="submit"],
    3734 .buddypress-wrap form[data-bp-search].bp-invites-search-form button[type="submit"] {
     3760.buddypress-wrap form[data-bp-search].bp-invites-search-form button[type="submit"],
     3761.buddypress-wrap form#group-members-search button[type="submit"] {
    37353762        float: right;
    37363763        font-size: inherit;
    37373764        font-weight: 400;
    body.no-js .buddypress #messages-bulk-management #select-all-messages { 
    37443771
    37453772.buddypress-wrap form.bp-dir-search-form button[type="submit"] span,
    37463773.buddypress-wrap form.bp-messages-search-form button[type="submit"] span,
    3747 .buddypress-wrap form[data-bp-search].bp-invites-search-form button[type="submit"] span {
     3774.buddypress-wrap form[data-bp-search].bp-invites-search-form button[type="submit"] span,
     3775.buddypress-wrap form#group-members-search button[type="submit"] span {
    37483776        font-family: dashicons;
    37493777        font-size: 18px;
    37503778        line-height: 1.6;
    body.no-js .buddypress #messages-bulk-management #select-all-messages { 
    37523780
    37533781.buddypress-wrap form.bp-dir-search-form button[type="submit"].bp-show,
    37543782.buddypress-wrap form.bp-messages-search-form button[type="submit"].bp-show,
    3755 .buddypress-wrap form[data-bp-search].bp-invites-search-form button[type="submit"].bp-show {
     3783.buddypress-wrap form[data-bp-search].bp-invites-search-form button[type="submit"].bp-show,
     3784.buddypress-wrap form#group-members-search button[type="submit"].bp-show {
    37563785        height: auto;
    37573786        left: 0;
    37583787        overflow: visible;
    body.no-js .buddypress #messages-bulk-management #select-all-messages { 
    37623791
    37633792.buddypress-wrap form.bp-dir-search-form input[type="search"]::-webkit-search-cancel-button,
    37643793.buddypress-wrap form.bp-messages-search-form input[type="search"]::-webkit-search-cancel-button,
    3765 .buddypress-wrap form[data-bp-search].bp-invites-search-form input[type="search"]::-webkit-search-cancel-button {
     3794.buddypress-wrap form[data-bp-search].bp-invites-search-form input[type="search"]::-webkit-search-cancel-button,
     3795.buddypress-wrap form#group-members-search input[type="search"]::-webkit-search-cancel-button {
    37663796        -webkit-appearance: searchfield-cancel-button;
    37673797}
    37683798
    body.no-js .buddypress #messages-bulk-management #select-all-messages { 
    37713801.buddypress-wrap form.bp-messages-search-form input[type="search"]::-webkit-search-results-button,
    37723802.buddypress-wrap form.bp-messages-search-form input[type="search"]::-webkit-search-results-decoration,
    37733803.buddypress-wrap form[data-bp-search].bp-invites-search-form input[type="search"]::-webkit-search-results-button,
    3774 .buddypress-wrap form[data-bp-search].bp-invites-search-form input[type="search"]::-webkit-search-results-decoration {
     3804.buddypress-wrap form[data-bp-search].bp-invites-search-form input[type="search"]::-webkit-search-results-decoration,
     3805.buddypress-wrap form#group-members-search input[type="search"]::-webkit-search-results-button,
     3806.buddypress-wrap form#group-members-search input[type="search"]::-webkit-search-results-decoration {
    37753807        display: none;
    37763808}
    37773809
     3810.buddypress-wrap form#group-members-search:hover {
     3811        border: 1px solid #d5d4d4;
     3812        box-shadow: inset 0 0 3px #eee;
     3813}
     3814
    37783815.buddypress-wrap ul.filters li form label input {
    37793816        line-height: 1.4;
    37803817        padding: 0.1em 0.7em;
  • src/bp-templates/bp-nouveau/includes/groups/functions.php

    diff --git src/bp-templates/bp-nouveau/includes/groups/functions.php src/bp-templates/bp-nouveau/includes/groups/functions.php
    index e0f18356c..4eacfcd5d 100644
     
    33 * Groups functions
    44 *
    55 * @since 3.0.0
    6  * @version 3.1.0
     6 * @version 5.0.0
    77 */
    88
    99// Exit if accessed directly.
    function bp_nouveau_groups_enqueue_scripts() { 
    6868                ' );
    6969        }
    7070
    71         if ( ! bp_is_group_invites() && ! ( bp_is_group_create() && bp_is_group_creation_step( 'group-invites' ) ) ) {
    72                 return;
     71        if ( bp_is_group_invites() || ( bp_is_group_create() && bp_is_group_creation_step( 'group-invites' ) ) ) {
     72                wp_enqueue_script( 'bp-nouveau-group-invites' );
    7373        }
    7474
    75         wp_enqueue_script( 'bp-nouveau-group-invites' );
     75        if ( bp_is_group_admin_page() && bp_is_group_admin_screen( 'manage-members' ) ) {
     76                wp_enqueue_script( 'bp-group-manage-members' );
     77                wp_localize_script(
     78                        'bp-group-manage-members',
     79                        'bpGroupManageMembersSettings',
     80                        bp_groups_get_group_manage_members_script_data( bp_get_current_group_id() )
     81                );
     82        }
    7683}
    7784
    7885/**
  • src/class-buddypress.php

    diff --git src/class-buddypress.php src/class-buddypress.php
    index e6d8d609b..efa9744fc 100644
    class BuddyPress { 
    487487                require( $this->plugin_dir . 'bp-core/bp-core-moderation.php'       );
    488488                require( $this->plugin_dir . 'bp-core/bp-core-loader.php'           );
    489489                require( $this->plugin_dir . 'bp-core/bp-core-customizer-email.php' );
     490                require( $this->plugin_dir . 'bp-core/bp-core-rest-api.php'         );
    490491
    491492                // Maybe load deprecated functionality (this double negative is proof positive!)
    492493                if ( ! bp_get_option( '_bp_ignore_deprecated_code', ! $this->load_deprecated ) ) {