summaryrefslogtreecommitdiff
path: root/templates/items.html
diff options
context:
space:
mode:
Diffstat (limited to 'templates/items.html')
-rw-r--r--templates/items.html83
1 files changed, 76 insertions, 7 deletions
diff --git a/templates/items.html b/templates/items.html
index 093b211..22adbba 100644
--- a/templates/items.html
+++ b/templates/items.html
@@ -64,10 +64,71 @@
64 </script> 64 </script>
65 65
66 <script type="text/javascript"> 66 <script type="text/javascript">
67 /*
68 * Viewport - jQuery selectors for finding elements in viewport
69 *
70 * Copyright (c) 2008-2009 Mika Tuupola
71 *
72 * Licensed under the MIT license:
73 * http://www.opensource.org/licenses/mit-license.php
74 *
75 * Project home:
76 * http://www.appelsiini.net/projects/viewport
77 *
78 */
79 (function($) {
80
81 $.belowthefold = function(element, settings) {
82 var fold = $(window).height() + $(window).scrollTop();
83 return fold <= $(element).offset().top - settings.threshold;
84 };
85
86 $.abovethetop = function(element, settings) {
87 var top = $(window).scrollTop();
88 return top >= $(element).offset().top + $(element).height() - settings.threshold;
89 };
90
91 $.rightofscreen = function(element, settings) {
92 var fold = $(window).width() + $(window).scrollLeft();
93 return fold <= $(element).offset().left - settings.threshold;
94 };
95
96 $.leftofscreen = function(element, settings) {
97 var left = $(window).scrollLeft();
98 return left >= $(element).offset().left + $(element).width() - settings.threshold;
99 };
100
101 $.inviewport = function(element, settings) {
102 return !$.rightofscreen(element, settings) && !$.leftofscreen(element, settings) && !$.belowthefold(element, settings) && !$.abovethetop(element, settings);
103 };
104
105 $.extend($.expr[':'], {
106 "below-the-fold": function(a, i, m) {
107 return $.belowthefold(a, {threshold : 0});
108 },
109 "above-the-top": function(a, i, m) {
110 return $.abovethetop(a, {threshold : 0});
111 },
112 "left-of-screen": function(a, i, m) {
113 return $.leftofscreen(a, {threshold : 0});
114 },
115 "right-of-screen": function(a, i, m) {
116 return $.rightofscreen(a, {threshold : 0});
117 },
118 "in-viewport": function(a, i, m) {
119 return $.inviewport(a, {threshold : 0});
120 }
121 });
122 })(jQuery);
123 </script>
124
125 <script type="text/javascript">
67 $(document).ready(function() { 126 $(document).ready(function() {
68 $("a.headline").on("click", function(event) { 127 $("a.headline").on("click", function(event) {
69 event.preventDefault(); 128 event.preventDefault();
70 var target = $(event.target); 129 var target = $(event.target);
130 $(".entries .highlighted").removeClass("highlighted");
131 target.parents("li").addClass("highlighted");
71 target.off("click"); 132 target.off("click");
72 $.ajax(target.parents("li").attr("data-url")).done(function(data) { 133 $.ajax(target.parents("li").attr("data-url")).done(function(data) {
73 if (data.no_content) { 134 if (data.no_content) {
@@ -115,9 +176,13 @@
115 var element = $(".entries .highlighted"); 176 var element = $(".entries .highlighted");
116 177
117 switch (event.keyCode) { 178 switch (event.keyCode) {
118 case 74: // J 179 case 74: // j
119 element.removeClass("highlighted"); 180 element.removeClass("highlighted");
120 181
182 if (event.shiftKey) {
183 element.find("a.headline").trigger("mark-read");
184 }
185
121 if (element.length == 0) { 186 if (element.length == 0) {
122 $(".entries li:first-child").first().addClass("highlighted"); 187 $(".entries li:first-child").first().addClass("highlighted");
123 } else { 188 } else {
@@ -129,9 +194,11 @@
129 } 194 }
130 } 195 }
131 196
132 $.scrollTo(".highlighted", { margin: true, offset: -50 }); 197 if (!$(".entries .highlighted").is(":in-viewport")) {
198 $.scrollTo(".entries .highlighted", { margin: true, offset: -50 });
199 }
133 break; 200 break;
134 case 75: // K 201 case 75: // k
135 element.removeClass("highlighted"); 202 element.removeClass("highlighted");
136 203
137 if (element.length == 0) { 204 if (element.length == 0) {
@@ -145,9 +212,11 @@
145 } 212 }
146 } 213 }
147 214
148 $.scrollTo(".highlighted", { margin: true, offset: -50 }); 215 if (!$(".entries .highlighted").is(":in-viewport")) {
216 $.scrollTo(".entries .highlighted", { margin: true, offset: -50 });
217 }
149 break; 218 break;
150 case 79: // O 219 case 79: // o
151 var target = $(element).attr("data-target-url"); 220 var target = $(element).attr("data-target-url");
152 if (target) { 221 if (target) {
153 window.open(target, "_blank"); 222 window.open(target, "_blank");
@@ -155,7 +224,7 @@
155 element.find("a.headline").trigger("click"); 224 element.find("a.headline").trigger("click");
156 } 225 }
157 break; 226 break;
158 case 82: // R 227 case 82: // r
159 element.find("a.headline").trigger("mark-read"); 228 element.find("a.headline").trigger("mark-read");
160 break; 229 break;
161 } 230 }
@@ -167,7 +236,7 @@
167 <h1>RSS Entries</h1> 236 <h1>RSS Entries</h1>
168 {% for feed, records in items %} 237 {% for feed, records in items %}
169 <div class="feed"> 238 <div class="feed">
170 <h2>{{ feed }} <a href="#" class="mark-all-read">Mark All Read</a></h2> 239 <h2>{{ feed }} ({{ records|length }}) <a href="#" class="mark-all-read">Mark All Read</a></h2>
171 <ul class="entries"> 240 <ul class="entries">
172 {% for record in records %} 241 {% for record in records %}
173 <li data-url="{{ record.self_link }}" > 242 <li data-url="{{ record.self_link }}" >