diff --git src/bp-groups/admin/css/admin.css src/bp-groups/admin/css/admin.css
index 0a7887a10..a87b9aabb 100644
--- src/bp-groups/admin/css/admin.css
+++ src/bp-groups/admin/css/admin.css
@@ -140,6 +140,14 @@ table.bp-group-members .urole-column {
padding-right: 20px;
}
+#group-manage-members-ui .subnav-filters .filter.last {
+ float: right;
+}
+
+#group-manage-members-ui .uname-column .profile-photo {
+ margin-right: 1em;
+}
+
@media screen and (max-width: 782px) {
.bp-groups-settings-section label {
diff --git src/bp-groups/bp-groups-admin.php src/bp-groups/bp-groups-admin.php
index 94ef62829..231dc7860 100644
--- src/bp-groups/bp-groups-admin.php
+++ src/bp-groups/bp-groups-admin.php
@@ -891,6 +891,30 @@ function bp_groups_admin_edit_metabox_add_new_members( $item ) {
* @param BP_Groups_Group $item The BP_Groups_Group object for the current group.
*/
function bp_groups_admin_edit_metabox_members( $item ) {
+ // Use the BP REST API if it supported.
+ if ( file_exists( bp_locate_template( 'common/js-templates/group-members/index.php' ) ) ) {
+ $js_asset = bp_locate_template_asset( sprintf( 'js/buddypress-group-manage-members%s.js', bp_core_get_minified_asset_suffix() ) );
+ wp_enqueue_script(
+ 'bp-nouveau-group-manage-members',
+ $js_asset['uri'],
+ array( 'json2', 'wp-backbone', 'wp-api-request' ),
+ bp_get_version(),
+ true
+ );
+
+ wp_localize_script( 'bp-nouveau-group-manage-members', 'BP_Nouveau', array(
+ 'group_manage_members' => bp_nouveau_groups_get_group_manage_members_script_data( $item->id )
+ ) );
+
+ bp_nouveau_group_manage_members_interface();
+
+ /**
+ * Echo out the JavaScript variable.
+ * This seems to be required by the autocompleter, leaving this here for now...
+ */
+ echo '';
+ return;
+ }
// Pull up a list of group members, so we can separate out the types
// We'll also keep track of group members here to place them into a
diff --git src/bp-groups/bp-groups-functions.php src/bp-groups/bp-groups-functions.php
index 43240122a..ab0199090 100644
--- src/bp-groups/bp-groups-functions.php
+++ src/bp-groups/bp-groups-functions.php
@@ -1111,6 +1111,50 @@ function groups_avatar_upload_dir( $group_id = 0 ) {
/** Group Member Status Checks ************************************************/
+/**
+ * Get the Group roles.
+ *
+ * @since 5.0.0
+ *
+ * @return array The list of Group role objects.
+ */
+function bp_groups_get_group_roles() {
+ return array(
+ 'admin' => (object) array(
+ 'id' => 'admin',
+ 'name' => __( 'Administrator', 'buddypress' ),
+ 'is_admin' => true,
+ 'is_banned' => false,
+ 'is_confirmed' => true,
+ 'is_mod' => false,
+ ),
+ 'mod' => (object) array(
+ 'id' => 'mod',
+ 'name' => __( 'Moderator', 'buddypress' ),
+ 'is_admin' => false,
+ 'is_banned' => false,
+ 'is_confirmed' => true,
+ 'is_mod' => true,
+ ),
+ 'member' => (object) array(
+ 'id' => 'member',
+ 'name' => __( 'Member', 'buddypress' ),
+ 'is_admin' => false,
+ 'is_banned' => false,
+ 'is_confirmed' => true,
+ 'is_mod' => false,
+ ),
+ 'banned' => (object) array(
+ 'id' => 'banned',
+ 'name' => __( 'Banned', 'buddypress' ),
+ 'is_admin' => false,
+ 'is_banned' => true,
+ 'is_confirmed' => true,
+ 'is_mod' => false,
+ ),
+ );
+}
+
/**
* Check whether a user is an admin of a given group.
*
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
index e69de29bb..89b7ba108 100644
--- 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
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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..127d6d57e 100644
--- src/bp-templates/bp-nouveau/buddypress/groups/single/admin/manage-members.php
+++ src/bp-templates/bp-nouveau/buddypress/groups/single/admin/manage-members.php
@@ -11,113 +11,6 @@
-
-
-
-
-
-
-
- -
-
-
-
- -
-
- bp_get_member_user_id(), 'type' => 'thumb', 'width' => 30, 'height' => 30, 'alt' => '' ) ); ?>
-
-
-
-
- 1 ) : ?>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
- -
-
- bp_get_member_user_id(), 'type' => 'thumb', 'width' => 30, 'height' => 30, 'alt' => '' ) ); ?>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- 'div', 'container_classes' => array( 'members-manage-buttons', 'text-links-list' ), 'parent_element' => ' ' ) ) ; ?>
-
-
-
-
-
-
-
-
-
-
+
+ array( 'bp-nouveau', 'json2', 'wp-backbone' ),
'footer' => true,
),
+ 'bp-nouveau-group-manage-members' => array(
+ 'file' => 'js/buddypress-group-manage-members%s.js',
+ 'dependencies' => array( 'bp-nouveau', 'json2', 'wp-backbone', 'wp-api-request' ),
+ 'footer' => true,
+ ),
) );
}
@@ -68,11 +73,13 @@ function bp_nouveau_groups_enqueue_scripts() {
' );
}
- if ( ! bp_is_group_invites() && ! ( bp_is_group_create() && bp_is_group_creation_step( 'group-invites' ) ) ) {
- return;
+ if ( bp_is_group_invites() || ( bp_is_group_create() && bp_is_group_creation_step( 'group-invites' ) ) ) {
+ wp_enqueue_script( 'bp-nouveau-group-invites' );
}
- wp_enqueue_script( 'bp-nouveau-group-invites' );
+ if ( bp_is_group_admin_page() && bp_is_group_admin_screen( 'manage-members' ) ) {
+ wp_enqueue_script( 'bp-nouveau-group-manage-members' );
+ }
}
/**
@@ -95,6 +102,32 @@ function bp_nouveau_groups_disallow_all_members_invites( $default = false ) {
return apply_filters( 'bp_nouveau_groups_disallow_all_members_invites', $default );
}
+function bp_nouveau_groups_get_group_manage_members_script_data( $group_id = 0 ) {
+ if ( ! $group_id ) {
+ return array();
+ } else {
+ $group_id = (int) $group_id;
+ }
+
+ $path = sprintf( '/%1$s/%2$s/%3$s/%4$s/members?exclude_admins=false',
+ bp_rest_namespace(),
+ bp_rest_version(),
+ buddypress()->groups->id,
+ $group_id
+ );
+
+ $preloaded_members = array();
+ if ( function_exists( 'rest_preload_api_request' ) ) {
+ $preloaded_members = rest_preload_api_request( '', $path );
+ }
+
+ return array(
+ 'path' => remove_query_arg( 'exclude_admins', $path ),
+ 'preloaded' => reset( $preloaded_members ),
+ 'roles' => bp_groups_get_group_roles(),
+ );
+}
+
/**
* Localize the strings needed for the Group's Invite UI
*
@@ -105,60 +138,62 @@ function bp_nouveau_groups_disallow_all_members_invites( $default = false ) {
* @return array The same array with specific strings for the Group's Invite UI if needed.
*/
function bp_nouveau_groups_localize_scripts( $params = array() ) {
- if ( ! bp_is_group_invites() && ! ( bp_is_group_create() && bp_is_group_creation_step( 'group-invites' ) ) ) {
- return $params;
- }
+ if ( bp_is_group_invites() || ( bp_is_group_create() && bp_is_group_creation_step( 'group-invites' ) ) ) {
+ $show_pending = bp_group_has_invites( array( 'user_id' => 'any' ) ) && ! bp_is_group_create();
+
+ // Init the Group invites nav
+ $invites_nav = array(
+ 'members' => array(
+ 'id' => 'members',
+ 'caption' => __( 'All Members', 'buddypress' ),
+ 'order' => 5,
+ ),
+ 'invited' => array(
+ 'id' => 'invited',
+ 'caption' => __( 'Pending Invites', 'buddypress' ),
+ 'order' => 90,
+ 'hide' => (int) ! $show_pending,
+ ),
+ 'invites' => array(
+ 'id' => 'invites',
+ 'caption' => __( 'Send Invites', 'buddypress' ),
+ 'order' => 100,
+ 'hide' => 1,
+ 'href' => '#send-invites-editor',
+ ),
+ );
- $show_pending = bp_group_has_invites( array( 'user_id' => 'any' ) ) && ! bp_is_group_create();
+ if ( bp_is_active( 'friends' ) ) {
+ $invites_nav['friends'] = array(
+ 'id' => 'friends',
+ 'caption' => __( 'My Friends', 'buddypress' ),
+ 'order' => 0,
+ );
- // Init the Group invites nav
- $invites_nav = array(
- 'members' => array(
- 'id' => 'members',
- 'caption' => __( 'All Members', 'buddypress' ),
- 'order' => 5,
- ),
- 'invited' => array(
- 'id' => 'invited',
- 'caption' => __( 'Pending Invites', 'buddypress' ),
- 'order' => 90,
- 'hide' => (int) ! $show_pending,
- ),
- 'invites' => array(
- 'id' => 'invites',
- 'caption' => __( 'Send Invites', 'buddypress' ),
- 'order' => 100,
- 'hide' => 1,
- 'href' => '#send-invites-editor',
- ),
- );
+ if ( true === bp_nouveau_groups_disallow_all_members_invites() ) {
+ unset( $invites_nav['members'] );
+ }
+ }
- if ( bp_is_active( 'friends' ) ) {
- $invites_nav['friends'] = array(
- 'id' => 'friends',
- 'caption' => __( 'My Friends', 'buddypress' ),
- 'order' => 0,
+ $params['group_invites'] = array(
+ 'nav' => bp_sort_by_key( $invites_nav, 'order', 'num' ),
+ 'loading' => __( 'Loading members. Please wait.', 'buddypress' ),
+ 'invites_form' => __( 'Use the "Send" button to send your invite or the "Cancel" button to abort.', 'buddypress' ),
+ 'invites_form_reset' => __( 'Group invitations cleared. Please use one of the available tabs to select members to invite.', 'buddypress' ),
+ 'invites_sending' => __( 'Sending group invitations. Please wait.', 'buddypress' ),
+ 'removeUserInvite' => __( 'Cancel invitation %s', 'buddypress' ),
+ 'group_id' => ! bp_get_current_group_id() ? bp_get_new_group_id() : bp_get_current_group_id(),
+ 'is_group_create' => bp_is_group_create(),
+ 'nonces' => array(
+ 'uninvite' => wp_create_nonce( 'groups_invite_uninvite_user' ),
+ 'send_invites' => wp_create_nonce( 'groups_send_invites' )
+ ),
);
-
- if ( true === bp_nouveau_groups_disallow_all_members_invites() ) {
- unset( $invites_nav['members'] );
- }
}
- $params['group_invites'] = array(
- 'nav' => bp_sort_by_key( $invites_nav, 'order', 'num' ),
- 'loading' => __( 'Loading members. Please wait.', 'buddypress' ),
- 'invites_form' => __( 'Use the "Send" button to send your invite or the "Cancel" button to abort.', 'buddypress' ),
- 'invites_form_reset' => __( 'Group invitations cleared. Please use one of the available tabs to select members to invite.', 'buddypress' ),
- 'invites_sending' => __( 'Sending group invitations. Please wait.', 'buddypress' ),
- 'removeUserInvite' => __( 'Cancel invitation %s', 'buddypress' ),
- 'group_id' => ! bp_get_current_group_id() ? bp_get_new_group_id() : bp_get_current_group_id(),
- 'is_group_create' => bp_is_group_create(),
- 'nonces' => array(
- 'uninvite' => wp_create_nonce( 'groups_invite_uninvite_user' ),
- 'send_invites' => wp_create_nonce( 'groups_send_invites' )
- ),
- );
+ if ( bp_is_group_admin_page() && bp_is_group_admin_screen( 'manage-members' ) ) {
+ $params['group_manage_members'] = bp_nouveau_groups_get_group_manage_members_script_data( bp_get_current_group_id() );
+ }
return $params;
}
diff --git src/bp-templates/bp-nouveau/includes/groups/template-tags.php src/bp-templates/bp-nouveau/includes/groups/template-tags.php
index 24f4f392d..b5433168f 100644
--- src/bp-templates/bp-nouveau/includes/groups/template-tags.php
+++ src/bp-templates/bp-nouveau/includes/groups/template-tags.php
@@ -188,6 +188,17 @@ function bp_nouveau_group_invites_interface() {
do_action( 'bp_after_group_send_invites_content' );
}
+/**
+ * Load the Group Membership management UI.
+ *
+ * @since 5.0.0
+ *
+ * @return string HTML Output.
+ */
+function bp_nouveau_group_manage_members_interface() {
+ bp_get_template_part( 'common/js-templates/group-members/index' );
+}
+
/**
* Gets the displayed user group invites preferences
*
diff --git src/bp-templates/bp-nouveau/js/buddypress-group-manage-members.js src/bp-templates/bp-nouveau/js/buddypress-group-manage-members.js
index e69de29bb..b17b1852f 100644
--- src/bp-templates/bp-nouveau/js/buddypress-group-manage-members.js
+++ src/bp-templates/bp-nouveau/js/buddypress-group-manage-members.js
@@ -0,0 +1,497 @@
+/* global wp, bp, BP_Nouveau, _, Backbone */
+/* @version 5.0.0 */
+
+( function( wp, bp, $ ) {
+
+ // Bail if not set
+ if ( typeof BP_Nouveau === 'undefined' ) {
+ return;
+ }
+
+ // Copy useful WP Objects into BP.
+ _.extend( bp, _.pick( wp, 'Backbone', 'template', 'apiRequest' ) );
+
+ bp.Models = bp.Models || {};
+ bp.Collections = bp.Collections || {};
+ bp.Views = bp.Views || {};
+
+ /**
+ * Model for the Member of the displayed group.
+ */
+ bp.Models.groupMember = Backbone.Model.extend( {
+ defaults: {
+ id: 0,
+ name: '',
+ avatar_urls : {},
+ is_admin: false,
+ is_banned: false,
+ is_confirmed: false,
+ is_mod: false,
+ link: ''
+ },
+ options : {
+ path: BP_Nouveau.group_manage_members.path,
+ type: 'POST',
+ data: {},
+ dataType: 'json'
+ },
+
+ initialize: function() {
+ // Make sure to reset data & path on model's sync.
+ this.on( 'sync', this.resetRequestOptions, this );
+ },
+
+ resetRequestOptions: function() {
+ this.options.data = {};
+ this.options.path = BP_Nouveau.group_manage_members.path;
+ },
+
+ sync: function( method, model, options ) {
+ options = options || {};
+ options.context = this;
+ var data = options.data || {};
+ this.options.path = this.options.path.concat( '/' + model.get( 'id' ) );
+
+ _.extend( options, this.options );
+ _.extend( options.data, data );
+
+ if ( 'delete' === method || 'update' === method ) {
+ if ( 'delete' === method ) {
+ options.headers = { 'X-HTTP-Method-Override': 'DELETE' };
+ } else {
+ options.headers = { 'X-HTTP-Method-Override': 'PUT' };
+ }
+
+ return wp.apiRequest( options );
+ }
+ },
+
+ parse: function( response ) {
+ if ( _.isArray( response ) ) {
+ response = _.first( response );
+ }
+
+ return response;
+ }
+ } );
+
+ /**
+ * Collection for the Members of the displayed group.
+ */
+ bp.Collections.groupMembers = Backbone.Collection.extend( {
+ model: bp.Models.groupMember,
+ options : {
+ path: BP_Nouveau.group_manage_members.path,
+ type: 'GET',
+ data: {},
+ dataType: 'json'
+ },
+
+ initialize: function() {
+ // Make sure to reset data on collection's reset.
+ this.on( 'reset', function() {
+ this.options.data = {};
+ }, this );
+ },
+
+ sync: function( method, collection, options ) {
+ options = options || {};
+ options.context = this;
+ var data = options.data || {};
+
+ _.extend( options, this.options );
+ _.extend( options.data, data );
+
+ if ( 'read' === method ) {
+ var self = this, success = options.success;
+ options.success = function( data, textStatus, request ) {
+ if ( ! _.isUndefined( request ) ) {
+ self.totalPages = parseInt( request.getResponseHeader( 'X-WP-TotalPages' ), 10 );
+ self.totalGroupMembers = parseInt( request.getResponseHeader( 'X-WP-Total' ), 10 );
+ }
+
+ self.currentPage = options.data.page || 1;
+
+ if ( success ) {
+ return success.apply( this, arguments );
+ }
+ };
+
+ return wp.apiRequest( options );
+ }
+ }
+ } );
+
+ // Extend wp.Backbone.View with .prepare().
+ bp.View = bp.View || bp.Backbone.View.extend( {
+ prepare: function() {
+ if ( ! _.isUndefined( this.model ) && _.isFunction( this.model.toJSON ) ) {
+ return this.model.toJSON();
+ } else {
+ return {};
+ }
+ }
+ } );
+
+ bp.Views.GroupMemberUpdatingInfo = bp.View.extend( {
+ tagName: 'p',
+ template : bp.template( 'bp-manage-members-updating' ),
+
+ initialize: function() {
+ this.model = new Backbone.Model( {
+ type: this.options.value
+ } );
+ }
+ } );
+
+ bp.Views.GroupMemberErrorInfo = bp.View.extend( {
+ tagName: 'p',
+ template : bp.template( 'bp-manage-members-error' ),
+
+ initialize: function() {
+ this.model = new Backbone.Model( {
+ message: this.options.value
+ } );
+ }
+ } );
+
+ bp.Views.GroupsMembersLabel = bp.Views.GroupMemberUpdatingInfo.extend( {
+ tagName: 'label',
+ template: bp.template( 'bp-manage-members-label' )
+ } );
+
+ bp.Views.GroupRolesDropDown = bp.View.extend( {
+ tagName: 'select',
+ filters: _.extend( { all: { name: 'All members' } }, BP_Nouveau.group_manage_members.roles ),
+
+ events: {
+ change: 'change'
+ },
+
+ initialize: function() {
+ if ( this.options.omits ) {
+ this.filters = _.omit( this.filters, this.options.omits );
+ }
+
+ if ( this.options.extends ) {
+ this.filters = _.extend( this.filters, this.options.extends );
+ }
+
+ // Build `' ).val( value ).html( filter.name )[0];
+
+ if ( this.options.currentRole && value === this.options.currentRole ) {
+ return {
+ el: $( optionOutput ).prop( 'selected', true )
+ };
+ } else {
+ return {
+ el: optionOutput
+ };
+ }
+ }, this ).pluck( 'el' ).value() );
+ },
+
+ change: function( event ) {
+ var role = $( event.target ).val(), queryArgs = { roles: [ role ] };
+
+ if ( ! this.collection ) {
+ return;
+ }
+
+ if ( 'all' === role ) {
+ // Unset the current role.
+ this.collection.currentRole = '';
+
+ queryArgs = { 'exclude_admins': false };
+ } else {
+ // Set the current role.
+ this.collection.currentRole = role;
+ }
+
+ queryArgs.page = 1;
+
+ this.collection.fetch( {
+ data: queryArgs,
+ reset: true
+ } );
+ }
+ } );
+
+ bp.Views.GroupsMembersPagination = bp.View.extend( {
+ className: 'bp-pagination',
+ template: bp.template( 'bp-manage-members-paginate' ),
+
+ events: {
+ 'click .group-members-paginate-link' : 'queryPage',
+ },
+
+ initialize: function() {
+ this.collection.on( 'reset', this.setPagination, this );
+ },
+
+ setPagination: function( collection ) {
+ var attributes = _.pick( collection, [ 'currentPage', 'totalGroupMembers', 'totalPages' ] );
+
+ if ( attributes.totalPages > 1 ) {
+ attributes.nextPage = attributes.currentPage + 1;
+ attributes.prevPage = attributes.currentPage - 1;
+ }
+
+ this.model = new Backbone.Model( attributes );
+ this.render();
+ },
+
+ queryPage: function( event ) {
+ event.preventDefault();
+
+ var page = $( event.target ).data( 'page' ),
+ queryArgs = _.extend( this.collection.options.data, { page: page } );
+
+ if ( ! this.collection.currentRole ) {
+ queryArgs[ 'exclude_admins' ] = false;
+ } else {
+ queryArgs.roles = [ this.collection.currentRole ];
+ }
+
+ this.collection.fetch( {
+ data: queryArgs,
+ reset: true
+ } );
+ }
+ } );
+
+ bp.Views.GroupMembersListRow = bp.View.extend( {
+ tagName: 'tr',
+ template : bp.template( 'bp-manage-members-row' ),
+
+ events: {
+ 'click .group-member-actions a' : 'doMemberAction',
+ 'change .group-member-edit select' : 'editMemberRole'
+ },
+
+ initialize: function() {
+ var roleProps = [ 'is_admin', 'is_banned', 'is_confirmed', 'is_mod' ],
+ self = this;
+
+ _.each( BP_Nouveau.group_manage_members.roles, function( props ) {
+ if ( _.isMatch( self.model.attributes, _.pick( props, roleProps ) ) ) {
+ self.model.set( 'role', _.pick( props, ['id', 'name'] ), { silent: true } );
+ }
+ } );
+
+ this.model.collection.on( 'reset', this.clearRow, this );
+ },
+
+ clearRow: function() {
+ this.views.view.remove();
+ },
+
+ renderEditForm: function() {
+ var userId = this.model.get( 'id' );
+
+ this.render();
+
+ this.views.set( '#edit-group-member-' + userId, [
+ new bp.Views.GroupsMembersLabel( { value: userId, attributes: { for: 'group-member' + userId + '-role' } } ),
+ new bp.Views.GroupRolesDropDown( { id: 'group-member' + userId + '-role', omits: [ 'all', 'banned' ], currentRole: this.model.get( 'role' ).id } ).render()
+ ] );
+ },
+
+ resetRow: function() {
+ this.model.set( 'editing', false );
+
+ return this.render();
+ },
+
+ getRoleObject: function( roleId ) {
+ var roles = BP_Nouveau.group_manage_members.roles;
+
+ if ( _.isUndefined( roles[ roleId ] ) ) {
+ return {};
+ }
+
+ return _.extend(
+ { role: _.pick( roles[ roleId ], ['id', 'name'] ) },
+ _.pick( roles[ roleId ], [ 'is_admin', 'is_banned', 'is_confirmed', 'is_mod' ] )
+ );
+ },
+
+ doMemberAction: function( event ) {
+ event.preventDefault();
+
+ var action = $( event.target ).data( 'action' ), self = this;
+
+ if ( 'edit' === action ) {
+ this.model.set( 'editing', true );
+ return this.renderEditForm();
+
+ } else if ( 'abort' === action ) {
+ return this.resetRow();
+
+ } else if ( 'ban' === action || 'unban' === action ) {
+ var newRole = ( 'ban' === action ) ? 'banned' : 'member', roleObject = this.getRoleObject( newRole );
+
+ if ( ! roleObject ) {
+ return this.resetRow();
+ } else {
+ this.model.set( 'managingBan', true );
+ this.render();
+ }
+
+ // Display user feedback.
+ this.views.set( '#edit-group-member-' + this.model.get( 'id' ), new bp.Views.GroupMemberUpdatingInfo( { value: action } ).render() );
+
+ // Update Group member's role.
+ this.model.save( roleObject, {
+ wait: true,
+ data: { action: action },
+ success: function( model, response ) {
+ self.model.collection.remove( model );
+ return self.clearRow();
+ },
+ error: function( model, response ) {
+ self.views.set( '#edit-group-member-' + model.get( 'id' ), new bp.Views.GroupMemberErrorInfo( { value: response.responseJSON.message } ).render() );
+
+ // Make sure to reset request options.
+ model.resetRequestOptions();
+ model.set( 'managingBan', false );
+ }
+ } );
+ } else if ( 'remove' === action ) {
+ this.model.set( 'removing', true );
+ this.render();
+
+ // Display user feedback.
+ this.views.set( '#edit-group-member-' + this.model.get( 'id' ), new bp.Views.GroupMemberUpdatingInfo( { value: action } ).render() );
+
+ // Destroy the membership model.
+ this.model.destroy( {
+ wait: true,
+ data: {},
+ success: function( model, response ) {
+ return self.clearRow();
+ },
+ error: function( model, response ) {
+ self.views.set( '#edit-group-member-' + model.get( 'id' ), new bp.Views.GroupMemberErrorInfo( { value: response.responseJSON.message } ).render() );
+
+ // Make sure to reset request options.
+ model.resetRequestOptions();
+ model.set( 'removing', false );
+ }
+ } );
+ }
+ },
+
+ editMemberRole: function( event ) {
+ var newRole = $( event.target ).val(), roleObject = this.getRoleObject( newRole ),
+ currentRole = this.model.get( 'role').id, roleAction = 'promote', self = this;
+
+ if ( newRole === this.model.get( 'role' ).id || ! roleObject ) {
+ return this.resetRow();
+ }
+
+ this.views.set( '#edit-group-member-' + this.model.get( 'id' ), new bp.Views.GroupMemberUpdatingInfo().render() );
+
+ if ( 'admin' === currentRole || ( 'mod' === currentRole && 'member' === newRole ) ) {
+ roleAction = 'demote';
+ }
+
+ // Update Group member's role
+ this.model.save( roleObject, {
+ wait: true,
+ data: {
+ action: roleAction,
+ role: newRole
+ },
+ success: function( model, response ) {
+ if ( self.model.collection.currentRole && newRole !== self.model.collection.currentRole ) {
+ self.model.collection.remove( model );
+ return self.clearRow();
+ } else {
+ return self.resetRow();
+ }
+ },
+ error: function( model, response ) {
+ self.views.set( '#edit-group-member-' + model.get( 'id' ), new bp.Views.GroupMemberErrorInfo( { value: response.responseJSON.message } ).render() );
+
+ // Make sure to reset request options.
+ model.resetRequestOptions();
+ model.set( 'editing', false );
+ }
+ } );
+ }
+ } );
+
+ bp.Views.GroupMembersListHeader = bp.View.extend( {
+ tagName: 'thead',
+ template : bp.template( 'bp-manage-members-header' )
+ } );
+
+ bp.Views.GroupMembersListTable = bp.View.extend( {
+ tagName: 'tbody',
+
+ initialize: function() {
+ var preloaded = BP_Nouveau.group_manage_members.preloaded || {},
+ models = [];
+
+ this.collection.on( 'reset', this.addListTableRows, this );
+
+ if ( preloaded.body && preloaded.body.length > 0 ) {
+ _.each( preloaded.body, function( member ) {
+ models.push( new bp.Models.groupMember( member ) )
+ } );
+
+ this.collection.currentPage = 1;
+ if ( preloaded.headers && preloaded.headers[ 'X-WP-TotalPages' ] ) {
+ this.collection.totalPages = parseInt( preloaded.headers[ 'X-WP-TotalPages' ], 10 );
+ }
+
+ if ( preloaded.headers && preloaded.headers[ 'X-WP-Total' ] ) {
+ this.collection.totalGroupMembers = parseInt( preloaded.headers[ 'X-WP-Total' ], 10 );
+ }
+
+ this.collection.reset( models );
+ } else {
+ this.collection.fetch( {
+ data: { 'exclude_admins': false },
+ reset: true
+ } );
+ }
+ },
+
+ addListTableRows: function( collection ) {
+ _.each( collection.models, function( member ) {
+ this.views.add( new bp.Views.GroupMembersListRow( { model: member } ) );
+ }, this );
+ }
+ } );
+
+ bp.Views.GroupMembersUI = bp.View.extend( {
+ className: 'group-members',
+
+ initialize: function() {
+ var groupMembers = new bp.Collections.groupMembers();
+
+ // Set filters.
+ this.views.set( '#group-roles-filter', [
+ new bp.Views.GroupsMembersLabel( { attributes: { for: 'group-members-role-filter' } } ),
+ new bp.Views.GroupRolesDropDown( { id: 'group-members-role-filter', collection: groupMembers } )
+ ] );
+
+ // Set Paginate links.
+ this.views.set( '#group-members-pagination', new bp.Views.GroupsMembersPagination( { collection: groupMembers } ) );
+
+ // Set Group members list header and body.
+ this.views.set( '#group-members-list-table', [
+ new bp.Views.GroupMembersListHeader(),
+ new bp.Views.GroupMembersListTable( { collection: groupMembers } )
+ ] );
+ }
+ } );
+
+ // Inject the UI to manage Group Members into the DOM.
+ var manageGroupMembersUI = new bp.Views.GroupMembersUI( { el:'#group-manage-members-ui' } ).render();
+
+} )( window.wp || {}, window.bp || {}, jQuery );