Merge branch 'faves' into 1.0.x

This commit is contained in:
Brion Vibber 2011-03-17 14:48:14 -07:00
commit c70fdef368
2 changed files with 112 additions and 5 deletions

View File

@ -181,8 +181,10 @@ class ThreadedNoticeListItem extends NoticeListItem
$notices[] = clone($notice); // *grumble* inefficient as hell $notices[] = clone($notice); // *grumble* inefficient as hell
} }
$this->out->elementStart('ul', 'notices threaded-replies xoxo');
$item = new ThreadedNoticeListFavesItem($this->notice, $this->out);
$hasFaves = $item->show();
if ($notices) { if ($notices) {
$this->out->elementStart('ul', 'notices threaded-replies xoxo');
if ($moreCutoff) { if ($moreCutoff) {
$item = new ThreadedNoticeListMoreItem($moreCutoff, $this->out); $item = new ThreadedNoticeListMoreItem($moreCutoff, $this->out);
$item->show(); $item->show();
@ -191,14 +193,16 @@ class ThreadedNoticeListItem extends NoticeListItem
$item = new ThreadedNoticeListSubItem($notice, $this->out); $item = new ThreadedNoticeListSubItem($notice, $this->out);
$item->show(); $item->show();
} }
}
if ($notices || $hasFaves) {
// @fixme do a proper can-post check that's consistent // @fixme do a proper can-post check that's consistent
// with the JS side // with the JS side
if (common_current_user()) { if (common_current_user()) {
$item = new ThreadedNoticeListReplyItem($notice, $this->out); $item = new ThreadedNoticeListReplyItem($this->notice, $this->out);
$item->show(); $item->show();
} }
$this->out->elementEnd('ul');
} }
$this->out->elementEnd('ul');
} }
parent::showEnd(); parent::showEnd();
@ -227,6 +231,13 @@ class ThreadedNoticeListSubItem extends NoticeListItem
{ {
// //
} }
function showEnd()
{
$item = new ThreadedNoticeListInlineFavesItem($this->notice, $this->out);
$hasFaves = $item->show();
parent::showEnd();
}
} }
/** /**
@ -316,4 +327,99 @@ class ThreadedNoticeListReplyItem extends NoticeListItem
$this->out->element('input', array('class' => 'placeholder', $this->out->element('input', array('class' => 'placeholder',
'value' => _('Write a reply...'))); 'value' => _('Write a reply...')));
} }
} }
/**
* Placeholder for showing faves...
*/
class ThreadedNoticeListFavesItem extends NoticeListItem
{
function show()
{
// @fixme caching & scalability!
$fave = new Fave();
$fave->notice_id = $this->notice->id;
$fave->find();
$cur = common_current_user();
$profiles = array();
$you = false;
while ($fave->fetch()) {
if ($cur && $cur->id == $fave->user_id) {
$you = true;
} else {
$profiles[] = $fave->user_id;
}
}
$links = array();
if ($you) {
$links[] = _m('FAVELIST', 'You');
}
foreach ($profiles as $id) {
$profile = Profile::staticGet('id', $id);
if ($profile) {
$links[] = sprintf('<a href="%s" title="%s">%s</a>',
htmlspecialchars($profile->profileurl),
htmlspecialchars($profile->getBestName()),
htmlspecialchars($profile->nickname));
}
}
if ($links) {
$count = count($links);
if ($count == 1 && $you) {
// darn first person being different from third person!
$msg = _m('FAVELIST', 'You have favored this notice.');
} else {
// if 'you' is the first item,
$msg = _m('FAVELIST', '%1$s has favored this notice.', '%1$s have favored this notice.', $count);
}
$out = sprintf($msg, $this->magicList($links));
$this->showStart();
$this->out->raw($out);
$this->showEnd();
return $count;
} else {
return 0;
}
}
function showStart()
{
$this->out->elementStart('li', array('class' => 'notice-data notice-faves'));
}
function showEnd()
{
$this->out->elementEnd('li');
}
function magicList($items)
{
if (count($items) == 0) {
return '';
} else if (count($items) == 1) {
return $items[0];
} else {
$first = array_slice($items, 0, -1);
$last = array_slice($items, -1, 1);
// TRANS For building a list such as "You, bob, mary and 5 others have favored this notice".
return sprintf(_m('FAVELIST', '%1$s and %2$s'), implode(', ', $first), implode(', ', $last));
}
}
}
class ThreadedNoticeListInlineFavesItem extends ThreadedNoticeListFavesItem
{
function showStart()
{
$this->out->elementStart('div', array('class' => 'entry-content notice-faves'));
}
function showEnd()
{
$this->out->elementEnd('div');
}
}

View File

@ -577,7 +577,8 @@ div.entry-content a.response:after {
font-size: 1em; font-size: 1em;
} }
#content .notice .threaded-replies .notice { #content .notice .threaded-replies .notice,
#content .notice .threaded-replies .notice-data {
width: 440px; width: 440px;
min-height: 1px; min-height: 1px;
padding-bottom: 14px; padding-bottom: 14px;