allow onclick editing of categories and drag-reordering of feeds and categories
This commit is contained in:
parent
567810362c
commit
7b8a143f1b
|
@ -1,8 +1,28 @@
|
||||||
dojo.provide("fox.PrefFeedTree");
|
dojo.provide("fox.PrefFeedTree");
|
||||||
|
dojo.provide("fox.PrefFeedStore");
|
||||||
|
|
||||||
dojo.require("lib.CheckBoxTree");
|
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, {
|
dojo.declare("fox.PrefFeedTree", lib.CheckBoxTree, {
|
||||||
|
onDndDrop: function() {
|
||||||
|
this.inherited(arguments);
|
||||||
|
this.tree.model.store.save();
|
||||||
|
},
|
||||||
checkItemAcceptance: function(target, source, position) {
|
checkItemAcceptance: function(target, source, position) {
|
||||||
var item = dijit.getEnclosingWidget(target).item;
|
var item = dijit.getEnclosingWidget(target).item;
|
||||||
|
|
||||||
|
|
25
backend.php
25
backend.php
|
@ -178,31 +178,6 @@
|
||||||
toggle_collapse_cat($link, $cat_id, $mode);
|
toggle_collapse_cat($link, $cat_id, $mode);
|
||||||
return;
|
return;
|
||||||
break;
|
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) {
|
if (!$root) {
|
||||||
|
|
|
@ -4278,7 +4278,8 @@
|
||||||
} */
|
} */
|
||||||
|
|
||||||
if ($enable_cats)
|
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
|
else
|
||||||
$order_by_qpart = "title";
|
$order_by_qpart = "title";
|
||||||
|
|
||||||
|
@ -7029,7 +7030,6 @@
|
||||||
$obj['error'] = $error;
|
$obj['error'] = $error;
|
||||||
$obj['updated'] = $updated;
|
$obj['updated'] = $updated;
|
||||||
$obj['icon'] = getFeedIcon($feed_id);
|
$obj['icon'] = getFeedIcon($feed_id);
|
||||||
$obj['checkbox'] = false;
|
|
||||||
$obj['bare_id'] = $feed_id;
|
$obj['bare_id'] = $feed_id;
|
||||||
|
|
||||||
return $obj;
|
return $obj;
|
||||||
|
|
|
@ -15,6 +15,159 @@
|
||||||
$quiet = $_REQUEST["quiet"];
|
$quiet = $_REQUEST["quiet"];
|
||||||
$mode = $_REQUEST["mode"];
|
$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") {
|
if ($subop == "removeicon") {
|
||||||
$feed_id = db_escape_string($_REQUEST["feed_id"]);
|
$feed_id = db_escape_string($_REQUEST["feed_id"]);
|
||||||
|
|
||||||
|
@ -1004,16 +1157,27 @@
|
||||||
dojoType=\"dijit.MenuItem\">".__('None')."</div>";
|
dojoType=\"dijit.MenuItem\">".__('None')."</div>";
|
||||||
print "</div></div>";
|
print "</div></div>";
|
||||||
|
|
||||||
print "<button dojoType=\"dijit.form.Button\" onclick=\"quickAddFeed()\">"
|
print "<div dojoType=\"dijit.form.DropDownButton\">".
|
||||||
.__('Subscribe to feed')."</button dojoType=\"dijit.form.Button\"> ";
|
"<span>" . __('Feeds')."</span>";
|
||||||
|
print "<div dojoType=\"dijit.Menu\" style=\"display: none;\">";
|
||||||
print "<button dojoType=\"dijit.form.Button\" onclick=\"editSelectedFeed()\">".
|
print "<div onclick=\"quickAddFeed()\"
|
||||||
__('Edit feeds')."</button dojoType=\"dijit.form.Button\"> ";
|
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')) {
|
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;
|
print $error_button;
|
||||||
|
@ -1045,8 +1209,8 @@
|
||||||
<img src='images/indicator_tiny.gif'>".
|
<img src='images/indicator_tiny.gif'>".
|
||||||
__("Loading, please wait...")."</div>";
|
__("Loading, please wait...")."</div>";
|
||||||
|
|
||||||
print "<div dojoType=\"dojo.data.ItemFileWriteStore\" jsId=\"feedStore\"
|
print "<div dojoType=\"fox.PrefFeedStore\" jsId=\"feedStore\"
|
||||||
url=\"backend.php?op=feeds&root=1\">
|
url=\"backend.php?op=pref-feeds&subop=getfeedtree\">
|
||||||
</div>
|
</div>
|
||||||
<div dojoType=\"lib.CheckBoxStoreModel\" jsId=\"feedModel\" store=\"feedStore\"
|
<div dojoType=\"lib.CheckBoxStoreModel\" jsId=\"feedModel\" store=\"feedStore\"
|
||||||
query=\"{id:'root'}\" rootId=\"root\" rootLabel=\"Feeds\"
|
query=\"{id:'root'}\" rootId=\"root\" rootLabel=\"Feeds\"
|
||||||
|
@ -1054,16 +1218,17 @@
|
||||||
</div>
|
</div>
|
||||||
<div dojoType=\"fox.PrefFeedTree\" id=\"feedTree\"
|
<div dojoType=\"fox.PrefFeedTree\" id=\"feedTree\"
|
||||||
dndController=\"dijit.tree.dndSource\"
|
dndController=\"dijit.tree.dndSource\"
|
||||||
betweenThreshold=\"1\"
|
betweenThreshold=\"5\"
|
||||||
model=\"feedModel\" openOnClick=\"false\">
|
model=\"feedModel\" openOnClick=\"false\">
|
||||||
<script type=\"dojo/method\" event=\"onClick\" args=\"item\">
|
<script type=\"dojo/method\" event=\"onClick\" args=\"item\">
|
||||||
var id = String(item.id);
|
var id = String(item.id);
|
||||||
var bare_id = id.substr(id.indexOf(':')+1);
|
var bare_id = id.substr(id.indexOf(':')+1);
|
||||||
|
|
||||||
if (id.match('FEED')) {
|
if (id.match('FEED:')) {
|
||||||
editFeed(bare_id, event);
|
editFeed(bare_id, event);
|
||||||
}
|
} else if (id.match('CAT:')) {
|
||||||
|
editCat(bare_id, item, event);
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
<script type=\"dojo/method\" event=\"onLoad\" args=\"item\">
|
<script type=\"dojo/method\" event=\"onLoad\" args=\"item\">
|
||||||
Element.hide(\"feedlistLoading\");
|
Element.hide(\"feedlistLoading\");
|
||||||
|
|
57
prefs.js
57
prefs.js
|
@ -1165,6 +1165,7 @@ function init() {
|
||||||
dojo.require("dijit.form.DropDownButton");
|
dojo.require("dijit.form.DropDownButton");
|
||||||
dojo.require("dijit.Menu");
|
dojo.require("dijit.Menu");
|
||||||
dojo.require("dijit.tree.dndSource");
|
dojo.require("dijit.tree.dndSource");
|
||||||
|
dojo.require("dijit.TooltipDialog");
|
||||||
|
|
||||||
dojo.registerModulePath("lib", "..");
|
dojo.registerModulePath("lib", "..");
|
||||||
dojo.registerModulePath("fox", "../..");
|
dojo.registerModulePath("fox", "../..");
|
||||||
|
@ -2040,3 +2041,59 @@ function handle_rpc_reply(transport, scheduled_call) {
|
||||||
return true;
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue