Merge branch '1.0.x' of gitorious.org:statusnet/mainline into prefillbookmark

This commit is contained in:
Evan Prodromou 2011-04-14 21:55:16 -04:00
commit 41a883aeab
68 changed files with 1720 additions and 879 deletions

View File

@ -1351,3 +1351,33 @@ EndValidateEmailInvite: after validating an email address for invitations
- $user: user doing the invite - $user: user doing the invite
- $email: email address - $email: email address
- &$valid: flag for if it's valid; can be modified - &$valid: flag for if it's valid; can be modified
StartLocalURL: before resolving a local url for an action
- &$action: action to find a path for
- &$paramsi: parameters to pass to the action
- &$fragment: any url fragement
- &$addSession: whether to add session variable
- &$url: resulting URL to local resource
EndLocalURL: before resolving a local url for an action
- &$action: action to find a path for
- &$paramsi: parameters to pass to the action
- &$fragment: any url fragement
- &$addSession: whether to add session variable
- &$url: resulting URL to local resource
StartProfileGetAvatar: When getting an avatar for a profile
- $profile: profile
- $size: size of the avatar
- &$avatar: avatar
EndProfileGetAvatar: After getting an avatar for a profile
- $profile: profile
- $size: size of the avatar
- &$avatar: avatar
StartRegisterSuccess: Before showing the registration success message
- $action: the registration action
StartRegisterSuccess: After showing the registration success message
- $action: the registration action

View File

@ -183,6 +183,16 @@ class AllAction extends ProfileAction
} }
} }
function showSections()
{
$this->showSubscriptions();
$ibs = new InviteButtonSection($this);
$ibs->show();
$this->showSubscribers();
$this->showGroups();
$this->showLists();
}
function showPageTitle() function showPageTitle()
{ {
$user = common_current_user(); $user = common_current_user();

View File

@ -146,13 +146,15 @@ class AvatarsettingsAction extends SettingsAction
// TRANS: Header on avatar upload page for thumbnail of to be used rendition of uploaded avatar (h2). // TRANS: Header on avatar upload page for thumbnail of to be used rendition of uploaded avatar (h2).
$this->element('h2', null, _("Preview")); $this->element('h2', null, _("Preview"));
$this->elementStart('div', array('id'=>'avatar_preview_view')); $this->elementStart('div', array('id'=>'avatar_preview_view'));
$this->element('img', array('src' => $original->url, $this->element('img', array('src' => $avatar->url,
'width' => AVATAR_PROFILE_SIZE, 'width' => AVATAR_PROFILE_SIZE,
'height' => AVATAR_PROFILE_SIZE, 'height' => AVATAR_PROFILE_SIZE,
'alt' => $user->nickname)); 'alt' => $user->nickname));
$this->elementEnd('div'); $this->elementEnd('div');
if (!empty($avatar->filename)) {
// TRANS: Button on avatar upload page to delete current avatar. // TRANS: Button on avatar upload page to delete current avatar.
$this->submit('delete', _m('BUTTON','Delete')); $this->submit('delete', _m('BUTTON','Delete'));
}
$this->elementEnd('li'); $this->elementEnd('li');
} }

View File

@ -49,11 +49,11 @@ class EditpeopletagAction extends OwnerDesignAction
if ($_SERVER['REQUEST_METHOD'] == 'POST' && $this->boolean('delete')) { if ($_SERVER['REQUEST_METHOD'] == 'POST' && $this->boolean('delete')) {
// TRANS: Title for edit people tag page after deleting a tag. // TRANS: Title for edit people tag page after deleting a tag.
// TRANS: %s is a tag. // TRANS: %s is a tag.
return sprintf(_('Delete %s people tag'), $this->peopletag->tag); return sprintf(_('Delete %s list'), $this->peopletag->tag);
} }
// TRANS: Title for edit people tag page. // TRANS: Title for edit people tag page.
// TRANS: %s is a tag. // TRANS: %s is a tag.
return sprintf(_('Edit people tag %s'), $this->peopletag->tag); return sprintf(_('Edit list %s'), $this->peopletag->tag);
} }
/** /**
@ -106,7 +106,7 @@ class EditpeopletagAction extends OwnerDesignAction
if (!$this->peopletag) { if (!$this->peopletag) {
// TRANS: Client error displayed when referring to a non-exsting people tag. // TRANS: Client error displayed when referring to a non-exsting people tag.
$this->clientError(_('No such people tag.'), 404); $this->clientError(_('No such list.'), 404);
return false; return false;
} }
@ -216,7 +216,7 @@ class EditpeopletagAction extends OwnerDesignAction
} else { } else {
$this->element('p', 'instructions', $this->element('p', 'instructions',
// TRANS: Form instruction for edit people tag form. // TRANS: Form instruction for edit people tag form.
_('Use this form to edit the people tag.')); _('Use this form to edit the list.'));
} }
} }
@ -294,7 +294,7 @@ class EditpeopletagAction extends OwnerDesignAction
if (!$result) { if (!$result) {
common_log_db_error($this->group, 'UPDATE', __FILE__); common_log_db_error($this->group, 'UPDATE', __FILE__);
// TRANS: TRANS: Server error displayed when updating a people tag fails. // TRANS: TRANS: Server error displayed when updating a people tag fails.
$this->serverError(_('Could not update people tag.')); $this->serverError(_('Could not update list.'));
} }
$this->peopletag->query('COMMIT'); $this->peopletag->query('COMMIT');

View File

@ -296,10 +296,4 @@ class InviteAction extends CurrentUserDesignAction
mail_send($recipients, $headers, $body); mail_send($recipients, $headers, $body);
} }
function showObjectNav()
{
$nav = new SubGroupNav($this, common_current_user());
$nav->show();
}
} }

View File

@ -93,7 +93,7 @@ class PeopletaggedAction extends OwnerDesignAction
if (!$this->peopletag) { if (!$this->peopletag) {
// TRANS: Client error displayed when referring to non-existing people tag. // TRANS: Client error displayed when referring to non-existing people tag.
$this->clientError(_('No such people tag.'), 404); $this->clientError(_('No such list.'), 404);
return false; return false;
} }
@ -105,12 +105,12 @@ class PeopletaggedAction extends OwnerDesignAction
if ($this->page == 1) { if ($this->page == 1) {
// TRANS: Title for list of people tagged by the user with a tag. // TRANS: Title for list of people tagged by the user with a tag.
// TRANS: %1$s is a tag, %2$s is a username. // TRANS: %1$s is a tag, %2$s is a username.
return sprintf(_('People tagged %1$s by %2$s'), return sprintf(_('People listed in %1$s by %2$s'),
$this->peopletag->tag, $this->tagger->nickname); $this->peopletag->tag, $this->tagger->nickname);
} else { } else {
// TRANS: Title for list of people tagged by the user with a tag. // TRANS: Title for list of people tagged by the user with a tag.
// TRANS: %1$s is a tag, %2$s is a username, %2$s is a page number. // TRANS: %1$s is a tag, %2$s is a username, %2$s is a page number.
return sprintf(_('People tagged %1$s by %2$s, page %3$d'), return sprintf(_('People listed in %1$s by %2$s, page %3$d'),
$this->peopletag->tag, $this->user->nickname, $this->peopletag->tag, $this->user->nickname,
$this->page); $this->page);
} }

View File

@ -2,7 +2,7 @@
/** /**
* StatusNet, the distributed open-source microblogging tool * StatusNet, the distributed open-source microblogging tool
* *
* People tags by a user * Lists by a user
* *
* PHP version 5 * PHP version 5
* *
@ -49,22 +49,22 @@ class PeopletagsbyuserAction extends OwnerDesignAction
if ($this->page == 1) { if ($this->page == 1) {
if ($this->isOwner()) { if ($this->isOwner()) {
if ($this->arg('private')) { if ($this->arg('private')) {
// TRANS: Title for people tags by a user page for a private tag. // TRANS: Title for lists by a user page for a private tag.
return _('Private people tags by you'); return _('Private lists by you');
} else if ($this->arg('public')) { } else if ($this->arg('public')) {
// TRANS: Title for people tags by a user page for a public tag. // TRANS: Title for lists by a user page for a public tag.
return _('Public people tags by you'); return _('Public lists by you');
} }
// TRANS: Title for people tags by a user page. // TRANS: Title for lists by a user page.
return _('People tags by you'); return _('Lists by you');
} }
// TRANS: Title for people tags by a user page. // TRANS: Title for lists by a user page.
// TRANS: %s is a user nickname. // TRANS: %s is a user nickname.
return sprintf(_('People tags by %s'), $this->tagger->nickname); return sprintf(_('Lists by %s'), $this->tagger->nickname);
} else { } else {
// TRANS: Title for people tags by a user page. // TRANS: Title for lists by a user page.
// TRANS: %1$s is a user nickname, %2$d is a page number. // TRANS: %1$s is a user nickname, %2$d is a page number.
return sprintf(_('People tags by %1$s, page %2$d'), $this->tagger->nickname, $this->page); return sprintf(_('Lists by %1$s, page %2$d'), $this->tagger->nickname, $this->page);
} }
} }
@ -124,8 +124,8 @@ class PeopletagsbyuserAction extends OwnerDesignAction
if ($this->isOwner()) { if ($this->isOwner()) {
$this->tags = $this->tagger->getPrivateTags($offset, $limit); $this->tags = $this->tagger->getPrivateTags($offset, $limit);
} else { } else {
// TRANS: Client error displayed when trying view another user's private people tags. // TRANS: Client error displayed when trying view another user's private lists.
$this->clientError(_('You cannot view others\' private people tags'), 403); $this->clientError(_('You cannot view others\' private lists'), 403);
} }
} else { } else {
$this->tags = $this->tagger->getOwnedTags(common_current_user(), $offset, $limit); $this->tags = $this->tagger->getOwnedTags(common_current_user(), $offset, $limit);
@ -160,8 +160,8 @@ class PeopletagsbyuserAction extends OwnerDesignAction
array('href' => array('href' =>
common_local_url('peopletagsforuser', common_local_url('peopletagsforuser',
array('nickname' => $this->user->nickname))), array('nickname' => $this->user->nickname))),
// TRANS: Link text to show people tags for user %s. // TRANS: Link text to show lists for user %s.
sprintf(_('People tags for %s'), $this->tagger->nickname)); sprintf(_('Lists for %s'), $this->tagger->nickname));
$this->elementEnd('li'); $this->elementEnd('li');
if ($this->isOwner()) { if ($this->isOwner()) {
@ -204,11 +204,11 @@ class PeopletagsbyuserAction extends OwnerDesignAction
function showAnonymousMessage() function showAnonymousMessage()
{ {
$notice = $notice =
// TRANS: Message displayed for anonymous users on page that displays people tags by a user. // TRANS: Message displayed for anonymous users on page that displays lists by a user.
// TRANS: This message contains Markdown links in the form [description](links). // TRANS: This message contains Markdown links in the form [description](links).
// TRANS: %s is a tagger nickname. // TRANS: %s is a tagger nickname.
sprintf(_('These are people tags created by **%s**. ' . sprintf(_('These are lists created by **%s**. ' .
'People tags are how you sort similar ' . 'Lists are how you sort similar ' .
'people on %%%%site.name%%%%, a [micro-blogging]' . 'people on %%%%site.name%%%%, a [micro-blogging]' .
'(http://en.wikipedia.org/wiki/Micro-blogging) service ' . '(http://en.wikipedia.org/wiki/Micro-blogging) service ' .
'based on the Free Software [StatusNet](http://status.net/) tool. ' . 'based on the Free Software [StatusNet](http://status.net/) tool. ' .
@ -259,17 +259,29 @@ class PeopletagsbyuserAction extends OwnerDesignAction
return !empty($user) && $user->id == $this->tagger->id; return !empty($user) && $user->id == $this->tagger->id;
} }
function showObjectNav()
{
$nav = new PeopletagNav($this, $this->tagger);
$nav->show();
}
function showEmptyListMessage() function showEmptyListMessage()
{ {
// TRANS: Message displayed on page that displays people tags by a user when there are none. // TRANS: Message displayed on page that displays lists by a user when there are none.
// TRANS: This message contains Markdown links in the form [description](links). // TRANS: This message contains Markdown links in the form [description](links).
// TRANS: %s is a tagger nickname. // TRANS: %s is a tagger nickname.
$message = sprintf(_('%s has not created any [people tags](%%%%doc.tags%%%%) yet.'), $this->tagger->nickname); $message = sprintf(_('%s has not created any [lists](%%%%doc.lists%%%%) yet.'), $this->tagger->nickname);
$this->elementStart('div', 'guide'); $this->elementStart('div', 'guide');
$this->raw(common_markup_to_html($message)); $this->raw(common_markup_to_html($message));
$this->elementEnd('div'); $this->elementEnd('div');
} }
function showProfileBlock()
{
$block = new AccountProfileBlock($this, $this->tagger);
$block->show();
}
function showSections() function showSections()
{ {
#TODO: tags with most subscribers #TODO: tags with most subscribers

View File

@ -47,10 +47,10 @@ class PeopletagsforuserAction extends OwnerDesignAction
{ {
if ($this->page == 1) { if ($this->page == 1) {
// Page title. %s is a tagged user's nickname. // Page title. %s is a tagged user's nickname.
return sprintf(_('People tags for %s'), $this->tagged->nickname); return sprintf(_('Lists with %s in them'), $this->tagged->nickname);
} else { } else {
// Page title. %1$s is a tagged user's nickname, %2$s is a page number. // Page title. %1$s is a tagged user's nickname, %2$s is a page number.
return sprintf(_('People tags for %1$s, page %2$d'), $this->tagged->nickname, $this->page); return sprintf(_('Lists with %1$s, page %2$d'), $this->tagged->nickname, $this->page);
} }
} }
@ -105,8 +105,8 @@ class PeopletagsforuserAction extends OwnerDesignAction
// TRANS: Message displayed for anonymous users on page that displays people tags for a user. // TRANS: Message displayed for anonymous users on page that displays people tags for a user.
// TRANS: This message contains Markdown links in the form [description](links). // TRANS: This message contains Markdown links in the form [description](links).
// TRANS: %s is a tagger nickname. // TRANS: %s is a tagger nickname.
sprintf(_('These are people tags for **%s**. ' . sprintf(_('These are lists for **%s**. ' .
'People tags are how you sort similar ' . 'lists are how you sort similar ' .
'people on %%%%site.name%%%%, a [micro-blogging]' . 'people on %%%%site.name%%%%, a [micro-blogging]' .
'(http://en.wikipedia.org/wiki/Micro-blogging) service ' . '(http://en.wikipedia.org/wiki/Micro-blogging) service ' .
'based on the Free Software [StatusNet](http://status.net/) tool. ' . 'based on the Free Software [StatusNet](http://status.net/) tool. ' .
@ -117,27 +117,6 @@ class PeopletagsforuserAction extends OwnerDesignAction
$this->elementEnd('div'); $this->elementEnd('div');
} }
function showPageNotice()
{
$this->elementStart('dl', 'filter_tags');
$this->elementStart('dd', array('id' => 'filter_tags_for',
'class' => 'child_1'));
$user = common_current_user();
// TRANS: Page notice.
$text = ($this->tagged->id == @$user->id) ? _('People tags by you') :
// TRANS: Page notice. %s is a tagger's nickname.
sprintf(_('People tags by %s'), $this->tagged->nickname);
$this->element('a',
array('href' =>
common_local_url('peopletagsbyuser',
array('nickname' => $this->tagged->nickname))),
$text);
$this->elementEnd('dd');
$this->elementEnd('dl');
}
function showContent() function showContent()
{ {
#TODO: controls here. #TODO: controls here.
@ -162,12 +141,24 @@ class PeopletagsforuserAction extends OwnerDesignAction
// TRANS: Message displayed on page that displays people tags for a user when there are none. // TRANS: Message displayed on page that displays people tags for a user when there are none.
// TRANS: This message contains Markdown links in the form [description](links). // TRANS: This message contains Markdown links in the form [description](links).
// TRANS: %s is a tagger nickname. // TRANS: %s is a tagger nickname.
$message = sprintf(_('%s has not been [tagged](%%%%doc.tags%%%%) by anyone yet.'), $this->tagged->nickname); $message = sprintf(_('%s has not been [listed](%%%%doc.lists%%%%) by anyone yet.'), $this->tagged->nickname);
$this->elementStart('div', 'guide'); $this->elementStart('div', 'guide');
$this->raw(common_markup_to_html($message)); $this->raw(common_markup_to_html($message));
$this->elementEnd('div'); $this->elementEnd('div');
} }
function showObjectNav()
{
$nav = new PeopletagNav($this, $this->tagged);
$nav->show();
}
function showProfileBlock()
{
$block = new AccountProfileBlock($this, $this->tagged);
$block->show();
}
function showSections() function showSections()
{ {
#TODO: tags with most subscribers #TODO: tags with most subscribers

View File

@ -48,11 +48,11 @@ class PeopletagsubscriptionsAction extends OwnerDesignAction
if ($this->page == 1) { if ($this->page == 1) {
// TRANS: Title for page that displays people tags subscribed to by a user. // TRANS: Title for page that displays people tags subscribed to by a user.
// TRANS: %s is a profile nickname. // TRANS: %s is a profile nickname.
return sprintf(_('People tags subscriptions by %s'), $this->profile->nickname); return sprintf(_('Lists subscribed to by %s'), $this->profile->nickname);
} else { } else {
// TRANS: Title for page that displays people tags subscribed to by a user. // TRANS: Title for page that displays people tags subscribed to by a user.
// TRANS: %1$s is a profile nickname, %2$d is a page number. // TRANS: %1$s is a profile nickname, %2$d is a page number.
return sprintf(_('People tags subscriptions by %1$s, page %2$d'), $this->profile->nickname, $this->page); return sprintf(_('Lists subscribed to by %1$s, page %2$d'), $this->profile->nickname, $this->page);
} }
} }
@ -107,13 +107,13 @@ class PeopletagsubscriptionsAction extends OwnerDesignAction
// TRANS: Message displayed for anonymous users on page that displays people tags subscribed to by a user. // TRANS: Message displayed for anonymous users on page that displays people tags subscribed to by a user.
// TRANS: This message contains Markdown links in the form [description](links). // TRANS: This message contains Markdown links in the form [description](links).
// TRANS: %s is a profile nickname. // TRANS: %s is a profile nickname.
sprintf(_('These are people tags subscribed to by **%s**. ' . sprintf(_('These are lists subscribed to by **%s**. ' .
'People tags are how you sort similar ' . 'Lists are how you sort similar ' .
'people on %%%%site.name%%%%, a [micro-blogging]' . 'people on %%%%site.name%%%%, a [micro-blogging]' .
'(http://en.wikipedia.org/wiki/Micro-blogging) service ' . '(http://en.wikipedia.org/wiki/Micro-blogging) service ' .
'based on the Free Software [StatusNet](http://status.net/) tool. ' . 'based on the Free Software [StatusNet](http://status.net/) tool. ' .
'You can easily keep track of what they ' . 'You can easily keep track of what they ' .
'are doing by subscribing to the tag\'s timeline.' ), $this->profile->nickname); 'are doing by subscribing to the list\'s timeline.' ), $this->profile->nickname);
$this->elementStart('div', array('id' => 'anon_notice')); $this->elementStart('div', array('id' => 'anon_notice'));
$this->raw(common_markup_to_html($notice)); $this->raw(common_markup_to_html($notice));
$this->elementEnd('div'); $this->elementEnd('div');
@ -133,6 +133,18 @@ class PeopletagsubscriptionsAction extends OwnerDesignAction
$this->page, 'peopletagsubscriptions', array('nickname' => $this->profile->id)); $this->page, 'peopletagsubscriptions', array('nickname' => $this->profile->id));
} }
function showObjectNav()
{
$nav = new PeopletagNav($this, $this->profile);
$nav->show();
}
function showProfileBlock()
{
$block = new AccountProfileBlock($this, $this->profile);
$block->show();
}
function showSections() function showSections()
{ {
#TODO: tags with most subscribers #TODO: tags with most subscribers

View File

@ -222,14 +222,12 @@ class PublicAction extends Action
function showSections() function showSections()
{ {
// $top = new TopPostersSection($this);
// $top->show();
$pop = new PopularNoticeSection($this); $pop = new PopularNoticeSection($this);
$pop->show(); $pop->show();
$ibs = new InviteButtonSection($this);
$ibs->show();
$gbp = new GroupsByMembersSection($this); $gbp = new GroupsByMembersSection($this);
$gbp->show(); $gbp->show();
$ptp = new PeopletagsBySubsSection($this);
$ptp->show();
$feat = new FeaturedUsersSection($this); $feat = new FeaturedUsersSection($this);
$feat->show(); $feat->show();
} }

View File

@ -605,6 +605,8 @@ class RegisterAction extends Action
*/ */
function showSuccessContent() function showSuccessContent()
{ {
if (Event::handle('onStartRegisterSuccess', array($this))) {
$nickname = $this->arg('nickname'); $nickname = $this->arg('nickname');
$profileurl = common_local_url('showstream', $profileurl = common_local_url('showstream',
@ -647,6 +649,9 @@ class RegisterAction extends Action
$this->raw(common_markup_to_html($emailinstr)); $this->raw(common_markup_to_html($emailinstr));
} }
$this->elementEnd('div'); $this->elementEnd('div');
Event::handle('onEndRegisterSuccess', array($this));
}
} }
/** /**
@ -656,15 +661,23 @@ class RegisterAction extends Action
*/ */
function showLocalNav() function showLocalNav()
{ {
if (common_logged_in()) {
parent::showLocalNav();
} else {
$nav = new LoginGroupNav($this); $nav = new LoginGroupNav($this);
$nav->show(); $nav->show();
} }
function showNoticeForm()
{
} }
/**
* Show a bit of login context
*
* @return nothing
*/
function showProfileBlock() function showProfileBlock()
{ {
if (common_logged_in()) {
parent::showProfileBlock();
}
} }
} }

View File

@ -33,7 +33,7 @@ require_once INSTALLDIR.'/lib/feedlist.php';
class ShowprofiletagAction extends Action class ShowprofiletagAction extends Action
{ {
var $notice, $tagger, $peopletag; var $notice, $tagger, $peopletag, $userProfile;
function isReadOnly($args) function isReadOnly($args)
{ {
@ -88,7 +88,12 @@ class ShowprofiletagAction extends Action
} }
$this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1; $this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
$this->notice = $this->peopletag->getNotices(($this->page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1); $this->userProfile = Profile::current();
$stream = new PeopletagNoticeStream($this->peopletag, $this->userProfile);
$this->notice = $stream->getNotices(($this->page-1)*NOTICES_PER_PAGE,
NOTICES_PER_PAGE + 1);
if ($this->page > 1 && $this->notice->N == 0) { if ($this->page > 1 && $this->notice->N == 0) {
// TRANS: Server error when page not found (404). // TRANS: Server error when page not found (404).
@ -117,7 +122,7 @@ class ShowprofiletagAction extends Action
if($this->peopletag->private) { if($this->peopletag->private) {
// TRANS: Title for private people tag timeline. // TRANS: Title for private people tag timeline.
// TRANS: %1$s is a people tag, %2$s is a page number. // TRANS: %1$s is a people tag, %2$s is a page number.
return sprintf(_('Private timeline for people tagged %1$s by you, page %2$d'), return sprintf(_('Private timeline for %1$s list by you, page %2$d'),
$this->peopletag->tag, $this->page); $this->peopletag->tag, $this->page);
} }
@ -125,13 +130,13 @@ class ShowprofiletagAction extends Action
if (!empty($current) && $current->id == $this->peopletag->tagger) { if (!empty($current) && $current->id == $this->peopletag->tagger) {
// TRANS: Title for public people tag timeline where the viewer is the tagger. // TRANS: Title for public people tag timeline where the viewer is the tagger.
// TRANS: %1$s is a people tag, %2$s is a page number. // TRANS: %1$s is a people tag, %2$s is a page number.
return sprintf(_('Timeline for people tagged %1$s by you, page %2$d'), return sprintf(_('Timeline for %1$s list by you, page %2$d'),
$this->peopletag->tag, $this->page); $this->peopletag->tag, $this->page);
} }
// TRANS: Title for private people tag timeline. // TRANS: Title for private people tag timeline.
// TRANS: %1$s is a people tag, %2$s is the tagger's nickname, %3$d is a page number. // TRANS: %1$s is a people tag, %2$s is the tagger's nickname, %3$d is a page number.
return sprintf(_('Timeline for people tagged %1$s by %2$s, page %3$d'), return sprintf(_('Timeline for %1$s list by %2$s, page %3$d'),
$this->peopletag->tag, $this->peopletag->tag,
$this->tagger->nickname, $this->tagger->nickname,
$this->page $this->page
@ -140,7 +145,7 @@ class ShowprofiletagAction extends Action
if($this->peopletag->private) { if($this->peopletag->private) {
// TRANS: Title for private people tag timeline. // TRANS: Title for private people tag timeline.
// TRANS: %s is a people tag. // TRANS: %s is a people tag.
return sprintf(_('Private timeline of people tagged %s by you'), return sprintf(_('Private timeline of %s list by you'),
$this->peopletag->tag); $this->peopletag->tag);
} }
@ -148,13 +153,13 @@ class ShowprofiletagAction extends Action
if (!empty($current) && $current->id == $this->peopletag->tagger) { if (!empty($current) && $current->id == $this->peopletag->tagger) {
// TRANS: Title for public people tag timeline where the viewer is the tagger. // TRANS: Title for public people tag timeline where the viewer is the tagger.
// TRANS: %s is a people tag. // TRANS: %s is a people tag.
return sprintf(_('Timeline for people tagged %s by you'), return sprintf(_('Timeline for %s list by you'),
$this->peopletag->tag); $this->peopletag->tag);
} }
// TRANS: Title for private people tag timeline. // TRANS: Title for private people tag timeline.
// TRANS: %1$s is a people tag, %2$s is the tagger's nickname. // TRANS: %1$s is a people tag, %2$s is the tagger's nickname.
return sprintf(_('Timeline for people tagged %1$s by %2$s'), return sprintf(_('Timeline for %1$s list by %2$s'),
$this->peopletag->tag, $this->peopletag->tag,
$this->tagger->nickname $this->tagger->nickname
); );
@ -185,7 +190,7 @@ class ShowprofiletagAction extends Action
), ),
// TRANS: Feed title. // TRANS: Feed title.
// TRANS: %1$s is a people tag, %2$s is tagger's nickname. // TRANS: %1$s is a people tag, %2$s is tagger's nickname.
sprintf(_('Feed for people tagged %1$s by %2$s (Atom)'), sprintf(_('Feed for %1$s list by %2$s (Atom)'),
$this->peopletag->tag, $this->tagger->nickname $this->peopletag->tag, $this->tagger->nickname
) )
) )
@ -202,7 +207,7 @@ class ShowprofiletagAction extends Action
{ {
// TRANS: Empty list message for people tag timeline. // TRANS: Empty list message for people tag timeline.
// TRANS: %1$s is a people tag, %2$s is a tagger's nickname. // TRANS: %1$s is a people tag, %2$s is a tagger's nickname.
$message = sprintf(_('This is the timeline for people tagged %1$s by %2$s but no one has posted anything yet.'), $message = sprintf(_('This is the timeline for %1$s list by %2$s but no one has posted anything yet.'),
$this->peopletag->tag, $this->peopletag->tag,
$this->tagger->nickname) . ' '; $this->tagger->nickname) . ' ';
@ -239,7 +244,7 @@ class ShowprofiletagAction extends Action
function showNotices() function showNotices()
{ {
if (Event::handle('StartShowProfileTagContent', array($this))) { if (Event::handle('StartShowProfileTagContent', array($this))) {
$nl = new NoticeList($this->notice, $this); $nl = new ThreadedNoticeList($this->notice, $this, $this->userProfile);
$cnt = $nl->show(); $cnt = $nl->show();
@ -247,9 +252,11 @@ class ShowprofiletagAction extends Action
$this->showEmptyListMessage(); $this->showEmptyListMessage();
} }
$this->pagination( $this->pagination($this->page > 1,
$this->page > 1, $cnt > NOTICES_PER_PAGE, $cnt > NOTICES_PER_PAGE,
$this->page, 'showprofiletag', array('tag' => $this->peopletag->tag, $this->page,
'showprofiletag',
array('tag' => $this->peopletag->tag,
'tagger' => $this->tagger->nickname) 'tagger' => $this->tagger->nickname)
); );
@ -284,11 +291,11 @@ class ShowprofiletagAction extends Action
if(!empty($current) && $this->peopletag->tagger == $current->id) { if(!empty($current) && $this->peopletag->tagger == $current->id) {
// TRANS: Header on show profile tag page. // TRANS: Header on show profile tag page.
// TRANS: %s is a people tag. // TRANS: %s is a people tag.
$title = sprintf(_('People tagged %s by you'), $this->peopletag->tag); $title = sprintf(_('Listed'), $this->peopletag->tag);
} else { } else {
// TRANS: Header on show profile tag page. // TRANS: Header on show profile tag page.
// TRANS: %1$s is a people tag, %2$s is a tagger's nickname. // TRANS: %1$s is a people tag, %2$s is a tagger's nickname.
$title = sprintf(_('People tagged %1$s by %2$s'), $title = sprintf(_('Listed'),
$this->peopletag->tag, $this->peopletag->tag,
$this->tagger->nickname); $this->tagger->nickname);
} }

View File

@ -103,12 +103,6 @@ class ShowstreamAction extends ProfileAction
$this->showNotices(); $this->showNotices();
} }
function showObjectNav()
{
$nav = new SubGroupNav($this, $this->user);
$nav->show();
}
function showProfileBlock() function showProfileBlock()
{ {
$block = new AccountProfileBlock($this, $this->profile); $block = new AccountProfileBlock($this, $this->profile);

View File

@ -135,11 +135,6 @@ class SubscribersAction extends GalleryAction
function showSections() function showSections()
{ {
parent::showSections(); parent::showSections();
$cloud = new SubscribersPeopleTagCloudSection($this);
$cloud->show();
$cloud2 = new SubscribersPeopleSelfTagCloudSection($this);
$cloud2->show();
} }
} }

View File

@ -152,16 +152,6 @@ class SubscriptionsAction extends GalleryAction
$this->elementEnd('div'); $this->elementEnd('div');
} }
function showSections()
{
parent::showSections();
$cloud = new SubscriptionsPeopleTagCloudSection($this);
$cloud->show();
$cloud2 = new SubscriptionsPeopleSelfTagCloudSection($this);
$cloud2->show();
}
/** /**
* Link to feeds of subscriptions * Link to feeds of subscriptions
* *

View File

@ -55,12 +55,6 @@ class TagAction extends Action
return true; return true;
} }
function showSections()
{
$pop = new PopularNoticeSection($this);
$pop->show();
}
function title() function title()
{ {
if ($this->page == 1) { if ($this->page == 1) {

View File

@ -45,7 +45,7 @@ require_once INSTALLDIR.'/lib/grouplist.php';
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class UsergroupsAction extends OwnerDesignAction class UsergroupsAction extends ProfileAction
{ {
var $page = null; var $page = null;
var $profile = null; var $profile = null;
@ -115,12 +115,6 @@ class UsergroupsAction extends OwnerDesignAction
$this->showPage(); $this->showPage();
} }
function showObjectNav()
{
$nav = new SubGroupNav($this, $this->user);
$nav->show();
}
function showContent() function showContent()
{ {
$this->elementStart('p', array('id' => 'new_group')); $this->elementStart('p', array('id' => 'new_group'));

View File

@ -545,12 +545,6 @@ class Notice extends Memcached_DataObject
$notice->saveKnownGroups($groups); $notice->saveKnownGroups($groups);
if (isset($peopletags)) {
$notice->saveProfileTags($peopletags);
} else {
$notice->saveProfileTags();
}
if (isset($urls)) { if (isset($urls)) {
$notice->saveKnownUrls($urls); $notice->saveKnownUrls($urls);
} else { } else {
@ -596,6 +590,11 @@ class Notice extends Memcached_DataObject
if (!empty($profile)) { if (!empty($profile)) {
$profile->blowNoticeCount(); $profile->blowNoticeCount();
} }
$ptags = $this->getProfileTags();
foreach ($ptags as $ptag) {
$ptag->blowNoticeStreamCache();
}
} }
/** /**
@ -618,6 +617,11 @@ class Notice extends Memcached_DataObject
// In case we're the first, will need to calc a new root. // In case we're the first, will need to calc a new root.
self::blow('notice:conversation_root:%d', $this->conversation); self::blow('notice:conversation_root:%d', $this->conversation);
} }
$ptags = $this->getProfileTags();
foreach ($ptags as $ptag) {
$ptag->blowNoticeStreamCache(true);
}
} }
/** save all urls in the notice to the db /** save all urls in the notice to the db
@ -1030,33 +1034,13 @@ class Notice extends Memcached_DataObject
function getProfileTags() function getProfileTags()
{ {
// Don't save ptags for repeats, for now. $profile = $this->getProfile();
$list = $profile->getOtherTags($profile);
if (!empty($this->repeat_of)) {
return array();
}
// XXX: cache me
$ptags = array(); $ptags = array();
$ptagi = new Profile_tag_inbox(); while($list->fetch()) {
$ptags[] = clone($list);
$ptagi->selectAdd();
$ptagi->selectAdd('profile_tag_id');
$ptagi->notice_id = $this->id;
if ($ptagi->find()) {
while ($ptagi->fetch()) {
$profile_list = Profile_list::staticGet('id', $ptagi->profile_tag_id);
if ($profile_list) {
$ptags[] = $profile_list;
} }
}
}
$ptagi->free();
return $ptags; return $ptags;
} }
@ -1173,72 +1157,6 @@ class Notice extends Memcached_DataObject
return true; return true;
} }
/**
* record targets into profile_tag_inbox.
* @return array of Profile_list objects
*/
function saveProfileTags($known=array())
{
// Don't save ptags for repeats, for now
if (!empty($this->repeat_of)) {
return array();
}
if (is_array($known)) {
$ptags = $known;
} else {
$ptags = array();
}
$ptag = new Profile_tag();
$ptag->tagged = $this->profile_id;
if($ptag->find()) {
while($ptag->fetch()) {
$plist = Profile_list::getByTaggerAndTag($ptag->tagger, $ptag->tag);
if (!empty($plist)) {
$ptags[] = clone($plist);
}
}
}
foreach ($ptags as $target) {
$this->addToProfileTagInbox($target);
}
return $ptags;
}
function addToProfileTagInbox($plist)
{
$ptagi = Profile_tag_inbox::pkeyGet(array('profile_tag_id' => $plist->id,
'notice_id' => $this->id));
if (empty($ptagi)) {
$ptagi = new Profile_tag_inbox();
$ptagi->query('BEGIN');
$ptagi->profile_tag_id = $plist->id;
$ptagi->notice_id = $this->id;
$ptagi->created = $this->created;
$result = $ptagi->insert();
if (!$result) {
common_log_db_error($ptagi, 'INSERT', __FILE__);
// TRANS: Server exception thrown when saving profile_tag inbox fails.
throw new ServerException(_('Problem saving profile_tag inbox.'));
}
$ptagi->query('COMMIT');
self::blow('profile_tag:notice_ids:%d', $ptagi->profile_tag_id);
}
return true;
}
/** /**
* Save reply records indicating that this notice needs to be * Save reply records indicating that this notice needs to be
* delivered to the local users with the given URIs. * delivered to the local users with the given URIs.

View File

@ -68,9 +68,17 @@ class Profile extends Memcached_DataObject
if (is_null($height)) { if (is_null($height)) {
$height = $width; $height = $width;
} }
return Avatar::pkeyGet(array('profile_id' => $this->id,
$avatar = null;
if (Event::handle('StartProfileGetAvatar', array($this, $width, &$avatar))) {
$avatar = Avatar::pkeyGet(array('profile_id' => $this->id,
'width' => $width, 'width' => $width,
'height' => $height)); 'height' => $height));
Event::handle('EndProfileGetAvatar', array($this, $width, &$avatar));
}
return $avatar;
} }
function getOriginalAvatar() function getOriginalAvatar()
@ -1315,4 +1323,42 @@ class Profile extends Memcached_DataObject
} }
return $profile; return $profile;
} }
function getLists()
{
$ids = array();
$keypart = sprintf('profile:lists:%d', $this->id);
$idstr = self::cacheGet($keypart);
if ($idstr !== false) {
$ids = explode(',', $idstr);
} else {
$list = new Profile_list();
$list->selectAdd();
$list->selectAdd('id');
$list->tagger = $this->id;
if ($list->find()) {
while ($list->fetch()) {
$ids[] = $list->id;
}
}
self::cacheSet($keypart, implode(',', $ids));
}
$lists = array();
foreach ($ids as $id) {
$list = Profile_list::staticGet('id', $id);
if (!empty($list) &&
($showPrivate || !$list->private)) {
$lists[] = $list;
}
}
return new ArrayWrapper($lists);
}
} }

View File

@ -170,51 +170,6 @@ class Profile_list extends Memcached_DataObject
return $stream->getNotices($offset, $limit, $since_id, $max_id); return $stream->getNotices($offset, $limit, $since_id, $max_id);
} }
/**
* Query notices by users associated with this tag from the database.
*
* @param integer $offset offset
* @param integer $limit maximum no of results
* @param integer $since_id=null since this id
* @param integer $max_id=null maximum id in result
*
* @return array array of notice ids.
*/
function _streamDirect($offset, $limit, $since_id, $max_id)
{
$inbox = new Profile_tag_inbox();
$inbox->profile_tag_id = $this->id;
$inbox->selectAdd();
$inbox->selectAdd('notice_id');
if ($since_id != 0) {
$inbox->whereAdd('notice_id > ' . $since_id);
}
if ($max_id != 0) {
$inbox->whereAdd('notice_id <= ' . $max_id);
}
$inbox->orderBy('notice_id DESC');
if (!is_null($offset)) {
$inbox->limit($offset, $limit);
}
$ids = array();
if ($inbox->find()) {
while ($inbox->fetch()) {
$ids[] = $inbox->notice_id;
}
}
return $ids;
}
/** /**
* Get subscribers (local and remote) to this people tag * Get subscribers (local and remote) to this people tag
* Order by reverse chronology * Order by reverse chronology
@ -371,6 +326,8 @@ class Profile_list extends Memcached_DataObject
Profile_tag::cleanup($this); Profile_tag::cleanup($this);
Profile_tag_subscription::cleanup($this); Profile_tag_subscription::cleanup($this);
self::blow('profile:lists:%d', $this->tagger);
return parent::delete(); return parent::delete();
} }
@ -467,18 +424,24 @@ class Profile_list extends Memcached_DataObject
function taggedCount($recount=false) function taggedCount($recount=false)
{ {
if (!$recount) { $keypart = sprintf('profile_list:tagged_count:%d:%s',
return $this->tagged_count; $this->tagger,
} $this->tag);
$count = self::cacheGet($keypart);
if ($count === false) {
$tags = new Profile_tag(); $tags = new Profile_tag();
$tags->tag = $this->tag; $tags->tag = $this->tag;
$tags->tagger = $this->tagger; $tags->tagger = $this->tagger;
$orig = clone($this);
$this->tagged_count = (int) $tags->count('distinct tagged');
$this->update($orig);
return $this->tagged_count; $count = $tags->count('distinct tagged');
self::cacheSet($keypart, $count);
}
return $count;
} }
/** /**
@ -492,17 +455,38 @@ class Profile_list extends Memcached_DataObject
function subscriberCount($recount=false) function subscriberCount($recount=false)
{ {
if ($recount) { $keypart = sprintf('profile_list:subscriber_count:%d',
return $this->subscriber_count; $this->id);
}
$count = self::cacheGet($keypart);
if ($count === false) {
$sub = new Profile_tag_subscription(); $sub = new Profile_tag_subscription();
$sub->profile_tag_id = $this->id; $sub->profile_tag_id = $this->id;
$orig = clone($this); $count = (int) $sub->count('distinct profile_id');
$this->subscriber_count = (int) $sub->count('distinct profile_id');
$this->update($orig);
return $this->subscriber_count; self::cacheSet($keypart, $count);
}
return $count;
}
/**
* get the cached number of profiles subscribed to this
* people tag, re-count if the argument is true.
*
* @param boolean $recount whether to ignore cache
*
* @return integer count
*/
function blowNoticeStreamCache($all=false)
{
self::blow('profile_list:notice_ids:%d', $this->id);
if ($all) {
self::blow('profile_list:notice_ids:%d;last', $this->id);
}
} }
/** /**
@ -928,4 +912,13 @@ class Profile_list extends Memcached_DataObject
return new ArrayWrapper($wrapped); return new ArrayWrapper($wrapped);
} }
} }
function insert()
{
$result = parent::insert();
if ($result) {
self::blow('profile:lists:%d', $this->tagger);
}
return $result;
}
} }

View File

@ -291,4 +291,26 @@ class Profile_tag extends Memcached_DataObject
} }
return true; return true;
} }
function insert()
{
$result = parent::insert();
if ($result) {
self::blow('profile_list:tagged_count:%d:%s',
$this->tagger,
$this->tag);
}
return $result;
}
function delete()
{
$result = parent::delete();
if ($result) {
self::blow('profile_list:tagged_count:%d:%s',
$this->tagger,
$this->tag);
}
return $result;
}
} }

View File

@ -1,27 +0,0 @@
<?php
/**
* Table Definition for profile_tag_inbox
*/
class Profile_tag_inbox extends Memcached_DataObject
{
###START_AUTOCODE
/* the code below is auto generated do not remove the above tag */
public $__table = 'profile_tag_inbox'; // table name
public $profile_tag_id; // int(4) primary_key not_null
public $notice_id; // int(4) primary_key not_null
public $created; // datetime() not_null
/* Static get */
function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Profile_tag_inbox',$k,$v); }
/* the code above is auto generated do not remove the tag below */
###END_AUTOCODE
function pkeyGet($kv)
{
return Memcached_DataObject::pkeyGet('Profile_tag_inbox', $kv);
}
}

View File

@ -102,4 +102,24 @@ class Profile_tag_subscription extends Memcached_DataObject
Event::handle('StartUnsubscribePeopletag', array($profile_list, $profile)); Event::handle('StartUnsubscribePeopletag', array($profile_list, $profile));
} }
} }
function insert()
{
$result = parent::insert();
if ($result) {
self::blow('profile_list:subscriber_count:%d',
$this->profile_tag_id);
}
return $result;
}
function delete()
{
$result = parent::delete();
if ($result) {
self::blow('profile_list:subscriber_count:%d',
$this->profile_tag_id);
}
return $result;
}
} }

View File

@ -480,15 +480,6 @@ id = U
tagger = K tagger = K
tag = K tag = K
[profile_tag_inbox]
profile_tag_id = 129
notice_id = 129
created = 142
[profile_tag_inbox__keys]
profile_tag_id = K
notice_id = K
[profile_tag_subscription] [profile_tag_subscription]
profile_tag_id = 129 profile_tag_id = 129
profile_id = 129 profile_id = 129

View File

@ -11,6 +11,7 @@ id = profile:id
[notice] [notice]
profile_id = profile:id profile_id = profile:id
reply_to = notice:id reply_to = notice:id
profile_id = profile_tag:tagged
[reply] [reply]
notice_id = notice:id notice_id = notice:id
@ -67,10 +68,6 @@ tagged = profile:id
[profile_list] [profile_list]
tagger = profile:id tagger = profile:id
[profile_tag_inbox]
profile_tag_id = profile_list:id
notice_id = notice:id
[profile_tag_subscription] [profile_tag_subscription]
profile_tag_id = profile_list:id profile_tag_id = profile_list:id
profile_id = profile:id profile_id = profile:id

View File

@ -1354,13 +1354,16 @@ class Action extends HTMLOutputter // lawsuit
* *
* @return nothing * @return nothing
*/ */
function menuItem($url, $text, $title=null, $is_selected=false, $id=null) function menuItem($url, $text, $title=null, $is_selected=false, $id=null, $class=null)
{ {
// Added @id to li for some control. // Added @id to li for some control.
// XXX: We might want to move this to htmloutputter.php // XXX: We might want to move this to htmloutputter.php
$lattrs = array(); $lattrs = array();
if ($class !== null) {
$lattrs['class'] = $class;
if ($is_selected) { if ($is_selected) {
$lattrs['class'] = 'current'; $lattrs['class'] = trim('current ' . $lattrs['class']);
}
} }
(is_null($id)) ? $lattrs : $lattrs['id'] = $id; (is_null($id)) ? $lattrs : $lattrs['id'] = $id;

View File

@ -190,9 +190,9 @@ $default =
'user' => false, 'user' => false,
'group' => false), 'group' => false),
'emailpost' => 'emailpost' =>
array('enabled' => true), array('enabled' => false),
'sms' => 'sms' =>
array('enabled' => true), array('enabled' => false),
'twitterimport' => 'twitterimport' =>
array('enabled' => false), array('enabled' => false),
'integration' => 'integration' =>

View File

@ -72,6 +72,14 @@ class DefaultLocalNav extends Menu
} }
} }
if (!empty($user)) {
$sn = new ListsNav($this->action, $user->getProfile());
if ($sn->hasLists()) {
// TRANS: Menu item in default local navigation panel.
$this->submenu(_m('MENU', 'Lists'), $sn);
}
}
Event::handle('EndDefaultLocalNav', array($this, $user)); Event::handle('EndDefaultLocalNav', array($this, $user));
} }

View File

@ -42,6 +42,15 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
*/ */
class FeaturedUsersSection extends ProfileSection class FeaturedUsersSection extends ProfileSection
{ {
function show()
{
$featured_nicks = common_config('nickname', 'featured');
if (empty($featured_nicks)) {
return;
}
parent::show();
}
function getProfiles() function getProfiles()
{ {
$featured_nicks = common_config('nickname', 'featured'); $featured_nicks = common_config('nickname', 'featured');

View File

@ -28,7 +28,7 @@ require_once INSTALLDIR.'/lib/profilelist.php';
define('AVATARS_PER_PAGE', 80); define('AVATARS_PER_PAGE', 80);
// @todo FIXME: Class documentation missing. // @todo FIXME: Class documentation missing.
class GalleryAction extends OwnerDesignAction class GalleryAction extends ProfileAction
{ {
var $profile = null; var $profile = null;
var $page = null; var $page = null;
@ -97,12 +97,6 @@ class GalleryAction extends OwnerDesignAction
$this->showPage(); $this->showPage();
} }
function showObjectNav()
{
$nav = new SubGroupNav($this, $this->user);
$nav->show();
}
function showContent() function showContent()
{ {
$this->showTagsDropdown(); $this->showTagsDropdown();

View File

@ -33,7 +33,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
require_once INSTALLDIR.'/lib/grouplist.php'; require_once INSTALLDIR.'/lib/grouplist.php';
define('GROUPS_PER_MINILIST', 27); define('GROUPS_PER_MINILIST', 8);
/** /**
* Widget to show a list of groups, good for sidebar * Widget to show a list of groups, good for sidebar

View File

@ -68,7 +68,7 @@ class GroupsByMembersSection extends GroupSection
function title() function title()
{ {
// TRANS: Title for groups with the most members section. // TRANS: Title for groups with the most members section.
return _('Groups with most members'); return _('Popular groups');
} }
function divId() function divId()

View File

@ -68,7 +68,7 @@ class GroupsByPostsSection extends GroupSection
function title() function title()
{ {
// TRANS: Title for groups with the most posts section. // TRANS: Title for groups with the most posts section.
return _('Groups with most posts'); return _('Active groups');
} }
function divId() function divId()

View File

@ -0,0 +1,63 @@
<?php
/**
* StatusNet - the distributed open-source microblogging tool
* Copyright (C) 2011, StatusNet, Inc.
*
* Section for an invite button
*
* PHP version 5
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @category Section
* @package StatusNet
* @author Evan Prodromou <evan@status.net>
* @copyright 2011 StatusNet, Inc.
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/
*/
if (!defined('STATUSNET')) {
// This check helps protect against security problems;
// your code file can't be executed directly from the web.
exit(1);
}
/**
* Invite button
*
* @category Section
* @package StatusNet
* @author Evan Prodromou <evan@status.net>
* @copyright 2011 StatusNet, Inc.
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/
*/
class InviteButtonSection extends Section
{
function showTitle()
{
return false;
}
function showContent()
{
$this->out->element('a',
array('href' => common_local_url('invite'),
'class' => 'invite_button'),
_('Invite more colleagues'));
return false;
}
}

90
lib/listsnav.php Normal file
View File

@ -0,0 +1,90 @@
<?php
/**
* StatusNet, the distributed open-source microblogging tool
*
* Lists a user has created
*
* PHP version 5
*
* LICENCE: This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @category Widget
* @package StatusNet
* @author Shashi Gowda <connect2shashi@gmail.com>
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
if (!defined('STATUSNET') && !defined('LACONICA')) {
exit(1);
}
/**
* Peopletags a user has subscribed to
*
* @category Widget
* @package StatusNet
* @author Shashi Gowda <connect2shashi@gmail.com>
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
class ListsNav extends Menu
{
var $profile=null;
var $lists=null;
function __construct($out, Profile $profile)
{
parent::__construct($out);
$this->profile = $profile;
$user = common_current_user();
$this->lists = $profile->getOwnedTags($user);
}
function show()
{
$action = $this->actionName;
$this->out->elementStart('ul', array('class' => 'nav'));
if (Event::handle('StartListsNav', array($this))) {
while ($this->lists->fetch()) {
$mode = $this->lists->private ? 'private' : 'public';
$this->out->menuItem(($this->lists->mainpage) ?
$this->lists->mainpage :
common_local_url('showprofiletag',
array('tagger' => $this->profile->nickname,
'tag' => $this->lists->tag)),
$this->lists->tag,
'',
$action == 'showprofiletag' &&
$this->action->arg('tagger') == $this->profile->nickname &&
$this->action->arg('tag') == $this->lists->tag,
'nav_timeline_list_'.$this->lists->id,
'mode-' . $mode);
}
Event::handle('EndListsNav', array($this));
}
$this->out->elementEnd('ul');
}
function hasLists()
{
return (!empty($this->lists) && $this->lists->N > 0);
}
}

View File

@ -107,7 +107,7 @@ class PeopletagEditForm extends Form
{ {
// TRANS: Form legend for people tag edit form. // TRANS: Form legend for people tag edit form.
// TRANS: %s is a people tag. // TRANS: %s is a people tag.
$this->out->element('legend', null, sprintf(_('Edit people tag %s'), $this->peopletag->tag)); $this->out->element('legend', null, sprintf(_('Edit list %s'), $this->peopletag->tag));
} }
/** /**
@ -138,12 +138,12 @@ class PeopletagEditForm extends Form
$desclimit = Profile_list::maxDescription(); $desclimit = Profile_list::maxDescription();
if ($desclimit == 0) { if ($desclimit == 0) {
// TRANS: Field title for description of people tag. // TRANS: Field title for description of people tag.
$descinstr = _('Describe the people tag or topic.'); $descinstr = _('Describe the list or topic.');
} else { } else {
// TRANS: Field title for description of people tag. // TRANS: Field title for description of people tag.
// TRANS: %d is the maximum number of characters for the description. // TRANS: %d is the maximum number of characters for the description.
$descinstr = sprintf(_m('Describe the people tag or topic in %d character.', $descinstr = sprintf(_m('Describe the list or topic in %d character.',
'Describe the people tag or topic in %d characters.', 'Describe the list or topic in %d characters.',
$desclimit), $desclimit),
$desclimit); $desclimit);
} }
@ -172,7 +172,7 @@ class PeopletagEditForm extends Form
'submit', 'submit',
'delete', 'delete',
// TRANS: Button title to delete a people tag. // TRANS: Button title to delete a people tag.
_('Delete this people tag.')); _('Delete this list.'));
} }
function showProfileList() function showProfileList()

View File

@ -104,10 +104,10 @@ class PeopletagGroupNav extends Widget
$this->out->menuItem(common_local_url('showprofiletag', array('tagger' => $user_profile->nickname, $this->out->menuItem(common_local_url('showprofiletag', array('tagger' => $user_profile->nickname,
'tag' => $tag->tag)), 'tag' => $tag->tag)),
// TRANS: Menu item in people tag navigation panel. // TRANS: Menu item in people tag navigation panel.
_m('MENU','People tag'), _m('MENU','List'),
// TRANS: Menu item title in people tag navigation panel. // TRANS: Menu item title in people tag navigation panel.
// TRANS: %1$s is a tag, %2$s is a nickname. // TRANS: %1$s is a tag, %2$s is a nickname.
sprintf(_('%1$s tag by %2$s.'), $tag->tag, sprintf(_('%1$s list by %2$s.'), $tag->tag,
(($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
$action == 'showprofiletag', 'nav_timeline_peopletag'); $action == 'showprofiletag', 'nav_timeline_peopletag');
@ -115,10 +115,10 @@ class PeopletagGroupNav extends Widget
$this->out->menuItem(common_local_url('peopletagged', array('tagger' => $user->nickname, $this->out->menuItem(common_local_url('peopletagged', array('tagger' => $user->nickname,
'tag' => $tag->tag)), 'tag' => $tag->tag)),
// TRANS: Menu item in people tag navigation panel. // TRANS: Menu item in people tag navigation panel.
_m('MENU','Tagged'), _m('MENU','Listed'),
// TRANS: Menu item title in people tag navigation panel. // TRANS: Menu item title in people tag navigation panel.
// TRANS: %1$s is a tag, %2$s is a nickname. // TRANS: %1$s is a tag, %2$s is a nickname.
sprintf(_('%1$s tag by %2$s.'), $tag->tag, sprintf(_('%1$s list by %2$s.'), $tag->tag,
(($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
$action == 'peopletagged', 'nav_peopletag_tagged'); $action == 'peopletagged', 'nav_peopletag_tagged');
@ -129,7 +129,7 @@ class PeopletagGroupNav extends Widget
_m('MENU','Subscribers'), _m('MENU','Subscribers'),
// TRANS: Menu item title in people tag navigation panel. // TRANS: Menu item title in people tag navigation panel.
// TRANS: %1$s is a tag, %2$s is a nickname. // TRANS: %1$s is a tag, %2$s is a nickname.
sprintf(_('Subscribers to %1$s tag by %2$s.'), $tag->tag, sprintf(_('Subscribers to %1$s list by %2$s.'), $tag->tag,
(($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
$action == 'peopletagsubscribers', 'nav_peopletag_subscribers'); $action == 'peopletagsubscribers', 'nav_peopletag_subscribers');
@ -142,7 +142,7 @@ class PeopletagGroupNav extends Widget
_m('MENU','Edit'), _m('MENU','Edit'),
// TRANS: Menu item title in people tag navigation panel. // TRANS: Menu item title in people tag navigation panel.
// TRANS: %s is a tag. // TRANS: %s is a tag.
sprintf(_('Edit %s tag by you.'), $tag->tag, sprintf(_('Edit %s list by you.'), $tag->tag,
(($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
$action == 'editpeopletag', 'nav_peopletag_edit'); $action == 'editpeopletag', 'nav_peopletag_edit');
} }

View File

@ -193,7 +193,7 @@ class PeopletagListItem extends Widget
common_local_url('editpeopletag', array('tagger' => $this->profile->nickname, common_local_url('editpeopletag', array('tagger' => $this->profile->nickname,
'tag' => $this->peopletag->tag)), 'tag' => $this->peopletag->tag)),
// TRANS: Title for link to edit people tag settings. // TRANS: Title for link to edit people tag settings.
'title' => _('Edit people tag settings.')), 'title' => _('Edit list settings.')),
// TRANS: Text for link to edit people tag settings. // TRANS: Text for link to edit people tag settings.
_('Edit')); _('Edit'));
$this->out->elementEnd('li'); $this->out->elementEnd('li');

106
lib/peopletagnav.php Normal file
View File

@ -0,0 +1,106 @@
<?php
/**
* StatusNet, the distributed open-source microblogging tool
*
* Tabset for a particular list
*
* PHP version 5
*
* LICENCE: This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @category Action
* @package StatusNet
* @author Shashi Gowda <connect2shashi@gmail.com>
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
if (!defined('STATUSNET') && !defined('LACONICA')) {
exit(1);
}
require_once INSTALLDIR.'/lib/widget.php';
/**
* Tabset for a group
*
* Shows a group of tabs for a particular user group
*
* @category Output
* @package StatusNet
* @author Shashi Gowda <connect2shashi@gmail.com>
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*
* @see HTMLOutputter
*/
class PeopletagNav extends Menu
{
var $group = null;
/**
* Construction
*
* @param Action $action current action, used for output
*/
function __construct($action=null, $profile=null)
{
parent::__construct($action);
$this->profile = $profile;
}
/**
* Show the menu
*
* @return void
*/
function show()
{
$action_name = $this->action->trimmed('action');
$nickname = $this->profile->nickname;
$this->out->elementStart('ul', array('class' => 'nav'));
if (Event::handle('StartPeopletagGroupNav', array($this))) {
$this->out->menuItem(common_local_url('peopletagsubscriptions', array('nickname' =>
$nickname)),
// TRANS: Menu item in the group navigation page.
_m('MENU','List Subscriptions'),
// TRANS: Tooltip for menu item in the group navigation page.
// TRANS: %s is the nickname of the group.
sprintf(_m('TOOLTIP','Lists subscribed to by %s'), $nickname),
$action_name == 'peopletagsubscriptions',
'nav_list_group');
$this->out->menuItem(common_local_url('peopletagsforuser', array('nickname' =>
$nickname)),
// TRANS: Menu item in the group navigation page.
sprintf(_m('MENU','Lists with %s'), $nickname),
// TRANS: Tooltip for menu item in the group navigation page.
// TRANS: %s is the nickname of the group.
sprintf(_m('TOOLTIP','Lists with %s'), $nickname),
$action_name == 'peopletagsforuser',
'nav_lists_with');
$this->out->menuItem(common_local_url('peopletagsbyuser', array('nickname' =>
$nickname)),
// TRANS: Menu item in the group navigation page.
sprintf(_m('MENU','Lists by %s'), $nickname),
// TRANS: Tooltip for menu item in the group navigation page.
// TRANS: %s is the nickname of the group.
sprintf(_m('TOOLTIP','Lists by %s'), $nickname),
$action_name == 'peopletagsbyuser',
'nav_lists_by');
Event::handle('EndGroupGroupNav', array($this));
}
$this->out->elementEnd('ul');
}
}

View File

@ -53,7 +53,7 @@ class PeopletagNoticeStream extends ScopingNoticeStream
$profile = Profile::current(); $profile = Profile::current();
} }
parent::__construct(new CachingNoticeStream(new RawPeopletagNoticeStream($plist), parent::__construct(new CachingNoticeStream(new RawPeopletagNoticeStream($plist),
'profile_tag:notice_ids:' . $plist->id), 'profile_list:notice_ids:' . $plist->id),
$profile); $profile);
} }
} }
@ -71,36 +71,54 @@ class PeopletagNoticeStream extends ScopingNoticeStream
*/ */
class RawPeopletagNoticeStream extends NoticeStream class RawPeopletagNoticeStream extends NoticeStream
{ {
protected $profile_tag; protected $profile_list;
function __construct($profile_tag) function __construct($profile_list)
{ {
$this->profile_tag = $profile_tag; $this->profile_list = $profile_list;
} }
/**
* Query notices by users associated with this tag from the database.
*
* @param integer $offset offset
* @param integer $limit maximum no of results
* @param integer $since_id=null since this id
* @param integer $max_id=null maximum id in result
*
* @return array array of notice ids.
*/
function getNoticeIds($offset, $limit, $since_id, $max_id) function getNoticeIds($offset, $limit, $since_id, $max_id)
{ {
$inbox = new Profile_tag_inbox(); $notice = new Notice();
$inbox->profile_tag_id = $this->profile_tag->id; $notice->selectAdd();
$notice->selectAdd('notice.id');
$inbox->selectAdd(); $ptag = new Profile_tag();
$inbox->selectAdd('notice_id'); $ptag->tag = $this->profile_list->tag;
$ptag->tagger = $this->profile_list->tagger;
$notice->joinAdd($ptag);
Notice::addWhereSinceId($inbox, $since_id, 'notice_id'); if ($since_id != 0) {
Notice::addWhereMaxId($inbox, $max_id, 'notice_id'); $notice->whereAdd('notice.id > ' . $since_id);
}
$inbox->orderBy('created DESC, notice_id DESC'); if ($max_id != 0) {
$notice->whereAdd('notice.id <= ' . $max_id);
}
$notice->orderBy('notice.id DESC');
if (!is_null($offset)) { if (!is_null($offset)) {
$inbox->limit($offset, $limit); $notice->limit($offset, $limit);
} }
$ids = array(); $ids = array();
if ($notice->find()) {
if ($inbox->find()) { while ($notice->fetch()) {
while ($inbox->fetch()) { $ids[] = $notice->id;
$ids[] = $inbox->notice_id;
} }
} }

View File

@ -124,7 +124,7 @@ class PeopletagsWidget extends Widget
function showEditTagForm($tags=null) function showEditTagForm($tags=null)
{ {
$this->out->elementStart('span', 'form_tag_user_wrap'); $this->out->elementStart('div', 'form_tag_user_wrap');
$this->out->elementStart('form', array('method' => 'post', $this->out->elementStart('form', array('method' => 'post',
'class' => 'form_tag_user', 'class' => 'form_tag_user',
'name' => 'tagprofile', 'name' => 'tagprofile',
@ -147,7 +147,7 @@ class PeopletagsWidget extends Widget
$this->out->elementEnd('fieldset'); $this->out->elementEnd('fieldset');
$this->out->elementEnd('form'); $this->out->elementEnd('form');
$this->out->elementEnd('span'); $this->out->elementEnd('div');
} }
function showEmptyList() function showEmptyList()

View File

@ -66,7 +66,7 @@ class PeopletagsBySubsSection extends PeopletagSection
function title() function title()
{ {
// TRANS: Title for section contaning people tags with the most subscribers. // TRANS: Title for section contaning people tags with the most subscribers.
return _('People tags with most subscribers'); return _('Lists with most subscribers');
} }
function divId() function divId()

View File

@ -83,6 +83,7 @@ class PeopletagSection extends Section
class PeopletagSectionItem extends PeopletagListItem class PeopletagSectionItem extends PeopletagListItem
{ {
function showStart() function showStart()
{ {
} }
@ -104,10 +105,11 @@ class PeopletagSectionItem extends PeopletagListItem
common_log(LOG_WARNING, "Trying to show missing peopletag; skipping."); common_log(LOG_WARNING, "Trying to show missing peopletag; skipping.");
return; return;
} }
$mode = ($this->peopletag->private) ? 'private' : 'public';
$this->out->elementStart('tr'); $this->out->elementStart('tr');
$this->out->elementStart('td', 'peopletag'); $this->out->elementStart('td', 'peopletag mode-' . $mode);
$this->showPeopletag(); $this->showPeopletag();
$this->out->elementEnd('td'); $this->out->elementEnd('td');
@ -121,11 +123,12 @@ class PeopletagSectionItem extends PeopletagListItem
{ {
// TRANS: Tag summary. %1$d is the number of users tagged with the tag, // TRANS: Tag summary. %1$d is the number of users tagged with the tag,
// TRANS: %2$d is the number of subscribers to the tag. // TRANS: %2$d is the number of subscribers to the tag.
$title = sprintf(_('Tagged: %1$d Subscribers: %2$d'), $title = sprintf(_('Listed: %1$d Subscribers: %2$d'),
$this->peopletag->taggedCount(), $this->peopletag->taggedCount(),
$this->peopletag->subscriberCount()); $this->peopletag->subscriberCount());
$this->out->elementStart('span', 'entry-title tag'); $this->out->elementStart('span', 'entry-title tag');
$this->out->element('a', $this->out->element('a',
array('rel' => 'bookmark', array('rel' => 'bookmark',
'href' => $this->url(), 'href' => $this->url(),

View File

@ -62,13 +62,15 @@ class PeopletagsForUserSection extends PeopletagSection
function title() function title()
{ {
$name = $this->profile->getBestName(); $user = common_current_user();
if ($this->profile->id == common_current_user()->id) {
$name = 'you'; if (!empty($user) && $this->profile->id == $user->id) {
return sprintf(_('Lists with you'));
} }
// TRANS: Title for page that displays which people tags a user has been tagged with. // TRANS: Title for page that displays
// which people tags a user has been tagged with.
// TRANS: %s is a profile name. // TRANS: %s is a profile name.
return sprintf(_('People tags for %s'), $name); return sprintf(_('Lists with %s'), $this->profile->getBestName());
} }
function link() function link()

View File

@ -42,27 +42,28 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
class PeopletagSubscriptionsSection extends PeopletagSection class PeopletagSubscriptionsSection extends PeopletagSection
{ {
var $profile=null; var $profile=null;
var $ptags=null;
function __construct($out, Profile $profile) function __construct($out, Profile $profile)
{ {
parent::__construct($out); parent::__construct($out);
$this->profile = $profile; $this->profile = $profile;
$limit = PEOPLETAGS_PER_SECTION+1;
$offset = 0;
$this->ptags = $this->profile->getTagSubscriptions($offset, $limit);
} }
function getPeopletags() function getPeopletags()
{ {
$limit = PEOPLETAGS_PER_SECTION+1; return $this->ptags;
$offset = 0;
$ptags = $this->profile->getTagSubscriptions($offset, $limit);
return $ptags;
} }
function title() function title()
{ {
// TRANS: Title for page that displays people tags a user has subscribed to. // TRANS: Title for page that displays people tags a user has subscribed to.
return _('People tag subscriptions'); return _('List subscriptions');
} }
function link() function link()

View File

@ -103,18 +103,6 @@ class PersonalGroupNav extends Menu
// TRANS: Replaces %s in '%s\'s favorite notices'. (Yes, we know we need to fix this.) // TRANS: Replaces %s in '%s\'s favorite notices'. (Yes, we know we need to fix this.)
($user_profile) ? $name : _m('FIXME','User')), ($user_profile) ? $name : _m('FIXME','User')),
$mine && $action =='showfavorites', 'nav_timeline_favorites'); $mine && $action =='showfavorites', 'nav_timeline_favorites');
$this->out->menuItem(common_local_url('peopletagsbyuser', array('nickname' =>
$nickname)),
// TRANS: Menu item in personal group navigation menu.
_m('MENU','People tags'),
// @todo i18n FIXME: Need to make this two messages.
// TRANS: Menu item title in personal group navigation menu.
// TRANS: %s is a username.
sprintf(_('People tags by %s'),
// TRANS: Replaces %s in 'People tags by %s'. (Yes, we know we need to fix this.)
($user_profile) ? $name : _('User')),
in_array($action, array('peopletagsbyuser', 'peopletagsforuser')),
'nav_timeline_peopletags');
$cur = common_current_user(); $cur = common_current_user();

View File

@ -53,7 +53,7 @@ class PersonalTagCloudSection extends TagCloudSection
function title() function title()
{ {
// TRANS: Title for personal tag cloud section. %s is a user nickname. // TRANS: Title for personal tag cloud section. %s is a user nickname.
return sprintf(_('Tags in %s\'s notices'), $this->user->nickname); return sprintf(_('Tags'), $this->user->nickname);
} }
function getTags() function getTags()

View File

@ -97,8 +97,7 @@ class ProfileAction extends OwnerDesignAction
$this->showSubscriptions(); $this->showSubscriptions();
$this->showSubscribers(); $this->showSubscribers();
$this->showGroups(); $this->showGroups();
$this->showPeopletagSubs(); $this->showLists();
$this->showPeopletags();
$this->showStatistics(); $this->showStatistics();
} }
@ -126,7 +125,9 @@ class ProfileAction extends OwnerDesignAction
if (Event::handle('StartShowSubscriptionsMiniList', array($this))) { if (Event::handle('StartShowSubscriptionsMiniList', array($this))) {
$this->elementStart('h2'); $this->elementStart('h2');
// TRANS: H2 text for user subscription statistics. // TRANS: H2 text for user subscription statistics.
$this->statsSectionLink('subscriptions', _('Subscriptions')); $this->statsSectionLink('subscriptions', _('Following'));
$this->text(' ');
$this->text($this->profile->subscriptionCount());
$this->elementEnd('h2'); $this->elementEnd('h2');
$cnt = 0; $cnt = 0;
@ -140,13 +141,6 @@ class ProfileAction extends OwnerDesignAction
} }
} }
if ($cnt > PROFILES_PER_MINILIST) {
$this->elementStart('p');
// TRANS: Text for user subscription statistics if user has more subscriptions than displayed.
$this->statsSectionLink('subscriptions', _('All subscriptions'), 'more');
$this->elementEnd('p');
}
Event::handle('EndShowSubscriptionsMiniList', array($this)); Event::handle('EndShowSubscriptionsMiniList', array($this));
} }
$this->elementEnd('div'); $this->elementEnd('div');
@ -163,7 +157,9 @@ class ProfileAction extends OwnerDesignAction
$this->elementStart('h2'); $this->elementStart('h2');
// TRANS: H2 text for user subscriber statistics. // TRANS: H2 text for user subscriber statistics.
$this->statsSectionLink('subscribers', _('Subscribers')); $this->statsSectionLink('subscribers', _('Followers'));
$this->text(' ');
$this->text($this->profile->subscriberCount());
$this->elementEnd('h2'); $this->elementEnd('h2');
$cnt = 0; $cnt = 0;
@ -177,45 +173,12 @@ class ProfileAction extends OwnerDesignAction
} }
} }
if ($cnt > PROFILES_PER_MINILIST) {
$this->elementStart('p');
// TRANS: Text for user subscription statistics if user has more subscribers than displayed.
$this->statsSectionLink('subscribers', _('All subscribers'), 'more');
$this->elementEnd('p');
}
Event::handle('EndShowSubscribersMiniList', array($this)); Event::handle('EndShowSubscribersMiniList', array($this));
} }
$this->elementEnd('div'); $this->elementEnd('div');
} }
function showPeopletagSubs()
{
$user = common_current_user();
if (!empty($user) && $this->profile->id == $user->id) {
if (Event::handle('StartShowPeopletagSubscriptionsSection', array($this))) {
$profile = $user->getProfile();
$section = new PeopletagSubscriptionsSection($this, $profile);
$section->show();
Event::handle('EndShowPeopletagSubscriptionsSection', array($this));
}
}
}
function showPeopletags()
{
if (Event::handle('StartShowPeopletagsSection', array($this))) {
$section = new PeopletagsForUserSection($this, $this->profile);
$section->show();
Event::handle('EndShowPeopletagsSection', array($this));
}
}
function showStatistics() function showStatistics()
{ {
$notice_count = $this->profile->noticeCount(); $notice_count = $this->profile->noticeCount();
@ -247,27 +210,6 @@ class ProfileAction extends OwnerDesignAction
'label' => _('Member since'), 'label' => _('Member since'),
'value' => date('j M Y', strtotime($profile->created)) 'value' => date('j M Y', strtotime($profile->created))
), ),
array(
'id' => 'subscriptions',
// TRANS: Label for user statistics.
'label' => _('Subscriptions'),
'link' => common_local_url('subscriptions', $actionParams),
'value' => $profile->subscriptionCount(),
),
array(
'id' => 'subscribers',
// TRANS: Label for user statistics.
'label' => _('Subscribers'),
'link' => common_local_url('subscribers', $actionParams),
'value' => $profile->subscriberCount(),
),
array(
'id' => 'groups',
// TRANS: Label for user statistics.
'label' => _('Groups'),
'link' => common_local_url('usergroups', $actionParams),
'value' => $profile->getGroups()->N,
),
array( array(
'id' => 'notices', 'id' => 'notices',
// TRANS: Label for user statistics. // TRANS: Label for user statistics.
@ -316,6 +258,8 @@ class ProfileAction extends OwnerDesignAction
$this->elementStart('h2'); $this->elementStart('h2');
// TRANS: H2 text for user group membership statistics. // TRANS: H2 text for user group membership statistics.
$this->statsSectionLink('usergroups', _('Groups')); $this->statsSectionLink('usergroups', _('Groups'));
$this->text(' ');
$this->text($this->profile->getGroups()->N);
$this->elementEnd('h2'); $this->elementEnd('h2');
if ($groups) { if ($groups) {
@ -327,17 +271,66 @@ class ProfileAction extends OwnerDesignAction
} }
} }
if ($cnt > GROUPS_PER_MINILIST) {
$this->elementStart('p');
// TRANS: Text for user group membership statistics if user has more subscriptions than displayed.
$this->statsSectionLink('usergroups', _('All groups'), 'more');
$this->elementEnd('p');
}
Event::handle('EndShowGroupsMiniList', array($this)); Event::handle('EndShowGroupsMiniList', array($this));
} }
$this->elementEnd('div'); $this->elementEnd('div');
} }
function showLists()
{
$cur = common_current_user();
$showPrivate = (!empty($cur) && $cur->id == $this->profile->id);
$lists = $this->profile->getLists($showPrivate);
if ($lists->N > 0) {
$this->elementStart('div', array('id' => 'entity_lists',
'class' => 'section'));
if (Event::handle('StartShowListsMiniList', array($this))) {
$url = common_local_url('peopletagsbyuser',
array('nickname' => $this->profile->nickname));
$this->elementStart('h2');
// TRANS: H2 text for user list membership statistics.
$this->element('a',
array('href' => $url),
_('Lists'));
$this->text(' ');
$this->text($lists->N);
$this->elementEnd('h2');
$this->elementStart('ul');
$first = true;
while ($lists->fetch()) {
if (!empty($lists->mainpage)) {
$url = $lists->mainpage;
} else {
$url = common_local_url('showprofiletag',
array('tagger' => $this->profile->nickname,
'tag' => $lists->tag));
}
if (!$first) {
$this->text(', ');
} else {
$first = false;
}
$this->element('a', array('href' => $url),
$lists->tag);
}
$this->elementEnd('ul');
Event::handle('EndShowListsMiniList', array($this));
}
$this->elementEnd('div');
}
}
} }
class SubscribersMiniList extends ProfileMiniList class SubscribersMiniList extends ProfileMiniList

View File

@ -33,7 +33,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
require_once INSTALLDIR.'/lib/profilelist.php'; require_once INSTALLDIR.'/lib/profilelist.php';
define('PROFILES_PER_MINILIST', 27); define('PROFILES_PER_MINILIST', 8);
/** /**
* Widget to show a list of profiles, good for sidebar * Widget to show a list of profiles, good for sidebar

View File

@ -47,6 +47,9 @@ require_once INSTALLDIR.'/lib/widget.php';
*/ */
class PublicGroupNav extends Menu class PublicGroupNav extends Menu
{ {
var $actionName = null;
/** /**
* Show the menu * Show the menu
* *
@ -54,7 +57,7 @@ class PublicGroupNav extends Menu
*/ */
function show() function show()
{ {
$action_name = $this->action->trimmed('action'); $this->actionName = $this->action->trimmed('action');
$this->action->elementStart('ul', array('class' => 'nav')); $this->action->elementStart('ul', array('class' => 'nav'));
@ -62,35 +65,29 @@ class PublicGroupNav extends Menu
// TRANS: Menu item in search group navigation panel. // TRANS: Menu item in search group navigation panel.
$this->out->menuItem(common_local_url('public'), _m('MENU','Public'), $this->out->menuItem(common_local_url('public'), _m('MENU','Public'),
// TRANS: Menu item title in search group navigation panel. // TRANS: Menu item title in search group navigation panel.
_('Public timeline'), $action_name == 'public', 'nav_timeline_public'); _('Public timeline'), $this->actionName == 'public', 'nav_timeline_public');
// TRANS: Menu item in search group navigation panel. // TRANS: Menu item in search group navigation panel.
$this->out->menuItem(common_local_url('groups'), _m('MENU','Groups'), $this->out->menuItem(common_local_url('groups'), _m('MENU','Groups'),
// TRANS: Menu item title in search group navigation panel. // TRANS: Menu item title in search group navigation panel.
_('User groups'), $action_name == 'groups', 'nav_groups'); _('User groups'), $this->actionName == 'groups', 'nav_groups');
// TRANS: Menu item in search group navigation panel. // TRANS: Menu item in search group navigation panel.
$this->out->menuItem(common_local_url('publictagcloud'), _m('MENU','Recent tags'), $this->out->menuItem(common_local_url('publictagcloud'), _m('MENU','Recent tags'),
// TRANS: Menu item title in search group navigation panel. // TRANS: Menu item title in search group navigation panel.
_('Recent tags'), $action_name == 'publictagcloud', 'nav_recent-tags'); _('Recent tags'), $this->actionName == 'publictagcloud', 'nav_recent-tags');
// TRANS: Menu item in search group navigation panel.
$this->out->menuItem(common_local_url('publicpeopletagcloud'), _m('MENU','People tags'),
// TRANS: Menu item title in search group navigation panel.
_('People tags'), in_array($action_name, array('publicpeopletagcloud',
'peopletag', 'selftag')), 'nav_people-tags');
if (count(common_config('nickname', 'featured')) > 0) { if (count(common_config('nickname', 'featured')) > 0) {
// TRANS: Menu item in search group navigation panel. // TRANS: Menu item in search group navigation panel.
$this->out->menuItem(common_local_url('featured'), _m('MENU','Featured'), $this->out->menuItem(common_local_url('featured'), _m('MENU','Featured'),
// TRANS: Menu item title in search group navigation panel. // TRANS: Menu item title in search group navigation panel.
_('Featured users'), $action_name == 'featured', 'nav_featured'); _('Featured users'), $this->actionName == 'featured', 'nav_featured');
} }
// TRANS: Menu item in search group navigation panel. // TRANS: Menu item in search group navigation panel.
$this->out->menuItem(common_local_url('favorited'), _m('MENU','Popular'), $this->out->menuItem(common_local_url('favorited'), _m('MENU','Popular'),
// TRANS: Menu item title in search group navigation panel. // TRANS: Menu item title in search group navigation panel.
_('Popular notices'), $action_name == 'favorited', 'nav_timeline_favorited'); _('Popular notices'), $this->actionName == 'favorited', 'nav_timeline_favorited');
Event::handle('EndPublicGroupNav', array($this)); Event::handle('EndPublicGroupNav', array($this));
} }

View File

@ -61,6 +61,19 @@ class Section extends Widget
array('id' => $this->divId(), array('id' => $this->divId(),
'class' => 'section')); 'class' => 'section'));
$this->showTitle();
$have_more = $this->showContent();
if ($have_more) {
$this->showMore();
}
$this->out->elementEnd('div');
}
function showTitle()
{
$link = $this->link(); $link = $this->link();
if (!empty($link)) { if (!empty($link)) {
$this->out->elementStart('h2'); $this->out->elementStart('h2');
@ -70,10 +83,10 @@ class Section extends Widget
$this->out->element('h2', null, $this->out->element('h2', null,
$this->title()); $this->title());
} }
}
$have_more = $this->showContent(); function showMore()
{
if ($have_more) {
$this->out->elementStart('p'); $this->out->elementStart('p');
$this->out->element('a', array('href' => $this->moreUrl(), $this->out->element('a', array('href' => $this->moreUrl(),
'class' => 'more'), 'class' => 'more'),
@ -81,9 +94,6 @@ class Section extends Widget
$this->out->elementEnd('p'); $this->out->elementEnd('p');
} }
$this->out->elementEnd('div');
}
function divId() function divId()
{ {
return 'generic_section'; return 'generic_section';

View File

@ -128,16 +128,16 @@ class SubGroupNav extends Menu
$this->user->nickname), $this->user->nickname),
$action == 'usergroups', $action == 'usergroups',
'nav_usergroups'); 'nav_usergroups');
$this->out->menuItem(common_local_url('peopletagsbyuser', $this->out->menuItem(common_local_url('peopletagsubscriptions',
array('nickname' => array('nickname' =>
$this->user->nickname)), $this->user->nickname)),
// TRANS: Menu item title in local navigation menu. // TRANS: Menu item title in local navigation menu.
_m('MENU','People tags'), _m('MENU','Lists'),
// TRANS: Menu item title in local navigation menu. // TRANS: Menu item title in local navigation menu.
// TRANS: %s is a user nickname. // TRANS: %s is a user nickname.
sprintf(_('People tags by %s.'), sprintf(_('List subscriptions by %s.'),
$this->user->nickname), $this->user->nickname),
in_array($action, array('peopletagsbyuser', 'peopletagsforuser')), in_array($action, array('peopletagsbyuser', 'peopletagsubscriptions', 'peopletagsforuser')),
'nav_timeline_peopletags'); 'nav_timeline_peopletags');
if (common_config('invite', 'enabled') && !is_null($cur) && $this->user->id === $cur->id) { if (common_config('invite', 'enabled') && !is_null($cur) && $this->user->id === $cur->id) {

View File

@ -1221,6 +1221,7 @@ function common_relative_profile($sender, $nickname, $dt=null)
function common_local_url($action, $args=null, $params=null, $fragment=null, $addSession=true) function common_local_url($action, $args=null, $params=null, $fragment=null, $addSession=true)
{ {
if (Event::handle('StartLocalURL', array(&$action, &$params, &$fragment, &$addSession, &$url))) {
$r = Router::get(); $r = Router::get();
$path = $r->build($action, $args, $params, $fragment); $path = $r->build($action, $args, $params, $fragment);
@ -1235,6 +1236,8 @@ function common_local_url($action, $args=null, $params=null, $fragment=null, $ad
$url = common_path('index.php'.$path, $ssl, $addSession); $url = common_path('index.php'.$path, $ssl, $addSession);
} }
} }
Event::handle('EndLocalURL', array(&$action, &$params, &$fragment, &$addSession, &$url));
}
return $url; return $url;
} }

View File

@ -85,6 +85,7 @@ class DirectoryPlugin extends Plugin
switch ($cls) switch ($cls)
{ {
case 'UserdirectoryAction': case 'UserdirectoryAction':
case 'GroupdirectoryAction':
include_once $dir include_once $dir
. '/actions/' . strtolower(mb_substr($cls, 0, -6)) . '.php'; . '/actions/' . strtolower(mb_substr($cls, 0, -6)) . '.php';
return false; return false;
@ -93,6 +94,7 @@ class DirectoryPlugin extends Plugin
. '/lib/' . strtolower($cls) . '.php'; . '/lib/' . strtolower($cls) . '.php';
return false; return false;
case 'SortableSubscriptionList': case 'SortableSubscriptionList':
case 'SortableGroupList':
include_once $dir include_once $dir
. '/lib/' . strtolower($cls) . '.php'; . '/lib/' . strtolower($cls) . '.php';
return false; return false;
@ -111,6 +113,7 @@ class DirectoryPlugin extends Plugin
*/ */
function onRouterInitialized($m) function onRouterInitialized($m)
{ {
$m->connect( $m->connect(
'directory/users', 'directory/users',
array('action' => 'userdirectory'), array('action' => 'userdirectory'),
@ -123,6 +126,54 @@ class DirectoryPlugin extends Plugin
array('filter' => '([0-9a-zA-Z_]{1,64}|0-9)') array('filter' => '([0-9a-zA-Z_]{1,64}|0-9)')
); );
$m->connect(
'groups/:filter',
array('action' => 'groupdirectory'),
array('filter' => '([0-9a-zA-Z_]{1,64}|0-9)')
);
return true;
}
/**
* Hijack the routing (URL -> Action) for the normal directory page
* and substitute our group directory action
*
* @param string $path path to connect
* @param array $defaults path defaults
* @param array $rules path rules
* @param array $result unused
*
* @return boolean hook return
*/
function onStartConnectPath(&$path, &$defaults, &$rules, &$result)
{
if (in_array($path, array('group', 'group/', 'groups', 'groups/'))) {
$defaults['action'] = 'groupdirectory';
return true;
}
return true;
}
// The following three function are to replace the existing groups
// list page with the directory plugin's group directory page
/**
* Hijack the mapping (Action -> URL) and return the URL to our
* group directory page instead of the normal groups page
*
* @param Action $action action to find a path for
* @param array $params parameters to pass to the action
* @param string $fragment any url fragement
* @param boolean $addSession whether to add session variable
* @param string $url resulting URL to local resource
*
* @return string the local URL
*/
function onEndLocalURL(&$action, &$params, &$fragment, &$addSession, &$url) {
if (in_array($action, array('group', 'group/', 'groups', 'groups/'))) {
$url = common_local_url('groupdirectory');
}
return true; return true;
} }
@ -137,7 +188,7 @@ class DirectoryPlugin extends Plugin
{ {
if (in_array( if (in_array(
$action->trimmed('action'), $action->trimmed('action'),
array('userdirectory')) array('userdirectory', 'groupdirectory'))
) { ) {
$action->cssLink($this->path('css/directory.css')); $action->cssLink($this->path('css/directory.css'));
} }
@ -145,6 +196,24 @@ class DirectoryPlugin extends Plugin
return true; return true;
} }
/**
* Fool the public nav into thinking it's on the regular
* group page when it's actually on our injected group
* directory page. This way "Groups" gets hilighted when
* when we're on the groups directory page.
*
* @param type $action the current action
*
* @return boolean hook flag
*/
function onStartPublicGroupNav($action)
{
if ($action->trimmed('action') == 'groupdirectory') {
$action->actionName = 'groups';
}
return true;
}
/** /**
* Modify the public local nav to add a link to the user directory * Modify the public local nav to add a link to the user directory
* *

View File

@ -0,0 +1,431 @@
<?php
/**
* StatusNet, the distributed open-source microblogging tool
*
* Output a group directory
*
* PHP version 5
*
* LICENCE: This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @category Public
* @package StatusNet
* @author Zach Copley <zach@status.net>
* @copyright 2011 StatusNet, Inc.
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
if (!defined('STATUSNET'))
{
exit(1);
}
require_once INSTALLDIR . '/lib/publicgroupnav.php';
/**
* Group directory
*
* @category Directory
* @package StatusNet
* @author Zach Copley <zach@status.net>
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
class GroupdirectoryAction extends Action
{
/**
* The page we're on
*
* @var integer
*/
public $page;
/**
* What to filter the search results by
*
* @var string
*/
public $filter;
/**
* Column to sort by
*
* @var string
*/
public $sort;
/**
* How to order search results, ascending or descending
*
* @var string
*/
public $reverse;
/**
* Query
*
* @var string
*/
public $q;
/**
* Title of the page
*
* @return string Title of the page
*/
function title()
{
// @fixme: This looks kinda gross
if ($this->filter == 'all') {
if ($this->page != 1) {
return(sprintf(_m('Group Directory, page %d'), $this->page));
}
return _m('Group directory');
} else if ($this->page == 1) {
return sprintf(
_m('Group directory - %s'),
strtoupper($this->filter)
);
} else {
return sprintf(
_m('Group directory - %s, page %d'),
strtoupper($this->filter),
$this->page
);
}
}
/**
* Instructions for use
*
* @return instructions for use
*/
function getInstructions()
{
// TRANS: Page notice for groups directory.
// TRANS: %%site.name%% is the name of the StatusNet site.
// TRANS: %%action.newgroup%% is a URL. Do not change it.
// TRANS: This message contains Markdown links in the form [link text](link).
$instructions = <<< END_OF_INSTRUCTIONS
After you join a group you can send messages to all other members
using the syntax "!groupname".
Browse groups, or search for groups on by their name, location or topic.
Separate the terms by spaces; they must be three characters or more.
END_OF_INSTRUCTIONS;
return _m($instructions);
}
/**
* Is this page read-only?
*
* @return boolean true
*/
function isReadOnly($args)
{
return true;
}
/**
* Take arguments for running
*
* @param array $args $_REQUEST args
*
* @return boolean success flag
*/
function prepare($args)
{
parent::prepare($args);
$this->page = ($this->arg('page')) ? ($this->arg('page') + 0) : 1;
$this->filter = $this->arg('filter', 'all');
$this->reverse = $this->boolean('reverse');
$this->q = $this->trimmed('q');
$this->sort = $this->arg('sort', 'nickname');
common_set_returnto($this->selfUrl());
return true;
}
/**
* Handle request
*
* Shows the page
*
* @param array $args $_REQUEST args; handled in prepare()
*
* @return void
*/
function handle($args)
{
parent::handle($args);
$this->showPage();
}
/**
* Show the page notice
*
* Shows instructions for the page
*
* @return void
*/
function showPageNotice()
{
$instr = $this->getInstructions();
$output = common_markup_to_html($instr);
$this->elementStart('div', 'instructions');
$this->raw($output);
$this->elementEnd('div');
}
/**
* Content area
*
* Shows the groups
*
* @return void
*/
function showContent()
{
if (common_logged_in()) {
$this->elementStart(
'p',
array(
'id' => 'new_group'
)
);
$this->element(
'a',
array(
'href' => common_local_url('newgroup'),
'class' => 'more'),
// TRANS: Link to create a new group on the group list page.
_('Create a new group')
);
$this->elementEnd('p');
}
$this->showForm();
$this->elementStart('div', array('id' => 'profile_directory'));
$alphaNav = new AlphaNav($this, false, false, array('0-9', 'All'));
$alphaNav->show();
$group = null;
$group = $this->getGroups();
$cnt = 0;
if (!empty($group)) {
$groupList = new SortableGroupList(
$group,
common_current_user(),
$this
);
$cnt = $groupList->show();
$group->free();
if (0 == $cnt) {
$this->showEmptyListMessage();
}
}
$args = array();
if (isset($this->q)) {
$args['q'] = $this->q;
} else {
$args['filter'] = $this->filter;
}
$this->pagination(
$this->page > 1,
$cnt > PROFILES_PER_PAGE,
$this->page,
'groupdirectory',
$args
);
$this->elementEnd('div');
}
function showForm($error=null)
{
$this->elementStart(
'form',
array(
'method' => 'get',
'id' => 'form_search',
'class' => 'form_settings',
'action' => common_local_url('groupdirectory')
)
);
$this->elementStart('fieldset');
$this->element('legend', null, _m('Search groups'));
$this->elementStart('ul', 'form_data');
$this->elementStart('li');
$this->input('q', _m('Keyword(s)'), $this->q);
$this->submit('search', _m('BUTTON','Search'));
$this->elementEnd('li');
$this->elementEnd('ul');
$this->elementEnd('fieldset');
$this->elementEnd('form');
}
/*
* Get groups filtered by the current filter, sort key,
* sort order, and page
*/
function getGroups()
{
$group = new User_group();
$offset = ($this->page-1) * PROFILES_PER_PAGE;
$limit = PROFILES_PER_PAGE + 1;
if (isset($this->q)) {
$order = 'user_group.created ASC';
if ($this->sort == 'nickname') {
if ($this->reverse) {
$order = 'user_group.nickname DESC';
} else {
$order = 'user_group.nickname ASC';
}
} else {
if ($this->reverse) {
$order = 'user_group.created DESC';
}
}
$sql = <<< GROUP_QUERY_END
SELECT user_group.*
FROM user_group
JOIN local_group ON user_group.id = local_group.group_id
ORDER BY %s
LIMIT %d, %d
GROUP_QUERY_END;
$cnt = 0;
$group->query(sprintf($sql, $order, $limit, $offset));
$group->find();
} else {
// User is browsing via AlphaNav
$sort = $this->getSortKey();
$sql = <<< GROUP_QUERY_END
SELECT user_group.*
FROM user_group
JOIN local_group ON user_group.id = local_group.group_id
GROUP_QUERY_END;
switch($this->filter)
{
case 'all':
// NOOP
break;
case '0-9':
$sql .=
' AND LEFT(user_group.nickname, 1) BETWEEN \'0\' AND \'9\'';
break;
default:
$sql .= sprintf(
' AND LEFT(LOWER(user_group.nickname), 1) = \'%s\'',
$this->filter
);
}
$sql .= sprintf(
' ORDER BY user_group.%s %s, user_group.nickname ASC LIMIT %d, %d',
$sort,
$this->reverse ? 'DESC' : 'ASC',
$offset,
$limit
);
$group->query($sql);
}
return $group;
}
/**
* Filter the sort parameter
*
* @return string a column name for sorting
*/
function getSortKey()
{
switch ($this->sort) {
case 'nickname':
return $this->sort;
break;
case 'created':
return $this->sort;
break;
default:
return 'nickname';
}
}
/**
* Show a nice message when there's no search results
*/
function showEmptyListMessage()
{
if (!empty($this->filter) && ($this->filter != 'all')) {
$this->element(
'p',
'error',
sprintf(
_m('No groups starting with %s'),
$this->filter
)
);
} else {
$this->element('p', 'error', _m('No results.'));
$message = _m(<<<E_O_T
* Make sure all words are spelled correctly.
* Try different keywords.
* Try more general keywords.
* Try fewer keywords.
E_O_T
);
$this->elementStart('div', 'help instructions');
$this->raw(common_markup_to_html($message));
$this->elementEnd('div');
}
}
function showSections()
{
$gbp = new GroupsByPostsSection($this);
$gbp->show();
$gbm = new GroupsByMembersSection($this);
$gbm->show();
}
}

View File

@ -199,7 +199,7 @@ class UserdirectoryAction extends Action
{ {
$this->showForm(); $this->showForm();
$this->elementStart('div', array('id' => 'user_directory')); $this->elementStart('div', array('id' => 'profile_directory'));
$alphaNav = new AlphaNav($this, false, false, array('0-9', 'All')); $alphaNav = new AlphaNav($this, false, false, array('0-9', 'All'));
$alphaNav->show(); $alphaNav->show();

View File

@ -1,35 +1,35 @@
/* CSS file for the Directory plugin */ /* CSS file for the Directory plugin */
div#user_directory div.alpha_nav { div#profile_directory div.alpha_nav {
overflow: hidden; overflow: hidden;
width: 100%; width: 100%;
text-align: center; text-align: center;
} }
/* XXX: this needs serious CSS foo */ /* XXX: this needs serious CSS foo */
div#user_directory div.alpha_nav > a { div#profile_directory div.alpha_nav > a {
border-left: 1px solid #000; border-left: 1px solid #000;
padding-left: 2px; padding-left: 2px;
} }
div#user_directory div.alpha_nav > a.first { div#profile_directory div.alpha_nav > a.first {
border-left: none; border-left: none;
} }
div#user_directory div.alpha_nav a:link { div#profile_directory div.alpha_nav a:link {
text-decoration: none; text-decoration: none;
} }
div#user_directory div.alpha_nav a:visited { div#profile_directory div.alpha_nav a:visited {
text-decoration: none; text-decoration: none;
} }
div#user_directory div.alpha_nav a:active { div#profile_directory div.alpha_nav a:active {
text-decoration: none; text-decoration: none;
} }
div#user_directory div.alpha_nav a:hover { div#profile_directory div.alpha_nav a:hover {
text-decoration: underline; color: blue; text-decoration: underline; color: blue;
} }
div#user_directory div.alpha_nav a.current { div#profile_directory div.alpha_nav a.current {
background-color:#9BB43E; background-color:#9BB43E;
} }

View File

@ -108,10 +108,15 @@ class AlphaNav extends Widget
$classes .= 'last '; // last filter in the list $classes .= 'last '; // last filter in the list
} }
// hack to get around $m->connect(array('action' => 'all, 'nickname' => $nickname));
if (strtolower($filter) == 'all') {
$href = common_local_url($actionName);
} else {
$href = common_local_url( $href = common_local_url(
$actionName, $actionName,
array('filter' => strtolower($filter)) array('filter' => strtolower($filter))
); );
}
$params = array('href' => $href); $params = array('href' => $href);

View File

@ -0,0 +1,271 @@
<?php
/**
* StatusNet, the distributed open-source microblogging tool
*
* Widget to show a sortable list of profiles
*
* PHP version 5
*
* LICENCE: This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @category Public
* @package StatusNet
* @author Zach Copley <zach@status.net>
* @copyright 2011 StatusNet, Inc.
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
if (!defined('STATUSNET')) {
exit(1);
}
require_once INSTALLDIR . '/lib/subscriptionlist.php';
/**
* Widget to show a sortable list of subscriptions
*
* @category Public
* @package StatusNet
* @author Zach Copley <zach@status.net>
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
class SortableGroupList extends SortableSubscriptionList
{
/** Owner of this list */
var $owner = null;
function __construct($profile, $owner=null, $action=null)
{
parent::__construct($profile, $owner, $action);
$this->owner = $owner;
}
function startList()
{
$this->out->elementStart('table', array('class' => 'profile_list xoxo'));
$this->out->elementStart('thead');
$this->out->elementStart('tr');
$tableHeaders = array(
'nickname' => _m('Nickname'),
'created' => _m('Created')
);
foreach ($tableHeaders as $id => $label) {
$attrs = array('id' => $id);
$current = (!empty($this->action->sort) && $this->action->sort == $id);
if ($current || empty($this->action->sort) && $id == 'nickname') {
$attrs['class'] = 'current';
}
if ($current && $this->action->reverse) {
$attrs['class'] .= ' reverse';
$attrs['class'] = trim($attrs['class']);
}
$this->out->elementStart('th', $attrs);
$linkAttrs = array();
$params = array('sort' => $id);
if (!empty($this->action->q)) {
$params['q'] = $this->action->q;
}
if ($current && !$this->action->reverse) {
$params['reverse'] = 'true';
}
$args = array();
$filter = $this->action->arg('filter');
if (!empty($filter)) {
$args['filter'] = $filter;
}
$linkAttrs['href'] = common_local_url(
$this->action->arg('action'), $args, $params
);
$this->out->element('a', $linkAttrs, $label);
$this->out->elementEnd('th');
}
$this->out->element('th', array('id' => 'Members'), _m('Members'));
$this->out->element('th', array('id' => 'controls'), null);
$this->out->elementEnd('tr');
$this->out->elementEnd('thead');
$this->out->elementStart('tbody');
}
function newListItem($profile, $odd)
{
return new SortableGroupListItem($profile, $this->owner, $this->action, $odd);
}
}
class SortableGroupListItem extends SortableSubscriptionListItem
{
/** Owner of this list */
var $owner = null;
function __construct($profile, $owner, $action, $alt)
{
parent::__construct($profile, $owner, $action, $alt);
$this->alt = $alt; // is this row alternate?
$this->owner = $owner;
}
function showHomepage()
{
if (!empty($this->profile->homepage)) {
$this->out->text(' ');
$aAttrs = $this->homepageAttributes();
$this->out->elementStart('a', $aAttrs);
$this->out->raw($this->highlight($this->profile->homeUrl()));
$this->out->elementEnd('a');
}
}
function showAvatar()
{
$logo = ($this->profile->stream_logo) ?
$this->profile->stream_logo : User_group::defaultLogo(AVATAR_STREAM_SIZE);
$this->out->elementStart(
'a',
array(
'href' => $this->profile->homeUrl(),
'class' => 'url entry-title',
'rel' => 'contact group'
)
);
$this->out->element(
'img',
array(
'src' => $logo,
'class' => 'photo avatar',
'width' => AVATAR_STREAM_SIZE,
'height' => AVATAR_STREAM_SIZE,
'alt' => ($this->profile->fullname)
? $this->profile->fullname : $this->profile->nickname
)
);
$this->out->text(' ');
$hasFN = ($this->profile->fullname) ? 'nickname' : 'fn org nickname';
$this->out->elementStart('span', $hasFN);
$this->out->raw($this->highlight($this->profile->nickname));
$this->out->elementEnd('span');
$this->out->elementEnd('a');
}
function show()
{
if (Event::handle('StartProfileListItem', array($this))) {
$this->startItem();
if (Event::handle('StartProfileListItemProfile', array($this))) {
$this->showProfile();
Event::handle('EndProfileListItemProfile', array($this));
}
// XXX Add events?
$this->showCreatedDate();
$this->showMemberCount();
if (Event::handle('StartProfileListItemActions', array($this))) {
$this->showActions();
Event::handle('EndProfileListItemActions', array($this));
}
$this->endItem();
Event::handle('EndProfileListItem', array($this));
}
}
function showActions()
{
$this->startActions();
if (Event::handle('StartProfileListItemActionElements', array($this))) {
$this->showJoinButton();
Event::handle('EndProfileListItemActionElements', array($this));
}
$this->endActions();
}
function showJoinButton()
{
$user = $this->owner;
if ($user) {
$this->out->elementStart('li', 'entity_subscribe');
// XXX: special-case for user looking at own
// subscriptions page
if ($user->isMember($this->profile)) {
$lf = new LeaveForm($this->out, $this->profile);
$lf->show();
} else if (!Group_block::isBlocked($this->profile, $user->getProfile())) {
$jf = new JoinForm($this->out, $this->profile);
$jf->show();
}
$this->out->elementEnd('li');
}
}
function showMemberCount()
{
$this->out->elementStart('td', 'entry_member_count');
$this->out->raw($this->profile->getMemberCount());
$this->out->elementEnd('td');
}
function showCreatedDate()
{
$this->out->elementStart('td', 'entry_created');
$this->out->raw(date('j M Y', strtotime($this->profile->created)));
$this->out->elementEnd('td');
}
function showAdmins()
{
$this->out->elementStart('td', 'entry_admins');
// @todo
$this->out->raw('gargargar');
$this->out->elementEnd('td');
}
/**
* Only show the tags if we're logged in
*/
function showTags()
{
if (common_logged_in()) {
parent::showTags();
}
}
}

View File

@ -1,7 +1,7 @@
<?php <?php
/* /*
* StatusNet - the distributed open-source microblogging tool * StatusNet - the distributed open-source microblogging tool
* Copyright (C) 2009, StatusNet, Inc. * Copyright (C) 2009,2011 StatusNet, Inc.
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by * it under the terms of the GNU Affero General Public License as published by
@ -30,166 +30,20 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
class GravatarPlugin extends Plugin class GravatarPlugin extends Plugin
{ {
function onInitializePlugin() function onEndProfileGetAvatar($profile, $size, &$avatar)
{ {
return true; if (empty($avatar)) {
} $user = $profile->getUser();
if (!empty($user) && !empty($user->email)) {
function onStartAvatarFormData($action) // Fake one!
{
$user = common_current_user();
$hasGravatar = $this->hasGravatar($user->id);
if($hasGravatar) {
return false;
}
}
function onEndAvatarFormData($action)
{
$user = common_current_user();
$hasGravatar = $this->hasGravatar($user->id);
if(!empty($user->email) && !$hasGravatar) { //and not gravatar already set
$action->elementStart('form', array('method' => 'post',
'id' => 'form_settings_gravatar_add',
'class' => 'form_settings',
'action' =>
common_local_url('avatarsettings')));
$action->elementStart('fieldset', array('id' => 'settings_gravatar_add'));
// TRANS: Fieldset legend. Gravatar is an avatar service.
$action->element('legend', null, _m('Set Gravatar'));
$action->hidden('token', common_session_token());
$action->element('p', 'form_guide',
// TRANS: Form guide. Gravatar is an avatar service.
_m('If you want to use your Gravatar image, click "Add".'));
$action->element('input', array('type' => 'submit',
'id' => 'settings_gravatar_add_action-submit',
'name' => 'add',
'class' => 'submit',
// TRANS: Button text to add a Gravatar. Gravatar is an avatar service.
'value' => _m('BUTTON','Add')));
$action->elementEnd('fieldset');
$action->elementEnd('form');
} elseif($hasGravatar) {
$action->elementStart('form', array('method' => 'post',
'id' => 'form_settings_gravatar_remove',
'class' => 'form_settings',
'action' =>
common_local_url('avatarsettings')));
$action->elementStart('fieldset', array('id' => 'settings_gravatar_remove'));
// TRANS: Fieldset legend. Gravatar is an avatar service.
$action->element('legend', null, _m('Remove Gravatar'));
$action->hidden('token', common_session_token());
$action->element('p', 'form_guide',
// TRANS: Form guide. Gravatar is an avatar service.
_m('If you want to remove your Gravatar image, click "Remove".'));
$action->element('input', array('type' => 'submit',
'id' => 'settings_gravatar_remove_action-submit',
'name' => 'remove',
'class' => 'submit',
// TRANS: Button text to remove a Gravatar. Gravatar is an avatar service.
'value' => _m('Remove')));
$action->elementEnd('fieldset');
$action->elementEnd('form');
} else {
$action->element('p', 'form_guide',
// TRANS: Form guide. Gravatar is an avatar service.
_m('To use a Gravatar first enter in an email address.'));
}
}
function onStartAvatarSaveForm($action)
{
if ($action->arg('add')) {
$result = $this->gravatar_save();
if($result['success']===true) {
common_broadcast_profile(common_current_user()->getProfile());
}
$action->showForm($result['message'], $result['success']);
return false;
} else if ($action->arg('remove')) {
$result = $this->gravatar_remove();
if($result['success']===true) {
common_broadcast_profile(common_current_user()->getProfile());
}
$action->showForm($result['message'], $result['success']);
return false;
} else {
return true;
}
}
function hasGravatar($id) {
$avatar = new Avatar(); $avatar = new Avatar();
$avatar->profile_id = $id; $avatar->width = $avatar->height = $size;
if ($avatar->find()) { $avatar->url = $this->gravatar_url($user->email, $size);
while ($avatar->fetch()) {
if($avatar->filename == null) {
return true;
}
}
}
return false; return false;
} }
function gravatar_save()
{
$cur = common_current_user();
if(empty($cur->email)) {
// TRANS: Message displayed when no e-mail address was set when saving Gravatar setting. Gravatar is an avatar service.
return array('message' => _m('You do not have an email address set in your profile.'),
'success' => false);
}
//Get rid of previous Avatar
$this->gravatar_remove();
foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) {
$gravatar = new Avatar();
$gravatar->profile_id = $cur->id;
$gravatar->width = $size;
$gravatar->height = $size;
$gravatar->original = false; //No file, so no original
$gravatar->mediatype = 'img';//XXX: Unsure what to put here
//$gravatar->filename = null;//No filename. Remote
$gravatar->url = $this->gravatar_url($cur->email, $size);
$gravatar->created = DB_DataObject_Cast::dateTime(); # current time
if (!$gravatar->insert()) {
// TRANS: Message displayed when saving Gravatar setting fails. Gravatar is an avatar service.
return array('message' => _m('Failed to save Gravatar to the database.'),
'success' => false);
}
}
// TRANS: Message displayed when Gravatar was added. Gravatar is an avatar service.
return array('message' => _m('Gravatar added.'),
'success' => true);
} }
function gravatar_remove() return true;
{
$user = common_current_user();
$profile = $user->getProfile();
$avatar = $profile->getOriginalAvatar();
if($avatar) $avatar->delete();
$avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
if($avatar) $avatar->delete();
$avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
if($avatar) $avatar->delete();
$avatar = $profile->getAvatar(AVATAR_MINI_SIZE);
if($avatar) $avatar->delete();
// TRANS: Message displayed when Gravatar was removed. Gravatar is an avatar service.
return array('message' => _m('Gravatar removed.'),
'success' => true);
} }
function gravatar_url($email, $size) function gravatar_url($email, $size)
@ -205,7 +59,7 @@ class GravatarPlugin extends Plugin
{ {
$versions[] = array('name' => 'Gravatar', $versions[] = array('name' => 'Gravatar',
'version' => STATUSNET_VERSION, 'version' => STATUSNET_VERSION,
'author' => 'Eric Helgeson', 'author' => 'Eric Helgeson, Evan Prodromou',
'homepage' => 'http://status.net/wiki/Plugin:Gravatar', 'homepage' => 'http://status.net/wiki/Plugin:Gravatar',
'rawdescription' => 'rawdescription' =>
// TRANS: Plugin decsription. // TRANS: Plugin decsription.

View File

@ -855,7 +855,7 @@ class OStatusPlugin extends Plugin
if ($oprofile) { if ($oprofile) {
if (!$oprofile->subscribe()) { if (!$oprofile->subscribe()) {
// TRANS: Exception thrown when setup of remote people tag subscription fails. // TRANS: Exception thrown when setup of remote people tag subscription fails.
throw new Exception(_m('Could not set up remote people tag subscription.')); throw new Exception(_m('Could not set up remote list subscription.'));
} }
$sub = $user->getProfile(); $sub = $user->getProfile();
@ -876,7 +876,7 @@ class OStatusPlugin extends Plugin
$act->title = _m('TITLE','Follow list'); $act->title = _m('TITLE','Follow list');
// TRANS: Success message for remote list follow through OStatus. // TRANS: Success message for remote list follow through OStatus.
// TRANS: %1$s is the subscriber name, %2$s the prople tag, %3$s is the tagger's name. // TRANS: %1$s is the subscriber name, %2$s the prople tag, %3$s is the tagger's name.
$act->content = sprintf(_m("%1$s is now following people tagged %2$s by %3$s."), $act->content = sprintf(_m("%1$s is now following people listed in %2$s by %3$s."),
$sub->getBestName(), $sub->getBestName(),
$oprofile->getBestName(), $oprofile->getBestName(),
$tagger->getBestName()); $tagger->getBestName());
@ -1000,7 +1000,7 @@ class OStatusPlugin extends Plugin
common_date_iso8601(time())); common_date_iso8601(time()));
$act->time = time(); $act->time = time();
$act->title = _m('TITLE','Tag'); $act->title = _m('TITLE','Tag');
$act->content = sprintf(_m('%1$s tagged %2$s in the list %3$s.'), $act->content = sprintf(_m('%1$s listed %2$s in the list %3$s.'),
$tagger->getBestName(), $tagger->getBestName(),
$tagged->getBestName(), $tagged->getBestName(),
$plist->getBestName()); $plist->getBestName());

View File

@ -169,7 +169,7 @@ class OStatusPeopletagAction extends OStatusSubAction
function getInstructions() function getInstructions()
{ {
return _m('You can subscribe to people tags from other supported sites. Paste the tag\'s profile URI below:'); return _m('You can subscribe to lists from other supported sites. Paste the lists\'s URI below:');
} }
function selfLink() function selfLink()

View File

@ -42,13 +42,13 @@ class PeopletagsalmonAction extends SalmonAction
$this->peopletag = Profile_list::staticGet('id', $id); $this->peopletag = Profile_list::staticGet('id', $id);
if (empty($this->peopletag)) { if (empty($this->peopletag)) {
$this->clientError(_m('No such people tag.')); $this->clientError(_m('No such list.'));
} }
$oprofile = Ostatus_profile::staticGet('peopletag_id', $id); $oprofile = Ostatus_profile::staticGet('peopletag_id', $id);
if (!empty($oprofile)) { if (!empty($oprofile)) {
$this->clientError(_m('Cannot accept remote posts for a remote people tag.')); $this->clientError(_m('Cannot accept remote posts for a remote list.'));
} }
return true; return true;
@ -89,7 +89,7 @@ class PeopletagsalmonAction extends SalmonAction
$this->clientError(_m('Cannot read profile to set up profile tag subscription.')); $this->clientError(_m('Cannot read profile to set up profile tag subscription.'));
} }
if ($oprofile->isGroup()) { if ($oprofile->isGroup()) {
$this->clientError(_m('Groups cannot subscribe to people tags.')); $this->clientError(_m('Groups cannot subscribe to lists.'));
} }
common_log(LOG_INFO, "Remote profile {$oprofile->uri} subscribing to local peopletag ".$this->peopletag->getBestName()); common_log(LOG_INFO, "Remote profile {$oprofile->uri} subscribing to local peopletag ".$this->peopletag->getBestName());
@ -107,7 +107,7 @@ class PeopletagsalmonAction extends SalmonAction
try { try {
Profile_tag_subscription::add($this->peopletag, $profile); Profile_tag_subscription::add($this->peopletag, $profile);
} catch (Exception $e) { } catch (Exception $e) {
$this->serverError(sprintf(_m('Could not subscribe remote user %1$s to people tag %2$s.'), $this->serverError(sprintf(_m('Could not subscribe remote user %1$s to list %2$s.'),
$oprofile->uri, $this->peopletag->getBestName())); $oprofile->uri, $this->peopletag->getBestName()));
} }
} }
@ -120,10 +120,10 @@ class PeopletagsalmonAction extends SalmonAction
{ {
$oprofile = $this->ensureProfile(); $oprofile = $this->ensureProfile();
if (!$oprofile) { if (!$oprofile) {
$this->clientError(_m('Cannot read profile to cancel people tag membership.')); $this->clientError(_m('Cannot read profile to cancel list membership.'));
} }
if ($oprofile->isGroup()) { if ($oprofile->isGroup()) {
$this->clientError(_m('Groups cannot subscribe to people tags.')); $this->clientError(_m('Groups cannot subscribe to lists.'));
} }
common_log(LOG_INFO, "Remote profile {$oprofile->uri} unsubscribing from local peopletag ".$this->peopletag->getBestName()); common_log(LOG_INFO, "Remote profile {$oprofile->uri} unsubscribing from local peopletag ".$this->peopletag->getBestName());
@ -133,7 +133,7 @@ class PeopletagsalmonAction extends SalmonAction
Profile_tag_subscription::remove($this->peopletag->tagger, $this->peopletag->tag, $profile->id); Profile_tag_subscription::remove($this->peopletag->tagger, $this->peopletag->tag, $profile->id);
} catch (Exception $e) { } catch (Exception $e) {
$this->serverError(sprintf(_m('Could not remove remote user %1$s from people tag %2$s.'), $this->serverError(sprintf(_m('Could not remove remote user %1$s from list %2$s.'),
$oprofile->uri, $this->peopletag->getBestName())); $oprofile->uri, $this->peopletag->getBestName()));
return; return;
} }

View File

@ -222,10 +222,6 @@ class RealtimePlugin extends Plugin
''); '');
$action->elementEnd('address'); $action->elementEnd('address');
if (common_logged_in()) {
$action->showNoticeForm();
}
$action->showContentBlock(); $action->showContentBlock();
$action->showScripts(); $action->showScripts();
$action->elementEnd('body'); $action->elementEnd('body');

View File

@ -242,39 +242,6 @@ class SearchSubPlugin extends Plugin
return true; return true;
} }
/**
* Add a count of mirrored feeds into a user's profile sidebar stats.
*
* @param Profile $profile
* @param array $stats
* @return boolean hook return value
*/
function onProfileStats($profile, &$stats)
{
$cur = common_current_user();
if (!empty($cur) && $cur->id == $profile->id) {
$searchsub = new SearchSub();
$searchsub ->profile_id = $profile->id;
$entry = array(
'id' => 'searchsubs',
'label' => _m('Search subscriptions'),
'link' => common_local_url('searchsubs', array('nickname' => $profile->nickname)),
'value' => $searchsub->count(),
);
$insertAt = count($stats);
foreach ($stats as $i => $row) {
if ($row['id'] == 'groups') {
// Slip us in after them.
$insertAt = $i + 1;
break;
}
}
array_splice($stats, $insertAt, 0, array($entry));
}
return true;
}
/** /**
* Replace the built-in stub track commands with ones that control * Replace the built-in stub track commands with ones that control
* search subscriptions. * search subscriptions.

View File

@ -208,39 +208,6 @@ class TagSubPlugin extends Plugin
return true; return true;
} }
/**
* Add a count of mirrored feeds into a user's profile sidebar stats.
*
* @param Profile $profile
* @param array $stats
* @return boolean hook return value
*/
function onProfileStats($profile, &$stats)
{
$cur = common_current_user();
if (!empty($cur) && $cur->id == $profile->id) {
$tagsub = new TagSub();
$tagsub->profile_id = $profile->id;
$entry = array(
'id' => 'tagsubs',
'label' => _m('Tag subscriptions'),
'link' => common_local_url('tagsubs', array('nickname' => $profile->nickname)),
'value' => $tagsub->count(),
);
$insertAt = count($stats);
foreach ($stats as $i => $row) {
if ($row['id'] == 'groups') {
// Slip us in after them.
$insertAt = $i + 1;
break;
}
}
array_splice($stats, $insertAt, 0, array($entry));
}
return true;
}
function onEndDefaultLocalNav($menu, $user) function onEndDefaultLocalNav($menu, $user)
{ {
$user = common_current_user(); $user = common_current_user();

View File

@ -1834,8 +1834,16 @@ width:14.5%;
border-top: 1px solid #ccc; border-top: 1px solid #ccc;
} }
#realtime_actions {
position: relative !important;
right: -4px !important;
float: right;
padding-top: 15px;
margin-bottom: -8px !important;
}
#realtime_actions li { #realtime_actions li {
margin-right: -4px; margin-left: 2px !important;
} }
#realtime_play, #realtime_pause, #realtime_popup { #realtime_play, #realtime_pause, #realtime_popup {
@ -1864,45 +1872,58 @@ width:14.5%;
body.realtime-popup { body.realtime-popup {
min-width: 100%; min-width: 100%;
} overflow-x: hidden;
.realtime-popup #wrap {
padding: 0px !important;
margin: 0px !important;
} }
.realtime-popup #content { .realtime-popup #content {
padding: 0px !important; padding: 0px !important;
margin: 0px !important; margin: 0px !important;
width: 98% !important; left: 0;
right: 0;
width: 100% !important;
overflow: visible;
} }
.realtime-popup .form_notice { .realtime-popup #content_inner {
float: left !important; padding: 5px;
position: static !important; }
.realtime-popup .input_forms {
top: 0px;
left: 0px;
padding: 10px 0px 0px 5px;
}
.realtime-popup .form_notice_placeholder .placeholder {
width: 445px;
}
.realtime-popup .input_form {
width: 470px;
} }
.realtime-popup .form_notice fieldset { .realtime-popup .form_notice fieldset {
width: 450px !important; width: 430px !important;
} }
.realtime-popup .form_notice textarea { .realtime-popup .form_notice textarea {
width: 340px !important; width: 425px !important;
}
.realtime-popup .form_notice .submit {
top: 58px !important;
height: 2em;
font-size: 0.8em;
width: 86px;
} }
.realtime-popup .form_notice label.notice_data-attach { .realtime-popup .form_notice label.notice_data-attach {
right: 70px; right: 0px !important;
top: 3px !important;
} }
.realtime-popup .form_notice .notice_data-geo_wrap label, .realtime-popup .form_notice .notice_data-geo_wrap input { .realtime-popup .form_notice #notice_data-geo_wrap label, .realtime-popup .form_notice #notice_data-geo_wrap input {
right: 2px; right: 8px !important;
top: 3px !important;
}
.realtime-popup .form_notice .error,
.realtime-popup .form_notice .success,
.realtime-popup .form_notice .notice-status {
width: 430px;
} }
/* icons */ /* icons */

View File

@ -542,8 +542,8 @@ address {
} }
.section .entities li { .section .entities li {
margin-right: 23px; margin-right: 3.6px;
margin-bottom: 12px; margin-bottom: 5px;
width: 24px; width: 24px;
} }
@ -734,6 +734,27 @@ div.entry-content a.response:after {
width: 390px; width: 390px;
} }
.threaded-replies .to-selector {
display: none;
}
.user_in.realtime-popup .notice div.entry-content {
max-width: 320px;
}
.realtime-popup .threaded-replies {
margin-left: 15px;
}
.realtime-popup .threaded-replies .form_notice textarea {
width: 385px !important;
}
.realtime-popup .threaded-replies .form_notice label.notice_data-attach {
top: 10px !important;
right: 10px !important;
}
#content .notice .notice { #content .notice .notice {
width: 100%; width: 100%;
margin-left: 0; margin-left: 0;
@ -971,51 +992,6 @@ padding-right:0;
} }
#realtime_actions {
position: relative !important;
float: right;
padding-top: 15px;
margin-bottom: -8px !important;
}
.realtime-popup #content {
padding-left: 4px !important;
padding-right: 4px !important;
margin-right: 0px;
left: 0;
right: 0;
width: 400px;
overflow: visible;
}
.realtime-popup .threaded-replies {
margin-left: 10px;
}
.realtime-popup .input_forms {
display: none; /* XXX fixme! */
}
.realtime-popup .form_notice textarea {
width: 325px !important;
}
.realtime-popup .form_notice #notice_action-submit {
top: 59px !important;
right: 6px !important;
}
.realtime-popup .form_notice label.notice_data-attach, .realtime-popup .form_notice input.notice_data-attach {
right: 74px;
top: 3px !important;
}
.realtime-popup .form_notice #notice_data-geo_wrap label, .realtime-popup .form_notice #notice_data-geo_wrap input {
right: 8px;
top: 3px !important;
}
/* Bookmark specific styles */ /* Bookmark specific styles */
#content .bookmark .entry-title { #content .bookmark .entry-title {