]> git.wh0rd.org - tt-rss.git/blame - FeedTree.js
re-add ForceUpdate to viewfeed for update debugging, add some filter debugging
[tt-rss.git] / FeedTree.js
CommitLineData
05f224a3
AD
1dojo.provide("fox.FeedTree");
2dojo.provide("fox.FeedStoreModel");
3
4dojo.require("dijit.Tree");
997429c2 5dojo.require("dijit.Menu");
05f224a3
AD
6
7dojo.declare("fox.FeedStoreModel", dijit.tree.ForestStoreModel, {
1beea800
AD
8 getItemsInCategory: function (id) {
9 if (!this.store._itemsByIdentity) return undefined;
10
11 cat = this.store._itemsByIdentity['CAT:' + id];
12
13 if (cat && cat.items)
14 return cat.items;
15 else
16 return undefined;
17
18 },
05f224a3
AD
19 getItemById: function(id) {
20 return this.store._itemsByIdentity[id];
21 },
22 getFeedValue: function(feed, is_cat, key) {
b8aa9ca7
AD
23 if (!this.store._itemsByIdentity) return undefined;
24
05f224a3
AD
25 if (is_cat)
26 treeItem = this.store._itemsByIdentity['CAT:' + feed];
27 else
28 treeItem = this.store._itemsByIdentity['FEED:' + feed];
29
30 if (treeItem)
31 return this.store.getValue(treeItem, key);
32 },
33 getFeedName: function(feed, is_cat) {
34 return this.getFeedValue(feed, is_cat, 'name');
35 },
36 getFeedUnread: function(feed, is_cat) {
37 var unread = parseInt(this.getFeedValue(feed, is_cat, 'unread'));
38 return (isNaN(unread)) ? 0 : unread;
39 },
40 setFeedUnread: function(feed, is_cat, unread) {
41 return this.setFeedValue(feed, is_cat, 'unread', parseInt(unread));
42 },
43 setFeedValue: function(feed, is_cat, key, value) {
44 if (!value) value = '';
b8aa9ca7 45 if (!this.store._itemsByIdentity) return undefined;
05f224a3
AD
46
47 if (is_cat)
48 treeItem = this.store._itemsByIdentity['CAT:' + feed];
49 else
50 treeItem = this.store._itemsByIdentity['FEED:' + feed];
51
52 if (treeItem)
53 return this.store.setValue(treeItem, key, value);
54 },
69de6b46
AD
55 getNextFeed: function (feed, is_cat) {
56 if (is_cat) {
57 treeItem = this.store._itemsByIdentity['CAT:' + feed];
58 } else {
59 treeItem = this.store._itemsByIdentity['FEED:' + feed];
60 }
61
62 items = this.store._arrayOfAllItems;
63 var item = items[0];
64
65 for (var i = 0; i < items.length; i++) {
66 if (items[i] == treeItem) {
67 item = items[i+1];
68 break;
69 }
70 }
71
72 if (item) {
73 return [this.store.getValue(item, 'bare_id'),
74 !this.store.getValue(item, 'id').match('FEED:')];
75 } else {
76 return false;
77 }
78 },
79 getPreviousFeed: function (feed, is_cat) {
80 if (is_cat) {
81 treeItem = this.store._itemsByIdentity['CAT:' + feed];
82 } else {
83 treeItem = this.store._itemsByIdentity['FEED:' + feed];
84 }
85
86 items = this.store._arrayOfAllItems;
87 var item = items[items.length-1];
88
89 for (var i = 0; i < items.length; i++) {
90 if (items[i] == treeItem) {
91 item = items[i-1];
92 break;
93 }
94 }
95
96 if (item) {
97 return [this.store.getValue(item, 'bare_id'),
98 !this.store.getValue(item, 'id').match('FEED:')];
99 } else {
100 return false;
101 }
102 },
103
692de159
AD
104 getNextUnreadFeed: function (feed, is_cat) {
105 if (is_cat) {
106 treeItem = this.store._itemsByIdentity['CAT:' + feed];
107 items = this.store._arrayOfTopLevelItems;
108 } else {
109 treeItem = this.store._itemsByIdentity['FEED:' + feed];
110 items = this.store._arrayOfAllItems;
111 }
112
113 for (var i = 0; i < items.length; i++) {
114 if (items[i] == treeItem) {
115
116 for (j = i+1; j < items.length; j++) {
117 var unread = this.store.getValue(items[j], 'unread');
118 var id = this.store.getValue(items[j], 'id');
119
120 if (unread > 0 && (is_cat || id.match("FEED:"))) return items[j];
121 }
122
123 for (j = 0; j < i; j++) {
124 var unread = this.store.getValue(items[j], 'unread');
125 var id = this.store.getValue(items[j], 'id');
126
127 if (unread > 0 && (is_cat || id.match("FEED:"))) return items[j];
128 }
129 }
130 }
131
132 return null;
133 },
134 hasCats: function() {
135 if (this.store && this.store._itemsByIdentity)
136 return this.store._itemsByIdentity['CAT:-1'] != undefined;
137 else
138 return false;
139 },
05f224a3
AD
140});
141
142dojo.declare("fox.FeedTree", dijit.Tree, {
143 _createTreeNode: function(args) {
144 var tnode = new dijit._TreeNode(args);
997429c2 145
05f224a3
AD
146 if (args.item.icon)
147 tnode.iconNode.src = args.item.icon[0];
148
997429c2
AD
149 var id = args.item.id[0];
150 var bare_id = parseInt(id.substr(id.indexOf(':')+1));
151
9fe80bcd
AD
152 if (bare_id < -10) {
153 var span = dojo.doc.createElement('span');
154 var fg_color = args.item.fg_color[0];
155 var bg_color = args.item.bg_color[0];
156
157 span.innerHTML = "&alpha;";
158 span.className = 'labelColorIndicator';
159 span.setStyle({
160 color: fg_color,
161 backgroundColor: bg_color});
162
163 dojo.place(span, tnode.iconNode, 'replace');
164 }
165
997429c2
AD
166 if (id.match("FEED:") && bare_id > 0) {
167 var menu = new dijit.Menu();
168 menu.row_id = bare_id;
169
170 menu.addChild(new dijit.MenuItem({
171 label: __("Edit feed"),
172 onClick: function() {
f9c388f5 173 editFeed(this.getParent().row_id);
997429c2
AD
174 }}));
175
176 menu.addChild(new dijit.MenuItem({
177 label: __("Update feed"),
178 onClick: function() {
179 scheduleFeedUpdate(this.getParent().row_id, false);
180 }}));
181
182 menu.bindDomNode(tnode.domNode);
183 tnode._menu = menu;
184 }
185
947daa10 186 //tnode.labelNode.innerHTML = args.label;
05f224a3
AD
187 return tnode;
188 },
189 getIconClass: function (item, opened) {
190 return (!item || this.model.mayHaveChildren(item)) ? (opened ? "dijitFolderOpened" : "dijitFolderClosed") : "feedIcon";
191 },
192 getLabelClass: function (item, opened) {
193 return (item.unread == 0) ? "dijitTreeLabel" : "dijitTreeLabel Unread";
194 },
195 getRowClass: function (item, opened) {
196 return (!item.error || item.error == '') ? "dijitTreeRow" :
197 "dijitTreeRow Error";
198 },
199 getLabel: function(item) {
cb2c7faa
AD
200 var name = String(item.name);
201
202 /* Horrible */
203 name = name.replace("&quot;", "\"");
204 name = name.replace("&amp;", "&");
205 name = name.replace("&mdash;", "-");
206 name = name.replace("&lt;", "<");
207 name = name.replace("&gt;", ">");
208
05f224a3 209 if (item.unread > 0) {
cb2c7faa 210 return name + " (" + item.unread + ")";
05f224a3 211 } else {
cb2c7faa 212 return name;
05f224a3
AD
213 }
214 },
215 selectFeed: function(feed, is_cat) {
216 if (is_cat)
217 treeNode = this._itemNodesMap['CAT:' + feed];
218 else
219 treeNode = this._itemNodesMap['FEED:' + feed];
220
221 if (treeNode) {
222 treeNode = treeNode[0];
223 if (!is_cat) this._expandNode(treeNode);
224 this._selectNode(treeNode);
225 }
226 },
227 setFeedIcon: function(feed, is_cat, src) {
228 if (is_cat)
229 treeNode = this._itemNodesMap['CAT:' + feed];
230 else
231 treeNode = this._itemNodesMap['FEED:' + feed];
232
233 if (treeNode) {
234 treeNode = treeNode[0];
235 treeNode.iconNode.src = src;
236 return true;
237 }
238 return false;
239 },
240 setFeedExpandoIcon: function(feed, is_cat, src) {
241 if (is_cat)
242 treeNode = this._itemNodesMap['CAT:' + feed];
243 else
244 treeNode = this._itemNodesMap['FEED:' + feed];
245
246 if (treeNode) {
247 treeNode = treeNode[0];
248 treeNode.expandoNode.src = src;
249 return true;
250 }
251
252 return false;
253 },
254 hasCats: function() {
692de159 255 return this.model.hasCats();
05f224a3
AD
256 },
257 hideRead: function (hide, show_special) {
258 if (this.hasCats()) {
259
260 var tree = this;
261 var cats = this.model.store._arrayOfTopLevelItems;
262
263 cats.each(function(cat) {
264 var cat_unread = tree.hideReadFeeds(cat.items, hide, show_special);
265
266 var id = String(cat.id);
267 var node = tree._itemNodesMap[id];
268 var bare_id = parseInt(id.substr(id.indexOf(":")+1));
269
270 if (node) {
271 var check_unread = tree.model.getFeedUnread(bare_id, true);
272
273 if (hide && cat_unread == 0 && check_unread == 0) {
274 Effect.Fade(node[0].rowNode, {duration : 0.3,
275 queue: { position: 'end', scope: 'FFADE-' + id, limit: 1 }});
276 } else {
277 Element.show(node[0].rowNode);
278 ++cat_unread;
279 }
280 }
281 });
05f224a3
AD
282
283 } else {
284 this.hideReadFeeds(this.model.store._arrayOfTopLevelItems, hide,
285 show_special);
286 }
287 },
288 hideReadFeeds: function (items, hide, show_special) {
289 var tree = this;
290 var cat_unread = 0;
291
292 items.each(function(feed) {
293 var id = String(feed.id);
294 var bare_id = parseInt(feed.bare_id);;
295
296 var unread = feed.unread[0];
297 var node = tree._itemNodesMap[id];
298
299 if (node) {
300 if (hide && unread == 0 && (bare_id > 0 || !show_special)) {
301 Effect.Fade(node[0].rowNode, {duration : 0.3,
302 queue: { position: 'end', scope: 'FFADE-' + id, limit: 1 }});
303 } else {
304 Element.show(node[0].rowNode);
305 ++cat_unread;
306 }
307 }
308 });
309
310 return cat_unread;
311 },
7613280a
AD
312 collapseCat: function(id) {
313 if (!this.model.hasCats()) return;
314
315 var tree = this;
316
317 var node = tree._itemNodesMap['CAT:' + id][0];
318 var item = tree.model.store._itemsByIdentity['CAT:' + id];
319
320 if (node && item) {
321 var hidden = tree.model.store.getValue(item, 'hidden');
322
323 if (hidden)
324 tree._expandNode(node);
325 else
326 tree._collapseNode(node);
327
328 tree.model.store.setValue(item, 'hidden', !hidden);
329 }
330 },
1a709d21
AD
331 collapseHiddenCats: function() {
332 if (!this.model.hasCats()) return;
333
334 var cats = this.model.store._arrayOfTopLevelItems;
335 var tree = this;
336
337 dojo.forEach(cats, function(cat) {
338 var hidden = tree.model.store.getValue(cat, 'hidden');
339 var id = tree.model.store.getValue(cat, 'id');
340 var node = tree._itemNodesMap[id][0];
341
342 if (hidden)
343 tree._collapseNode(node);
344 else
345 tree._expandNode(node);
346
347 });
348 },
05f224a3 349});