Skip to:
Content

BuddyPress.org

Ticket #8045: 8045.2.patch

File 8045.2.patch, 36.1 KB (added by imath, 6 years ago)
  • 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..a87b9aabb 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 .uname-column .profile-photo {
     148        margin-right: 1em;
     149}
     150
    143151@media screen and (max-width: 782px) {
    144152
    145153        .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 94ef62829..4e7ccfe24 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 ( file_exists( bp_locate_template( 'common/js-templates/group-members/index.php' ) ) ) {
     896                $js_asset    = bp_locate_template_asset( sprintf( 'js/buddypress-group-manage-members%s.js', bp_core_get_minified_asset_suffix() ) );
     897                $depedencies = array( 'json2', 'wp-backbone' );
     898
     899                if ( wp_script_is( 'wp-api-request', 'registered' ) ) {
     900                        $depedencies[] = 'wp-api-request';
     901                }
     902
     903                wp_enqueue_script(
     904                        'bp-nouveau-group-manage-members',
     905                        $js_asset['uri'],
     906                        $depedencies,
     907                        bp_get_version(),
     908                        true
     909                );
     910
     911                wp_localize_script( 'bp-nouveau-group-manage-members', 'BP_Nouveau', array(
     912                        'group_manage_members' => bp_nouveau_groups_get_group_manage_members_script_data( $item->id )
     913                ) );
     914
     915                bp_nouveau_group_manage_members_interface();
     916
     917                /**
     918                 * Echo out the JavaScript variable.
     919                 * This seems to be required by the autocompleter, leaving this here for now...
     920                 */
     921                echo '<script type="text/javascript">var group_id = "' . esc_js( $item->id ) . '";</script>';
     922                return;
     923        }
    894924
    895925        // Pull up a list of group members, so we can separate out the types
    896926        // We'll also keep track of group members here to place them into a
  • src/bp-groups/bp-groups-functions.php

    diff --git src/bp-groups/bp-groups-functions.php src/bp-groups/bp-groups-functions.php
    index 43240122a..ab0199090 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-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
    index e69de29bb..89b7ba108 100644
     
     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?>
     19<div id="group-manage-members-ui" class="standard-form">
     20    <ul class="subnav-filters">
     21        <li id="group-roles-filter" class="last filter"><?php // Placeholder for the Group Role Tabs ?></li>
     22        <li id="group-members-search-form"><?php // Placeholder for search form ?></li>
     23        <li id="group-members-pagination" class="left-menu"><?php // Placeholder for paginate links ?></li>
     24    </ul>
     25    <table id="group-members-list-table" class="<?php echo is_admin() ? 'widefat bp-group-members' : 'bp-list'; ?>"><?php // Placeholder to list members ?></table>
     26</div>
     27
     28<script type="text/html" id="tmpl-bp-manage-members-updating">
     29    <# if ( ! data.type ) { #>
     30        <small><?php echo esc_html_x( 'Updating role... Please wait.', 'group manage members update feedback', 'buddypress' ); ?></small>
     31    <# } else if ( 'ban' === data.type ) { #>
     32        <small><?php echo esc_html_x( 'Banning member... Please wait.', 'group manage members ban feedback', 'buddypress' ); ?></small>
     33    <# } else if ( 'unban' === data.type ) { #>
     34        <small><?php echo esc_html_x( 'Unbanning member... Please wait.', 'group manage members unban feedback', 'buddypress' ); ?></small>
     35    <# } else if ( 'remove' === data.type ) { #>
     36        <small><?php echo esc_html_x( 'Removing member... Please wait.', 'group manage members remove feedback', 'buddypress' ); ?></small>
     37    <# } #>
     38</script>
     39
     40<script type="text/html" id="tmpl-bp-manage-members-error">
     41   <small>{{data.message}}</small>
     42</script>
     43
     44<script type="text/html" id="tmpl-bp-manage-members-header">
     45    <tr>
     46        <th><?php echo esc_html_x( 'Group Members', 'group manage members table header', 'buddypress' ); ?></th>
     47        <th><?php echo esc_html_x( 'Roles', 'group manage members table header', 'buddypress' ); ?></th>
     48    </tr>
     49</script>
     50
     51<script type="text/html" id="tmpl-bp-manage-members-label">
     52    <# if ( data.type && 'filter' !== data.type ) { #>
     53        <?php echo esc_html_x( 'Change role for:', 'group manage members row edit', 'buddypress' ); ?>
     54    <# } else { #>
     55        <?php echo esc_html_x( 'Filter:', 'group manage members roles filter', 'buddypress' ); ?></small>
     56    <# } #>
     57</script>
     58
     59<script type="text/html" id="tmpl-bp-manage-members-row">
     60        <td class="uname-column">
     61        <div class="group-member">
     62            <a href="{{{data.link}}}">
     63                <img src="{{{data.avatar_urls.thumb}}}" alt="{{data.name}}" class="avatar profile-photo alignleft"/>
     64                {{data.name}}
     65            </a>
     66        </div>
     67        <div class="group-member-actions row-actions">
     68            <# if ( ! data.editing && ! data.is_banned ) { #>
     69                <span class="edit"><a href="#edit-role" data-action="edit"><?php echo esc_html_x( 'Edit', 'group member edit role link', 'buddypress' ); ?></a> | </span>
     70            <# } #>
     71            <# if ( data.editing ) { #>
     72                <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>
     73            <# } #>
     74            <# if ( ! data.is_banned ) { #>
     75                <span class="spam"><a href="#ban" class="submitdelete" data-action="ban"><?php echo esc_html_x( 'Ban', 'group member ban link', 'buddypress' ); ?></a> | </span>
     76            <# } else { #>
     77                <span class="ham"><a href="#unban" data-action="unban"><?php echo esc_html_x( 'Unban', 'group member unban link', 'buddypress' ); ?></a> | </span>
     78            <# } #>
     79            <span class="delete"><a href="#remove" class="submitdelete" data-action="remove"><?php echo esc_html_x( 'Remove', 'group member ban link', 'buddypress' ); ?></a></span>
     80        </div>
     81    </td>
     82    <td class="urole-column">
     83        <# if ( ! data.editing  && ! data.managingBan && ! data.removing ) { #>
     84            {{data.role.name}}
     85        <# } else { #>
     86            <div id="edit-group-member-{{data.id}}" class="group-member-edit"><?php // Placeholder for the Edit Role Dropdown. ;?></div>
     87        <# } #>
     88    </td>
     89</script>
     90
     91<script type="text/html" id="tmpl-bp-manage-members-paginate">
     92        <# if ( 1 !== data.currentPage && data.totalPages ) { #>
     93                <a class="group-members-paginate-link bp-pagination-links" href="#prev-page" data-page="{{data.prevPage}}">
     94                        <?php echo esc_html_x( 'Prev.', 'link', 'buddypress' ); ?>
     95        </a>
     96        <# } #>
     97
     98        <# if ( data.totalPages !== data.currentPage ) { #>
     99                <a class="group-members-paginate-link bp-pagination-links" href="#next-page" data-page="{{data.nextPage}}">
     100            <?php echo esc_html_x( 'Next', 'link', 'buddypress' ); ?>
     101        </a>
     102        <# } #>
     103</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..127d6d57e 100644
     
    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>
    15 
    16         <dl class="groups-manage-members-list">
    17 
    18         <dt class="admin-section section-title"><?php esc_html_e( 'Administrators', 'buddypress' ); ?></dt>
    19 
    20         <?php if ( bp_has_members( '&include=' . bp_group_admin_ids() ) ) : ?>
    21                 <dd class="admin-listing">
    22                         <ul id="admins-list" class="item-list single-line">
    23 
    24                                 <?php while ( bp_members() ) : bp_the_member(); ?>
    25                                 <li class="member-entry clearfix">
    26 
    27                                         <?php echo bp_core_fetch_avatar( array( 'item_id' => bp_get_member_user_id(), 'type' => 'thumb', 'width' => 30, 'height' => 30, 'alt' => '' ) ); ?>
    28                                         <p class="list-title member-name">
    29                                                 <a href="<?php bp_member_permalink(); ?>"> <?php bp_member_name(); ?></a>
    30                                         </p>
    31 
    32                                         <?php if ( count( bp_group_admin_ids( false, 'array' ) ) > 1 ) : ?>
    33 
    34                                                 <p class="action text-links-list">
    35                                                         <a class="button confirm admin-demote-to-member" href="<?php bp_group_member_demote_link( bp_get_member_user_id() ); ?>"><?php esc_html_e( 'Demote to Member', 'buddypress' ); ?></a>
    36                                                 </p>
    37 
    38                                         <?php endif; ?>
    39 
    40                                 </li>
    41                                 <?php endwhile; ?>
    42 
    43                         </ul>
    44                 </dd>
    45         <?php endif; ?>
    46 
    47         <?php if ( bp_group_has_moderators() ) : ?>
    48 
    49                 <dt class="moderator-section section-title"><?php esc_html_e( 'Moderators', 'buddypress' ); ?></dt>
    50 
    51                 <dd class="moderator-listing">
    52                 <?php if ( bp_has_members( '&include=' . bp_group_mod_ids() ) ) : ?>
    53                         <ul id="mods-list" class="item-list single-line">
    54 
    55                                 <?php while ( bp_members() ) : bp_the_member(); ?>
    56                                 <li class="members-entry clearfix">
    57 
    58                                         <?php echo bp_core_fetch_avatar( array( 'item_id' => bp_get_member_user_id(), 'type' => 'thumb', 'width' => 30, 'height' => 30, 'alt' => '' ) ); ?>
    59                                         <p class="list-title member-name">
    60                                                 <a href="<?php bp_member_permalink(); ?>"> <?php bp_member_name(); ?></a>
    61                                         </p>
    62 
    63                                         <div class="members-manage-buttons action text-links-list">
    64                                                 <a href="<?php bp_group_member_promote_admin_link( array( 'user_id' => bp_get_member_user_id() ) ); ?>" class="button confirm mod-promote-to-admin"><?php esc_html_e( 'Promote to Admin', 'buddypress' ); ?></a>
    65                                                 <a class="button confirm mod-demote-to-member" href="<?php bp_group_member_demote_link( bp_get_member_user_id() ); ?>"><?php esc_html_e( 'Demote to Member', 'buddypress' ); ?></a>
    66                                         </div>
    67 
    68                                 </li>
    69 
    70                                 <?php endwhile; ?>
    71 
    72                         </ul>
    73 
    74                 <?php endif; ?>
    75         </dd>
    76         <?php endif ?>
    77 
    78 
    79         <dt class="gen-members-section section-title"><?php esc_html_e( 'Members', 'buddypress' ); ?></dt>
    80 
    81         <dd class="general-members-listing">
    82                 <?php if ( bp_group_has_members( 'per_page=15&exclude_banned=0' ) ) : ?>
    83 
    84                         <?php if ( bp_group_member_needs_pagination() ) : ?>
    85 
    86                                 <?php bp_nouveau_pagination( 'top' ) ; ?>
    87 
    88                         <?php endif; ?>
    89 
    90                         <ul id="members-list" class="item-list single-line">
    91                                 <?php while ( bp_group_members() ) : bp_group_the_member(); ?>
    92 
    93                                         <li class="<?php bp_group_member_css_class(); ?> members-entry clearfix">
    94                                                 <?php bp_group_member_avatar_mini(); ?>
    95 
    96                                                 <p class="list-title member-name">
    97                                                         <?php bp_group_member_link(); ?>
    98                                                         <span class="banned warn">
    99                                                                 <?php if ( bp_get_group_member_is_banned() ) : ?>
    100                                                                         <?php
    101                                                                         /* translators: indicates a user is banned from a group, e.g. "Mike (banned)". */
    102                                                                         esc_html_e( '(banned)', 'buddypress' );
    103                                                                         ?>
    104                                                                 <?php endif; ?>
    105                                                         </span>
    106                                                 </p>
    107 
    108                                                 <?php bp_nouveau_groups_manage_members_buttons( array( 'container' => 'div', 'container_classes' => array( 'members-manage-buttons', 'text-links-list' ), 'parent_element' => '  ' ) ) ; ?>
    109 
    110                                         </li>
    111 
    112                                 <?php endwhile; ?>
    113                         </ul>
    114         </dd>
    115 
    116 </dl>
    117 
    118         <?php else:
    119 
    120                 bp_nouveau_user_feedback( 'group-manage-members-none' );
    121 
    122         endif; ?>
     14<p class="bp-help-text"><?php esc_html_e( 'Manage your group members; promote to moderators, admins or demote or ban.', 'buddypress' ); ?></p>
    12315
     16<?php bp_nouveau_group_manage_members_interface();
  • 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 d02a1be49..1620aaae8 100644
    function bp_nouveau_groups_register_scripts( $scripts = array() ) { 
    4343                return $scripts;
    4444        }
    4545
     46        $dependencies        = array( 'bp-nouveau', 'json2', 'wp-backbone' );
     47        $manage_members_deps = $dependencies;
     48
     49        if ( wp_script_is( 'wp-api-request', 'registered' ) ) {
     50                $manage_members_deps[] = 'wp-api-request';
     51        }
     52
    4653        return array_merge( $scripts, array(
    4754                'bp-nouveau-group-invites' => array(
    4855                        'file'         => 'js/buddypress-group-invites%s.js',
    49                         'dependencies' => array( 'bp-nouveau', 'json2', 'wp-backbone' ),
     56                        'dependencies' => $dependencies,
     57                        'footer'       => true,
     58                ),
     59                'bp-nouveau-group-manage-members' => array(
     60                        'file'         => 'js/buddypress-group-manage-members%s.js',
     61                        'dependencies' => $manage_members_deps,
    5062                        'footer'       => true,
    5163                ),
    5264        ) );
    function bp_nouveau_groups_enqueue_scripts() { 
    6880                ' );
    6981        }
    7082
    71         if ( ! bp_is_group_invites() && ! ( bp_is_group_create() && bp_is_group_creation_step( 'group-invites' ) ) ) {
    72                 return;
     83        if ( bp_is_group_invites() || ( bp_is_group_create() && bp_is_group_creation_step( 'group-invites' ) ) ) {
     84                wp_enqueue_script( 'bp-nouveau-group-invites' );
    7385        }
    7486
    75         wp_enqueue_script( 'bp-nouveau-group-invites' );
     87        if ( bp_is_group_admin_page() && bp_is_group_admin_screen( 'manage-members' ) ) {
     88                wp_enqueue_script( 'bp-nouveau-group-manage-members' );
     89        }
    7690}
    7791
    7892/**
    function bp_nouveau_groups_disallow_all_members_invites( $default = false ) { 
    95109        return apply_filters( 'bp_nouveau_groups_disallow_all_members_invites', $default );
    96110}
    97111
     112function bp_nouveau_groups_get_group_manage_members_script_data( $group_id = 0 ) {
     113        if ( ! $group_id ) {
     114                return array();
     115        } else {
     116                $group_id = (int) $group_id;
     117        }
     118
     119        $path = sprintf( '/%1$s/%2$s/%3$s/%4$s/members?exclude_admins=false',
     120                bp_rest_namespace(),
     121                bp_rest_version(),
     122                buddypress()->groups->id,
     123                $group_id
     124        );
     125
     126        $preloaded_members = array();
     127        if ( function_exists( 'rest_preload_api_request' ) ) {
     128                $preloaded_members = rest_preload_api_request( '', $path );
     129        }
     130
     131        $script_data = array(
     132                'path'      => remove_query_arg( 'exclude_admins', $path ),
     133                'preloaded' => reset( $preloaded_members ),
     134                'roles'     => bp_groups_get_group_roles(),
     135        );
     136
     137        if ( ! wp_script_is( 'wp-api-request', 'registered' ) ) {
     138                $script_data = array_merge( $script_data, array(
     139                        'wpRestRoot'  => esc_url_raw( get_rest_url() ),
     140                        'wpRestNonce' => wp_create_nonce( 'wp_rest' ),
     141                ) );
     142        }
     143
     144        return $script_data;
     145}
     146
    98147/**
    99148 * Localize the strings needed for the Group's Invite UI
    100149 *
    function bp_nouveau_groups_disallow_all_members_invites( $default = false ) { 
    105154 * @return array The same array with specific strings for the Group's Invite UI if needed.
    106155 */
    107156function bp_nouveau_groups_localize_scripts( $params = array() ) {
    108         if ( ! bp_is_group_invites() && ! ( bp_is_group_create() && bp_is_group_creation_step( 'group-invites' ) ) ) {
    109                 return $params;
    110         }
     157        if ( bp_is_group_invites() || ( bp_is_group_create() && bp_is_group_creation_step( 'group-invites' ) ) ) {
     158                $show_pending = bp_group_has_invites( array( 'user_id' => 'any' ) ) && ! bp_is_group_create();
     159
     160                // Init the Group invites nav
     161                $invites_nav = array(
     162                        'members' => array(
     163                                'id'      => 'members',
     164                                'caption' => __( 'All Members', 'buddypress' ),
     165                                'order'   => 5,
     166                        ),
     167                        'invited' => array(
     168                                'id'      => 'invited',
     169                                'caption' => __( 'Pending Invites', 'buddypress' ),
     170                                'order'   => 90,
     171                                'hide'    => (int) ! $show_pending,
     172                        ),
     173                        'invites' => array(
     174                                'id'      => 'invites',
     175                                'caption' => __( 'Send Invites', 'buddypress' ),
     176                                'order'   => 100,
     177                                'hide'    => 1,
     178                                'href'    => '#send-invites-editor',
     179                        ),
     180                );
    111181
    112         $show_pending = bp_group_has_invites( array( 'user_id' => 'any' ) ) && ! bp_is_group_create();
     182                if ( bp_is_active( 'friends' ) ) {
     183                        $invites_nav['friends'] = array(
     184                                'id'      => 'friends',
     185                                'caption' => __( 'My Friends', 'buddypress' ),
     186                                'order'   => 0,
     187                        );
    113188
    114         // Init the Group invites nav
    115         $invites_nav = array(
    116                 'members' => array(
    117                         'id'      => 'members',
    118                         'caption' => __( 'All Members', 'buddypress' ),
    119                         'order'   => 5,
    120                 ),
    121                 'invited' => array(
    122                         'id'      => 'invited',
    123                         'caption' => __( 'Pending Invites', 'buddypress' ),
    124                         'order'   => 90,
    125                         'hide'    => (int) ! $show_pending,
    126                 ),
    127                 'invites' => array(
    128                         'id'      => 'invites',
    129                         'caption' => __( 'Send Invites', 'buddypress' ),
    130                         'order'   => 100,
    131                         'hide'    => 1,
    132                         'href'    => '#send-invites-editor',
    133                 ),
    134         );
     189                        if ( true === bp_nouveau_groups_disallow_all_members_invites() ) {
     190                                unset( $invites_nav['members'] );
     191                        }
     192                }
    135193
    136         if ( bp_is_active( 'friends' ) ) {
    137                 $invites_nav['friends'] = array(
    138                         'id'      => 'friends',
    139                         'caption' => __( 'My Friends', 'buddypress' ),
    140                         'order'   => 0,
     194                $params['group_invites'] = array(
     195                        'nav'                => bp_sort_by_key( $invites_nav, 'order', 'num' ),
     196                        'loading'            => __( 'Loading members. Please wait.', 'buddypress' ),
     197                        'invites_form'       => __( 'Use the "Send" button to send your invite or the "Cancel" button to abort.', 'buddypress' ),
     198                        'invites_form_reset' => __( 'Group invitations cleared. Please use one of the available tabs to select members to invite.', 'buddypress' ),
     199                        'invites_sending'    => __( 'Sending group invitations. Please wait.', 'buddypress' ),
     200                        'removeUserInvite'   => __( 'Cancel invitation %s', 'buddypress' ),
     201                        'group_id'           => ! bp_get_current_group_id() ? bp_get_new_group_id() : bp_get_current_group_id(),
     202                        'is_group_create'    => bp_is_group_create(),
     203                        'nonces'             => array(
     204                                'uninvite'     => wp_create_nonce( 'groups_invite_uninvite_user' ),
     205                                'send_invites' => wp_create_nonce( 'groups_send_invites' )
     206                        ),
    141207                );
    142 
    143                 if ( true === bp_nouveau_groups_disallow_all_members_invites() ) {
    144                         unset( $invites_nav['members'] );
    145                 }
    146208        }
    147209
    148         $params['group_invites'] = array(
    149                 'nav'                => bp_sort_by_key( $invites_nav, 'order', 'num' ),
    150                 'loading'            => __( 'Loading members. Please wait.', 'buddypress' ),
    151                 'invites_form'       => __( 'Use the "Send" button to send your invite or the "Cancel" button to abort.', 'buddypress' ),
    152                 'invites_form_reset' => __( 'Group invitations cleared. Please use one of the available tabs to select members to invite.', 'buddypress' ),
    153                 'invites_sending'    => __( 'Sending group invitations. Please wait.', 'buddypress' ),
    154                 'removeUserInvite'   => __( 'Cancel invitation %s', 'buddypress' ),
    155                 'group_id'           => ! bp_get_current_group_id() ? bp_get_new_group_id() : bp_get_current_group_id(),
    156                 'is_group_create'    => bp_is_group_create(),
    157                 'nonces'             => array(
    158                         'uninvite'     => wp_create_nonce( 'groups_invite_uninvite_user' ),
    159                         'send_invites' => wp_create_nonce( 'groups_send_invites' )
    160                 ),
    161         );
     210        if ( bp_is_group_admin_page() && bp_is_group_admin_screen( 'manage-members' ) ) {
     211                $params['group_manage_members'] = bp_nouveau_groups_get_group_manage_members_script_data( bp_get_current_group_id() );
     212        }
    162213
    163214        return $params;
    164215}
  • src/bp-templates/bp-nouveau/includes/groups/template-tags.php

    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
    function bp_nouveau_group_invites_interface() { 
    188188        do_action( 'bp_after_group_send_invites_content' );
    189189}
    190190
     191/**
     192 * Load the Group Membership management UI.
     193 *
     194 * @since 5.0.0
     195 *
     196 * @return string HTML Output.
     197 */
     198function bp_nouveau_group_manage_members_interface() {
     199        bp_get_template_part( 'common/js-templates/group-members/index' );
     200}
     201
    191202/**
    192203 * Gets the displayed user group invites preferences
    193204 *
  • src/bp-templates/bp-nouveau/js/buddypress-group-manage-members.js

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