From 6aff7845751e1671f436da6686209b414fdcfcc4 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Thu, 30 Aug 2012 18:50:56 +0400 Subject: implement multiple rule/action filters --- js/functions.js | 256 ++++++++++++++++++++++++++++++++++++++------------------ js/prefs.js | 96 +++++++++++---------- 2 files changed, 227 insertions(+), 125 deletions(-) (limited to 'js') diff --git a/js/functions.js b/js/functions.js index 3aa730359..f2c5e3bf5 100644 --- a/js/functions.js +++ b/js/functions.js @@ -545,7 +545,7 @@ function fatalError(code, msg, ext_info) { } } -function filterDlgCheckType(sender) { +/* function filterDlgCheckType(sender) { try { @@ -565,7 +565,7 @@ function filterDlgCheckType(sender) { exception_error("filterDlgCheckType", e); } -} +} */ function filterDlgCheckAction(sender) { @@ -938,17 +938,163 @@ function quickAddFeed() { } } +function createNewRuleElement(parentNode, replaceNode) { + try { + var form = document.forms["filter_new_rule_form"]; + + var query = "backend.php?op=pref-filters&method=printrulename&rule="+ + param_escape(dojo.formToJson(form)); + + console.log(query); + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function (transport) { + try { + var li = dojo.create("li"); + + dojo.create("input", { type: "checkbox", + onclick: function() { toggleSelectListRow(this) }, + }, li); + + dojo.create("input", { type: "hidden", + name: "rule[]", + value: dojo.formToJson(form) }, li); + + dojo.create("span", { + onclick: function() { + dijit.byId('filterEditDlg').editRule(this); + }, + innerHTML: transport.responseText }, li); + + if (replaceNode) { + parentNode.replaceChild(li, replaceNode); + } else { + parentNode.appendChild(li); + } + } catch (e) { + exception_error("createNewRuleElement", e); + } + } }); + } catch (e) { + exception_error("createNewRuleElement", e); + } +} + +function createNewActionElement(parentNode, replaceNode) { + try { + var form = document.forms["filter_new_action_form"]; + + if (form.action_id.value == 7) { + form.action_param.value = form.action_param_label.value; + } + + var query = "backend.php?op=pref-filters&method=printactionname&action="+ + param_escape(dojo.formToJson(form)); + + console.log(query); + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function (transport) { + try { + var li = dojo.create("li"); + + dojo.create("input", { type: "checkbox", + onclick: function() { toggleSelectListRow(this) }, + }, li); + + dojo.create("input", { type: "hidden", + name: "action[]", + value: dojo.formToJson(form) }, li); + + dojo.create("span", { + onclick: function() { + dijit.byId('filterEditDlg').editAction(this); + }, + innerHTML: transport.responseText }, li); + + if (replaceNode) { + parentNode.replaceChild(li, replaceNode); + } else { + parentNode.appendChild(li); + } + + } catch (e) { + exception_error("createNewActionElement", e); + } + } }); + } catch (e) { + exception_error("createNewActionElement", e); + } +} + + +function addFilterRule(replaceNode, ruleStr) { + try { + if (dijit.byId("filterNewRuleDlg")) + dijit.byId("filterNewRuleDlg").destroyRecursive(); + + var query = "backend.php?op=pref-filters&method=newrule&rule=" + + param_escape(ruleStr); + + var rule_dlg = new dijit.Dialog({ + id: "filterNewRuleDlg", + title: ruleStr ? __("Edit rule") : __("Add rule"), + style: "width: 600px", + execute: function() { + if (this.validate()) { + createNewRuleElement($("filterDlg_Matches"), replaceNode); + this.hide(); + } + }, + href: query}); + + rule_dlg.show(); + } catch (e) { + exception_error("addFilterRule", e); + } +} + +function addFilterAction(replaceNode, actionStr) { + try { + if (dijit.byId("filterNewActionDlg")) + dijit.byId("filterNewActionDlg").destroyRecursive(); + + var query = "backend.php?op=pref-filters&method=newaction&action=" + + param_escape(actionStr); + + var rule_dlg = new dijit.Dialog({ + id: "filterNewActionDlg", + title: actionStr ? __("Edit action") : __("Add action"), + style: "width: 600px", + execute: function() { + if (this.validate()) { + createNewActionElement($("filterDlg_Actions"), replaceNode); + this.hide(); + } + }, + href: query}); + + rule_dlg.show(); + } catch (e) { + exception_error("addFilterAction", e); + } +} + function quickAddFilter() { try { var query = ""; if (!inPreferences()) { - query = "backend.php?op=dlg&method=quickAddFilter&feed=" + + query = "backend.php?op=pref-filters&method=newfilter&feed=" + param_escape(getActiveFeedId()) + "&is_cat=" + param_escape(activeFeedIsCat()); } else { - query = "backend.php?op=dlg&method=quickAddFilter"; + query = "backend.php?op=pref-filters&method=newfilter"; } + console.log(query); + if (dijit.byId("feedEditDlg")) dijit.byId("feedEditDlg").destroyRecursive(); @@ -959,96 +1105,46 @@ function quickAddFilter() { id: "filterEditDlg", title: __("Create Filter"), style: "width: 600px", - test: function() { - if (this.validate()) { - - var query = "?op=rpc&method=verifyRegexp®_exp=" + - param_escape(dialog.attr('value').reg_exp); - - notify_progress("Verifying regular expression..."); - - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - var reply = JSON.parse(transport.responseText); - - if (reply) { - notify(''); - - if (!reply['status']) { - alert("Invalid regular expression."); - return; - } else { - - if (dijit.byId("filterTestDlg")) - dijit.byId("filterTestDlg").destroyRecursive(); - - tdialog = new dijit.Dialog({ - id: "filterTestDlg", - title: __("Filter Test Results"), - style: "width: 600px", - href: "backend.php?savemode=test&" + - dojo.objectToQuery(dialog.attr('value')), - }); - - tdialog.show(); - } - } - }}); - } + editRule: function(e) { + var li = e.parentNode; + var rule = li.getElementsByTagName("INPUT")[1].value; + addFilterRule(li, rule); + }, + editAction: function(e) { + var li = e.parentNode; + var action = li.getElementsByTagName("INPUT")[1].value; + addFilterAction(li, action); + }, + addAction: function() { addFilterAction(); }, + addRule: function() { addFilterRule(); }, + deleteAction: function() { + $$("#filterDlg_Actions li.[class*=Selected]").each(function(e) { e.parentNode.removeChild(e) }); + }, + deleteRule: function() { + $$("#filterDlg_Matches li.[class*=Selected]").each(function(e) { e.parentNode.removeChild(e) }); }, execute: function() { if (this.validate()) { - var query = "?op=rpc&method=verifyRegexp®_exp=" + - param_escape(dialog.attr('value').reg_exp); + var query = dojo.formToQuery("filter_new_form"); - notify_progress("Verifying regular expression..."); + console.log(query); - new Ajax.Request("backend.php", { + new Ajax.Request("backend.php", { parameters: query, - onComplete: function(transport) { - var reply = JSON.parse(transport.responseText); - - if (reply) { - notify(''); - - if (!reply['status']) { - alert("Invalid regular expression."); - return; - } else { - notify_progress("Saving data...", true); - - console.log(dojo.objectToQuery(dialog.attr('value'))); - - new Ajax.Request("backend.php", { - parameters: dojo.objectToQuery(dialog.attr('value')), - onComplete: function(transport) { - dialog.hide(); - notify_info(transport.responseText); - if (inPreferences()) { - updateFilterList(); - } - }}); - } + onComplete: function (transport) { + if (inPreferences()) { + updateFilterList(); } - }}); + + dialog.hide(); + } }); } }, href: query}); dialog.show(); - var lh = dojo.connect(dialog, "onLoad", - function() { - dojo.disconnect(lh); - var title = $("PTITLE-FULL-" + active_post_id); - - if (title) { - $("filterDlg_regExp").value = title.innerHTML; - } - }); - } catch (e) { exception_error("quickAddFilter", e); } diff --git a/js/prefs.js b/js/prefs.js index b308d011d..1fbbc55a5 100644 --- a/js/prefs.js +++ b/js/prefs.js @@ -136,9 +136,18 @@ function editFilter(id) { id: "filterEditDlg", title: __("Edit Filter"), style: "width: 600px", + editRule: function(e) { + var li = e.parentNode; + var rule = li.getElementsByTagName("INPUT")[1].value; + addFilterRule(li, rule); + }, + editAction: function(e) { + var li = e.parentNode; + var action = li.getElementsByTagName("INPUT")[1].value; + addFilterAction(li, action); + }, removeFilter: function() { - var title = this.attr('value').reg_exp; - var msg = __("Remove filter %s?").replace("%s", title); + var msg = __("Remove filter?"); if (confirm(msg)) { this.hide(); @@ -157,57 +166,29 @@ function editFilter(id) { } }); } }, - test: function() { - if (this.validate()) { - - if (dijit.byId("filterTestDlg")) - dijit.byId("filterTestDlg").destroyRecursive(); - - tdialog = new dijit.Dialog({ - id: "filterTestDlg", - title: __("Filter Test Results"), - style: "width: 600px", - href: "backend.php?savemode=test&" + - dojo.objectToQuery(dialog.attr('value')), - }); - - tdialog.show(); - - } + addAction: function() { addFilterAction(); }, + addRule: function() { addFilterRule(); }, + deleteAction: function() { + $$("#filterDlg_Actions li.[class*=Selected]").each(function(e) { e.parentNode.removeChild(e) }); + }, + deleteRule: function() { + $$("#filterDlg_Matches li.[class*=Selected]").each(function(e) { e.parentNode.removeChild(e) }); }, execute: function() { if (this.validate()) { - var query = "?op=rpc&method=verifyRegexp®_exp=" + - param_escape(dialog.attr('value').reg_exp); + notify_progress("Saving data...", true); - notify_progress("Verifying regular expression..."); + var query = dojo.formToQuery("filter_edit_form"); - new Ajax.Request("backend.php", { + console.log(query); + + new Ajax.Request("backend.php", { parameters: query, onComplete: function(transport) { - var reply = JSON.parse(transport.responseText); - - if (reply) { - notify(''); - - if (!reply['status']) { - alert("Match regular expression seems to be invalid."); - return; - } else { - notify_progress("Saving data...", true); - - console.log(dojo.objectToQuery(dialog.attr('value'))); - - new Ajax.Request("backend.php", { - parameters: dojo.objectToQuery(dialog.attr('value')), - onComplete: function(transport) { - dialog.hide(); - updateFilterList(); - }}); - } - } - }}); + dialog.hide(); + updateFilterList(); + }}); } }, href: query}); @@ -605,6 +586,31 @@ function editSelectedFilter() { } +function joinSelectedFilters() { + var rows = getSelectedFilters(); + + if (rows.length == 0) { + alert(__("No filters are selected.")); + return; + } + + var ok = confirm(__("Combine selected filters?")); + + if (ok) { + notify_progress("Joining filters..."); + + var query = "?op=pref-filters&method=join&ids="+ + param_escape(rows.toString()); + + console.log(query); + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + updateFilterList(); + } }); + } +} function editSelectedFeed() { var rows = getSelectedFeeds(); -- cgit v1.2.3