]> git.wh0rd.org - tt-rss.git/commitdiff
allow onclick editing of categories and drag-reordering of feeds and categories
authorAndrew Dolgov <fox@madoka.volgo-balt.ru>
Thu, 18 Nov 2010 10:46:11 +0000 (13:46 +0300)
committerAndrew Dolgov <fox@madoka.volgo-balt.ru>
Thu, 18 Nov 2010 10:46:11 +0000 (13:46 +0300)
PrefFeedTree.js
backend.php
functions.php
modules/pref-feeds.php
prefs.js

index 026e5d4894c5d2891e9b81a05c6bd53347060b75..511f4fafeb7437fdb092268145823b1d9fb2253b 100644 (file)
@@ -1,8 +1,28 @@
 dojo.provide("fox.PrefFeedTree");
+dojo.provide("fox.PrefFeedStore");
 
 dojo.require("lib.CheckBoxTree");
 
+dojo.declare("fox.PrefFeedStore", dojo.data.ItemFileWriteStore, {
+       
+       _saveEverything: function(saveCompleteCallback, saveFailedCallback,
+                                                               newFileContentString) {
+
+               dojo.xhrPost({
+                       url: "backend.php",
+                       content: {op: "pref-feeds", subop: "savefeedorder",
+                               payload: newFileContentString},
+                       error: saveFailedCallback,
+                       load: saveCompleteCallback});
+       },
+
+});            
+
 dojo.declare("fox.PrefFeedTree", lib.CheckBoxTree, {
+       onDndDrop: function() {
+               this.inherited(arguments);
+               this.tree.model.store.save();
+       },
        checkItemAcceptance: function(target, source, position) {
                var item = dijit.getEnclosingWidget(target).item;
 
index 3d415eb5e5d86d8920e95a2f214d3e4335d9d5bc..c17344a790efc178e4ddde26e87786c5f2f79533 100644 (file)
                                        toggle_collapse_cat($link, $cat_id, $mode);
                                        return;
                                break;
-
-                               case "catsortreset":
-                                       db_query($link, "UPDATE ttrss_feed_categories 
-                                                       SET order_id = 0 WHERE owner_uid = " . $_SESSION["uid"]);
-                                       return;
-                               break;
-
-                               case "catsort":
-                                       $corder = db_escape_string($_REQUEST["corder"]);
-
-                                       $cats = split(",", $corder);
-
-                                       for ($i = 0; $i < count($cats); $i++) {
-                                               $cat_id = $cats[$i];
-
-                                               if ($cat_id > 0) {
-                                                       db_query($link, "UPDATE ttrss_feed_categories 
-                                                               SET order_id = '$i' WHERE id = '$cat_id' AND
-                                                               owner_uid = " . $_SESSION["uid"]);
-                                               }
-                                       }
-
-                                       return;
-                               break;
-
                        }
 
                        if (!$root) {
index 6fa9e9f271b8fc58eb87f815d5c88c3fba02b2ae..1d1b2440d6b59791f05d252415bcfd21cc84e3d1 100644 (file)
                } */
 
                if ($enable_cats)
-                       $order_by_qpart = "order_id,category,title";
+                       $order_by_qpart = "ttrss_feed_categories.order_id,category,
+                               ttrss_feeds.order_id,title";
                else
                        $order_by_qpart = "title";
 
                $obj['error'] = $error;
                $obj['updated'] = $updated;
                $obj['icon'] = getFeedIcon($feed_id);
-               $obj['checkbox'] = false;
                $obj['bare_id'] = $feed_id;
 
                return $obj;
index 3eb3c46216386d2c3b29d748dbe4b6de1b83cd74..f6776e20da72624a96740d0999f5f02e7d748089 100644 (file)
                $quiet = $_REQUEST["quiet"];
                $mode = $_REQUEST["mode"];
 
+               if ($subop == "renamecat") {
+                       $title = db_escape_string($_REQUEST['title']);
+                       $id = db_escape_string($_REQUEST['id']);
+
+                       if ($title) {
+                               db_query($link, "UPDATE ttrss_feed_categories SET
+                                       title = '$title' WHERE id = '$id' AND owner_uid = " . $_SESSION["uid"]);
+                       }
+                       return;
+               }
+
+               if ($subop == "getfeedtree") {
+
+                       $root = array();
+                       $root['id'] = 'root';
+                       $root['name'] = __('Feeds');
+                       $root['items'] = array();
+
+                       if (get_pref($link, 'ENABLE_FEED_CATS')) {
+
+                               $result = db_query($link, "SELECT id, title FROM ttrss_feed_categories
+                                       WHERE owner_uid = " . $_SESSION["uid"] . " 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();
+       
+                                       $feed_result = db_query($link, "SELECT id, title FROM ttrss_feeds
+                                               WHERE cat_id = '".$line['id']."' AND owner_uid = ".$_SESSION["uid"].
+                                               " 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;
+                                               array_push($cat['items'], $feed);
+                                       }
+       
+                                       array_push($root['items'], $cat);
+                               }
+       
+                               /* Uncategorized is a special case */
+       
+                               $cat = array();
+                               $cat['id'] = 'CAT:0';
+                               $cat['bare_id'] = 0;
+                               $cat['name'] = __("Uncategorized");
+                               $cat['items'] = array();
+       
+                               $feed_result = db_query($link, "SELECT id, title FROM ttrss_feeds
+                                       WHERE cat_id IS NULL AND owner_uid = ".$_SESSION["uid"].
+                                       " 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;
+                                       array_push($cat['items'], $feed);
+                               }
+       
+                               array_push($root['items'], $cat);
+                       } else {
+                               $feed_result = db_query($link, "SELECT id, title FROM ttrss_feeds
+                                       WHERE owner_uid = ".$_SESSION["uid"].
+                                       " 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;
+                                       array_push($root['items'], $feed);
+                               }
+                       }
+
+                       $fl = array();
+                       $fl['identifier'] = 'id';
+                       $fl['label'] = 'name';
+                       $fl['items'] = array($root);
+
+                       print json_encode($fl);
+                       return;
+               }
+
+               if ($subop == "catsortreset") {
+                       db_query($link, "UPDATE ttrss_feed_categories 
+                                       SET order_id = 0 WHERE owner_uid = " . $_SESSION["uid"]);
+                       return;
+               }       
+
+               if ($subop == "feedsortreset") {
+                       db_query($link, "UPDATE ttrss_feeds 
+                                       SET order_id = 0 WHERE owner_uid = " . $_SESSION["uid"]);
+                       return;
+               }       
+
+               if ($subop == "savefeedorder") {
+                       if ($_POST['payload']) {
+                               file_put_contents("/tmp/blahblah.txt", $_POST['payload']);
+                       }
+
+                       $data = file_get_contents("/tmp/blahblah.txt");
+                       $data = json_decode($data, true);       
+
+                       if (is_array($data) && is_array($data['items'])) {
+                               $cat_order_id = 0;
+
+                               $data_map = array();
+
+                               foreach ($data['items'] as $item) {
+                                       $data_map[$item['id']] =& $item['items'];
+                               }
+
+                               foreach ($data['items'][0]['items'] as $item) {
+                                       $id = $item['_reference'];
+                                       $bare_id = substr($id, strpos($id, ':')+1);
+
+                                       ++$cat_order_id;
+
+                                       if ($bare_id > 0) {
+                                               db_query($link, "UPDATE ttrss_feed_categories 
+                                                       SET order_id = '$cat_order_id' WHERE id = '$bare_id' AND
+                                                       owner_uid = " . $_SESSION["uid"]);
+                                       }
+
+                                       $feed_order_id = 0;
+
+                                       if (is_array($data_map[$id])) {
+                                               foreach ($data_map[$id] as $feed) {
+                                                       $id = $feed['_reference'];
+                                                       $bare_id = substr($id, strpos($id, ':')+1);
+       
+                                                       db_query($link, "UPDATE ttrss_feeds
+                                                               SET order_id = '$feed_order_id' WHERE id = '$bare_id' AND
+                                                               owner_uid = " . $_SESSION["uid"]);
+       
+                                                       ++$feed_order_id;
+                                               } 
+                                       }
+                               }
+                       }
+
+                       return;
+               }
+
                if ($subop == "removeicon") {                   
                        $feed_id = db_escape_string($_REQUEST["feed_id"]);
 
                        dojoType=\"dijit.MenuItem\">".__('None')."</div>";
                print "</div></div>";
 
-               print "<button dojoType=\"dijit.form.Button\" onclick=\"quickAddFeed()\">"
-                       .__('Subscribe to feed')."</button dojoType=\"dijit.form.Button\"> ";
-
-               print "<button dojoType=\"dijit.form.Button\" onclick=\"editSelectedFeed()\">".
-                       __('Edit feeds')."</button dojoType=\"dijit.form.Button\"> ";
+               print "<div dojoType=\"dijit.form.DropDownButton\">".
+                               "<span>" . __('Feeds')."</span>";
+               print "<div dojoType=\"dijit.Menu\" style=\"display: none;\">";
+               print "<div onclick=\"quickAddFeed()\" 
+                       dojoType=\"dijit.MenuItem\">".__('Subscribe to feed')."</div>";
+               print "<div onclick=\"editSelectedFeed()\" 
+                       dojoType=\"dijit.MenuItem\">".__('Edit feeds')."</div>";
+               print "<div onclick=\"resetFeedOrder()\" 
+                       dojoType=\"dijit.MenuItem\">".__('Reset sort order')."</div>";
+               print "</div></div>";
 
                if (get_pref($link, 'ENABLE_FEED_CATS')) {
+                       print "<div dojoType=\"dijit.form.DropDownButton\">".
+                                       "<span>" . __('Categories')."</span>";
+                       print "<div dojoType=\"dijit.Menu\" style=\"display: none;\">";
+                       print "<div onclick=\"editFeedCats()\" 
+                               dojoType=\"dijit.MenuItem\">".__('Edit categories')."</div>";
+                       print "<div onclick=\"resetCatOrder()\" 
+                               dojoType=\"dijit.MenuItem\">".__('Reset sort order')."</div>";
+                       print "</div></div>";
 
-                       print "<button dojoType=\"dijit.form.Button\" onclick=\"editFeedCats()\">".
-                               __('Edit categories')."</button dojoType=\"dijit.form.Button\"> ";
                }
 
                print $error_button;
                <img src='images/indicator_tiny.gif'>".
                 __("Loading, please wait...")."</div>";
 
-               print "<div dojoType=\"dojo.data.ItemFileWriteStore\" jsId=\"feedStore\" 
-                       url=\"backend.php?op=feeds&root=1\">
+               print "<div dojoType=\"fox.PrefFeedStore\" jsId=\"feedStore\" 
+                       url=\"backend.php?op=pref-feeds&subop=getfeedtree\">
                </div>
                <div dojoType=\"lib.CheckBoxStoreModel\" jsId=\"feedModel\" store=\"feedStore\"
                query=\"{id:'root'}\" rootId=\"root\" rootLabel=\"Feeds\"
                </div>
                <div dojoType=\"fox.PrefFeedTree\" id=\"feedTree\" 
                        dndController=\"dijit.tree.dndSource\" 
-                       betweenThreshold=\"1\"
+                       betweenThreshold=\"5\"
                        model=\"feedModel\" openOnClick=\"false\">
                <script type=\"dojo/method\" event=\"onClick\" args=\"item\">
                        var id = String(item.id);
                        var bare_id = id.substr(id.indexOf(':')+1);
 
-                       if (id.match('FEED')) {
+                       if (id.match('FEED:')) {
                                editFeed(bare_id, event);
-                       }
-                       
+                       } else if (id.match('CAT:')) {
+                               editCat(bare_id, item, event);
+                       }                       
                </script>
                <script type=\"dojo/method\" event=\"onLoad\" args=\"item\">
                        Element.hide(\"feedlistLoading\");
index 556c71dbbadd46230fc8b5965504d75a63954100..3563386081f80812d0fb00072787ee7156deb09d 100644 (file)
--- a/prefs.js
+++ b/prefs.js
@@ -1165,6 +1165,7 @@ function init() {
                dojo.require("dijit.form.DropDownButton");
                dojo.require("dijit.Menu");
                dojo.require("dijit.tree.dndSource");
+               dojo.require("dijit.TooltipDialog");
 
                dojo.registerModulePath("lib", "..");
                dojo.registerModulePath("fox", "../..");
@@ -2040,3 +2041,59 @@ function handle_rpc_reply(transport, scheduled_call) {
        return true;
 }
 
+function resetFeedOrder() {
+       try {
+               notify_progress("Loading, please wait...");
+
+               new Ajax.Request("backend.php", {
+                       parameters: "?op=pref-feeds&subop=feedsortreset",
+                       onComplete: function(transport) {
+                               updateFeedList();       
+                       } });
+
+
+       } catch (e) {
+               exception_error("resetFeedOrder");
+       }
+}
+
+function resetCatOrder() {
+       try {
+               notify_progress("Loading, please wait...");
+
+               new Ajax.Request("backend.php", {
+                       parameters: "?op=pref-feeds&subop=catsortreset",
+                       onComplete: function(transport) {
+                               updateFeedList();       
+                       } });
+
+
+       } catch (e) {
+               exception_error("resetCatOrder");
+       }
+}
+
+function editCat(id, item, event) {
+       try {
+               var new_name = prompt(__('Rename category to:'), item.name);
+
+               if (new_name && new_name != item.name) {
+
+                       notify_progress("Loading, please wait...");
+
+                       new Ajax.Request("backend.php", {
+                       parameters: {
+                               op: 'pref-feeds', 
+                               subop: 'renamecat',
+                               id: id,
+                               title: new_name,
+                       },
+                       onComplete: function(transport) {
+                               updateFeedList();       
+                       } });
+               }
+
+       } catch (e) {
+               exception_error("editCat", e);
+       }
+}