ToSelector widget to send private notices

A new widget, ToSelector (Sorry, couldn't think of anything better)
that lets you select an addressee for a notice and whether it's
private.
This commit is contained in:
Evan Prodromou 2011-03-28 11:02:20 -04:00
parent 133def8370
commit 5147404ea2
3 changed files with 189 additions and 1 deletions

View File

@ -209,6 +209,10 @@ class NewnoticeAction extends Action
$author_id = $user->id;
$text = $content_shortened;
// Does the heavy-lifting for getting "To:" information
ToSelector::fillOptions($this, $options);
if (Event::handle('StartNoticeSaveWeb', array($this, &$author_id, &$text, &$options))) {
$notice = Notice::saveNew($user->id, $content_shortened, 'web', $options);

View File

@ -79,6 +79,15 @@ class NoticeForm extends Form
var $location_id;
var $location_ns;
/** select this group from the drop-down by default. */
var $to_group;
/** select this user from the drop-down by default. */
var $to_user;
/** Pre-click the private checkbox. */
var $private;
/**
* Constructor
*
@ -109,7 +118,8 @@ class NoticeForm extends Form
$this->actionName = $action->trimmed('action');
$prefill = array('content', 'inreplyto', 'lat',
'lon', 'location_id', 'location_ns');
'lon', 'location_id', 'location_ns',
'to_group', 'to_profile', 'private');
foreach ($prefill as $fieldName) {
if (array_key_exists($fieldName, $options)) {
@ -117,6 +127,16 @@ class NoticeForm extends Form
}
}
// Prefill the profile if we're replying
if (empty($this->to_profile) &&
!empty($this->inreplyto)) {
$notice = Notice::staticGet('id', $this->inreplyto);
if (!empty($notice)) {
$this->to_profile = $notice->getProfile();
}
}
if (array_key_exists('user', $options)) {
$this->user = $options['user'];
} else {
@ -218,6 +238,14 @@ class NoticeForm extends Form
}
$this->out->hidden('notice_in-reply-to', $this->inreplyto, 'inreplyto');
$this->out->elementStart('div');
$toWidget = new ToSelector($this->out,
$this->user,
(!empty($this->to_group) ? $this->to_group : $this->to_user));
$toWidget->show();
$this->out->elementEnd('div');
if ($this->user->shareLocation()) {
$this->out->hidden('notice_data-lat', empty($this->lat) ? (empty($this->profile->lat) ? null : $this->profile->lat) : $this->lat, 'lat');
$this->out->hidden('notice_data-lon', empty($this->lon) ? (empty($this->profile->lon) ? null : $this->profile->lon) : $this->lon, 'lon');

156
lib/toselector.php Normal file
View File

@ -0,0 +1,156 @@
<?php
/**
* StatusNet - the distributed open-source microblogging tool
* Copyright (C) 2011, StatusNet, Inc.
*
* Widget showing a drop-down of potential addressees
*
* 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 Widget
* @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);
}
/**
* Widget showing a drop-down of potential addressees
*
* @category Widget
* @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 ToSelector extends Widget
{
protected $user;
protected $to;
protected $id;
protected $name;
protected $private;
/**
* Constructor
*
* @param HTMLOutputter $out output context
* @param User $user Current user
* @param mixed $to Default selection for addressee
*/
function __construct($out, $user, $to, $private=false, $id='notice_to', $name='notice_to')
{
parent::__construct($out);
$this->user = $user;
$this->to = $to;
$this->private = $private;
$this->id = $id;
$this->name = $name;
}
/**
* Constructor
*
* @param HTMLOutputter $out output context
* @param User $user Current user
* @param mixed $to Default selection for addressee
*/
function show()
{
$choices = array();
$default = 'public:site';
if (!common_config('site', 'private')) {
$choices['public:everyone'] = _('Everyone');
$default = 'public:everyone';
}
// XXX: better name...?
$choices['public:site'] = sprintf(_('My colleagues at %s'), common_config('site', 'name'));
$groups = $this->user->getGroups();
while ($groups->fetch()) {
$value = 'group:'.$groups->id;
if (($this->to instanceof User_group) && $this->to->id == $groups->id) {
$default = $value;
}
$choices[$value] = $groups->getBestName();
}
// XXX: add users...?
if ($this->to instanceof Profile) {
$value = 'profile:'.$this->to->id;
$default = $value;
$choices[$value] = $this->to->getBestName();
}
$this->out->dropdown($this->id,
_('To:'),
$choices,
null,
false,
$default);
$this->out->checkbox('notice_private',
_('Private'),
$this->private);
}
static function fillOptions($action, &$options)
{
// XXX: make arg name selectable
$toArg = $action->trimmed('notice_to');
$private = $action->boolean('notice_private');
list($prefix, $value) = explode(':', $toArg);
switch ($prefix) {
case 'group':
$options['groups'] = array($value);
if ($private) {
$options['scope'] = Notice::GROUP_SCOPE;
}
break;
case 'profile':
$profile = Profile::staticGet('id', $value);
$options['replies'] = $profile->getUri();
if ($private) {
$options['scope'] = Notice::ADDRESSEE_SCOPE;
}
break;
case 'public':
if ($value == 'everyone' && !common_config('site', 'private')) {
$options['scope'] = 0;
} else if ($value == 'site') {
$options['scope'] = Notice::SITE_SCOPE;
}
break;
default:
throw new ClientException('Unknown to value: ' . toArg);
break;
}
}
}