summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2010-11-18 13:46:11 +0300
committerAndrew Dolgov <[email protected]>2010-11-18 13:46:11 +0300
commit7b8a143f1b523a5b70b92af8389af1cb1cb0a844 (patch)
treeb50bd695af036e1f709fb0f2a1fa1abfe165316e
parent567810362c08bb66a81435a9280d34efec9a628f (diff)
allow onclick editing of categories and drag-reordering of feeds and categories
-rw-r--r--PrefFeedTree.js20
-rw-r--r--backend.php25
-rw-r--r--functions.php4
-rw-r--r--modules/pref-feeds.php191
-rw-r--r--prefs.js57
5 files changed, 257 insertions, 40 deletions
diff --git a/PrefFeedTree.js b/PrefFeedTree.js
index 026e5d489..511f4fafe 100644
--- a/PrefFeedTree.js
+++ b/PrefFeedTree.js
@@ -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;
diff --git a/backend.php b/backend.php
index 3d415eb5e..c17344a79 100644
--- a/backend.php
+++ b/backend.php
@@ -178,31 +178,6 @@
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) {
diff --git a/functions.php b/functions.php
index 6fa9e9f27..1d1b2440d 100644
--- a/functions.php
+++ b/functions.php
@@ -4278,7 +4278,8 @@
} */
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";
@@ -7029,7 +7030,6 @@
$obj['error'] = $error;
$obj['updated'] = $updated;
$obj['icon'] = getFeedIcon($feed_id);
- $obj['checkbox'] = false;
$obj['bare_id'] = $feed_id;
return $obj;
diff --git a/modules/pref-feeds.php b/modules/pref-feeds.php
index 3eb3c4621..f6776e20d 100644
--- a/modules/pref-feeds.php
+++ b/modules/pref-feeds.php
@@ -15,6 +15,159 @@
$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"]);
@@ -1004,16 +1157,27 @@
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;
@@ -1045,8 +1209,8 @@
<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\"
@@ -1054,16 +1218,17 @@
</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\");
diff --git a/prefs.js b/prefs.js
index 556c71dbb..356338608 100644
--- 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);
+ }
+}