issue: hide unannounced messages from public activity
[minimedit.git] / widget / issue / activity.php
index cd99e486916af3e58e888fdc1ed6080fd226a9de..1d1a37ae28d6629c3b7071f2285c5511c55d8a80 100644 (file)
@@ -6,30 +6,54 @@ $limit = $Page->place['n'] ?? 50;
 $cols = 'm.*, i.subject, i.updated, i.closed';
 $sql = "SELECT $cols FROM messages m JOIN issues i ON i.id = issue";
 $sql .= " WHERE message IS NOT NULL";
+$sql .= " AND i.page <> 'spam'";
+$sql .= " AND m.announced";
 $sql .= " ORDER BY m.created DESC LIMIT $limit";
-$sql = "SELECT * FROM ($sql) x ORDER BY updated DESC, created, id"; # grouped issues
 $query = $Db->query($sql);
+$rows = $query->fetchall();
+
+$msgformat = [
+       '{(.*)(<p><img [^>]+></p>)\s*}s' => "$2$1",
+       "{(</p>\n).{20,}}s" => ' <small class="footer">(Meer op de site)</small>$1',
+       '{(?<=<img src=")(?:/thumb/[^/]+)?(?=/)}' => '/thumb/300x',
+];
 
 print '<dl class="replies">';
 
-$group = NULL;
-while ($row = $query->fetch()) {
-       $rowuser = new User("profile/{$row->author}");
-       if ($group !== $row->issue) {
-               $group = $row->issue;
+$prev = NULL;
+foreach ($rows as $i => $row) {
+       $next = $rows[$i + 1] ?? NULL;
+
+       if ($next and $next->issue === $row->issue
+       and preg_match('/\A(?:<p><img[^>]*><\/p>)+\z/', $row->message)) {
+               # postpone related image to the following message
+               $next->message = $row->message . $next->message;
+               continue;
+       }
+
+       if (!$prev or $prev->issue !== $row->issue or $prev->author !== $row->author
+       or !preg_match('/\A<p><img/', $prev->message)) {
                print '<dt>';
-               printf('<a href="/%s">%s</a>', $row->page, $row->subject);
-               if ($row->closed) {
-                       print ' <em>(opgelost)</em>';
+               if (!$prev or $prev->issue !== $row->issue) {
+                       printf('<a href="/%s">%s</a>', $row->page, $row->subject);
+                       if ($row->closed) {
+                               print ' <em>(opgelost)</em>';
+                       }
+               }
+               print '<span class="right">';
+               if ($row->author and $rowuser = new User("profile/{$row->author}")) {
+                       printf('<strong>%s</strong> ', $rowuser->html);
                }
+               printf('<small class="date">%s</small>',
+                       showdate(preg_split('/\D/', $row->created))
+               );
+               print "</span>";
                print '</dt>';
        }
        print '<dd>';
-       printf('<strong>%s</strong> <small class="date">%s</small>',
-               $rowuser->html, showdate(preg_split('/\D/', $row->created))
-       );
-       printf("\n\t<blockquote>%s</blockquote>", $row->message);
-       print "</dd>\n";
+       print preg_replace(array_keys($msgformat), array_values($msgformat), $row->message);
+       print "\n";
+       $prev = $row;
 }
 
 print "</dl>\n";