Repeats shown in threaded noticelist now handled by plugin

This commit is contained in:
Mikael Nordfeldth 2015-03-12 19:49:20 +01:00
parent 940737a958
commit 20f8dd6565
7 changed files with 98 additions and 122 deletions

View File

@ -2901,31 +2901,4 @@ class Notice extends Managed_DataObject
$notice->_setReplies($ids); $notice->_setReplies($ids);
} }
} }
protected $_repeats = array();
function getRepeats()
{
if (isset($this->_repeats[$this->id])) {
return $this->_repeats[$this->id];
}
$repeatMap = Notice::listGet('repeat_of', array($this->id));
$this->_repeats[$this->id] = $repeatMap[$this->id];
return $this->_repeats[$this->id];
}
function _setRepeats($repeats)
{
$this->_repeats[$this->id] = $repeats;
}
static function fillRepeats(&$notices)
{
$ids = self::_idsOf($notices);
$repeatMap = Notice::listGet('repeat_of', $ids);
foreach ($notices as $notice) {
$repeats = $repeatMap[$notice->id];
$notice->_setRepeats($repeats);
}
}
} }

View File

@ -155,15 +155,9 @@ class NoticeList extends Widget
// Prefill attachments // Prefill attachments
Notice::fillAttachments($notices); Notice::fillAttachments($notices);
// Prefill repeat data
Notice::fillRepeats($notices);
// Prefill the profiles // Prefill the profiles
$profiles = Notice::fillProfiles($notices); $profiles = Notice::fillProfiles($notices);
if ($scoped instanceof Profile) {
Notice::pivotGet('repeat_of', $notice_ids, array('profile_id' => $scoped->id));
}
Event::handle('EndNoticeListPrefill', array(&$notices, &$profiles, $notice_ids, $scoped)); Event::handle('EndNoticeListPrefill', array(&$notices, &$profiles, $notice_ids, $scoped));
} }
} }

View File

@ -27,7 +27,7 @@
* @link http://status.net/ * @link http://status.net/
*/ */
if (!defined('GNUSOCIAL') && !defined('STATUSNET')) { exit(1); } if (!defined('GNUSOCIAL')) { exit(1); }
/** /**
* widget for displaying a list of notices * widget for displaying a list of notices
@ -229,13 +229,7 @@ class ThreadedNoticeListItem extends NoticeListItem
$this->out->elementStart('ul', 'notices threaded-replies xoxo'); $this->out->elementStart('ul', 'notices threaded-replies xoxo');
if (Event::handle('StartShowThreadedNoticeTailItems', array($this, $this->notice, &$threadActive))) { if (Event::handle('StartShowThreadedNoticeTailItems', array($this, $this->notice, &$threadActive))) {
// Repeats and Faves/Likes are handled in plugins.
// Show the repeats-button for this notice. If there are repeats,
// the show() function will return true, definitely setting our
// $threadActive flag, which will be used later to show a reply box.
$item = new ThreadedNoticeListRepeatsItem($this->notice, $this->out);
$threadActive = $item->show() || $threadActive;
Event::handle('EndShowThreadedNoticeTailItems', array($this, $this->notice, &$threadActive)); Event::handle('EndShowThreadedNoticeTailItems', array($this, $this->notice, &$threadActive));
} }
@ -309,8 +303,7 @@ class ThreadedNoticeListSubItem extends NoticeListItem
{ {
$threadActive = null; // unused here for now, but maybe in the future? $threadActive = null; // unused here for now, but maybe in the future?
if (Event::handle('StartShowThreadedNoticeTailItems', array($this, $this->notice, &$threadActive))) { if (Event::handle('StartShowThreadedNoticeTailItems', array($this, $this->notice, &$threadActive))) {
$item = new ThreadedNoticeListInlineRepeatsItem($this->notice, $this->out); // Repeats and Faves/Likes are handled in plugins.
$hasRepeats = $item->show();
Event::handle('EndShowThreadedNoticeTailItems', array($this, $this->notice, &$threadActive)); Event::handle('EndShowThreadedNoticeTailItems', array($this, $this->notice, &$threadActive));
} }
parent::showEnd(); parent::showEnd();
@ -374,80 +367,3 @@ class ThreadedNoticeListMoreItem extends NoticeListItem
$this->out->element('a', array('href' => $url), $msg); $this->out->element('a', array('href' => $url), $msg);
} }
} }
/**
* Placeholder for showing repeats...
*/
class ThreadedNoticeListRepeatsItem extends NoticeListActorsItem
{
function getProfiles()
{
$repeats = $this->notice->getRepeats();
$profiles = array();
foreach ($repeats as $rep) {
$profiles[] = $rep->profile_id;
}
return $profiles;
}
function magicList($items)
{
if (count($items) > 4) {
return parent::magicList(array_slice($items, 0, 3));
} else {
return parent::magicList($items);
}
}
function getListMessage($count, $you)
{
if ($count == 1 && $you) {
// darn first person being different from third person!
// TRANS: List message for notice repeated by logged in user.
return _m('REPEATLIST', 'You repeated this.');
} else if ($count > 4) {
// TRANS: List message for when more than 4 people repeat something.
// TRANS: %%s is a list of users liking a notice, %d is the number over 4 that like the notice.
// TRANS: Plural is decided on the total number of users liking the notice (count of %%s + %d).
return sprintf(_m('%%s and %d other repeated this.',
'%%s and %d others repeated this.',
$count - 3),
$count - 3);
} else {
// TRANS: List message for repeated notices.
// TRANS: %%s is a list of users who have repeated a notice.
// TRANS: Plural is based on the number of of users that have repeated a notice.
return sprintf(_m('%%s repeated this.',
'%%s repeated this.',
$count),
$count);
}
}
function showStart()
{
$this->out->elementStart('li', array('class' => 'notice-data notice-repeats'));
}
function showEnd()
{
$this->out->elementEnd('li');
}
}
// @todo FIXME: needs documentation.
class ThreadedNoticeListInlineRepeatsItem extends ThreadedNoticeListRepeatsItem
{
function showStart()
{
$this->out->elementStart('div', array('class' => 'notice-repeats'));
}
function showEnd()
{
$this->out->elementEnd('div');
}
}

View File

@ -361,7 +361,7 @@ class FavoritePlugin extends ActivityVerbHandlerPlugin
return true; return true;
} }
public function onStartShowThreadedNoticeTailItems(NoticeListItem $nli, Notice $notice, &$threadActive) public function onEndShowThreadedNoticeTailItems(NoticeListItem $nli, Notice $notice, &$threadActive)
{ {
if ($nli instanceof ThreadedNoticeListSubItem) { if ($nli instanceof ThreadedNoticeListSubItem) {
// The sub-items are replies to a conversation, thus we use different HTML elements etc. // The sub-items are replies to a conversation, thus we use different HTML elements etc.

View File

@ -174,7 +174,19 @@ class SharePlugin extends ActivityVerbHandlerPlugin
return true; return true;
} }
// API stuff // Layout stuff
public function onEndShowThreadedNoticeTailItems(NoticeListItem $nli, Notice $notice, &$threadActive)
{
if ($nli instanceof ThreadedNoticeListSubItem) {
// The sub-items are replies to a conversation, thus we use different HTML elements etc.
$item = new ThreadedNoticeListInlineRepeatsItem($notice, $nli->out);
} else {
$item = new ThreadedNoticeListRepeatsItem($notice, $nli->out);
}
$threadActive = $item->show() || $threadActive;
return true;
}
/** /**
* show the "repeat" form in the notice options element * show the "repeat" form in the notice options element

View File

@ -0,0 +1,16 @@
<?php
if (!defined('GNUSOCIAL')) { exit(1); }
class ThreadedNoticeListInlineRepeatsItem extends ThreadedNoticeListRepeatsItem
{
function showStart()
{
$this->out->elementStart('div', array('class' => 'notice-repeats'));
}
function showEnd()
{
$this->out->elementEnd('div');
}
}

View File

@ -0,0 +1,65 @@
<?php
if (!defined('GNUSOCIAL')) { exit(1); }
/**
* Placeholder for showing repeats...
*/
class ThreadedNoticeListRepeatsItem extends NoticeListActorsItem
{
function getProfiles()
{
$repeats = Notice::listGet('repeat_of', array($this->notice->getID()));
$profiles = array();
foreach ($repeats[$this->notice->getID()] as $rep) {
$profiles[] = $rep->profile_id;
}
return $profiles;
}
function magicList($items)
{
if (count($items) > 4) {
return parent::magicList(array_slice($items, 0, 3));
} else {
return parent::magicList($items);
}
}
function getListMessage($count, $you)
{
if ($count == 1 && $you) {
// darn first person being different from third person!
// TRANS: List message for notice repeated by logged in user.
return _m('REPEATLIST', 'You repeated this.');
} else if ($count > 4) {
// TRANS: List message for when more than 4 people repeat something.
// TRANS: %%s is a list of users liking a notice, %d is the number over 4 that like the notice.
// TRANS: Plural is decided on the total number of users liking the notice (count of %%s + %d).
return sprintf(_m('%%s and %d other repeated this.',
'%%s and %d others repeated this.',
$count - 3),
$count - 3);
} else {
// TRANS: List message for repeated notices.
// TRANS: %%s is a list of users who have repeated a notice.
// TRANS: Plural is based on the number of of users that have repeated a notice.
return sprintf(_m('%%s repeated this.',
'%%s repeated this.',
$count),
$count);
}
}
function showStart()
{
$this->out->elementStart('li', array('class' => 'notice-data notice-repeats'));
}
function showEnd()
{
$this->out->elementEnd('li');
}
}