Ticket #8045: 8045.4.patch
File 8045.4.patch, 49.2 KB (added by , 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. 11 defined( '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 */ 20 function 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 */ 31 function 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 */ 49 function 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 } 77 add_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 */ 8 window.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 { 140 140 padding-left: 20px; 141 141 } 142 142 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 143 163 @media screen and (max-width: 782px) { 144 164 145 165 .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 { 140 140 padding-right: 20px; 141 141 } 142 142 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 143 163 @media screen and (max-width: 782px) { 144 164 145 165 .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 ) { 891 891 * @param BP_Groups_Group $item The BP_Groups_Group object for the current group. 892 892 */ 893 893 function 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 } 894 912 895 913 // Pull up a list of group members, so we can separate out the types 896 914 // 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. 11 defined( 'ABSPATH' ) || exit; 12 13 /** 14 * Register Groups JavaScripts. 15 * 16 * @since 5.0.0 17 */ 18 function 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 } 27 add_action( 'bp_enqueue_scripts', 'bp_groups_register_scripts', 1 ); 28 add_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 */ 38 function 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 ) { 1111 1111 1112 1112 /** Group Member Status Checks ************************************************/ 1113 1113 1114 /** 1115 * Get the Group roles. 1116 * 1117 * @since 5.0.0 1118 * 1119 * @return array The list of Group role objects. 1120 */ 1121 function 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 1114 1158 /** 1115 1159 * Check whether a user is an admin of a given group. 1116 1160 * -
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 = '' ) { 6217 6217 */ 6218 6218 return apply_filters( 'bp_groups_get_profile_stats', $r['output'], $r ); 6219 6219 } 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 */ 6229 function 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 { 128 128 'template', 129 129 'adminbar', 130 130 'functions', 131 'notifications' 131 'notifications', 132 'cssjs', 132 133 ); 133 134 134 135 // 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
3 3 * BP Nouveau Group's manage members template. 4 4 * 5 5 * @since 3.0.0 6 * @version 3.1.06 * @version 5.0.0 7 7 */ 8 8 ?> 9 9 … … 11 11 <?php esc_html_e( 'Manage Group Members', 'buddypress' ); ?> 12 12 </h2> 13 13 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 24 else : ?> 15 25 16 26 <dl class="groups-manage-members-list"> 17 27 … … 119 129 120 130 bp_nouveau_user_feedback( 'group-manage-members-none' ); 121 131 122 endif; ?>132 endif; 123 133 134 endif; -
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
139 139 } 140 140 141 141 } //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
8 8 9 9 form.bp-dir-search-form, 10 10 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 { 12 13 border: 1px solid $bp-border-color; 13 14 14 15 width: 100%; … … 68 69 69 70 } // close form 70 71 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 71 80 // this block needs to be moved really. 72 81 ul.filters { 73 82 -
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 { 2559 2559 } 2560 2560 } 2561 2561 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 2562 2581 /** 2563 2582 *----------------------------------------- 2564 2583 * @subsection 5.2.1.2 - Group Members List … … body.no-js .buddypress #messages-bulk-management #select-all-messages { 3691 3710 3692 3711 .buddypress-wrap form.bp-dir-search-form, 3693 3712 .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 { 3695 3715 border: 1px solid #eee; 3696 3716 width: 100%; 3697 3717 } 3698 3718 3699 3719 .buddypress-wrap form.bp-dir-search-form label, 3700 3720 .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 { 3702 3723 margin: 0; 3703 3724 } 3704 3725 … … body.no-js .buddypress #messages-bulk-management #select-all-messages { 3710 3731 .buddypress-wrap form.bp-messages-search-form button[type="submit"], 3711 3732 .buddypress-wrap form[data-bp-search].bp-invites-search-form input[type="search"], 3712 3733 .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"] { 3714 3738 background: none; 3715 3739 border: 0; 3716 3740 border-radius: 0; … … body.no-js .buddypress #messages-bulk-management #select-all-messages { 3722 3746 .buddypress-wrap form.bp-messages-search-form input[type="search"], 3723 3747 .buddypress-wrap form.bp-messages-search-form input[type="text"], 3724 3748 .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"] { 3726 3752 float: right; 3727 3753 line-height: 1.5; 3728 3754 padding: 3px 10px; … … body.no-js .buddypress #messages-bulk-management #select-all-messages { 3731 3757 3732 3758 .buddypress-wrap form.bp-dir-search-form button[type="submit"], 3733 3759 .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"] { 3735 3762 float: left; 3736 3763 font-size: inherit; 3737 3764 font-weight: 400; … … body.no-js .buddypress #messages-bulk-management #select-all-messages { 3744 3771 3745 3772 .buddypress-wrap form.bp-dir-search-form button[type="submit"] span, 3746 3773 .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 { 3748 3776 font-family: dashicons; 3749 3777 font-size: 18px; 3750 3778 line-height: 1.6; … … body.no-js .buddypress #messages-bulk-management #select-all-messages { 3752 3780 3753 3781 .buddypress-wrap form.bp-dir-search-form button[type="submit"].bp-show, 3754 3782 .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 { 3756 3785 height: auto; 3757 3786 right: 0; 3758 3787 overflow: visible; … … body.no-js .buddypress #messages-bulk-management #select-all-messages { 3762 3791 3763 3792 .buddypress-wrap form.bp-dir-search-form input[type="search"]::-webkit-search-cancel-button, 3764 3793 .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 { 3766 3796 -webkit-appearance: searchfield-cancel-button; 3767 3797 } 3768 3798 … … body.no-js .buddypress #messages-bulk-management #select-all-messages { 3771 3801 .buddypress-wrap form.bp-messages-search-form input[type="search"]::-webkit-search-results-button, 3772 3802 .buddypress-wrap form.bp-messages-search-form input[type="search"]::-webkit-search-results-decoration, 3773 3803 .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 { 3775 3807 display: none; 3776 3808 } 3777 3809 3810 .buddypress-wrap form#group-members-search:hover { 3811 border: 1px solid #d5d4d4; 3812 box-shadow: inset 0 0 3px #eee; 3813 } 3814 3778 3815 .buddypress-wrap ul.filters li form label input { 3779 3816 line-height: 1.4; 3780 3817 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 { 2559 2559 } 2560 2560 } 2561 2561 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 2562 2581 /** 2563 2582 *----------------------------------------- 2564 2583 * @subsection 5.2.1.2 - Group Members List … … body.no-js .buddypress #messages-bulk-management #select-all-messages { 3691 3710 3692 3711 .buddypress-wrap form.bp-dir-search-form, 3693 3712 .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 { 3695 3715 border: 1px solid #eee; 3696 3716 width: 100%; 3697 3717 } 3698 3718 3699 3719 .buddypress-wrap form.bp-dir-search-form label, 3700 3720 .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 { 3702 3723 margin: 0; 3703 3724 } 3704 3725 … … body.no-js .buddypress #messages-bulk-management #select-all-messages { 3710 3731 .buddypress-wrap form.bp-messages-search-form button[type="submit"], 3711 3732 .buddypress-wrap form[data-bp-search].bp-invites-search-form input[type="search"], 3712 3733 .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"] { 3714 3738 background: none; 3715 3739 border: 0; 3716 3740 border-radius: 0; … … body.no-js .buddypress #messages-bulk-management #select-all-messages { 3722 3746 .buddypress-wrap form.bp-messages-search-form input[type="search"], 3723 3747 .buddypress-wrap form.bp-messages-search-form input[type="text"], 3724 3748 .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"] { 3726 3752 float: left; 3727 3753 line-height: 1.5; 3728 3754 padding: 3px 10px; … … body.no-js .buddypress #messages-bulk-management #select-all-messages { 3731 3757 3732 3758 .buddypress-wrap form.bp-dir-search-form button[type="submit"], 3733 3759 .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"] { 3735 3762 float: right; 3736 3763 font-size: inherit; 3737 3764 font-weight: 400; … … body.no-js .buddypress #messages-bulk-management #select-all-messages { 3744 3771 3745 3772 .buddypress-wrap form.bp-dir-search-form button[type="submit"] span, 3746 3773 .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 { 3748 3776 font-family: dashicons; 3749 3777 font-size: 18px; 3750 3778 line-height: 1.6; … … body.no-js .buddypress #messages-bulk-management #select-all-messages { 3752 3780 3753 3781 .buddypress-wrap form.bp-dir-search-form button[type="submit"].bp-show, 3754 3782 .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 { 3756 3785 height: auto; 3757 3786 left: 0; 3758 3787 overflow: visible; … … body.no-js .buddypress #messages-bulk-management #select-all-messages { 3762 3791 3763 3792 .buddypress-wrap form.bp-dir-search-form input[type="search"]::-webkit-search-cancel-button, 3764 3793 .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 { 3766 3796 -webkit-appearance: searchfield-cancel-button; 3767 3797 } 3768 3798 … … body.no-js .buddypress #messages-bulk-management #select-all-messages { 3771 3801 .buddypress-wrap form.bp-messages-search-form input[type="search"]::-webkit-search-results-button, 3772 3802 .buddypress-wrap form.bp-messages-search-form input[type="search"]::-webkit-search-results-decoration, 3773 3803 .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 { 3775 3807 display: none; 3776 3808 } 3777 3809 3810 .buddypress-wrap form#group-members-search:hover { 3811 border: 1px solid #d5d4d4; 3812 box-shadow: inset 0 0 3px #eee; 3813 } 3814 3778 3815 .buddypress-wrap ul.filters li form label input { 3779 3816 line-height: 1.4; 3780 3817 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
3 3 * Groups functions 4 4 * 5 5 * @since 3.0.0 6 * @version 3.1.06 * @version 5.0.0 7 7 */ 8 8 9 9 // Exit if accessed directly. … … function bp_nouveau_groups_enqueue_scripts() { 68 68 ' ); 69 69 } 70 70 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' ); 73 73 } 74 74 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 } 76 83 } 77 84 78 85 /** -
src/class-buddypress.php
diff --git src/class-buddypress.php src/class-buddypress.php index e6d8d609b..efa9744fc 100644
class BuddyPress { 487 487 require( $this->plugin_dir . 'bp-core/bp-core-moderation.php' ); 488 488 require( $this->plugin_dir . 'bp-core/bp-core-loader.php' ); 489 489 require( $this->plugin_dir . 'bp-core/bp-core-customizer-email.php' ); 490 require( $this->plugin_dir . 'bp-core/bp-core-rest-api.php' ); 490 491 491 492 // Maybe load deprecated functionality (this double negative is proof positive!) 492 493 if ( ! bp_get_option( '_bp_ignore_deprecated_code', ! $this->load_deprecated ) ) {