]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
ToSelector widget to send private notices
authorEvan Prodromou <evan@status.net>
Mon, 28 Mar 2011 15:02:20 +0000 (11:02 -0400)
committerEvan Prodromou <evan@status.net>
Mon, 28 Mar 2011 15:02:20 +0000 (11:02 -0400)
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.

actions/newnotice.php
lib/noticeform.php
lib/toselector.php [new file with mode: 0644]

index 7f697e23f397d8962792396a834d4954730558c9..f48134c3b21e5743d449858644ea6b6652a23ece 100644 (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);
index 2cbacc9280ae6f20df06b7574e35a9a20541ddc2..01a462aad1bbbfc03ea85ed43a36b5756d358e93 100644 (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');
diff --git a/lib/toselector.php b/lib/toselector.php
new file mode 100644 (file)
index 0000000..6dd4b5c
--- /dev/null
@@ -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;
+        }
+    }
+}