]> git.wh0rd.org - tt-rss.git/commitdiff
reworked preferences dialog, start work on post filters (schema updated)
authorAndrew Dolgov <fox@bah.spb.su>
Sat, 3 Sep 2005 07:22:29 +0000 (08:22 +0100)
committerAndrew Dolgov <fox@bah.spb.su>
Sat, 3 Sep 2005 07:22:29 +0000 (08:22 +0100)
backend.php
functions.php
prefs.js
prefs.php
tt-rss.css
ttrss_schema.sql

index ef6caf0b10fc35ca0256fc9e541a63c91e23e5ea..9c0b5c8b0ded9d61507ee9a13ad80984447e61f0 100644 (file)
                                }
                        }
                }
-       
+
+               print "<table class=\"prefAddFeed\"><tr>
+                       <td><input id=\"fadd_link\"></td>
+                       <td colspan=\"4\" align=\"right\">
+                               <a class=\"button\" href=\"javascript:addFeed()\">Add feed</a></td></tr>
+               </table>";
+
                $result = pg_query("SELECT 
                                id,title,feed_url,substring(last_updated,1,16) as last_updated
                        FROM 
 
        }
 
+       if ($op == "pref-filters") {
+
+               $subop = $_GET["subop"];
+
+               if ($subop == "editSave") {
+/*                     $feed_title = pg_escape_string($_GET["t"]);
+                       $feed_link = pg_escape_string($_GET["l"]);
+                       $feed_id = $_GET["id"];
+
+                       $result = pg_query("UPDATE ttrss_feeds SET 
+                               title = '$feed_title', feed_url = '$feed_link' WHERE id = '$feed_id'"); */
+
+               }
+
+               if ($subop == "remove") {
+
+                       if (!WEB_DEMO_MODE) {
+
+                               $ids = split(",", $_GET["ids"]);
+
+                               foreach ($ids as $id) {
+                                       pg_query("DELETE FROM ttrss_filters WHERE id = '$id'");
+                                       
+                               }
+                       }
+               }
+
+               if ($subop == "add") {
+               
+/*                     if (!WEB_DEMO_MODE) {
+
+                               $feed_link = pg_escape_string($_GET["link"]);
+                                       
+                               $result = pg_query(
+                                       "INSERT INTO ttrss_feeds (feed_url,title) VALUES ('$feed_link', '')");
+
+                               $result = pg_query(
+                                       "SELECT id FROM ttrss_feeds WHERE feed_url = '$feed_link'");
+
+                               $feed_id = pg_fetch_result($result, 0, "id");
+
+                               if ($feed_id) {
+                                       update_rss_feed($link, $feed_link, $feed_id);
+                               }
+                       } */
+               }
+
+               $result = pg_query("SELECT description 
+                       FROM ttrss_filter_types ORDER BY description");
+
+               $filter_types = array();
+
+               while ($line = pg_fetch_assoc($result)) {
+                       array_push($filter_types, $line["description"]);
+               }
+
+               print "<table class=\"prefAddFeed\"><tr>
+                       <td>Expr: <input id=\"fadd_regexp\"></td>
+                       <td>";
+                       print_select("fadd_match", "", $filter_types);  
+       
+               print"</td><td colspan=\"4\" align=\"right\">
+                               <a class=\"button\" href=\"javascript:addFilter()\">Add filter</a></td></tr>
+               </table>";
+
+               $result = pg_query("SELECT 
+                               id,regexp,description,
+                               (SELECT name FROM ttrss_filter_types WHERE 
+                                       id = filter_type) as filter_type_name,
+                               (SELECT description FROM ttrss_filter_types 
+                                       WHERE id = filter_type) as filter_type_descr
+                       FROM 
+                               ttrss_filters ORDER by id");
+
+               print "<p><table width=\"100%\" class=\"prefFilterList\" id=\"prefFilterList\">";
+
+               print "<tr class=\"title\">
+                                       <td>Select</td><td width=\"40%\">Filter Expression</td>
+                                       <td width=\"40%\">Description</td><td>Match</td></tr>";
+               
+               $lnum = 0;
+               
+               while ($line = pg_fetch_assoc($result)) {
+
+                       $class = ($lnum % 2) ? "even" : "odd";
+
+                       $filter_id = $line["id"];
+                       $edit_filter_id = $_GET["id"];
+
+                       if ($subop == "edit" && $filter_id != $edit_filter_id) {
+                               $class .= "Grayed";
+                       }
+
+                       print "<tr class=\"$class\" id=\"FILRR-$filter_id\">";
+
+                       if (!$edit_filter_id || $subop != "edit") {
+
+                               print "<td><input onclick='toggleSelectRow(this);' 
+                               type=\"checkbox\" id=\"FICHK-".$line["id"]."\"></td>";
+
+                               print "<td><a href=\"javascript:editFilter($filter_id);\">" . 
+                                       $line["regexp"] . "</td>";              
+                                       
+                               print "<td><a href=\"javascript:editFilter($filter_id);\">" . 
+                                       $line["description"] . "</td>";                 
+
+                               print "<td>".$line["filter_type_descr"]."</td>";
+
+                       } else if ($filter_id != $edit_filter_id) {
+
+                               print "<td><input disabled=\"true\" type=\"checkbox\" 
+                                       id=\"FICHK-".$line["id"]."\"></td>";
+
+                               print "<td>".$line["regexp"]."</td>";           
+                               print "<td>".$line["description"]."</td>";              
+                               print "<td>".$line["filter_type_descr"]."</td>";
+
+                       } else {
+
+                               print "<td><input disabled=\"true\" type=\"checkbox\"></td>";
+
+                               print "<td><input id=\"iedit_regexp\" value=\"".$line["regexp"].
+                                       "\"></td>";
+
+                               print "<td><input id=\"iedit_descr\" value=\"".$line["description"].
+                                       "\"></td>";
+
+                               print "<td>";
+                               print_select("iedit_match", $line["filter_type_descr"], $filter_types);
+                               print "</td>";
+                                               
+                       }
+                               
+                       
+                       print "</tr>";
+
+                       ++$lnum;
+               }
+
+               print "</table>";
+
+               print "<p>";
+
+               if ($subop == "edit") {
+                       print "Edit feed:&nbsp;
+                                       <a class=\"button\" href=\"javascript:filterEditCancel()\">Cancel</a>&nbsp;
+                                       <a class=\"button\" href=\"javascript:filterEditSave()\">Save</a>";
+                                       
+               } else {
+
+                       print "
+                               Selection:&nbsp;
+                       <a class=\"button\" 
+                               href=\"javascript:editSelectedFilter()\">Edit</a>&nbsp;
+                       <a class=\"buttonWarn\" 
+                               href=\"javascript:removeSelectedFilters()\">Remove</a>&nbsp;";
+               }
+       }
+
        pg_close($link);
 ?>
index 9df3351889fc91f146cfeb708e009684e5484e6e..1337b30f89941c478a01e2cb7722aaaf8c70f43d 100644 (file)
 
        }
 
+       function print_select($id, $default, $values) {
+               print "<select id=\"$id\">";
+               foreach ($values as $v) {
+                       if ($v == $default)
+                               $sel = " selected";
+                        else
+                               $sel = "";
+                       
+                       print "<option$sel>$v</option>";
+               }
+               print "</select>";
+       }
 
 ?>
index e9a0e49dfb8bb0241d93ddfd69aaa7e322e837d6..a498bb2e32148c18f66ec829504a5515f4ee66ae 100644 (file)
--- a/prefs.js
+++ b/prefs.js
@@ -6,6 +6,8 @@
 var xmlhttp = false;
 
 var active_feed = false;
+var active_filter = false;
+var active_pane = false;
 
 /*@cc_on @*/
 /*@if (@_jscript_version >= 5)
@@ -26,9 +28,8 @@ if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
        xmlhttp = new XMLHttpRequest();
 }
 
-
 function feedlist_callback() {
-       var container = document.getElementById('feeds');
+       var container = document.getElementById('feedConfPane');
        if (xmlhttp.readyState == 4) {
                container.innerHTML=xmlhttp.responseText;
 
@@ -47,6 +48,27 @@ function feedlist_callback() {
        }
 }
 
+function filterlist_callback() {
+       var container = document.getElementById('filterConfPane');
+       if (xmlhttp.readyState == 4) {
+               container.innerHTML=xmlhttp.responseText;
+
+               if (active_filter) {
+                       var row = document.getElementById("FILRR-" + active_filter);
+                       if (row) {
+                               if (!row.className.match("Selected")) {
+                                       row.className = row.className + "Selected";
+                               }               
+                       }
+                       var checkbox = document.getElementById("FICHK-" + active_filter);
+                       
+                       if (checkbox) {
+                               checkbox.checked = true;
+                       }
+               }
+       }
+}
+
 function notify_callback() {
        var container = document.getElementById('notify');
        if (xmlhttp.readyState == 4) {
@@ -62,7 +84,7 @@ function updateFeedList() {
                return
        }
 
-       document.getElementById("feeds").innerHTML = "Loading feeds, please wait...";
+       document.getElementById("feedConfPane").innerHTML = "Loading feeds, please wait...";
 
        xmlhttp.open("GET", "backend.php?op=pref-feeds", true);
        xmlhttp.onreadystatechange=feedlist_callback;
@@ -109,6 +131,22 @@ function addFeed() {
 
 }
 
+function editFilter(id) {
+
+       if (!xmlhttp_ready(xmlhttp)) {
+               printLockingError();
+               return
+       }
+
+       active_filter = id;
+
+       xmlhttp.open("GET", "backend.php?op=pref-filters&subop=edit&id=" +
+               param_escape(id), true);
+       xmlhttp.onreadystatechange=filterlist_callback;
+       xmlhttp.send(null);
+
+}
+
 function editFeed(feed) {
 
 //     notify("Editing feed...");
@@ -127,6 +165,22 @@ function editFeed(feed) {
 
 }
 
+function getSelectedFilters() {
+
+       var content = document.getElementById("prefFilterList");
+
+       var sel_rows = new Array();
+
+       for (i = 0; i < content.rows.length; i++) {
+               if (content.rows[i].className.match("Selected")) {
+                       var row_id = content.rows[i].id.replace("FILRR-", "");
+                       sel_rows.push(row_id);  
+               }
+       }
+
+       return sel_rows;
+}
+
 function getSelectedFeeds() {
 
        var content = document.getElementById("prefFeedList");
@@ -269,6 +323,96 @@ function feedEditSave() {
 
 }
 
+function filterEditCancel() {
+
+       if (!xmlhttp_ready(xmlhttp)) {
+               printLockingError();
+               return
+       }
+
+       active_filter = false;
+
+       notify("Operation cancelled.");
+
+       xmlhttp.open("GET", "backend.php?op=pref-filters", true);
+       xmlhttp.onreadystatechange=filterlist_callback;
+       xmlhttp.send(null);
+
+}
+
+function filterEditSave() {
+
+       var filter = active_filter;
+
+       if (!xmlhttp_ready(xmlhttp)) {
+               printLockingError();
+               return
+       }
+
+       var regexp = document.getElementById("iedit_regexp").value;
+       var descr = document.getElementById("iedit_descr").value;
+       var match = document.getElementById("iedit_match").value;
+
+//     notify("Saving filter " + filter + ": " + regexp + ", " + descr + ", " + match);
+
+       if (regexp.length == 0) {
+               notify("Filter expression cannot be blank.");
+               return;
+       }
+
+       active_filter = false;
+
+       xmlhttp.open("GET", "backend.php?op=pref-filters&subop=editSave&id=" +
+               filter + "&r=" + param_escape(regexp) + "&d=" + param_escape(descr) +
+               "&m=" + param_escape(match), true);
+               
+       xmlhttp.onreadystatechange=filterlist_callback;
+       xmlhttp.send(null); 
+
+}
+
+function removeSelectedFilters() {
+
+       if (!xmlhttp_ready(xmlhttp)) {
+               printLockingError();
+               return
+       }
+
+       var sel_rows = getSelectedFilters();
+
+       if (sel_rows.length > 0) {
+
+               notify("Removing selected filters...");
+
+               xmlhttp.open("GET", "backend.php?op=pref-filters&subop=remove&ids="+
+                       param_escape(sel_rows.toString()), true);
+               xmlhttp.onreadystatechange=filterlist_callback;
+               xmlhttp.send(null);
+
+       } else {
+               notify("Please select some filters first.");
+       }
+}
+
+
+function editSelectedFilter() {
+       var rows = getSelectedFilters();
+
+       if (rows.length == 0) {
+               notify("No filters are selected.");
+               return;
+       }
+
+       if (rows.length > 1) {
+               notify("Please select one filter.");
+               return;
+       }
+
+       editFilter(rows[0]);
+
+}
+
+
 function editSelectedFeed() {
        var rows = getSelectedFeeds();
 
@@ -309,6 +453,42 @@ function validateOpmlImport() {
        }
 }
 
+function updateFilterList() {
+
+       if (!xmlhttp_ready(xmlhttp)) {
+               printLockingError();
+               return
+       }
+
+       document.getElementById("filterConfPane").innerHTML = "Loading filters, please wait...";
+
+       xmlhttp.open("GET", "backend.php?op=pref-filters", true);
+       xmlhttp.onreadystatechange=filterlist_callback;
+       xmlhttp.send(null);
+
+}
+
+function expandPane(id) {
+
+       var container;
+
+/*     if (active_pane) {
+               container = document.getElementById(active_pane);
+               container.innerHTML = "<a href=\"javascript:expandPane('" +
+                       active_pane + "')\">Click to expand...</a>";
+       } */
+
+       container = document.getElementById(id);
+
+       if (id == "feedConfPane") {
+               updateFeedList();
+       } else if (id == "filterConfPane") {
+               updateFilterList();
+       }
+
+       active_pane = id;
+}
+
 function init() {
 
        // IE kludge
@@ -320,7 +500,7 @@ function init() {
                return;
        }
 
-       updateFeedList();
+//     updateFeedList();
        document.onkeydown = hotkey_handler;
        notify("");
 
index 1d47d539a4ed8bb920f869f0566eef9afe754d53..5a3afb1f356a5283ac6b063359ba6dec4e89416b 100644 (file)
--- a/prefs.php
+++ b/prefs.php
 </tr>
 </tr>
        <td id="prefContent" class="prefContent" valign="top" colspan="2">
-               <h2>Feed Configuration</h2>
-
-               <div id="piggie">&nbsp;</div>
 
-               <table class="prefAddFeed"><tr>
-                       <td><input id="fadd_link"></td>
-                       <td colspan="4" align="right">
-                               <a class="button" href="javascript:addFeed()">Add feed</a></td></tr>
-               </table> 
-               
-               <div id="feeds">&nbsp;</div>
+               <h2>Feed Configuration</h2>
 
-               <hr>
+               <div class="expPane" id="feedConfPane">
+                       <a href="javascript:expandPane('feedConfPane')">Click to expand &gt;&gt;</a>
+               </div>
 
-               <h2>Import OPML</h2>
+               <h2>OPML Import</h2>
 
+               <div class="expPane">
+       
                <form   enctype="multipart/form-data" method="POST" action="opml.php">
                        <input type="hidden" name="MAX_FILE_SIZE" value="30000">
                        File: <input id="opml_file" name="opml_file" type="file">&nbsp;
                        <input class="button" name="op" onclick="return validateOpmlImport();"
                                type="submit" value="Import">
                        </form>
+
+               </div>
+
+               <h2>Content filtering</h2>
+
+               <div class="expPane" id="filterConfPane">
+                       <a href="javascript:expandPane('filterConfPane')">Click to expand &gt;&gt;</a>
+               </div>
+
        </td>
 </tr>
 <tr>
index a714ca5cbe9f1edb1ec0bc4997b65076154c9670..3ecb8970e5d68803da449a7ed1b1233a3a2c72b1 100644 (file)
@@ -240,7 +240,7 @@ table.prefAddFeed {
 
 }
 
-table.prefFeedList tr.title td {
+table.prefFeedList tr.title td, table.prefFilterList tr.title td {
        font-weight : bold;
        border-width : 0px 0px 1px 0px;
        border-color : #f0f0f0;
@@ -377,9 +377,13 @@ img.feedIcon {
        border : 1px solid #c0c0c0;
 }
 
-#iedit_title, #iedit_link {
+#iedit_title, #iedit_link, #iedit_regexp, #iedit_descr {
        width : 100%;
        padding-left : 2px;
 }
 
+div.expPane {
+       margin : 15px;
+}
+
 
index 364087f17fb209e911cc1652ef94e63f0fee5cc3..79a58677c28985e8c517657cffce81aa537ce503 100644 (file)
@@ -41,4 +41,21 @@ create table ttrss_entries (id serial not null primary key,
        no_orig_date boolean not null default false,
        comments varchar(250) not null default '',
        unread boolean not null default true);
-       
+
+drop table ttrss_filters;
+drop table ttrss_filter_types;
+
+create table ttrss_filter_types (id integer primary key, 
+       name varchar(120) unique not null, 
+       description varchar(250) not null unique);
+
+insert into ttrss_filter_types (id,name,description) values (1, 'title', 'Title');
+insert into ttrss_filter_types (id,name,description) values (2, 'content', 'Content');
+insert into ttrss_filter_types (id,name,description) values (3, 'both', 
+       'Title and Content');
+
+create table ttrss_filters (id serial primary key, 
+       filter_type integer not null references ttrss_filter_types(id), 
+       regexp varchar(250) not null,
+       description varchar(250) not null default '');
+