| 
									
										
										
										
											2011-03-28 11:02:20 -04:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * StatusNet - the distributed open-source microblogging tool | 
					
						
							|  |  |  |  * Copyright (C) 2011, StatusNet, Inc. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Widget showing a drop-down of potential addressees | 
					
						
							| 
									
										
										
										
											2011-03-30 00:48:19 +02:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2011-03-28 11:02:20 -04:00
										 |  |  |  * 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(); | 
					
						
							| 
									
										
										
										
											2016-02-18 00:32:09 +01:00
										 |  |  |         $default = common_config('site', 'private') ? 'public:site' : 'public:everyone'; | 
					
						
							| 
									
										
										
										
											2011-03-30 00:48:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-28 11:02:20 -04:00
										 |  |  |         $groups = $this->user->getGroups(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-29 11:27:26 +01:00
										 |  |  |         while ($groups instanceof User_group && $groups->fetch()) { | 
					
						
							| 
									
										
										
										
											2016-02-18 00:05:09 +01:00
										 |  |  |             $value = 'group:'.$groups->getID(); | 
					
						
							| 
									
										
										
										
											2011-03-28 11:02:20 -04:00
										 |  |  |             if (($this->to instanceof User_group) && $this->to->id == $groups->id) { | 
					
						
							|  |  |  |                 $default = $value; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2016-02-18 00:05:09 +01:00
										 |  |  |             $choices[$value] = "!{$groups->getNickname()} [{$groups->getBestName()}]"; | 
					
						
							| 
									
										
										
										
											2011-03-28 11:02:20 -04:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-06 13:49:16 -04:00
										 |  |  |         // Add subscribed users to dropdown menu
 | 
					
						
							|  |  |  |         $users = $this->user->getSubscribed(); | 
					
						
							|  |  |  |         while ($users->fetch()) { | 
					
						
							| 
									
										
										
										
											2016-02-18 00:05:09 +01:00
										 |  |  |             $value = 'profile:'.$users->getID(); | 
					
						
							|  |  |  |             try { | 
					
						
							|  |  |  |                 $choices[$value] = substr($users->getAcctUri(), 5) . " [{$users->getBestName()}]"; | 
					
						
							|  |  |  |             } catch (ProfileNoAcctUriException $e) { | 
					
						
							| 
									
										
										
										
											2016-02-18 00:13:59 +01:00
										 |  |  |                 $choices[$value] = "[?@?] " . $e->profile->getBestName(); | 
					
						
							| 
									
										
										
										
											2015-06-06 13:49:16 -04:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2011-03-28 11:02:20 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if ($this->to instanceof Profile) { | 
					
						
							| 
									
										
										
										
											2016-02-18 00:05:09 +01:00
										 |  |  |             $value = 'profile:'.$this->to->getID(); | 
					
						
							| 
									
										
										
										
											2011-03-28 11:02:20 -04:00
										 |  |  |             $default = $value; | 
					
						
							| 
									
										
										
										
											2016-02-18 00:05:09 +01:00
										 |  |  |             try { | 
					
						
							|  |  |  |                 $choices[$value] = substr($this->to->getAcctUri(), 5) . " [{$this->to->getBestName()}]"; | 
					
						
							|  |  |  |             } catch (ProfileNoAcctUriException $e) { | 
					
						
							| 
									
										
										
										
											2016-02-18 00:13:59 +01:00
										 |  |  |                 $choices[$value] = "[?@?] " . $e->profile->getBestName(); | 
					
						
							| 
									
										
										
										
											2016-02-18 00:05:09 +01:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2011-03-28 11:02:20 -04:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-18 00:05:09 +01:00
										 |  |  |         // alphabetical order
 | 
					
						
							|  |  |  |         asort($choices); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-18 00:32:09 +01:00
										 |  |  |         // Reverse so we can add entries at the end (can't unshift with a key)
 | 
					
						
							|  |  |  |         $choices = array_reverse($choices); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-16 22:28:26 +00:00
										 |  |  |         if (common_config('site', 'private')) { | 
					
						
							| 
									
										
										
										
											2016-02-18 00:33:16 +01:00
										 |  |  |             // TRANS: Option in drop-down of potential addressees.
 | 
					
						
							|  |  |  |             // TRANS: %s is a StatusNet sitename.
 | 
					
						
							|  |  |  |             $choices['public:site'] = sprintf(_('Everyone at %s'), common_config('site', 'name')); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-02-18 00:32:09 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (!common_config('site', 'private')) { | 
					
						
							|  |  |  |             // TRANS: Option in drop-down of potential addressees.
 | 
					
						
							|  |  |  |             $choices['public:everyone'] = _m('SENDTO','Everyone'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Return the order
 | 
					
						
							|  |  |  |         $choices = array_reverse($choices); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-28 11:02:20 -04:00
										 |  |  |         $this->out->dropdown($this->id, | 
					
						
							| 
									
										
										
										
											2011-03-30 00:48:19 +02:00
										 |  |  |                              // TRANS: Label for drop-down of potential addressees.
 | 
					
						
							|  |  |  |                              _m('LABEL','To:'), | 
					
						
							| 
									
										
										
										
											2011-03-28 11:02:20 -04:00
										 |  |  |                              $choices, | 
					
						
							|  |  |  |                              null, | 
					
						
							|  |  |  |                              false, | 
					
						
							|  |  |  |                              $default); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-05 12:38:15 -04:00
										 |  |  |         $this->out->elementStart('span', 'checkbox-wrapper'); | 
					
						
							| 
									
										
										
										
											2016-02-17 23:05:44 +01:00
										 |  |  |         if (common_config('notice', 'allowprivate')) { | 
					
						
							|  |  |  |             $this->out->checkbox('notice_private', | 
					
						
							|  |  |  |                                  // TRANS: Checkbox label in widget for selecting potential addressees to mark the notice private.
 | 
					
						
							|  |  |  |                                  _('Private?'), | 
					
						
							|  |  |  |                                  $this->private); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2011-04-05 12:38:15 -04:00
										 |  |  |         $this->out->elementEnd('span'); | 
					
						
							| 
									
										
										
										
											2011-03-28 11:02:20 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-17 23:44:15 +01:00
										 |  |  |     static function fillActivity(Action $action, Activity $act, array &$options) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (!$act->context instanceof ActivityContext) { | 
					
						
							|  |  |  |             $act->context = new ActivityContext(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         self::fillOptions($action, $options); | 
					
						
							|  |  |  |         if (isset($options['groups'])) { | 
					
						
							|  |  |  |             foreach ($options['groups'] as $group_id) { | 
					
						
							|  |  |  |                 $group = User_group::getByID($group_id); | 
					
						
							|  |  |  |                 $act->context->attention[$group->getUri()] = $group->getObjectType(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if (isset($options['replies'])) { | 
					
						
							|  |  |  |             foreach ($options['replies'] as $profile_uri) { | 
					
						
							|  |  |  |                 $profile = Profile::fromUri($profile_uri); | 
					
						
							|  |  |  |                 $act->context->attention[$profile->getUri()] = $profile->getObjectType(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-28 11:02:20 -04:00
										 |  |  |     static function fillOptions($action, &$options) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         // XXX: make arg name selectable
 | 
					
						
							|  |  |  |         $toArg = $action->trimmed('notice_to'); | 
					
						
							| 
									
										
										
										
											2016-02-17 23:05:44 +01:00
										 |  |  |         $private = common_config('notice', 'allowprivate') ? $action->boolean('notice_private') : false; | 
					
						
							| 
									
										
										
										
											2011-03-28 11:02:20 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-11 12:55:49 -04:00
										 |  |  |         if (empty($toArg)) { | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-28 11:02:20 -04:00
										 |  |  |         list($prefix, $value) = explode(':', $toArg); | 
					
						
							|  |  |  |         switch ($prefix) { | 
					
						
							|  |  |  |         case 'group': | 
					
						
							|  |  |  |             $options['groups'] = array($value); | 
					
						
							|  |  |  |             if ($private) { | 
					
						
							|  |  |  |                 $options['scope'] = Notice::GROUP_SCOPE; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case 'profile': | 
					
						
							| 
									
										
										
										
											2013-08-18 13:04:58 +02:00
										 |  |  |             $profile = Profile::getKV('id', $value); | 
					
						
							| 
									
										
										
										
											2011-06-21 11:32:26 -04:00
										 |  |  |             $options['replies'] = array($profile->getUri()); | 
					
						
							| 
									
										
										
										
											2011-03-28 11:02:20 -04:00
										 |  |  |             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: | 
					
						
							| 
									
										
										
										
											2011-03-30 00:48:19 +02:00
										 |  |  |             // TRANS: Client exception thrown in widget for selecting potential addressees when an invalid fill option was received.
 | 
					
						
							|  |  |  |             throw new ClientException(sprintf(_('Unknown to value: "%s".'),$toArg)); | 
					
						
							| 
									
										
										
										
											2011-03-28 11:02:20 -04:00
										 |  |  |             break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |