Skip to:
Content

BuddyPress.org

Changeset 7442


Ignore:
Timestamp:
10/17/2013 07:00:46 PM (13 years ago)
Author:
boonebgorges
Message:

Improve UX flow around overlapping group invites and requests

This changeset introduces a number of improvements to the flow surrounding
invitations and membership requests to private groups:

  • When a user has previously requested membership in a group, add a note to that effect when the user is being invited to the group via the Send Invites interface.
  • When a user has previously requested membership in a group, automatically accept that invitation and add the user to the group when an invitation is sent by an existing group member.
  • When a user has previously been invited to a group, buttons in the group directory and in the group header should read Accept Invitation instead of Request Membership

The end result is a more logical user experience with regard to joining private
groups.

Fixes #5032

Props Mike_Cowobo

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/bp-groups/bp-groups-classes.php

    r7441 r7442  
    3232         */
    3333        public $is_member;
     34
     35        /**
     36         * Does the current user have an outstanding invitation to this group?
     37         *
     38         * @since BuddyPress (1.9.0)
     39         * @var bool
     40         */
     41        public $is_invited;
     42
     43        /**
     44         * Does the current user have a pending membership request to this group?
     45         *
     46         * @since BuddyPress (1.9.0)
     47         * @var bool
     48         */
     49        public $is_pending;
    3450
    3551        /**
    … …  
    7389                        $this->total_member_count = groups_get_groupmeta( $this->id, 'total_member_count' );
    7490                        $this->is_member          = BP_Groups_Member::check_is_member( bp_loggedin_user_id(), $this->id );
     91                        $this->is_invited         = BP_Groups_Member::check_has_invite( bp_loggedin_user_id(), $this->id );
     92                        $this->is_pending         = BP_Groups_Member::check_for_membership_request( bp_loggedin_user_id(), $this->id );
    7593
    7694                        // If this is a private or hidden group, does the current user have access?
    … …  
    828846                $group_ids = implode( ',', wp_parse_id_list( $group_ids ) );
    829847
    830                 // Fetch the logged in users status within each group
    831                 $user_status = $wpdb->get_col( $wpdb->prepare( "SELECT group_id FROM {$bp->groups->table_name_members} WHERE user_id = %d AND group_id IN ( {$group_ids} ) AND is_confirmed = 1 AND is_banned = 0", bp_loggedin_user_id() ) );
     848                // Fetch the logged-in user's status within each group
     849                $user_status = $wpdb->get_results( $wpdb->prepare( "SELECT group_id, is_confirmed, invite_sent FROM {$bp->groups->table_name_members} WHERE user_id = %d AND group_id IN ( {$group_ids} ) AND is_banned = 0", bp_loggedin_user_id() ) );
     850
    832851                for ( $i = 0, $count = count( $paged_groups ); $i < $count; ++$i ) {
    833852                        $paged_groups[$i]->is_member = false;
    834853
    835                         foreach ( (array) $user_status as $group_id ) {
    836                                 if ( $group_id == $paged_groups[$i]->id ) {
    837                                         $paged_groups[$i]->is_member = true;
     854                        foreach ( (array) $user_status as $group ) {
     855                                $is_member = $is_invited = $is_pending = false;
     856                                if ( $group->group_id == $paged_groups[ $i ]->id ) {
     857                                        // is_confirmed means the user is a member
     858                                        if ( $group->is_confirmed ) {
     859                                                $is_member = true;
     860
     861                                        // invite_sent means the user has been invited
     862                                        } else if ( $group->invite_sent ) {
     863                                                $is_invited = true;
     864
     865                                        // User has sent request, but has not been confirmed
     866                                        } else {
     867                                                $is_pending = true;
     868                                        }
    838869                                }
     870
     871                                $paged_groups[ $i ]->is_member = $is_member;
     872                                $paged_groups[ $i ]->is_invited = $is_invited;
     873                                $paged_groups[ $i ]->is_pending = $is_pending;
    839874                        }
    840875                }
  • trunk/bp-groups/bp-groups-functions.php

    r7338 r7442  
    655655                return false;
    656656
    657         if ( !groups_is_user_member( $user_id, $group_id ) && !groups_check_user_has_invite( $user_id, $group_id, 'all' ) ) {
     657        // if the user has already requested membership, accept the request
     658        if ( $membership_id = groups_check_for_membership_request( $user_id, $group_id ) ) {
     659                groups_accept_membership_request( $membership_id, $user_id, $group_id );
     660
     661        // Otherwise, create a new invitation
     662        } else if ( ! groups_is_user_member( $user_id, $group_id ) && ! groups_check_user_has_invite( $user_id, $group_id, 'all' ) ) {
    658663                $invite                = new BP_Groups_Member;
    659664                $invite->group_id      = $group_id;
    … …  
    872877        if ( groups_is_user_member( $requesting_user_id, $group_id ) || groups_is_user_banned( $requesting_user_id, $group_id ) )
    873878                return false;
     879
     880        // Check if the user is already invited - if so, simply accept invite
     881        if ( groups_check_user_has_invite( $requesting_user_id, $group_id ) ) {
     882                groups_accept_invite( $requesting_user_id, $group_id );
     883                return true;
     884        }
    874885
    875886        $requesting_user                = new BP_Groups_Member;
  • trunk/bp-groups/bp-groups-loader.php

    r7347 r7442  
    413413                        );
    414414
    415                         // If this is a private group, and the user is not a member, show a "Request Membership" nav item.
     415                        // If this is a private group, and the user is not a
     416                        // member and does not have an outstanding invitation,
     417                        // show a "Request Membership" nav item.
    416418                        if ( is_user_logged_in() &&
    417                                  !bp_current_user_can( 'bp_moderate' ) &&
    418                                  !$this->current_group->is_user_member &&
    419                                  !groups_check_for_membership_request( bp_loggedin_user_id(), $this->current_group->id ) &&
    420                                  $this->current_group->status == 'private'
     419                                 ! bp_current_user_can( 'bp_moderate' ) &&
     420                                 ! $this->current_group->is_user_member &&
     421                                 ! groups_check_for_membership_request( bp_loggedin_user_id(), $this->current_group->id ) &&
     422                                 $this->current_group->status == 'private' &&
     423                                 ! groups_check_user_has_invite( bp_loggedin_user_id(), $this->current_group->id )
    421424                                ) {
     425
    422426                                $sub_nav[] = array(
    423427                                        'name'               => __( 'Request Membership', 'buddypress' ),
  • trunk/bp-groups/bp-groups-screens.php

    r7440 r7442  
    479479        if ( 'private' != $bp->groups->current_group->status )
    480480                return false;
     481
     482        // If the user is already invited, accept invitation
     483        if ( groups_check_user_has_invite( bp_loggedin_user_id(), $bp->groups->current_group->id ) ) {
     484                if ( groups_accept_invite( bp_loggedin_user_id(), $bp->groups->current_group->id ) )
     485                        bp_core_add_message( __( 'Group invite accepted', 'buddypress' ) );
     486                else
     487                        bp_core_add_message( __( 'There was an error accepting the group invitation, please try again.', 'buddypress' ), 'error' );
     488                bp_core_redirect( bp_get_group_permalink( $bp->groups->current_group ) );
     489        }
    481490
    482491        // If the user has submitted a request, send it.
  • trunk/bp-groups/bp-groups-template.php

    r7439 r7442  
    17811781                                case 'private' :
    17821782
    1783                                         // Member has not requested membership yet
    1784                                         if ( !bp_group_has_requested_membership( $group ) ) {
     1783                                        // Member has outstanding invitation -
     1784                                        // show an "Accept Invitation" button
     1785                                        if ( $group->is_invited ) {
     1786                                                $button = array(
     1787                                                        'id'                => 'accept_invite',
     1788                                                        'component'         => 'groups',
     1789                                                        'must_be_logged_in' => true,
     1790                                                        'block_self'        => false,
     1791                                                        'wrapper_class'     => 'group-button ' . $group->status,
     1792                                                        'wrapper_id'        => 'groupbutton-' . $group->id,
     1793                                                        'link_href'         => add_query_arg( 'redirect_to', bp_get_group_permalink( $group ), bp_get_group_accept_invite_link( $group ) ),
     1794                                                        'link_text'         => __( 'Accept Invitation', 'buddypress' ),
     1795                                                        'link_title'        => __( 'Accept Invitation', 'buddypress' ),
     1796                                                        'link_class'        => 'group-button accept-invite',
     1797                                                );
     1798
     1799                                        // Member has requested membership but request is pending -
     1800                                        // show a "Request Sent" button
     1801                                        } elseif ( $group->is_pending ) {
     1802                                                $button = array(
     1803                                                        'id'                => 'membership_requested',
     1804                                                        'component'         => 'groups',
     1805                                                        'must_be_logged_in' => true,
     1806                                                        'block_self'        => false,
     1807                                                        'wrapper_class'     => 'group-button pending ' . $group->status,
     1808                                                        'wrapper_id'        => 'groupbutton-' . $group->id,
     1809                                                        'link_href'         => bp_get_group_permalink( $group ),
     1810                                                        'link_text'         => __( 'Request Sent', 'buddypress' ),
     1811                                                        'link_title'        => __( 'Request Sent', 'buddypress' ),
     1812                                                        'link_class'        => 'group-button pending membership-requested',
     1813                                                );
     1814
     1815                                        // Member has not requested membership yet -
     1816                                        // show a "Request Membership" button
     1817                                        } else {
    17851818                                                $button = array(
    17861819                                                        'id'                => 'request_membership',
    … …  
    17941827                                                        'link_title'        => __( 'Request Membership', 'buddypress' ),
    17951828                                                        'link_class'        => 'group-button request-membership',
    1796                                                 );
    1797 
    1798                                         // Member has requested membership already
    1799                                         } else {
    1800                                                 $button = array(
    1801                                                         'id'                => 'membership_requested',
    1802                                                         'component'         => 'groups',
    1803                                                         'must_be_logged_in' => true,
    1804                                                         'block_self'        => false,
    1805                                                         'wrapper_class'     => 'group-button pending ' . $group->status,
    1806                                                         'wrapper_id'        => 'groupbutton-' . $group->id,
    1807                                                         'link_href'         => bp_get_group_permalink( $group ),
    1808                                                         'link_text'         => __( 'Request Sent', 'buddypress' ),
    1809                                                         'link_title'        => __( 'Request Sent', 'buddypress' ),
    1810                                                         'link_class'        => 'group-button pending membership-requested',
    18111829                                                );
    18121830                                        }
  • trunk/bp-templates/bp-legacy/buddypress-functions.php

    r7430 r7442  
    907907                return;
    908908
     909        $group_id = (int) $_POST['group_id'];
     910        $friend_id = (int) $_POST['friend_id'];
     911
    909912        if ( 'invite' == $_POST['friend_action'] ) {
    910                 if ( ! groups_invite_user( array( 'user_id' => $_POST['friend_id'], 'group_id' => $_POST['group_id'] ) ) )
     913                $group = groups_get_group( $group_id );
     914
     915                // Users who have previously requested membership do not need
     916                // another invitation created for them
     917                if ( BP_Groups_Member::check_for_membership_request( $friend_id, $group_id ) ) {
     918                        $user_status = 'is_pending';
     919
     920                // Create the user invitation
     921                } else if ( groups_invite_user( array( 'user_id' => $friend_id, 'group_id' => $group_id ) ) ) {
     922                        $user_status = 'is_invited';
     923
     924                // Miscellaneous failure
     925                } else {
    911926                        return;
    912 
    913                 $user = new BP_Core_User( $_POST['friend_id'] );
     927                }
     928
     929                $user = new BP_Core_User( $friend_id );
    914930
    915931                echo '<li id="uid-' . $user->id . '">';
    … …  
    920936                                <a class="button remove" href="' . wp_nonce_url( bp_loggedin_user_domain() . bp_get_groups_slug() . '/' . $_POST['group_id'] . '/invites/remove/' . $user->id, 'groups_invite_uninvite_user' ) . '" id="uid-' . esc_attr( $user->id ) . '">' . __( 'Remove Invite', 'buddypress' ) . '</a>
    921937                          </div>';
     938
     939                if ( 'is_pending' == $user_status ) {
     940                        echo '<p class="description">' . sprintf( __( '%s has previously requested to join this group. Sending an invitation will automatically add the member to the group.', 'buddypress' ), $user->user_link ) . '</p>';
     941                }
     942
    922943                echo '</li>';
    923944                exit;
    924945
    925946        } elseif ( 'uninvite' == $_POST['friend_action'] ) {
    926                 if ( ! groups_uninvite_user( $_POST['friend_id'], $_POST['group_id'] ) )
     947                // Users who have previously requested membership should not
     948                // have their requests deleted on the "uninvite" action
     949                if ( BP_Groups_Member::check_for_membership_request( $friend_id, $group_id ) ) {
    927950                        return;
     951                }
     952
     953                // Remove the unsent invitation
     954                if ( ! groups_uninvite_user( $friend_id, $group_id ) ) {
     955                        return;
     956                }
    928957
    929958                exit;
    … …  
    10561085
    10571086                } elseif ( 'private' == $group->status ) {
    1058                         check_ajax_referer( 'groups_request_membership' );
    1059 
    1060                         if ( ! groups_send_membership_request( bp_loggedin_user_id(), $group->id ) ) {
    1061                                 _e( 'Error requesting membership', 'buddypress' );
     1087
     1088                        // If the user has already been invited, then this is
     1089                        // an Accept Invitation button
     1090                        if ( groups_check_user_has_invite( bp_loggedin_user_id(), $group->id ) ) {
     1091                                check_ajax_referer( 'groups_accept_invite' );
     1092
     1093                                if ( ! groups_accept_invite( bp_loggedin_user_id(), $group->id ) ) {
     1094                                        _e( 'Error requesting membership', 'buddypress' );
     1095                                } else {
     1096                                        echo '<a id="group-' . esc_attr( $group->id ) . '" class="leave-group" rel="leave" title="' . __( 'Leave Group', 'buddypress' ) . '" href="' . wp_nonce_url( bp_get_group_permalink( $group ) . 'leave-group', 'groups_leave_group' ) . '">' . __( 'Leave Group', 'buddypress' ) . '</a>';
     1097                                }
     1098
     1099                        // Otherwise, it's a Request Membership button
    10621100                        } else {
    1063                                 echo '<a id="group-' . esc_attr( $group->id ) . '" class="membership-requested" rel="membership-requested" title="' . __( 'Membership Requested', 'buddypress' ) . '" href="' . bp_get_group_permalink( $group ) . '">' . __( 'Membership Requested', 'buddypress' ) . '</a>';
     1101                                check_ajax_referer( 'groups_request_membership' );
     1102
     1103                                if ( ! groups_send_membership_request( bp_loggedin_user_id(), $group->id ) ) {
     1104                                        _e( 'Error requesting membership', 'buddypress' );
     1105                                } else {
     1106                                        echo '<a id="group-' . esc_attr( $group->id ) . '" class="membership-requested" rel="membership-requested" title="' . __( 'Membership Requested', 'buddypress' ) . '" href="' . bp_get_group_permalink( $group ) . '">' . __( 'Membership Requested', 'buddypress' ) . '</a>';
     1107                                }
    10641108                        }
    10651109                }
  • trunk/bp-themes/bp-default/_inc/ajax.php

    r7228 r7442  
    569569                return;
    570570
     571        $group_id = (int) $_POST['group_id'];
     572        $friend_id = (int) $_POST['friend_id'];
     573
    571574        if ( 'invite' == $_POST['friend_action'] ) {
    572                 if ( ! groups_invite_user( array( 'user_id' => $_POST['friend_id'], 'group_id' => $_POST['group_id'] ) ) )
     575                $group = groups_get_group( $group_id );
     576
     577                // Users who have previously requested membership do not need
     578                // another invitation created for them
     579                if ( BP_Groups_Member::check_for_membership_request( $friend_id, $group_id ) ) {
     580                        $user_status = 'is_pending';
     581
     582                // Create the user invitation
     583                } else if ( groups_invite_user( array( 'user_id' => $friend_id, 'group_id' => $group_id ) ) ) {
     584                        $user_status = 'is_invited';
     585
     586                // Miscellaneous failure
     587                } else {
    573588                        return;
     589                }
    574590
    575591                $user = new BP_Core_User( $_POST['friend_id'] );
    … …  
    582598                                <a class="button remove" href="' . wp_nonce_url( bp_loggedin_user_domain() . bp_get_groups_slug() . '/' . $_POST['group_id'] . '/invites/remove/' . $user->id, 'groups_invite_uninvite_user' ) . '" id="uid-' . esc_attr( $user->id ) . '">' . __( 'Remove Invite', 'buddypress' ) . '</a>
    583599                          </div>';
     600
     601                if ( 'is_pending' == $user_status ) {
     602                        echo '<p class="description">' . sprintf( __( '%s has previously requested to join this group. Sending an invitation will automatically add the member to the group.', 'buddypress' ), $user->user_link ) . '</p>';
     603                }
     604
    584605                echo '</li>';
    585606                exit;
    586607
    587608        } elseif ( 'uninvite' == $_POST['friend_action'] ) {
    588                 if ( ! groups_uninvite_user( $_POST['friend_id'], $_POST['group_id'] ) )
     609                // Users who have previously requested membership should not
     610                // have their requests deleted on the "uninvite" action
     611                if ( BP_Groups_Member::check_for_membership_request( $friend_id, $group_id ) ) {
    589612                        return;
     613                }
     614
     615                // Remove the unsent invitation
     616                if ( ! groups_uninvite_user( $friend_id, $group_id ) ) {
     617                        return;
     618                }
    590619
    591620                exit;
    … …  
    717746
    718747                } elseif ( 'private' == $group->status ) {
    719                         check_ajax_referer( 'groups_request_membership' );
    720 
    721                         if ( ! groups_send_membership_request( bp_loggedin_user_id(), $group->id ) ) {
    722                                 _e( 'Error requesting membership', 'buddypress' );
     748
     749                        // If the user has already been invited, then this is
     750                        // an Accept Invitation button
     751                        if ( groups_check_user_has_invite( bp_loggedin_user_id(), $group->id ) ) {
     752                                check_ajax_referer( 'groups_accept_invite' );
     753
     754                                if ( ! groups_accept_invite( bp_loggedin_user_id(), $group->id ) ) {
     755                                        _e( 'Error requesting membership', 'buddypress' );
     756                                } else {
     757                                        echo '<a id="group-' . esc_attr( $group->id ) . '" class="leave-group" rel="leave" title="' . __( 'Leave Group', 'buddypress' ) . '" href="' . wp_nonce_url( bp_get_group_permalink( $group ) . 'leave-group', 'groups_leave_group' ) . '">' . __( 'Leave Group', 'buddypress' ) . '</a>';
     758                                }
     759
     760                        // Otherwise, it's a Request Membership button
    723761                        } else {
    724                                 echo '<a id="group-' . esc_attr( $group->id ) . '" class="membership-requested" rel="membership-requested" title="' . __( 'Membership Requested', 'buddypress' ) . '" href="' . bp_get_group_permalink( $group ) . '">' . __( 'Membership Requested', 'buddypress' ) . '</a>';
     762                                check_ajax_referer( 'groups_request_membership' );
     763
     764                                if ( ! groups_send_membership_request( bp_loggedin_user_id(), $group->id ) ) {
     765                                        _e( 'Error requesting membership', 'buddypress' );
     766                                } else {
     767                                        echo '<a id="group-' . esc_attr( $group->id ) . '" class="membership-requested" rel="membership-requested" title="' . __( 'Membership Requested', 'buddypress' ) . '" href="' . bp_get_group_permalink( $group ) . '">' . __( 'Membership Requested', 'buddypress' ) . '</a>';
     768                                }
    725769                        }
    726770                }
Note: See TracChangeset for help on using the changeset viewer.