--- /dev/null
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Form for editing a peopletag
+ *
+ * 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 Form
+ * @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/form.php';
+require_once INSTALLDIR.'/lib/togglepeopletag.php';
+
+/**
+ * Form for editing a peopletag
+ *
+ * @category Form
+ * @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 GroupEditForm
+ */
+
+class PeopletagEditForm extends Form
+{
+ /**
+ * peopletag to edit
+ */
+
+ var $peopletag = null;
+ var $tagger = null;
+
+ /**
+ * Constructor
+ *
+ * @param Action $out output channel
+ * @param User_group $group group to join
+ */
+
+ function __construct($out=null, Profile_list $peopletag=null)
+ {
+ parent::__construct($out);
+
+ $this->peopletag = $peopletag;
+ $this->tagger = Profile::staticGet('id', $peopletag->tagger);
+ }
+
+ /**
+ * ID of the form
+ *
+ * @return string ID of the form
+ */
+
+ function id()
+ {
+ return 'form_peopletag_edit-' . $this->peopletag->id;
+ }
+
+ /**
+ * class of the form
+ *
+ * @return string of the form class
+ */
+
+ function formClass()
+ {
+ return 'form_settings';
+ }
+
+ /**
+ * Action of the form
+ *
+ * @return string URL of the action
+ */
+
+ function action()
+ {
+ return common_local_url('editpeopletag',
+ array('tagger' => $this->tagger->nickname, 'tag' => $this->peopletag->tag));
+ }
+
+ /**
+ * Name of the form
+ *
+ * @return void
+ */
+
+ function formLegend()
+ {
+ $this->out->element('legend', null, sprintf(_('Edit peopletag %s'), $this->peopletag->tag));
+ }
+
+ /**
+ * Data elements of the form
+ *
+ * @return void
+ */
+
+ function formData()
+ {
+ $id = $this->peopletag->id;
+ $tag = $this->peopletag->tag;
+ $description = $this->peopletag->description;
+ $private = $this->peopletag->private;
+
+ $this->out->elementStart('ul', 'form_data');
+
+ $this->out->elementStart('li');
+ $this->out->hidden('id', $id);
+ $this->out->input('tag', _('Tag'),
+ ($this->out->arg('tag')) ? $this->out->arg('tag') : $tag,
+ _('Change the tag (letters, numbers, -, ., and _ are allowed)'));
+ $this->out->elementEnd('li');
+
+ $this->out->elementStart('li');
+ $desclimit = Profile_list::maxDescription();
+ if ($desclimit == 0) {
+ $descinstr = _('Describe the people tag or topic');
+ } else {
+ $descinstr = sprintf(_('Describe the people tag or topic in %d characters'), $desclimit);
+ }
+ $this->out->textarea('description', _('Description'),
+ ($this->out->arg('description')) ? $this->out->arg('description') : $description,
+ $descinstr);
+ $this->out->checkbox('private', _('Private'), $private);
+ $this->out->elementEnd('li');
+ $this->out->elementEnd('ul');
+ }
+
+ /**
+ * Action elements
+ *
+ * @return void
+ */
+
+ function formActions()
+ {
+ $this->out->submit('submit', _('Save'));
+ $this->out->submit('form_action-yes',
+ _m('BUTTON','Delete'),
+ 'submit',
+ 'delete',
+ _('Delete this people tag'));
+ }
+
+ function showProfileList()
+ {
+ $tagged = $this->peopletag->getTagged();
+ $this->out->element('h2', null, 'Add or remove people');
+
+ $this->out->elementStart('div', 'profile_search_wrap');
+ $this->out->element('h3', null, 'Add user');
+ $search = new SearchProfileForm($this->out, $this->peopletag);
+ $search->show();
+ $this->out->element('ul', array('id' => 'profile_search_results', 'class' => 'empty'));
+ $this->out->elementEnd('div');
+
+ $this->out->elementStart('ul', 'profile-lister');
+ while ($tagged->fetch()) {
+ $this->out->elementStart('li', 'entity_removable_profile');
+ $this->showProfileItem($tagged);
+ $this->out->elementStart('span', 'entity_actions');
+ $untag = new UntagButton($this->out, $tagged, $this->peopletag);
+ $untag->show();
+ $this->out->elementEnd('span');
+ $this->out->elementEnd('li');
+ }
+ $this->out->elementEnd('ul');
+ }
+
+ function showProfileItem($profile)
+ {
+ $item = new TaggedProfileItem($this->out, $profile);
+ $item->show();
+ }
+}
--- /dev/null
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Base class for all actions (~views)
+ *
+ * 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 Evan Prodromou <evan@status.net>
+ * @author Sarven Capadisli <csarven@status.net>
+ * @copyright 2008 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') && !defined('LACONICA')) {
+ exit(1);
+}
+
+require_once INSTALLDIR.'/lib/widget.php';
+
+/**
+ * Base class for all actions
+ *
+ * This is the base class for all actions in the package. An action is
+ * more or less a "view" in an MVC framework.
+ *
+ * Actions are responsible for extracting and validating parameters; using
+ * model classes to read and write to the database; and doing ouput.
+ *
+ * @category Output
+ * @package StatusNet
+ * @author Evan Prodromou <evan@status.net>
+ * @author Sarven Capadisli <csarven@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/
+ *
+ * @see HTMLOutputter
+ */
+
+class PeopletagGroupNav extends Widget
+{
+ var $action = null;
+
+ /**
+ * Construction
+ *
+ * @param Action $action current action, used for output
+ */
+
+ function __construct($action=null)
+ {
+ parent::__construct($action);
+ $this->action = $action;
+ }
+
+ /**
+ * Show the menu
+ *
+ * @return void
+ */
+
+ function show()
+ {
+ $user = null;
+
+ // FIXME: we should probably pass this in
+
+ $action = $this->action->trimmed('action');
+ $nickname = $this->action->trimmed('tagger');
+ $tag = $this->action->trimmed('tag');
+
+ if ($nickname) {
+ $user = User::staticGet('nickname', $nickname);
+ $user_profile = $user->getProfile();
+
+ if ($tag) {
+ $tag = Profile_list::pkeyGet(array('tagger' => $user->id,
+ 'tag' => $tag));
+ } else {
+ $tag = false;
+ }
+
+ } else {
+ $user_profile = false;
+ }
+
+ $this->out->elementStart('ul', array('class' => 'nav'));
+
+ if (Event::handle('StartPeopletagGroupNav', array($this))) {
+ // People tag timeline
+ $this->out->menuItem(common_local_url('showprofiletag', array('tagger' => $user_profile->nickname,
+ 'tag' => $tag->tag)),
+ _('People tag'),
+ sprintf(_('%s tag by %s'), $tag->tag,
+ (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
+ $action == 'showprofiletag', 'nav_timeline_peopletag');
+
+ // Tagged
+ $this->out->menuItem(common_local_url('peopletagged', array('tagger' => $user->nickname,
+ 'tag' => $tag->tag)),
+ _('Tagged'),
+ sprintf(_('%s tag by %s'), $tag->tag,
+ (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
+ $action == 'peopletagged', 'nav_peopletag_tagged');
+
+ // Subscribers
+ $this->out->menuItem(common_local_url('peopletagsubscribers', array('tagger' => $user->nickname,
+ 'tag' => $tag->tag)),
+ _('Subscribers'),
+ sprintf(_('Subscribers to %s tag by %s'), $tag->tag,
+ (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
+ $action == 'peopletagsubscribers', 'nav_peopletag_subscribers');
+
+ $cur = common_current_user();
+ if (!empty($cur) && $user_profile->id == $cur->id) {
+ // Edit
+ $this->out->menuItem(common_local_url('editpeopletag', array('tagger' => $user->nickname,
+ 'tag' => $tag->tag)),
+ _('Edit'),
+ sprintf(_('Edit %s tag by you'), $tag->tag,
+ (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
+ $action == 'editpeopletag', 'nav_peopletag_edit');
+ }
+
+ Event::handle('EndPeopletagGroupNav', array($this));
+ }
+ $this->out->elementEnd('ul');
+ }
+}
--- /dev/null
+<?php
+
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Widget to show a list of peopletags
+ *
+ * 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 Shashi Gowda <connect2shashi@gmail.com>
+ * @copyright 2008-2009 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') && !defined('LACONICA')) {
+ exit(1);
+}
+
+require_once INSTALLDIR.'/lib/widget.php';
+
+define('PEOPLETAGS_PER_PAGE', 20);
+
+/**
+ * Widget to show a list of peopletags
+ *
+ * @category Public
+ * @package StatusNet
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link http://status.net/
+ */
+
+class PeopletagList extends Widget
+{
+ /** Current peopletag, peopletag query. */
+ var $peopletag = null;
+ /** current user **/
+ var $user = null;
+
+ function __construct($peopletag, $action=null)
+ {
+ parent::__construct($action);
+
+ $this->peopletag = $peopletag;
+
+ if (!empty($owner)) {
+ $this->user = $owner;
+ } else {
+ $this->user = common_current_user();
+ }
+ }
+
+ function show()
+ {
+ $this->out->elementStart('ul', 'peopletags xoxo hfeed');
+
+ $cnt = 0;
+
+ while ($this->peopletag->fetch()) {
+ $cnt++;
+ if($cnt > PEOPLETAGS_PER_PAGE) {
+ break;
+ }
+ $this->showPeopletag();
+ }
+
+ $this->out->elementEnd('ul');
+
+ return $cnt;
+ }
+
+ function showPeopletag()
+ {
+ $ptag = new PeopletagListItem($this->peopletag, $this->user, $this->out);
+ $ptag->show();
+ }
+}
+
+class PeopletagListItem extends Widget
+{
+ var $peopletag = null;
+ var $current = null;
+ var $profile = null;
+
+ /**
+ * constructor
+ *
+ * Also initializes the owner attribute.
+ *
+ * @param Notice $notice The notice we'll display
+ */
+
+ function __construct($peopletag, $current, $out=null)
+ {
+ parent::__construct($out);
+ $this->peopletag = $peopletag;
+ $this->current = $current;
+ $this->profile = Profile::staticGet('id', $this->peopletag->tagger);
+ }
+
+ /**
+ * recipe function for displaying a single peopletag.
+ *
+ * This uses all the other methods to correctly display a notice. Override
+ * it or one of the others to fine-tune the output.
+ *
+ * @return void
+ */
+
+ function url()
+ {
+ return $this->peopletag->homeUrl();
+ }
+
+ function show()
+ {
+ if (empty($this->peopletag)) {
+ common_log(LOG_WARNING, "Trying to show missing peopletag; skipping.");
+ return;
+ }
+
+ if (Event::handle('StartShowPeopletagItem', array($this))) {
+ $this->showStart();
+ $this->showPeopletag();
+ $this->showStats();
+ $this->showEnd();
+ Event::handle('EndShowPeopletagItem', array($this));
+ }
+ }
+
+ function showStart()
+ {
+ $mode = ($this->peopletag->private) ? 'private' : 'public';
+ $this->out->elementStart('li', array('class' => 'hentry peopletag mode-' . $mode,
+ 'id' => 'peopletag-' . $this->peopletag->id));
+ }
+
+ function showEnd()
+ {
+ $this->out->elementEnd('li');
+ }
+
+ function showPeopletag()
+ {
+ $this->showCreator();
+ $this->showTag();
+ $this->showPrivacy();
+ $this->showUpdated();
+ $this->showActions();
+ $this->showDescription();
+ }
+
+ function showStats()
+ {
+ $this->out->elementStart('div', 'entry-summary entity_statistics');
+ $this->out->elementStart('span', 'tagged-count');
+ $this->out->element('a',
+ array('href' => common_local_url('peopletagged',
+ array('tagger' => $this->profile->nickname,
+ 'tag' => $this->peopletag->tag))),
+ _('Tagged'));
+ $this->out->raw($this->peopletag->taggedCount());
+ $this->out->elementEnd('span');
+
+ $this->out->elementStart('span', 'subscriber-count');
+ $this->out->element('a',
+ array('href' => common_local_url('peopletagsubscribers',
+ array('tagger' => $this->profile->nickname,
+ 'tag' => $this->peopletag->tag))),
+ _('Subscribers'));
+ $this->out->raw($this->peopletag->subscriberCount());
+ $this->out->elementEnd('span');
+ $this->out->elementEnd('div');
+ }
+
+ function showOwnerOptions()
+ {
+ $this->out->elementStart('li', 'entity_edit');
+ $this->out->element('a', array('href' =>
+ common_local_url('editpeopletag', array('tagger' => $this->profile->nickname,
+ 'tag' => $this->peopletag->tag)),
+ 'title' => _('Edit peopletag settings')),
+ _('Edit'));
+ $this->out->elementEnd('li');
+ }
+
+ function showSubscribeForm()
+ {
+ $this->out->elementStart('li');
+
+ if (Event::handle('StartSubscribePeopletagForm', array($this->out, $this->peopletag))) {
+ if ($this->current) {
+ if ($this->peopletag->hasSubscriber($this->current->id)) {
+ $form = new UnsubscribePeopletagForm($this->out, $this->peopletag);
+ $form->show();
+ } else {
+ $form = new SubscribePeopletagForm($this->out, $this->peopletag);
+ $form->show();
+ }
+ }
+ Event::handle('EndSubscribePeopletagForm', array($this->out, $this->peopletag));
+ }
+
+ $this->out->elementEnd('li');
+ }
+
+ function showCreator()
+ {
+ $this->out->elementStart('span', 'author vcard');
+ $attrs = array();
+ $attrs['href'] = $this->profile->profileurl;
+ $attrs['class'] = 'url';
+ $attrs['rel'] = 'contact';
+
+ if (!empty($this->profile->fullname)) {
+ $attrs['title'] = $this->profile->fullname . ' (' . $this->profile->nickname . ')';
+ }
+ $this->out->elementStart('a', $attrs);
+ $this->showAvatar();
+ $this->out->text(' ');
+ $this->out->element('span', 'nickname fn',
+ htmlspecialchars($this->profile->nickname));
+
+ $this->out->elementEnd('a');
+ $this->out->elementEnd('span');
+ }
+
+ function showUpdated()
+ {
+ if (!empty($this->peopletag->modified)) {
+ $this->out->element('abbr',
+ array('title' => common_date_w3dtf($this->peopletag->modified),
+ 'class' => 'updated'),
+ common_date_string($this->peopletag->modified));
+ }
+ }
+
+ function showPrivacy()
+ {
+ if ($this->peopletag->private) {
+ $this->out->elementStart('a',
+ array('href' => common_local_url('peopletagsbyuser',
+ array('nickname' => $this->profile->nickname, 'private' => 1))));
+ $this->out->element('span', 'privacy_mode', _('Private'));
+ $this->out->elementEnd('a');
+ }
+ }
+
+ function showTag()
+ {
+ $this->out->elementStart('span', 'entry-title tag');
+ $this->out->element('a',
+ array('rel' => 'bookmark',
+ 'href' => $this->url()),
+ htmlspecialchars($this->peopletag->tag));
+ $this->out->elementEnd('span');
+ }
+
+ /**
+ * show the avatar of the peopletag's creator
+ *
+ * This will use the default avatar if no avatar is assigned for the author.
+ * It makes a link to the author's profile.
+ *
+ * @return void
+ */
+
+ function showAvatar($size=AVATAR_STREAM_SIZE)
+ {
+ $avatar = $this->profile->getAvatar($size);
+
+ $this->out->element('img', array('src' => ($avatar) ?
+ $avatar->displayUrl() :
+ Avatar::defaultImage($size),
+ 'class' => 'avatar photo',
+ 'width' => $size,
+ 'height' => $size,
+ 'alt' =>
+ ($this->profile->fullname) ?
+ $this->profile->fullname :
+ $this->profile->nickname));
+ }
+
+ function showActions()
+ {
+ $this->out->elementStart('div', 'entity_actions');
+ $this->out->elementStart('ul');
+
+ if (!$this->peopletag->private) {
+ $this->showSubscribeForm();
+ }
+
+ if (!empty($this->current) && $this->profile->id == $this->current->id) {
+ $this->showOwnerOptions();
+ }
+ $this->out->elementEnd('ul');
+ $this->out->elementEnd('div');
+ }
+
+ function showDescription()
+ {
+ $this->out->element('div', 'entry-content description',
+ $this->peopletag->description);
+ }
+}
--- /dev/null
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Tags for a profile
+ *
+ * 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
+ * @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';
+
+/*
+ * Show a bunch of peopletags
+ * provide ajax editing if the current user owns the tags
+ *
+ * @category Action
+ * @pacage 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
+ */
+
+class PeopletagsWidget extends Widget
+{
+ /*
+ * the query, current peopletag.
+ * or an array of strings (tags)
+ */
+
+ var $tag=null;
+
+ var $user=null;
+ var $tagger=null;
+ var $tagged=null;
+
+ function __construct($out, $tagger, $tagged)
+ {
+ parent::__construct($out);
+
+ $this->user = common_current_user();
+ $this->tag = Profile_tag::getTags($tagger->id, $tagged->id, $this->user);
+ $this->tagger = $tagger;
+ $this->tagged = $tagged;
+ }
+
+ function show()
+ {
+ if (Event::handle('StartShowPeopletags', array($this, $this->tagger, $this->tagged))) {
+ if ($this->tag->N > 0) {
+ $this->showTags();
+ }
+ else {
+ $this->showEmptyList();
+ }
+ Event::handle('EndShowPeopletags', array($this, $this->tagger, $this->tagged));
+ }
+ }
+
+ function url()
+ {
+ return $this->tag->homeUrl();
+ }
+
+ function label()
+ {
+ return _('Tags by you');
+ }
+
+ function showTags()
+ {
+ $this->out->elementStart('dl', 'entity_tags user_profile_tags');
+ $this->out->element('dt', null, $this->label());
+ $this->out->elementStart('dd');
+
+ $class = 'tags xoxo';
+ if ($this->isEditable()) {
+ $class .= ' editable';
+ }
+
+ $tags = array();
+ $this->out->elementStart('ul', $class);
+ while ($this->tag->fetch()) {
+ $mode = $this->tag->private ? 'private' : 'public';
+ $tags[] = $this->tag->tag;
+
+ $this->out->elementStart('li', 'hashptag mode-' . $mode);
+ // Avoid space by using raw output.
+ $pt = '<span class="mark_hash">#</span><a rel="tag" href="' .
+ $this->url($this->tag->tag) .
+ '">' . $this->tag->tag . '</a>';
+ $this->out->raw($pt);
+ $this->out->elementEnd('li');
+ }
+ $this->out->elementEnd('ul');
+
+ if ($this->isEditable()) {
+ $this->showEditTagForm($tags);
+ }
+
+ $this->out->elementEnd('dd');
+ $this->out->elementEnd('dl');
+ }
+
+ function showEditTagForm($tags=null)
+ {
+ $this->out->elementStart('span', 'form_tag_user_wrap');
+ $this->out->elementStart('form', array('method' => 'post',
+ 'class' => 'form_tag_user',
+ 'name' => 'tagprofile',
+ 'action' => common_local_url('tagprofile', array('id' => $this->tagged->id))));
+
+ $this->out->elementStart('fieldset');
+ $this->out->element('legend', null, _('Edit tags'));
+ $this->out->hidden('token', common_session_token());
+ $this->out->hidden('id', $this->tagged->id);
+
+ if (!$tags) {
+ $tags = array();
+ }
+
+ $this->out->input('tags', $this->label(),
+ ($this->out->arg('tags')) ? $this->out->arg('tags') : implode(' ', $tags));
+ $this->out->submit('save', _('Save'));
+
+ $this->out->elementEnd('fieldset');
+ $this->out->elementEnd('form');
+ $this->out->elementEnd('span');
+ }
+
+ function showEmptyList()
+ {
+ $this->out->elementStart('dl', 'entity_tags user_profile_tags');
+ $this->out->element('dt', null, $this->label());
+ $this->out->elementStart('dd');
+
+ $class = 'tags';
+ if ($this->isEditable()) {
+ $class .= ' editable';
+ }
+
+ $this->out->elementStart('ul', $class);
+ $this->out->element('li', null, _('(None)'));
+ $this->out->elementEnd('ul');
+
+ if ($this->isEditable()) {
+ $this->showEditTagForm();
+ }
+ $this->out->elementEnd('dd');
+ $this->out->elementEnd('dl');
+ }
+
+ function isEditable()
+ {
+ return !empty($this->user) && $this->tagger->id == $this->user->id;
+ }
+}
+
+class SelftagsWidget extends PeopletagsWidget
+{
+ function url($tag)
+ {
+ // link to self tag page
+ return common_local_url('selftag', array('tag' => $tag));
+ }
+
+ function label()
+ {
+ return _('Tags');
+ }
+}
--- /dev/null
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Peopletags with the most subscribers section
+ *
+ * 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 Evan Prodromou <evan@status.net>
+ * @copyright 2009 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') && !defined('LACONICA')) {
+ exit(1);
+}
+
+/**
+ * Peopletags with the most subscribers section
+ *
+ * @category Widget
+ * @package StatusNet
+ * @author Evan Prodromou <evan@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 PeopletagsBySubsSection extends PeopletagSection
+{
+ function getPeopletags()
+ {
+ $qry = 'SELECT profile_list.*, subscriber_count as value ' .
+ 'FROM profile_list WHERE profile_list.private = false ' .
+ 'ORDER BY value DESC ';
+
+ $limit = PEOPLETAGS_PER_SECTION;
+ $offset = 0;
+
+ if (common_config('db','type') == 'pgsql') {
+ $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
+ } else {
+ $qry .= ' LIMIT ' . $offset . ', ' . $limit;
+ }
+
+ $peopletag = Memcached_DataObject::cachedQuery('Profile_list',
+ $qry,
+ 3600);
+ return $peopletag;
+ }
+
+ function title()
+ {
+ return _('People tags with most subscribers');
+ }
+
+ function divId()
+ {
+ return 'top_peopletags_by_subs';
+ }
+}
--- /dev/null
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Base class for sections showing lists of peopletags
+ *
+ * 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);
+}
+
+require_once INSTALLDIR . '/lib/peopletaglist.php';
+
+define('PEOPLETAGS_PER_SECTION', 6);
+
+/**
+ * Base class for sections
+ *
+ * These are the widgets that show interesting data about a person
+ * peopletag, or site.
+ *
+ * @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 PeopletagSection extends Section
+{
+ function showContent()
+ {
+ $tags = $this->getPeopletags();
+
+ if (!$tags) {
+ return false;
+ }
+
+ $cnt = 0;
+
+ $this->out->elementStart('table', 'peopletag_section');
+
+ while ($tags->fetch() && ++$cnt <= PEOPLETAGS_PER_SECTION) {
+ $this->showPeopletag($tags);
+ }
+
+ $this->out->elementEnd('table');
+
+ return ($cnt > PEOPLETAGS_PER_SECTION);
+ }
+
+ function getPeopletags()
+ {
+ return null;
+ }
+
+ function showPeopletag($peopletag)
+ {
+ $tag = new PeopletagSectionItem($peopletag, null, $this->out);
+ $tag->show();
+ }
+}
+
+class PeopletagSectionItem extends PeopletagListItem
+{
+ function showStart()
+ {
+ }
+
+ function showEnd()
+ {
+ }
+
+ function showPeopletag()
+ {
+ $this->showCreator();
+ $this->showTag();
+ $this->showPrivacy();
+ }
+
+ function show()
+ {
+ if (empty($this->peopletag)) {
+ common_log(LOG_WARNING, "Trying to show missing peopletag; skipping.");
+ return;
+ }
+
+ $this->out->elementStart('tr');
+
+ $this->out->elementStart('td', 'peopletag');
+ $this->showPeopletag();
+ $this->out->elementEnd('td');
+
+ if ($this->peopletag->value) {
+ $this->out->element('td', 'value', $this->peopletag->value);
+ }
+ $this->out->elementEnd('tr');
+ }
+
+ function showTag()
+ {
+ $title = _('Tagged: ') . $this->peopletag->taggedCount() .
+ ' ' . _('Subscribers: ') . $this->peopletag->subscriberCount();
+
+ $this->out->elementStart('span', 'entry-title tag');
+ $this->out->element('a',
+ array('rel' => 'bookmark',
+ 'href' => $this->url(),
+ 'title' => $title),
+ htmlspecialchars($this->peopletag->tag));
+ $this->out->elementEnd('span');
+ }
+
+ function showAvatar()
+ {
+ parent::showAvatar(AVATAR_MINI_SIZE);
+ }
+}
_('Favorites'),
sprintf(_('%s\'s favorite notices'), ($user_profile) ? $name : _('User')),
$action == 'showfavorites', 'nav_timeline_favorites');
+ $this->out->menuItem(common_local_url('peopletagsbyuser', array('nickname' =>
+ $nickname)),
+ _('People tags'),
+ sprintf(_('People tags by %s'), ($user_profile) ? $user_profile->getBestName() : _('User')),
+ in_array($action, array('peopletagsbyuser', 'peopletagsforuser')),
+ 'nav_timeline_peopletags');
$cur = common_current_user();
}
require_once INSTALLDIR.'/lib/widget.php';
+require_once INSTALLDIR.'/lib/peopletags.php';
/**
* Widget to show a list of profiles
$this->showBio();
Event::handle('EndProfileListItemBio', array($this));
}
+ if (Event::handle('StartProfileListItemTags', array($this))) {
+ $this->showTags();
+ Event::handle('EndProfileListItemTags', array($this));
+ }
Event::handle('EndProfileListItemProfileElements', array($this));
}
$this->endProfile();
}
}
+ function showTags()
+ {
+ $user = common_current_user();
+ if (!empty($user)) {
+ if ($user->id == $this->profile->id) {
+ $tags = new SelftagsWidget($this->out, $user, $this->profile);
+ $tags->show();
+ } else if ($user->getProfile()->canTag($this->profile)) {
+ $tags = new PeopletagsWidget($this->out, $user, $this->profile);
+ $tags->show();
+ }
+ }
+ }
+
function endProfile()
{
$this->out->elementEnd('div');
$this->out->menuItem(common_local_url('publictagcloud'), _('Recent tags'),
_('Recent tags'), $action_name == 'publictagcloud', 'nav_recent-tags');
+ $this->out->menuItem(common_local_url('publicpeopletagcloud'), _('People tags'),
+ _('People tags'), in_array($action_name, array('publicpeopletagcloud',
+ 'peopletag', 'selftag')), 'nav_people-tags');
+
if (count(common_config('nickname', 'featured')) > 0) {
$this->out->menuItem(common_local_url('featured'), _('Featured'),
_('Featured users'), $action_name == 'featured', 'nav_featured');
$this->user->nickname),
$action == 'usergroups',
'nav_usergroups');
+ $this->out->menuItem(common_local_url('peopletagsbyuser',
+ array('nickname' =>
+ $this->user->nickname)),
+ _('People tags'),
+ sprintf(_('People tags by %s'),
+ $this->user->nickname),
+ in_array($action, array('peopletagsbyuser', 'peopletagsforuser')),
+ 'nav_timeline_peopletags');
+
if (common_config('invite', 'enabled') && !is_null($cur) && $this->user->id === $cur->id) {
$this->out->menuItem(common_local_url('invite'),
_('Invite'),
--- /dev/null
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Form for subscribing to a peopletag
+ *
+ * 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 Form
+ * @package StatusNet
+ * @author Evan Prodromou <evan@status.net>
+ * @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/form.php';
+
+/**
+ * Form for subscribing to a peopletag
+ *
+ * @category Form
+ * @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 UnsubscribeForm
+ */
+
+class SubscribePeopletagForm extends Form
+{
+ /**
+ * peopletag for the user to join
+ */
+
+ var $peopletag = null;
+
+ /**
+ * Constructor
+ *
+ * @param HTMLOutputter $out output channel
+ * @param peopletag $peopletag peopletag to subscribe to
+ */
+
+ function __construct($out=null, $peopletag=null)
+ {
+ parent::__construct($out);
+
+ $this->peopletag = $peopletag;
+ }
+
+ /**
+ * ID of the form
+ *
+ * @return string ID of the form
+ */
+
+ function id()
+ {
+ return 'peopletag-subscribe-' . $this->peopletag->id;
+ }
+
+ /**
+ * class of the form
+ *
+ * @return string of the form class
+ */
+
+ function formClass()
+ {
+ return 'form_peopletag_subscribe';
+ }
+
+ /**
+ * Action of the form
+ *
+ * @return string URL of the action
+ */
+
+ function action()
+ {
+ return common_local_url('subscribepeopletag',
+ array('id' => $this->peopletag->id));
+ }
+
+ /**
+ * Action elements
+ *
+ * @return void
+ */
+
+ function formActions()
+ {
+ $this->out->submit('submit', _('Subscribe'));
+ }
+}
// return 'select tag, count(tag) as weight from subscription left join profile_tag on tagger = subscriber where subscribed=%d and subscribed != subscriber and tagger = tagged group by tag order by weight desc';
- return 'select tag, count(tag) as weight from subscription left join profile_tag on tagger = subscriber where subscribed=%d and subscribed != subscriber and tagger = tagged and tag is not null group by tag order by weight desc';
+ return 'select profile_tag.tag, count(profile_tag.tag) as weight from subscription left join (profile_tag, profile_list) on profile_list.tag = profile_tag.tag and profile_list.tagger = profile_tag.tagger and profile_tag.tagger = subscriber where subscribed=%d and subscribed != subscriber and profile_tag.tagger = tagged and profile_list.private = false and profile_tag.tag is not null group by profile_tag.tag order by weight desc';
// return 'select tag, count(tag) as weight from subscription left join profile_tag on tagger = subscribed where subscriber=%d and subscribed != subscriber and tagger = tagged and tag is not null group by tag order by weight desc';
function query() {
// return 'select tag, count(tag) as weight from subscription left join profile_tag on subscriber=tagged and subscribed=tagger where subscribed=%d and subscriber != subscribed group by tag order by weight desc';
- return 'select tag, count(tag) as weight from subscription left join profile_tag on subscriber=tagged and subscribed=tagger where subscribed=%d and subscriber != subscribed and tag is not null group by tag order by weight desc';
+ return 'select profile_tag.tag, count(profile_tag.tag) as weight from subscription left join (profile_tag, profile_list) on subscriber=profile_tag.tagged and subscribed=profile_tag.tagger and profile_tag.tagger = profile_list.tagger and profile_tag.tag = profile_list.tag where subscribed=%d and subscriber != subscribed and profile_list.private = false and profile_tag.tag is not null group by profile_tag.tag order by weight desc';
}
}
- return 'select tag, count(tag) as weight from subscription left join profile_tag on tagger = subscribed where subscriber=%d and subscribed != subscriber and tagger = tagged and tag is not null group by tag order by weight desc';
+ return 'select profile_tag.tag, count(profile_tag.tag) as weight from subscription left join (profile_tag, profile_list) on profile_tag.tagger = subscribed and profile_tag.tag = profile_list.tag and profile_tag.tagger = profile_tag.tagger where subscriber=%d and subscribed != subscriber and profile_tag.tagger = profile_tag.tagged and profile_list.private = false and profile_tag.tag is not null group by profile_tag.tag order by weight desc';
// return 'select tag, count(tag) as weight from subscription left join profile_tag on tagger = subscriber where subscribed=%d and subscribed != subscriber and tagger = tagged and tag is not null group by tag order by weight desc';
}
function query() {
// return 'select tag, count(tag) as weight from subscription left join profile_tag on subscriber=tagger and subscribed=tagged where subscriber=%d and subscriber != subscribed group by tag order by weight desc';
- return 'select tag, count(tag) as weight from subscription left join profile_tag on subscriber=tagger and subscribed=tagged where subscriber=%d and subscriber != subscribed and tag is not null group by tag order by weight desc';
+ return 'select profile_tag.tag, count(profile_tag.tag) as weight from subscription left join (profile_tag, profile_list) on subscriber=profile_tag.tagger and subscribed=tagged and profile_tag.tag = profile_list.tag and profile_tag.tagger = profile_list.tagger where subscriber=%d and subscriber != subscribed and profile_list.private = false and profile_tag.tag is not null group by profile_tag.tag order by weight desc';
}
}
--- /dev/null
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Form for editing a peopletag
+ *
+ * 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 Form
+ * @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/form.php';
+
+/**
+ * Form for editing a peopletag
+ *
+ * @category Form
+ * @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 GroupEditForm
+ */
+
+class SearchProfileForm extends Form
+{
+ var $peopletag;
+
+ function __construct($out, Profile_list $peopletag)
+ {
+ parent::__construct($out);
+ $this->peopletag = $peopletag;
+ }
+
+ /**
+ * ID of the form
+ *
+ * @return string ID of the form
+ */
+
+ function id()
+ {
+ return 'form_peopletag-add-' . $this->peopletag->id;
+ }
+
+ /**
+ * class of the form
+ *
+ * @return string of the form class
+ */
+
+ function formClass()
+ {
+ return 'form_peopletag_edit_user_search';
+ }
+
+ /**
+ * Action of the form
+ *
+ * @return string URL of the action
+ */
+
+ function action()
+ {
+ return common_local_url('profilecompletion');
+ }
+
+ /**
+ * Name of the form
+ *
+ * @return void
+ */
+
+ function formLegend()
+ {
+ $this->out->element('legend', null, sprintf(_('Search and list people')));
+ }
+
+ /**
+ * Data elements of the form
+ *
+ * @return void
+ */
+
+ function formData()
+ {
+ $fields = array('fulltext' => 'Everything',
+ 'nickname' => 'Nickname',
+ 'fullname' => 'Fullname',
+ 'description' => 'Description',
+ 'location' => 'Location',
+ 'uri' => 'Uri (Remote users)');
+
+
+ $this->out->hidden('peopletag_id', $this->peopletag->id);
+ $this->out->input('q', null);
+ $this->out->dropdown('field', _('Search in'), $fields,
+ _('Choose a field to search'), false, 'fulltext');
+ }
+
+ /**
+ * Action elements
+ *
+ * @return void
+ */
+
+ function formActions()
+ {
+ $this->out->submit('submit', _('Search'));
+ }
+}
+
+class UntagButton extends Form
+{
+ var $profile;
+ var $peopletag;
+
+ function __construct($out, Profile $profile, Profile_list $peopletag)
+ {
+ parent::__construct($out);
+ $this->profile = $profile;
+ $this->peopletag = $peopletag;
+ }
+
+ /**
+ * ID of the form
+ *
+ * @return string ID of the form
+ */
+
+ function id()
+ {
+ return 'form_peopletag-' . $this->peopletag->id . '-remove-' . $this->profile->id;
+ }
+
+ /**
+ * class of the form
+ *
+ * @return string of the form class
+ */
+
+ function formClass()
+ {
+ return 'form_user_remove_peopletag';
+ }
+
+ /**
+ * Action of the form
+ *
+ * @return string URL of the action
+ */
+
+ function action()
+ {
+ return common_local_url('removepeopletag');
+ }
+
+ /**
+ * Name of the form
+ *
+ * @return void
+ */
+
+ function formLegend()
+ {
+ $this->out->element('legend', null, sprintf(_('Untag %s as %s'),
+ $this->profile->nickname, $this->peopletag->tag));
+ }
+
+ /**
+ * Data elements of the form
+ *
+ * @return void
+ */
+
+ function formData()
+ {
+ $this->out->hidden('peopletag_id', $this->peopletag->id);
+ $this->out->hidden('tagged', $this->profile->id);
+ }
+
+ /**
+ * Action elements
+ *
+ * @return void
+ */
+
+ function formActions()
+ {
+ $this->out->submit('submit', _('Remove'));
+ }
+}
+
+
+class TagButton extends Form
+{
+ var $profile;
+ var $peopletag;
+
+ function __construct($out, Profile $profile, Profile_list $peopletag)
+ {
+ parent::__construct($out);
+ $this->profile = $profile;
+ $this->peopletag = $peopletag;
+ }
+
+ /**
+ * ID of the form
+ *
+ * @return string ID of the form
+ */
+
+ function id()
+ {
+ return 'form_peopletag-' . $this->peopletag->id . '-add-' . $this->profile->id;
+ }
+
+ /**
+ * class of the form
+ *
+ * @return string of the form class
+ */
+
+ function formClass()
+ {
+ return 'form_user_add_peopletag';
+ }
+
+ /**
+ * Action of the form
+ *
+ * @return string URL of the action
+ */
+
+ function action()
+ {
+ return common_local_url('addpeopletag');
+ }
+
+ /**
+ * Name of the form
+ *
+ * @return void
+ */
+
+ function formLegend()
+ {
+ $this->out->element('legend', null, sprintf(_('Tag %s as %s'),
+ $this->profile->nickname, $this->peopletag->tag));
+ }
+
+ /**
+ * Data elements of the form
+ *
+ * @return void
+ */
+
+ function formData()
+ {
+ UntagButton::formData();
+ }
+
+ /**
+ * Action elements
+ *
+ * @return void
+ */
+
+ function formActions()
+ {
+ $this->out->submit('submit', _('Add'));
+ }
+}
+
+class TaggedProfileItem extends Widget
+{
+ var $profile=null;
+
+ function __construct($out=null, $profile)
+ {
+ parent::__construct($out);
+ $this->profile = $profile;
+ }
+
+ function show()
+ {
+ $this->out->elementStart('a', array('class' => 'url',
+ 'href' => $this->profile->profileurl,
+ 'title' => $this->profile->getBestName()));
+ $avatar = $this->profile->getAvatar(AVATAR_MINI_SIZE);
+ $this->out->element('img', array('src' => (($avatar) ? $avatar->displayUrl() :
+ Avatar::defaultImage(AVATAR_MINI_SIZE)),
+ 'width' => AVATAR_MINI_SIZE,
+ 'height' => AVATAR_MINI_SIZE,
+ 'class' => 'avatar photo',
+ 'alt' => $this->profile->getBestName()));
+ $this->out->element('span', 'fn nickname', $this->profile->nickname);
+ $this->out->elementEnd('a');
+ }
+}
--- /dev/null
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Form for unsubscribing to a peopletag
+ *
+ * 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 Form
+ * @package StatusNet
+ * @author Evan Prodromou <evan@status.net>
+ * @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/form.php';
+
+/**
+ * Form for unsubscribing to a peopletag
+ *
+ * @category Form
+ * @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 UnunsubscribeForm
+ */
+
+class UnsubscribePeopletagForm extends Form
+{
+ /**
+ * peopletag for the user to join
+ */
+
+ var $peopletag = null;
+
+ /**
+ * Constructor
+ *
+ * @param HTMLOutputter $out output channel
+ * @param peopletag $peopletag peopletag to unsubscribe to
+ */
+
+ function __construct($out=null, $peopletag=null)
+ {
+ parent::__construct($out);
+
+ $this->peopletag = $peopletag;
+ }
+
+ /**
+ * ID of the form
+ *
+ * @return string ID of the form
+ */
+
+ function id()
+ {
+ return 'peopletag-unsubscribe-' . $this->peopletag->id;
+ }
+
+ /**
+ * class of the form
+ *
+ * @return string of the form class
+ */
+
+ function formClass()
+ {
+ return 'form_peopletag_unsubscribe';
+ }
+
+ /**
+ * Action of the form
+ *
+ * @return string URL of the action
+ */
+
+ function action()
+ {
+ return common_local_url('unsubscribepeopletag',
+ array('id' => $this->peopletag->id));
+ }
+
+ /**
+ * Action elements
+ *
+ * @return void
+ */
+
+ function formActions()
+ {
+ $this->out->submit('submit', _('Unsubscribe'));
+ }
+}
}
require_once INSTALLDIR.'/lib/widget.php';
+require_once INSTALLDIR.'/lib/peopletags.php';
/**
* Profile of a user
function showProfileTags()
{
- if (Event::handle('StartProfilePageProfileTags', array($this->out, $this->profile))) {
- $tags = Profile_tag::getTags($this->profile->id, $this->profile->id);
-
- if (count($tags) > 0) {
- $this->out->elementStart('ul', 'tags xoxo entity_tags');
- foreach ($tags as $tag) {
- $this->out->elementStart('li');
- // Avoid space by using raw output.
- $pt = '<span class="mark_hash">#</span><a rel="tag" href="' .
- common_local_url('peopletag', array('tag' => $tag)) .
- '">' . $tag . '</a>';
- $this->out->raw($pt);
- $this->out->elementEnd('li');
- }
- $this->out->elementEnd('ul');
+ $cur = common_current_user();
+
+ $self_tags = new SelftagsWidget($this->out, $this->profile, $this->profile);
+ $self_tags->show();
+
+ if ($cur) {
+ // don't show self-tags again
+ if ($cur->id != $this->profile->id && $cur->getProfile()->canTag($this->profile)) {
+ $tags = new PeopletagsWidget($this->out, $cur, $this->profile);
+ $tags->show();
}
- Event::handle('EndProfilePageProfileTags', array($this->out, $this->profile));
}
}