]> git.wh0rd.org - tt-rss.git/blame - FeedTree.js
allow checking of Uncategorized feeds
[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 },
452e75cc 22 getFeedValue: function(feed, is_cat, key) {
b8aa9ca7
AD
23 if (!this.store._itemsByIdentity) return undefined;
24
452e75cc 25 if (is_cat)
05f224a3
AD
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 },
452e75cc 33 getFeedName: function(feed, is_cat) {
05f224a3
AD
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 46
452e75cc 47 if (is_cat)
05f224a3
AD
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 },
692de159 55 getNextUnreadFeed: function (feed, is_cat) {
6a0906d1
AD
56 if (!this.store._itemsByIdentity)
57 return null;
58
692de159
AD
59 if (is_cat) {
60 treeItem = this.store._itemsByIdentity['CAT:' + feed];
61 items = this.store._arrayOfTopLevelItems;
62 } else {
63 treeItem = this.store._itemsByIdentity['FEED:' + feed];
64 items = this.store._arrayOfAllItems;
65 }
66
67 for (var i = 0; i < items.length; i++) {
68 if (items[i] == treeItem) {
69
70 for (j = i+1; j < items.length; j++) {
71 var unread = this.store.getValue(items[j], 'unread');
72 var id = this.store.getValue(items[j], 'id');
73
74 if (unread > 0 && (is_cat || id.match("FEED:"))) return items[j];
75 }
76
77 for (j = 0; j < i; j++) {
78 var unread = this.store.getValue(items[j], 'unread');
79 var id = this.store.getValue(items[j], 'id');
80
81 if (unread > 0 && (is_cat || id.match("FEED:"))) return items[j];
82 }
83 }
84 }
452e75cc 85
692de159
AD
86 return null;
87 },
88 hasCats: function() {
89 if (this.store && this.store._itemsByIdentity)
90 return this.store._itemsByIdentity['CAT:-1'] != undefined;
91 else
92 return false;
93 },
05f224a3
AD
94});
95
96dojo.declare("fox.FeedTree", dijit.Tree, {
97 _createTreeNode: function(args) {
98 var tnode = new dijit._TreeNode(args);
452e75cc 99
05f224a3
AD
100 if (args.item.icon)
101 tnode.iconNode.src = args.item.icon[0];
102
997429c2
AD
103 var id = args.item.id[0];
104 var bare_id = parseInt(id.substr(id.indexOf(':')+1));
105
9fe80bcd
AD
106 if (bare_id < -10) {
107 var span = dojo.doc.createElement('span');
108 var fg_color = args.item.fg_color[0];
109 var bg_color = args.item.bg_color[0];
110
111 span.innerHTML = "&alpha;";
112 span.className = 'labelColorIndicator';
113 span.setStyle({
114 color: fg_color,
115 backgroundColor: bg_color});
116
117 dojo.place(span, tnode.iconNode, 'replace');
118 }
119
997429c2
AD
120 if (id.match("FEED:") && bare_id > 0) {
121 var menu = new dijit.Menu();
122 menu.row_id = bare_id;
123
124 menu.addChild(new dijit.MenuItem({
125 label: __("Edit feed"),
126 onClick: function() {
f9c388f5 127 editFeed(this.getParent().row_id);
997429c2
AD
128 }}));
129
130 menu.addChild(new dijit.MenuItem({
131 label: __("Update feed"),
132 onClick: function() {
133 scheduleFeedUpdate(this.getParent().row_id, false);
134 }}));
135
136 menu.bindDomNode(tnode.domNode);
137 tnode._menu = menu;
138 }
139
947daa10 140 //tnode.labelNode.innerHTML = args.label;
05f224a3
AD
141 return tnode;
142 },
143 getIconClass: function (item, opened) {
144 return (!item || this.model.mayHaveChildren(item)) ? (opened ? "dijitFolderOpened" : "dijitFolderClosed") : "feedIcon";
145 },
146 getLabelClass: function (item, opened) {
147 return (item.unread == 0) ? "dijitTreeLabel" : "dijitTreeLabel Unread";
148 },
149 getRowClass: function (item, opened) {
452e75cc 150 return (!item.error || item.error == '') ? "dijitTreeRow" :
05f224a3
AD
151 "dijitTreeRow Error";
152 },
153 getLabel: function(item) {
cb2c7faa
AD
154 var name = String(item.name);
155
156 /* Horrible */
906fc5b7
AD
157 name = name.replace(/&quot;/g, "\"");
158 name = name.replace(/&amp;/g, "&");
159 name = name.replace(/&mdash;/g, "-");
160 name = name.replace(/&lt;/g, "<");
161 name = name.replace(/&gt;/g, ">");
cb2c7faa 162
05f224a3 163 if (item.unread > 0) {
cb2c7faa 164 return name + " (" + item.unread + ")";
05f224a3 165 } else {
cb2c7faa 166 return name;
05f224a3
AD
167 }
168 },
169 selectFeed: function(feed, is_cat) {
452e75cc 170 if (is_cat)
05f224a3
AD
171 treeNode = this._itemNodesMap['CAT:' + feed];
172 else
173 treeNode = this._itemNodesMap['FEED:' + feed];
174
175 if (treeNode) {
176 treeNode = treeNode[0];
177 if (!is_cat) this._expandNode(treeNode);
81bea17a 178 this.set("selectedNodes", [treeNode]);
05f224a3
AD
179 }
180 },
181 setFeedIcon: function(feed, is_cat, src) {
452e75cc 182 if (is_cat)
05f224a3
AD
183 treeNode = this._itemNodesMap['CAT:' + feed];
184 else
185 treeNode = this._itemNodesMap['FEED:' + feed];
186
187 if (treeNode) {
188 treeNode = treeNode[0];
189 treeNode.iconNode.src = src;
190 return true;
191 }
192 return false;
193 },
194 setFeedExpandoIcon: function(feed, is_cat, src) {
452e75cc 195 if (is_cat)
05f224a3
AD
196 treeNode = this._itemNodesMap['CAT:' + feed];
197 else
198 treeNode = this._itemNodesMap['FEED:' + feed];
199
200 if (treeNode) {
201 treeNode = treeNode[0];
202 treeNode.expandoNode.src = src;
203 return true;
204 }
205
206 return false;
207 },
208 hasCats: function() {
692de159 209 return this.model.hasCats();
05f224a3
AD
210 },
211 hideRead: function (hide, show_special) {
212 if (this.hasCats()) {
213
214 var tree = this;
215 var cats = this.model.store._arrayOfTopLevelItems;
452e75cc 216
05f224a3
AD
217 cats.each(function(cat) {
218 var cat_unread = tree.hideReadFeeds(cat.items, hide, show_special);
452e75cc 219
05f224a3
AD
220 var id = String(cat.id);
221 var node = tree._itemNodesMap[id];
222 var bare_id = parseInt(id.substr(id.indexOf(":")+1));
452e75cc 223
05f224a3
AD
224 if (node) {
225 var check_unread = tree.model.getFeedUnread(bare_id, true);
452e75cc 226
05f224a3 227 if (hide && cat_unread == 0 && check_unread == 0) {
452e75cc 228 Effect.Fade(node[0].rowNode, {duration : 0.3,
05f224a3
AD
229 queue: { position: 'end', scope: 'FFADE-' + id, limit: 1 }});
230 } else {
231 Element.show(node[0].rowNode);
232 ++cat_unread;
233 }
452e75cc 234 }
05f224a3 235 });
05f224a3
AD
236
237 } else {
452e75cc 238 this.hideReadFeeds(this.model.store._arrayOfTopLevelItems, hide,
05f224a3
AD
239 show_special);
240 }
241 },
242 hideReadFeeds: function (items, hide, show_special) {
243 var tree = this;
244 var cat_unread = 0;
245
246 items.each(function(feed) {
247 var id = String(feed.id);
248 var bare_id = parseInt(feed.bare_id);;
452e75cc 249
05f224a3
AD
250 var unread = feed.unread[0];
251 var node = tree._itemNodesMap[id];
452e75cc 252
05f224a3
AD
253 if (node) {
254 if (hide && unread == 0 && (bare_id > 0 || !show_special)) {
452e75cc 255 Effect.Fade(node[0].rowNode, {duration : 0.3,
05f224a3
AD
256 queue: { position: 'end', scope: 'FFADE-' + id, limit: 1 }});
257 } else {
258 Element.show(node[0].rowNode);
259 ++cat_unread;
260 }
261 }
262 });
452e75cc 263
05f224a3
AD
264 return cat_unread;
265 },
7613280a
AD
266 collapseCat: function(id) {
267 if (!this.model.hasCats()) return;
268
269 var tree = this;
270
271 var node = tree._itemNodesMap['CAT:' + id][0];
272 var item = tree.model.store._itemsByIdentity['CAT:' + id];
273
274 if (node && item) {
275 var hidden = tree.model.store.getValue(item, 'hidden');
276
452e75cc 277 if (hidden)
7613280a
AD
278 tree._expandNode(node);
279 else
280 tree._collapseNode(node);
281
282 tree.model.store.setValue(item, 'hidden', !hidden);
283 }
284 },
1a709d21
AD
285 collapseHiddenCats: function() {
286 if (!this.model.hasCats()) return;
287
288 var cats = this.model.store._arrayOfTopLevelItems;
289 var tree = this;
290
291 dojo.forEach(cats, function(cat) {
292 var hidden = tree.model.store.getValue(cat, 'hidden');
293 var id = tree.model.store.getValue(cat, 'id');
294 var node = tree._itemNodesMap[id][0];
295
452e75cc 296 if (hidden)
1a709d21
AD
297 tree._collapseNode(node);
298 else
299 tree._expandNode(node);
300
301 });
302 },
452e75cc
AD
303 getVisibleUnreadFeeds: function() {
304 var items = this.model.store._arrayOfAllItems;
305 var rv = [];
306
307 for (var i = 0; i < items.length; i++) {
308 var id = String(items[i].id);
309 var box = this._itemNodesMap[id];
310
311 if (box) {
312 var row = box[0].rowNode;
313 var cat = false;
314
315 try {
316 cat = box[0].rowNode.parentNode.parentNode;
317 } catch (e) { }
318
319 if (row) {
320 if (Element.visible(row) && (!cat || Element.visible(cat))) {
321 var feed_id = String(items[i].bare_id);
322 var is_cat = !id.match('FEED:');
323 var unread = this.model.getFeedUnread(feed_id, is_cat);
324
325 if (unread > 0)
326 rv.push([feed_id, is_cat]);
327
328 }
329 }
330 }
331 }
332
333 return rv;
334 },
d026d372
AD
335 getNextFeed: function (feed, is_cat) {
336 if (is_cat) {
337 treeItem = this.model.store._itemsByIdentity['CAT:' + feed];
338 } else {
339 treeItem = this.model.store._itemsByIdentity['FEED:' + feed];
340 }
341
342 items = this.model.store._arrayOfAllItems;
343 var item = items[0];
344
345 for (var i = 0; i < items.length; i++) {
346 if (items[i] == treeItem) {
347
348 for (j = i+1; j < items.length; j++) {
452e75cc 349 var id = String(items[j].id);
d026d372
AD
350 var box = this._itemNodesMap[id];
351
352 if (box) {
c2b2869c
AD
353 var row = box[0].rowNode;
354 var cat = box[0].rowNode.parentNode.parentNode;
d026d372 355
c2b2869c 356 if (Element.visible(cat) && Element.visible(row)) {
d026d372
AD
357 item = items[j];
358 break;
359 }
360 }
361 }
362 break;
363 }
364 }
365
366 if (item) {
452e75cc 367 return [this.model.store.getValue(item, 'bare_id'),
d026d372
AD
368 !this.model.store.getValue(item, 'id').match('FEED:')];
369 } else {
370 return false;
371 }
372 },
373 getPreviousFeed: function (feed, is_cat) {
374 if (is_cat) {
375 treeItem = this.model.store._itemsByIdentity['CAT:' + feed];
376 } else {
377 treeItem = this.model.store._itemsByIdentity['FEED:' + feed];
378 }
379
380 items = this.model.store._arrayOfAllItems;
381 var item = items[0];
382
383 for (var i = 0; i < items.length; i++) {
384 if (items[i] == treeItem) {
385
386 for (j = i-1; j > 0; j--) {
452e75cc 387 var id = String(items[j].id);
d026d372
AD
388 var box = this._itemNodesMap[id];
389
390 if (box) {
c2b2869c
AD
391 var row = box[0].rowNode;
392 var cat = box[0].rowNode.parentNode.parentNode;
d026d372 393
c2b2869c 394 if (Element.visible(cat) && Element.visible(row)) {
d026d372
AD
395 item = items[j];
396 break;
397 }
398 }
c2b2869c 399
d026d372
AD
400 }
401 break;
402 }
403 }
404
405 if (item) {
452e75cc 406 return [this.model.store.getValue(item, 'bare_id'),
d026d372
AD
407 !this.model.store.getValue(item, 'id').match('FEED:')];
408 } else {
409 return false;
410 }
411
412 },
413
05f224a3 414});