/* jshint browser: true */
/* global BP_Nouveau */
/* @since 3.0.0 */
/* @version 10.0.0 */
window.bp = window.bp || {};
( function( bp, $ ) {
// Bail if not set
if ( typeof BP_Nouveau === 'undefined' ) {
return;
}
bp.Nouveau = bp.Nouveau || {};
/**
* [Activity description]
* @type {Object}
*/
bp.Nouveau.Activity = {
/**
* [start description]
* @return {[type]} [description]
*/
start: function() {
this.setupGlobals();
// Listen to events ("Add hooks!")
this.addListeners();
},
/**
* [setupGlobals description]
* @return {[type]} [description]
*/
setupGlobals: function() {
// Init just posted activities
this.just_posted = [];
// Init current page
this.current_page = 1;
// Init mentions count
this.mentions_count = Number( $( bp.Nouveau.objectNavParent + ' [data-bp-scope="mentions"]' ).find( 'a span' ).html() ) || 0;
// HeartBeat Globals
this.heartbeat_data = {
newest : '',
highlights : {},
last_recorded : 0,
first_recorded : 0,
document_title : $( document ).prop( 'title' )
};
},
/**
* [addListeners description]
*/
addListeners: function() {
// HeartBeat listeners
$( '#buddypress' ).on( 'bp_heartbeat_send', this.heartbeatSend.bind( this ) );
$( '#buddypress' ).on( 'bp_heartbeat_tick', this.heartbeatTick.bind( this ) );
// Inject Activities
$( '#buddypress [data-bp-list="activity"]' ).on( 'click', 'li.load-newest, li.load-more', this.injectActivities.bind( this ) );
$( '#buddypress [data-bp-list]' ).on( 'bp_ajax_request', this.updateRssLink );
// Hightlight new activities & clean up the stream
$( '#buddypress' ).on( 'bp_ajax_request', '[data-bp-list="activity"]', this.scopeLoaded.bind( this ) );
// Activity comments effect
$( '#buddypress [data-bp-list="activity"]' ).on( 'bp_ajax_append', this.hideComments );
$( '#buddypress [data-bp-list="activity"]' ).on( 'click', '.show-all', this.showComments );
// Activity actions
$( '#buddypress [data-bp-list="activity"]' ).on( 'click', '.activity-item', bp.Nouveau, this.activityActions );
$( document ).on( 'keydown', this.commentFormAction );
},
/**
* [heartbeatSend description]
* @param {[type]} event [description]
* @param {[type]} data [description]
* @return {[type]} [description]
*/
heartbeatSend: function( event, data ) {
this.heartbeat_data.first_recorded = $( '#buddypress [data-bp-list] [data-bp-activity-id]' ).first().data( 'bp-timestamp' ) || 0;
if ( 0 === this.heartbeat_data.last_recorded || this.heartbeat_data.first_recorded > this.heartbeat_data.last_recorded ) {
this.heartbeat_data.last_recorded = this.heartbeat_data.first_recorded;
}
data.bp_activity_last_recorded = this.heartbeat_data.last_recorded;
if ( $( '#buddypress .dir-search input[type=search]' ).length ) {
data.bp_activity_last_recorded_search_terms = $( '#buddypress .dir-search input[type=search]' ).val();
}
$.extend( data, { bp_heartbeat: bp.Nouveau.getStorage( 'bp-activity' ) } );
},
/**
* [heartbeatTick description]
* @param {[type]} event [description]
* @param {[type]} data [description]
* @return {[type]} [description]
*/
heartbeatTick: function( event, data ) {
var newest_activities_count, newest_activities, objects = bp.Nouveau.objects,
scope = bp.Nouveau.getStorage( 'bp-activity', 'scope' ), self = this;
// Only proceed if we have newest activities
if ( undefined === data || ! data.bp_activity_newest_activities ) {
return;
}
this.heartbeat_data.newest = $.trim( data.bp_activity_newest_activities.activities ) + this.heartbeat_data.newest;
this.heartbeat_data.last_recorded = Number( data.bp_activity_newest_activities.last_recorded );
// Parse activities
newest_activities = $( this.heartbeat_data.newest ).filter( '.activity-item' );
// Count them
newest_activities_count = Number( newest_activities.length );
/**
* It's not a regular object but we need it!
* so let's add it temporarly..
*/
objects.push( 'mentions' );
/**
* On the All Members tab, we need to know what these activities are about
* in order to update all the other tabs dynamic span
*/
if ( 'all' === scope ) {
$.each( newest_activities, function( a, activity ) {
activity = $( activity );
$.each( objects, function( o, object ) {
if ( -1 !== $.inArray( 'bp-my-' + object, activity.get( 0 ).classList ) ) {
if ( undefined === self.heartbeat_data.highlights[ object ] ) {
self.heartbeat_data.highlights[ object ] = [ activity.data( 'bp-activity-id' ) ];
} else if ( -1 === $.inArray( activity.data( 'bp-activity-id' ), self.heartbeat_data.highlights[ object ] ) ) {
self.heartbeat_data.highlights[ object ].push( activity.data( 'bp-activity-id' ) );
}
}
} );
} );
// Remove the specific classes to count highligthts
var regexp = new RegExp( 'bp-my-(' + objects.join( '|' ) + ')', 'g' );
this.heartbeat_data.newest = this.heartbeat_data.newest.replace( regexp, '' );
/**
* Deal with the 'All Members' dynamic span from here as HeartBeat is working even when
* the user is not logged in
*/
$( bp.Nouveau.objectNavParent + ' [data-bp-scope="all"]' ).find( 'a span' ).html( newest_activities_count );
// Set all activities to be highlighted for the current scope
} else {
// Init the array of highlighted activities
this.heartbeat_data.highlights[ scope ] = [];
$.each( newest_activities, function( a, activity ) {
self.heartbeat_data.highlights[ scope ].push( $( activity ).data( 'bp-activity-id' ) );
} );
}
$.each( objects, function( o, object ) {
if ( undefined !== self.heartbeat_data.highlights[ object ] && self.heartbeat_data.highlights[ object ].length ) {
var count = 0;
if ( 'mentions' === object ) {
count = self.mentions_count;
}
$( bp.Nouveau.objectNavParent + ' [data-bp-scope="' + object + '"]' ).find( 'a span' ).html( Number( self.heartbeat_data.highlights[ object ].length ) + count );
}
} );
/**
* Let's remove the mentions from objects!
*/
objects.pop();
// Add an information about the number of newest activities inside the document's title
$( document ).prop( 'title', '(' + newest_activities_count + ') ' + this.heartbeat_data.document_title );
// Update the Load Newest li if it already exists.
if ( $( '#buddypress [data-bp-list="activity"] li' ).first().hasClass( 'load-newest' ) ) {
var newest_link = $( '#buddypress [data-bp-list="activity"] .load-newest a' ).html();
$( '#buddypress [data-bp-list="activity"] .load-newest a' ).html( newest_link.replace( /([0-9]+)/, newest_activities_count ) );
// Otherwise add it
} else {
$( '#buddypress [data-bp-list="activity"] ul.activity-list' ).prepend( '
' + BP_Nouveau.newest + ' (' + newest_activities_count + ')' );
}
/**
* Finally trigger a pending event containing the activity heartbeat data
*/
$( '#buddypress [data-bp-list="activity"]' ).trigger( 'bp_heartbeat_pending', this.heartbeat_data );
},
/**
* [injectQuery description]
* @param {[type]} event [description]
* @return {[type]} [description]
*/
injectActivities: function( event ) {
var store = bp.Nouveau.getStorage( 'bp-activity' ),
scope = store.scope || null, filter = store.filter || null;
// Load newest activities
if ( $( event.currentTarget ).hasClass( 'load-newest' ) ) {
// Stop event propagation
event.preventDefault();
$( event.currentTarget ).remove();
/**
* If a plugin is updating the recorded_date of an activity
* it will be loaded as a new one. We need to look in the
* stream and eventually remove similar ids to avoid "double".
*/
var activities = $.parseHTML( this.heartbeat_data.newest );
$.each( activities, function( a, activity ){
if( 'LI' === activity.nodeName && $( activity ).hasClass( 'just-posted' ) ) {
if( $( '#' + $( activity ).prop( 'id' ) ).length ) {
$( '#' + $( activity ).prop( 'id' ) ).remove();
}
}
} );
// Now the stream is cleaned, prepend newest
$( event.delegateTarget ).find( '.activity-list' ).prepend( this.heartbeat_data.newest ).trigger( 'bp_heartbeat_prepend', this.heartbeat_data );
// Reset the newest activities now they're displayed
this.heartbeat_data.newest = '';
// Reset the All members tab dynamic span id it's the current one
if ( 'all' === scope ) {
$( bp.Nouveau.objectNavParent + ' [data-bp-scope="all"]' ).find( 'a span' ).html( '' );
}
// Specific to mentions
if ( 'mentions' === scope ) {
// Now mentions are displayed, remove the user_metas
bp.Nouveau.ajax( { action: 'activity_clear_new_mentions' }, 'activity' );
this.mentions_count = 0;
}
// Activities are now displayed, clear the newest count for the scope
$( bp.Nouveau.objectNavParent + ' [data-bp-scope="' + scope + '"]' ).find( 'a span' ).html( '' );
// Activities are now displayed, clear the highlighted activities for the scope
if ( undefined !== this.heartbeat_data.highlights[ scope ] ) {
this.heartbeat_data.highlights[ scope ] = [];
}
// Remove highlighted for the current scope
setTimeout( function () {
$( event.delegateTarget ).find( '[data-bp-activity-id]' ).removeClass( 'newest_' + scope + '_activity' );
}, 3000 );
// Reset the document title
$( document ).prop( 'title', this.heartbeat_data.document_title );
// Load more activities
} else if ( $( event.currentTarget ).hasClass( 'load-more' ) ) {
var next_page = ( Number( this.current_page ) * 1 ) + 1, self = this, search_terms = '';
// Stop event propagation
event.preventDefault();
$( event.currentTarget ).find( 'a' ).first().addClass( 'loading' );
// reset the just posted
this.just_posted = [];
// Now set it
$( event.delegateTarget ).children( '.just-posted' ).each( function() {
self.just_posted.push( $( this ).data( 'bp-activity-id' ) );
} );
if ( $( '#buddypress .dir-search input[type=search]' ).length ) {
search_terms = $( '#buddypress .dir-search input[type=search]' ).val();
}
bp.Nouveau.objectRequest( {
object : 'activity',
scope : scope,
filter : filter,
search_terms : search_terms,
page : next_page,
method : 'append',
exclude_just_posted : this.just_posted.join( ',' ),
target : '#buddypress [data-bp-list] ul.bp-list'
} ).done( function( response ) {
if ( true === response.success ) {
$( event.currentTarget ).remove();
// Update the current page
self.current_page = next_page;
}
} );
}
},
/**
* [truncateComments description]
* @param {[type]} event [description]
* @return {[type]} [description]
*/
hideComments: function( event ) {
var comments = $( event.target ).find( '.activity-comments' ),
activity_item, comment_items, comment_count, comment_parents;
if ( ! comments.length ) {
return;
}
comments.each( function( c, comment ) {
comment_parents = $( comment ).children( 'ul' );
comment_items = $( comment_parents ).find( 'li' );
if ( ! comment_items.length ) {
return;
}
// Get the activity id
activity_item = $( comment ).closest( '.activity-item' );
// Get the comment count
comment_count = $( '#acomment-comment-' + activity_item.data( 'bp-activity-id' ) + ' span.comment-count' ).html() || ' ';
// Keep latest 5 comments
comment_items.each( function( i, item ) {
if ( i < comment_items.length - 5 ) {
$( item ).addClass('bp-hidden').hide();
// Prepend a link to display all
if ( ! i ) {
var activity_id = activity_item.data( 'bpActivityId' );
if ( 'undefined' !== typeof activity_id ) {
activity_id = parseInt( activity_id, 10 );
$( item ).before( '' );
}
}
}
} );
// If all parents are hidden, reveal at least one. It seems very risky to manipulate the DOM to keep exactly 5 comments!
if ( $( comment_parents ).children( '.bp-hidden' ).length === $( comment_parents ).children( 'li' ).length - 1 && $( comment_parents ).find( 'li.show-all' ).length ) {
$( comment_parents ).children( 'li' ).removeClass( 'bp-hidden' ).toggle();
}
} );
},
/**
* [showComments description]
* @param {[type]} event [description]
* @return {[type]} [description]
*/
showComments: function( event ) {
// Stop event propagation
event.preventDefault();
$( event.target ).addClass( 'loading' );
setTimeout( function() {
$( event.target ).closest( 'ul' ).find( 'li' ).removeClass('bp-hidden').fadeIn( 300, function() {
$( event.target ).parent( 'li' ).remove();
} );
}, 600 );
},
/**
* [scopeLoaded description]
* @param {[type]} event [description]
* @param {[type]} data [description]
* @return {[type]} [description]
*/
scopeLoaded: function ( event, data ) {
// Make sure to only keep 5 root comments
this.hideComments( event );
// Reset the pagination for the scope.
this.current_page = 1;
// Mentions are specific
if ( 'mentions' === data.scope && undefined !== data.response.new_mentions ) {
$.each( data.response.new_mentions, function( i, id ) {
$( '#buddypress #activity-stream' ).find( '[data-bp-activity-id="' + id + '"]' ).addClass( 'newest_mentions_activity' );
} );
// Reset mentions count
this.mentions_count = 0;
} else if ( undefined !== this.heartbeat_data.highlights[data.scope] && this.heartbeat_data.highlights[data.scope].length ) {
$.each( this.heartbeat_data.highlights[data.scope], function( i, id ) {
if ( $( '#buddypress #activity-stream' ).find( '[data-bp-activity-id="' + id + '"]' ).length ) {
$( '#buddypress #activity-stream' ).find( '[data-bp-activity-id="' + id + '"]' ).addClass( 'newest_' + data.scope + '_activity' );
}
} );
}
// Reset the newest activities now they're displayed
this.heartbeat_data.newest = '';
$.each( $( bp.Nouveau.objectNavParent + ' [data-bp-scope]' ).find( 'a span' ), function( s, count ) {
if ( 0 === parseInt( $( count ).html(), 10 ) ) {
$( count ).html( '' );
}
} );
// Activities are now loaded, clear the highlighted activities for the scope
if ( undefined !== this.heartbeat_data.highlights[ data.scope ] ) {
this.heartbeat_data.highlights[ data.scope ] = [];
}
// Reset the document title
$( document ).prop( 'title', this.heartbeat_data.document_title );
setTimeout( function () {
$( '#buddypress #activity-stream .activity-item' ).removeClass( 'newest_' + data.scope +'_activity' );
}, 3000 );
},
/**
* [activityActions description]
* @param {[type]} event [description]
* @return {[type]} [description]
*/
activityActions: function( event ) {
var parent = event.data, target = $( event.target ), activity_item = $( event.currentTarget ),
activity_id = activity_item.data( 'bp-activity-id' ), stream = $( event.delegateTarget ),
item_id, form;
// In case the target is set to a span inside the link.
if ( $( target ).is( 'span' ) ) {
target = $( target ).closest( 'a' );
}
// Favoriting
if ( target.hasClass( 'fav') || target.hasClass('unfav') ) {
var type = target.hasClass( 'fav' ) ? 'fav' : 'unfav';
// Stop event propagation
event.preventDefault();
target.addClass( 'loading' );
parent.ajax( { action: 'activity_mark_' + type, 'id': activity_id }, 'activity' ).done( function( response ) {
target.removeClass( 'loading' );
if ( false === response.success ) {
return;
} else {
target.fadeOut( 200, function() {
if ( $( this ).find( 'span' ).first().length ) {
$( this ).find( 'span' ).first().html( response.data.content );
} else {
$( this ).html( response.data.content );
}
$( this ).attr( 'data-bp-tooltip', response.data.content );
if ('false' === $(this).attr('aria-pressed') ) {
$( this ).attr('aria-pressed', 'true');
} else {
$( this ).attr('aria-pressed', 'false');
}
$( this ).fadeIn( 200 );
} );
}
if ( 'fav' === type ) {
if ( undefined !== response.data.directory_tab ) {
if ( ! $( parent.objectNavParent + ' [data-bp-scope="favorites"]' ).length ) {
$( parent.objectNavParent + ' [data-bp-scope="all"]' ).after( response.data.directory_tab );
}
}
target.removeClass( 'fav' );
target.addClass( 'unfav' );
} else if ( 'unfav' === type ) {
var favoriteScope = $( '[data-bp-user-scope="favorites"]' ).hasClass( 'selected' ) || $( parent.objectNavParent + ' [data-bp-scope="favorites"]' ).hasClass( 'selected' );
// If on user's profile or on the favorites directory tab, remove the entry
if ( favoriteScope ) {
activity_item.remove();
}
if ( undefined !== response.data.no_favorite ) {
// Remove the tab when on activity directory but not on the favorites tabs
if ( $( parent.objectNavParent + ' [data-bp-scope="all"]' ).length && $( parent.objectNavParent + ' [data-bp-scope="all"]' ).hasClass( 'selected' ) ) {
$( parent.objectNavParent + ' [data-bp-scope="favorites"]' ).remove();
// In all the other cases, append a message to the empty stream
} else if ( favoriteScope ) {
stream.append( response.data.no_favorite );
}
}
target.removeClass( 'unfav' );
target.addClass( 'fav' );
}
} );
}
// Deleting or spamming
if ( target.hasClass( 'delete-activity' ) || target.hasClass( 'acomment-delete' ) || target.hasClass( 'spam-activity' ) || target.hasClass( 'spam-activity-comment' ) ) {
var activity_comment_li = target.closest( '[data-bp-activity-comment-id]' ),
activity_comment_id = activity_comment_li.data( 'bp-activity-comment-id' ),
li_parent, comment_count_span, comment_count, show_all_a, deleted_comments_count = 0;
// Stop event propagation
event.preventDefault();
if ( undefined !== BP_Nouveau.confirm && false === window.confirm( BP_Nouveau.confirm ) ) {
return false;
}
target.addClass( 'loading' );
var ajaxData = {
action : 'delete_activity',
'id' : activity_id,
'_wpnonce' : parent.getLinkParams( target.prop( 'href' ), '_wpnonce' ),
'is_single' : target.closest( '[data-bp-single]' ).length
};
// Only the action changes when spamming an activity or a comment.
if ( target.hasClass( 'spam-activity' ) || target.hasClass( 'spam-activity-comment' ) ) {
ajaxData.action = 'bp_spam_activity';
}
// Set defaults parent li to activity container
li_parent = activity_item;
// If it's a comment edit ajaxData.
if ( activity_comment_id ) {
delete ajaxData.is_single;
// Set comment data.
ajaxData.id = activity_comment_id;
ajaxData.is_comment = true;
// Set parent li to activity comment container
li_parent = activity_comment_li;
}
// Move the form if needed
if ( activity_comment_li.find( 'form' ).length ) {
activity_item.find( '.activity-comments' ).append( activity_comment_li.find( 'form' ) );
}
parent.ajax( ajaxData, 'activity' ).done( function( response ) {
target.removeClass( 'loading' );
if ( false === response.success ) {
li_parent.prepend( response.data.feedback );
li_parent.find( '.bp-feedback' ).hide().fadeIn( 300 );
} else {
// Specific case of the single activity screen.
if ( response.data.redirect ) {
return window.location.href = response.data.redirect;
}
if ( activity_comment_id ) {
deleted_comments_count = 1;
if ( response.data.deleted ) {
deleted_comments_count = response.data.deleted.length;
response.data.deleted.forEach( function( cid ) {
$( '[data-bp-activity-comment-id="' + cid + '"]' ).remove();
} );
} else {
// Count child comments if there are some
$.each( activity_comment_li.find( 'li' ), function() {
deleted_comments_count += 1;
} );
}
// Update the button count
comment_count_span = activity_item.find( '.acomment-reply span.comment-count' );
comment_count = Number( comment_count_span.html() - deleted_comments_count );
comment_count_span.html( comment_count );
// Update the show all count
show_all_a = activity_item.find( 'li.show-all a' );
if ( show_all_a.length ) {
show_all_a.html( BP_Nouveau.show_x_comments.replace( '%d', comment_count ) );
}
// Clean up the parent activity classes.
if ( 0 === comment_count ) {
activity_item.removeClass( 'has-comments' );
}
}
// Remove the entry
li_parent.slideUp( 300, function() {
li_parent.remove();
} );
// reset vars to get newest activities when an activity is deleted
if ( ! activity_comment_id && activity_item.data( 'bp-timestamp' ) === parent.Activity.heartbeat_data.last_recorded ) {
parent.Activity.heartbeat_data.newest = '';
parent.Activity.heartbeat_data.last_recorded = 0;
}
}
} );
}
// Reading more
if ( target.closest( 'span' ).hasClass( 'activity-read-more' ) ) {
var content = target.closest( 'div' ), readMore = target.closest( 'span' );
item_id = null;
if ( $( content ).hasClass( 'activity-inner' ) ) {
item_id = activity_id;
} else if ( $( content ).hasClass( 'acomment-content' ) ) {
item_id = target.closest( 'li' ).data( 'bp-activity-comment-id' );
}
if ( ! item_id ) {
return event;
}
// Stop event propagation
event.preventDefault();
$( readMore ).addClass( 'loading' );
parent.ajax( {
action : 'get_single_activity_content',
id : item_id
}, 'activity' ).done( function( response ) {
$( readMore ).removeClass( 'loading' );
if ( content.parent().find( '.bp-feedback' ).length ) {
content.parent().find( '.bp-feedback' ).remove();
}
if ( false === response.success ) {
content.after( response.data.feedback );
content.parent().find( '.bp-feedback' ).hide().fadeIn( 300 );
} else {
$( content ).slideUp( 300 ).html( response.data.contents ).slideDown( 300 );
}
} );
}
// Displaying the comment form
if ( target.hasClass( 'acomment-reply' ) || target.parent().hasClass( 'acomment-reply' ) ) {
var comment_link = target;
form = $( '#ac-form-' + activity_id );
item_id = activity_id;
// Stop event propagation
event.preventDefault();
if ( ! form.length ) {
var viewDiscussionLink = target.closest( 'li.activity' ).find( '.activity-meta a.view' ).prop( 'href' );
if ( viewDiscussionLink ) {
window.location.href = viewDiscussionLink;
}
return false;
}
// If the comment count span inside the link is clicked
if ( target.parent().hasClass( 'acomment-reply' ) ) {
comment_link = target.parent();
}
if ( target.closest( 'li' ).data( 'bp-activity-comment-id' ) ) {
item_id = target.closest( 'li' ).data( 'bp-activity-comment-id' );
}
// ?? hide and display none..
//form.css( 'display', 'none' );
form.removeClass( 'root' );
$('.ac-form').hide();
/* Remove any error messages */
$.each( form.children( 'div' ), function( e, err ) {
if ( $( err ).hasClass( 'error' ) ) {
$( err ).remove();
}
} );
// It's an activity we're commenting
if ( item_id === activity_id ) {
$( '[data-bp-activity-id="' + item_id + '"] .activity-comments' ).append( form );
form.addClass( 'root' );
// It's a comment we're replying to
} else {
$( '[data-bp-activity-comment-id="' + item_id + '"]' ).append( form );
}
form.slideDown( 200 );
// change the aria state from false to true
target.attr( 'aria-expanded', 'true' );
$.scrollTo( form, 500, {
offset:-100,
easing:'swing'
} );
$( '#ac-form-' + activity_id + ' textarea' ).trigger( 'focus' );
}
// Removing the form
if ( target.hasClass( 'ac-reply-cancel' ) ) {
$( target ).closest( '.ac-form' ).slideUp( 200 );
// Change the aria state back to false on comment cancel
$( '.acomment-reply').attr( 'aria-expanded', 'false' );
// Stop event propagation
event.preventDefault();
}
// Submitting comments and replies
if ( 'ac_form_submit' === target.prop( 'name' ) ) {
var comment_content, comment_data;
form = target.closest( 'form' );
item_id = activity_id;
// Stop event propagation
event.preventDefault();
if ( target.closest( 'li' ).data( 'bp-activity-comment-id' ) ) {
item_id = target.closest( 'li' ).data( 'bp-activity-comment-id' );
}
comment_content = $( form ).find( 'textarea' ).first();
target.addClass( 'loading' ).prop( 'disabled', true );
comment_content.addClass( 'loading' ).prop( 'disabled', true );
comment_data = {
action : 'new_activity_comment',
_wpnonce_new_activity_comment : $( '#_wpnonce_new_activity_comment' + '_' + activity_id ).val(),
comment_id : item_id,
form_id : activity_id,
content : comment_content.val()
};
// Add the Akismet nonce if it exists
if ( $( '#_bp_as_nonce_' + activity_id ).val() ) {
comment_data['_bp_as_nonce_' + activity_id] = $( '#_bp_as_nonce_' + activity_id ).val();
}
parent.ajax( comment_data, 'activity' ).done( function( response ) {
target.removeClass( 'loading' );
comment_content.removeClass( 'loading' );
$( '.acomment-reply' ).attr( 'aria-expanded', 'false' );
if ( false === response.success ) {
form.append( $( response.data.feedback ).hide().fadeIn( 200 ) );
} else {
var activity_comments = form.parent();
var the_comment = $.trim( response.data.contents );
form.fadeOut( 200, function() {
if ( 0 === activity_comments.children( 'ul' ).length ) {
if ( activity_comments.hasClass( 'activity-comments' ) ) {
activity_comments.prepend( '' );
} else {
activity_comments.append( '' );
}
}
activity_comments.children( 'ul' ).append( $( the_comment ).hide().fadeIn( 200 ) );
$( form ).find( 'textarea' ).first().val( '' );
activity_comments.parent().addClass( 'has-comments' );
} );
// why, as it's already done a few lines ahead ???
//jq( '#' + form.attr('id') + ' textarea').val('');
// Set the new count
comment_count = Number( $( activity_item ).find( 'a span.comment-count' ).html() || 0 ) + 1;
// Increase the "Reply (X)" button count
$( activity_item ).find( 'a span.comment-count' ).html( comment_count );
// Increment the 'Show all x comments' string, if present
show_all_a = $( activity_item ).find( '.show-all a' );
if ( show_all_a ) {
show_all_a.html( BP_Nouveau.show_x_comments.replace( '%d', comment_count ) );
}
}
target.prop( 'disabled', false );
comment_content.prop( 'disabled', false );
} );
}
},
/**
* [closeCommentForm description]
* @param {[type]} event [description]
* @return {[type]} [description]
*/
commentFormAction: function( event ) {
var element, keyCode;
event = event || window.event;
if ( event.target ) {
element = event.target;
} else if ( event.srcElement) {
element = event.srcElement;
}
if ( element.nodeType === 3 ) {
element = element.parentNode;
}
if ( event.altKey === true || event.metaKey === true ) {
return event;
}
// Not in a comment textarea, return
if ( element.tagName !== 'TEXTAREA' || ! $( element ).hasClass( 'ac-input' ) ) {
return event;
}
keyCode = ( event.keyCode ) ? event.keyCode : event.which;
if ( 27 === keyCode && false === event.ctrlKey ) {
if ( element.tagName === 'TEXTAREA' ) {
$( element ).closest( 'form' ).slideUp( 200 );
}
} else if ( event.ctrlKey && 13 === keyCode && $( element ).val() ) {
$( element ).closest( 'form' ).find( '[type=submit]' ).first().trigger( 'click' );
}
},
updateRssLink: function( event, data ) {
var rssLink = data.response.feed_url || '';
if ( rssLink && $( 'body:not(.bp-user) #activity-rss-feed' ).length ) {
$( '#activity-rss-feed' ).find( 'a' ).first().prop( 'href', rssLink );
}
}
};
// Launch BP Nouveau Activity
bp.Nouveau.Activity.start();
} )( window.bp, jQuery );