Skip to:
Content

BuddyPress.org

Ticket #4414: 4414.patch

File 4414.patch, 42.8 KB (added by boonebgorges, 12 years ago)
  • bp-core/admin/css/common.dev.css

    diff --git bp-core/admin/css/common.dev.css bp-core/admin/css/common.dev.css
    index f722b52..9295759 100644
    div#icon-buddypress-activity { 
    1515        background: url( ../images/icons32.png ) no-repeat -10px -6px;
    1616}
    1717
     18div#icon-buddypress-groups {
     19        background: url( ../images/icons32.png ) no-repeat -250px -6px;
     20}
     21
    1822/* Menu Icons
    1923------------------------------------------------------------------------------*/
    2024
    ul#adminmenu li.toplevel_page_bp-activity_network.wp-has-current-submenu .wp-men 
    6973        background-position: 0 -2px;
    7074}
    7175
     76/* Groups */
     77ul#adminmenu li.toplevel_page_bp-groups .wp-menu-image a img,
     78ul#adminmenu li.toplevel_page_bp-groups_network .wp-menu-image a img {
     79        display: none;
     80}
     81ul#adminmenu li.toplevel_page_bp-groups .wp-menu-image a,
     82ul#adminmenu li.toplevel_page_bp-groups_network .wp-menu-image a {
     83        background-image: url( ../images/menu.png ) !important;
     84        background-position: -61px -34px;
     85}
     86ul#adminmenu li.toplevel_page_bp-groups:hover .wp-menu-image a,
     87ul#adminmenu li.toplevel_page_bp-groups.current .wp-menu-image a,
     88ul#adminmenu li.toplevel_page_bp-groups.wp-has-current-submenu .wp-menu-image a,
     89ul#adminmenu li.toplevel_page_bp-groups_network:hover .wp-menu-image a,
     90ul#adminmenu li.toplevel_page_bp-groups_network.current .wp-menu-image a,
     91ul#adminmenu li.toplevel_page_bp-groups_network.wp-has-current-submenu .wp-menu-image a {
     92        background-position: -61px -2px;
     93}
     94th.column-gid {
     95        width: 60px;
     96}
     97td.column-gid {
     98        vertical-align: middle;
     99}
     100table.bp-group-members th,
     101table.bp-group-members td {
     102        padding: 5px 0;
     103}
     104table.bp-group-members .uid-column {
     105        padding-left: 20px;
     106        padding-right: 20px;
     107}
     108table.bp-group-members .uname-column {
     109        width: 70%;
     110}
     111table.bp-group-members .urole-column {
     112        padding-left: 20px;
     113        padding-right: 20px;
     114}
    72115
    73116/* Components
    74117------------------------------------------------------------------------------*/
  • new file p-groups/bp-groups-admin.php

    diff --git bp-groups/bp-groups-admin.php bp-groups/bp-groups-admin.php
    new file mode 100644
    index 0000000..5f464e4
    - +  
     1<?php
     2/**
     3 * BuddyPress Groups component admin screen
     4 *
     5 * Props to WordPress core for the Comments admin screen, and its contextual help text,
     6 * on which this implementation is heavily based.
     7 *
     8 * @package BuddyPress
     9 * @since 1.7
     10 * @subpackage Groups
     11 */
     12
     13// Exit if accessed directly
     14if ( !defined( 'ABSPATH' ) ) exit;
     15
     16// Include WP's list table class
     17if ( !class_exists( 'WP_List_Table' ) ) require( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
     18
     19// per_page screen option. Has to be hooked in extremely early.
     20if ( is_admin() && ! empty( $_REQUEST['page'] ) && 'bp-groups' == $_REQUEST['page'] )
     21        add_filter( 'set-screen-option', 'bp_groups_admin_screen_options', 10, 3 );
     22
     23/**
     24 * Registers the Groups component admin screen
     25 *
     26 * @since 1.7
     27 */
     28function bp_groups_add_admin_menu() {
     29
     30        if ( ! bp_current_user_can( 'bp_moderate' ) )
     31                return;
     32
     33        // Add our screen
     34        $hook = add_menu_page( __( 'Groups', 'buddypress' ), __( 'Groups', 'buddypress' ), 'manage_options', 'bp-groups', 'bp_groups_admin' );
     35
     36        // Hook into early actions to load custom CSS and our init handler.
     37        add_action( "load-$hook", 'bp_groups_admin_load' );
     38}
     39add_action( bp_core_admin_hook(), 'bp_groups_add_admin_menu' );
     40
     41/**
     42 * Set up the admin page before any output is sent. Register contextual help and screen options for this admin page.
     43 *
     44 * @global object $bp BuddyPress global settings
     45 * @global BP_Groups_List_Table $bp_groups_list_table Groups screen list table
     46 * @since 1.6
     47 */
     48function bp_groups_admin_load() {
     49        global $bp, $bp_groups_list_table;
     50
     51        // Build redirection URL
     52        $redirect_to = remove_query_arg( array( 'action', 'gid', 'deleted', 'error', 'updated', 'success_new', 'error_new', 'success_modified', 'error_modified' ), $_SERVER['REQUEST_URI'] );
     53
     54        // Decide whether to load the dev version of the CSS and JavaScript
     55        $dev = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? 'dev.' : '';
     56
     57        // Decide whether to load the index or edit screen
     58        $doaction = ! empty( $_REQUEST['action'] ) ? $_REQUEST['action'] : '';
     59
     60        // Call an action for plugins to hook in early
     61        do_action( 'bp_groups_admin_load', $doaction );
     62
     63        // Edit screen
     64        if ( 'delete' == $doaction && ! empty( $_GET['gid'] ) ) {
     65
     66                check_admin_referer( 'bp-groups-delete' );
     67
     68                $group_id = (int) $_GET['gid'];
     69
     70                $result = groups_delete_group( $group_id );
     71
     72                if ( $result ) {
     73                        $redirect_to = add_query_arg( 'deleted', '1', $redirect_to );
     74                } else {
     75                        $redirect_to = add_query_arg( array(
     76                                'deleted' => 0,
     77                                'action'  => 'edit',
     78                                'gid'     => $group_id
     79                        ) );
     80                }
     81
     82                bp_core_redirect( $redirect_to );
     83
     84        } else if ( 'edit' == $doaction && ! empty( $_GET['gid'] ) ) {
     85                // columns screen option
     86                add_screen_option( 'layout_columns', array( 'default' => 2, 'max' => 2, ) );
     87
     88                get_current_screen()->add_help_tab( array(
     89                        'id'      => 'bp-activity-edit-overview',
     90                        'title'   => __( 'Overview', 'buddypress' ),
     91                        'content' =>
     92                                '<p>' . __( 'This page is a convenient way to edit the details associated with one of your groups.', 'buddypress' ) . '</p>' .
     93                                '<p>' . __( 'The Name and Description boxes are fixed in place, but you can reposition all the other boxes using drag and drop, and can minimize or expand them by clicking the title bar of each box. Use the Screen Options tab to hide or unhide, or to choose a 1- or 2-column layout for this screen.', 'buddypress' ) . '</p>'
     94                ) );
     95
     96                get_current_screen()->add_help_tab( array(
     97                        'id'      => 'bp-activity-edit-advanced',
     98                        'title'   => __( 'Item, Link, Type', 'buddypress' ),
     99                        'content' =>
     100                                '<p>' . __( '<strong>Primary Item/Secondary Item</strong> - These identify the object that created the activity. For example, the fields could reference a comment left on a specific site. Some types of activity may only use one, or none, of these fields.', 'buddypress' ) . '</p>' .
     101                                '<p>' . __( '<strong>Link</strong> - Activity generated by blog posts and comments, forum topics and replies, and some plugins, uses the link field for a permalink back to the content item. Some types of activity may not use this field, even if it has been set.', 'buddypress' ) . '</p>' .
     102                                '<p>' . __( '<strong>Type</strong> - Each distinct kind of activity has its own type. For example, <code>created_group</code> is used when a group is created and <code>joined_group</code> is used when a user joins a group.', 'buddypress' ) . '</p>' .
     103                                '<p>' . __( 'For information about when and how BuddyPress uses all of these settings, see the Managing Activity link in the panel to the side.', 'buddypress' ) . '</p>'
     104                ) );
     105
     106                // Help panel - sidebar links
     107                get_current_screen()->set_help_sidebar(
     108                        '<p><strong>' . __( 'For more information:', 'buddypress' ) . '</strong></p>' .
     109                        '<p>' . __( '<a href="http://codex.buddypress.org/buddypress-site-administration/managing-activity/">Managing Activity</a>', 'buddypress' ) . '</p>' .
     110                        '<p>' . __( '<a href="http://buddypress.org/support/">Support Forums</a>', 'buddypress' ) . '</p>'
     111                );
     112
     113                // Register metaboxes for the edit screen.
     114                add_meta_box( 'submitdiv',            _x( 'Save', 'activity admin edit screen', 'buddypress' ), 'bp_groups_admin_edit_metabox_status', get_current_screen()->id, 'side', 'core' );
     115                add_meta_box( 'bp_group_settings',    _x( 'Settings', 'group admin edit screen', 'buddypress' ), 'bp_groups_admin_edit_metabox_settings', get_current_screen()->id, 'side', 'core' );
     116                add_meta_box( 'bp_group_add_members', _x( 'Add New Members', 'group admin edit screen', 'buddypress' ), 'bp_groups_admin_edit_metabox_add_new_members', get_current_screen()->id, 'normal', 'core' );
     117                add_meta_box( 'bp_group_members',     _x( 'Manage Members', 'group admin edit screen', 'buddypress' ), 'bp_groups_admin_edit_metabox_members', get_current_screen()->id, 'normal', 'core' );
     118
     119                // Enqueue javascripts
     120                wp_enqueue_script( 'postbox' );
     121                wp_enqueue_script( 'dashboard' );
     122                wp_enqueue_script( 'comment' );
     123
     124        // Index screen
     125        } else {
     126                // Create the Activity screen list table
     127                $bp_groups_list_table = new BP_Groups_List_Table();
     128
     129                // per_page screen option
     130                add_screen_option( 'per_page', array( 'label' => _x( 'Groups', 'Groups per page (screen options)', 'buddypress' )) );
     131
     132                // Help panel - overview text
     133                get_current_screen()->add_help_tab( array(
     134                        'id'      => 'bp-groups-overview',
     135                        'title'   => __( 'Overview', 'buddypress' ),
     136                        'content' =>
     137                                '<p>' . __( 'You can manage activities made on your site similar to the way you manage comments and other content. This screen is customizable in the same ways as other management screens, and you can act on activities using the on-hover action links or the Bulk Actions.', 'buddypress' ) . '</p>' .
     138                                '<p>' . __( 'There are many different types of activities. Some are generated automatically by BuddyPress and other plugins, and some are entered directly by a user in the form of status update. To help manage the different activity types, use the filter dropdown box to switch between them.', 'buddypress' ) . '</p>'
     139                ) );
     140
     141                // Help panel - moderation text
     142                get_current_screen()->add_help_tab( array(
     143                        'id'            => 'bp-activity-moderating',
     144                        'title'         => __( 'Moderating Activity', 'buddypress' ),
     145                        'content'       =>
     146                                '<p>' . __( 'In the <strong>Activity</strong> column, above each activity it says &#8220;Submitted on,&#8221; followed by the date and time the activity item was generated on your site. Clicking on the date/time link will take you to that activity on your live site. Hovering over any activity gives you options to reply, edit, spam mark, or delete that activity.', 'buddypress' ) . '</p>' .
     147                                '<p>' . __( "In the <strong>In Response To</strong> column, if the activity was in reply to another activity, it shows that activity's author's picture and name, and a link to that activity on your live site. If there is a small bubble, the number in it shows how many other activities are related to this one; these are usually comments. Clicking the bubble will filter the activity screen to show only related activity items.", 'buddypress' ) . '</p>'
     148                ) );
     149
     150                // Help panel - sidebar links
     151                get_current_screen()->set_help_sidebar(
     152                        '<p><strong>' . __( 'For more information:', 'buddypress' ) . '</strong></p>' .
     153                        '<p>' . __( '<a href="http://buddypress.org/support/">Support Forums</a>', 'buddypress' ) . '</p>'
     154                );
     155        }
     156
     157        // Enqueue CSS and JavaScript
     158        wp_enqueue_script( 'bp_activity_admin_js', BP_PLUGIN_URL . "bp-activity/admin/js/admin.{$dev}js",   array( 'jquery', 'wp-ajax-response' ), bp_get_version(), true );
     159        wp_enqueue_style( 'bp_activity_admin_css', BP_PLUGIN_URL . "bp-activity/admin/css/admin.{$dev}css", array(),                               bp_get_version()       );
     160
     161        if ( $doaction && 'save' == $doaction ) {
     162                // Get activity ID
     163                $group_id = isset( $_REQUEST['gid'] ) ? (int) $_REQUEST['gid'] : '';
     164
     165                $redirect_to = add_query_arg( array(
     166                        'gid'    => (int) $group_id,
     167                        'action' => 'edit'
     168                ), $redirect_to );
     169
     170                // Check this is a valid form submission
     171                check_admin_referer( 'edit-group_' . $group_id );
     172
     173                // Get the group from the database
     174                $group = groups_get_group( 'group_id=' . $group_id );
     175
     176                // If the group doesn't exist, just redirect back to the index
     177                if ( empty( $group->slug ) ) {
     178                        wp_redirect( $redirect_to );
     179                        exit;
     180                }
     181
     182                // Check the form for the updated properties
     183
     184                // Store errors
     185                $error = 0;
     186                $success_new = $error_new = $success_modified = $error_modified = array();
     187
     188                // Group name and description are handled with
     189                // groups_edit_base_group_details()
     190                if ( !groups_edit_base_group_details( $group_id, $_POST['bp-groups-name'], $_POST['bp-groups-description'], 0 ) ) {
     191                        $error = $group_id;
     192                }
     193
     194                // Enable discussion forum
     195                $enable_forum   = ( isset( $_POST['group-show-forum'] ) ) ? 1 : 0;
     196
     197                // Privacy setting
     198                $allowed_status = apply_filters( 'groups_allowed_status', array( 'public', 'private', 'hidden' ) );
     199                $status         = ( in_array( $_POST['group-status'], (array) $allowed_status ) ) ? $_POST['group-status'] : 'public';
     200
     201                // Invite status
     202                $allowed_invite_status = apply_filters( 'groups_allowed_invite_status', array( 'members', 'mods', 'admins' ) );
     203                $invite_status         = in_array( $_POST['group-invite-status'], (array) $allowed_invite_status ) ? $_POST['group-invite-status'] : 'members';
     204
     205                if ( !groups_edit_group_settings( $group_id, $enable_forum, $status, $invite_status ) ) {
     206                        $error = $group_id;
     207                }
     208
     209                // Process new members
     210                if ( ! empty( $_POST['bp-groups-new-members'] ) ) {
     211
     212                        $user_names = explode( ',', $_POST['bp-groups-new-members'] );
     213                        foreach( $user_names as $user_key => $user_name ) {
     214                                $un = trim( $user_name );
     215
     216                                // Make sure the user exists before attempting
     217                                // to add to the group
     218                                if ( ! $user_id = username_exists( $un ) ) {
     219                                        $error_new[]   = $un;
     220                                } else if ( ! groups_join_group( $group_id, $user_id ) ) {
     221                                        $error_new[]   = $user_id;
     222                                } else {
     223                                        $success_new[] = $user_id;
     224                                }
     225                        }
     226                }
     227
     228                // Process member role changes
     229                if ( ! empty( $_POST['bp-groups-role'] ) && ! empty( $_POST['bp-groups-existing-role'] ) ) {
     230
     231                        // Before processing anything, make sure you're not
     232                        // attempting to remove the all user admins
     233                        $admin_count = 0;
     234                        foreach ( (array) $_POST['bp-groups-role'] as $new_role ) {
     235                                if ( 'admin' == $new_role ) {
     236                                        $admin_count++;
     237                                        break;
     238                                }
     239                        }
     240
     241                        if ( ! $admin_count ) {
     242                                $redirect_to = add_query_arg( 'no_admins', 1, $redirect_to );
     243                                bp_core_redirect( $redirect_to );
     244                        }
     245
     246                        // Process only those users who have had their roles changed
     247                        foreach ( (array) $_POST['bp-groups-role'] as $user_id => $new_role ) {
     248
     249                                $existing_role = isset( $_POST['bp-groups-existing-role'][$user_id] ) ? $_POST['bp-groups-existing-role'][$user_id] : '';
     250
     251                                if ( $existing_role != $new_role ) {
     252
     253                                        switch ( $new_role ) {
     254                                                case 'mod' :
     255                                                        // Admin to mod is a demotion. Demote to
     256                                                        // member, then fall through
     257                                                        if ( 'admin' == $existing_role ) {
     258                                                                groups_demote_member( $user_id, $group_id );
     259                                                        }
     260
     261                                                case 'admin' :
     262                                                        // If the user was banned, we must
     263                                                        // unban first
     264                                                        if ( 'banned' == $existing_role ) {
     265                                                                groups_unban_member( $user_id, $group_id );
     266                                                        }
     267
     268                                                        // At this point, each existing_role
     269                                                        // is a member, so promote
     270                                                        $result = groups_promote_member( $user_id, $group_id, $new_role );
     271
     272                                                        break;
     273
     274                                                case 'member' :
     275
     276                                                        if ( 'admin' == $existing_role || 'mod' == $existing_role ) {
     277                                                                $result = groups_demote_member( $user_id, $group_id );
     278                                                        } else if ( 'banned' == $existing_role ) {
     279                                                                $result = groups_unban_member( $user_id, $group_id );
     280                                                        }
     281
     282                                                        break;
     283
     284                                                case 'banned' :
     285
     286                                                        $result = groups_ban_member( $user_id, $group_id );
     287
     288                                                        break;
     289
     290                                                case 'remove' :
     291
     292                                                        $result = groups_remove_member( $user_id, $group_id );
     293
     294                                                        break;
     295                                        }
     296
     297                                        // Store the success or failure
     298                                        if ( $result ) {
     299                                                $success_modified[] = $user_id;
     300                                        } else {
     301                                                $error_modified[]   = $user_id;
     302                                        }
     303                                }
     304                        }
     305                }
     306
     307                // Call actions for plugins to do something before we redirect
     308                do_action_ref_array( 'bp_group_admin_edit_after', array( &$group, $error, $error_new, $success_new, $error_modified, $success_modified ) );
     309
     310                // Create the redirect URL
     311
     312                if ( $error ) {
     313                        // This means there was an error updating group details
     314                        $redirect_to = add_query_arg( 'error', (int) $error, $redirect_to );
     315                } else {
     316                        // Group details were update successfully
     317                        $redirect_to = add_query_arg( 'updated', 1, $redirect_to );
     318                }
     319
     320                if ( !empty( $success_new ) ) {
     321                        $success_new = implode( ',', array_filter( $success_new, 'urlencode' ) );
     322                        $redirect_to = add_query_arg( 'success_new', $success_new, $redirect_to );
     323                }
     324
     325                if ( !empty( $error_new ) ) {
     326                        $error_new = implode( ',', array_filter( $error_new, 'urlencode' ) );
     327                        $redirect_to = add_query_arg( 'error_new', $error_new, $redirect_to );
     328                }
     329
     330                if ( !empty( $success_modified ) ) {
     331                        $success_modified = implode( ',', array_filter( $success_modified, 'urlencode' ) );
     332                        $redirect_to = add_query_arg( 'success_modified', $success_modified, $redirect_to );
     333                }
     334
     335                if ( !empty( $error_modified ) ) {
     336                        $error_modified = implode( ',', array_filter( $error_modified, 'urlencode' ) );
     337                        $redirect_to = add_query_arg( 'error_modified', $error_modified, $redirect_to );
     338                }
     339
     340                // Redirect
     341                wp_redirect( apply_filters( 'bp_group_admin_edit_redirect', $redirect_to ) );
     342                exit;
     343
     344
     345        // If a referrer and a nonce is supplied, but no action, redirect back.
     346        } elseif ( ! empty( $_GET['_wp_http_referer'] ) ) {
     347                wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), stripslashes( $_SERVER['REQUEST_URI'] ) ) );
     348                exit;
     349        }
     350}
     351
     352/**
     353 * Outputs the Groups component admin screens
     354 *
     355 * @since 1.7
     356 */
     357function bp_groups_admin() {
     358        // Decide whether to load the index or edit screen
     359        $doaction = ! empty( $_REQUEST['action'] ) ? $_REQUEST['action'] : '';
     360
     361        // Display the single activity edit screen
     362        if ( 'edit' == $doaction && ! empty( $_GET['gid'] ) ) {
     363                bp_groups_admin_edit();
     364
     365        // Otherwise, display the Activity index screen
     366        } else {
     367                bp_groups_admin_index();
     368        }
     369}
     370
     371/**
     372 * Display the single groups edit screen
     373 *
     374 * @global int $screen_layout_columns Number of columns shown on this admin page
     375 * @since 1.7
     376 */
     377function bp_groups_admin_edit() {
     378        global $screen_layout_columns;
     379
     380        // @todo: Check if user is allowed to edit activity items
     381        // if ( ! current_user_can( 'bp_edit_activity' ) )
     382        if ( ! is_super_admin() )
     383                die( '-1' );
     384
     385        $messages = array();
     386
     387        // If the user has just made a change to a group, build status messages
     388        if ( !empty( $_REQUEST['no_admins'] ) || ! empty( $_REQUEST['error'] ) || ! empty( $_REQUEST['updated'] ) || ! empty( $_REQUEST['error_new'] ) || ! empty( $_REQUEST['success_new'] ) || ! empty( $_REQUEST['error_modified'] ) || ! empty( $_REQUEST['success_modified'] ) ) {
     389                $no_admins        = ! empty( $_REQUEST['no_admins']        ) ? 1                                             : 0;
     390                $errors           = ! empty( $_REQUEST['error']            ) ? $_REQUEST['error']                            : '';
     391                $updated          = ! empty( $_REQUEST['updated']          ) ? $_REQUEST['updated']                          : '';
     392                $error_new        = ! empty( $_REQUEST['error_new']        ) ? explode( ',', $_REQUEST['error_new'] )        : array();
     393                $success_new      = ! empty( $_REQUEST['success_new']      ) ? explode( ',', $_REQUEST['success_new'] )      : array();
     394                $error_modified   = ! empty( $_REQUEST['error_modified']   ) ? explode( ',', $_REQUEST['error_modified'] )   : array();
     395                $success_modified = ! empty( $_REQUEST['success_modified'] ) ? explode( ',', $_REQUEST['success_modified'] ) : array();
     396
     397                if ( ! empty( $no_admins ) ) {
     398                        $messages[] = __( 'You cannot remove all administrators from a group.', 'buddypress' );
     399                }
     400
     401                if ( ! empty( $errors ) ) {
     402                        $messages[] = __( 'An error occurred when trying to update your group details.', 'buddypress' );
     403                } else if ( ! empty( $updated ) ) {
     404                        $messages[] = __( 'The group has been updated successfully.', 'buddypress' );
     405                }
     406
     407                if ( ! empty( $error_new ) ) {
     408                        $messages[] = sprintf( __( 'The following users could not be added to the group: <em>%s</em>', 'buddypress' ), implode( ', ', $error_new ) );
     409                }
     410
     411                if ( ! empty( $success_new ) ) {
     412                        $messages[] = sprintf( __( 'The following users were successfully added to the group: <em>%s</em>', 'buddypress' ), implode( ', ', $success_new ) );
     413                }
     414
     415                if ( ! empty( $error_modified ) ) {
     416                        $error_modified = bp_groups_admin_get_usernames_from_ids( $error_modified );
     417                        $messages[] = sprintf( __( 'An error occurred when trying to modify the following members: <em>%s</em>', 'buddypress' ), implode( ', ', $error_modified ) );
     418                }
     419
     420                if ( ! empty( $success_modified ) ) {
     421                        $success_modified = bp_groups_admin_get_usernames_from_ids( $success_modified );
     422                        $messages[] = sprintf( __( 'The following members were successfully modified: <em>%s</em>', 'buddypress' ), implode( ', ', $success_modified ) );
     423                }
     424        }
     425
     426        $is_error = ! empty( $no_admins ) || ! empty( $errors ) || ! empty( $error_new ) || ! empty( $error_modified );
     427
     428        // Get the activity from the database
     429        $group      = groups_get_group( 'group_id=' . $_GET['gid'] );
     430        $group_name = isset( $group->name ) ? apply_filters( 'bp_get_group_name', $group->name ) : '';
     431
     432        // Construct URL for form
     433        $form_url = remove_query_arg( array( 'action', 'deleted', 'no_admins', 'error', 'error_new', 'success_new', 'error_modified', 'success_modified' ), $_SERVER['REQUEST_URI'] );
     434        $form_url = add_query_arg( 'action', 'save', $form_url );
     435
     436        // Call an action for plugins to modify the group before we display the edit form
     437        do_action_ref_array( 'bp_groups_admin_edit', array( &$group ) );
     438?>
     439
     440        <div class="wrap">
     441                <?php screen_icon( 'buddypress-groups' ); ?>
     442                <h2><?php printf( __( 'Editing <em>%s</em> (ID #%s)', 'buddypress' ), $group_name, number_format_i18n( (int) $_REQUEST['gid'] ) ); ?></h2>
     443
     444                <?php // If the user has just made a change to an group, display the status messages ?>
     445                <?php if ( !empty( $messages ) ) : ?>
     446                        <div id="moderated" class="<?php echo ( $is_error ) ? 'error' : 'updated'; ?>"><p><?php echo implode( "<br/>\n", $messages ); ?></p></div>
     447                <?php endif; ?>
     448
     449                <?php if ( ! empty( $group ) ) : ?>
     450
     451                        <form action="<?php echo esc_attr( $form_url ); ?>" id="bp-groups-edit-form" method="post">
     452                                <div id="poststuff">
     453
     454                                        <div id="post-body" class="metabox-holder columns-<?php echo 1 == get_current_screen()->get_columns() ? '1' : '2'; ?>">
     455                                                <div id="post-body-content">
     456                                                        <div id="postdiv" class="postarea">
     457                                                                <div id="bp_groups_name" class="postbox">
     458                                                                        <h3><?php _e( 'Name', 'buddypress' ); ?></h3>
     459                                                                        <div class="inside">
     460                                                                                <input type="text" name="bp-groups-name" id="bp-groups-name" value="<?php echo esc_attr( stripslashes( $group_name ) ) ?>" />
     461                                                                        </div>
     462                                                                </div>
     463
     464                                                                <div id="bp_groups_description" class="postbox">
     465                                                                        <h3><?php _e( 'Description', 'buddypress' ); ?></h3>
     466                                                                        <div class="inside">
     467                                                                                <?php wp_editor( stripslashes( $group->description ), 'bp-groups-description', array( 'media_buttons' => false, 'teeny' => true, 'textarea_rows' => 5, 'quicktags' => array( 'buttons' => 'strong,em,link,block,del,ins,img,code,spell,close' ) ) ); ?>
     468                                                                        </div>
     469                                                                </div>
     470                                                        </div>
     471                                                </div><!-- #post-body-content -->
     472
     473                                                <div id="postbox-container-1" class="postbox-container">
     474                                                        <?php do_meta_boxes( get_current_screen()->id, 'side', $group ); ?>
     475                                                </div>
     476
     477                                                <div id="postbox-container-2" class="postbox-container">
     478                                                        <?php do_meta_boxes( get_current_screen()->id, 'normal', $group ); ?>
     479                                                        <?php do_meta_boxes( get_current_screen()->id, 'advanced', $group ); ?>
     480                                                </div>
     481                                        </div><!-- #post-body -->
     482
     483                                </div><!-- #poststuff -->
     484                                <?php wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false ); ?>
     485                                <?php wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false ); ?>
     486                                <?php wp_nonce_field( 'edit-group_' . $group->id ); ?>
     487                        </form>
     488
     489                <?php else : ?>
     490                        <p><?php printf( __( 'No group found with this ID. <a href="%s">Go back and try again</a>.', 'buddypress' ), network_admin_url( 'admin.php?page=bp-groups' ) ); ?></p>
     491                <?php endif; ?>
     492
     493        </div><!-- .wrap -->
     494
     495<?php
     496}
     497
     498/**
     499 * Display the Groups admin index screen, which contains a list of all your
     500 * BuddyPress groups.
     501 *
     502 * @global BP_Activity_List_Table $bp_groups_list_table Activity screen list table
     503 * @global string $plugin_page
     504 * @since 1.7
     505 */
     506function bp_groups_admin_index() {
     507        global $bp_groups_list_table, $plugin_page;
     508
     509        $messages = array();
     510
     511        // If the user has just made a change to a group, build status messages
     512        if ( ! empty( $_REQUEST['deleted'] ) ) {
     513                $deleted  = ! empty( $_REQUEST['deleted'] ) ? (int) $_REQUEST['deleted'] : 0;
     514
     515                if ( $deleted > 0 ) {
     516                        $messages[] = sprintf( _n( '%s activity has been permanently deleted.', '%s activity items have been permanently deleted.', $deleted, 'buddypress' ), number_format_i18n( $deleted ) );
     517                }
     518
     519        }
     520
     521        // Prepare the activity items for display
     522        $bp_groups_list_table->prepare_items();
     523
     524        // Call an action for plugins to modify the messages before we display the edit form
     525        do_action( 'bp_groups_admin_index', $messages );
     526?>
     527
     528        <div class="wrap">
     529                <?php screen_icon( 'buddypress-groups' ); ?>
     530                <h2>
     531                        <?php _e( 'Groups', 'buddypress' ); ?>
     532
     533                        <?php if ( !empty( $_REQUEST['s'] ) ) : ?>
     534                                <span class="subtitle"><?php printf( __( 'Search results for &#8220;%s&#8221;', 'buddypress' ), wp_html_excerpt( esc_html( stripslashes( $_REQUEST['s'] ) ), 50 ) ); ?></span>
     535                        <?php endif; ?>
     536                </h2>
     537
     538                <?php // If the user has just made a change to an group, display the status messages ?>
     539                <?php if ( !empty( $messages ) ) : ?>
     540                        <div id="moderated" class="<?php echo ( ! empty( $_REQUEST['error'] ) ) ? 'error' : 'updated'; ?>"><p><?php echo implode( "<br/>\n", $messages ); ?></p></div>
     541                <?php endif; ?>
     542
     543                <?php // Display each group on its own row ?>
     544                <?php $bp_groups_list_table->views(); ?>
     545
     546                <form id="bp-groups-form" action="" method="get">
     547                        <?php $bp_groups_list_table->search_box( __( 'Search all Groups', 'buddypress' ), 'bp-groups' ); ?>
     548                        <input type="hidden" name="page" value="<?php echo esc_attr( $plugin_page ); ?>" />
     549                        <?php $bp_groups_list_table->display(); ?>
     550                </form>
     551
     552        </div>
     553
     554<?php
     555}
     556
     557/**
     558 * Settings metabox
     559 *
     560 * @param object $item Group item
     561 * @since 1.7
     562 */
     563function bp_groups_admin_edit_metabox_settings( $item ) {
     564        $invite_status = groups_get_groupmeta( $item->id, 'invite_status' );
     565
     566?>
     567
     568        <div class="bp-groups-settings-section" id="bp-groups-settings-section-forum">
     569                <label for="group-show-forum"><input type="checkbox" name="group-show-forum" id="group-show-forum" <?php checked( $item->enable_forum ) ?> /> <?php _e( 'Enable discussion forum', 'buddypress' ) ?><br />
     570        </div>
     571
     572        <div class="bp-groups-settings-section" id="bp-groups-settings-section-status">
     573                <label for="group-status"><?php _e( 'Privacy', 'buddypress' ); ?></label>
     574
     575                <ul>
     576                        <li><input type="radio" name="group-status" id="bp-group-status-public" value="public" <?php checked( $item->status, 'public' ) ?> /> <?php _e( 'Public', 'buddypress' ) ?></li>
     577                        <li><input type="radio" name="group-status" id="bp-group-status-private" value="private" <?php checked( $item->status, 'private' ) ?> /> <?php _e( 'Private', 'buddypress' ) ?></li>
     578                        <li><input type="radio" name="group-status" id="bp-group-status-hidden" value="hidden" <?php checked( $item->status, 'hidden' ) ?> /> <?php _e( 'Hidden', 'buddypress' ) ?></li>
     579        </div>
     580
     581        <div class="bp-groups-settings-section" id="bp-groups-settings-section-invite-status">
     582                <label for="group-invite-status"><?php _e( 'Who can invite others to this group?', 'buddypress' ); ?></label>
     583
     584                <ul>
     585                        <li><input type="radio" name="group-invite-status" id="bp-group-invite-status-members" value="members" <?php checked( $invite_status, 'members' ) ?> /> <?php _e( 'All group members', 'buddypress' ) ?></li>
     586                        <li><input type="radio" name="group-invite-status" id="bp-group-invite-status-mods" value="mods" <?php checked( $invite_status, 'mods' ) ?> /> <?php _e( 'Group admins and mods only', 'buddypress' ) ?></li>
     587                        <li><input type="radio" name="group-invite-status" id="bp-group-invite-status-admins" value="admins" <?php checked( $invite_status, 'admins' ) ?> /> <?php _e( 'Group admins only', 'buddypress' ) ?></li>
     588                </ul>
     589        </div>
     590
     591<?php
     592}
     593
     594/**
     595 * Add New Members metabox
     596 *
     597 * @since 1.7
     598 */
     599function bp_groups_admin_edit_metabox_add_new_members( $item ) {
     600        ?>
     601
     602        <input name="bp-groups-new-members" id="bp-groups-new-members" />
     603        <p id="bp-groups-new-members-help" class="description"><?php _e( 'Enter a comma-separated list of user logins.', 'buddypress' ); ?></p>
     604
     605        <?php
     606}
     607
     608/**
     609 * Members metabox
     610 *
     611 * @since 1.7
     612 */
     613function bp_groups_admin_edit_metabox_members( $item ) {
     614        global $members_template;
     615
     616        // Pull up a list of group members, so we can separate out the types
     617        $members = array(
     618                'admin'  => array(),
     619                'mod'    => array(),
     620                'member' => array(),
     621                'banned' => array()
     622        );
     623
     624        if ( bp_group_has_members( array(
     625                'group_id' => $item->id,
     626                'exclude_admins_mods' => false,
     627                'exclude_banned' => false
     628        ) ) ) {
     629                // Get a list of admins and mods, to reduce lookups
     630                // We'll rekey them by user_id for convenience
     631                $admins = $mods = array();
     632
     633                foreach ( (array) groups_get_group_admins( $item->id ) as $admin_obj ) {
     634                        $admins[$admin_obj->user_id] = $admin_obj;
     635                }
     636
     637                foreach ( (array) groups_get_group_mods( $item->id ) as $admin_obj ) {
     638                        $mods[$admin_obj->user_id] = $admin_obj;
     639                }
     640
     641                while ( bp_group_members() ) {
     642                        bp_group_the_member();
     643                        if ( bp_get_group_member_is_banned() ) {
     644                                $members['banned'][] = $members_template->member;
     645                        } else if ( isset( $admins[ bp_get_group_member_id() ] ) ) {
     646                                $members['admin'][]  = $members_template->member;
     647                        } else if ( isset( $mods[ bp_get_group_member_id() ] ) ) {
     648                                $members['mod'][]    = $members_template->member;
     649                        } else {
     650                                $members['member'][] = $members_template->member;
     651                        }
     652                }
     653        }
     654
     655        // Loop through each member type
     656        foreach ( $members as $member_type => $type_users ) : ?>
     657
     658                <div class="bp-groups-member-type" id="bp-groups-member-type-<?php echo esc_attr( $member_type ) ?>">
     659
     660                        <h4>
     661                                <?php switch ( $member_type ) :
     662                                        case 'admin'  : _e( 'Administrators', 'buddypress' ); break;
     663                                        case 'mod'    : _e( 'Moderators',     'buddypress' ); break;
     664                                        case 'member' : _e( 'Members',        'buddypress' ); break;
     665                                        case 'banned' : _e( 'Banned Users',   'buddypress' ); break;
     666                                endswitch; ?>
     667                        </h4>
     668
     669                <?php if ( !empty( $type_users ) ) : ?>
     670
     671                        <table class="widefat bp-group-members">
     672                                <thead>
     673                                <tr>
     674                                        <th scope="col" class="uid-column"><?php _ex( 'ID', 'Group member user_id in group admin', 'buddypress' ) ?></th>
     675                                        <th scope="col" class="uname-column"><?php _ex( 'Name', 'Group member name in group admin', 'buddypress' ) ?></th>
     676                                        <th scope="col" class="urole-column"><?php _ex( 'Group Role', 'Group member role in group admin', 'buddypress' ) ?></th>
     677                                </tr>
     678                                </thead>
     679
     680                                <tbody>
     681                                <?php foreach ( $type_users as $type_user ) : ?>
     682                                        <?php $user_link = bp_core_get_user_domain( $type_user->user_id ); ?>
     683                                        <tr>
     684                                                <th scope="row" class="uid-column"><?php echo $type_user->user_id ?></th>
     685
     686                                                <td class="uname-column">
     687                                                        <a href="<?php echo $user_link ?>"><?php echo bp_core_fetch_avatar( array(
     688                                                                        'item_id' => $type_user->user_id,
     689                                                                        'width'   => '32',
     690                                                                        'height'  => '32'
     691                                                        ) ) ?></a>
     692
     693                                                        <?php echo bp_core_get_userlink( $type_user->user_id ) ?>
     694                                                </td>
     695
     696                                                <td class="urole-column">
     697                                                        <select class="bp-groups-role" id="bp-groups-role-<?php echo $type_user->user_id ?>" name="bp-groups-role[<?php echo $type_user->user_id ?>]">
     698                                                                <option value="admin" <?php selected( 'admin', $member_type ) ?>><?php _e( 'Administrator', 'buddypress' ) ?></option>
     699                                                                <option value="mod" <?php selected( 'mod', $member_type ) ?>><?php _e( 'Moderator', 'buddypress' ) ?></option>
     700                                                                <option value="member" <?php selected( 'member', $member_type ) ?>><?php _e( 'Member', 'buddypress' ) ?></option>
     701                                                                <option class="banned" value="banned" <?php selected( 'banned', $member_type ) ?>><?php _e( 'Banned', 'buddypress' ) ?></option>
     702                                                                <option class="remove" value="remove"><?php _e( 'Remove From Group', 'buddypress' ) ?></option>
     703                                                        </select>
     704
     705                                                        <?php /* Store the current role for this user, so we can easily detect changes */ ?>
     706                                                        <input type="hidden" name="bp-groups-existing-role[<?php echo $type_user->user_id ?>]" value="<?php echo $member_type ?>" />
     707                                                </td>
     708                                        </tr>
     709                                <?php endforeach; ?>
     710                                </tbody>
     711                        </table>
     712
     713                <?php else : ?>
     714
     715                        <p class="bp-groups-no-members"><?php _e( 'No members of this type', 'buddypress' ) ?></p>
     716
     717                <?php endif; ?>
     718
     719                </div><!-- .bp-groups-member-type -->
     720
     721        <?php endforeach;
     722
     723}
     724
     725/**
     726 * Status metabox for the Groups admin edit screen
     727 *
     728 * @param object $item Group item
     729 * @since 1.7
     730 */
     731function bp_groups_admin_edit_metabox_status( $item ) {
     732        $base_url = add_query_arg( array(
     733                'page' => 'bp-groups',
     734                'gid'  => $item->id
     735        ), is_network_admin() ? network_admin_url( 'admin.php' ) : admin_url( 'admin.php' ) );
     736?>
     737        <div id="submitcomment" class="submitbox">
     738                <div id="major-publishing-actions">
     739                        <div id="delete-action">
     740                                <a onclick="javascript:return confirm('<?php echo esc_js( __( 'Are you sure?', 'buddypress' ) ) ?>');" class="submitdelete deletion" href="<?php echo wp_nonce_url( add_query_arg( 'action', 'delete', $base_url ), 'bp-groups-delete' ) ?>"><?php _e( 'Delete', 'buddypress' ) ?></a>
     741                        </div>
     742
     743                        <div id="publishing-action">
     744                                <?php submit_button( __( 'Save Changes', 'buddypress' ), 'primary', 'save', false, array( 'tabindex' => '4' ) ); ?>
     745                        </div>
     746                        <div class="clear"></div>
     747                </div><!-- #major-publishing-actions -->
     748
     749        </div><!-- #submitcomment -->
     750
     751<?php
     752}
     753
     754/**
     755 * Match a set of user ids up to a set of usernames
     756 *
     757 * @since 1.7
     758 */
     759function bp_groups_admin_get_usernames_from_ids( $user_ids ) {
     760        $usernames = array();
     761
     762        $users = new WP_User_Query( array( 'blog_id' => 0, 'include' => $user_ids ) );
     763        foreach ( $users->results as $user ) {
     764                $usernames[] = $user->user_login;
     765        }
     766
     767        return $usernames;
     768}
     769
     770/**
     771 * List table class for the Groups component admin page.
     772 *
     773 * @since 1.6
     774 */
     775class BP_Groups_List_Table extends WP_List_Table {
     776        /**
     777         * What type of view is being displayed? e.g. "All", "Pending", "Approved", "Spam"...
     778         *
     779         * @since 1.6
     780        */
     781        public $view = 'all';
     782
     783        /**
     784         * How many activity items have been marked as spam.
     785         *
     786         * @since 1.6
     787         */
     788        public $spam_count = 0;
     789
     790        /**
     791         * Store activity-to-user-ID mappings for use in the In Response To column.
     792         *
     793         * @since 1.6
     794         */
     795        protected $activity_user_id = array();
     796
     797        /**
     798         * Constructor
     799         *
     800         * @since 1.6
     801         */
     802        public function __construct() {
     803
     804                // Define singular and plural labels, as well as whether we support AJAX.
     805                parent::__construct( array(
     806                        'ajax'     => false,
     807                        'plural'   => 'activities',
     808                        'singular' => 'activity',
     809                ) );
     810        }
     811
     812        /**
     813         * Handle filtering of data, sorting, pagination, and any other data-manipulation required prior to rendering.
     814         *
     815         * @since 1.6
     816         */
     817        function prepare_items() {
     818                global $groups_template;
     819
     820                $screen = get_current_screen();
     821
     822                // Option defaults
     823                $include_id       = false;
     824                $search_terms     = false;
     825                $sort             = 'DESC';
     826
     827                // Set current page
     828                $page = $this->get_pagenum();
     829
     830                // Set per page from the screen options
     831                $per_page = $this->get_items_per_page( str_replace( '-', '_', "{$screen->id}_per_page" ) );
     832
     833                // Sort order
     834                if ( !empty( $_REQUEST['order'] ) && 'desc' != $_REQUEST['order'] )
     835                        $sort = 'ASC';
     836
     837                // Order by
     838                /*if ( !empty( $_REQUEST['orderby'] ) ) {
     839                }*/
     840
     841                // Are we doing a search?
     842                if ( !empty( $_REQUEST['s'] ) )
     843                        $search_terms = $_REQUEST['s'];
     844
     845                // Check if user has clicked on a specific group (if so, fetch only that group).
     846                if ( !empty( $_REQUEST['gid'] ) )
     847                        $include_id = (int) $_REQUEST['gid'];
     848
     849                // If we're viewing a specific activity, flatten all activites into a single array.
     850                if ( $include_id ) {
     851                        $groups = array( (array) groups_get_group( 'group_id=' . $include_id ) );
     852                } else {
     853                        $groups_args = array(
     854                                'per_page' => $per_page,
     855                                'page'     => $page,
     856                        );
     857
     858                        $groups = array();
     859                        if ( bp_has_groups( $groups_args ) ) {
     860                                while ( bp_groups() ) {
     861                                        bp_the_group();
     862                                        $groups[] = (array) $groups_template->group;
     863                                }
     864                        }
     865                }
     866
     867                // Set raw data to display
     868                $this->items = $groups;
     869
     870                // Store information needed for handling table pagination
     871                $this->set_pagination_args( array(
     872                        'per_page'    => $per_page,
     873                        'total_items' => $groups_template->total_group_count,
     874                        'total_pages' => ceil( $groups_template->total_group_count / $per_page )
     875                ) );
     876        }
     877
     878        /**
     879         * Get an array of all the columns on the page
     880         *
     881         * @return array
     882         * @since 1.7
     883         */
     884        function get_column_info() {
     885                $this->_column_headers = array(
     886                        $this->get_columns(),
     887                        array(),
     888                        $this->get_sortable_columns(),
     889                );
     890
     891                return $this->_column_headers;
     892        }
     893
     894        /**
     895         * Displays a message on screen when no items are found (e.g. no search matches)
     896         *
     897         * @since 1.7
     898         */
     899        function no_items() {
     900                _e( 'No groups found.', 'buddypress' );
     901        }
     902
     903        /**
     904         * Outputs the Groups data table
     905         *
     906         * @since 1.7
     907        */
     908        function display() {
     909                extract( $this->_args );
     910
     911                $this->display_tablenav( 'top' );
     912        ?>
     913
     914                <table class="<?php echo implode( ' ', $this->get_table_classes() ); ?>" cellspacing="0">
     915                        <thead>
     916                                <tr>
     917                                        <?php $this->print_column_headers(); ?>
     918                                </tr>
     919                        </thead>
     920
     921                        <tfoot>
     922                                <tr>
     923                                        <?php $this->print_column_headers( false ); ?>
     924                                </tr>
     925                        </tfoot>
     926
     927                        <tbody id="the-comment-list">
     928                                <?php $this->display_rows_or_placeholder(); ?>
     929                        </tbody>
     930                </table>
     931                <?php
     932
     933                $this->display_tablenav( 'bottom' );
     934        }
     935
     936        /**
     937         * Generates content for a single row of the table
     938         *
     939         * @param object $item The current item
     940         * @since 1.7
     941         */
     942        function single_row( $item ) {
     943                static $row_class = '';
     944                $row_class = ( $row_class == '' ? ' class="alternate"' : '' );
     945
     946                echo '<tr' . $row_class . ' id="activity-' . esc_attr( $item['id'] ) . '" data-parent_id="' . esc_attr( $item['id'] ) . '" data-root_id="' . esc_attr( $item['id'] ) . '">';
     947                echo $this->single_row_columns( $item );
     948                echo '</tr>';
     949        }
     950
     951        /**
     952         * Get the list of views available on this table (e.g. "all", "spam").
     953         *
     954         * @since 1.7
     955         */
     956        function get_views() {
     957                $redirect_to = remove_query_arg( array( 'activity_status', 'aid', 'deleted', 'error', 'spammed', 'unspammed', 'updated', ), $_SERVER['REQUEST_URI'] );
     958        ?>
     959                <ul class="subsubsub">
     960                        <li class="all"><a href="<?php echo esc_attr( esc_url( $redirect_to ) ); ?>" class="<?php if ( 'spam' != $this->view ) echo 'current'; ?>"><?php _e( 'All', 'buddypress' ); ?></a> |</li>
     961                        <li class="spam"><a href="<?php echo esc_attr( esc_url( add_query_arg( 'activity_status', 'spam', $redirect_to ) ) ); ?>" class="<?php if ( 'spam' == $this->view ) echo 'current'; ?>"><?php printf( __( 'Spam <span class="count">(%s)</span>', 'buddypress' ), number_format_i18n( $this->spam_count ) ); ?></a></li>
     962
     963                        <?php do_action( 'bp_activity_list_table_get_views', $redirect_to, $this->view ); ?>
     964                </ul>
     965        <?php
     966        }
     967
     968        /**
     969         * Get bulk actions
     970         *
     971         * @return array Key/value pairs for the bulk actions dropdown
     972         * @since 1.7
     973         */
     974        function get_bulk_actions() {
     975                $actions = array();
     976                $actions['bulk_delete'] = __( 'Delete Permanently', 'buddypress' );
     977
     978                return apply_filters( 'bp_groups_list_table_get_bulk_actions', $actions );
     979        }
     980
     981        /**
     982         * Get the table column titles.
     983         *
     984         * @see WP_List_Table::single_row_columns()
     985         * @return array
     986         * @since 1.7
     987         */
     988        function get_columns() {
     989                return array(
     990                        'cb'          => '<input name type="checkbox" />',
     991                        'gid'         => __( 'ID', 'buddypress' ),
     992                        'comment'     => __( 'Name', 'buddypress' ),
     993                        'description' => __( 'Description', 'buddypress' ),
     994                );
     995        }
     996
     997        /**
     998         * Get the column names for sortable columns
     999         *
     1000         * @return array
     1001         * @since 1.7
     1002         * @todo For this to work, BP_Activity_Activity::get() needs updating to supporting ordering by specific fields
     1003         */
     1004        function get_sortable_columns() {
     1005                return array(
     1006                        'gid'     => array( 'gid', false ),
     1007                        'comment' => array( 'name', false )
     1008                );
     1009        }
     1010
     1011        /**
     1012         * Checkbox column
     1013         *
     1014         * @param array $item A singular item (one full row)
     1015         * @see WP_List_Table::single_row_columns()
     1016         * @since 1.6
     1017         */
     1018        function column_cb( $item ) {
     1019                printf( '<input type="checkbox" name="aid[]" value="%d" />', (int) $item['id'] );
     1020        }
     1021
     1022        /**
     1023         * Group id column
     1024         *
     1025         * @param array $item A singular item (one full row)
     1026         * @see WP_List_Table::single_row_columns()
     1027         * @since 1.6
     1028         */
     1029        function column_gid( $item ) {
     1030                echo '<strong>' . $item['id'] . '</strong>';
     1031        }
     1032
     1033        /**
     1034         * Name column, and "quick admin" rollover actions.
     1035         *
     1036         * Called "comment" in the CSS so we can re-use some WP core CSS.
     1037         *
     1038         * @param array $item A singular item (one full row)
     1039         * @see WP_List_Table::single_row_columns()
     1040         * @since 1.7
     1041         */
     1042        function column_comment( $item ) {
     1043
     1044                // Preorder items: Visit | Edit | Delete Permanently
     1045                $actions = array(
     1046                        'visit'  => '',
     1047                        'edit'   => '',
     1048                        'delete' => '',
     1049                );
     1050
     1051                // We need the group object for some BP functions
     1052                $item_obj = (object) $item;
     1053
     1054                // Build actions URLs
     1055                $base_url   = network_admin_url( 'admin.php?page=bp-groups&amp;gid=' . $item['id'] );
     1056                $spam_nonce = esc_html( '_wpnonce=' . wp_create_nonce( 'spam-groups_' . $item['id'] ) );
     1057
     1058                $delete_url = $base_url . "&amp;action=delete&amp;$spam_nonce";
     1059                $edit_url   = $base_url . '&amp;action=edit';
     1060                $visit_url  = bp_get_group_permalink( $item_obj );
     1061
     1062                // Rollover actions
     1063
     1064                // Visit
     1065                $actions['visit'] = sprintf( '<a href="%s">%s</a>', $visit_url, __( 'Visit', 'buddypress' ) );
     1066
     1067                // Edit
     1068                $actions['edit'] = sprintf( '<a href="%s">%s</a>', $edit_url, __( 'Edit', 'buddypress' ) );
     1069
     1070                // Delete
     1071                $actions['delete'] = sprintf( '<a href="%s" onclick="%s">%s</a>', $delete_url, "javascript:return confirm('" . esc_js( __( 'Are you sure?', 'buddypress' ) ) . "'); ", __( 'Delete Permanently', 'buddypress' ) );
     1072
     1073                // Other plugins can filter which actions are shown
     1074                $actions = apply_filters( 'bp_activity_admin_comment_row_actions', array_filter( $actions ), $item );
     1075
     1076                // Get group name and avatar
     1077                $avatar  = bp_core_fetch_avatar( array(
     1078                        'item_id'    => $item['id'],
     1079                        'object'     => 'group',
     1080                        'type'       => 'thumb',
     1081                        'avatar_dir' => 'group-avatars',
     1082                        'alt'        => sprintf( __( 'Group logo of %s', 'buddypress' ), $item['name'] ),
     1083                        'width'      => '32',
     1084                        'height'     => '32',
     1085                        'title'      => $item['name']
     1086                ) );
     1087
     1088                $content = apply_filters_ref_array( 'bp_get_group_name', array( $item['name'], $item ) );
     1089
     1090                echo $avatar . ' ' . $content . ' ' . $this->row_actions( $actions );
     1091        }
     1092
     1093        /**
     1094         * Description column
     1095         *
     1096         * @since 1.7
     1097         */
     1098        function column_description( $item ) {
     1099                echo apply_filters_ref_array( 'bp_get_group_description', array( $item['description'], $item ) );
     1100        }
     1101}
     1102
     1103?>
  • bp-groups/bp-groups-loader.php

    diff --git bp-groups/bp-groups-loader.php bp-groups/bp-groups-loader.php
    index d1a9368..1d36c7b 100644
    class BP_Groups_Component extends BP_Component { 
    9898                        'classes',
    9999                        'widgets',
    100100                        'activity',
     101                        'admin',
    101102                        'template',
    102103                        'buddybar',
    103104                        'adminbar',