From 1d82bd4f19de40f0cf966545c372595caa2c8afe Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Sat, 1 Dec 2018 17:42:21 +0300 Subject: further objectification --- js/functions.js | 110 +++++++------- js/tt-rss.js | 449 ++++++++++++++++++++++++++------------------------------ js/viewfeed.js | 181 ++++++++++++----------- 3 files changed, 360 insertions(+), 380 deletions(-) (limited to 'js') diff --git a/js/functions.js b/js/functions.js index 174dbebfe..f2463dda3 100755 --- a/js/functions.js +++ b/js/functions.js @@ -255,6 +255,60 @@ const Utils = { PluginHost.run(PluginHost.HOOK_RUNTIME_INFO_LOADED, data); }, + backendSanityCallback: function (transport) { + + const reply = JSON.parse(transport.responseText); + + if (!reply) { + fatalError(3, "Sanity check: invalid RPC reply", transport.responseText); + return; + } + + const error_code = reply['error']['code']; + + if (error_code && error_code != 0) { + return fatalError(error_code, reply['error']['message']); + } + + console.log("sanity check ok"); + + const params = reply['init-params']; + + if (params) { + console.log('reading init-params...'); + + for (const k in params) { + if (params.hasOwnProperty(k)) { + switch (k) { + case "label_base_index": + _label_base_index = parseInt(params[k]) + break; + case "hotkeys": + // filter mnemonic definitions (used for help panel) from hotkeys map + // i.e. *(191)|Ctrl-/ -> *(191) + + const tmp = []; + for (const sequence in params[k][1]) { + const filtered = sequence.replace(/\|.*$/, ""); + tmp[filtered] = params[k][1][sequence]; + } + + params[k][1] = tmp; + break; + } + + console.log("IP:", k, "=>", params[k]); + } + } + + init_params = params; + + // PluginHost might not be available on non-index pages + window.PluginHost && PluginHost.run(PluginHost.HOOK_PARAMS_LOADED, init_params); + } + + App.initSecondStage(); + } }; function report_error(message, filename, lineno, colno, error) { @@ -1193,62 +1247,6 @@ function unsubscribeFeed(feed_id, title) { return false; } - -function backend_sanity_check_callback(transport) { - - const reply = JSON.parse(transport.responseText); - - if (!reply) { - fatalError(3, "Sanity check: invalid RPC reply", transport.responseText); - return; - } - - const error_code = reply['error']['code']; - - if (error_code && error_code != 0) { - return fatalError(error_code, reply['error']['message']); - } - - console.log("sanity check ok"); - - const params = reply['init-params']; - - if (params) { - console.log('reading init-params...'); - - for (const k in params) { - if (params.hasOwnProperty(k)) { - switch (k) { - case "label_base_index": - _label_base_index = parseInt(params[k]) - break; - case "hotkeys": - // filter mnemonic definitions (used for help panel) from hotkeys map - // i.e. *(191)|Ctrl-/ -> *(191) - - const tmp = []; - for (const sequence in params[k][1]) { - const filtered = sequence.replace(/\|.*$/, ""); - tmp[filtered] = params[k][1][sequence]; - } - - params[k][1] = tmp; - break; - } - - console.log("IP:", k, "=>", params[k]); - } - } - - init_params = params; - - // PluginHost might not be available on non-index pages - window.PluginHost && PluginHost.run(PluginHost.HOOK_PARAMS_LOADED, init_params); - } - - init_second_stage(); -} - // noinspection JSUnusedGlobalSymbols function genUrlChangeKey(feed, is_cat) { if (confirm(__("Generate new syndication address for this feed?"))) { diff --git a/js/tt-rss.js b/js/tt-rss.js index 078ac7c63..66a94f714 100644 --- a/js/tt-rss.js +++ b/js/tt-rss.js @@ -5,6 +5,158 @@ let hotkey_actions = {}; const App = { global_unread: -1, + init: function() { + + window.onerror = function (message, filename, lineno, colno, error) { + report_error(message, filename, lineno, colno, error); + }; + + require(["dojo/_base/kernel", + "dojo/ready", + "dojo/parser", + "dojo/_base/loader", + "dojo/_base/html", + "dojo/query", + "dijit/ProgressBar", + "dijit/ColorPalette", + "dijit/Dialog", + "dijit/form/Button", + "dijit/form/ComboButton", + "dijit/form/CheckBox", + "dijit/form/DropDownButton", + "dijit/form/FilteringSelect", + "dijit/form/Form", + "dijit/form/RadioButton", + "dijit/form/Select", + "dijit/form/MultiSelect", + "dijit/form/SimpleTextarea", + "dijit/form/TextBox", + "dijit/form/ComboBox", + "dijit/form/ValidationTextBox", + "dijit/InlineEditBox", + "dijit/layout/AccordionContainer", + "dijit/layout/BorderContainer", + "dijit/layout/ContentPane", + "dijit/layout/TabContainer", + "dijit/PopupMenuItem", + "dijit/Menu", + "dijit/Toolbar", + "dijit/Tree", + "dijit/tree/dndSource", + "dijit/tree/ForestStoreModel", + "dojo/data/ItemFileWriteStore", + "fox/FeedStoreModel", + "fox/FeedTree"], function (dojo, ready, parser) { + + ready(function () { + + try { + parser.parse(); + + if (!App.genericSanityCheck()) + return false; + + setLoadingProgress(30); + init_hotkey_actions(); + + const a = document.createElement('audio'); + const hasAudio = !!a.canPlayType; + const hasSandbox = "sandbox" in document.createElement("iframe"); + const hasMp3 = !!(a.canPlayType && a.canPlayType('audio/mpeg;').replace(/no/, '')); + const clientTzOffset = new Date().getTimezoneOffset() * 60; + + const params = { + op: "rpc", method: "sanityCheck", hasAudio: hasAudio, + hasMp3: hasMp3, + clientTzOffset: clientTzOffset, + hasSandbox: hasSandbox + }; + + xhrPost("backend.php", params, (transport) => { + try { + Utils.backendSanityCallback(transport); + } catch (e) { + console.error(e); + } + }); + + } catch (e) { + exception_error(e); + } + + }); + + + }); + }, + initSecondStage: function () { + Feeds.reload(); + Article.closeArticlePanel(); + + if (parseInt(getCookie("ttrss_fh_width")) > 0) { + dijit.byId("feeds-holder").domNode.setStyle( + {width: getCookie("ttrss_fh_width") + "px"}); + } + + dijit.byId("main").resize(); + + dojo.connect(dijit.byId('feeds-holder'), 'resize', + function (args) { + if (args && args.w >= 0) { + setCookie("ttrss_fh_width", args.w, getInitParam("cookie_lifetime")); + } + }); + + dojo.connect(dijit.byId('content-insert'), 'resize', + function (args) { + if (args && args.w >= 0 && args.h >= 0) { + setCookie("ttrss_ci_width", args.w, getInitParam("cookie_lifetime")); + setCookie("ttrss_ci_height", args.h, getInitParam("cookie_lifetime")); + } + }); + + delCookie("ttrss_test"); + + const toolbar = document.forms["main_toolbar_form"]; + + dijit.getEnclosingWidget(toolbar.view_mode).attr('value', + getInitParam("default_view_mode")); + + dijit.getEnclosingWidget(toolbar.order_by).attr('value', + getInitParam("default_view_order_by")); + + const hash_feed_id = hash_get('f'); + const hash_feed_is_cat = hash_get('c') == "1"; + + if (hash_feed_id != undefined) { + Feeds.setActiveFeedId(hash_feed_id, hash_feed_is_cat); + } + + setLoadingProgress(50); + + ArticleCache.clear(); + + _widescreen_mode = getInitParam("widescreen"); + this.switchPanelMode(_widescreen_mode); + + Headlines.initScrollHandler(); + + console.log("second stage ok"); + + if (getInitParam("simple_update")) { + console.log("scheduling simple feed updater..."); + window.setTimeout(update_random_feed, 30 * 1000); + } + }, + genericSanityCheck: function() { + setCookie("ttrss_test", "TEST"); + + if (getCookie("ttrss_test") != "TEST") { + return fatalError(2); + } + + return true; + }, updateTitle: function() { let tmp = "Tiny Tiny RSS"; @@ -14,6 +166,10 @@ const App = { document.title = tmp; }, + onViewModeChanged: function() { + ArticleCache.clear(); + return Feeds.viewCurrentFeed(''); + }, isCombinedMode: function() { return getInitParam("combined_display_mode"); }, @@ -73,7 +229,7 @@ const App = { Article.closeArticlePanel(); - if (article_id) view(article_id); + if (article_id) Article.view(article_id); xhrPost("backend.php", {op: "rpc", method: "setpanelmode", wide: wide ? 1 : 0}); }, @@ -102,176 +258,80 @@ function search() { dialog.show(); } -function genericSanityCheck() { - setCookie("ttrss_test", "TEST"); - - if (getCookie("ttrss_test") != "TEST") { - return fatalError(2); - } - - return true; -} - - -function init() { - - window.onerror = function(message, filename, lineno, colno, error) { - report_error(message, filename, lineno, colno, error); - }; - - require(["dojo/_base/kernel", - "dojo/ready", - "dojo/parser", - "dojo/_base/loader", - "dojo/_base/html", - "dojo/query", - "dijit/ProgressBar", - "dijit/ColorPalette", - "dijit/Dialog", - "dijit/form/Button", - "dijit/form/ComboButton", - "dijit/form/CheckBox", - "dijit/form/DropDownButton", - "dijit/form/FilteringSelect", - "dijit/form/Form", - "dijit/form/RadioButton", - "dijit/form/Select", - "dijit/form/MultiSelect", - "dijit/form/SimpleTextarea", - "dijit/form/TextBox", - "dijit/form/ComboBox", - "dijit/form/ValidationTextBox", - "dijit/InlineEditBox", - "dijit/layout/AccordionContainer", - "dijit/layout/BorderContainer", - "dijit/layout/ContentPane", - "dijit/layout/TabContainer", - "dijit/PopupMenuItem", - "dijit/Menu", - "dijit/Toolbar", - "dijit/Tree", - "dijit/tree/dndSource", - "dijit/tree/ForestStoreModel", - "dojo/data/ItemFileWriteStore", - "fox/FeedStoreModel", - "fox/FeedTree" ], function (dojo, ready, parser) { - - ready(function() { - - try { - parser.parse(); - - if (!genericSanityCheck()) - return false; - - setLoadingProgress(30); - init_hotkey_actions(); - - const a = document.createElement('audio'); - const hasAudio = !!a.canPlayType; - const hasSandbox = "sandbox" in document.createElement("iframe"); - const hasMp3 = !!(a.canPlayType && a.canPlayType('audio/mpeg;').replace(/no/, '')); - const clientTzOffset = new Date().getTimezoneOffset() * 60; - - const params = { - op: "rpc", method: "sanityCheck", hasAudio: hasAudio, - hasMp3: hasMp3, - clientTzOffset: clientTzOffset, - hasSandbox: hasSandbox - }; - - xhrPost("backend.php", params, (transport) => { - try { - backend_sanity_check_callback(transport); - } catch (e) { - console.error(e); - } - }); - - } catch (e) { - exception_error(e); - } - - }); - - - }); -} - function init_hotkey_actions() { - hotkey_actions["next_feed"] = function() { + hotkey_actions["next_feed"] = function () { const rv = dijit.byId("feedTree").getNextFeed( Feeds.getActiveFeedId(), Feeds.activeFeedIsCat()); if (rv) Feeds.viewfeed({feed: rv[0], is_cat: rv[1], delayed: true}) }; - hotkey_actions["prev_feed"] = function() { + hotkey_actions["prev_feed"] = function () { const rv = dijit.byId("feedTree").getPreviousFeed( Feeds.getActiveFeedId(), Feeds.activeFeedIsCat()); if (rv) Feeds.viewfeed({feed: rv[0], is_cat: rv[1], delayed: true}) }; - hotkey_actions["next_article"] = function() { + hotkey_actions["next_article"] = function () { moveToPost('next'); }; - hotkey_actions["prev_article"] = function() { + hotkey_actions["prev_article"] = function () { moveToPost('prev'); }; - hotkey_actions["next_article_noscroll"] = function() { + hotkey_actions["next_article_noscroll"] = function () { moveToPost('next', true); }; - hotkey_actions["prev_article_noscroll"] = function() { + hotkey_actions["prev_article_noscroll"] = function () { moveToPost('prev', true); }; - hotkey_actions["next_article_noexpand"] = function() { + hotkey_actions["next_article_noexpand"] = function () { moveToPost('next', true, true); }; - hotkey_actions["prev_article_noexpand"] = function() { + hotkey_actions["prev_article_noexpand"] = function () { moveToPost('prev', true, true); }; - hotkey_actions["search_dialog"] = function() { + hotkey_actions["search_dialog"] = function () { search(); }; - hotkey_actions["toggle_mark"] = function() { + hotkey_actions["toggle_mark"] = function () { selectionToggleMarked(); }; - hotkey_actions["toggle_publ"] = function() { + hotkey_actions["toggle_publ"] = function () { selectionTogglePublished(); }; - hotkey_actions["toggle_unread"] = function() { + hotkey_actions["toggle_unread"] = function () { selectionToggleUnread({no_error: 1}); }; - hotkey_actions["edit_tags"] = function() { + hotkey_actions["edit_tags"] = function () { const id = getActiveArticleId(); if (id) { editArticleTags(id); } } - hotkey_actions["open_in_new_window"] = function() { + hotkey_actions["open_in_new_window"] = function () { if (getActiveArticleId()) { Article.openArticleInNewWindow(getActiveArticleId()); } }; - hotkey_actions["catchup_below"] = function() { + hotkey_actions["catchup_below"] = function () { catchupRelativeToArticle(1); }; - hotkey_actions["catchup_above"] = function() { + hotkey_actions["catchup_above"] = function () { catchupRelativeToArticle(0); }; - hotkey_actions["article_scroll_down"] = function() { + hotkey_actions["article_scroll_down"] = function () { scrollArticle(40); }; - hotkey_actions["article_scroll_up"] = function() { + hotkey_actions["article_scroll_up"] = function () { scrollArticle(-40); }; - hotkey_actions["close_article"] = function() { + hotkey_actions["close_article"] = function () { if (App.isCombinedMode()) { cdmCollapseActive(); } else { Article.closeArticlePanel(); } }; - hotkey_actions["email_article"] = function() { + hotkey_actions["email_article"] = function () { if (typeof emailArticle != "undefined") { emailArticle(); } else if (typeof mailtoArticle != "undefined") { @@ -280,37 +340,37 @@ function init_hotkey_actions() { alert(__("Please enable mail plugin first.")); } }; - hotkey_actions["select_all"] = function() { + hotkey_actions["select_all"] = function () { selectArticles('all'); }; - hotkey_actions["select_unread"] = function() { + hotkey_actions["select_unread"] = function () { selectArticles('unread'); }; - hotkey_actions["select_marked"] = function() { + hotkey_actions["select_marked"] = function () { selectArticles('marked'); }; - hotkey_actions["select_published"] = function() { + hotkey_actions["select_published"] = function () { selectArticles('published'); }; - hotkey_actions["select_invert"] = function() { + hotkey_actions["select_invert"] = function () { selectArticles('invert'); }; - hotkey_actions["select_none"] = function() { + hotkey_actions["select_none"] = function () { selectArticles('none'); }; - hotkey_actions["feed_refresh"] = function() { + hotkey_actions["feed_refresh"] = function () { if (Feeds.getActiveFeedId() != undefined) { Feeds.viewfeed({feed: Feeds.getActiveFeedId(), is_cat: Feeds.activeFeedIsCat()}); return; } }; - hotkey_actions["feed_unhide_read"] = function() { + hotkey_actions["feed_unhide_read"] = function () { Feeds.toggleDispRead(); }; - hotkey_actions["feed_subscribe"] = function() { + hotkey_actions["feed_subscribe"] = function () { quickAddFeed(); }; - hotkey_actions["feed_debug_update"] = function() { + hotkey_actions["feed_debug_update"] = function () { if (!Feeds.activeFeedIsCat() && parseInt(Feeds.getActiveFeedId()) > 0) { window.open("backend.php?op=feeds&method=update_debugger&feed_id=" + Feeds.getActiveFeedId() + "&csrf_token=" + getInitParam("csrf_token")); @@ -319,58 +379,57 @@ function init_hotkey_actions() { } }; - hotkey_actions["feed_debug_viewfeed"] = function() { + hotkey_actions["feed_debug_viewfeed"] = function () { Feeds.viewfeed({feed: Feeds.getActiveFeedId(), is_cat: Feeds.activeFeedIsCat(), viewfeed_debug: true}); }; - hotkey_actions["feed_edit"] = function() { + hotkey_actions["feed_edit"] = function () { if (Feeds.activeFeedIsCat()) alert(__("You can't edit this kind of feed.")); else editFeed(Feeds.getActiveFeedId()); }; - hotkey_actions["feed_catchup"] = function() { + hotkey_actions["feed_catchup"] = function () { if (Feeds.getActiveFeedId() != undefined) { Feeds.catchupCurrentFeed(); return; } }; - hotkey_actions["feed_reverse"] = function() { - reverseHeadlineOrder(); + hotkey_actions["feed_reverse"] = function () { + Headlines.reverseHeadlineOrder(); }; - hotkey_actions["feed_toggle_vgroup"] = function() { + hotkey_actions["feed_toggle_vgroup"] = function () { xhrPost("backend.php", {op: "rpc", method: "togglepref", key: "VFEED_GROUP_BY_FEED"}, () => { Feeds.viewCurrentFeed(); }) }; - hotkey_actions["catchup_all"] = function() { + hotkey_actions["catchup_all"] = function () { Feeds.catchupAllFeeds(); }; - hotkey_actions["cat_toggle_collapse"] = function() { + hotkey_actions["cat_toggle_collapse"] = function () { if (Feeds.activeFeedIsCat()) { dijit.byId("feedTree").collapseCat(Feeds.getActiveFeedId()); - return; } }; - hotkey_actions["goto_all"] = function() { + hotkey_actions["goto_all"] = function () { Feeds.viewfeed({feed: -4}); }; - hotkey_actions["goto_fresh"] = function() { + hotkey_actions["goto_fresh"] = function () { Feeds.viewfeed({feed: -3}); }; - hotkey_actions["goto_marked"] = function() { + hotkey_actions["goto_marked"] = function () { Feeds.viewfeed({feed: -1}); }; - hotkey_actions["goto_published"] = function() { + hotkey_actions["goto_published"] = function () { Feeds.viewfeed({feed: -2}); }; - hotkey_actions["goto_tagcloud"] = function() { + hotkey_actions["goto_tagcloud"] = function () { Utils.displayDlg(__("Tag cloud"), "printTagCloud"); }; - hotkey_actions["goto_prefs"] = function() { + hotkey_actions["goto_prefs"] = function () { gotoPreferences(); }; - hotkey_actions["select_article_cursor"] = function() { + hotkey_actions["select_article_cursor"] = function () { const id = getArticleUnderPointer(); if (id) { const row = $("RROW-" + id); @@ -389,16 +448,16 @@ function init_hotkey_actions() { } } }; - hotkey_actions["create_label"] = function() { + hotkey_actions["create_label"] = function () { addLabel(); }; - hotkey_actions["create_filter"] = function() { + hotkey_actions["create_filter"] = function () { quickAddFilter(); }; - hotkey_actions["collapse_sidebar"] = function() { + hotkey_actions["collapse_sidebar"] = function () { Feeds.viewCurrentFeed(); }; - hotkey_actions["toggle_embed_original"] = function() { + hotkey_actions["toggle_embed_original"] = function () { if (typeof embedOriginalArticle != "undefined") { if (getActiveArticleId()) embedOriginalArticle(getActiveArticleId()); @@ -406,7 +465,7 @@ function init_hotkey_actions() { alert(__("Please enable embed_original plugin first.")); } }; - hotkey_actions["toggle_widescreen"] = function() { + hotkey_actions["toggle_widescreen"] = function () { if (!App.isCombinedMode()) { _widescreen_mode = !_widescreen_mode; @@ -419,10 +478,10 @@ function init_hotkey_actions() { alert(__("Widescreen is not available in combined mode.")); } }; - hotkey_actions["help_dialog"] = function() { + hotkey_actions["help_dialog"] = function () { Utils.helpDialog("main"); }; - hotkey_actions["toggle_combined_mode"] = function() { + hotkey_actions["toggle_combined_mode"] = function () { notify_progress("Loading, please wait..."); const value = App.isCombinedMode() ? "false" : "true"; @@ -435,79 +494,16 @@ function init_hotkey_actions() { Feeds.viewCurrentFeed(); }) }; - hotkey_actions["toggle_cdm_expanded"] = function() { + hotkey_actions["toggle_cdm_expanded"] = function () { notify_progress("Loading, please wait..."); const value = getInitParam("cdm_expanded") ? "false" : "true"; - xhrPost("backend.php", { op: "rpc", method: "setpref", key: "CDM_EXPANDED", value: value }, () => { + xhrPost("backend.php", {op: "rpc", method: "setpref", key: "CDM_EXPANDED", value: value}, () => { setInitParam("cdm_expanded", !getInitParam("cdm_expanded")); Feeds.viewCurrentFeed(); }); }; - -} - -function init_second_stage() { - Feeds.reload(); - Article.closeArticlePanel(); - - if (parseInt(getCookie("ttrss_fh_width")) > 0) { - dijit.byId("feeds-holder").domNode.setStyle( - {width: getCookie("ttrss_fh_width") + "px" }); - } - - dijit.byId("main").resize(); - - var tmph = dojo.connect(dijit.byId('feeds-holder'), 'resize', - function (args) { - if (args && args.w >= 0) { - setCookie("ttrss_fh_width", args.w, getInitParam("cookie_lifetime")); - } - }); - - var tmph = dojo.connect(dijit.byId('content-insert'), 'resize', - function (args) { - if (args && args.w >= 0 && args.h >= 0) { - setCookie("ttrss_ci_width", args.w, getInitParam("cookie_lifetime")); - setCookie("ttrss_ci_height", args.h, getInitParam("cookie_lifetime")); - } - }); - - delCookie("ttrss_test"); - - const toolbar = document.forms["main_toolbar_form"]; - - dijit.getEnclosingWidget(toolbar.view_mode).attr('value', - getInitParam("default_view_mode")); - - dijit.getEnclosingWidget(toolbar.order_by).attr('value', - getInitParam("default_view_order_by")); - - const hash_feed_id = hash_get('f'); - const hash_feed_is_cat = hash_get('c') == "1"; - - if (hash_feed_id != undefined) { - Feeds.setActiveFeedId(hash_feed_id, hash_feed_is_cat); - } - - setLoadingProgress(50); - - // can't use cache_clear() here because viewfeed might not have initialized yet - if ('sessionStorage' in window && window['sessionStorage'] !== null) - sessionStorage.clear(); - - _widescreen_mode = getInitParam("widescreen"); - App.switchPanelMode(_widescreen_mode); - - Headlines.initScrollHandler(); - - console.log("second stage ok"); - - if (getInitParam("simple_update")) { - console.log("scheduling simple feed updater..."); - window.setTimeout(update_random_feed, 30*1000); - } } function quickMenuGo(opid) { @@ -584,33 +580,10 @@ function quickMenuGo(opid) { } } -function viewModeChanged() { - cache_clear(); - return Feeds.viewCurrentFeed(''); -} - function inPreferences() { return false; } -function reverseHeadlineOrder() { - - const toolbar = document.forms["main_toolbar_form"]; - const order_by = dijit.getEnclosingWidget(toolbar.order_by); - - let value = order_by.attr('value'); - - if (value == "date_reverse") - value = "default"; - else - value = "date_reverse"; - - order_by.attr('value', value); - - Feeds.viewCurrentFeed(); - -} - function update_random_feed() { console.log("in update_random_feed"); diff --git a/js/viewfeed.js b/js/viewfeed.js index b74d321e4..f57f7fc6c 100755 --- a/js/viewfeed.js +++ b/js/viewfeed.js @@ -13,7 +13,29 @@ let loaded_article_ids = []; let current_first_id = 0; let last_search_query; -let has_storage = 'sessionStorage' in window && window['sessionStorage'] !== null; +const ArticleCache = { + has_storage: 'sessionStorage' in window && window['sessionStorage'] !== null, + set: function(id, obj) { + if (this.has_storage) + try { + sessionStorage["article:" + id] = obj; + } catch (e) { + sessionStorage.clear(); + } + }, + get: function(id) { + if (this.has_storage) + return sessionStorage["article:" + id]; + }, + clear: function() { + if (this.has_storage) + sessionStorage.clear(); + }, + del: function(id) { + if (this.has_storage) + sessionStorage.removeItem("article:" + id); + }, +}; const Article = { closeArticlePanel: function () { @@ -58,6 +80,62 @@ const Article = { } catch (e) { } }, + view: function(id, noexpand) { + setActiveArticleId(id); + + if (!noexpand) { + console.log("loading article", id); + + const cids = []; + + /* only request uncached articles */ + + getRelativePostIds(id).each((n) => { + if (!ArticleCache.get(n)) + cids.push(n); + }); + + const cached_article = ArticleCache.get(id); + + if (cached_article) { + console.log('rendering cached', id); + this.renderArticle(cached_article); + return false; + } + + xhrPost("backend.php", {op: "article", method: "view", id: id, cids: cids.toString()}, (transport) => { + try { + const reply = Utils.handleRpcJson(transport); + + if (reply) { + + reply.each(function (article) { + if (getActiveArticleId() == article['id']) { + Article.renderArticle(article['content']); + } + ArticleCache.set(article['id'], article['content']); + }); + + } else { + console.error("Invalid object received: " + transport.responseText); + + Article.renderArticle("
" + + __('Could not display article (invalid object received - see error console for details)') + "
"); + } + + //const unread_in_buffer = $$("#headlines-frame > div[id*=RROW][class*=Unread]").length; + //request_counters(unread_in_buffer == 0); + + notify(""); + + } catch (e) { + exception_error(e); + } + }) + } + + return false; + }, } const Headlines = { @@ -409,66 +487,22 @@ const Headlines = { notify(""); }, -}; + reverseHeadlineOrder: function() { + const toolbar = document.forms["main_toolbar_form"]; + const order_by = dijit.getEnclosingWidget(toolbar.order_by); -function view(id, noexpand) { - setActiveArticleId(id); - - if (!noexpand) { - console.log("loading article", id); + let value = order_by.attr('value'); - const cids = []; + if (value == "date_reverse") + value = "default"; + else + value = "date_reverse"; - /* only request uncached articles */ - - getRelativePostIds(id).each((n) => { - if (!cache_get("article:" + n)) - cids.push(n); - }); + order_by.attr('value', value); - const cached_article = cache_get("article:" + id); - - if (cached_article) { - console.log('rendering cached', id); - Article.renderArticle(cached_article); - return false; - } - - xhrPost("backend.php", {op: "article", method: "view", id: id, cids: cids.toString()}, (transport) => { - try { - const reply = Utils.handleRpcJson(transport); - - if (reply) { - - reply.each(function(article) { - if (getActiveArticleId() == article['id']) { - Article.renderArticle(article['content']); - } - //cids_requested.remove(article['id']); - - cache_set("article:" + article['id'], article['content']); - }); - - } else { - console.error("Invalid object received: " + transport.responseText); - - Article.renderArticle("
" + - __('Could not display article (invalid object received - see error console for details)') + "
"); - } - - //const unread_in_buffer = $$("#headlines-frame > div[id*=RROW][class*=Unread]").length; - //request_counters(unread_in_buffer == 0); - - notify(""); - - } catch (e) { - exception_error(e); - } - }) - } - - return false; -} + Feeds.viewCurrentFeed(); + }, +}; function toggleMark(id, client_only) { const query = { op: "rpc", id: id, method: "mark" }; @@ -576,7 +610,7 @@ function moveToPost(mode, noscroll, noexpand) { } else if (next_id) { correctHeadlinesOffset(next_id); - view(next_id, noexpand); + Article.view(next_id, noexpand); } } } @@ -601,7 +635,7 @@ function moveToPost(mode, noscroll, noexpand) { } else if (prev_id) { correctHeadlinesOffset(prev_id); - view(prev_id, noexpand); + Article.view(prev_id, noexpand); } } } @@ -918,7 +952,7 @@ function archiveSelection() { } for (let i = 0; i < rows.length; i++) { - cache_delete("article:" + rows[i]); + ArticleCache.del(rows[i]); } const query = {op: "rpc", method: op, ids: rows.toString()}; @@ -1224,7 +1258,7 @@ function hlClicked(event, id) { Article.openArticleInNewWindow(id); setActiveArticleId(id); } else { - view(id); + Article.view(id); } return false; @@ -1505,31 +1539,6 @@ function initHeadlinesMenu() { } } -function cache_set(id, obj) { - //console.log("cache_set: " + id); - if (has_storage) - try { - sessionStorage[id] = obj; - } catch (e) { - sessionStorage.clear(); - } -} - -function cache_get(id) { - if (has_storage) - return sessionStorage[id]; -} - -function cache_clear() { - if (has_storage) - sessionStorage.clear(); -} - -function cache_delete(id) { - if (has_storage) - sessionStorage.removeItem(id); -} - // noinspection JSUnusedGlobalSymbols function setSelectionScore() { const ids = getSelectedArticleIds2(); -- cgit v1.2.3