From: Andrew Dolgov Date: Sat, 20 Nov 2010 18:06:36 +0000 (+0300) Subject: refactor feed subscription/browser dialogs X-Git-Tag: 1.5.0~108 X-Git-Url: https://git.wh0rd.org/?a=commitdiff_plain;h=11b9d0becdfc894c04afaa912798917911ff35a8;p=tt-rss.git refactor feed subscription/browser dialogs --- diff --git a/functions.js b/functions.js index 4f1f3755..69d09c5b 100644 --- a/functions.js +++ b/functions.js @@ -560,109 +560,6 @@ function createFilter() { } } -function isValidURL(s) { - return s.match("http://") != null || s.match("https://") != null || s.match("feed://") != null; -} - -function subscribeToFeed() { - - try { - - var form = document.forms['feed_add_form']; - var feed_url = form.feed_url.value; - - if (feed_url == "") { - alert(__("Can't subscribe: no feed URL given.")); - return false; - } - - notify_progress(__("Subscribing to feed..."), true); - - var query = Form.serialize("feed_add_form"); - - console.log("subscribe q: " + query); - - Form.disable("feed_add_form"); - - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - try { - - if (!transport.responseXML) { - console.log(transport.responseText); - alert(__("Server error while trying to subscribe to specified feed.")); - return; - } - - var result = transport.responseXML.getElementsByTagName('result')[0]; - var rc = parseInt(result.getAttribute('code')); - - Form.enable("feed_add_form"); - - notify(''); - - switch (rc) { - case 1: - closeInfoBox(); - notify_info(__("Subscribed to %s").replace("%s", feed_url)); - - if (inPreferences()) { - updateFeedList(); - } else { - setTimeout('updateFeedList(false, false)', 50); - } - break; - case 2: - alert(__("Specified URL seems to be invalid.")); - break; - case 3: - alert(__("Specified URL doesn't seem to contain any feeds.")); - break; - case 4: - new Ajax.Request("backend.php", { - parameters: 'op=rpc&subop=extractfeedurls&url=' + encodeURIComponent(feed_url), - onComplete: function(transport) { - var result = transport.responseXML.getElementsByTagName('urls')[0]; - var feeds = JSON.parse(result.firstChild.nodeValue); - var select = document.getElementById("faad_feeds_container_select"); - - while (select.hasChildNodes()) { - select.removeChild(elem.firstChild); - } - var count = 0; - for (var feedUrl in feeds) { - select.insert(new Option(feeds[feedUrl], feedUrl, false)); - count++; - } - if (count > 5) count = 5; - select.size = count; - - Effect.Appear('fadd_feeds_container', {duration : 0.5}); - } - }); - break; - case 5: - alert(__("Couldn't download the specified URL.")); - break; - case 0: - alert(__("You are already subscribed to this feed.")); - break; - } - - } catch (e) { - exception_error("subscribeToFeed", e); - } - - } }); - - } catch (e) { - exception_error("subscribeToFeed", e); - } - - return false; -} - function filterCR(e, f) { var key; @@ -857,7 +754,7 @@ function remove_splash() { } } -function getSelectedFeedsFromBrowser() { +/* function getSelectedFeedsFromBrowser() { var list = $$("#browseFeedList li[id*=FBROW]"); @@ -865,52 +762,15 @@ function getSelectedFeedsFromBrowser() { list.each(function(child) { var id = child.id.replace("FBROW-", ""); - var cb = $("FBCHK-" + id); - if (cb.checked) { + if (child.hasClassName('Selected')) { selected.push(id); } }); return selected; -} - -function updateFeedBrowser() { - try { - - var query = Form.serialize("feed_browser"); - - Element.show('feed_browser_spinner'); - - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - notify(''); +} */ - Element.hide('feed_browser_spinner'); - - var c = $("browseFeedList"); - var r = transport.responseXML.getElementsByTagName("content")[0]; - var nr = transport.responseXML.getElementsByTagName("num-results")[0]; - var mode = transport.responseXML.getElementsByTagName("mode")[0]; - - if (c && r) { - c.innerHTML = r.firstChild.nodeValue; - } - - if (parseInt(mode.getAttribute("value")) == 2) { - Element.show('feed_archive_remove'); - } else { - Element.hide('feed_archive_remove'); - } - - } }); - - } catch (e) { - exception_error("updateFeedBrowser", e); - } - -} function transport_error_check(transport) { try { @@ -971,78 +831,6 @@ function hideAuxDlg() { } } -function feedBrowserSubscribe() { - try { - - var selected = getSelectedFeedsFromBrowser(); - - var mode = document.forms['feed_browser'].mode; - - mode = mode[mode.selectedIndex].value; - - if (selected.length > 0) { - closeInfoBox(); - - notify_progress("Loading, please wait...", true); - - var query = "?op=rpc&subop=massSubscribe&ids="+ - param_escape(selected.toString()) + "&mode=" + param_escape(mode); - - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - - var nf = transport.responseXML.getElementsByTagName('num-feeds')[0]; - var nf_value = nf.getAttribute("value"); - - notify_info(__("Subscribed to %d feed(s).").replace("%d", nf_value)); - - if (inPreferences()) { - updateFeedList(); - } else { - setTimeout('updateFeedList(false, false)', 50); - } - } }); - - } else { - alert(__("No feeds are selected.")); - } - - } catch (e) { - exception_error("feedBrowserSubscribe", e); - } -} - -function feedArchiveRemove() { - try { - - var selected = getSelectedFeedsFromBrowser(); - - if (selected.length > 0) { - - var pr = __("Remove selected feeds from the archive? Feeds with stored articles will not be removed."); - - if (confirm(pr)) { - Element.show('feed_browser_spinner'); - - var query = "?op=rpc&subop=remarchived&ids=" + - param_escape(selected.toString());; - - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - updateFeedBrowser(); - } }); - } - - } else { - alert(__("No feeds are selected.")); - } - - } catch (e) { - exception_error("feedArchiveRemove", e); - } -} function uploadIconHandler(rc) { try { @@ -1162,8 +950,119 @@ function addLabel(select, callback) { } function quickAddFeed() { - displayDlg('quickAddFeed', '', - function () {$('feed_url').focus();}); + try { + var query = "backend.php?op=dlg&id=quickAddFeed"; + + if (dijit.byId("feedAddDlg")) + dijit.byId("feedAddDlg").destroyRecursive(); + + var dialog = new dijit.Dialog({ + id: "feedAddDlg", + title: __("Subscribe to Feed"), + style: "width: 600px", + execute: function() { + if (this.validate()) { + console.log(dojo.objectToQuery(this.attr('value'))); + + var feed_url = this.attr('value').feed; + + notify_progress(__("Subscribing to feed..."), true); + + new Ajax.Request("backend.php", { + parameters: dojo.objectToQuery(this.attr('value')), + onComplete: function(transport) { + try { + + if (!transport.responseXML) { + console.log(transport.responseText); + alert(__("Server error while trying to subscribe to specified feed.")); + return; + } + + var result = transport.responseXML.getElementsByTagName('result')[0]; + var rc = parseInt(result.getAttribute('code')); + + notify(''); + + console.log("GOT RC: " + rc); + + switch (rc) { + case 1: + dialog.hide(); + notify_info(__("Subscribed to %s").replace("%s", feed_url)); + + if (inPreferences()) { + updateFeedList(); + } else { + setTimeout('updateFeedList(false, false)', 50); + } + break; + case 2: + alert(__("Specified URL seems to be invalid.")); + break; + case 3: + alert(__("Specified URL doesn't seem to contain any feeds.")); + break; + case 4: + notify_progress("Searching for feed urls...", true); + + new Ajax.Request("backend.php", { + parameters: 'op=rpc&subop=extractfeedurls&url=' + param_escape(feed_url), + onComplete: function(transport, dialog, feed_url) { + + if (!transport.responseXML) { + console.log(transport.responseText); + alert(__("Server error while trying to query feed URLs.")); + return; + } + + notify(''); + + var result = transport.responseXML.getElementsByTagName('urls')[0]; + var feeds = JSON.parse(result.firstChild.nodeValue); + + console.log(transport.responseText); + + var select = dijit.byId("feedDlg_feedContainerSelect"); + + while (select.getOptions().length > 0) + select.removeOption(0); + + var count = 0; + for (var feedUrl in feeds) { + select.addOption({value: feedUrl, label: feeds[feedUrl]}); + count++; + } + +// if (count > 5) count = 5; +// select.size = count; + + Effect.Appear('feedDlg_feedsContainer', {duration : 0.5}); + } + }); + break; + case 5: + alert(__("Couldn't download the specified URL.")); + break; + case 0: + alert(__("You are already subscribed to this feed.")); + break; + } + + } catch (e) { + exception_error("subscribeToFeed", e); + } + + } }); + + } + }, + href: query}); + + dialog.show(); + } catch (e) { + exception_error("quickAddFeed", e); + } } function quickAddFilter() { @@ -1239,8 +1138,8 @@ function unsubscribeFeed(feed_id, title) { parameters: query, onComplete: function(transport) { - closeInfoBox(); - + if (dijit.byId("feedEditDlg")) dijit.byId("feedEditDlg").hide(); + if (inPreferences()) { updateFeedList(); } else { @@ -1603,4 +1502,133 @@ function editFeed(feed, event) { } } +function feedBrowser() { + try { + var query = "backend.php?op=dlg&id=feedBrowser"; + + if (dijit.byId("feedAddDlg")) + dijit.byId("feedAddDlg").hide(); + + if (dijit.byId("feedBrowserDlg")) + dijit.byId("feedBrowserDlg").destroyRecursive(); + + var dialog = new dijit.Dialog({ + id: "feedBrowserDlg", + title: __("More Feeds"), + style: "width: 600px", + getSelectedFeeds: function() { + var list = $$("#browseFeedList li[id*=FBROW]"); + var selected = new Array(); + + list.each(function(child) { + var id = child.id.replace("FBROW-", ""); + + if (child.hasClassName('Selected')) { + selected.push(id); + } + }); + + return selected; + }, + subscribe: function() { + var selected = this.getSelectedFeeds(); + var mode = this.attr('value').mode; + + if (selected.length > 0) { + dijit.byId("feedBrowserDlg").hide(); + + notify_progress("Loading, please wait...", true); + + var query = "?op=rpc&subop=massSubscribe&ids="+ + param_escape(selected.toString()) + "&mode=" + param_escape(mode); + + console.log(query); + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + + var nf = transport.responseXML.getElementsByTagName('num-feeds')[0]; + var nf_value = nf.getAttribute("value"); + + notify_info(__("Subscribed to %d feed(s).").replace("%d", nf_value)); + + if (inPreferences()) { + updateFeedList(); + } else { + setTimeout('updateFeedList(false, false)', 50); + } + } }); + + } else { + alert(__("No feeds are selected.")); + } + + }, + update: function() { + var query = dojo.objectToQuery(dialog.attr('value')); + + Element.show('feed_browser_spinner'); + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + notify(''); + + Element.hide('feed_browser_spinner'); + + var c = $("browseFeedList"); + var r = transport.responseXML.getElementsByTagName("content")[0]; + var nr = transport.responseXML.getElementsByTagName("num-results")[0]; + var mode = transport.responseXML.getElementsByTagName("mode")[0]; + + if (c && r) { + c.innerHTML = r.firstChild.nodeValue; + } + + dojo.parser.parse("browseFeedList"); + + if (parseInt(mode.getAttribute("value")) == 2) { + Element.show(dijit.byId('feed_archive_remove').domNode); + } else { + Element.hide(dijit.byId('feed_archive_remove').domNode); + } + + } }); + }, + removeFromArchive: function() { + var selected = this.getSelectedFeeds(); + + if (selected.length > 0) { + + var pr = __("Remove selected feeds from the archive? Feeds with stored articles will not be removed."); + + if (confirm(pr)) { + Element.show('feed_browser_spinner'); + + var query = "?op=rpc&subop=remarchived&ids=" + + param_escape(selected.toString());; + + new Ajax.Request("backend.php", { + parameters: query, + onComplete: function(transport) { + dialog.update(); + } }); + } + } + }, + execute: function() { + if (this.validate()) { + this.subscribe(); + } + }, + href: query}); + + dialog.show(); + + } catch (e) { + exception_error("editFeed", e); + } +} + diff --git a/modules/popup-dialog.php b/modules/popup-dialog.php index 2f339e66..351d4b0f 100644 --- a/modules/popup-dialog.php +++ b/modules/popup-dialog.php @@ -240,109 +240,101 @@ if ($id == "quickAddFeed") { - print "".__('Subscribe to Feed').""; - print ""; - - print ""; - print ""; - //print ""; + print ""; + print ""; print "
".__("Feed")."
"; print "
"; - print __("URL:") . " "; - - print ""; + print ""; print "
"; if (get_pref($link, 'ENABLE_FEED_CATS')) { print __('Place in category:') . " "; - print_feed_cat_select($link, "cat"); + print_feed_cat_select($link, "cat", false, 'dojoType="dijit.form.Select"'); } print "
"; - print '"; print "
".__("Options")."
"; @@ -613,7 +617,7 @@ + onclick=\"return closeInfoBox()\" value=\"".__('Cancel')."\"> "; print "]]>
"; @@ -1411,7 +1415,7 @@ $check_box = ""; + type=\"checkbox\" \">"; $class = ($feedctr % 2) ? "even" : "odd"; @@ -1449,8 +1453,8 @@ $feed_icon = ""; } - $check_box = ""; + $check_box = ""; $class = ($feedctr % 2) ? "even" : "odd"; diff --git a/prefs.js b/prefs.js index 5ca4e333..fdedbd86 100644 --- a/prefs.js +++ b/prefs.js @@ -147,38 +147,6 @@ function updateUsersList(sort_key) { } } -function addFeed() { - - try { - - var link = $("fadd_link"); - - if (link.value.length == 0) { - alert(__("Error: No feed URL given.")); - } else if (!isValidURL(link.value)) { - alert(__("Error: Invalid feed URL.")); - } else { - notify_progress("Adding feed..."); - - var query = "?op=pref-feeds&subop=add&from=tt-rss&feed_url=" + - param_escape(link.value); - - new Ajax.Request("backend.php", { - parameters: query, - onComplete: function(transport) { - feedlist_callback2(transport); - } }); - - link.value = ""; - - } - - } catch (e) { - exception_error("addFeed", e); - } - -} - function addPrefProfile() { var profile = $("fadd_profile"); @@ -1212,7 +1180,7 @@ function pref_hotkey_handler(e) { } if (keycode == 84 && shift_key) { // T - displayDlg('feedBrowser'); + feedBrowser(); return false; } @@ -1564,7 +1532,9 @@ function removeFilter(id, title) { var ok = confirm(msg); if (ok) { - dijit.byId("filterEditDlg").hide(); + + if (dijit.byId("filterEditDlg")) + dijit.byId("filterEditDlg").hide(); notify_progress("Removing filter..."); diff --git a/tt-rss.css b/tt-rss.css index b0733d18..22a72af2 100644 --- a/tt-rss.css +++ b/tt-rss.css @@ -749,10 +749,6 @@ div.subscribers { float : right; } -input.feedBrowseCB { - margin-right : 1em; -} - div.browserDetails { margin : 5px 5px 5px 5px; padding : 5px; diff --git a/tt-rss.js b/tt-rss.js index b36ec4e6..8af5c222 100644 --- a/tt-rss.js +++ b/tt-rss.js @@ -283,6 +283,7 @@ function init() { dojo.require("dijit.Toolbar"); dojo.require("dijit.ProgressBar"); dojo.require("dijit.Menu"); + dojo.require("dojo.parser"); dojo.registerModulePath("fox", "../..");