diff options
author | Andrew Dolgov <[email protected]> | 2005-09-03 08:22:29 +0100 |
---|---|---|
committer | Andrew Dolgov <[email protected]> | 2005-09-03 08:22:29 +0100 |
commit | a0d5388913ca8f9a97fa1ef257517230412bafdd (patch) | |
tree | 6c331d48d6a8a93d612875564c3a273b7b9a84bb | |
parent | f92db4f5e750358bf49f4aa81d6f91b00e006494 (diff) |
reworked preferences dialog, start work on post filters (schema updated)
-rw-r--r-- | backend.php | 167 | ||||
-rw-r--r-- | functions.php | 12 | ||||
-rw-r--r-- | prefs.js | 188 | ||||
-rw-r--r-- | prefs.php | 28 | ||||
-rw-r--r-- | tt-rss.css | 8 | ||||
-rw-r--r-- | ttrss_schema.sql | 19 |
6 files changed, 402 insertions, 20 deletions
diff --git a/backend.php b/backend.php index ef6caf0b1..9c0b5c8b0 100644 --- a/backend.php +++ b/backend.php @@ -475,7 +475,13 @@ } } } - + + 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 @@ -578,5 +584,164 @@ } + 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: + <a class=\"button\" href=\"javascript:filterEditCancel()\">Cancel</a> + <a class=\"button\" href=\"javascript:filterEditSave()\">Save</a>"; + + } else { + + print " + Selection: + <a class=\"button\" + href=\"javascript:editSelectedFilter()\">Edit</a> + <a class=\"buttonWarn\" + href=\"javascript:removeSelectedFilters()\">Remove</a> "; + } + } + pg_close($link); ?> diff --git a/functions.php b/functions.php index 9df335188..1337b30f8 100644 --- a/functions.php +++ b/functions.php @@ -277,5 +277,17 @@ } + 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>"; + } ?> @@ -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(""); @@ -28,28 +28,32 @@ </tr> </tr> <td id="prefContent" class="prefContent" valign="top" colspan="2"> - <h2>Feed Configuration</h2> - - <div id="piggie"> </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"> </div> + <h2>Feed Configuration</h2> - <hr> + <div class="expPane" id="feedConfPane"> + <a href="javascript:expandPane('feedConfPane')">Click to expand >></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"> <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 >></a> + </div> + </td> </tr> <tr> diff --git a/tt-rss.css b/tt-rss.css index a714ca5cb..3ecb8970e 100644 --- a/tt-rss.css +++ b/tt-rss.css @@ -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; +} + diff --git a/ttrss_schema.sql b/ttrss_schema.sql index 364087f17..79a58677c 100644 --- a/ttrss_schema.sql +++ b/ttrss_schema.sql @@ -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 ''); + |