]> git.wh0rd.org Git - tt-rss.git/commitdiff
initial work on nested categories
authorAndrew Dolgov <fox@madoka.volgo-balt.ru>
Mon, 13 Aug 2012 10:47:43 +0000 (14:47 +0400)
committerAndrew Dolgov <fox@madoka.volgo-balt.ru>
Mon, 13 Aug 2012 10:47:43 +0000 (14:47 +0400)
classes/feeds.php
classes/pref_feeds.php
include/functions.php
js/PrefFeedTree.js

index 0c9812479a86069b53e1251b56f5a1b86961b69f..0762b006769a0da0c9f150b3eabae1e3bc80302d 100644 (file)
@@ -842,6 +842,8 @@ class Feeds extends Protected_Handler {
                        }\r
                }\r
 \r
+               $this->feedlist_process_category('root', &$feedlist);\r
+\r
 /*             if (get_pref($this->link, 'ENABLE_FEED_CATS')) {\r
                        if (get_pref($this->link, "FEEDS_SORT_BY_UNREAD")) {\r
                                $order_by_qpart = "order_id,category,unread DESC,title";\r
@@ -858,12 +860,125 @@ class Feeds extends Protected_Handler {
 \r
                /* real feeds */\r
 \r
+               /* if ($enable_cats)\r
+                       $order_by_qpart = "ttrss_feed_categories.order_id,category,\r
+                               ttrss_feeds.order_id,title";\r
+               else\r
+                       $order_by_qpart = "title";\r
+\r
+               $query = "SELECT ttrss_feeds.id, ttrss_feeds.title,\r
+                       ".SUBSTRING_FOR_DATE."(last_updated,1,19) AS last_updated_noms,\r
+                       cat_id,last_error,\r
+                       COALESCE(ttrss_feed_categories.title, '".__('Uncategorized')."') AS category,\r
+                       ttrss_feed_categories.collapsed,\r
+                       value AS unread\r
+                       FROM ttrss_feeds LEFT JOIN ttrss_feed_categories\r
+                               ON (ttrss_feed_categories.id = cat_id)\r
+                       LEFT JOIN ttrss_counters_cache\r
+                               ON\r
+                                       (ttrss_feeds.id = feed_id)\r
+                       WHERE\r
+                               ttrss_feeds.owner_uid = '$owner_uid' AND parent_cat IS NULL\r
+                       ORDER BY $order_by_qpart";\r
+\r
+               $result = db_query($this->link, $query);\r
+\r
+               $actid = $_REQUEST["actid"];\r
+\r
+               if (db_num_rows($result) > 0) {\r
+\r
+                       $category = "";\r
+\r
+                       if (!$enable_cats)\r
+                               $cat['items'] = array();\r
+                       else\r
+                               $cat = false;\r
+\r
+                       while ($line = db_fetch_assoc($result)) {\r
+\r
+                               $feed = htmlspecialchars(trim($line["title"]));\r
+\r
+                               if (!$feed) $feed = "[Untitled]";\r
+\r
+                               $feed_id = $line["id"];\r
+                               $unread = $line["unread"];\r
+\r
+                               $cat_id = $line["cat_id"];\r
+                               $tmp_category = $line["category"];\r
+\r
+                               if ($category != $tmp_category && $enable_cats) {\r
+\r
+                                       $category = $tmp_category;\r
+\r
+                                       $collapsed = sql_bool_to_bool($line["collapsed"]);\r
+\r
+                                       // workaround for NULL category\r
+                                       if ($category == __("Uncategorized")) {\r
+                                               $collapsed = get_pref($this->link, "_COLLAPSED_UNCAT");\r
+                                       }\r
+\r
+                                       if ($cat) array_push($feedlist['items'], $cat);\r
+\r
+                                       $cat = $this->feedlist_init_cat($cat_id, $collapsed);\r
+                               }\r
+\r
+                               $updated = make_local_datetime($this->link, $line["updated_noms"], false);\r
+\r
+                               array_push($cat['items'], $this->feedlist_init_feed($feed_id,\r
+                                       $feed, $unread, $line['last_error'], $updated));\r
+                       }\r
+\r
+                       if ($enable_cats) {\r
+                               array_push($feedlist['items'], $cat);\r
+                       } else {\r
+                               $feedlist['items'] = array_merge($feedlist['items'], $cat['items']);\r
+                       }\r
+\r
+               } */\r
+\r
+               return $feedlist;\r
+       }\r
+\r
+       private function feedlist_process_category($cat_id, &$feedlist) {\r
+               $owner_uid = $_SESSION['uid'];\r
+               $enable_cats = get_pref($this->link, 'ENABLE_FEED_CATS');\r
+\r
+               if (get_pref($this->link, 'ENABLE_FEED_CATS')) {\r
+                       if (get_pref($this->link, "FEEDS_SORT_BY_UNREAD")) {\r
+                               $order_by_qpart = "order_id,category,unread DESC,title";\r
+                       } else {\r
+                               $order_by_qpart = "order_id,category,title";\r
+                       }\r
+               } else {\r
+                       if (get_pref($this->link, "FEEDS_SORT_BY_UNREAD")) {\r
+                               $order_by_qpart = "unread DESC,title";\r
+                       } else {\r
+                               $order_by_qpart = "title";\r
+                       }\r
+               }\r
+\r
+               if ($enable_cats)\r
+                       $order_by_qpart = "ttrss_feed_categories.order_id,category,\r
+                               ttrss_feeds.order_id,title";\r
+               else\r
+                       $order_by_qpart = "title";\r
+\r
+               /* real feeds */\r
+\r
                if ($enable_cats)\r
                        $order_by_qpart = "ttrss_feed_categories.order_id,category,\r
                                ttrss_feeds.order_id,title";\r
                else\r
                        $order_by_qpart = "title";\r
 \r
+               if (!$enable_cats) {\r
+                       $parent_qpart = "true";\r
+               } else if ($cat_id == 'root') {\r
+                       $parent_qpart = 'parent_cat IS NULL';\r
+               } else {\r
+                       $parent_qpart = 'parent_cat = '.db_escape_string($cat_id);\r
+               }\r
+\r
                $query = "SELECT ttrss_feeds.id, ttrss_feeds.title,\r
                        ".SUBSTRING_FOR_DATE."(last_updated,1,19) AS last_updated_noms,\r
                        cat_id,last_error,\r
@@ -876,7 +991,7 @@ class Feeds extends Protected_Handler {
                                ON\r
                                        (ttrss_feeds.id = feed_id)\r
                        WHERE\r
-                               ttrss_feeds.owner_uid = '$owner_uid'\r
+                               ttrss_feeds.owner_uid = '$owner_uid' AND $parent_qpart\r
                        ORDER BY $order_by_qpart";\r
 \r
                $result = db_query($this->link, $query);\r
@@ -918,6 +1033,13 @@ class Feeds extends Protected_Handler {
                                        if ($cat) array_push($feedlist['items'], $cat);\r
 \r
                                        $cat = $this->feedlist_init_cat($cat_id, $collapsed);\r
+\r
+                                       if ($cat_id) {\r
+                                               $cat_items = $this->feedlist_process_category($cat_id, &$feedlist);\r
+                                               if (count($cat_items) > 0) {\r
+                                                       array_push($cat['items'], $cat_items);\r
+                                               }\r
+                                       }\r
                                }\r
 \r
                                $updated = make_local_datetime($this->link, $line["updated_noms"], false);\r
@@ -934,7 +1056,6 @@ class Feeds extends Protected_Handler {
 \r
                }\r
 \r
-               return $feedlist;\r
        }\r
 \r
 \r
index 44adc2ce0334131af1de45279fea0cb6f8102033..ea061b6b214cab941590bb035c38a3865a88e850 100644 (file)
@@ -32,6 +32,55 @@ class Pref_Feeds extends Protected_Handler {
                return;
        }
 
+       private function get_category_items($cat_id) {
+
+               $items = array();
+
+               $result = db_query($this->link, "SELECT id, title FROM ttrss_feed_categories
+                               WHERE owner_uid = " . $_SESSION["uid"] . " AND parent_cat = '$cat_id' ORDER BY order_id, title");
+
+               while ($line = db_fetch_assoc($result)) {
+
+                       $cat = array();
+                       $cat['id'] = 'CAT:' . $line['id'];
+                       $cat['bare_id'] = $feed_id;
+                       $cat['name'] = $line['title'];
+                       $cat['items'] = array();
+                       $cat['checkbox'] = false;
+                       $cat['type'] = 'category';
+
+                       $cat['items'] = $this->get_category_items($line['id']);
+
+                       $cat['param'] = T_sprintf('(%d feeds)', count($cat['items']));
+
+                       if (count($cat['items']) > 0 || $show_empty_cats)
+                               array_push($items, $cat);
+
+               }
+
+               $feed_result = db_query($this->link, "SELECT id, title, last_error,
+                       ".SUBSTRING_FOR_DATE."(last_updated,1,19) AS last_updated
+                       FROM ttrss_feeds
+                       WHERE cat_id = '$cat_id' AND owner_uid = ".$_SESSION["uid"].
+                       "$search_qpart ORDER BY order_id, title");
+
+               while ($feed_line = db_fetch_assoc($feed_result)) {
+                       $feed = array();
+                       $feed['id'] = 'FEED:' . $feed_line['id'];
+                       $feed['bare_id'] = $feed_line['id'];
+                       $feed['name'] = $feed_line['title'];
+                       $feed['checkbox'] = false;
+                       $feed['error'] = $feed_line['last_error'];
+                       $feed['icon'] = getFeedIcon($feed_line['id']);
+                       $feed['param'] = make_local_datetime($this->link,
+                               $feed_line['last_updated'], true);
+
+                       array_push($items, $feed);
+               }
+
+               return $items;
+       }
+
        function getfeedtree() {
 
                $search = $_SESSION["prefs_feed_search"];
@@ -48,7 +97,7 @@ class Pref_Feeds extends Protected_Handler {
                        $show_empty_cats = get_pref($this->link, '_PREFS_SHOW_EMPTY_CATS');
 
                        $result = db_query($this->link, "SELECT id, title FROM ttrss_feed_categories
-                               WHERE owner_uid = " . $_SESSION["uid"] . " ORDER BY order_id, title");
+                               WHERE owner_uid = " . $_SESSION["uid"] . " AND parent_cat IS NULL ORDER BY order_id, title");
 
                        while ($line = db_fetch_assoc($result)) {
                                $cat = array();
@@ -59,25 +108,7 @@ class Pref_Feeds extends Protected_Handler {
                                $cat['checkbox'] = false;
                                $cat['type'] = 'category';
 
-                               $feed_result = db_query($this->link, "SELECT id, title, last_error,
-                                       ".SUBSTRING_FOR_DATE."(last_updated,1,19) AS last_updated
-                                       FROM ttrss_feeds
-                                       WHERE cat_id = '".$line['id']."' AND owner_uid = ".$_SESSION["uid"].
-                                       "$search_qpart ORDER BY order_id, title");
-
-                               while ($feed_line = db_fetch_assoc($feed_result)) {
-                                       $feed = array();
-                                       $feed['id'] = 'FEED:' . $feed_line['id'];
-                                       $feed['bare_id'] = $feed_line['id'];
-                                       $feed['name'] = $feed_line['title'];
-                                       $feed['checkbox'] = false;
-                                       $feed['error'] = $feed_line['last_error'];
-                                       $feed['icon'] = getFeedIcon($feed_line['id']);
-                                       $feed['param'] = make_local_datetime($this->link,
-                                               $feed_line['last_updated'], true);
-
-                                       array_push($cat['items'], $feed);
-                               }
+                               $cat['items'] = $this->get_category_items($line['id']);
 
                                $cat['param'] = T_sprintf('(%d feeds)', count($cat['items']));
 
@@ -176,17 +207,77 @@ class Pref_Feeds extends Protected_Handler {
                        (get_pref($this->link, '_PREFS_SHOW_EMPTY_CATS') ? 'false' : 'true'));
        }
 
+       private function process_category_order($data_map, $item_id, $parent_id = false) {
+#              print "C: $item_id P: $parent_id\n";
+               $bare_id = substr($item_id, strpos($item_id, ':')+1);
+
+               if ($item_id != 'root') {
+                       if ($parent_id && $parent_id != 'root') {
+                               $parent_bare_id = substr($parent_id, strpos($parent_id, ':')+1);
+                               $parent_qpart = db_escape_string($parent_bare_id);
+                       } else {
+                               $parent_qpart = 'NULL';
+                       }
+
+                       db_query($this->link, "UPDATE ttrss_feed_categories
+                               SET parent_cat = $parent_qpart WHERE id = '$bare_id' AND
+                               owner_uid = " . $_SESSION["uid"]);
+               }
+
+               $order_id = 0;
+
+               $cat = $data_map[$item_id];
+
+               if ($cat && is_array($cat)) {
+                       foreach ($cat as $item) {
+                               $id = $item['_reference'];
+                               $bare_id = substr($id, strpos($id, ':')+1);
+
+#                              print "[$order_id] $id/$bare_id\n";
+
+                               if ($item['_reference']) {
+
+                                       if (strpos($id, "FEED") === 0) {
+
+                                               db_query($this->link, "UPDATE ttrss_feeds
+                                                               SET order_id = '$order_id' WHERE id = '$bare_id' AND
+                                                               owner_uid = " . $_SESSION["uid"]);
+
+                                       } else if (strpos($id, "CAT:") === 0) {
+                                               $this->process_category_order(&$data_map, $item['_reference'], $item_id);
+
+                                               if ($item_id != 'root') {
+                                                       $parent_qpart = db_escape_string($bare_id);
+                                               } else {
+                                                       $parent_qpart = 'NULL';
+                                               }
+
+                                               db_query($this->link, "UPDATE ttrss_feed_categories
+                                                               SET order_id = '$order_id' WHERE id = '$bare_id' AND
+                                                               owner_uid = " . $_SESSION["uid"]);
+                                       }
+                               }
+
+                               ++$order_id;
+                       }
+               }
+       }
+
        function savefeedorder() {
                $data = json_decode($_POST['payload'], true);
 
+               #file_put_contents("/tmp/saveorder.json", $_POST['payload']);
+               #$data = json_decode(file_get_contents("/tmp/saveorder.json"), true);
+
                if (is_array($data) && is_array($data['items'])) {
                        $cat_order_id = 0;
 
                        $data_map = array();
+                       $root_item = false;
 
                        foreach ($data['items'] as $item) {
 
-                               if ($item['id'] != 'root') {
+#                              if ($item['id'] != 'root') {
                                        if (is_array($item['items'])) {
                                                if (isset($item['items']['_reference'])) {
                                                        $data_map[$item['id']] = array($item['items']);
@@ -194,10 +285,14 @@ class Pref_Feeds extends Protected_Handler {
                                                        $data_map[$item['id']] =& $item['items'];
                                                }
                                        }
+                               if ($item['id'] == 'root') {
+                                       $root_item = $item['id'];
                                }
                        }
 
-                       foreach ($data['items'][0]['items'] as $item) {
+                       $this->process_category_order(&$data_map, $root_item);
+
+                       /* foreach ($data['items'][0]['items'] as $item) {
                                $id = $item['_reference'];
                                $bare_id = substr($id, strpos($id, ':')+1);
 
@@ -230,7 +325,7 @@ class Pref_Feeds extends Protected_Handler {
                                                ++$feed_order_id;
                                        }
                                }
-                       }
+                       } */
                }
 
                return;
index 4ba60e84414c7e510e698cc8fcc55b67d4189d48..009955c999f371221ee8ae1dcbced7f6d760162a 100644 (file)
@@ -1,6 +1,6 @@
 <?php
        define('EXPECTED_CONFIG_VERSION', 25);
-       define('SCHEMA_VERSION', 92);
+       define('SCHEMA_VERSION', 93);
 
        mb_internal_encoding("UTF-8");
        date_default_timezone_set('UTC');
index 9e2ee0662498abecc70b4bf3a66b42cdda5736e8..12c02c4479d037cf9daa7e22497cf2159f353d7a 100644 (file)
@@ -5,7 +5,7 @@ dojo.require("lib.CheckBoxTree");
 dojo.require("dojo.data.ItemFileWriteStore");
 
 dojo.declare("fox.PrefFeedStore", dojo.data.ItemFileWriteStore, {
-       
+
        _saveEverything: function(saveCompleteCallback, saveFailedCallback,
                                                                newFileContentString) {
 
@@ -17,7 +17,7 @@ dojo.declare("fox.PrefFeedStore", dojo.data.ItemFileWriteStore, {
                        load: saveCompleteCallback});
        },
 
-});            
+});
 
 dojo.declare("fox.PrefFeedTree", lib.CheckBoxTree, {
        _createTreeNode: function(args) {
@@ -42,7 +42,7 @@ dojo.declare("fox.PrefFeedTree", lib.CheckBoxTree, {
                this.tree.model.store.save();
        },
        getRowClass: function (item, opened) {
-               return (!item.error || item.error == '') ? "dijitTreeRow" : 
+               return (!item.error || item.error == '') ? "dijitTreeRow" :
                        "dijitTreeRow Error";
        },
        getIconClass: function (item, opened) {
@@ -71,7 +71,7 @@ dojo.declare("fox.PrefFeedTree", lib.CheckBoxTree, {
                        return ((id.match("CAT:") && position == "over") ||
                                (id.match("FEED:") && position != "over"));
                } else if (source_id.match("CAT:")) {
-                       return ((id.match("CAT:") && position != "over") ||
+                       return ((id.match("CAT:") && !id.match("CAT:0")) ||
                                (id.match("root") && position == "over"));
                }
        },