##// END OF EJS Templates
Fixed adding dead_post class to posts after bumplimit reached
neko259 -
r585:af8fdac8 default
parent child Browse files
Show More
@@ -1,270 +1,259 b''
1 1 /*
2 2 @licstart The following is the entire license notice for the
3 3 JavaScript code in this page.
4 4
5 5
6 6 Copyright (C) 2013 neko259
7 7
8 8 The JavaScript code in this page is free software: you can
9 9 redistribute it and/or modify it under the terms of the GNU
10 10 General Public License (GNU GPL) as published by the Free Software
11 11 Foundation, either version 3 of the License, or (at your option)
12 12 any later version. The code is distributed WITHOUT ANY WARRANTY;
13 13 without even the implied warranty of MERCHANTABILITY or FITNESS
14 14 FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
15 15
16 16 As additional permission under GNU GPL version 3 section 7, you
17 17 may distribute non-source (e.g., minimized or compacted) forms of
18 18 that code without the copy of the GNU GPL normally required by
19 19 section 4, provided you include this license notice and a URL
20 20 through which recipients can access the Corresponding Source.
21 21
22 22 @licend The above is the entire license notice
23 23 for the JavaScript code in this page.
24 24 */
25 25
26 26 var THREAD_UPDATE_DELAY = 10000;
27 27
28 28 var loading = false;
29 29 var lastUpdateTime = null;
30 30 var unreadPosts = 0
31 31
32 32 function blink(node) {
33 33 var blinkCount = 2;
34 34
35 35 var nodeToAnimate = node;
36 36 for (var i = 0; i < blinkCount; i++) {
37 37 nodeToAnimate = nodeToAnimate.fadeTo('fast', 0.5).fadeTo('fast', 1.0);
38 38 }
39 39 }
40 40
41 41 function updateThread() {
42 42 if (loading) {
43 43 return;
44 44 }
45 45
46 46 loading = true;
47 47
48 48 var threadPosts = $('div.thread').children('.post');
49 49
50 50 var lastPost = threadPosts.last();
51 51 var threadId = threadPosts.first().attr('id');
52 52
53 53 var diffUrl = '/api/diff_thread/' + threadId + '/' + lastUpdateTime + '/';
54 54 $.getJSON(diffUrl)
55 55 .success(function(data) {
56 56 var bottom = isPageBottom();
57 57
58 58 var lastUpdate = '';
59 59
60 60 var addedPosts = data.added;
61 61 for (var i = 0; i < addedPosts.length; i++) {
62 62 var postText = addedPosts[i];
63 63
64 64 var post = $(postText);
65 65
66 66 if (lastUpdate === '') {
67 67 lastUpdate = post.find('.pub_time').text();
68 68 }
69 69
70 70 post.appendTo(lastPost.parent());
71 71 addRefLinkPreview(post[0]);
72 72
73 73 lastPost = post;
74 74 blink(post);
75 75 }
76 76
77 77 var updatedPosts = data.updated;
78 78 for (var i = 0; i < updatedPosts.length; i++) {
79 79 var postText = updatedPosts[i];
80 80
81 81 var post = $(postText);
82 82
83 83 if (lastUpdate === '') {
84 84 lastUpdate = post.find('.pub_time').text();
85 85 }
86 86
87 87 var postId = post.attr('id');
88 88
89 89 var oldPost = $('div.thread').children('.post[id=' + postId + ']');
90 90
91 91 oldPost.replaceWith(post);
92 92 addRefLinkPreview(post[0]);
93 93
94 94 blink(post);
95 95 }
96 96
97 97 // TODO Process deleted posts
98 98
99 99 lastUpdateTime = data.last_update;
100 100 loading = false;
101 101
102 102 if (bottom) {
103 103 var $target = $('html,body');
104 104 $target.animate({scrollTop: $target.height()}, 1000);
105 105 }
106 106
107 107 var hasPostChanges = (updatedPosts.length > 0)
108 108 || (addedPosts.length > 0);
109 109 if (hasPostChanges) {
110 110 updateMetadataPanel(lastUpdate);
111 111 }
112 112
113 113 updateBumplimitProgress(data.added.length);
114 updatePostBumpableStatus();
115 114
116 115 if (data.added.length + data.updated.length > 0) {
117 116 showNewPostsTitle(data.added.length);
118 117 }
119 118 })
120 119 .error(function(data) {
121 120 // TODO Show error message that server is unavailable?
122 121
123 122 loading = false;
124 123 });
125 124 }
126 125
127 126 function isPageBottom() {
128 127 var scroll = $(window).scrollTop() / ($(document).height()
129 128 - $(window).height())
130 129
131 130 return scroll == 1
132 131 }
133 132
134 133 function initAutoupdate() {
135 134 loading = false;
136 135
137 136 lastUpdateTime = $('.metapanel').attr('data-last-update');
138 137
139 138 setInterval(updateThread, THREAD_UPDATE_DELAY);
140 139 }
141 140
142 141 function getReplyCount() {
143 142 return $('.thread').children('.post').length
144 143 }
145 144
146 145 function getImageCount() {
147 146 return $('.thread').find('img').length
148 147 }
149 148
150 149 function updateMetadataPanel(lastUpdate) {
151 150 var replyCountField = $('#reply-count');
152 151 var imageCountField = $('#image-count');
153 152
154 153 replyCountField.text(getReplyCount());
155 154 imageCountField.text(getImageCount());
156 155
157 156 if (lastUpdate !== '') {
158 157 var lastUpdateField = $('#last-update');
159 158 lastUpdateField.text(lastUpdate);
160 159 blink(lastUpdateField);
161 160 }
162 161
163 162 blink(replyCountField);
164 163 blink(imageCountField);
165 164 }
166 165
167 166 /**
168 167 * Update bumplimit progress bar
169 168 */
170 169 function updateBumplimitProgress(postDelta) {
171 170 var progressBar = $('#bumplimit_progress');
172 171 if (progressBar) {
173 172 var postsToLimitElement = $('#left_to_limit');
174 173
175 174 var oldPostsToLimit = parseInt(postsToLimitElement.text());
176 175 var postCount = getReplyCount();
177 176 var bumplimit = postCount - postDelta + oldPostsToLimit;
178 177
179 178 var newPostsToLimit = bumplimit - postCount;
180 179 if (newPostsToLimit <= 0) {
181 180 $('.bar-bg').remove();
181 $('.thread').children('.post').addClass('dead_post');
182 182 } else {
183 183 postsToLimitElement.text(newPostsToLimit);
184 184 progressBar.width((100 - postCount / bumplimit * 100.0) + '%');
185 185 }
186 186 }
187 187 }
188 188
189 /**
190 * If the bumplimit is reached, add dead_post class to all posts
191 */
192 function updatePostBumpableStatus() {
193 var postsToLimitElement = $('#left_to_limit');
194
195 if (postsToLimitElement === null) {
196 $('.thread').children('.post').addClass('dead_post');
197 }
198 }
199
200 189 var documentOriginalTitle = '';
201 190 /**
202 191 * Show 'new posts' text in the title if the document is not visible to a user
203 192 */
204 193 function showNewPostsTitle(newPostCount) {
205 194 if (document.hidden) {
206 195 if (documentOriginalTitle === '') {
207 196 documentOriginalTitle = document.title;
208 197 }
209 198 unreadPosts = unreadPosts + newPostCount;
210 199 document.title = '[' + unreadPosts + '] ' + documentOriginalTitle;
211 200
212 201 document.addEventListener('visibilitychange', function() {
213 202 if (documentOriginalTitle !== '') {
214 203 document.title = documentOriginalTitle;
215 204 documentOriginalTitle = '';
216 205 unreadPosts = 0;
217 206 }
218 207
219 208 document.removeEventListener('visibilitychange', null);
220 209 });
221 210 }
222 211 }
223 212
224 213 /**
225 214 * Clear all entered values in the form fields
226 215 */
227 216 function resetForm(form) {
228 217 form.find('input:text, input:password, input:file, select, textarea').val('');
229 218 form.find('input:radio, input:checkbox')
230 219 .removeAttr('checked').removeAttr('selected');
231 220 }
232 221
233 222
234 223 $(document).ready(function(){
235 224 initAutoupdate();
236 225
237 226 // Post form data over AJAX
238 227 var threadId = $('div.thread').children('.post').first().attr('id');;
239 228
240 229 var form = $('#form');
241 230 var options = {
242 231 success: updateOnPost,
243 232 url: '/api/add_post/' + threadId + '/',
244 233 };
245 234
246 235 form.ajaxForm(options);
247 236
248 237 function updateOnPost(response, statusText, xhr, $form) {
249 238 var json = $.parseJSON(response);
250 239 var status = json.status;
251 240
252 241 form.children('.form-errors').remove();
253 242
254 243 if (status === 'ok') {
255 244 resetForm(form);
256 245 updateThread();
257 246 } else {
258 247 var errors = json.errors;
259 248 for (var i = 0; i < errors.length; i++) {
260 249 var fieldErrors = errors[i];
261 250
262 251 var error = fieldErrors.errors;
263 252
264 253 var errorList = $('<div class="form-errors">' + error
265 254 + '<div>');
266 255 errorList.appendTo(form);
267 256 }
268 257 }
269 258 }
270 259 });
General Comments 0
You need to be logged in to leave comments. Login now