]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
ConversationTree is now a plugin (not oldschool setting)
authorMikael Nordfeldth <mmn@hethane.se>
Mon, 12 May 2014 09:41:51 +0000 (11:41 +0200)
committerMikael Nordfeldth <mmn@hethane.se>
Mon, 12 May 2014 09:51:11 +0000 (11:51 +0200)
Conversation trees works pretty bad with the current layout, javascript
etc. So it's best if we separate it and work on it as a side-project. The
oldschool settings are currently being deprecated (or broken out like this).

I'll wait with removing User preferences for oldschool conversation tree,
since that might be reusable data. But I guess it will go in the near future.

actions/oldschoolsettings.php
classes/User.php
lib/conversationnoticestream.php
lib/conversationtree.php [deleted file]
plugins/ConversationTree/ConversationTreePlugin.php [new file with mode: 0644]
plugins/ConversationTree/lib/conversationtree.php [new file with mode: 0644]
plugins/ConversationTree/lib/conversationtreeitem.php [new file with mode: 0644]

index 8c4ff9be2784c823b1b9befbae4963ef4eccb168..25ec13e4816426b3f95fb91c6a1634a1b4591308 100644 (file)
@@ -110,7 +110,6 @@ class OldschoolsettingsAction extends SettingsAction
         }
 
         $osp->stream_mode_only  = $this->boolean('stream_mode_only');
-        $osp->conversation_tree = $this->boolean('conversation_tree');
         $osp->stream_nicknames  = $this->boolean('stream_nicknames');
         $osp->modified          = common_sql_now();
 
@@ -162,10 +161,6 @@ class OldSchoolForm extends Form
                         $this->user->streamModeOnly());
         $this->elementEnd('li');
         $this->elementStart('li');
-        $this->checkbox('conversation_tree', _('Show conversation page as hierarchical trees'),
-                        $this->user->conversationTree());
-        $this->elementEnd('li');
-        $this->elementStart('li');
         $this->checkbox('stream_nicknames', _('Show nicknames (not full names) in timelines'),
                         $this->user->streamNicknames());
         $this->elementEnd('li');
index 115bda09b7c0f60007b6e37ba53b761bb3bf3e16..3e2873c75fe36cc8a07d69d36da1f9efc2c29560 100644 (file)
@@ -981,18 +981,6 @@ class User extends Managed_DataObject
         return false;
     }
 
-    function conversationTree()
-    {
-        if (common_config('oldschool', 'enabled')) {
-            $osp = Old_school_prefs::getKV('user_id', $this->id);
-            if (!empty($osp)) {
-                return $osp->conversation_tree;
-            }
-        }
-
-        return false;
-    }
-
     function streamNicknames()
     {
         if (common_config('oldschool', 'enabled')) {
index 7d2e70354590015304018e8fb35a99f8eee5637c..b9b03c45c5b6354b262a8a6ba02967c95dcea7a8 100644 (file)
@@ -76,12 +76,8 @@ class RawConversationNoticeStream extends NoticeStream
         $this->id = $id;
     }
 
-    function getNoticeIds($offset, $limit, $since_id, $max_id)
+    function getNoticeIds($offset, $limit, $since_id=null, $max_id=null)
     {
-        $conv = Conversation::getKV('id', $this->id);
-        if (!$conv instanceof Conversation) {
-            throw new ServerException('Could not find conversation');
-        }
         $notice = new Notice();
         // SELECT
         $notice->selectAdd();
@@ -95,11 +91,14 @@ class RawConversationNoticeStream extends NoticeStream
         if (!empty($max_id)) {
             $notice->whereAdd(sprintf('notice.id <= %d', $max_id));
         }
-        $notice->limit($offset, $limit);
+        if (!is_null($offset)) {
+            $notice->limit($offset, $limit);
+        }
 
         // ORDER BY
         // currently imitates the previously used "_reverseChron" sorting
         $notice->orderBy('notice.created DESC');
+        $notice->find();
         return $notice->fetchAll('id');
     }
 }
diff --git a/lib/conversationtree.php b/lib/conversationtree.php
deleted file mode 100644 (file)
index ee24310..0000000
+++ /dev/null
@@ -1,215 +0,0 @@
-<?php
-/**
- * StatusNet - the distributed open-source microblogging tool
- * Copyright (C) 2011, StatusNet, Inc.
- *
- * Conversation tree widget for oooooold school playas
- * 
- * 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);
-}
-
-/**
- * Conversation tree
- *
- * The widget class for displaying a hierarchical list of notices.
- *
- * @category Widget
- * @package  StatusNet
- * @author   Evan Prodromou <evan@status.net>
- * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
- * @link     http://status.net/
- */
-class ConversationTree extends NoticeList
-{
-    var $tree  = null;
-    var $table = null;
-
-    /**
-     * Show the tree of notices
-     *
-     * @return void
-     */
-    function show()
-    {
-        $cnt = $this->_buildTree();
-
-        $this->out->elementStart('div', array('id' =>'notices_primary'));
-        // TRANS: Header on conversation page. Hidden by default (h2).
-        $this->out->element('h2', null, _('Notices'));
-        $this->out->elementStart('ol', array('class' => 'notices xoxo old-school'));
-
-        if (array_key_exists('root', $this->tree)) {
-            $rootid = $this->tree['root'][0];
-            $this->showNoticePlus($rootid);
-        }
-
-        $this->out->elementEnd('ol');
-        $this->out->elementEnd('div');
-
-        return $cnt;
-    }
-
-    function _buildTree()
-    {
-        $cnt = 0;
-
-        $this->tree  = array();
-        $this->table = array();
-
-        while ($this->notice->fetch()) {
-
-            $cnt++;
-
-            $id     = $this->notice->id;
-            $notice = clone($this->notice);
-
-            $this->table[$id] = $notice;
-
-            if (is_null($notice->reply_to)) {
-                $this->tree['root'] = array($notice->id);
-            } else if (array_key_exists($notice->reply_to, $this->tree)) {
-                $this->tree[$notice->reply_to][] = $notice->id;
-            } else {
-                $this->tree[$notice->reply_to] = array($notice->id);
-            }
-        }
-
-        return $cnt;
-    }
-
-    /**
-     * Shows a notice plus its list of children.
-     *
-     * @param integer $id ID of the notice to show
-     *
-     * @return void
-     */
-    function showNoticePlus($id)
-    {
-        $notice = $this->table[$id];
-
-        $this->out->elementStart('li', array('class' => 'hentry notice',
-                                             'id' => 'notice-' . $id));
-
-        $item = $this->newListItem($notice);
-        $item->show();
-
-        if (array_key_exists($id, $this->tree)) {
-            $children = $this->tree[$id];
-
-            $this->out->elementStart('ol', array('class' => 'notices'));
-
-            sort($children);
-
-            foreach ($children as $child) {
-                $this->showNoticePlus($child);
-            }
-
-            $this->out->elementEnd('ol');
-        }
-
-        $this->out->elementEnd('li');
-    }
-
-    /**
-     * Override parent class to return our preferred item.
-     *
-     * @param Notice $notice Notice to display
-     *
-     * @return NoticeListItem a list item to show
-     */
-    function newListItem($notice)
-    {
-        return new ConversationTreeItem($notice, $this->out);
-    }
-}
-
-/**
- * Conversation tree list item
- *
- * Special class of NoticeListItem for use inside conversation trees.
- *
- * @category Widget
- * @package  StatusNet
- * @author   Evan Prodromou <evan@status.net>
- * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
- * @link     http://status.net/
- */
-class ConversationTreeItem extends NoticeListItem
-{
-    /**
-     * start a single notice.
-     *
-     * The default creates the <li>; we skip, since the ConversationTree
-     * takes care of that.
-     *
-     * @return void
-     */
-    function showStart()
-    {
-        return;
-    }
-
-    /**
-     * finish the notice
-     *
-     * The default closes the <li>; we skip, since the ConversationTree
-     * takes care of that.
-     *
-     * @return void
-     */
-    function showEnd()
-    {
-        return;
-    }
-
-    /**
-     * show link to notice conversation page
-     *
-     * Since we're only used on the conversation page, we skip this
-     *
-     * @return void
-     */
-    function showContext()
-    {
-        return;
-    }
-
-    /**
-     * show people this notice is in reply to
-     *
-     * Tree context shows this, so we skip it.
-     *
-     * @return void
-     */
-    function showAddressees()
-    {
-        return;
-    }
-}
diff --git a/plugins/ConversationTree/ConversationTreePlugin.php b/plugins/ConversationTree/ConversationTreePlugin.php
new file mode 100644 (file)
index 0000000..5532adb
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+/*
+ * GNU Social - a federating social network
+ * Copyright (C) 2014, Free Software Foundation, Inc.
+ *
+ * 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/>.
+ */
+
+if (!defined('GNUSOCIAL')) { exit(1); }
+
+/**
+ * @package     UI
+ * @maintainer  Mikael Nordfeldth <mmn@hethane.se>
+ */
+class ConversationTreePlugin extends Plugin
+{
+    public function onStartShowConversation(Action $action, Conversation $conv, Profile $scoped=null) {
+        $nl = new ConversationTree($conv->getNotices(), $action);
+        $cnt = $nl->show();
+        return false;
+    }
+
+    public function onPluginVersion(array &$versions)
+    {
+        $versions[] = array('name' => 'ConversationTree',
+                            'version' => GNUSOCIAL_VERSION,
+                            'author' => 'Mikael Nordfeldth',
+                            'homepage' => 'http://gnu.io/',
+                            'rawdescription' =>
+                            // TRANS: Plugin description.
+                            _m('Enables conversation tree view.'));
+
+        return true;
+    }
+}
diff --git a/plugins/ConversationTree/lib/conversationtree.php b/plugins/ConversationTree/lib/conversationtree.php
new file mode 100644 (file)
index 0000000..05282ab
--- /dev/null
@@ -0,0 +1,147 @@
+<?php
+/**
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2011, StatusNet, Inc.
+ *
+ * Conversation tree widget for oooooold school playas
+ * 
+ * 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('GNUSOCIAL')) { exit(1); }
+
+/**
+ * Conversation tree
+ *
+ * The widget class for displaying a hierarchical list of notices.
+ *
+ * @category Widget
+ * @package  StatusNet
+ * @author   Evan Prodromou <evan@status.net>
+ * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
+ * @link     http://status.net/
+ */
+class ConversationTree extends NoticeList
+{
+    var $tree  = null;
+    var $table = null;
+
+    /**
+     * Show the tree of notices
+     *
+     * @return void
+     */
+    function show()
+    {
+        $cnt = $this->_buildTree();
+
+        $this->out->elementStart('div', array('id' =>'notices_primary'));
+        // TRANS: Header on conversation page. Hidden by default (h2).
+        $this->out->element('h2', null, _('Notices'));
+        $this->out->elementStart('ol', array('class' => 'notices xoxo old-school'));
+
+        if (array_key_exists('root', $this->tree)) {
+            $rootid = $this->tree['root'][0];
+            $this->showNoticePlus($rootid);
+        }
+
+        $this->out->elementEnd('ol');
+        $this->out->elementEnd('div');
+
+        return $cnt;
+    }
+
+    function _buildTree()
+    {
+        $cnt = 0;
+
+        $this->tree  = array();
+        $this->table = array();
+
+        while ($this->notice->fetch()) {
+
+            $cnt++;
+
+            $id     = $this->notice->id;
+            $notice = clone($this->notice);
+
+            $this->table[$id] = $notice;
+
+            if (is_null($notice->reply_to)) {
+                $this->tree['root'] = array($notice->id);
+            } else if (array_key_exists($notice->reply_to, $this->tree)) {
+                $this->tree[$notice->reply_to][] = $notice->id;
+            } else {
+                $this->tree[$notice->reply_to] = array($notice->id);
+            }
+        }
+
+        return $cnt;
+    }
+
+    /**
+     * Shows a notice plus its list of children.
+     *
+     * @param integer $id ID of the notice to show
+     *
+     * @return void
+     */
+    function showNoticePlus($id)
+    {
+        $notice = $this->table[$id];
+
+        $this->out->elementStart('li', array('class' => 'hentry notice',
+                                             'id' => 'notice-' . $id));
+
+        $item = $this->newListItem($notice);
+        $item->show();
+
+        if (array_key_exists($id, $this->tree)) {
+            $children = $this->tree[$id];
+
+            $this->out->elementStart('ol', array('class' => 'notices threaded-replies xoxo'));
+
+            sort($children);
+
+            foreach ($children as $child) {
+                $this->showNoticePlus($child);
+            }
+
+            $this->out->elementEnd('ol');
+        }
+
+        $this->out->elementEnd('li');
+    }
+
+    /**
+     * Override parent class to return our preferred item.
+     *
+     * @param Notice $notice Notice to display
+     *
+     * @return NoticeListItem a list item to show
+     */
+    function newListItem($notice)
+    {
+        return new ConversationTreeItem($notice, $this->out);
+    }
+}
diff --git a/plugins/ConversationTree/lib/conversationtreeitem.php b/plugins/ConversationTree/lib/conversationtreeitem.php
new file mode 100644 (file)
index 0000000..d7db04e
--- /dev/null
@@ -0,0 +1,95 @@
+<?php
+/**
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2011, StatusNet, Inc.
+ *
+ * Conversation tree widget for oooooold school playas
+ * 
+ * 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('GNUSOCIAL')) { exit(1); }
+
+/**
+ * Conversation tree list item
+ *
+ * Special class of NoticeListItem for use inside conversation trees.
+ *
+ * @category Widget
+ * @package  StatusNet
+ * @author   Evan Prodromou <evan@status.net>
+ * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
+ * @link     http://status.net/
+ */
+class ConversationTreeItem extends NoticeListItem
+{
+    /**
+     * start a single notice.
+     *
+     * The default creates the <li>; we skip, since the ConversationTree
+     * takes care of that.
+     *
+     * @return void
+     */
+    function showStart()
+    {
+        return;
+    }
+
+    /**
+     * finish the notice
+     *
+     * The default closes the <li>; we skip, since the ConversationTree
+     * takes care of that.
+     *
+     * @return void
+     */
+    function showEnd()
+    {
+        return;
+    }
+
+    /**
+     * show link to notice conversation page
+     *
+     * Since we're only used on the conversation page, we skip this
+     *
+     * @return void
+     */
+    function showContext()
+    {
+        return;
+    }
+
+    /**
+     * show people this notice is in reply to
+     *
+     * Tree context shows this, so we skip it.
+     *
+     * @return void
+     */
+    function showAddressees()
+    {
+        return;
+    }
+}