]> git.wh0rd.org - tt-rss.git/blobdiff - FeedTree.js
filters: cast score expression as integer on save to prevent misscoring
[tt-rss.git] / FeedTree.js
index f01fd24cf0dddf56c1dd812283fd58412600436a..c29925c88a0a713e83cb91126d47b0f4a23d973e 100644 (file)
@@ -5,6 +5,17 @@ dojo.require("dijit.Tree");
 dojo.require("dijit.Menu");
 
 dojo.declare("fox.FeedStoreModel", dijit.tree.ForestStoreModel, {
+       getItemsInCategory: function (id) {
+               if (!this.store._itemsByIdentity) return undefined;
+
+               cat = this.store._itemsByIdentity['CAT:' + id];
+
+               if (cat && cat.items)
+                       return cat.items;
+               else
+                       return undefined;
+
+       },
        getItemById: function(id) {
                return this.store._itemsByIdentity[id];
        },
@@ -41,6 +52,42 @@ dojo.declare("fox.FeedStoreModel", dijit.tree.ForestStoreModel, {
                if (treeItem)
                        return this.store.setValue(treeItem, key, value);
        },
+       getNextUnreadFeed: function (feed, is_cat) {
+               if (is_cat) {
+                       treeItem = this.store._itemsByIdentity['CAT:' + feed];
+                       items = this.store._arrayOfTopLevelItems;
+               } else {
+                       treeItem = this.store._itemsByIdentity['FEED:' + feed];
+                       items = this.store._arrayOfAllItems;
+               }
+
+               for (var i = 0; i < items.length; i++) {
+                       if (items[i] == treeItem) {
+
+                               for (j = i+1; j < items.length; j++) {
+                                       var unread = this.store.getValue(items[j], 'unread');
+                                       var id = this.store.getValue(items[j], 'id');
+
+                                       if (unread > 0 && (is_cat || id.match("FEED:"))) return items[j];
+                               }
+
+                               for (j = 0; j < i; j++) {
+                                       var unread = this.store.getValue(items[j], 'unread');
+                                       var id = this.store.getValue(items[j], 'id');
+
+                                       if (unread > 0 && (is_cat || id.match("FEED:"))) return items[j];
+                               }
+                       }
+               }
+               
+               return null;
+       },
+       hasCats: function() {
+               if (this.store && this.store._itemsByIdentity)
+                       return this.store._itemsByIdentity['CAT:-1'] != undefined;
+               else
+                       return false;
+       },
 });
 
 dojo.declare("fox.FeedTree", dijit.Tree, {
@@ -53,6 +100,20 @@ dojo.declare("fox.FeedTree", dijit.Tree, {
                var id = args.item.id[0];
                var bare_id = parseInt(id.substr(id.indexOf(':')+1));
 
+               if (bare_id < -10) {
+                       var span = dojo.doc.createElement('span');
+                       var fg_color = args.item.fg_color[0];
+                       var bg_color = args.item.bg_color[0];
+
+                       span.innerHTML = "&alpha;";
+                       span.className = 'labelColorIndicator';
+                       span.setStyle({
+                               color: fg_color,
+                               backgroundColor: bg_color});
+
+                       dojo.place(span, tnode.iconNode, 'replace');
+               }
+
                if (id.match("FEED:") && bare_id > 0) {
                        var menu = new dijit.Menu();
                        menu.row_id = bare_id;
@@ -60,7 +121,7 @@ dojo.declare("fox.FeedTree", dijit.Tree, {
                        menu.addChild(new dijit.MenuItem({
                                label: __("Edit feed"),
                                onClick: function() {
-                                       editFeedDlg(this.getParent().row_id);
+                                       editFeed(this.getParent().row_id);
                                }}));
 
                        menu.addChild(new dijit.MenuItem({
@@ -87,10 +148,19 @@ dojo.declare("fox.FeedTree", dijit.Tree, {
                        "dijitTreeRow Error";
        },
        getLabel: function(item) {
+               var name = String(item.name);
+
+               /* Horrible */
+               name = name.replace(/&quot;/g, "\"");
+               name = name.replace(/&amp;/g, "&");
+               name = name.replace(/&mdash;/g, "-");
+               name = name.replace(/&lt;/g, "<");
+               name = name.replace(/&gt;/g, ">");
+
                if (item.unread > 0) {
-                       return item.name + " (" + item.unread + ")";
+                       return name + " (" + item.unread + ")";
                } else {
-                       return item.name;
+                       return name;
                }
        },
        selectFeed: function(feed, is_cat) {
@@ -133,10 +203,7 @@ dojo.declare("fox.FeedTree", dijit.Tree, {
                return false;
        },
        hasCats: function() {
-               if (this.model.store && this.model.store._itemsByIdentity)
-                       return this.model.store._itemsByIdentity['CAT:-1'] != undefined;
-               else
-                       return false;
+               return this.model.hasCats();
        },
        hideRead: function (hide, show_special) {
                if (this.hasCats()) {
@@ -193,4 +260,120 @@ dojo.declare("fox.FeedTree", dijit.Tree, {
        
                return cat_unread;
        },
+       collapseCat: function(id) {
+               if (!this.model.hasCats()) return;
+
+               var tree = this;
+
+               var node = tree._itemNodesMap['CAT:' + id][0];
+               var item = tree.model.store._itemsByIdentity['CAT:' + id];
+
+               if (node && item) {
+                       var hidden = tree.model.store.getValue(item, 'hidden');
+
+                       if (hidden) 
+                               tree._expandNode(node);
+                       else
+                               tree._collapseNode(node);
+
+                       tree.model.store.setValue(item, 'hidden', !hidden);
+               }
+       },
+       collapseHiddenCats: function() {
+               if (!this.model.hasCats()) return;
+
+               var cats = this.model.store._arrayOfTopLevelItems;
+               var tree = this;
+
+               dojo.forEach(cats, function(cat) {
+                       var hidden = tree.model.store.getValue(cat, 'hidden');
+                       var id = tree.model.store.getValue(cat, 'id');
+                       var node = tree._itemNodesMap[id][0];
+
+                       if (hidden) 
+                               tree._collapseNode(node);
+                       else
+                               tree._expandNode(node);
+
+               });
+       },
+       getNextFeed: function (feed, is_cat) {
+               if (is_cat) {
+                       treeItem = this.model.store._itemsByIdentity['CAT:' + feed];
+               } else {
+                       treeItem = this.model.store._itemsByIdentity['FEED:' + feed];
+               }
+
+               items = this.model.store._arrayOfAllItems;
+               var item = items[0];
+
+               for (var i = 0; i < items.length; i++) {
+                       if (items[i] == treeItem) {
+
+                               for (j = i+1; j < items.length; j++) {
+                                       var id = String(items[j].id);   
+                                       var box = this._itemNodesMap[id];
+
+                                       if (box) {
+                                               var row = box[0].rowNode;
+                                               var cat = box[0].rowNode.parentNode.parentNode;
+
+                                               if (Element.visible(cat) && Element.visible(row)) {
+                                                       item = items[j];
+                                                       break;
+                                               }
+                                       }
+                               }
+                               break;
+                       }
+               }
+
+               if (item) {
+                       return [this.model.store.getValue(item, 'bare_id'), 
+                                               !this.model.store.getValue(item, 'id').match('FEED:')];
+               } else {
+                       return false;
+               }
+       },
+       getPreviousFeed: function (feed, is_cat) {
+               if (is_cat) {
+                       treeItem = this.model.store._itemsByIdentity['CAT:' + feed];
+               } else {
+                       treeItem = this.model.store._itemsByIdentity['FEED:' + feed];
+               }
+
+               items = this.model.store._arrayOfAllItems;
+               var item = items[0];
+
+               for (var i = 0; i < items.length; i++) {
+                       if (items[i] == treeItem) {
+
+                               for (j = i-1; j > 0; j--) {
+                                       var id = String(items[j].id);   
+                                       var box = this._itemNodesMap[id];
+
+                                       if (box) {
+                                               var row = box[0].rowNode;
+                                               var cat = box[0].rowNode.parentNode.parentNode;
+
+                                               if (Element.visible(cat) && Element.visible(row)) {
+                                                       item = items[j];
+                                                       break;
+                                               }
+                                       }
+
+                               }
+                               break;
+                       }
+               }
+
+               if (item) {
+                       return [this.model.store.getValue(item, 'bare_id'), 
+                                               !this.model.store.getValue(item, 'id').match('FEED:')];
+               } else {
+                       return false;
+               }
+
+       },
+
 });