diff options
-rw-r--r-- | backend.php | 163 | ||||
-rw-r--r-- | functions.js | 15 | ||||
-rw-r--r-- | schema/ttrss_schema_mysql.sql | 2 | ||||
-rw-r--r-- | schema/ttrss_schema_pgsql.sql | 2 | ||||
-rw-r--r-- | schema/upgrade-1.1-1.1.1-mysql.sql | 2 | ||||
-rw-r--r-- | schema/upgrade-1.1-1.1.1-pgsql.sql | 2 | ||||
-rw-r--r-- | tt-rss.css | 61 | ||||
-rw-r--r-- | tt-rss.php | 15 | ||||
-rw-r--r-- | viewfeed.js | 60 |
9 files changed, 243 insertions, 79 deletions
diff --git a/backend.php b/backend.php index ec662d818..97b5c5197 100644 --- a/backend.php +++ b/backend.php @@ -803,11 +803,6 @@ $view_mode = $_GET["view"]; $addheader = $_GET["addheader"]; $limit = $_GET["limit"]; - $omode = $_GET["omode"]; - - if ($omode == "xml") { - header("Content-Type: application/xml"); - } if (!$feed) { return; @@ -1050,6 +1045,8 @@ if ($feed < -10) error_reporting (0); + print "<div id=\"headlinesContainer\">"; + if (sprintf("%d", $feed) != 0) { if ($feed > 0) { @@ -1058,11 +1055,11 @@ $feed_kind = "Labels"; } - if (!$vfeed_query_part) { - $content_query_part = "SUBSTRING(content,1,300) as content_preview,"; - } else { - $content_query_part = ""; - } +// if (!$vfeed_query_part) { + $content_query_part = "content as content_preview,"; +// } else { +// $content_query_part = ""; +// } $result = db_query($link, "SELECT id,title, @@ -1109,55 +1106,64 @@ } if (!$result) { - if ($omode != "xml") { - print "<div align='center'> - Could not display feed (query failed). Please check label match syntax or local configuration.</div>"; - return; - } else { - print "<error error-code=\"8\"/>"; - - } + print "<div align='center'> + Could not display feed (query failed). Please check label match syntax or local configuration.</div>"; + return; } if (db_num_rows($result) > 0) { - if ($omode != "xml") { + print "<table class=\"headlinesSubToolbar\" + width=\"100%\" cellspacing=\"0\" cellpadding=\"0\"><tr>"; + + if (!get_pref($link, 'COMBINED_DISPLAY_MODE')) { - print "<table class=\"headlinesSubToolbar\" - width=\"100%\" cellspacing=\"0\" cellpadding=\"0\"><tr>"; - print "<td class=\"headlineActions\"> Select: - <a href=\"javascript:selectTableRowsByIdPrefix('headlinesList', - 'RROW-', 'RCHK-', true)\">All</a>, - <a href=\"javascript:selectTableRowsByIdPrefix('headlinesList', - 'RROW-', 'RCHK-', true, 'Unread')\">Unread</a>, - <a href=\"javascript:selectTableRowsByIdPrefix('headlinesList', - 'RROW-', 'RCHK-', false)\">None</a> - - Toggle: <a href=\"javascript:selectionToggleUnread()\">Unread</a>, - <a href=\"javascript:selectionToggleMarked()\">Starred</a>"; - + <a href=\"javascript:selectTableRowsByIdPrefix('headlinesList', + 'RROW-', 'RCHK-', true)\">All</a>, + <a href=\"javascript:selectTableRowsByIdPrefix('headlinesList', + 'RROW-', 'RCHK-', true, 'Unread')\">Unread</a>, + <a href=\"javascript:selectTableRowsByIdPrefix('headlinesList', + 'RROW-', 'RCHK-', false)\">None</a> + + Toggle: <a href=\"javascript:selectionToggleUnread()\">Unread</a>, + <a href=\"javascript:selectionToggleMarked()\">Starred</a>"; + print "</td>"; - - print "<td class=\"headlineTitle\">"; - - if ($feed_site_url) { - print "<a target=\"_blank\" href=\"$feed_site_url\">$feed_title</a>"; - } else { - print $feed_title; - } - + + } else { + + print "<td class=\"headlineActions\"> + Select: + <a href=\"javascript:cdmSelectArticles('all')\">All</a>, + <a href=\"javascript:cdmSelectArticles('unread')\">Unread</a>, + <a href=\"javascript:cdmSelectArticles('none')\">None</a> + + Toggle: <a href=\"javascript:selectionToggleUnread(true)\">Unread</a>, + <a href=\"javascript:selectionToggleMarked(true)\">Starred</a>"; + print "</td>"; - print "</tr></table>"; + + + } + + print "<td class=\"headlineTitle\">"; + if ($feed_site_url) { + print "<a target=\"_blank\" href=\"$feed_site_url\">$feed_title</a>"; + } else { + print $feed_title; + } + + print "</td>"; + print "</tr></table>"; + + if (!get_pref($link, 'COMBINED_DISPLAY_MODE')) { print "<table class=\"headlinesList\" id=\"headlinesList\" cellspacing=\"0\" width=\"100%\">"; - - } else { - print "<headlines feed=\"$feed\" title=\"$feed_title\" site_url=\"$feed_site_url\">"; } - + $lnum = 0; error_reporting (DEFAULT_ERROR_LEVEL); @@ -1184,9 +1190,9 @@ if ($line["unread"] == "t" || $line["unread"] == "1") { $class .= "Unread"; ++$num_unread; - $is_unread = 'true'; + $is_unread = true; } else { - $is_unread = 'false'; + $is_unread = false; } if ($line["marked"] == "t" || $line["marked"] == "1") { @@ -1212,10 +1218,9 @@ 200); } - if ($omode != "xml") { + if (!get_pref($link, 'COMBINED_DISPLAY_MODE')) { print "<tr class='$class' id='RROW-$id'>"; - // onclick=\"javascript:view($id,$feed_id)\"> print "<td class='hlUpdatePic'>$update_pic</td>"; @@ -1252,46 +1257,58 @@ print "</tr>"; } else { + + if ($is_unread) { + $add_class = "Unread"; + } else { + $add_class = ""; + } + + print "<div class=\"cdmArticle$add_class\" id=\"RROW-$id\">"; + + print "<div class=\"cdmHeader\">"; - print "<entry unread='$is_unread' id='$id'>"; - print "<title><![CDATA[" . $line["title"] . "]]></title>"; - print "<link>" . $line["link"] . "</link>"; - print "<updated>$updated_fmt</updated>"; - if ($content_preview) { - print "<preview><![CDATA[ $content_preview ]]></preview>"; - } + print "<div style=\"float : right\">$updated_fmt</div>"; + + print "<a href=\"".$line["link"]."\">".$line["title"]."</a>"; - if ($line["feed_title"]) { - print "<feed id='$feed_id'><![CDATA[" . $line["feed_title"] . "]]></feed>"; + if ($line["feed_title"]) { + print " (<a href='javascript:viewfeed($feed_id)'>".$line["feed_title"]."</a>)"; } - print "</entry>"; - } - + print "</div>"; + + print "<div class=\"cdmContent\">" . $line["content_preview"] . "</div>"; + + print "<div style=\"float : right\">$marked_pic</div> + <div class=\"cdmFooter\"> + <input type=\"checkbox\" onclick=\"toggleSelectRowById(this, + 'RROW-$id')\" class=\"feedCheckBox\" id=\"RCHK-$id\"></div>"; + + print "</div>"; + + } ++$lnum; } - if ($omode != "xml") { + if (!get_pref($link, 'COMBINED_DISPLAY_MODE')) { print "</table>"; - } else { - print "</headlines>"; } } else { print "<div width='100%' align='center'>No articles found.</div>"; } - if ($omode != "xml") { + print "</div>"; - print "<script type=\"text/javascript\"> - document.onkeydown = hotkey_handler; - update_all_counters('$feed'); - </script>"; + print "<script type=\"text/javascript\"> + document.onkeydown = hotkey_handler; + update_all_counters('$feed'); + </script>"; - if ($addheader) { - print "</body></html>"; - } + if ($addheader) { + print "</body></html>"; } } diff --git a/functions.js b/functions.js index d901cbb90..b72c1157b 100644 --- a/functions.js +++ b/functions.js @@ -537,6 +537,21 @@ function getSelectedTableRowIds(content_id, prefix) { } +function toggleSelectRowById(sender, id) { + var row = document.getElementById(id); + + if (sender.checked) { + if (!row.className.match("Selected")) { + row.className = row.className + "Selected"; + } + } else { + if (row.className.match("Selected")) { + row.className = row.className.replace("Selected", ""); + } + } +} + + function toggleSelectRow(sender) { var parent_row = sender.parentNode.parentNode; diff --git a/schema/ttrss_schema_mysql.sql b/schema/ttrss_schema_mysql.sql index b9855fbd6..fe711d1a9 100644 --- a/schema/ttrss_schema_mysql.sql +++ b/schema/ttrss_schema_mysql.sql @@ -220,6 +220,8 @@ insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) valu insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) values('HEADLINES_SMART_DATE', 1, 'true', 'Use more accessible date/time format for headlines',3); +insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) values('COMBINED_DISPLAY_MODE', 1, 'false', 'Combined feed display, no headline/article separation',2); + create table ttrss_user_prefs ( owner_uid integer not null, pref_name varchar(250), diff --git a/schema/ttrss_schema_pgsql.sql b/schema/ttrss_schema_pgsql.sql index d58492919..758c6f664 100644 --- a/schema/ttrss_schema_pgsql.sql +++ b/schema/ttrss_schema_pgsql.sql @@ -200,6 +200,8 @@ insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) valu insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) values('HEADLINES_SMART_DATE', 1, 'true', 'Use more accessible date/time format for headlines',3); +insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) values('COMBINED_DISPLAY_MODE', 1, 'false', 'Combined feed display, no headline/article separation',2); + create table ttrss_user_prefs ( owner_uid integer not null references ttrss_users(id) ON DELETE CASCADE, pref_name varchar(250) not null references ttrss_prefs(pref_name) ON DELETE CASCADE, diff --git a/schema/upgrade-1.1-1.1.1-mysql.sql b/schema/upgrade-1.1-1.1.1-mysql.sql index 685582b89..c7f96fa1b 100644 --- a/schema/upgrade-1.1-1.1.1-mysql.sql +++ b/schema/upgrade-1.1-1.1.1-mysql.sql @@ -7,4 +7,6 @@ update ttrss_entries set num_comments = 0; alter table ttrss_entries change num_comments num_comments integer not null; alter table ttrss_entries alter column num_comments set default 0; +insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) values('COMBINED_DISPLAY_MODE', 1, 'false', 'Combined feed display, no headline/article separation',2); + commit; diff --git a/schema/upgrade-1.1-1.1.1-pgsql.sql b/schema/upgrade-1.1-1.1.1-pgsql.sql index 9c7b5e35d..4ad609949 100644 --- a/schema/upgrade-1.1-1.1.1-pgsql.sql +++ b/schema/upgrade-1.1-1.1.1-pgsql.sql @@ -7,4 +7,6 @@ update ttrss_entries set num_comments = 0; alter table ttrss_entries alter column num_comments set not null; alter table ttrss_entries alter column num_comments set default 0; +insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) values('COMBINED_DISPLAY_MODE', 1, 'false', 'Combined feed display, no headline/article separation',2); + commit; diff --git a/tt-rss.css b/tt-rss.css index ac306ab90..f683d85be 100644 --- a/tt-rss.css +++ b/tt-rss.css @@ -77,6 +77,13 @@ table.main td.headlines { border-color : #c0c0c0; } +table.main td.headlines2 { + height : 100%; + border-width : 0px 0px 1px 1px; + border-style : solid; + border-color : #c0c0c0; +} + table.main td.content { height : 100%; background-image : url("images/vgrad_light_rev.png"); @@ -825,3 +832,57 @@ td.hlContent { td.hlMarkedPic, td.hlSelectRow, td.hlUpdated, td.hlFeed { height : 1em; } + +div.cdmArticle { + border : 1px solid #f0f0f0; + background-color : #fafafa; + -moz-border-radius : 5px; + margin : 10px 10px 0px 10px; + padding : 10px; +} + +div.cdmArticleUnread { + border : 1px solid #d5f1f4; + background-color : #fafeff; + -moz-border-radius : 5px; + margin : 10px 10px 0px 10px; + padding : 10px; +} + +div.cdmArticleSelected, div.cdmArticleUnreadSelected { + border : 1px solid #d0d0f6; + background-color : #eaeaff; + -moz-border-radius : 5px; + margin : 10px 10px 0px 10px; + padding : 10px; +} + +div.cdmArticleUnread div.cdmHeader a, div.cdmArticleUnreadSelected div.cdmHeader a { + font-weight : bold; +} + +div.cdmHeader { + padding-bottom : 5px; +} + +div.cdmFooter { + font-size : x-small; + color : gray; + padding-top : 5px; +} + +div.cdmFooter input, div.cdmHeader input, div.cdmFooter img { + margin : 0px; +} + +div.cdmHeader, div.cdmHeader a { + color : gray; + font-size : x-small; +} + +div.cdmHeader a:hover { + color : #5050aa; +} + +div.cdmContent { +} diff --git a/tt-rss.php b/tt-rss.php index f76614c2e..13c2b17c5 100644 --- a/tt-rss.php +++ b/tt-rss.php @@ -209,8 +209,18 @@ </td> </tr> </table> - </td> -</tr><tr> + </td> +</tr> +<? if (get_pref($link, 'COMBINED_DISPLAY_MODE')) { ?> +<tr> + <td id="headlines" class="headlines2" valign="top"> + <iframe frameborder="0" name="headlines-frame" + id="headlines-frame" class="headlinesFrame" + src="backend.php?op=error&msg=No%20feed%20selected."></iframe> + </td> +</tr> +<? } else { ?> +<tr> <td id="headlines" class="headlines" valign="top"> <iframe frameborder="0" name="headlines-frame" id="headlines-frame" class="headlinesFrame" @@ -222,6 +232,7 @@ id="content-frame" class="contentFrame"> </iframe> </td> </tr> +<? } ?> <? if (get_pref($link, 'DISPLAY_FOOTER')) { ?> <tr> <td colspan="2" class="footer"> diff --git a/viewfeed.js b/viewfeed.js index 68555bde0..7047aaae2 100644 --- a/viewfeed.js +++ b/viewfeed.js @@ -226,14 +226,20 @@ function localHotkeyHandler(keycode) { } -function selectionToggleUnread() { +function selectionToggleUnread(cdm_mode) { try { if (!xmlhttp_ready(xmlhttp_rpc)) { printLockingError(); return; } - var rows = getSelectedTableRowIds("headlinesList", "RROW", "RCHK"); + var rows; + + if (cdm_mode) { + rows = cdmGetSelectedArticles(); + } else { + rows = getSelectedTableRowIds("headlinesList", "RROW", "RCHK"); + } for (i = 0; i < rows.length; i++) { var row = document.getElementById("RROW-" + rows[i]); @@ -266,14 +272,20 @@ function selectionToggleUnread() { } } -function selectionToggleMarked() { +function selectionToggleMarked(cdm_mode) { try { if (!xmlhttp_ready(xmlhttp_rpc)) { printLockingError(); return; } - var rows = getSelectedTableRowIds("headlinesList", "RROW", "RCHK"); + var rows; + + if (cdm_mode) { + rows = cdmGetSelectedArticles(); + } else { + rows = getSelectedTableRowIds("headlinesList", "RROW", "RCHK"); + } for (i = 0; i < rows.length; i++) { var row = document.getElementById("RROW-" + rows[i]); @@ -312,6 +324,46 @@ function selectionToggleMarked() { } } +function cdmGetSelectedArticles() { + var sel_articles = new Array(); + var container = document.getElementById("headlinesContainer"); + + for (i = 0; i < container.childNodes.length; i++) { + var child = container.childNodes[i]; + + if (child.id.match("RROW-") && child.className.match("Selected")) { + var c_id = child.id.replace("RROW-", ""); + sel_articles.push(c_id); + } + } + + return sel_articles; +} + +// mode = all,none,unread +function cdmSelectArticles(mode) { + var container = document.getElementById("headlinesContainer"); + + for (i = 0; i < container.childNodes.length; i++) { + var child = container.childNodes[i]; + + if (child.id.match("RROW-")) { +// var aid = child.id.replace("RROW-", ""); + if (mode == "all") { + if (!child.className.match("Selected")) { + child.className = child.className + "Selected"; + } + } else if (mode == "unread") { + if (child.className.match("Unread") && !child.className.match("Selected")) { + child.className = child.className + "Selected"; + } + } else { + child.className = child.className.replace("Selected", ""); + } + } + } +} + function init() { document.onkeydown = hotkey_handler; } |