summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backend.php163
-rw-r--r--functions.js15
-rw-r--r--schema/ttrss_schema_mysql.sql2
-rw-r--r--schema/ttrss_schema_pgsql.sql2
-rw-r--r--schema/upgrade-1.1-1.1.1-mysql.sql2
-rw-r--r--schema/upgrade-1.1-1.1.1-pgsql.sql2
-rw-r--r--tt-rss.css61
-rw-r--r--tt-rss.php15
-rw-r--r--viewfeed.js60
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>
- &nbsp;&nbsp;
- 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>
+ &nbsp;&nbsp;
+ 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>
+ &nbsp;&nbsp;
+ 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 "&nbsp;(<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;
}