]>
git.wh0rd.org - tt-rss.git/blob - js/FeedTree.js
1 dojo
.provide("fox.FeedTree");
2 dojo
.provide("fox.FeedStoreModel");
4 dojo
.require("dijit.Tree");
5 dojo
.require("dijit.Menu");
7 dojo
.declare("fox.FeedStoreModel", dijit
.tree
.ForestStoreModel
, {
8 getItemsInCategory: function (id
) {
9 if (!this.store
._itemsByIdentity
) return undefined;
11 cat
= this.store
._itemsByIdentity
['CAT:' + id
];
19 getItemById: function(id
) {
20 return this.store
._itemsByIdentity
[id
];
22 getFeedValue: function(feed
, is_cat
, key
) {
23 if (!this.store
._itemsByIdentity
) return undefined;
26 treeItem
= this.store
._itemsByIdentity
['CAT:' + feed
];
28 treeItem
= this.store
._itemsByIdentity
['FEED:' + feed
];
31 return this.store
.getValue(treeItem
, key
);
33 getFeedName: function(feed
, is_cat
) {
34 return this.getFeedValue(feed
, is_cat
, 'name');
36 getFeedUnread: function(feed
, is_cat
) {
37 var unread
= parseInt(this.getFeedValue(feed
, is_cat
, 'unread'));
38 return (isNaN(unread
)) ? 0 : unread
;
40 setFeedUnread: function(feed
, is_cat
, unread
) {
41 return this.setFeedValue(feed
, is_cat
, 'unread', parseInt(unread
));
43 setFeedValue: function(feed
, is_cat
, key
, value
) {
44 if (!value
) value
= '';
45 if (!this.store
._itemsByIdentity
) return undefined;
48 treeItem
= this.store
._itemsByIdentity
['CAT:' + feed
];
50 treeItem
= this.store
._itemsByIdentity
['FEED:' + feed
];
53 return this.store
.setValue(treeItem
, key
, value
);
55 getNextUnreadFeed: function (feed
, is_cat
) {
56 if (!this.store
._itemsByIdentity
)
60 treeItem
= this.store
._itemsByIdentity
['CAT:' + feed
];
61 items
= this.store
._arrayOfTopLevelItems
;
63 treeItem
= this.store
._itemsByIdentity
['FEED:' + feed
];
64 items
= this.store
._arrayOfAllItems
;
67 for (var i
= 0; i
< items
.length
; i
++) {
68 if (items
[i
] == treeItem
) {
70 for (var 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');
74 if (unread
> 0 && (is_cat
|| id
.match("FEED:"))) return items
[j
];
77 for (var j
= 0; j
< i
; j
++) {
78 var unread
= this.store
.getValue(items
[j
], 'unread');
79 var id
= this.store
.getValue(items
[j
], 'id');
81 if (unread
> 0 && (is_cat
|| id
.match("FEED:"))) return items
[j
];
89 if (this.store
&& this.store
._itemsByIdentity
)
90 return this.store
._itemsByIdentity
['CAT:-1'] != undefined;
96 dojo
.declare("fox.FeedTree", dijit
.Tree
, {
97 _onKeyPress: function(/* Event */ e
) {
98 return; // Stop dijit.Tree from interpreting keystrokes
100 _createTreeNode: function(args
) {
101 var tnode
= new dijit
._TreeNode(args
);
104 tnode
.iconNode
.src
= args
.item
.icon
[0];
106 var id
= args
.item
.id
[0];
107 var bare_id
= parseInt(id
.substr(id
.indexOf(':')+1));
110 var span
= dojo
.doc
.createElement('span');
111 var fg_color
= args
.item
.fg_color
[0];
112 var bg_color
= args
.item
.bg_color
[0];
114 span
.innerHTML
= "α";
115 span
.className
= 'labelColorIndicator';
118 backgroundColor
: bg_color
});
120 dojo
.place(span
, tnode
.iconNode
, 'replace');
123 if (id
.match("CAT:") && bare_id
> 0) {
124 param
= dojo
.doc
.createElement('span');
125 param
.className
= 'feedParam';
126 param
.innerHTML
= "";
127 dojo
.place(param
, tnode
.labelNode
, 'after');
128 tnode
._paramNode
= param
;
131 if (id
.match("FEED:")) {
132 var menu
= new dijit
.Menu();
133 menu
.row_id
= bare_id
;
135 menu
.addChild(new dijit
.MenuItem({
136 label
: __("Mark as read"),
137 onClick: function() {
138 catchupFeed(this.getParent().row_id
);
142 menu
.addChild(new dijit
.MenuItem({
143 label
: __("Edit feed"),
144 onClick: function() {
145 editFeed(this.getParent().row_id
, false);
148 menu
.addChild(new dijit
.MenuItem({
149 label
: __("Update feed"),
150 onClick: function() {
151 scheduleFeedUpdate(this.getParent().row_id
, false);
155 menu
.bindDomNode(tnode
.domNode
);
159 if (id
.match("CAT:") && bare_id
> 0) {
160 var menu
= new dijit
.Menu();
161 menu
.row_id
= bare_id
;
163 menu
.addChild(new dijit
.MenuItem({
164 label
: __("Mark as read"),
165 onClick: function() {
166 catchupFeed(this.getParent().row_id
, true);
169 menu
.bindDomNode(tnode
.domNode
);
173 //tnode.labelNode.innerHTML = args.label;
176 getIconClass: function (item
, opened
) {
177 return (!item
|| this.model
.mayHaveChildren(item
)) ? (opened
? "dijitFolderOpened" : "dijitFolderClosed") : "feedIcon";
179 getLabelClass: function (item
, opened
) {
180 return (item
.unread
== 0) ? "dijitTreeLabel" : "dijitTreeLabel Unread";
182 getRowClass: function (item
, opened
) {
183 return (!item
.error
|| item
.error
== '') ? "dijitTreeRow" :
184 "dijitTreeRow Error";
186 getLabel: function(item
) {
187 var name
= String(item
.name
);
190 name
= name
.replace(/"/g, "\"");
191 name
= name
.replace(/&/g, "&");
192 name
= name
.replace(/—/g, "-");
193 name
= name
.replace(/</g, "<");
194 name
= name
.replace(/>/g, ">");
198 if (item
.unread
> 0) {
199 label
= name
+ " (" + item
.unread
+ ")";
206 selectFeed: function(feed
, is_cat
) {
208 treeNode
= this._itemNodesMap
['CAT:' + feed
];
210 treeNode
= this._itemNodesMap
['FEED:' + feed
];
213 treeNode
= treeNode
[0];
214 if (!is_cat
) this._expandNode(treeNode
);
215 this.set("selectedNodes", [treeNode
]);
218 setFeedIcon: function(feed
, is_cat
, src
) {
220 treeNode
= this._itemNodesMap
['CAT:' + feed
];
222 treeNode
= this._itemNodesMap
['FEED:' + feed
];
225 treeNode
= treeNode
[0];
226 treeNode
.iconNode
.src
= src
;
231 setFeedExpandoIcon: function(feed
, is_cat
, src
) {
233 treeNode
= this._itemNodesMap
['CAT:' + feed
];
235 treeNode
= this._itemNodesMap
['FEED:' + feed
];
238 treeNode
= treeNode
[0];
239 treeNode
.expandoNode
.src
= src
;
245 hasCats: function() {
246 return this.model
.hasCats();
248 hideReadCat: function (cat
, hide
, show_special
) {
249 if (this.hasCats()) {
252 if (cat
&& cat
.items
) {
253 cat
.items
.each(function(child
) {
255 tree
.hideReadCat(child
, hide
, show_special
);
259 var cat_unread
= tree
.hideReadFeeds(cat
.items
, hide
, show_special
);
261 var id
= String(cat
.id
);
262 var node
= tree
._itemNodesMap
[id
];
263 var bare_id
= parseInt(id
.substr(id
.indexOf(":")+1));
266 var check_unread
= tree
.model
.getFeedUnread(bare_id
, true);
267 var check_param
= tree
.model
.getFeedValue(bare_id
, true, "child_unread");
269 if (hide
&& cat_unread
== 0 && check_unread
== 0 && check_param
== 0) {
270 Effect
.Fade(node
[0].rowNode
, {duration
: 0.3,
271 queue
: { position
: 'end', scope
: 'FFADE-' + id
, limit
: 1 }});
273 Element
.show(node
[0].rowNode
);
280 hideRead: function (hide
, show_special
) {
281 if (this.hasCats()) {
284 var cats
= this.model
.store
._arrayOfTopLevelItems
;
286 cats
.each(function(cat
) {
287 tree
.hideReadCat(cat
, hide
, show_special
);
291 this.hideReadFeeds(this.model
.store
._arrayOfTopLevelItems
, hide
,
295 hideReadFeeds: function (items
, hide
, show_special
) {
299 items
.each(function(feed
) {
300 var id
= String(feed
.id
);
302 if (!id
.match("^CAT:")) {
303 var bare_id
= parseInt(feed
.bare_id
);;
305 var unread
= feed
.unread
[0];
306 var node
= tree
._itemNodesMap
[id
];
309 if (hide
&& unread
== 0 && (bare_id
> 0 || !show_special
)) {
310 Effect
.Fade(node
[0].rowNode
, {duration
: 0.3,
311 queue
: { position
: 'end', scope
: 'FFADE-' + id
, limit
: 1 }});
313 Element
.show(node
[0].rowNode
);
322 collapseCat: function(id
) {
323 if (!this.model
.hasCats()) return;
327 var node
= tree
._itemNodesMap
['CAT:' + id
][0];
328 var item
= tree
.model
.store
._itemsByIdentity
['CAT:' + id
];
331 var hidden
= tree
.model
.store
.getValue(item
, 'hidden');
334 tree
._expandNode(node
);
336 tree
._collapseNode(node
);
338 tree
.model
.store
.setValue(item
, 'hidden', !hidden
);
341 collapseHiddenCats: function() {
342 if (!this.model
.hasCats()) return;
344 var cats
= this.model
.store
._arrayOfTopLevelItems
;
347 dojo
.forEach(cats
, function(cat
) {
348 var hidden
= tree
.model
.store
.getValue(cat
, 'hidden');
349 var id
= tree
.model
.store
.getValue(cat
, 'id');
350 var node
= tree
._itemNodesMap
[id
][0];
353 tree
._collapseNode(node
);
355 tree
._expandNode(node
);
359 getVisibleUnreadFeeds: function() {
360 var items
= this.model
.store
._arrayOfAllItems
;
363 for (var i
= 0; i
< items
.length
; i
++) {
364 var id
= String(items
[i
].id
);
365 var box
= this._itemNodesMap
[id
];
368 var row
= box
[0].rowNode
;
372 cat
= box
[0].rowNode
.parentNode
.parentNode
;
376 if (Element
.visible(row
) && (!cat
|| Element
.visible(cat
))) {
377 var feed_id
= String(items
[i
].bare_id
);
378 var is_cat
= !id
.match('FEED:');
379 var unread
= this.model
.getFeedUnread(feed_id
, is_cat
);
382 rv
.push([feed_id
, is_cat
]);
391 getNextFeed: function (feed
, is_cat
) {
393 treeItem
= this.model
.store
._itemsByIdentity
['CAT:' + feed
];
395 treeItem
= this.model
.store
._itemsByIdentity
['FEED:' + feed
];
398 items
= this.model
.store
._arrayOfAllItems
;
401 for (var i
= 0; i
< items
.length
; i
++) {
402 if (items
[i
] == treeItem
) {
404 for (var j
= i
+1; j
< items
.length
; j
++) {
405 var id
= String(items
[j
].id
);
406 var box
= this._itemNodesMap
[id
];
409 var row
= box
[0].rowNode
;
410 var cat
= box
[0].rowNode
.parentNode
.parentNode
;
412 if (Element
.visible(cat
) && Element
.visible(row
)) {
423 return [this.model
.store
.getValue(item
, 'bare_id'),
424 !this.model
.store
.getValue(item
, 'id').match('FEED:')];
429 getPreviousFeed: function (feed
, is_cat
) {
431 treeItem
= this.model
.store
._itemsByIdentity
['CAT:' + feed
];
433 treeItem
= this.model
.store
._itemsByIdentity
['FEED:' + feed
];
436 items
= this.model
.store
._arrayOfAllItems
;
439 for (var i
= 0; i
< items
.length
; i
++) {
440 if (items
[i
] == treeItem
) {
442 for (var j
= i
-1; j
> 0; j
--) {
443 var id
= String(items
[j
].id
);
444 var box
= this._itemNodesMap
[id
];
447 var row
= box
[0].rowNode
;
448 var cat
= box
[0].rowNode
.parentNode
.parentNode
;
450 if (Element
.visible(cat
) && Element
.visible(row
)) {
462 return [this.model
.store
.getValue(item
, 'bare_id'),
463 !this.model
.store
.getValue(item
, 'id').match('FEED:')];
469 getFeedCategory: function(feed
) {
471 return this.getNodesByItem(this.model
.store
.
472 _itemsByIdentity
["FEED:" + feed
])[0].
473 getParent().item
.bare_id
[0];
479 setCatParam: function(cat
, value
) {
480 var treeNode
= this._itemNodesMap
['CAT:' + cat
];
482 if (treeNode
&& treeNode
[0] && treeNode
[0]._paramNode
) {
484 treeNode
[0]._paramNode
.innerHTML
= '+' + value
;
486 treeNode
[0]._paramNode
.innerHTML
= "";
488 this.model
.setFeedValue(cat
, true, 'child_unread', value
);