Skip to:
Content

BuddyPress.org

Ticket #5328: 5328.02.diff

File 5328.02.diff, 26.9 KB (added by imath, 11 years ago)
  • bp-activity/bp-activity-classes.php

    diff --git bp-activity/bp-activity-classes.php bp-activity/bp-activity-classes.php
    index 1d506c3..200eec8 100644
    class BP_Activity_Activity { 
    11141114
    11151115                $filter_sql = array();
    11161116
    1117                 if ( !empty( $filter_array['user_id'] ) ) {
     1117                if ( ! empty( $filter_array['user_id'] ) ) {
    11181118                        $user_sql = BP_Activity_Activity::get_in_operator_sql( 'a.user_id', $filter_array['user_id'] );
    1119                         if ( !empty( $user_sql ) )
     1119                        if ( ! empty( $user_sql ) )
    11201120                                $filter_sql[] = $user_sql;
    11211121                }
    11221122
    1123                 if ( !empty( $filter_array['object'] ) ) {
     1123                if ( ! empty( $filter_array['object'] ) ) {
    11241124                        $object_sql = BP_Activity_Activity::get_in_operator_sql( 'a.component', $filter_array['object'] );
    1125                         if ( !empty( $object_sql ) )
     1125                        if ( ! empty( $object_sql ) )
    11261126                                $filter_sql[] = $object_sql;
    11271127                }
    11281128
    1129                 if ( !empty( $filter_array['action'] ) ) {
     1129                if ( ! empty( $filter_array['action'] ) ) {
    11301130                        $action_sql = BP_Activity_Activity::get_in_operator_sql( 'a.type', $filter_array['action'] );
    11311131                        if ( ! empty( $action_sql ) )
    11321132                                $filter_sql[] = $action_sql;
    11331133                }
    11341134
    1135                 if ( !empty( $filter_array['primary_id'] ) ) {
     1135                if ( ! empty( $filter_array['primary_id'] ) ) {
    11361136                        $pid_sql = BP_Activity_Activity::get_in_operator_sql( 'a.item_id', $filter_array['primary_id'] );
    1137                         if ( !empty( $pid_sql ) )
     1137                        if ( ! empty( $pid_sql ) )
    11381138                                $filter_sql[] = $pid_sql;
    11391139                }
    11401140
    1141                 if ( !empty( $filter_array['secondary_id'] ) ) {
     1141                if ( ! empty( $filter_array['secondary_id'] ) ) {
    11421142                        $sid_sql = BP_Activity_Activity::get_in_operator_sql( 'a.secondary_item_id', $filter_array['secondary_id'] );
    1143                         if ( !empty( $sid_sql ) )
     1143                        if ( ! empty( $sid_sql ) )
    11441144                                $filter_sql[] = $sid_sql;
    11451145                }
    11461146
     1147                if ( ! empty( $filter_array['id'] ) ) {
     1148                        $sid_sql = absint( $filter_array['id'] );
     1149                        $filter_sql[] = "a.id > {$sid_sql}";
     1150                }
     1151
    11471152                if ( empty( $filter_sql ) )
    11481153                        return false;
    11491154
    class BP_Activity_Activity { 
    11541159         * Get the date/time of last recorded activity.
    11551160         *
    11561161         * @since BuddyPress (1.2)
    1157          *
     1162         *     
     1163         * @param array $args
    11581164         * @return string ISO timestamp.
    11591165         */
    1160         public static function get_last_updated() {
     1166        public static function get_last_updated( $args = array() ) {
    11611167                global $bp, $wpdb;
    11621168
    1163                 return $wpdb->get_var( "SELECT date_recorded FROM {$bp->activity->table_name} ORDER BY date_recorded DESC LIMIT 1" );
     1169                $r = bp_parse_args( $args,
     1170                        array(
     1171                                'field_name'       => 'date_recorded',
     1172                                'search_terms'     => false,
     1173                                'filter'           => false,      // See self::get_filter_sql()
     1174                                'display_comments' => 'threaded', // or stream or false
     1175                                'show_hidden'      => false,      // Show items marked hide_sitewide
     1176                        ),
     1177                        'activity_last_updated'
     1178                );
     1179                extract( $r );
     1180
     1181                if ( 'id' != $field_name ) {
     1182                        return $wpdb->get_var( "SELECT date_recorded FROM {$bp->activity->table_name} ORDER BY date_recorded DESC LIMIT 1" );
     1183                }
     1184
     1185                $select_sql = "SELECT a.id FROM {$bp->activity->table_name} a";
     1186                $order_sql  = "ORDER BY a.id DESC";
     1187                $limit_sql  = "LIMIT 1";
     1188                $exclude_types = array();
     1189
     1190                $where_conditions['spam_sql'] = 'a.is_spam = 0';
     1191
     1192                // Searching
     1193                if ( $search_terms ) {
     1194                        $search_terms = esc_sql( $search_terms );
     1195                        $where_conditions['search_sql'] = "a.content LIKE '%%" . esc_sql( like_escape( $search_terms ) ) . "%%'";
     1196                }
     1197                // Filtering
     1198                if ( $filter && $filter_sql = BP_Activity_Activity::get_filter_sql( $filter ) )
     1199                        $where_conditions['filter_sql'] = $filter_sql;
     1200
     1201                if ( ! $show_hidden )
     1202                        $where_conditions['hidden_sql'] = "a.hide_sitewide = 0";
     1203
     1204                if ( empty( $filter_array['action'] ) )
     1205                        $exclude_types[] = 'last_activity';
     1206
     1207                if ( false === $display_comments || 'threaded' === $display_comments )
     1208                        $exclude_types[] = 'activity_comment';
     1209
     1210                if ( ! empty( $exclude_types ) && $excluded_type = BP_Activity_Activity::get_in_operator_sql( 'a.type', $exclude_types ) ) {
     1211                        $excluded_type = str_replace( 'a.type IN', 'a.type NOT IN', $excluded_type );
     1212                        $where_conditions[] = $excluded_type;
     1213                }       
     1214
     1215                // Filter the where conditions
     1216                $where_conditions = apply_filters( 'bp_activity_get_last_updated_recorded_where', $where_conditions, $r );
     1217
     1218                // Join the where conditions together
     1219                $where_sql = 'WHERE ' . join( ' AND ', $where_conditions );
     1220
     1221                $last_updated = $wpdb->get_var( apply_filters( 'bp_activity_get_last_updated_sql', "{$select_sql} {$where_sql} {$order_sql} {$limit_sql}", $select_sql, $where_sql, $order_sql ) );
     1222
     1223                return absint( $last_updated );
    11641224        }
    11651225
    11661226        /**
  • bp-activity/bp-activity-filters.php

    diff --git bp-activity/bp-activity-filters.php bp-activity/bp-activity-filters.php
    index 603924f..ccbf9ab 100644
    function bp_activity_truncate_entry( $text ) { 
    376376
    377377        return apply_filters( 'bp_activity_truncate_entry', $excerpt, $text, $append_text );
    378378}
     379
     380/**
     381 * Include extra javascript dependencies for activity component.
     382 *
     383 * @since BuddyPress (2.0.0)
     384 *
     385 * @uses bp_activity_do_heartbeat() to check if heartbeat is required
     386 *
     387 * @param array $js_handles The original dependencies.
     388 * @return array $js_handles The new dependencies.
     389 */
     390function bp_activity_get_js_dependencies( $js_handles = array() ) {
     391        if ( bp_activity_do_heartbeat() ) {
     392                $js_handles[] = 'heartbeat';
     393        }
     394
     395        return $js_handles;
     396}
     397add_filter( 'bp_core_get_js_dependencies', 'bp_activity_get_js_dependencies', 10, 1 );
     398
     399/**
     400 * Adds a just-posted class to avoid some mess in activity ajax pagination
     401 *
     402 * @since  BuddyPress (2.0.0)
     403 * @param  string $classes
     404 * @return string $classes
     405 */
     406function bp_activity_newest_class( $classes = '' ) {
     407        $new_update_id = buddypress()->activity->new_update_id;
     408       
     409        if ( $new_update_id == bp_get_activity_id() )
     410                $classes .= ' new-update';
     411       
     412        $classes .= ' just-posted';
     413        return $classes;
     414}
     415
     416/**
     417 * Uses WordPress Heartbeat API to check for latest activity update in BP Activity Admin screen
     418 *
     419 * @since BuddyPress (2.0.0)
     420 *
     421 * @uses  bp_activity_get_last_updated() to get the recorded date of the last activity
     422 * @param  array  $response
     423 * @param  array  $data
     424 * @return array  $response
     425 */
     426function bp_activity_heartbeat_last_recorded( $response = array(), $data = array() ) {
     427        $bp = buddypress();
     428
     429        if ( isset( $data['bp_last_activity_update'] ) && 'bp_activity_heartbeat_front' == $data['bp_last_activity_update']['id'] ) {
     430                $filter = array();
     431                $show_hidden = false;
     432
     433                if ( ! empty( $data['bp_last_activity_update']['action'] ) && '-1' != $data['bp_last_activity_update']['action'] )
     434                        $filter['action'] = $data['bp_last_activity_update']['action'];
     435
     436                if ( ! empty( $data['bp_last_activity_update']['scope'] ) && 'all' != $data['bp_last_activity_update']['scope'] )
     437                        $filter['object'] = $data['bp_last_activity_update']['scope'];
     438
     439                // Group filtering
     440                if ( ! empty( $bp->groups->current_group ) ) {
     441                        $filter['object'] = $bp->groups->id;
     442                        $filter['primary_id'] = $bp->groups->current_group->id;
     443
     444                        if ( ( 'public' != $bp->groups->current_group->status ) && ( groups_is_user_member( bp_loggedin_user_id(), $bp->groups->current_group->id ) || bp_current_user_can( 'bp_moderate' ) ) )
     445                                $show_hidden = true;
     446                }
     447
     448                $response['last_id_recorded'] = bp_activity_get_last_updated(
     449                        array(
     450                                'field_name'   => 'id',
     451                                'search_terms' => $data['bp_last_activity_update']['search'],
     452                                'filter'       => $filter,
     453                                'show_hidden'  => $show_hidden
     454                ) );
     455        }
     456
     457        return $response;
     458}
     459add_filter( 'heartbeat_received', 'bp_activity_heartbeat_last_recorded', 10, 2 );
     460add_filter( 'heartbeat_nopriv_received', 'bp_activity_heartbeat_last_recorded', 10, 2 );
     461
     462/**
     463 * Changes the pulse of the WP HeartBeat API where needed
     464 *
     465 * The filter should be initialized elsewhere to avoid the long check
     466 *
     467 * @since  BuddyPress (2.0.0)
     468 *
     469 * @param  array  $settings HeartBeat settings
     470 * @return array  HeartBeat settings
     471 */
     472function bp_activity_heartbeat_settings( $settings = array() ) {
     473        if ( bp_activity_do_heartbeat() )
     474                $settings['interval'] = apply_filters( 'bp_activity_heartbeat_pulse', 15 );
     475
     476        return $settings;
     477}
     478add_filter( 'heartbeat_settings', 'bp_activity_heartbeat_settings', 10, 1 );
  • bp-activity/bp-activity-functions.php

    diff --git bp-activity/bp-activity-functions.php bp-activity/bp-activity-functions.php
    index 2a69a5c..1fd37d6 100644
    function bp_activity_check_exists_by_content( $content ) { 
    508508 * @uses BP_Activity_Activity::get_last_updated() {@link BP_Activity_Activity}
    509509 * @uses apply_filters() To call the 'bp_activity_get_last_updated' hook.
    510510 *
     511 * @param array $args
    511512 * @return string Date last updated.
    512513 */
    513 function bp_activity_get_last_updated() {
    514         return apply_filters( 'bp_activity_get_last_updated', BP_Activity_Activity::get_last_updated() );
     514function bp_activity_get_last_updated( $args = array() ) {
     515        return apply_filters( 'bp_activity_get_last_updated', BP_Activity_Activity::get_last_updated( $args ) );
    515516}
    516517
    517518/**
    function bp_embed_activity_cache( $cache, $id, $cachekey ) { 
    18451846function bp_embed_activity_save_cache( $cache, $cachekey, $id ) {
    18461847        bp_activity_update_meta( $id, $cachekey, $cache );
    18471848}
     1849
     1850
     1851/**
     1852 * Should we use HeartBeat to refresh activities every 15 s.
     1853 *
     1854 * @since BuddyPress (2.0.0)
     1855 *
     1856 * @uses bp_is_activity_heartbeat_active() to check if heatbeat setting is on
     1857 * @uses bp_is_activity_directory() to check if the current page is the activity directory
     1858 * @uses bp_is_active() to check if the group component is active
     1859 * @uses bp_is_group_activity() to check if on a single group, the current page is the group activities
     1860 * @uses bp_is_group_home() to check if the current page is a single group home page
     1861 * @return bool True on success, false on failure.
     1862 */
     1863function bp_activity_do_heartbeat() {
     1864        $retval = false;
     1865
     1866        if ( ! bp_is_activity_heartbeat_active() )
     1867                return $retval;
     1868
     1869        if ( bp_is_activity_directory() )
     1870                $retval = true;
     1871
     1872        if ( bp_is_active( 'groups') ) {
     1873                // If no custom front, then activities are loaded in group's home
     1874                $has_custom_front = bp_locate_template( array( 'groups/single/front.php' ), false, true );
     1875
     1876                if ( bp_is_group_activity() || ( ! $has_custom_front && bp_is_group_home() ) )
     1877                        $retval = true;
     1878        }
     1879
     1880        return $retval;
     1881}
  • bp-activity/bp-activity-screens.php

    diff --git bp-activity/bp-activity-screens.php bp-activity/bp-activity-screens.php
    index 787e247..cd0b679 100644
    if ( !defined( 'ABSPATH' ) ) exit; 
    2828 * @uses apply_filters() To call the 'bp_activity_screen_index' hook.
    2929 */
    3030function bp_activity_screen_index() {
    31         if ( !bp_displayed_user_id() && bp_is_activity_component() && !bp_current_action() ) {
     31        if ( bp_is_activity_directory() ) {
    3232                bp_update_is_directory( true, 'activity' );
    3333
    3434                do_action( 'bp_activity_screen_index' );
  • bp-activity/bp-activity-template.php

    diff --git bp-activity/bp-activity-template.php bp-activity/bp-activity-template.php
    index c574302..3b50620 100644
    function bp_has_activities( $args = '' ) { 
    515515                'action'           => false,        // action to filter on e.g. activity_update, new_forum_post, profile_updated
    516516                'primary_id'       => $primary_id,  // object ID to filter on e.g. a group_id or forum_id or blog_id etc.
    517517                'secondary_id'     => false,        // secondary object ID to filter on e.g. a post_id
     518                'id'               => false,        // activity id to get newer updates
    518519
    519520                'meta_query'       => false,        // filter on activity meta. See WP_Meta_Query for format
    520521
    function bp_has_activities( $args = '' ) { 
    532533                $display_comments = false;
    533534        }
    534535
     536        // reset pagination to get all new activities
     537        if ( ! empty( $id ) )
     538                $page = 0;
     539
    535540        if ( empty( $search_terms ) && ! empty( $_REQUEST['s'] ) )
    536541                $search_terms = $_REQUEST['s'];
    537542
    function bp_has_activities( $args = '' ) { 
    603608        // into bp-custom.php or your theme's functions.php
    604609        if ( isset( $_GET['afilter'] ) && apply_filters( 'bp_activity_enable_afilter_support', false ) )
    605610                $filter = array( 'object' => $_GET['afilter'] );
    606         else if ( !empty( $user_id ) || !empty( $object ) || !empty( $action ) || !empty( $primary_id ) || !empty( $secondary_id ) )
    607                 $filter = array( 'user_id' => $user_id, 'object' => $object, 'action' => $action, 'primary_id' => $primary_id, 'secondary_id' => $secondary_id );
     611        else if ( ! empty( $user_id ) || ! empty( $object ) || ! empty( $action ) || ! empty( $primary_id ) || ! empty( $secondary_id ) || ! empty( $id ) )
     612                $filter = array( 'user_id' => $user_id, 'object' => $object, 'action' => $action, 'primary_id' => $primary_id, 'secondary_id' => $secondary_id, 'id' => $id );
    608613        else
    609614                $filter = false;
    610615
    function bp_activity_pagination_links() { 
    737742function bp_activity_has_more_items() {
    738743        global $activities_template;
    739744
    740         $remaining_pages = floor( ( $activities_template->total_activity_count - 1 ) / ( $activities_template->pag_num * $activities_template->pag_page ) );
     745        $remaining_pages = 0;
     746
     747        if ( ! empty( $activities_template->pag_page ) ) {
     748                $remaining_pages = floor( ( $activities_template->total_activity_count - 1 ) / ( $activities_template->pag_num * $activities_template->pag_page ) );
     749        }
     750
    741751        $has_more_items  = (int) $remaining_pages ? true : false;
    742752
    743753        return apply_filters( 'bp_activity_has_more_items', $has_more_items );
  • bp-core/admin/bp-core-settings.php

    diff --git bp-core/admin/bp-core-settings.php bp-core/admin/bp-core-settings.php
    index 01ed8c5..f9901eb 100644
    function bp_admin_setting_callback_blogforum_comments() { 
    104104}
    105105
    106106/**
     107 * Allow Heartbeat to refresh activity stream
     108 *
     109 * @since BuddyPress (2.0.0)
     110 */
     111function bp_admin_setting_callback_heartbeat() {
     112?>
     113
     114        <input id="_bp_enable_heartbeat_refresh" name="_bp_enable_heartbeat_refresh" type="checkbox" value="1" <?php checked( bp_is_activity_heartbeat_active( false ) ); ?> />
     115        <label for="_bp_enable_heartbeat_refresh"><?php _e( 'Allow activity stream to be refreshed every 15 seconds', 'buddypress' ); ?></label>
     116
     117<?php
     118}
     119
     120/**
    107121 * Sanitization for _bp_force_buddyvar
    108122 *
    109123 * If upgraded to 1.6 and you chose to keep the BuddyBar, a checkbox asks if you want to switch to
  • bp-core/bp-core-admin.php

    diff --git bp-core/bp-core-admin.php bp-core/bp-core-admin.php
    index 9e45be9..4020355 100644
    class BP_Admin { 
    330330                        add_settings_field( 'bp-disable-blogforum-comments', __( 'Blog &amp; Forum Comments', 'buddypress' ), 'bp_admin_setting_callback_blogforum_comments', 'buddypress', 'bp_activity' );
    331331                        register_setting( 'buddypress', 'bp-disable-blogforum-comments', 'bp_admin_sanitize_callback_blogforum_comments' );
    332332
     333                        // Activity Heartbeat refresh
     334                        add_settings_field( '_bp_enable_heartbeat_refresh', __( 'Activity auto-refresh', 'buddypress' ), 'bp_admin_setting_callback_heartbeat', 'buddypress', 'bp_activity' );
     335                        register_setting( 'buddypress', '_bp_enable_heartbeat_refresh', 'intval' );
     336
    333337                        // Allow activity akismet
    334338                        if ( is_plugin_active( 'akismet/akismet.php' ) && defined( 'AKISMET_VERSION' ) ) {
    335339                                add_settings_field( '_bp_enable_akismet', __( 'Akismet',          'buddypress' ), 'bp_admin_setting_callback_activity_akismet', 'buddypress', 'bp_activity' );
  • bp-core/bp-core-functions.php

    diff --git bp-core/bp-core-functions.php bp-core/bp-core-functions.php
    index ccea74b..bfa783f 100644
    function bp_nav_menu_get_item_url( $slug ) { 
    18521852
    18531853        return $nav_item_url;
    18541854}
     1855
     1856/**
     1857 * Get the javascript dependencies for buddypress.js
     1858 *
     1859 * @since BuddyPress (2.0.0)
     1860 *
     1861 * @uses apply_filters() to allow other component to load extra dependencies
     1862 * @return array the javascript dependencies.
     1863 */
     1864function bp_core_get_js_dependencies() {
     1865        return apply_filters( 'bp_core_get_js_dependencies', array( 'jquery' ) );
     1866}
     1867
  • bp-core/bp-core-options.php

    diff --git bp-core/bp-core-options.php bp-core/bp-core-options.php
    index 8225fa2..f658141 100644
    function bp_is_akismet_active( $default = true ) { 
    559559}
    560560
    561561/**
     562 * Check whether Activity Heartbeat refresh is enabled.
     563 *
     564 * @since BuddyPress (2.0.0)
     565 *
     566 * @uses bp_get_option() To get the Heartbeat option.
     567 *
     568 * @param bool $default Optional. Fallback value if not found in the database.
     569 *        Default: false.
     570 * @return bool True if Heartbeat refresh is enabled, otherwise false.
     571 */
     572function bp_is_activity_heartbeat_active( $default = false ) {
     573        return (bool) apply_filters( 'bp_is_activity_heartbeat_active', (bool) bp_get_option( '_bp_enable_heartbeat_refresh', $default ) );
     574}
     575
     576/**
    562577 * Get the current theme package ID.
    563578 *
    564579 * @since BuddyPress (1.7.0)
  • bp-core/bp-core-template.php

    diff --git bp-core/bp-core-template.php bp-core/bp-core-template.php
    index 51c1b38..c25a6d5 100644
    function bp_is_current_component_core() { 
    14911491/** Activity ******************************************************************/
    14921492
    14931493/**
     1494 * Is the current page the activity directory ?
     1495 *
     1496 * @since BuddyPress (2.0.0)
     1497 *
     1498 * @return True if the current page is the activity directory.
     1499 */
     1500function bp_is_activity_directory() {
     1501        if( ! bp_displayed_user_id() && bp_is_activity_component() && ! bp_current_action() )
     1502                return true;
     1503
     1504        return false;
     1505}
     1506
     1507/**
    14941508 * Is the current page a single activity item permalink?
    14951509 *
    14961510 * @return True if the current page is a single activity item permalink.
  • bp-templates/bp-legacy/buddypress-functions.php

    diff --git bp-templates/bp-legacy/buddypress-functions.php bp-templates/bp-legacy/buddypress-functions.php
    index 0cb3153..1613cf8 100644
    class BP_Legacy extends BP_Theme_Compat { 
    145145
    146146                        // Activity
    147147                        'activity_get_older_updates'  => 'bp_legacy_theme_activity_template_loader',
     148                        'activity_get_newer_updates'  => 'bp_legacy_theme_activity_template_loader',
    148149                        'activity_mark_fav'           => 'bp_legacy_theme_mark_activity_favorite',
    149150                        'activity_mark_unfav'         => 'bp_legacy_theme_unmark_activity_favorite',
    150151                        'activity_widget_filter'      => 'bp_legacy_theme_activity_template_loader',
    class BP_Legacy extends BP_Theme_Compat { 
    223224                // Enqueue the global JS, if found - AJAX will not work
    224225                // without it
    225226                if ( isset( $asset['location'], $asset['handle'] ) ) {
    226                         wp_enqueue_script( $asset['handle'], $asset['location'], array( 'jquery' ), $this->version );
     227                        wp_enqueue_script( $asset['handle'], $asset['location'], bp_core_get_js_dependencies(), $this->version );
    227228                }
    228229
    229230                // Add words that we need to use in JS to the end of the page
    class BP_Legacy extends BP_Theme_Compat { 
    242243                        'show_x_comments'     => __( 'Show all %d comments', 'buddypress' ),
    243244                        'unsaved_changes'     => __( 'Your profile has unsaved changes. If you leave the page, the changes will be lost.', 'buddypress' ),
    244245                        'view'                => __( 'View', 'buddypress' ),
     246                        'newest'              => __( 'Load Newest', 'buddypress' ),
    245247                );
    246248                wp_localize_script( $asset['handle'], 'BP_DTheme', $params );
    247249
    function bp_legacy_theme_ajax_querystring( $query_string, $object ) { 
    480482                $qs[] = 'exclude=' . implode( ',', $just_posted );
    481483        }
    482484
     485        // to get newest activities
     486        if ( ! empty( $_POST['id'] ) )
     487                $qs[] = 'id=' . intval( $_POST['id'] );
     488
    483489        $object_search_text = bp_get_search_default_text( $object );
    484490        if ( ! empty( $_POST['search_terms'] ) && $object_search_text != $_POST['search_terms'] && 'false' != $_POST['search_terms'] && 'undefined' != $_POST['search_terms'] )
    485491                $qs[] = 'search_terms=' . $_POST['search_terms'];
    function bp_legacy_theme_activity_template_loader() { 
    594600                        break;
    595601        }
    596602
     603        // are we loading the newest updates ?
     604        $is_newest_request = ! empty( $_POST['action'] ) && 'activity_get_newer_updates' == $_POST['action'];
     605
     606        if ( $is_newest_request )
     607                add_filter( 'bp_get_activity_css_class', 'bp_activity_newest_class', 10, 1 );
     608
    597609        // Buffer the loop in the template to a var for JS to spit out.
    598610        ob_start();
    599611        bp_get_template_part( 'activity/activity-loop' );
    function bp_legacy_theme_activity_template_loader() { 
    601613        $result['feed_url'] = apply_filters( 'bp_legacy_theme_activity_feed_url', $feed_url, $scope );
    602614        ob_end_clean();
    603615
     616        if ( $is_newest_request )
     617                remove_filter( 'bp_get_activity_css_class', 'bp_activity_newest_class', 10, 1 );
     618
    604619        exit( json_encode( $result ) );
    605620}
    606621
    function bp_legacy_theme_activity_template_loader() { 
    611626 * @since BuddyPress (1.2)
    612627 */
    613628function bp_legacy_theme_post_update() {
     629        $bp = buddypress();
     630
    614631        // Bail if not a POST action
    615632        if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) )
    616633                return;
    function bp_legacy_theme_post_update() { 
    639656        if ( empty( $activity_id ) )
    640657                exit( '-1<div id="message" class="error"><p>' . __( 'There was a problem posting your update, please try again.', 'buddypress' ) . '</p></div>' );
    641658
    642         if ( bp_has_activities ( 'include=' . $activity_id ) ) {
     659        if ( ! empty( $_POST['id'] ) && $last_id = absint( $_POST['id'] ) ) {
     660                $activity_args = array( 'id' => $last_id );
     661                $bp->activity->new_update_id = $activity_id;
     662                add_filter( 'bp_get_activity_css_class', 'bp_activity_newest_class', 10, 1 );
     663        } else {
     664                $activity_args = array( 'include' => $activity_id );
     665        }
     666       
     667        if ( bp_has_activities ( $activity_args ) ) {
    643668                while ( bp_activities() ) {
    644669                        bp_the_activity();
    645670                        bp_get_template_part( 'activity/entry' );
    646671                }
    647672        }
    648673
     674        if ( ! empty( $last_id ) ) {
     675                remove_filter( 'bp_get_activity_css_class', 'bp_activity_newest_class', 10, 1 );
     676        }
     677       
    649678        exit;
    650679}
    651680
  • bp-templates/bp-legacy/css/buddypress.css

    diff --git bp-templates/bp-legacy/css/buddypress.css bp-templates/bp-legacy/css/buddypress.css
    index 81dd03f..e343077 100644
    body.activity-permalink #buddypress .activity-content blockquote { 
    290290        margin-left: 1em;
    291291        white-space: nowrap;
    292292}
    293 #buddypress .activity-list li.load-more {
     293#buddypress .activity-list li.load-more,
     294#buddypress .activity-list li.load-newest {
    294295        background: #f0f0f0;
    295296        font-size: 110%;
    296297        margin: 15px 0;
    297298        padding: 10px 15px;
    298299        text-align: center;
    299300}
    300 #buddypress .activity-list li.load-more a {
     301#buddypress .activity-list li.load-more a,
     302#buddypress .activity-list li.load-newest a {
    301303        color: #4D4D4D;
    302304}
    303305
  • bp-templates/bp-legacy/js/buddypress.js

    diff --git bp-templates/bp-legacy/js/buddypress.js bp-templates/bp-legacy/js/buddypress.js
    index 350193e..f0b9e2d 100644
    jq(document).ready( function() { 
    5353                if ( $whats_new_form.hasClass("submitted") ) {
    5454                        $whats_new_form.removeClass("submitted");       
    5555                }
     56
     57                /* If the scope is not all, the activity update can temporarly be displayed
     58                   in the wrong tab which can be annoying with the load newest feature */
     59                if ( jq( '#activity-all' ).length  ) {
     60
     61                        if ( ! jq( '#activity-all' ).hasClass( 'selected' ) ) {
     62                                // reset to everyting
     63                                jq( '#activity-filter-select select' ).val( '-1' );
     64                                jq( '#activity-all a' ).trigger( "click" );
     65                        } else if ( '-1' != jq( '#activity-filter-select select' ).val() ) {
     66                                jq( '#activity-filter-select select' ).val( '-1' );
     67                                jq( '#activity-filter-select select' ).trigger( 'change' );
     68                        }
     69                }
    5670        });
    5771
    5872        /* On blur, shrink if it's empty */
    jq(document).ready( function() { 
    7185
    7286        /* New posts */
    7387        jq("#aw-whats-new-submit").on( 'click', function() {
    74                 var button = jq(this);
     88                var last_displayed_id, button = jq(this);
    7589                var form = button.closest("form#whats-new-form");
    7690
    7791                form.children().each( function() {
    jq(document).ready( function() { 
    89103                var object = '';
    90104                var item_id = jq("#whats-new-post-in").val();
    91105                var content = jq("#whats-new").val();
     106                var firstrow = jq( '#buddypress ul.activity-list li' ).first();
     107
     108        if ( firstrow.hasClass( 'load-newest' ) ) {
     109                last_displayed_id = firstrow.next().prop( 'id' ).replace( 'activity-','' );
     110        } else {
     111                last_displayed_id = firstrow.prop( 'id' ).replace( 'activity-','' );
     112        }
    92113
    93114                /* Set object for non-profile posts */
    94115                if ( item_id > 0 ) {
    jq(document).ready( function() { 
    102123                        'content': content,
    103124                        'object': object,
    104125                        'item_id': item_id,
     126                        'id': last_displayed_id,
    105127                        '_bp_as_nonce': jq('#_bp_as_nonce').val() || ''
    106128                },
    107129                function(response) {
    jq(document).ready( function() { 
    123145                                        jq("div.activity").append( '<ul id="activity-stream" class="activity-list item-list">' );
    124146                                }
    125147
     148                                if ( firstrow.hasClass( 'load-newest' ) )
     149                                        firstrow.remove();
     150
    126151                                jq("#activity-stream").prepend(response);
    127                                 jq("#activity-stream li:first").addClass('new-update just-posted');
     152
     153                                if ( ! last_displayed_id )
     154                                        jq("#activity-stream li:first").addClass('new-update just-posted');
    128155
    129156                                if ( 0 != jq("#latest-update").length ) {
    130157                                        var l = jq("#activity-stream li.new-update .activity-content .activity-inner p").html();
    jq(document).ready( function() { 
    351378
    352379                        return false;
    353380                }
     381
     382                /* Load newest updates at the top of the list */
     383                if ( target.parent().hasClass('load-newest') ) {
     384
     385                        event.preventDefault();
     386                        last_displayed_id = target.parent().next().prop( 'id' ).replace( 'activity-','' );
     387
     388                        jq( '#buddypress li.load-newest' ).addClass( 'loading' );
     389
     390                        jq.post( ajaxurl, {
     391                                action: 'activity_get_newer_updates',
     392                                'cookie': bp_get_cookies(),
     393                                'page':-1,
     394                                'id': last_displayed_id
     395                        },
     396                        function(response)
     397                        {
     398                                jq( '#buddypress li.load-newest' ).removeClass( 'loading' );
     399                                jq( '#buddypress ul.activity-list' ).prepend( response.contents );
     400
     401                                target.parent().hide();
     402                        }, 'json' );
     403                }
    354404        });
    355405
    356406        // Activity "Read More" links
    jq(document).ready( function() { 
    13451395        /* if js is enabled then replace the no-js class by a js one */
    13461396        if( jq('body').hasClass('no-js') )
    13471397                jq('body').attr('class', jq('body').attr('class').replace( /no-js/,'js' ) );
     1398
     1399        /* Activity HeartBeat */
     1400        jq( document ).on( 'heartbeat-send', function( e, data ) {
     1401        data['bp_last_activity_update'] = {
     1402                'id'    : 'bp_activity_heartbeat_front',
     1403                'action': jq.cookie('bp-activity-filter'),
     1404                'search'   : '',
     1405                'scope' : jq.cookie('bp-activity-scope')
     1406        }
     1407    });
     1408
     1409        jq(document).on( 'heartbeat-tick', function(e, data) {
     1410
     1411                 // Only proceed if we have a last recorded date
     1412        if ( ! data['last_id_recorded'] )
     1413            return;
     1414
     1415        // the first row is the oldest activity
     1416        var firstrow = jq( '#buddypress ul.activity-list li' ).first();
     1417
     1418        if ( firstrow.hasClass( 'load-newest' ) )
     1419                return;
     1420
     1421        var last_displayed_id = firstrow.prop( 'id' ).replace( 'activity-','' );
     1422       
     1423        if ( Number( data['last_id_recorded'] ) > Number( last_displayed_id ) ) {
     1424                jq( '#buddypress ul.activity-list' ).prepend( '<li class="load-newest"><a href="#newest">' + BP_DTheme.newest + '</a></li>' );
     1425        }
     1426
     1427    });
    13481428               
    13491429});
    13501430