<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[BuddyPress][12038] trunk/src/bp-templates/bp-nouveau/js: BP Nouveau: generate the Activity container before adding new entries</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { white-space: pre-line; overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="http://buddypress.trac.wordpress.org/changeset/12038">12038</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"http://buddypress.trac.wordpress.org/changeset/12038","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>imath</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2018-05-02 16:18:33 +0000 (Wed, 02 May 2018)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>BP Nouveau: generate the Activity container before adding new entries

If the Activity container is missing, make sure to generate it before prepending new activities. If the container is available the activity will only be inserted if the activity stream can welcome it. For instance, an activity posted in a Private group will be prepended to the list only if the "My Groups" scope is active.

Fixes <a href="http://buddypress.trac.wordpress.org/ticket/7774">#7774</a></pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcbptemplatesbpnouveaujsbuddypressactivitypostformjs">trunk/src/bp-templates/bp-nouveau/js/buddypress-activity-post-form.js</a></li>
<li><a href="#trunksrcbptemplatesbpnouveaujsbuddypressnouveaujs">trunk/src/bp-templates/bp-nouveau/js/buddypress-nouveau.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcbptemplatesbpnouveaujsbuddypressactivitypostformjs"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-templates/bp-nouveau/js/buddypress-activity-post-form.js</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-templates/bp-nouveau/js/buddypress-activity-post-form.js     2018-05-02 15:52:11 UTC (rev 12037)
+++ trunk/src/bp-templates/bp-nouveau/js/buddypress-activity-post-form.js       2018-05-02 16:18:33 UTC (rev 12038)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -708,32 +708,52 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        bp.ajax.post( 'post_update', _.extend( data, this.model.attributes ) ).done( function( response ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                var scope     = bp.Nouveau.getStorage( 'bp-activity', 'scope' ),
-                                       prepended = false;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         var store       = bp.Nouveau.getStorage( 'bp-activity' ),
+                                       searchTerms = $( '[data-bp-search="activity"] input[type="search"]' ).val(), matches = {},
+                                       toPrepend = false;
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                if ( ! response.is_directory ||
-                                    ( 'all' === scope && ( 'user' === self.model.get( 'object' ) || false === response.is_private ) ) ||
-                                    ( self.model.get( 'object' ) + 's'  === scope )
-                                   ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         // Look for matches if the stream displays search results.
+                               if ( searchTerms ) {
+                                       searchTerms = new RegExp( searchTerms, 'im' );
+                                       matches = response.activity.match( searchTerms );
+                               }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                        if ( ! $( '#activity-' + response.id  ).length ) {
-                                               bp.Nouveau.inject( '#activity-stream ul.activity-list', response.activity, 'prepend' );
-                                               prepended = true;
-                                       }
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         /**
+                                * Before injecting the activity into the stream, we need to check the filter
+                                * and search terms are consistent with it when posting from a single item or
+                                * from the Activity directory.
+                                */
+                               if ( ( ! searchTerms || matches ) ) {
+                                       toPrepend = ! store.filter || 0 === parseInt( store.filter, 10 ) || 'activity_update' === store.filter;
</ins><span class="cx" style="display: block; padding: 0 10px">                                 }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                /**
+                                * In the Activity directory, we also need to check the active scope.
+                                * eg: An update posted in a private group should only show when the
+                                * "My Groups" tab is active.
+                                */
+                               if ( toPrepend && response.is_directory ) {
+                                       toPrepend = ( 'all' === store.scope && ( 'user' === self.model.get( 'object' ) || false === response.is_private ) ) || ( self.model.get( 'object' ) + 's'  === store.scope );
+                               }
+
</ins><span class="cx" style="display: block; padding: 0 10px">                                 // Reset the form
</span><span class="cx" style="display: block; padding: 0 10px">                                self.resetForm();
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                // Stop here if the activity has been added to the stream
-                               if ( prepended ) {
-                                       return;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         // Display a successful feedback if the acticity is not consistent with the displayed stream.
+                               if ( ! toPrepend ) {
+                                       self.views.add( new bp.Views.activityFeedback( { value: response.message, type: 'updated' } ) );
+
+                               // Inject the activity into the stream only if it hasn't been done already (HeartBeat).
+                               } else if ( ! $( '#activity-' + response.id  ).length ) {
+
+                                       // It's the very first activity, let's make sure the container can welcome it!
+                                       if ( ! $( '#activity-stream ul.activity-list').length ) {
+                                               $( '#activity-stream' ).html( $( '<ul></ul>').addClass( 'activity-list item-list bp-list' ) );
+                                       }
+
+                                       // Prepend the activity.
+                                       bp.Nouveau.inject( '#activity-stream ul.activity-list', response.activity, 'prepend' );
</ins><span class="cx" style="display: block; padding: 0 10px">                                 }
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-
-                               /**
-                                * Do not add to the stream if the scope is not consistent with the activity
-                                */
-                               self.views.add( new bp.Views.activityFeedback( { value: response.message, type: 'updated' } ) );
</del><span class="cx" style="display: block; padding: 0 10px">                         } ).fail( function( response ) {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                                self.model.set( 'errors', { type: 'error', value: response.message } );
</span></span></pre></div>
<a id="trunksrcbptemplatesbpnouveaujsbuddypressnouveaujs"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-templates/bp-nouveau/js/buddypress-nouveau.js</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-templates/bp-nouveau/js/buddypress-nouveau.js        2018-05-02 15:52:11 UTC (rev 12037)
+++ trunk/src/bp-templates/bp-nouveau/js/buddypress-nouveau.js  2018-05-02 16:18:33 UTC (rev 12038)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -103,8 +103,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                store = {};
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        if ( undefined !== property && store[property] ) {
-                               return store[property];
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 if ( undefined !== property ) {
+                               return store[property] || false;
</ins><span class="cx" style="display: block; padding: 0 10px">                         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        return store;
</span></span></pre>
</div>
</div>

</body>
</html>