Skip to:
Content

BuddyPress.org

Ticket #5423: invite-pagination.patch

File invite-pagination.patch, 16.3 KB (added by dcavins, 8 years ago)

Adds pagination pieces to invitation code

  • bp-groups/bp-groups-classes.php

    diff --git bp-groups/bp-groups-classes.php bp-groups/bp-groups-classes.php
    index 6106e46..6bfe32e 100644
    class BP_Groups_Group { 
    397397         * @return array IDs of users who have been invited to the group by the
    398398         *         user but have not yet accepted.
    399399         */
    400         public static function get_invites( $user_id, $group_id ) {
    401                 global $wpdb, $bp;
    402                 return $wpdb->get_col( $wpdb->prepare( "SELECT user_id FROM {$bp->groups->table_name_members} WHERE group_id = %d and is_confirmed = 0 AND inviter_id = %d", $group_id, $user_id ) );
     400        public static function get_invites( $user_id, $group_id, $per_page = null, $page = null ) {
     401                global $wpdb;
     402                $bp = buddypress();
     403
     404                // Add pagination piece, if necessary
     405                $pag_sql = ( !empty( $per_page ) && !empty( $page ) ) ? $wpdb->prepare( " LIMIT %d, %d", intval( ( $page - 1 ) * $per_page), intval( $per_page ) ) : '';
     406
     407                return $wpdb->get_col( $wpdb->prepare( "SELECT user_id FROM {$bp->groups->table_name_members} WHERE group_id = %d and is_confirmed = 0 AND inviter_id = %d{$pag_sql}", $group_id, $user_id ) );
     408        }
     409
     410        /**
     411         * Get total number of outstanding invites to a given group from a specified user.
     412         *
     413         * @param int $user_id ID of the inviting user.
     414         * @param int $group_id ID of the group.
     415         * @return int number of users who have been invited to the group by the
     416         *         user but have not yet accepted.
     417         */
     418        public static function get_invite_total( $user_id, $group_id ) {
     419                global $wpdb;
     420                $bp = buddypress();
     421                return $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(user_id) FROM {$bp->groups->table_name_members} WHERE group_id = %d and is_confirmed = 0 AND inviter_id = %d", $group_id, $user_id ) );
    403422        }
    404423
    405424        /**
  • bp-groups/bp-groups-functions.php

    diff --git bp-groups/bp-groups-functions.php bp-groups/bp-groups-functions.php
    index 251ae96..8740c89 100644
    function groups_send_invites( $user_id, $group_id ) { 
    796796        do_action( 'groups_send_invites', $group_id, $invited_users );
    797797}
    798798
    799 function groups_get_invites_for_group( $user_id, $group_id ) {
    800         return BP_Groups_Group::get_invites( $user_id, $group_id );
     799/* Get outstanding invites to a given group from a specified user.
     800 * @param int $user_id Member who sent the invitation
     801 * @param int $group_id Potential group
     802 * @param (optional) int $per_page Number of invitations to show per page
     803 * @param (optional) int $page_number Which page to show
     804 * @return array of user IDs with outstanding invitations
     805*/
     806function groups_get_invites_for_group( $user_id, $group_id, $per_page, $page_number ) {
     807        return BP_Groups_Group::get_invites( $user_id, $group_id, $per_page, $page_number );
     808}
     809
     810/* Get total number of outstanding invites to a given group from a specified user.
     811 * @param int $user_id Member who sent the invitation
     812 * @param int $group_id Potential group
     813 * @return int number of invitations (used for pagination)
     814*/
     815function groups_get_invite_total_for_group( $user_id, $group_id ) {
     816        return BP_Groups_Group::get_invite_total( $user_id, $group_id );
    801817}
    802818
    803819/**
  • bp-groups/bp-groups-template.php

    diff --git bp-groups/bp-groups-template.php bp-groups/bp-groups-template.php
    index fe6c837..a3ef190 100644
    class BP_Groups_Invite_Template { 
    30803080
    30813081        var $in_the_loop;
    30823082
    3083         var $pag_page;
    3084         var $pag_num;
    3085         var $pag_links;
     3083        var $pag_page; // Which page of invitations is being shown
     3084        var $pag_num; // Number of invites to show per page
     3085        var $pag_links; // The html to create the pagination links
    30863086        var $total_invite_count;
    30873087
    3088         function __construct( $user_id, $group_id ) {
    3089                 $this->invites      = groups_get_invites_for_group( $user_id, $group_id );
    3090                 $this->invite_count = count( $this->invites );
     3088        function __construct( $args = '' ) {
     3089
     3090                $defaults = array(
     3091                        'group_id' => false,
     3092                        'user_id'  => bp_loggedin_user_id(),
     3093                        'per_page'      => 10,
     3094                        'page'          => 1
     3095                );
     3096
     3097                $r = wp_parse_args( $args, $defaults );
     3098
     3099                extract( $r, EXTR_SKIP );
     3100
     3101                $this->pag_page                 = isset( $_REQUEST['invitepage'] ) ? intval( $_REQUEST['invitepage'] ) : $page;
     3102                $this->pag_num                  = $per_page;
     3103                $this->invites          = groups_get_invites_for_group( $user_id, $group_id, $this->pag_num, $this->pag_page  );
     3104                $this->invite_count     = count( $this->invites );
     3105                $this->total_invite_count = groups_get_invite_total_for_group( $user_id, $group_id );
     3106
     3107                $this->pag_links                = paginate_links( array(
     3108                        'base' => add_query_arg( 'invitepage', '%#%' ),
     3109                        'format' => '',
     3110                        'total' => ceil( $this->total_invite_count / $this->pag_num ),
     3111                        'current' => $this->pag_page,
     3112                        'prev_text' => '←',
     3113                        'next_text' => '→',
     3114                        'mid_size' => 1
     3115                ) );
    30913116        }
    30923117
    30933118        function has_invites() {
    class BP_Groups_Invite_Template { 
    31383163}
    31393164
    31403165function bp_group_has_invites( $args = '' ) {
    3141         global $bp, $invites_template, $group_id;
     3166        global $invites_template, $group_id;
     3167        $bp = buddypress();
    31423168
    31433169        $defaults = array(
    3144                 'group_id' => false,
    3145                 'user_id' => bp_loggedin_user_id()
     3170                'group_id'      => false,
     3171                'user_id'       => bp_loggedin_user_id(),
     3172                'per_page'      => 10,
     3173                'page'          => 1
    31463174        );
    31473175
    31483176        $r = wp_parse_args( $args, $defaults );
    function bp_group_has_invites( $args = '' ) { 
    31603188        if ( !$group_id )
    31613189                return false;
    31623190
    3163         $invites_template = new BP_Groups_Invite_Template( $user_id, $group_id );
     3191        $args = array(
     3192                'group_id'      => $group_id,
     3193                'user_id'       => $user_id,
     3194                'per_page'      => $per_page,
     3195                'page'          => $page
     3196        );
     3197
     3198        $invites_template = new BP_Groups_Invite_Template( $args );
     3199
    31643200        return apply_filters( 'bp_group_has_invites', $invites_template->has_invites(), $invites_template );
    31653201}
    31663202
    function bp_group_invite_user_remove_invite_url() { 
    32203256
    32213257                return wp_nonce_url( site_url( bp_get_groups_slug() . '/' . $invites_template->invite->group_id . '/invites/remove/' . $invites_template->invite->user->id ), 'groups_invite_uninvite_user' );
    32223258        }
     3259function bp_group_invite_pagination_links() {
     3260        echo bp_get_group_invite_pagination_links();
     3261}
     3262        function bp_get_group_invite_pagination_links() {
     3263                global $invites_template;
     3264
     3265                return apply_filters( 'bp_get_group_invite_pagination_links', $invites_template->pag_links );
     3266        }
     3267
     3268function bp_group_invite_pagination_count() {
     3269        echo bp_get_group_invite_pagination_count();
     3270}
     3271        function bp_get_group_invite_pagination_count() {
     3272                global $invites_template;
     3273
     3274                $start_num = intval( ( $invites_template->pag_page - 1 ) * $invites_template->pag_num ) + 1;
     3275                $from_num  = bp_core_number_format( $start_num );
     3276                $to_num    = bp_core_number_format( ( $start_num + ( $invites_template->pag_num - 1 ) > $invites_template->total_invite_count ) ? $invites_template->total_invite_count : $start_num + ( $invites_template->pag_num - 1 ) );
     3277                $total     = bp_core_number_format( $invites_template->total_invite_count );
     3278
     3279                return apply_filters( 'bp_get_groups_pagination_count', sprintf( _n( 'Viewing invitation %1$s to %2$s (of %3$s invitation)', 'Viewing invitation %1$s to %2$s (of %3$s invitations)', $total, 'buddypress' ), $from_num, $to_num, $total ), $from_num, $to_num, $total );
     3280        }
    32233281
    32243282/***
    32253283 * Groups RSS Feed Template Tags
  • bp-templates/bp-legacy/buddypress-functions.php

    diff --git bp-templates/bp-legacy/buddypress-functions.php bp-templates/bp-legacy/buddypress-functions.php
    index d8963f5..509a6e2 100644
    class BP_Legacy extends BP_Theme_Compat { 
    139139                        'groups_filter'   => 'bp_legacy_theme_object_template_loader',
    140140                        'members_filter'  => 'bp_legacy_theme_object_template_loader',
    141141                        'messages_filter' => 'bp_legacy_theme_messages_template_loader',
     142            'invite_filter'   => 'bp_legacy_theme_invite_template_loader',
    142143
    143144                        // Friends
    144145                        'accept_friendship' => 'bp_legacy_theme_ajax_accept_friendship',
    function bp_legacy_theme_messages_template_loader() { 
    600601        exit();
    601602}
    602603
     604/**
     605 * Load group invitations loop to handle pagination requests sent via AJAX
     606 *
     607 * @return string Prints template loop for a group's Invitations screen
     608 * @since BuddyPress (2.0)
     609 */
     610function bp_legacy_theme_invite_template_loader() {
     611        bp_get_template_part( 'groups/single/invites-loop' );
     612        exit();
     613}
     614
    603615/**
    604616 * Load the activity loop template when activity is requested via AJAX,
    605617 *
  • new file p-templates/bp-legacy/buddypress/groups/single/invites-loop.php

    diff --git bp-templates/bp-legacy/buddypress/groups/single/invites-loop.php bp-templates/bp-legacy/buddypress/groups/single/invites-loop.php
    new file mode 100644
    index 0000000..fd4259f
    - +  
     1<div class="left-menu">
     2
     3        <div id="invite-list">
     4                <ul>
     5                        <?php bp_new_group_invite_friend_list(); ?>
     6                </ul>
     7
     8                <?php wp_nonce_field( 'groups_invite_uninvite_user', '_wpnonce_invite_uninvite_user' ); ?>
     9        </div>
     10
     11</div><!-- .left-menu -->
     12
     13<div class="main-column">
     14
     15        <div id="message" class="info">
     16                <p><?php _e('Select people to invite from your friends list.', 'buddypress' ); ?></p>
     17        </div>
     18
     19        <?php do_action( 'bp_before_group_send_invites_list' ); ?>
     20
     21        <?php if ( bp_group_has_invites( bp_ajax_querystring( 'invite' ) ) ) : ?>
     22
     23        <div id="pag-top" class="pagination">
     24
     25                <div class="pag-count" id="group-invite-count-top">
     26
     27                        <?php bp_group_invite_pagination_count(); ?>
     28
     29                </div>
     30
     31                <div class="pagination-links" id="group-invite-pag-top">
     32
     33                        <?php bp_group_invite_pagination_links(); ?>
     34
     35                </div>
     36
     37        </div>
     38
     39        <?php /* The ID 'friend-list' is important for AJAX support. */ ?>
     40        <ul id="friend-list" class="item-list">
     41
     42                <?php while ( bp_group_invites() ) : bp_group_the_invite(); ?>
     43
     44                        <li id="<?php bp_group_invite_item_id(); ?>">
     45                                <?php bp_group_invite_user_avatar(); ?>
     46
     47                                <h4><?php bp_group_invite_user_link(); ?></h4>
     48                                <span class="activity"><?php bp_group_invite_user_last_active(); ?></span>
     49
     50                                <?php do_action( 'bp_group_send_invites_item' ); ?>
     51
     52                                <div class="action">
     53                                        <a class="button remove" href="<?php bp_group_invite_user_remove_invite_url(); ?>" id="<?php bp_group_invite_item_id(); ?>"><?php _e( 'Remove Invite', 'buddypress' ); ?></a>
     54
     55                                        <?php do_action( 'bp_group_send_invites_item_action' ); ?>
     56                                </div>
     57                        </li>
     58
     59                <?php endwhile; ?>
     60
     61        </ul><!-- #friend-list -->
     62
     63        <div id="pag-bottom" class="pagination">
     64
     65                <div class="pag-count" id="group-invite-count-bottom">
     66
     67                        <?php bp_group_invite_pagination_count(); ?>
     68
     69                </div>
     70
     71                <div class="pagination-links" id="group-invite-pag-bottom">
     72
     73                        <?php bp_group_invite_pagination_links(); ?>
     74
     75                </div>
     76
     77        </div>
     78
     79        <?php endif; ?>
     80
     81        <?php do_action( 'bp_after_group_send_invites_list' ); ?>       
     82
     83</div><!-- .main-column -->
     84
     85<div class="clear"></div>
     86
     87<div class="submit">
     88        <input type="submit" name="submit" id="submit" value="<?php esc_attr_e( 'Send Invites', 'buddypress' ); ?>" />
     89</div>
     90
     91<?php wp_nonce_field( 'groups_send_invites', '_wpnonce_send_invites' ); ?>
     92
     93<?php /* This is important, don't forget it */ ?>
     94<input type="hidden" name="group_id" id="group_id" value="<?php bp_group_id(); ?>" />
     95 No newline at end of file
  • bp-templates/bp-legacy/buddypress/groups/single/send-invites.php

    diff --git bp-templates/bp-legacy/buddypress/groups/single/send-invites.php bp-templates/bp-legacy/buddypress/groups/single/send-invites.php
    index c2f0500..8d93ef5 100644
     
    22
    33<?php if ( bp_get_total_friend_count( bp_loggedin_user_id() ) ) : ?>
    44
     5        <?php /* The ID 'send-invite-form' is important for AJAX support. */ ?>
    56        <form action="<?php bp_group_send_invite_form_action(); ?>" method="post" id="send-invite-form" class="standard-form" role="main">
    67
    7                 <div class="left-menu">
     8                <div class="invite"> <!-- Used for AJAX pagination -->
    89
    9                         <div id="invite-list">
    10                                 <ul>
    11                                         <?php bp_new_group_invite_friend_list(); ?>
    12                                 </ul>
     10                        <?php bp_get_template_part( 'groups/single/invites-loop'  ); ?>
    1311
    14                                 <?php wp_nonce_field( 'groups_invite_uninvite_user', '_wpnonce_invite_uninvite_user' ); ?>
    15                         </div>
    16 
    17                 </div><!-- .left-menu -->
    18 
    19                 <div class="main-column">
    20 
    21                         <div id="message" class="info">
    22                                 <p><?php _e('Select people to invite from your friends list.', 'buddypress' ); ?></p>
    23                         </div>
    24 
    25                         <?php do_action( 'bp_before_group_send_invites_list' ); ?>
    26 
    27                         <?php /* The ID 'friend-list' is important for AJAX support. */ ?>
    28                         <ul id="friend-list" class="item-list">
    29                         <?php if ( bp_group_has_invites() ) : ?>
    30 
    31                                 <?php while ( bp_group_invites() ) : bp_group_the_invite(); ?>
    32 
    33                                         <li id="<?php bp_group_invite_item_id(); ?>">
    34                                                 <?php bp_group_invite_user_avatar(); ?>
    35 
    36                                                 <h4><?php bp_group_invite_user_link(); ?></h4>
    37                                                 <span class="activity"><?php bp_group_invite_user_last_active(); ?></span>
    38 
    39                                                 <?php do_action( 'bp_group_send_invites_item' ); ?>
    40 
    41                                                 <div class="action">
    42                                                         <a class="button remove" href="<?php bp_group_invite_user_remove_invite_url(); ?>" id="<?php bp_group_invite_item_id(); ?>"><?php _e( 'Remove Invite', 'buddypress' ); ?></a>
    43 
    44                                                         <?php do_action( 'bp_group_send_invites_item_action' ); ?>
    45                                                 </div>
    46                                         </li>
    47 
    48                                 <?php endwhile; ?>
    49 
    50                         <?php endif; ?>
    51                         </ul><!-- #friend-list -->
    52 
    53                         <?php do_action( 'bp_after_group_send_invites_list' ); ?>
    54 
    55                 </div><!-- .main-column -->
    56 
    57                 <div class="clear"></div>
    58 
    59                 <div class="submit">
    60                         <input type="submit" name="submit" id="submit" value="<?php esc_attr_e( 'Send Invites', 'buddypress' ); ?>" />
    61                 </div>
    62 
    63                 <?php wp_nonce_field( 'groups_send_invites', '_wpnonce_send_invites' ); ?>
    64 
    65                 <?php /* This is important, don't forget it */ ?>
    66                 <input type="hidden" name="group_id" id="group_id" value="<?php bp_group_id(); ?>" />
     12                </div> <!-- .invite -->
    6713
    6814        </form><!-- #send-invite-form -->
    6915
     
    7521
    7622<?php endif; ?>
    7723
    78 <?php do_action( 'bp_after_group_send_invites_content' ); ?>
     24<?php do_action( 'bp_after_group_send_invites_content' ); ?>
     25 No newline at end of file
  • bp-templates/bp-legacy/css/buddypress.css

    diff --git bp-templates/bp-legacy/css/buddypress.css bp-templates/bp-legacy/css/buddypress.css
    index 6c13c70..befd22c 100644
    a.bp-title-button { 
    764764
    765765#buddypress form.standard-form .main-column ul#friend-list {
    766766        clear:none;
     767        float: left;
    767768}
    768769
    769770#buddypress form.standard-form .main-column ul#friend-list h4 {
  • bp-templates/bp-legacy/js/buddypress.js

    diff --git bp-templates/bp-legacy/js/buddypress.js bp-templates/bp-legacy/js/buddypress.js
    index 3afc762..5ebbba9 100644
    jq(document).ready( function() { 
    901901        /** Invite Friends Interface ****************************************/
    902902
    903903        /* Select a user from the list of friends and add them to the invite list */
    904         jq("#invite-list input").on( 'click', function() {
     904        jq("#send-invite-form").on( 'click', "#invite-list input", function() {
    905905                jq('.ajax-loader').toggle();
     906                // Dim the form until the response arrives
     907                jq(this).parents('ul').find('input').prop('disabled', true);
    906908
    907909                var friend_id = jq(this).val();
    908910
    jq(document).ready( function() { 
    928930
    929931                        jq('.ajax-loader').toggle();
    930932
    931                         if ( friend_action == 'invite' ) {
    932                                 jq('#friend-list').append(response);
    933                         } else if ( friend_action == 'uninvite' ) {
    934                                 jq('#friend-list li#uid-' + friend_id).remove();
    935                         }
    936 
    937933                        jq('.item-list-tabs li.selected').removeClass('loading');
     934                })
     935                .done(function() {
     936                        // Refresh entire list (keeps pagination and totals up to date)
     937                        bp_filter_request( 'invite', 'bp-invite-filter', 'bp-invite-scope', 'div.invite', false, 1, '', '', '');
    938938                });
    939939        });
    940940
    941941        /* Remove a user from the list of users to invite to a group */
    942         jq("#friend-list").on('click', 'li a.remove', function() {
     942        jq("#send-invite-form").on('click', '#friend-list a.remove', function() {
    943943                jq('.ajax-loader').toggle();
    944944
    945945                var friend_id = jq(this).attr('id');
    jq(document).ready( function() { 
    957957                function(response)
    958958                {
    959959                        jq('.ajax-loader').toggle();
    960                         jq('#friend-list #uid-' + friend_id).remove();
    961                         jq('#invite-list #f-' + friend_id).prop('checked', false);
     960                       
     961                })
     962                .done(function() {
     963                        // Refresh entire list (keeps pagination and totals up to date and invite checkbox list synchronized)
     964                        bp_filter_request( 'invite', 'bp-invite-filter', 'bp-invite-scope', 'div.invite', false, 1, '', '', '');
    962965                });
    963966
    964967                return false;