diff options
Diffstat (limited to 'templates/items.html')
-rw-r--r-- | templates/items.html | 83 |
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 }}" > |