##// END OF EJS Templates
Add dead_post class to the posts when thread reached bumplimit on autoupdate
neko259 -
r429:87abbf95 default
parent child Browse files
Show More
@@ -1,147 +1,164 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
31 31 function blink(node) {
32 32 var blinkCount = 2;
33 33 var blinkDelay = 250;
34 34
35 35 var nodeToAnimate = node;
36 36 for (var i = 0; i < blinkCount; i++) {
37 37 nodeToAnimate = nodeToAnimate.fadeOut(blinkDelay).fadeIn(blinkDelay);
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 addedPosts = data.added;
59 59 for (var i = 0; i < addedPosts.length; i++) {
60 60 var postText = addedPosts[i];
61 61
62 62 var post = $(postText);
63 63 post.appendTo(lastPost.parent());
64 64 addRefLinkPreview(post[0]);
65 65
66 66 lastPost = post;
67 67 blink(post);
68 68 }
69 69
70 70 var updatedPosts = data.updated;
71 71 for (var i = 0; i < updatedPosts.length; i++) {
72 72 var postText = updatedPosts[i];
73 73
74 74 var post = $(postText);
75 75 var postId = post.attr('id');
76 76
77 77 var oldPost = $('div.thread').children('.post[id=' + postId + ']');
78 78
79 79 oldPost.replaceWith(post);
80 80 addRefLinkPreview(post[0]);
81 81
82 82 blink(post);
83 83 }
84 84
85 85 // TODO Process deleted posts
86 86
87 87 lastUpdateTime = data.last_update;
88 88 loading = false;
89 89
90 90 if (bottom) {
91 91 var $target = $('html,body');
92 92 $target.animate({scrollTop: $target.height()}, 1000);
93 93 }
94 94
95 95 $('#reply-count').text(getReplyCount());
96 96 $('#image-count').text(getImageCount());
97 97
98 98 updateBumplimitProgress(data.added.length);
99 updatePostBumpableStatus();
99 100 })
100 101 .error(function(data) {
101 102 // TODO Show error message that server is unavailable?
102 103
103 104 loading = false;
104 105 });
105 106 }
106 107
107 108 function isPageBottom() {
108 109 var scroll = $(window).scrollTop() / ($(document).height()
109 110 - $(window).height())
110 111
111 112 return scroll == 1
112 113 }
113 114
114 115 function initAutoupdate() {
115 116 loading = false;
116 117
117 118 lastUpdateTime = $('.metapanel').attr('data-last-update');
118 119
119 120 setInterval(updateThread, THREAD_UPDATE_DELAY);
120 121 }
121 122
122 123 function getReplyCount() {
123 124 return $('.thread').children('.post').length
124 125 }
125 126
126 127 function getImageCount() {
127 128 return $('.thread').find('img').length
128 129 }
129 130
131 /**
132 * Update bumplimit progress bar
133 */
130 134 function updateBumplimitProgress(postDelta) {
131 135 var progressBar = $('#bumplimit_progress');
132 136 if (progressBar) {
133 137 var postsToLimitElement = $('#left_to_limit');
134 138
135 139 var oldPostsToLimit = parseInt(postsToLimitElement.text());
136 140 var postCount = getReplyCount();
137 141 var bumplimit = postCount - postDelta + oldPostsToLimit;
138 142
139 143 var newPostsToLimit = bumplimit - postCount;
140 if (newPostsToLimit < 0) {
141 progressBar.remove();
144 if (newPostsToLimit <= 0) {
145 $('.bar-bg').remove();
142 146 } else {
143 147 postsToLimitElement.text(newPostsToLimit);
144 148 progressBar.width((100 - postCount / bumplimit * 100.0) + '%');
145 149 }
146 150 }
147 151 }
152
153 /**
154 * If the bumplimit is reached, add dead_post class to all posts
155 */
156 function updatePostBumpableStatus() {
157 var postCount = getReplyCount();
158 var postsToLimitElement = $('#left_to_limit');
159 var postsToLimit = parseInt(postsToLimitElement.text());
160
161 if (postsToLimit <= 0) {
162 $('.thread').find('.post').addClass('dead_post');
163 }
164 }
@@ -1,48 +1,48 b''
1 1 = Features =
2 2 [DONE] Connecting tags to each other
3 3 [DONE] Connect posts to the replies (in messages), get rid of the JS reply map
4 4 [DONE] Better django admin pages to simplify admin operations
5 5 [DONE] Regen script to update all posts
6 6 [DONE] Remove jump links from refmaps
7 7 [DONE] Ban reasons. Split bans into 2 types "read-only" and "read
8 8 denied". Use second only for autoban for spam
9 9 [DONE] Clean up tests and make them run ALWAYS
10 10 [DONE] Use transactions in tests
11 11 [DONE] Thread autoupdate (JS + API)
12 12 [DONE] Split up post model into post and thread,
13 13 and move everything that is used only in 1st post to thread model.
14 14 [DONE] Show board speed in the lower panel (posts per day)
15 15
16 16 [NOT STARTED] Tree view (JS)
17 17 [NOT STARTED] Adding tags to images filename
18 18 [NOT STARTED] Federative network for s2s communication
19 19 [NOT STARTED] XMPP gate
20 20 [NOT STARTED] Bitmessage gate
21 21 [NOT STARTED] Notification engine
22 22 [NOT STARTED] Javascript disabling engine
23 23 [NOT STARTED] Group tags by first letter in all tags list
24 24 [NOT STARTED] Character counter in the post field
25 25 [NOT STARTED] Save image thumbnails size to the separate field
26 26 [NOT STARTED] Whitelist functionality. Permin autoban of an address
27 27 [NOT STARTED] Statistics module. Count views (optional, may result in bad
28 28 performance), posts per day/week/month, users (or IPs)
29 29 [NOT STARTED] Quote button next to "reply" for posts in thread to include full
30 30 post or its part (delimited by N characters) into quote of the new post.
31 31 [NOT STARTED] Ban confirmation page with reason
32 32 [NOT STARTED] Post deletion confirmation page
33 33 [NOT STARTED] Moderating page. Tags editing and adding
34 34 [NOT STARTED] Get thread graph image using pygraphviz
35 35 [NOT STARTED] Creating post via AJAX without reloading page
36 36 [NOT STARTED] Subscribing to tag via AJAX
37 37
38 38 = Bugs =
39 39 [DONE] Fix bug with creating threads from tag view
40 40 [DONE] Quote characters within quote causes quote parsing to fail
41 41
42 42 [IN PROGRESS] Replies, images, last update time in bottom panel doesn't change when
43 thread updates
43 thread updates (last update changing left)
44 44
45 45 = Testing =
46 46 [NOT STARTED] Make tests for every view
47 47 [NOT STARTED] Make tests for every model
48 48 [NOT STARTED] Make tests for every form
General Comments 0
You need to be logged in to leave comments. Login now