<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[BuddyPress][7158] trunk/bp-groups: Introduces pagination for member types on Group Admin > Manage Members</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://buddypress.trac.wordpress.org/changeset/7158">7158</a></dd>
<dt>Author</dt> <dd>boonebgorges</dd>
<dt>Date</dt> <dd>2013-06-05 00:57:43 +0000 (Wed, 05 Jun 2013)</dd>
</dl>

<h3>Log Message</h3>
<pre>Introduces pagination for member types on Group Admin > Manage Members

When the Group Admin Dashboard panels were introduced in BuddyPress 1.7, the
Manage Member section was missing pagination. As a result, managing membership
in a group with more than 20 members could result in odd bugs, ranging from not
being able to see/modify all the members in your group, to receiving erroneous
error messages when attempting to modify user roles. Adding pagination for each
member type ensures that all group members can be viewed and modified by the
group administrator.

See <a href="http://buddypress.trac.wordpress.org/ticket/4977">#4977</a></pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkbpgroupsadmincssadmincss">trunk/bp-groups/admin/css/admin.css</a></li>
<li><a href="#trunkbpgroupsbpgroupsadminphp">trunk/bp-groups/bp-groups-admin.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkbpgroupsadmincssadmincss"></a>
<div class="modfile"><h4>Modified: trunk/bp-groups/admin/css/admin.css (7157 => 7158)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/bp-groups/admin/css/admin.css      2013-06-04 21:57:18 UTC (rev 7157)
+++ trunk/bp-groups/admin/css/admin.css 2013-06-05 00:57:43 UTC (rev 7158)
</span><span class="lines">@@ -23,7 +23,35 @@
</span><span class="cx"> .bp-groups-settings-section {
</span><span class="cx">  margin-bottom: 15px;
</span><span class="cx"> }
</span><ins>+.bp-groups-member-type {
+       position: relative;
+       padding-bottom: 1.7em;
+}
+.bp-groups-member-type > h4 {
+       margin-bottom: .5em;
+}
</ins><span class="cx"> ul.bp-group-delete-list {
</span><span class="cx">  list-style-type: disc;
</span><span class="cx">  margin: 4px 26px;
</span><span class="cx"> }
</span><ins>+.bp-group-admin-pagination {
+       position: absolute;
+       text-align: right;
+       width: 100%;
+}
+.bp-group-admin-pagination.table-top {
+       top: 0;
+}
+.bp-group-admin-pagination.table-bottom {
+       bottom: 0;
+}
+.bp-group-admin-pagination-viewing {
+       font-family: Georgia, "Times New Roman", "Bitstream Charter", Times, serif;
+       color: #777;
+       font-size: 12px;
+       font-style: italic;
+}
+.bp-group-admin-pagination-links {
+       white-space: nowrap;
+       padding-left: 15px;
+}
</ins></span></pre></div>
<a id="trunkbpgroupsbpgroupsadminphp"></a>
<div class="modfile"><h4>Modified: trunk/bp-groups/bp-groups-admin.php (7157 => 7158)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/bp-groups/bp-groups-admin.php      2013-06-04 21:57:18 UTC (rev 7157)
+++ trunk/bp-groups/bp-groups-admin.php 2013-06-05 00:57:43 UTC (rev 7158)
</span><span class="lines">@@ -713,23 +713,34 @@
</span><span class="cx">  // Pull up a list of group members, so we can separate out the types
</span><span class="cx">  // We'll also keep track of group members here to place them into a
</span><span class="cx">  // javascript variable, which will help with group member autocomplete
</span><del>-       $member_ids = array();
-       $members    = array(
</del><ins>+        $members = array(
</ins><span class="cx">           'admin'  => array(),
</span><span class="cx">          'mod'    => array(),
</span><span class="cx">          'member' => array(),
</span><span class="cx">          'banned' => array(),
</span><span class="cx">  );
</span><span class="cx"> 
</span><ins>+       $pagination = array(
+               'admin'  => array(),
+               'mod'    => array(),
+               'member' => array(),
+               'banned' => array(),
+       );
+
</ins><span class="cx">   foreach ( $members as $type => &$member_type_users ) {
</span><ins>+               $page_qs_key = $type . '_page';
+               $current_type_page = isset( $_GET[ $page_qs_key ] ) ? absint( $_GET[ $page_qs_key ] ) : 1;
</ins><span class="cx">           $member_type_query = new BP_Group_Member_Query( array(
</span><span class="cx">                  'group_id'   => $item->id,
</span><span class="cx">                  'group_role' => array( $type ),
</span><span class="cx">                  'type'       => 'alphabetical',
</span><span class="cx">                  'per_page'   => 10,
</span><ins>+                       'page'       => $current_type_page,
</ins><span class="cx">           ) );
</span><span class="cx"> 
</span><span class="cx">          $member_type_users = $member_type_query->results;
</span><ins>+
+               $pagination[ $type ] = bp_groups_admin_create_pagination_links( $member_type_query, $type );
</ins><span class="cx">   }
</span><span class="cx"> 
</span><span class="cx">  // Echo out the javascript variable
</span><span class="lines">@@ -749,6 +760,10 @@
</span><span class="cx">                          endswitch; ?>
</span><span class="cx">                  </h4>
</span><span class="cx"> 
</span><ins>+                       <div class="bp-group-admin-pagination table-top">
+                               <?php echo $pagination[ $member_type ] ?>
+                       </div>
+
</ins><span class="cx">           <?php if ( !empty( $type_users ) ) : ?>
</span><span class="cx"> 
</span><span class="cx">                  <table class="widefat bp-group-members">
</span><span class="lines">@@ -809,6 +824,10 @@
</span><span class="cx">                          </tbody>
</span><span class="cx">                  </table>
</span><span class="cx"> 
</span><ins>+                       <div class="bp-group-admin-pagination table-bottom">
+                               <?php echo $pagination[ $member_type ] ?>
+                       </div>
+
</ins><span class="cx">           <?php else : ?>
</span><span class="cx"> 
</span><span class="cx">                  <p class="bp-groups-no-members description"><?php _e( 'No members of this type', 'buddypress' ) ?></p>
</span><span class="lines">@@ -850,6 +869,63 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> /**
</span><ins>+ * Create pagination links out of a BP_Group_Member_Query
+ *
+ * This function is intended to create pagination links for use under the
+ * Manage Members section of the Groups Admin Dashboard pages. It is a stopgap
+ * measure until a more general pagination solution is in place for BuddyPress.
+ * Plugin authors should not use this function, as it is likely to be
+ * deprecated soon.
+ *
+ * @since BuddyPress (1.8)
+ * @param object $query A BP_Group_Member_Query object
+ * @param string $member_type member|mod|admin|banned
+ */
+function bp_groups_admin_create_pagination_links( BP_Group_Member_Query $query, $member_type ) {
+       $pagination = '';
+
+       if ( ! in_array( $member_type, array( 'admin', 'mod', 'member', 'banned' ) ) ) {
+               return $pagination;
+       }
+
+       // The key used to paginate this member type in the $_GET global
+       $qs_key = $member_type . '_page';
+       $url_base = remove_query_arg( array( $qs_key, 'updated', 'success_modified' ), $_SERVER['REQUEST_URI'] );
+
+       $page     = isset( $_GET[ $qs_key ] ) ? absint( $_GET[ $qs_key ] ) : 1;
+       $per_page = 10; // @todo Make this customizable?
+
+       // Don't show anything if there's no pagination
+       if ( 1 === $page && $query->total_users <= $per_page ) {
+               return $pagination;
+       }
+
+       $current_page_start = ( ( $page - 1 ) * $per_page ) + 1;
+       $current_page_end   = $page * $per_page > intval( $query->total_users ) ? $query->total_users : $page * $per_page;
+
+       $pag_links = paginate_links( array(
+               'base'      => add_query_arg( $qs_key, '%#%', $url_base ),
+               'format'    => '',
+               'prev_text' => __( '&laquo;' ),
+               'next_text' => __( '&raquo;' ),
+               'total'     => ceil( $query->total_users / $per_page ),
+               'current'   => $page,
+       ) );
+
+       $viewing_text = sprintf(
+               __( 'Viewing %1$s - %2$s of %3$s', 'buddypress' ),
+               number_format_i18n( $current_page_start ),
+               number_format_i18n( $current_page_end ),
+               sprintf( _n( '%s member', '%s members', $query->total_users, 'buddypress' ), $query->total_users )
+       );
+
+       $pagination .= '<span class="bp-group-admin-pagination-viewing">' . $viewing_text . '</span>';
+       $pagination .= '<span class="bp-group-admin-pagination-links">' . $pag_links . '</span>';
+
+       return $pagination;
+}
+
+/**
</ins><span class="cx">  * Match a set of user ids up to a set of usernames
</span><span class="cx">  *
</span><span class="cx">  * @since BuddyPress (1.7)
</span></span></pre>
</div>
</div>

</body>
</html>