X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;ds=sidebyside;f=feedlist.js;h=954a67c162a7badd6cfdd9081f6f51a4ad3345b7;hb=dbaa4e4aac5e68c6d4714941ae99d3e4028410e5;hp=582509e402bc88f6060e94059103f0a34da1776c;hpb=6dbba9be8af852ddce439d3451c63988a9498577;p=tt-rss.git diff --git a/feedlist.js b/feedlist.js index 582509e4..954a67c1 100644 --- a/feedlist.js +++ b/feedlist.js @@ -1,75 +1,36 @@ var _feed_cur_page = 0; var _infscroll_disable = 0; var _infscroll_request_sent = 0; -var feed_under_pointer = undefined; +var _search_query = false; -var mouse_is_down = false; -var mouse_y = 0; -var mouse_x = 0; +var counter_timeout_id = false; var resize_enabled = false; -var selection_disabled = false; var counters_last_request = 0; -function toggle_sortable_feedlist(enabled) { - try { - - if (enabled) { - Sortable.create('feedList', {onChange: feedlist_dragsorted, only: "feedCat"}); - } else { - Sortable.destroy('feedList'); - } - - } catch (e) { - exception_error("toggle_sortable_feedlist", e); - } -} - function viewCategory(cat) { viewfeed(cat, '', true); return false; } -function render_feedlist(data) { - try { - - var f = document.getElementById("feeds-frame"); - f.innerHTML = data; - cache_invalidate("FEEDLIST"); - cache_inject("FEEDLIST", data, getInitParam("num_feeds")); - feedlist_init(); - - } catch (e) { - exception_error("render_feedlist", e); - } -} - -function feedlist_callback2(transport) { - try { - debug("feedlist_callback2"); - if (!transport_error_check(transport)) return; - render_feedlist(transport.responseText); - } catch (e) { - exception_error("feedlist_callback2", e); - } -} - function viewNextFeedPage() { try { //if (!getActiveFeedId()) return; - debug("viewNextFeedPage: calling viewfeed(), p: " + _feed_cur_page+1); + console.log("viewNextFeedPage: calling viewfeed(), p: " + parseInt(_feed_cur_page+1)); - viewfeed(getActiveFeedId(), undefined, activeFeedIsCat(), undefined, - undefined, _feed_cur_page+1); + viewfeed(getActiveFeedId(), '', activeFeedIsCat(), parseInt(_feed_cur_page+1)); } catch (e) { exception_error("viewNextFeedPage", e); } } -function viewfeed(feed, subop, is_cat, subop_param, skip_history, offset) { + +function viewfeed(feed, subop, is_cat, offset) { try { + if (is_cat == undefined) is_cat = false; + if (subop == undefined) subop = ''; // if (!offset) page_offset = 0; @@ -83,9 +44,12 @@ function viewfeed(feed, subop, is_cat, subop_param, skip_history, offset) { /* if (getInitParam("theme") == "" || getInitParam("theme") == "compact") { if (getInitParam("hide_feedlist") == 1) { Element.hide("feeds-holder"); - } + } } */ + dijit.byId("content-tabs").selectChild( + dijit.byId("content-tabs").getChildren()[0]); + var force_nocache = false; var page_offset = 0; @@ -108,19 +72,17 @@ function viewfeed(feed, subop, is_cat, subop_param, skip_history, offset) { var date = new Date(); var timestamp = Math.round(date.getTime() / 1000); - debug("" + _infscroll_request_sent + " : " + timestamp + ""); + console.log(_infscroll_request_sent + " : " + timestamp); if (_infscroll_request_sent && _infscroll_request_sent + 30 > timestamp) { - debug("infscroll request in progress, aborting"); + console.log("infscroll request in progress, aborting"); return; } - _infscroll_request_sent = timestamp; + _infscroll_request_sent = timestamp; } - enableHotkeys(); - - closeInfoBox(); + hideAuxDlg(); Form.enable("main_toolbar_form"); @@ -134,54 +96,29 @@ function viewfeed(feed, subop, is_cat, subop_param, skip_history, offset) { toolbar_form.query.value = ""; } - var query = "backend.php?op=viewfeed&feed=" + feed + "&" + + var query = "?op=viewfeed&feed=" + feed + "&" + toolbar_query + "&subop=" + param_escape(subop); - if (document.getElementById("search_form")) { - var search_query = Form.serialize("search_form"); - query = query + "&" + search_query; - closeInfoBox(true); + if (_search_query) { force_nocache = true; + query = query + "&" + _search_query; + _search_query = false; } -// debug("IS_CAT_STORED: " + activeFeedIsCat() + ", IS_CAT: " + is_cat); +// console.log("IS_CAT_STORED: " + activeFeedIsCat() + ", IS_CAT: " + is_cat); if (subop == "MarkAllRead") { var show_next_feed = getInitParam("on_catchup_show_next_feed") == "1"; if (show_next_feed) { + var tree = dijit.byId("feedTree"); + var nuf = tree.model.getNextUnreadFeed(feed, is_cat); - if (!activeFeedIsCat()) { - - var feedlist = document.getElementById('feedList'); - - var next_unread_feed = getRelativeFeedId(feedlist, - feed, "next", true); - - if (!next_unread_feed) { - next_unread_feed = getRelativeFeedId(feedlist, - -3, "next", true); - } - - if (next_unread_feed) { - query = query + "&nuf=" + param_escape(next_unread_feed); - //setActiveFeedId(next_unread_feed); - feed = next_unread_feed; - } - } else { - - var next_unread_feed = getNextUnreadCat(feed); - - /* we don't need to specify that our next feed is actually - a category, because we're in the is_cat mode by definition - already */ - - if (next_unread_feed && show_next_feed) { - query = query + "&nuf=" + param_escape(next_unread_feed); - feed = next_unread_feed; - } + if (nuf) { + var nuf_id = tree.model.store.getValue(nuf, 'bare_id'); + query = query + "&nuf=" + param_escape(nuf_id); } } } @@ -199,44 +136,20 @@ function viewfeed(feed, subop, is_cat, subop_param, skip_history, offset) { } } - var date = new Date(); - var timestamp = Math.round(date.getTime() / 1000); - query = query + "&ts=" + timestamp - - disableContainerChildren("headlinesToolbar", false); Form.enable("main_toolbar_form"); - // for piggybacked counters - - if (tagsAreDisplayed()) { - query = query + "&omode=lt"; - } else { - query = query + "&omode=flc"; - } - - if (!async_counters_work) { - query = query + "&csync=true"; - } - - debug(query); - - var container = document.getElementById("headlinesInnerContainer"); + console.log(query); -/* if (container && page_offset == 0 && !isCdmMode()) { - new Effect.Fade(container, {duration: 1, to: 0.01, - queue: { position:'end', scope: 'FEEDL-' + feed, limit: 1 } } ); - } */ +/* var unread_ctr = -1; - var unread_ctr = -1; - - if (!is_cat) unread_ctr = get_feed_unread(feed); + if (!is_cat) unread_ctr = getFeedUnread(feed); var cache_check = false; if (unread_ctr != -1 && !page_offset && !force_nocache && !subop) { var cache_prefix = ""; - + if (is_cat) { cache_prefix = "C:"; } else { @@ -244,428 +157,289 @@ function viewfeed(feed, subop, is_cat, subop_param, skip_history, offset) { } cache_check = cache_check_param(cache_prefix + feed, unread_ctr); - debug("headline cache check: " + cache_check); + console.log("headline cache check: " + cache_check); } if (cache_check) { - var f = document.getElementById("headlines-frame"); - - clean_feed_selections(); setActiveFeedId(feed, is_cat); - - if (!is_cat) { - var feedr = document.getElementById("FEEDR-" + feed); - if (feedr && !feedr.className.match("Selected")) { - feedr.className = feedr.className + "Selected"; - } - } else { - var feedr = document.getElementById("FCAT-" + feed_id); - if (feedr && !feedr.className.match("Selected")) { - feedr.className = feedr.className + "Selected"; - } - } - f.innerHTML = cache_find_param(cache_prefix + feed, unread_ctr); + $("headlines-frame").innerHTML = cache_find_param(cache_prefix + feed, + unread_ctr); request_counters(); remove_splash(); - } else { + } else { */ - if (!page_offset) { + if (!is_cat) { + if (!setFeedExpandoIcon(feed, is_cat, 'images/indicator_white.gif')) + notify_progress("Loading, please wait...", true); + } else { notify_progress("Loading, please wait...", true); } - new Ajax.Request(query, { - onComplete: function(transport) { - headlines_callback2(transport, page_offset); + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + setFeedExpandoIcon(feed, is_cat, 'images/blank_icon.gif'); + headlines_callback2(transport, page_offset); } }); - } +// } } catch (e) { exception_error("viewfeed", e); - } -} - -function toggleCollapseCat_af(effect) { - //var caption = elem.id.replace("FCATLIST-", ""); - - try { - - var elem = effect.element; - var cat = elem.id.replace("FCATLIST-", ""); - var cap = document.getElementById("FCAP-" + cat); - - if (Element.visible(elem)) { - cap.innerHTML = cap.innerHTML.replace("…", ""); - } else { - if (cap.innerHTML.lastIndexOf("…") != cap.innerHTML.length-3) { - cap.innerHTML = cap.innerHTML + "…"; - } - } - - } catch (e) { - exception_error("toggleCollapseCat_af", e); } } -function toggleCollapseCat(cat) { +function feedlist_init() { try { - - var cat_elem = document.getElementById("FCAT-" + cat); - var cat_list = document.getElementById("FCATLIST-" + cat).parentNode; - var caption = document.getElementById("FCAP-" + cat); - -/* if (cat_list.className.match("invisible")) { - cat_list.className = ""; - caption.innerHTML = caption.innerHTML.replace("...", ""); - if (cat == 0) { - setCookie("ttrss_vf_uclps", "0"); - } - } else { - cat_list.className = "invisible"; - caption.innerHTML = caption.innerHTML + "..."; - if (cat == 0) { - setCookie("ttrss_vf_uclps", "1"); - } + console.log("in feedlist init"); - } */ - - if (cat == 0) { - if (Element.visible("FCATLIST-" + cat)) { - setCookie("ttrss_vf_uclps", "1"); - } else { - setCookie("ttrss_vf_uclps", "0"); - } - } + hideOrShowFeeds(getInitParam("hide_read_feeds") == 1); + document.onkeydown = hotkey_handler; + setTimeout("hotkey_prefix_timeout()", 5*1000); - if (cat == -2) { - if (Element.visible("FCATLIST-" + cat)) { - setCookie("ttrss_vf_lclps", "1"); - } else { - setCookie("ttrss_vf_lclps", "0"); - } - } + if (!getActiveFeedId()) { + setTimeout("viewfeed(-3)", 100); + } - if (cat == -1) { - if (Element.visible("FCATLIST-" + cat)) { - setCookie("ttrss_vf_vclps", "1"); - } else { - setCookie("ttrss_vf_vclps", "0"); - } - } + console.log("T:" + + getInitParam("cdm_auto_catchup") + " " + getFeedUnread(-3)); - Effect.toggle('FCATLIST-' + cat, 'blind', { duration: 0.5, - afterFinish: toggleCollapseCat_af }); + hideOrShowFeeds(getInitParam("hide_read_feeds") == 1); - new Ajax.Request("backend.php?op=feeds&subop=collapse&cid=" + - param_escape(cat)); + setTimeout("timeout()", 5000); } catch (e) { - exception_error("toggleCollapseCat", e); + exception_error("feedlist/init", e); } } -function feedlist_dragsorted(ctr) { +function request_counters_real() { try { - var elem = document.getElementById("feedList"); - - var cats = elem.getElementsByTagName("LI"); - var ordered_cats = new Array(); - - for (var i = 0; i < cats.length; i++) { - if (cats[i].id && cats[i].id.match("FCAT-")) { - ordered_cats.push(cats[i].id.replace("FCAT-", "")); - } - } - - if (ordered_cats.length > 0) { + console.log("requesting counters..."); - var query = "backend.php?op=feeds&subop=catsort&corder=" + - param_escape(ordered_cats.toString()); + var query = "?op=rpc&subop=getAllCounters&seq=" + next_seq(); - debug(query); + query = query + "&omode=flc"; - new Ajax.Request(query); - } + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + try { + handle_rpc_json(transport); + } catch (e) { + exception_error("viewfeed/getcounters", e); + } + } }); } catch (e) { - exception_error("feedlist_dragsorted", e); + exception_error("request_counters_real", e); } } -function feedlist_init() { - try { -// if (arguments.callee.done) return; -// arguments.callee.done = true; - - loading_set_progress(90); - debug("in feedlist init"); - - hideOrShowFeeds(getInitParam("hide_read_feeds") == 1); - document.onkeydown = hotkey_handler; - document.onmousemove = mouse_move_handler; - document.onmousedown = mouse_down_handler; - document.onmouseup = mouse_up_handler; +function request_counters() { - setTimeout("timeout()", 1); + try { - if (typeof correctPNG != 'undefined') { - correctPNG(); - } + if (getInitParam("bw_limit") == "1") return; - if (getActiveFeedId()) { - //debug("some feed is open on feedlist refresh, reloading"); - //setTimeout("viewCurrentFeed()", 100); - } else { - if (getInitParam("cdm_auto_catchup") != 1 && get_feed_unread(-3) > 0) { - notify_silent_next(); - setTimeout("viewfeed(-3)", 100); - } else { - remove_splash(); - } - } + var date = new Date(); + var timestamp = Math.round(date.getTime() / 1000); - if (getInitParam("theme") == "") { - setTimeout("hide_footer()", 5000); - } + if (timestamp - counters_last_request > 5) { + console.log("scheduling request of counters..."); - init_collapsable_feedlist(getInitParam("theme")); + window.clearTimeout(counter_timeout_id); + counter_timeout_id = window.setTimeout("request_counters_real()", 1000); - toggle_sortable_feedlist(isFeedlistSortable()); + counters_last_request = timestamp; + } else { + console.log("request_counters: rate limit reached: " + (timestamp - counters_last_request)); + } } catch (e) { - exception_error("feedlist/init", e); + exception_error("request_counters", e); } } -function hide_footer_af(effect) { +function displayNewContentPrompt(id) { try { - var c = document.getElementById("content-frame"); - if (c) { - c.style.bottom = "0px"; + var msg = "" + + __("New articles available in this feed (click to show)") + ""; - var ioa = document.getElementById("inline_orig_article"); + msg = msg.replace("%s", getFeedName(id)); - if (ioa) { - ioa.height = c.offsetHeight; - } + $('auxDlg').innerHTML = msg; - } else { - var h = document.getElementById("headlines-frame"); - - if (h) { - h.style.bottom = "0px"; - } - } + new Effect.Appear('auxDlg', {duration : 0.5}); } catch (e) { - exception_error("hide_footer_af", e); + exception_error("displayNewContentPrompt", e); } } -function hide_footer() { +function parse_counters(elems, scheduled_call) { try { - if (Element.visible("footer")) { - new Effect.Fade("footer", { afterFinish: hide_footer_af }); - } - } catch (e) { - exception_error("hide_footer", e); - } -} -/* -function init_hidden_feedlist(theme) { - try { - debug("init_hidden_feedlist"); + var feeds_found = 0; - if (theme != "" && theme != "compact") return; + for (var l = 0; l < elems.length; l++) { - var fl = document.getElementById("feeds-holder"); - var fh = document.getElementById("headlines-frame"); - var fc = document.getElementById("content-frame"); - var ft = document.getElementById("toolbar"); - var ff = document.getElementById("footer"); - var fhdr = document.getElementById("header"); + var id = elems[l].id + var kind = elems[l].kind; + var ctr = parseInt(elems[l].counter) + var error = elems[l].error; + var has_img = elems[l].has_img; + var updated = elems[l].updated; + var title = elems[l].title; - var fbtn = document.getElementById("toggle_feeds_btn"); - - if (fbtn) Element.show(fbtn); - - fl.style.top = fh.offsetTop + "px"; - fl.style.backgroundColor = "white"; //FIXME - - Element.hide(fl); - - fh.style.left = "0px"; - ft.style.left = "0px"; - if (fc) fc.style.left = "0px"; - if (ff) ff.style.left = "0px"; + if (id == "global-unread") { + global_unread = ctr; + updateTitle(); + continue; + } - if (theme == "compact") { - fhdr.style.left = "10px"; - fl.style.top = (fh.offsetTop + 1) + "px"; - } + if (id == "subscribed-feeds") { + feeds_found = ctr; + continue; + } - } catch (e) { - exception_error("init_hidden_feedlist", e); - } -} */ + var treeItem; -function init_collapsable_feedlist(theme) { - try { - debug("init_collapsable_feedlist"); + // TODO: enable new content notification for categories - if (theme != "" && theme != "compact" && theme != "graycube" && - theme != "compat") return; + if (!activeFeedIsCat() && id == getActiveFeedId() + && ctr > getFeedUnread(id) && scheduled_call) { + displayNewContentPrompt(id); + } - var fbtn = document.getElementById("collapse_feeds_btn"); + setFeedUnread(id, (kind == "cat"), ctr); - if (fbtn) Element.show(fbtn); + if (kind != "cat") { + setFeedValue(id, false, 'error', error); + setFeedValue(id, false, 'updated', updated); - if (getCookie("ttrss_vf_fclps") == 1) { - collapse_feedlist(); + if (id > 0) { + if (has_img) { + setFeedIcon(id, false, + getInitParam("icons_url") + "/" + id + ".ico"); + } else { + setFeedIcon(id, false, 'images/blank_icon.gif'); + } + } + } } + hideOrShowFeeds(getInitParam("hide_read_feeds") == 1); + } catch (e) { - exception_error("init_hidden_feedlist", e); + exception_error("parse_counters", e); } - } -function mouse_move_handler(e) { +function getFeedUnread(feed, is_cat) { try { - var client_y; - var client_x; - - if (window.event) { - client_y = window.event.clientY; - client_x = window.event.clientX; - } else if (e) { - client_x = e.screenX; - client_y = e.screenY; - } - - if (mouse_is_down) { - - if (mouse_y == 0) mouse_y = client_y; - if (mouse_x == 0) mouse_x = client_x; + var tree = dijit.byId("feedTree"); - resize_headlines(mouse_x - client_x, mouse_y - client_y); - - mouse_y = client_y; - mouse_x = client_x; - - return false; - } + if (tree && tree.model) + return tree.model.getFeedUnread(feed, is_cat); } catch (e) { - exception_error("mouse_move_handler", e); + // } + + return -1; } -function enable_selection(b) { - selection_disabled = !b; +function resort_feedlist() { + console.warn("resort_feedlist: function not implemented"); } -function enable_resize(b) { - resize_enabled = b; +function hideOrShowFeeds(hide) { + var tree = dijit.byId("feedTree"); + + if (tree) + return tree.hideRead(hide, getInitParam("hide_read_shows_special")); } -function mouse_down_handler(e) { - try { +function getFeedName(feed, is_cat) { + var tree = dijit.byId("feedTree"); - /* do not prevent right click */ - if (e.button && e.button == 2) return; + if (tree && tree.model) + return tree.model.getFeedValue(feed, is_cat, 'name'); +} - if (resize_enabled) { - mouse_is_down = true; - mouse_x = 0; - mouse_y = 0; - document.onselectstart = function() { return false; }; - return false; - } +function getFeedValue(feed, is_cat, key) { + try { + var tree = dijit.byId("feedTree"); - if (selection_disabled) { - document.onselectstart = function() { return false; }; - return false; - } + if (tree && tree.model) + return tree.model.getFeedValue(feed, is_cat, key); } catch (e) { - exception_error("mouse_move_handler", e); + // } + return ''; } -function mouse_up_handler(e) { +function setFeedUnread(feed, is_cat, unread) { try { - mouse_is_down = false; + var tree = dijit.byId("feedTree"); - if (!selection_disabled) { - document.onselectstart = null; - var e = document.getElementById("headlineActionsBody"); - if (e) Element.hide(e); - } + if (tree && tree.model) + return tree.model.setFeedUnread(feed, is_cat, unread); } catch (e) { - exception_error("mouse_move_handler", e); + exception_error("setFeedUnread", e); } } -function request_counters_real() { - +function setFeedValue(feed, is_cat, key, value) { try { + var tree = dijit.byId("feedTree"); - if (offline_mode) return; - - debug("requesting counters..."); + if (tree && tree.model) + return tree.model.setFeedValue(feed, is_cat, key, value); - var query = "backend.php?op=rpc&subop=getAllCounters"; + } catch (e) { + // + } +} - if (tagsAreDisplayed()) { - query = query + "&omode=tl"; - } else { - query = query + "&omode=flc"; - } +function selectFeed(feed, is_cat) { + try { + var tree = dijit.byId("feedTree"); - new Ajax.Request(query, { - onComplete: function(transport) { - try { - all_counters_callback2(transport, true); - } catch (e) { - exception_error("viewfeed/getcounters", e); - } - } }); + if (tree) return tree.selectFeed(feed, is_cat); } catch (e) { - exception_error("request_counters_real", e); + exception_error("selectFeed", e); } } - -function request_counters() { - +function setFeedIcon(feed, is_cat, src) { try { + var tree = dijit.byId("feedTree"); - if (getInitParam("bw_limit") == "1") return; + if (tree) return tree.setFeedIcon(feed, is_cat, src); - var date = new Date(); - var timestamp = Math.round(date.getTime() / 1000); + } catch (e) { + exception_error("setFeedIcon", e); + } +} -// if (getInitParam("sync_counters") == "1" || -// timestamp - counters_last_request > 10) { +function setFeedExpandoIcon(feed, is_cat, src) { + try { + var tree = dijit.byId("feedTree"); - if (timestamp - counters_last_request > 15) { - debug("scheduling request of counters..."); - window.setTimeout("request_counters_real()", 1000); - counters_last_request = timestamp; - } else { - debug("request_counters: rate limit reached: " + (timestamp - counters_last_request)); - } + if (tree) return tree.setFeedExpandoIcon(feed, is_cat, src); } catch (e) { - exception_error("request_counters", e); + exception_error("setFeedIcon", e); } + return false; }