]>
git.wh0rd.org - tt-rss.git/blob - 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 getNextFeed: function (feed
, is_cat
) {
57 treeItem
= this.store
._itemsByIdentity
['CAT:' + feed
];
59 treeItem
= this.store
._itemsByIdentity
['FEED:' + feed
];
62 items
= this.store
._arrayOfAllItems
;
65 for (var i
= 0; i
< items
.length
; i
++) {
66 if (items
[i
] == treeItem
) {
73 return [this.store
.getValue(item
, 'bare_id'),
74 !this.store
.getValue(item
, 'id').match('FEED:')];
79 getPreviousFeed: function (feed
, is_cat
) {
81 treeItem
= this.store
._itemsByIdentity
['CAT:' + feed
];
83 treeItem
= this.store
._itemsByIdentity
['FEED:' + feed
];
86 items
= this.store
._arrayOfAllItems
;
87 var item
= items
[items
.length
-1];
89 for (var i
= 0; i
< items
.length
; i
++) {
90 if (items
[i
] == treeItem
) {
97 return [this.store
.getValue(item
, 'bare_id'),
98 !this.store
.getValue(item
, 'id').match('FEED:')];
104 getNextUnreadFeed: function (feed
, is_cat
) {
106 treeItem
= this.store
._itemsByIdentity
['CAT:' + feed
];
107 items
= this.store
._arrayOfTopLevelItems
;
109 treeItem
= this.store
._itemsByIdentity
['FEED:' + feed
];
110 items
= this.store
._arrayOfAllItems
;
113 for (var i
= 0; i
< items
.length
; i
++) {
114 if (items
[i
] == treeItem
) {
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');
120 if (unread
> 0 && (is_cat
|| id
.match("FEED:"))) return items
[j
];
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');
127 if (unread
> 0 && (is_cat
|| id
.match("FEED:"))) return items
[j
];
134 hasCats: function() {
135 if (this.store
&& this.store
._itemsByIdentity
)
136 return this.store
._itemsByIdentity
['CAT:-1'] != undefined;
142 dojo
.declare("fox.FeedTree", dijit
.Tree
, {
143 _createTreeNode: function(args
) {
144 var tnode
= new dijit
._TreeNode(args
);
147 tnode
.iconNode
.src
= args
.item
.icon
[0];
149 var id
= args
.item
.id
[0];
150 var bare_id
= parseInt(id
.substr(id
.indexOf(':')+1));
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];
157 span
.innerHTML
= "α";
158 span
.className
= 'labelColorIndicator';
161 backgroundColor
: bg_color
});
163 dojo
.place(span
, tnode
.iconNode
, 'replace');
166 if (id
.match("FEED:") && bare_id
> 0) {
167 var menu
= new dijit
.Menu();
168 menu
.row_id
= bare_id
;
170 menu
.addChild(new dijit
.MenuItem({
171 label
: __("Edit feed"),
172 onClick: function() {
173 editFeed(this.getParent().row_id
);
176 menu
.addChild(new dijit
.MenuItem({
177 label
: __("Update feed"),
178 onClick: function() {
179 scheduleFeedUpdate(this.getParent().row_id
, false);
182 menu
.bindDomNode(tnode
.domNode
);
186 //tnode.labelNode.innerHTML = args.label;
189 getIconClass: function (item
, opened
) {
190 return (!item
|| this.model
.mayHaveChildren(item
)) ? (opened
? "dijitFolderOpened" : "dijitFolderClosed") : "feedIcon";
192 getLabelClass: function (item
, opened
) {
193 return (item
.unread
== 0) ? "dijitTreeLabel" : "dijitTreeLabel Unread";
195 getRowClass: function (item
, opened
) {
196 return (!item
.error
|| item
.error
== '') ? "dijitTreeRow" :
197 "dijitTreeRow Error";
199 getLabel: function(item
) {
200 var name
= String(item
.name
);
203 name
= name
.replace(""", "\"");
204 name
= name
.replace("&", "&");
205 name
= name
.replace("—", "-");
206 name
= name
.replace("<", "<");
207 name
= name
.replace(">", ">");
209 if (item
.unread
> 0) {
210 return name
+ " (" + item
.unread
+ ")";
215 selectFeed: function(feed
, is_cat
) {
217 treeNode
= this._itemNodesMap
['CAT:' + feed
];
219 treeNode
= this._itemNodesMap
['FEED:' + feed
];
222 treeNode
= treeNode
[0];
223 if (!is_cat
) this._expandNode(treeNode
);
224 this._selectNode(treeNode
);
227 setFeedIcon: function(feed
, is_cat
, src
) {
229 treeNode
= this._itemNodesMap
['CAT:' + feed
];
231 treeNode
= this._itemNodesMap
['FEED:' + feed
];
234 treeNode
= treeNode
[0];
235 treeNode
.iconNode
.src
= src
;
240 setFeedExpandoIcon: function(feed
, is_cat
, src
) {
242 treeNode
= this._itemNodesMap
['CAT:' + feed
];
244 treeNode
= this._itemNodesMap
['FEED:' + feed
];
247 treeNode
= treeNode
[0];
248 treeNode
.expandoNode
.src
= src
;
254 hasCats: function() {
255 return this.model
.hasCats();
257 hideRead: function (hide
, show_special
) {
258 if (this.hasCats()) {
261 var cats
= this.model
.store
._arrayOfTopLevelItems
;
263 cats
.each(function(cat
) {
264 var cat_unread
= tree
.hideReadFeeds(cat
.items
, hide
, show_special
);
266 var id
= String(cat
.id
);
267 var node
= tree
._itemNodesMap
[id
];
268 var bare_id
= parseInt(id
.substr(id
.indexOf(":")+1));
271 var check_unread
= tree
.model
.getFeedUnread(bare_id
, true);
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 }});
277 Element
.show(node
[0].rowNode
);
284 this.hideReadFeeds(this.model
.store
._arrayOfTopLevelItems
, hide
,
288 hideReadFeeds: function (items
, hide
, show_special
) {
292 items
.each(function(feed
) {
293 var id
= String(feed
.id
);
294 var bare_id
= parseInt(feed
.bare_id
);;
296 var unread
= feed
.unread
[0];
297 var node
= tree
._itemNodesMap
[id
];
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 }});
304 Element
.show(node
[0].rowNode
);
312 collapseCat: function(id
) {
313 if (!this.model
.hasCats()) return;
317 var node
= tree
._itemNodesMap
['CAT:' + id
][0];
318 var item
= tree
.model
.store
._itemsByIdentity
['CAT:' + id
];
321 var hidden
= tree
.model
.store
.getValue(item
, 'hidden');
324 tree
._expandNode(node
);
326 tree
._collapseNode(node
);
328 tree
.model
.store
.setValue(item
, 'hidden', !hidden
);
331 collapseHiddenCats: function() {
332 if (!this.model
.hasCats()) return;
334 var cats
= this.model
.store
._arrayOfTopLevelItems
;
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];
343 tree
._collapseNode(node
);
345 tree
._expandNode(node
);