From 84021e021eef6d55cd84f1449ced036941fe7335 Mon Sep 17 00:00:00 2001 From: Max Shinn Date: Sun, 13 Feb 2011 18:15:54 -0600 Subject: [PATCH] Threaded comments (replies) on the profile page --- .../GNUsocialProfileExtensionsPlugin.php | 17 +- .../actions/bio.php | 4 +- .../actions/newresponse.php | 53 ++++++ .../GNUsocialProfileExtensions/js/profile.js | 4 + .../lib/noticetree.php | 151 ++++++++++++++++++ .../res/bgstripe.gif | Bin 0 -> 36 bytes .../GNUsocialProfileExtensions/res/style.css | 13 ++ 7 files changed, 240 insertions(+), 2 deletions(-) create mode 100644 plugins/GNUsocialProfileExtensions/actions/newresponse.php create mode 100644 plugins/GNUsocialProfileExtensions/js/profile.js create mode 100644 plugins/GNUsocialProfileExtensions/lib/noticetree.php create mode 100644 plugins/GNUsocialProfileExtensions/res/bgstripe.gif diff --git a/plugins/GNUsocialProfileExtensions/GNUsocialProfileExtensionsPlugin.php b/plugins/GNUsocialProfileExtensions/GNUsocialProfileExtensionsPlugin.php index 468bc19204..27bf19336a 100644 --- a/plugins/GNUsocialProfileExtensions/GNUsocialProfileExtensionsPlugin.php +++ b/plugins/GNUsocialProfileExtensions/GNUsocialProfileExtensionsPlugin.php @@ -22,7 +22,7 @@ * @category Widget * @package GNU Social * @author Max Shinn - * @copyright 2010 Free Software Foundation, Inc. + * @copyright 2011 Free Software Foundation, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 */ @@ -40,6 +40,7 @@ class GNUsocialProfileExtensionsPlugin extends Plugin switch ($cls) { case 'BioAction': + case 'NewresponseAction': include_once $dir . '/actions/' . strtolower(mb_substr($cls, 0, -6)) . '.php'; break; case 'ProfilefieldsAdminPanelAction': @@ -51,6 +52,7 @@ class GNUsocialProfileExtensionsPlugin extends Plugin include_once $dir . '/classes/GNUsocialProfileExtensionField.php'; include_once $dir . '/classes/GNUsocialProfileExtensionResponse.php'; include_once $dir . '/lib/profiletools.php'; + include_once $dir . '/lib/noticetree.php'; return true; } @@ -75,6 +77,7 @@ class GNUsocialProfileExtensionsPlugin extends Plugin { $m->connect(':nickname/bio', array('action' => 'bio')); $m->connect('admin/profilefields', array('action' => 'profilefieldsAdminPanel')); + $m->connect('notice/respond', array('action' => 'newresponse')); return true; } @@ -135,6 +138,11 @@ class GNUsocialProfileExtensionsPlugin extends Plugin $action->cssLink('/plugins/GNUsocialProfileExtensions/res/style.css'); } + function onEndShowScripts($action) + { + $action->script('plugins/GNUsocialProfileExtensions/js/profile.js'); + } + function onEndAdminPanelNav($nav) { if (AdminPanelAction::canAdmin('profilefields')) { @@ -160,5 +168,12 @@ class GNUsocialProfileExtensionsPlugin extends Plugin _('The user\'s extended profile'), $nav->action->trimmed('action') == 'bio', 'nav_bio'); } + //Why the heck is this shoved into this plugin!?!? It deserves its own! + function onShowStreamNoticeList($notice, $action, &$pnl) + { + $pnl = new NoticeTree($notice, $action); + return false; + } + } diff --git a/plugins/GNUsocialProfileExtensions/actions/bio.php b/plugins/GNUsocialProfileExtensions/actions/bio.php index 6cfded4e36..bc9f12cb13 100644 --- a/plugins/GNUsocialProfileExtensions/actions/bio.php +++ b/plugins/GNUsocialProfileExtensions/actions/bio.php @@ -22,7 +22,7 @@ * @category Widget * @package GNU Social * @author Max Shinn - * @copyright 2010 Free Software Foundation, Inc. + * @copyright 2011 Free Software Foundation, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 */ @@ -101,3 +101,5 @@ class BioAction extends Action } } + + diff --git a/plugins/GNUsocialProfileExtensions/actions/newresponse.php b/plugins/GNUsocialProfileExtensions/actions/newresponse.php new file mode 100644 index 0000000000..0e71ee3f26 --- /dev/null +++ b/plugins/GNUsocialProfileExtensions/actions/newresponse.php @@ -0,0 +1,53 @@ +. + * + * @category Widget + * @package GNU Social + * @author Max Shinn + * @copyright 2011 Free Software Foundation, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + */ + +require_once INSTALLDIR . '/actions/newnotice.php'; + +class NewresponseAction extends NewnoticeAction +{ + /** + * Same as the parent, but not including the @-whoever in replies + * + * @return void + */ + + function showNoticeForm() + { + $content = $this->trimmed('status_textarea'); + if (!$content) { + $replyto = $this->trimmed('replyto'); + $inreplyto = $this->trimmed('inreplyto'); + } else { + // @fixme most of these bits above aren't being passed on above + $inreplyto = null; + } + + $notice_form = new NoticeForm($this, '', $content, null, $inreplyto); + $notice_form->show(); + } +} \ No newline at end of file diff --git a/plugins/GNUsocialProfileExtensions/js/profile.js b/plugins/GNUsocialProfileExtensions/js/profile.js new file mode 100644 index 0000000000..4a2f1c5a0c --- /dev/null +++ b/plugins/GNUsocialProfileExtensions/js/profile.js @@ -0,0 +1,4 @@ +SN.U.NoticeReplySet = function(nick,id) { + $('div.replyform').hide(); + $('div#form'+id).show(); +} diff --git a/plugins/GNUsocialProfileExtensions/lib/noticetree.php b/plugins/GNUsocialProfileExtensions/lib/noticetree.php new file mode 100644 index 0000000000..a8ee5101f8 --- /dev/null +++ b/plugins/GNUsocialProfileExtensions/lib/noticetree.php @@ -0,0 +1,151 @@ +. + * + * @category Widget + * @package GNU Social + * @author Max Shinn + * @copyright 2011 Free Software Foundation, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + */ + +class NoticeTree extends NoticeList +{ + function show() + { + $this->out->elementStart('div', array('id' =>'notices_primary')); + // TRANS: Header on conversation page. Hidden by default (h2). + $this->out->element('h2', null, _('Notices')); + $this->out->elementStart('ol', array('class' => 'notices xoxo')); + + $cnt = 0; + + while ($this->notice->fetch() && $cnt <= NOTICES_PER_PAGE) { + if (!empty($this->notice->reply_to)) + continue; + + $cnt++; + + if ($cnt > NOTICES_PER_PAGE) { + break; + } + + try { + $this->showNoticePlus($this->notice); + } catch (Exception $e) { + // we log exceptions and continue + common_log(LOG_ERR, $e->getMessage()); + continue; + } + } + + $this->out->elementEnd('ol'); + $this->out->elementEnd('div'); + + return $cnt; + } + + + function showNoticePlus($notice) + { + $replies = new Notice(); + $replies->reply_to = $notice->id; + + // We take responsibility for doing the li + + $this->out->elementStart('li', array('class' => 'hentry notice', + 'id' => 'notice-' . $id)); + + $item = $this->newListItem($notice); + $item->show(); + + if ($replies->find()) { + $this->out->elementStart('ol', array('class' => 'notices')); + + while ($replies->fetch()) { + $this->showNoticePlus($replies); + } + + $this->out->elementEnd('ol'); + } + + $this->out->elementEnd('li'); + } + + function newListItem($notice) + { + return new NoticeTreeItem($notice, $this->out); + } +} + +class NoticeTreeItem extends NoticeListItem +{ + function showStart() + { + return; + } + + function showEnd() + { + //TODO: Rewrite this + //Showing number of favorites + $fave = new Fave(); + $fave->notice_id = $this->notice->id; + $cnt = 0; + if ($fave->find()) { + while ($fave->fetch()) + $cnt++; + } + if ($cnt > 0) { + $this->out->text(_m("Favorited by $cnt user")); + if ($cnt > 1) $this->out->text("s"); //there has to be a better way to do this... + } + + //TODO: Rewrite this too + //Show response form + $this->out->elementStart('div', array('id' => 'form' . $this->notice->id, 'class' => 'replyform')); + $noticeform = new NoticeForm($this->out, null, null, null, $this->notice->id); + $noticeform->show(); + $this->out->elementEnd('div'); + return; + } + + function showContext() + { + return; + } + + //Just changing the link... + function showReplyLink() + { + if (common_logged_in()) { + $this->out->text(' '); + $reply_url = '/notice/respond?replyto=' . $this->profile->nickname . '&inreplyto=' . $this->notice->id; + $this->out->elementStart('a', array('href' => $reply_url, + 'class' => 'notice_reply', + 'title' => _('Reply to this notice'))); + $this->out->text(_('Reply')); + $this->out->text(' '); + $this->out->element('span', 'notice_id', $this->notice->id); + $this->out->elementEnd('a'); + } + } + +} diff --git a/plugins/GNUsocialProfileExtensions/res/bgstripe.gif b/plugins/GNUsocialProfileExtensions/res/bgstripe.gif new file mode 100644 index 0000000000000000000000000000000000000000..035ef80c48b937095fa1a4273f65bfbbb011859f GIT binary patch literal 36 kcmZ?wbhEHbWMW`qXkY+=|NsB%fM}2i0~50g6Dxx?0D_kV