Ticket #8045: 8045.2.patch
File 8045.2.patch, 36.1 KB (added by , 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 { 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 .uname-column .profile-photo { 148 margin-right: 1em; 149 } 150 143 151 @media screen and (max-width: 782px) { 144 152 145 153 .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 ) { 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 ( 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 } 894 924 895 925 // Pull up a list of group members, so we can separate out the types 896 926 // 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 ) { 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-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
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> 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> 123 15 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() ) { 43 43 return $scripts; 44 44 } 45 45 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 46 53 return array_merge( $scripts, array( 47 54 'bp-nouveau-group-invites' => array( 48 55 '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, 50 62 'footer' => true, 51 63 ), 52 64 ) ); … … function bp_nouveau_groups_enqueue_scripts() { 68 80 ' ); 69 81 } 70 82 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' ); 73 85 } 74 86 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 } 76 90 } 77 91 78 92 /** … … function bp_nouveau_groups_disallow_all_members_invites( $default = false ) { 95 109 return apply_filters( 'bp_nouveau_groups_disallow_all_members_invites', $default ); 96 110 } 97 111 112 function 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 98 147 /** 99 148 * Localize the strings needed for the Group's Invite UI 100 149 * … … function bp_nouveau_groups_disallow_all_members_invites( $default = false ) { 105 154 * @return array The same array with specific strings for the Group's Invite UI if needed. 106 155 */ 107 156 function 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 ); 111 181 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 ); 113 188 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 } 135 193 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 ), 141 207 ); 142 143 if ( true === bp_nouveau_groups_disallow_all_members_invites() ) {144 unset( $invites_nav['members'] );145 }146 208 } 147 209 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 } 162 213 163 214 return $params; 164 215 } -
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() { 188 188 do_action( 'bp_after_group_send_invites_content' ); 189 189 } 190 190 191 /** 192 * Load the Group Membership management UI. 193 * 194 * @since 5.0.0 195 * 196 * @return string HTML Output. 197 */ 198 function bp_nouveau_group_manage_members_interface() { 199 bp_get_template_part( 'common/js-templates/group-members/index' ); 200 } 201 191 202 /** 192 203 * Gets the displayed user group invites preferences 193 204 * -
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 );