mirror of https://tt-rss.org/git/tt-rss.git
remove old category editor
allow creating/removing categories in main feed editor
This commit is contained in:
parent
e07f89815b
commit
5ef071e00b
|
@ -1290,164 +1290,6 @@ class Pref_Feeds extends Protected_Handler {
|
||||||
db_query($this->link, "COMMIT");
|
db_query($this->link, "COMMIT");
|
||||||
}
|
}
|
||||||
|
|
||||||
function editCats() {
|
|
||||||
|
|
||||||
$action = $_REQUEST["action"];
|
|
||||||
|
|
||||||
if ($action == "save") {
|
|
||||||
|
|
||||||
$cat_title = db_escape_string(trim($_REQUEST["value"]));
|
|
||||||
$cat_id = db_escape_string($_REQUEST["cid"]);
|
|
||||||
|
|
||||||
db_query($this->link, "BEGIN");
|
|
||||||
|
|
||||||
$result = db_query($this->link, "SELECT title FROM ttrss_feed_categories
|
|
||||||
WHERE id = '$cat_id' AND owner_uid = ".$_SESSION["uid"]);
|
|
||||||
|
|
||||||
if (db_num_rows($result) == 1) {
|
|
||||||
|
|
||||||
$old_title = db_fetch_result($result, 0, "title");
|
|
||||||
|
|
||||||
if ($cat_title != "") {
|
|
||||||
$result = db_query($this->link, "UPDATE ttrss_feed_categories SET
|
|
||||||
title = '$cat_title' WHERE id = '$cat_id' AND
|
|
||||||
owner_uid = ".$_SESSION["uid"]);
|
|
||||||
|
|
||||||
print $cat_title;
|
|
||||||
} else {
|
|
||||||
print $old_title;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
print $_REQUEST["value"];
|
|
||||||
}
|
|
||||||
|
|
||||||
db_query($this->link, "COMMIT");
|
|
||||||
|
|
||||||
return;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($action == "add") {
|
|
||||||
|
|
||||||
$feed_cat = db_escape_string(trim($_REQUEST["cat"]));
|
|
||||||
|
|
||||||
if (!add_feed_category($this->link, $feed_cat))
|
|
||||||
print_warning(T_sprintf("Category <b>$%s</b> already exists in the database.", $feed_cat));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($action == "remove") {
|
|
||||||
|
|
||||||
$ids = split(",", db_escape_string($_REQUEST["ids"]));
|
|
||||||
|
|
||||||
foreach ($ids as $id) {
|
|
||||||
remove_feed_category($this->link, $id, $_SESSION["uid"]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
print "<div dojoType=\"dijit.Toolbar\">";
|
|
||||||
|
|
||||||
print "<div dojoType=\"dijit.form.DropDownButton\">".
|
|
||||||
"<span>" . __('Select')."</span>";
|
|
||||||
print "<div dojoType=\"dijit.Menu\" style=\"display: none;\">";
|
|
||||||
print "<div onclick=\"selectTableRows('prefFeedCatList', 'all')\"
|
|
||||||
dojoType=\"dijit.MenuItem\">".__('All')."</div>";
|
|
||||||
print "<div onclick=\"selectTableRows('prefFeedCatList', 'none')\"
|
|
||||||
dojoType=\"dijit.MenuItem\">".__('None')."</div>";
|
|
||||||
print "</div></div>";
|
|
||||||
|
|
||||||
print "<div style='float : right'>";
|
|
||||||
|
|
||||||
print "<input dojoType=\"dijit.form.ValidationTextBox\" required=\"1\" name=\"newcat\">
|
|
||||||
<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('feedCatEditDlg').addCategory()\">".
|
|
||||||
__('Create category')."</button></div>";
|
|
||||||
|
|
||||||
print "</div>";
|
|
||||||
|
|
||||||
$result = db_query($this->link, "SELECT c.title, c.id,COUNT(f.id) AS count
|
|
||||||
FROM ttrss_feed_categories AS c LEFT JOIN ttrss_feeds AS f ON
|
|
||||||
(f.cat_id = c.id)
|
|
||||||
WHERE c.owner_uid = ".$_SESSION["uid"]."
|
|
||||||
GROUP BY c.title, c.id ORDER BY title");
|
|
||||||
|
|
||||||
if (db_num_rows($result) != 0) {
|
|
||||||
|
|
||||||
print "<div class=\"prefFeedCatHolder\">";
|
|
||||||
|
|
||||||
print "<table width=\"100%\" class=\"prefFeedCatList\"
|
|
||||||
cellspacing=\"0\" id=\"prefFeedCatList\">";
|
|
||||||
|
|
||||||
$lnum = 0;
|
|
||||||
|
|
||||||
while ($line = db_fetch_assoc($result)) {
|
|
||||||
|
|
||||||
$class = ($lnum % 2) ? "even" : "odd";
|
|
||||||
|
|
||||||
$cat_id = $line["id"];
|
|
||||||
$this_row_id = "id=\"FCATR-$cat_id\"";
|
|
||||||
|
|
||||||
print "<tr class=\"placeholder\" $this_row_id>";
|
|
||||||
|
|
||||||
$edit_title = htmlspecialchars($line["title"]);
|
|
||||||
|
|
||||||
print "<td width='5%' align='center'><input id=\"FCATC-$cat_id\"
|
|
||||||
onclick='toggleSelectRow2(this);' dojoType=\"dijit.form.CheckBox\"
|
|
||||||
type=\"checkbox\"></td>";
|
|
||||||
|
|
||||||
print "<td>";
|
|
||||||
|
|
||||||
if ($line['count'] == 0) print '<em>';
|
|
||||||
|
|
||||||
print "<span dojoType=\"dijit.InlineEditBox\"
|
|
||||||
width=\"300px\" autoSave=\"false\"
|
|
||||||
cat-id=\"$cat_id\">" . $edit_title .
|
|
||||||
"<script type=\"dojo/method\" event=\"onChange\" args=\"item\">
|
|
||||||
var elem = this;
|
|
||||||
dojo.xhrPost({
|
|
||||||
url: 'backend.php',
|
|
||||||
content: {op: 'pref-feeds', method: 'editCats',
|
|
||||||
action: 'save',
|
|
||||||
value: this.value,
|
|
||||||
cid: this.srcNodeRef.getAttribute('cat-id')},
|
|
||||||
load: function(response) {
|
|
||||||
elem.attr('value', response);
|
|
||||||
updateFeedList();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</span>";
|
|
||||||
|
|
||||||
if ($line['count'] == 0) print '</em>';
|
|
||||||
|
|
||||||
print "</td>";
|
|
||||||
|
|
||||||
print "<td align='right' class='insensitive'>";
|
|
||||||
echo T_sprintf("%d feeds", $line['count']);
|
|
||||||
print "</td></tr>";
|
|
||||||
|
|
||||||
++$lnum;
|
|
||||||
}
|
|
||||||
|
|
||||||
print "</table>";
|
|
||||||
print "</div>";
|
|
||||||
|
|
||||||
} else {
|
|
||||||
print "<p>".__('No feed categories defined.')."</p>";
|
|
||||||
}
|
|
||||||
|
|
||||||
print "<div class='dlgButtons'>
|
|
||||||
<div style='float : left'>
|
|
||||||
<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('feedCatEditDlg').removeSelected()\">".
|
|
||||||
__('Remove selected categories')."</button>
|
|
||||||
</div>";
|
|
||||||
|
|
||||||
print "<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('feedCatEditDlg').hide()\">".
|
|
||||||
__('Close this window')."</button></div>";
|
|
||||||
|
|
||||||
return;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function index() {
|
function index() {
|
||||||
|
|
||||||
print "<div dojoType=\"dijit.layout.AccordionContainer\" region=\"center\">";
|
print "<div dojoType=\"dijit.layout.AccordionContainer\" region=\"center\">";
|
||||||
|
@ -1530,8 +1372,8 @@ class Pref_Feeds extends Protected_Handler {
|
||||||
print "<div dojoType=\"dijit.form.DropDownButton\">".
|
print "<div dojoType=\"dijit.form.DropDownButton\">".
|
||||||
"<span>" . __('Categories')."</span>";
|
"<span>" . __('Categories')."</span>";
|
||||||
print "<div dojoType=\"dijit.Menu\" style=\"display: none;\">";
|
print "<div dojoType=\"dijit.Menu\" style=\"display: none;\">";
|
||||||
print "<div onclick=\"editFeedCats()\"
|
print "<div onclick=\"createCategory()\"
|
||||||
dojoType=\"dijit.MenuItem\">".__('Edit categories')."</div>";
|
dojoType=\"dijit.MenuItem\">".__('Add category')."</div>";
|
||||||
print "<div onclick=\"toggleHiddenFeedCats()\"
|
print "<div onclick=\"toggleHiddenFeedCats()\"
|
||||||
dojoType=\"dijit.MenuItem\">".__('(Un)hide empty categories')."</div>";
|
dojoType=\"dijit.MenuItem\">".__('(Un)hide empty categories')."</div>";
|
||||||
print "<div onclick=\"resetCatOrder()\"
|
print "<div onclick=\"resetCatOrder()\"
|
||||||
|
|
|
@ -35,6 +35,51 @@ dojo.declare("fox.PrefFeedTree", lib.CheckBoxTree, {
|
||||||
dojo.place(param, tnode.labelNode, 'after');
|
dojo.place(param, tnode.labelNode, 'after');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var id = args.item.id[0];
|
||||||
|
var bare_id = parseInt(id.substr(id.indexOf(':')+1));
|
||||||
|
|
||||||
|
if (id.match("CAT:") && bare_id > 0) {
|
||||||
|
var menu = new dijit.Menu();
|
||||||
|
menu.row_id = bare_id;
|
||||||
|
menu.item = args.item;
|
||||||
|
|
||||||
|
menu.addChild(new dijit.MenuItem({
|
||||||
|
label: __("Edit category"),
|
||||||
|
onClick: function() {
|
||||||
|
editCat(this.getParent().row_id, this.getParent().item, null);
|
||||||
|
}}));
|
||||||
|
|
||||||
|
|
||||||
|
menu.addChild(new dijit.MenuItem({
|
||||||
|
label: __("Remove category"),
|
||||||
|
onClick: function() {
|
||||||
|
removeCategory(this.getParent().row_id, this.getParent().item);
|
||||||
|
}}));
|
||||||
|
|
||||||
|
menu.bindDomNode(tnode.domNode);
|
||||||
|
tnode._menu = menu;
|
||||||
|
} else if (id.match("FEED:")) {
|
||||||
|
var menu = new dijit.Menu();
|
||||||
|
menu.row_id = bare_id;
|
||||||
|
menu.item = args.item;
|
||||||
|
|
||||||
|
menu.addChild(new dijit.MenuItem({
|
||||||
|
label: __("Edit feed"),
|
||||||
|
onClick: function() {
|
||||||
|
editFeed(this.getParent().row_id);
|
||||||
|
}}));
|
||||||
|
|
||||||
|
menu.addChild(new dijit.MenuItem({
|
||||||
|
label: __("Unsubscribe"),
|
||||||
|
onClick: function() {
|
||||||
|
unsubscribeFeed(this.getParent().row_id, this.getParent().item.name);
|
||||||
|
}}));
|
||||||
|
|
||||||
|
menu.bindDomNode(tnode.domNode);
|
||||||
|
tnode._menu = menu;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
return tnode;
|
return tnode;
|
||||||
},
|
},
|
||||||
onDndDrop: function() {
|
onDndDrop: function() {
|
||||||
|
|
97
js/prefs.js
97
js/prefs.js
|
@ -1169,72 +1169,51 @@ function pref_hotkey_handler(e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function editFeedCats() {
|
function removeCategory(id, item) {
|
||||||
try {
|
try {
|
||||||
var query = "backend.php?op=pref-feeds&method=editCats";
|
|
||||||
|
|
||||||
if (dijit.byId("feedCatEditDlg"))
|
var ok = confirm(__("Remove category %s? Any nested feeds would be placed into Uncategorized.").replace("%s", item.name));
|
||||||
dijit.byId("feedCatEditDlg").destroyRecursive();
|
|
||||||
|
|
||||||
dialog = new dijit.Dialog({
|
if (ok) {
|
||||||
id: "feedCatEditDlg",
|
var query = "?op=pref-feeds&method=editCats&action=remove&ids="+
|
||||||
title: __("Feed Categories"),
|
param_escape(id);
|
||||||
style: "width: 600px",
|
|
||||||
getSelectedCategories: function() {
|
|
||||||
return getSelectedTableRowIds("prefFeedCatList");
|
|
||||||
},
|
|
||||||
removeSelected: function() {
|
|
||||||
var sel_rows = this.getSelectedCategories();
|
|
||||||
|
|
||||||
if (sel_rows.length > 0) {
|
notify_progress("Removing category...");
|
||||||
var ok = confirm(__("Remove selected categories?"));
|
|
||||||
|
|
||||||
if (ok) {
|
new Ajax.Request("backend.php", {
|
||||||
notify_progress("Removing selected categories...", true);
|
parameters: query,
|
||||||
|
onComplete: function(transport) {
|
||||||
var query = "?op=pref-feeds&method=editCats&action=remove&ids="+
|
notify('');
|
||||||
param_escape(sel_rows.toString());
|
updateFeedList();
|
||||||
|
} });
|
||||||
new Ajax.Request("backend.php", {
|
}
|
||||||
parameters: query,
|
|
||||||
onComplete: function(transport) {
|
|
||||||
notify('');
|
|
||||||
dialog.attr('content', transport.responseText);
|
|
||||||
updateFeedList();
|
|
||||||
} });
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
alert(__("No categories are selected."));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
addCategory: function() {
|
|
||||||
if (this.validate()) {
|
|
||||||
notify_progress("Creating category...");
|
|
||||||
|
|
||||||
var query = "?op=pref-feeds&method=editCats&action=add&cat=" +
|
|
||||||
param_escape(this.attr('value').newcat);
|
|
||||||
|
|
||||||
new Ajax.Request("backend.php", {
|
|
||||||
parameters: query,
|
|
||||||
onComplete: function(transport) {
|
|
||||||
notify('');
|
|
||||||
dialog.attr('content', transport.responseText);
|
|
||||||
updateFeedList();
|
|
||||||
} });
|
|
||||||
}
|
|
||||||
},
|
|
||||||
execute: function() {
|
|
||||||
if (this.validate()) {
|
|
||||||
}
|
|
||||||
},
|
|
||||||
href: query});
|
|
||||||
|
|
||||||
dialog.show();
|
|
||||||
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
exception_error("editFeedCats", e);
|
exception_error("removeCategory", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function createCategory() {
|
||||||
|
try {
|
||||||
|
var title = prompt(__("Category title:"));
|
||||||
|
|
||||||
|
if (title) {
|
||||||
|
|
||||||
|
notify_progress("Creating category...");
|
||||||
|
|
||||||
|
var query = "?op=pref-feeds&method=editCats&action=add&cat=" +
|
||||||
|
param_escape(title);
|
||||||
|
|
||||||
|
new Ajax.Request("backend.php", {
|
||||||
|
parameters: query,
|
||||||
|
onComplete: function(transport) {
|
||||||
|
notify('');
|
||||||
|
updateFeedList();
|
||||||
|
} });
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (e) {
|
||||||
|
exception_error("createCategory", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue