Ticket #8045: 8045.1.patch
File 8045.1.patch, 34.9 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..231dc7860 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 wp_enqueue_script( 898 'bp-nouveau-group-manage-members', 899 $js_asset['uri'], 900 array( 'json2', 'wp-backbone', 'wp-api-request' ), 901 bp_get_version(), 902 true 903 ); 904 905 wp_localize_script( 'bp-nouveau-group-manage-members', 'BP_Nouveau', array( 906 'group_manage_members' => bp_nouveau_groups_get_group_manage_members_script_data( $item->id ) 907 ) ); 908 909 bp_nouveau_group_manage_members_interface(); 910 911 /** 912 * Echo out the JavaScript variable. 913 * This seems to be required by the autocompleter, leaving this here for now... 914 */ 915 echo '<script type="text/javascript">var group_id = "' . esc_js( $item->id ) . '";</script>'; 916 return; 917 } 894 918 895 919 // Pull up a list of group members, so we can separate out the types 896 920 // 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..3ea88061c 100644
function bp_nouveau_groups_register_scripts( $scripts = array() ) { 49 49 'dependencies' => array( 'bp-nouveau', 'json2', 'wp-backbone' ), 50 50 'footer' => true, 51 51 ), 52 'bp-nouveau-group-manage-members' => array( 53 'file' => 'js/buddypress-group-manage-members%s.js', 54 'dependencies' => array( 'bp-nouveau', 'json2', 'wp-backbone', 'wp-api-request' ), 55 'footer' => true, 56 ), 52 57 ) ); 53 58 } 54 59 … … function bp_nouveau_groups_enqueue_scripts() { 68 73 ' ); 69 74 } 70 75 71 if ( ! bp_is_group_invites() && !( bp_is_group_create() && bp_is_group_creation_step( 'group-invites' ) ) ) {72 return;76 if ( bp_is_group_invites() || ( bp_is_group_create() && bp_is_group_creation_step( 'group-invites' ) ) ) { 77 wp_enqueue_script( 'bp-nouveau-group-invites' ); 73 78 } 74 79 75 wp_enqueue_script( 'bp-nouveau-group-invites' ); 80 if ( bp_is_group_admin_page() && bp_is_group_admin_screen( 'manage-members' ) ) { 81 wp_enqueue_script( 'bp-nouveau-group-manage-members' ); 82 } 76 83 } 77 84 78 85 /** … … function bp_nouveau_groups_disallow_all_members_invites( $default = false ) { 95 102 return apply_filters( 'bp_nouveau_groups_disallow_all_members_invites', $default ); 96 103 } 97 104 105 function bp_nouveau_groups_get_group_manage_members_script_data( $group_id = 0 ) { 106 if ( ! $group_id ) { 107 return array(); 108 } else { 109 $group_id = (int) $group_id; 110 } 111 112 $path = sprintf( '/%1$s/%2$s/%3$s/%4$s/members?exclude_admins=false', 113 bp_rest_namespace(), 114 bp_rest_version(), 115 buddypress()->groups->id, 116 $group_id 117 ); 118 119 $preloaded_members = array(); 120 if ( function_exists( 'rest_preload_api_request' ) ) { 121 $preloaded_members = rest_preload_api_request( '', $path ); 122 } 123 124 return array( 125 'path' => remove_query_arg( 'exclude_admins', $path ), 126 'preloaded' => reset( $preloaded_members ), 127 'roles' => bp_groups_get_group_roles(), 128 ); 129 } 130 98 131 /** 99 132 * Localize the strings needed for the Group's Invite UI 100 133 * … … function bp_nouveau_groups_disallow_all_members_invites( $default = false ) { 105 138 * @return array The same array with specific strings for the Group's Invite UI if needed. 106 139 */ 107 140 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 } 141 if ( bp_is_group_invites() || ( bp_is_group_create() && bp_is_group_creation_step( 'group-invites' ) ) ) { 142 $show_pending = bp_group_has_invites( array( 'user_id' => 'any' ) ) && ! bp_is_group_create(); 143 144 // Init the Group invites nav 145 $invites_nav = array( 146 'members' => array( 147 'id' => 'members', 148 'caption' => __( 'All Members', 'buddypress' ), 149 'order' => 5, 150 ), 151 'invited' => array( 152 'id' => 'invited', 153 'caption' => __( 'Pending Invites', 'buddypress' ), 154 'order' => 90, 155 'hide' => (int) ! $show_pending, 156 ), 157 'invites' => array( 158 'id' => 'invites', 159 'caption' => __( 'Send Invites', 'buddypress' ), 160 'order' => 100, 161 'hide' => 1, 162 'href' => '#send-invites-editor', 163 ), 164 ); 111 165 112 $show_pending = bp_group_has_invites( array( 'user_id' => 'any' ) ) && ! bp_is_group_create(); 166 if ( bp_is_active( 'friends' ) ) { 167 $invites_nav['friends'] = array( 168 'id' => 'friends', 169 'caption' => __( 'My Friends', 'buddypress' ), 170 'order' => 0, 171 ); 113 172 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 ); 173 if ( true === bp_nouveau_groups_disallow_all_members_invites() ) { 174 unset( $invites_nav['members'] ); 175 } 176 } 135 177 136 if ( bp_is_active( 'friends' ) ) { 137 $invites_nav['friends'] = array( 138 'id' => 'friends', 139 'caption' => __( 'My Friends', 'buddypress' ), 140 'order' => 0, 178 $params['group_invites'] = array( 179 'nav' => bp_sort_by_key( $invites_nav, 'order', 'num' ), 180 'loading' => __( 'Loading members. Please wait.', 'buddypress' ), 181 'invites_form' => __( 'Use the "Send" button to send your invite or the "Cancel" button to abort.', 'buddypress' ), 182 'invites_form_reset' => __( 'Group invitations cleared. Please use one of the available tabs to select members to invite.', 'buddypress' ), 183 'invites_sending' => __( 'Sending group invitations. Please wait.', 'buddypress' ), 184 'removeUserInvite' => __( 'Cancel invitation %s', 'buddypress' ), 185 'group_id' => ! bp_get_current_group_id() ? bp_get_new_group_id() : bp_get_current_group_id(), 186 'is_group_create' => bp_is_group_create(), 187 'nonces' => array( 188 'uninvite' => wp_create_nonce( 'groups_invite_uninvite_user' ), 189 'send_invites' => wp_create_nonce( 'groups_send_invites' ) 190 ), 141 191 ); 142 143 if ( true === bp_nouveau_groups_disallow_all_members_invites() ) {144 unset( $invites_nav['members'] );145 }146 192 } 147 193 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 ); 194 if ( bp_is_group_admin_page() && bp_is_group_admin_screen( 'manage-members' ) ) { 195 $params['group_manage_members'] = bp_nouveau_groups_get_group_manage_members_script_data( bp_get_current_group_id() ); 196 } 162 197 163 198 return $params; 164 199 } -
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..b17b1852f 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 bp.Models = bp.Models || {}; 15 bp.Collections = bp.Collections || {}; 16 bp.Views = bp.Views || {}; 17 18 /** 19 * Model for the Member of the displayed group. 20 */ 21 bp.Models.groupMember = Backbone.Model.extend( { 22 defaults: { 23 id: 0, 24 name: '', 25 avatar_urls : {}, 26 is_admin: false, 27 is_banned: false, 28 is_confirmed: false, 29 is_mod: false, 30 link: '' 31 }, 32 options : { 33 path: BP_Nouveau.group_manage_members.path, 34 type: 'POST', 35 data: {}, 36 dataType: 'json' 37 }, 38 39 initialize: function() { 40 // Make sure to reset data & path on model's sync. 41 this.on( 'sync', this.resetRequestOptions, this ); 42 }, 43 44 resetRequestOptions: function() { 45 this.options.data = {}; 46 this.options.path = BP_Nouveau.group_manage_members.path; 47 }, 48 49 sync: function( method, model, options ) { 50 options = options || {}; 51 options.context = this; 52 var data = options.data || {}; 53 this.options.path = this.options.path.concat( '/' + model.get( 'id' ) ); 54 55 _.extend( options, this.options ); 56 _.extend( options.data, data ); 57 58 if ( 'delete' === method || 'update' === method ) { 59 if ( 'delete' === method ) { 60 options.headers = { 'X-HTTP-Method-Override': 'DELETE' }; 61 } else { 62 options.headers = { 'X-HTTP-Method-Override': 'PUT' }; 63 } 64 65 return wp.apiRequest( options ); 66 } 67 }, 68 69 parse: function( response ) { 70 if ( _.isArray( response ) ) { 71 response = _.first( response ); 72 } 73 74 return response; 75 } 76 } ); 77 78 /** 79 * Collection for the Members of the displayed group. 80 */ 81 bp.Collections.groupMembers = Backbone.Collection.extend( { 82 model: bp.Models.groupMember, 83 options : { 84 path: BP_Nouveau.group_manage_members.path, 85 type: 'GET', 86 data: {}, 87 dataType: 'json' 88 }, 89 90 initialize: function() { 91 // Make sure to reset data on collection's reset. 92 this.on( 'reset', function() { 93 this.options.data = {}; 94 }, this ); 95 }, 96 97 sync: function( method, collection, options ) { 98 options = options || {}; 99 options.context = this; 100 var data = options.data || {}; 101 102 _.extend( options, this.options ); 103 _.extend( options.data, data ); 104 105 if ( 'read' === method ) { 106 var self = this, success = options.success; 107 options.success = function( data, textStatus, request ) { 108 if ( ! _.isUndefined( request ) ) { 109 self.totalPages = parseInt( request.getResponseHeader( 'X-WP-TotalPages' ), 10 ); 110 self.totalGroupMembers = parseInt( request.getResponseHeader( 'X-WP-Total' ), 10 ); 111 } 112 113 self.currentPage = options.data.page || 1; 114 115 if ( success ) { 116 return success.apply( this, arguments ); 117 } 118 }; 119 120 return wp.apiRequest( options ); 121 } 122 } 123 } ); 124 125 // Extend wp.Backbone.View with .prepare(). 126 bp.View = bp.View || bp.Backbone.View.extend( { 127 prepare: function() { 128 if ( ! _.isUndefined( this.model ) && _.isFunction( this.model.toJSON ) ) { 129 return this.model.toJSON(); 130 } else { 131 return {}; 132 } 133 } 134 } ); 135 136 bp.Views.GroupMemberUpdatingInfo = bp.View.extend( { 137 tagName: 'p', 138 template : bp.template( 'bp-manage-members-updating' ), 139 140 initialize: function() { 141 this.model = new Backbone.Model( { 142 type: this.options.value 143 } ); 144 } 145 } ); 146 147 bp.Views.GroupMemberErrorInfo = bp.View.extend( { 148 tagName: 'p', 149 template : bp.template( 'bp-manage-members-error' ), 150 151 initialize: function() { 152 this.model = new Backbone.Model( { 153 message: this.options.value 154 } ); 155 } 156 } ); 157 158 bp.Views.GroupsMembersLabel = bp.Views.GroupMemberUpdatingInfo.extend( { 159 tagName: 'label', 160 template: bp.template( 'bp-manage-members-label' ) 161 } ); 162 163 bp.Views.GroupRolesDropDown = bp.View.extend( { 164 tagName: 'select', 165 filters: _.extend( { all: { name: 'All members' } }, BP_Nouveau.group_manage_members.roles ), 166 167 events: { 168 change: 'change' 169 }, 170 171 initialize: function() { 172 if ( this.options.omits ) { 173 this.filters = _.omit( this.filters, this.options.omits ); 174 } 175 176 if ( this.options.extends ) { 177 this.filters = _.extend( this.filters, this.options.extends ); 178 } 179 180 // Build `<option>` elements. 181 this.$el.html( _.chain( this.filters ).map( function( filter, value ) { 182 var optionOutput = $( '<option></option>' ).val( value ).html( filter.name )[0]; 183 184 if ( this.options.currentRole && value === this.options.currentRole ) { 185 return { 186 el: $( optionOutput ).prop( 'selected', true ) 187 }; 188 } else { 189 return { 190 el: optionOutput 191 }; 192 } 193 }, this ).pluck( 'el' ).value() ); 194 }, 195 196 change: function( event ) { 197 var role = $( event.target ).val(), queryArgs = { roles: [ role ] }; 198 199 if ( ! this.collection ) { 200 return; 201 } 202 203 if ( 'all' === role ) { 204 // Unset the current role. 205 this.collection.currentRole = ''; 206 207 queryArgs = { 'exclude_admins': false }; 208 } else { 209 // Set the current role. 210 this.collection.currentRole = role; 211 } 212 213 queryArgs.page = 1; 214 215 this.collection.fetch( { 216 data: queryArgs, 217 reset: true 218 } ); 219 } 220 } ); 221 222 bp.Views.GroupsMembersPagination = bp.View.extend( { 223 className: 'bp-pagination', 224 template: bp.template( 'bp-manage-members-paginate' ), 225 226 events: { 227 'click .group-members-paginate-link' : 'queryPage', 228 }, 229 230 initialize: function() { 231 this.collection.on( 'reset', this.setPagination, this ); 232 }, 233 234 setPagination: function( collection ) { 235 var attributes = _.pick( collection, [ 'currentPage', 'totalGroupMembers', 'totalPages' ] ); 236 237 if ( attributes.totalPages > 1 ) { 238 attributes.nextPage = attributes.currentPage + 1; 239 attributes.prevPage = attributes.currentPage - 1; 240 } 241 242 this.model = new Backbone.Model( attributes ); 243 this.render(); 244 }, 245 246 queryPage: function( event ) { 247 event.preventDefault(); 248 249 var page = $( event.target ).data( 'page' ), 250 queryArgs = _.extend( this.collection.options.data, { page: page } ); 251 252 if ( ! this.collection.currentRole ) { 253 queryArgs[ 'exclude_admins' ] = false; 254 } else { 255 queryArgs.roles = [ this.collection.currentRole ]; 256 } 257 258 this.collection.fetch( { 259 data: queryArgs, 260 reset: true 261 } ); 262 } 263 } ); 264 265 bp.Views.GroupMembersListRow = bp.View.extend( { 266 tagName: 'tr', 267 template : bp.template( 'bp-manage-members-row' ), 268 269 events: { 270 'click .group-member-actions a' : 'doMemberAction', 271 'change .group-member-edit select' : 'editMemberRole' 272 }, 273 274 initialize: function() { 275 var roleProps = [ 'is_admin', 'is_banned', 'is_confirmed', 'is_mod' ], 276 self = this; 277 278 _.each( BP_Nouveau.group_manage_members.roles, function( props ) { 279 if ( _.isMatch( self.model.attributes, _.pick( props, roleProps ) ) ) { 280 self.model.set( 'role', _.pick( props, ['id', 'name'] ), { silent: true } ); 281 } 282 } ); 283 284 this.model.collection.on( 'reset', this.clearRow, this ); 285 }, 286 287 clearRow: function() { 288 this.views.view.remove(); 289 }, 290 291 renderEditForm: function() { 292 var userId = this.model.get( 'id' ); 293 294 this.render(); 295 296 this.views.set( '#edit-group-member-' + userId, [ 297 new bp.Views.GroupsMembersLabel( { value: userId, attributes: { for: 'group-member' + userId + '-role' } } ), 298 new bp.Views.GroupRolesDropDown( { id: 'group-member' + userId + '-role', omits: [ 'all', 'banned' ], currentRole: this.model.get( 'role' ).id } ).render() 299 ] ); 300 }, 301 302 resetRow: function() { 303 this.model.set( 'editing', false ); 304 305 return this.render(); 306 }, 307 308 getRoleObject: function( roleId ) { 309 var roles = BP_Nouveau.group_manage_members.roles; 310 311 if ( _.isUndefined( roles[ roleId ] ) ) { 312 return {}; 313 } 314 315 return _.extend( 316 { role: _.pick( roles[ roleId ], ['id', 'name'] ) }, 317 _.pick( roles[ roleId ], [ 'is_admin', 'is_banned', 'is_confirmed', 'is_mod' ] ) 318 ); 319 }, 320 321 doMemberAction: function( event ) { 322 event.preventDefault(); 323 324 var action = $( event.target ).data( 'action' ), self = this; 325 326 if ( 'edit' === action ) { 327 this.model.set( 'editing', true ); 328 return this.renderEditForm(); 329 330 } else if ( 'abort' === action ) { 331 return this.resetRow(); 332 333 } else if ( 'ban' === action || 'unban' === action ) { 334 var newRole = ( 'ban' === action ) ? 'banned' : 'member', roleObject = this.getRoleObject( newRole ); 335 336 if ( ! roleObject ) { 337 return this.resetRow(); 338 } else { 339 this.model.set( 'managingBan', true ); 340 this.render(); 341 } 342 343 // Display user feedback. 344 this.views.set( '#edit-group-member-' + this.model.get( 'id' ), new bp.Views.GroupMemberUpdatingInfo( { value: action } ).render() ); 345 346 // Update Group member's role. 347 this.model.save( roleObject, { 348 wait: true, 349 data: { action: action }, 350 success: function( model, response ) { 351 self.model.collection.remove( model ); 352 return self.clearRow(); 353 }, 354 error: function( model, response ) { 355 self.views.set( '#edit-group-member-' + model.get( 'id' ), new bp.Views.GroupMemberErrorInfo( { value: response.responseJSON.message } ).render() ); 356 357 // Make sure to reset request options. 358 model.resetRequestOptions(); 359 model.set( 'managingBan', false ); 360 } 361 } ); 362 } else if ( 'remove' === action ) { 363 this.model.set( 'removing', true ); 364 this.render(); 365 366 // Display user feedback. 367 this.views.set( '#edit-group-member-' + this.model.get( 'id' ), new bp.Views.GroupMemberUpdatingInfo( { value: action } ).render() ); 368 369 // Destroy the membership model. 370 this.model.destroy( { 371 wait: true, 372 data: {}, 373 success: function( model, response ) { 374 return self.clearRow(); 375 }, 376 error: function( model, response ) { 377 self.views.set( '#edit-group-member-' + model.get( 'id' ), new bp.Views.GroupMemberErrorInfo( { value: response.responseJSON.message } ).render() ); 378 379 // Make sure to reset request options. 380 model.resetRequestOptions(); 381 model.set( 'removing', false ); 382 } 383 } ); 384 } 385 }, 386 387 editMemberRole: function( event ) { 388 var newRole = $( event.target ).val(), roleObject = this.getRoleObject( newRole ), 389 currentRole = this.model.get( 'role').id, roleAction = 'promote', self = this; 390 391 if ( newRole === this.model.get( 'role' ).id || ! roleObject ) { 392 return this.resetRow(); 393 } 394 395 this.views.set( '#edit-group-member-' + this.model.get( 'id' ), new bp.Views.GroupMemberUpdatingInfo().render() ); 396 397 if ( 'admin' === currentRole || ( 'mod' === currentRole && 'member' === newRole ) ) { 398 roleAction = 'demote'; 399 } 400 401 // Update Group member's role 402 this.model.save( roleObject, { 403 wait: true, 404 data: { 405 action: roleAction, 406 role: newRole 407 }, 408 success: function( model, response ) { 409 if ( self.model.collection.currentRole && newRole !== self.model.collection.currentRole ) { 410 self.model.collection.remove( model ); 411 return self.clearRow(); 412 } else { 413 return self.resetRow(); 414 } 415 }, 416 error: function( model, response ) { 417 self.views.set( '#edit-group-member-' + model.get( 'id' ), new bp.Views.GroupMemberErrorInfo( { value: response.responseJSON.message } ).render() ); 418 419 // Make sure to reset request options. 420 model.resetRequestOptions(); 421 model.set( 'editing', false ); 422 } 423 } ); 424 } 425 } ); 426 427 bp.Views.GroupMembersListHeader = bp.View.extend( { 428 tagName: 'thead', 429 template : bp.template( 'bp-manage-members-header' ) 430 } ); 431 432 bp.Views.GroupMembersListTable = bp.View.extend( { 433 tagName: 'tbody', 434 435 initialize: function() { 436 var preloaded = BP_Nouveau.group_manage_members.preloaded || {}, 437 models = []; 438 439 this.collection.on( 'reset', this.addListTableRows, this ); 440 441 if ( preloaded.body && preloaded.body.length > 0 ) { 442 _.each( preloaded.body, function( member ) { 443 models.push( new bp.Models.groupMember( member ) ) 444 } ); 445 446 this.collection.currentPage = 1; 447 if ( preloaded.headers && preloaded.headers[ 'X-WP-TotalPages' ] ) { 448 this.collection.totalPages = parseInt( preloaded.headers[ 'X-WP-TotalPages' ], 10 ); 449 } 450 451 if ( preloaded.headers && preloaded.headers[ 'X-WP-Total' ] ) { 452 this.collection.totalGroupMembers = parseInt( preloaded.headers[ 'X-WP-Total' ], 10 ); 453 } 454 455 this.collection.reset( models ); 456 } else { 457 this.collection.fetch( { 458 data: { 'exclude_admins': false }, 459 reset: true 460 } ); 461 } 462 }, 463 464 addListTableRows: function( collection ) { 465 _.each( collection.models, function( member ) { 466 this.views.add( new bp.Views.GroupMembersListRow( { model: member } ) ); 467 }, this ); 468 } 469 } ); 470 471 bp.Views.GroupMembersUI = bp.View.extend( { 472 className: 'group-members', 473 474 initialize: function() { 475 var groupMembers = new bp.Collections.groupMembers(); 476 477 // Set filters. 478 this.views.set( '#group-roles-filter', [ 479 new bp.Views.GroupsMembersLabel( { attributes: { for: 'group-members-role-filter' } } ), 480 new bp.Views.GroupRolesDropDown( { id: 'group-members-role-filter', collection: groupMembers } ) 481 ] ); 482 483 // Set Paginate links. 484 this.views.set( '#group-members-pagination', new bp.Views.GroupsMembersPagination( { collection: groupMembers } ) ); 485 486 // Set Group members list header and body. 487 this.views.set( '#group-members-list-table', [ 488 new bp.Views.GroupMembersListHeader(), 489 new bp.Views.GroupMembersListTable( { collection: groupMembers } ) 490 ] ); 491 } 492 } ); 493 494 // Inject the UI to manage Group Members into the DOM. 495 var manageGroupMembersUI = new bp.Views.GroupMembersUI( { el:'#group-manage-members-ui' } ).render(); 496 497 } )( window.wp || {}, window.bp || {}, jQuery );