Browse Source

move several methods from dlg; fix displayed tags not updated after editing

Andrew Dolgov 11 years ago
parent
commit
1c9bda915b
7 changed files with 238 additions and 233 deletions
  1. 34 1
      classes/article.php
  2. 0 214
      classes/dlg.php
  3. 184 1
      classes/feeds.php
  4. 2 2
      classes/rpc.php
  5. 2 2
      js/functions.js
  6. 1 1
      js/tt-rss.js
  7. 15 12
      js/viewfeed.js

+ 34 - 1
classes/article.php

@@ -2,7 +2,7 @@
 class Article extends Handler_Protected {
 
 	function csrf_ignore($method) {
-		$csrf_ignored = array("redirect");
+		$csrf_ignored = array("redirect", "editarticletags");
 
 		return array_search($method, $csrf_ignored) !== false;
 	}
@@ -174,6 +174,39 @@ class Article extends Handler_Protected {
 		return $rc;
 	}
 
+	function editArticleTags() {
+
+		print __("Tags for this article (separated by commas):")."<br>";
+
+		$param = db_escape_string($this->link, $_REQUEST['param']);
+
+		$tags = get_article_tags($this->link, db_escape_string($this->link, $param));
+
+		$tags_str = join(", ", $tags);
+
+		print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"id\" value=\"$param\">";
+		print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"op\" value=\"rpc\">";
+		print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"method\" value=\"setArticleTags\">";
+
+		print "<table width='100%'><tr><td>";
+
+		print "<textarea dojoType=\"dijit.form.SimpleTextarea\" rows='4'
+			style='font-size : 12px; width : 100%' id=\"tags_str\"
+			name='tags_str'>$tags_str</textarea>
+		<div class=\"autocomplete\" id=\"tags_choices\"
+				style=\"display:none\"></div>";
+
+		print "</td></tr></table>";
+
+		print "<div class='dlgButtons'>";
+
+		print "<button dojoType=\"dijit.form.Button\"
+			onclick=\"dijit.byId('editTagsDlg').execute()\">".__('Save')."</button> ";
+		print "<button dojoType=\"dijit.form.Button\"
+			onclick=\"dijit.byId('editTagsDlg').hide()\">".__('Cancel')."</button>";
+		print "</div>";
+
+	}
 
 
 }

+ 0 - 214
classes/dlg.php

@@ -213,220 +213,6 @@ class Dlg extends Handler_Protected {
 		//return;
 	}
 
-	function quickAddFeed() {
-		print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"op\" value=\"rpc\">";
-		print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"method\" value=\"addfeed\">";
-
-		print "<div class=\"dlgSec\">".__("Feed or site URL")."</div>";
-		print "<div class=\"dlgSecCont\">";
-
-		print "<div style='float : right'>
-			<img style='display : none'
-				id='feed_add_spinner' src='images/indicator_white.gif'></div>";
-
-		print "<input style=\"font-size : 16px; width : 20em;\"
-			placeHolder=\"".__("Feed or site URL")."\"
-			dojoType=\"dijit.form.ValidationTextBox\" required=\"1\" name=\"feed\" id=\"feedDlg_feedUrl\">";
-
-		print "<hr/>";
-
-		if (get_pref($this->link, 'ENABLE_FEED_CATS')) {
-			print __('Place in category:') . " ";
-			print_feed_cat_select($this->link, "cat", false, 'dojoType="dijit.form.Select"');
-		}
-
-		print "</div>";
-
-		print '<div id="feedDlg_feedsContainer" style="display : none">
-
-				<div class="dlgSec">' . __('Available feeds') . '</div>
-				<div class="dlgSecCont">'.
-				'<select id="feedDlg_feedContainerSelect"
-					dojoType="dijit.form.Select" size="3">
-					<script type="dojo/method" event="onChange" args="value">
-						dijit.byId("feedDlg_feedUrl").attr("value", value);
-					</script>
-				</select>'.
-				'</div></div>';
-
-		print "<div id='feedDlg_loginContainer' style='display : none'>
-
-				<div class=\"dlgSec\">".__("Authentication")."</div>
-				<div class=\"dlgSecCont\">".
-
-				" <input dojoType=\"dijit.form.TextBox\" name='login'\"
-					placeHolder=\"".__("Login")."\"
-					style=\"width : 10em;\"> ".
-				" <input
-					placeHolder=\"".__("Password")."\"
-					dojoType=\"dijit.form.TextBox\" type='password'
-					style=\"width : 10em;\" name='pass'\">
-			</div></div>";
-
-
-		print "<div style=\"clear : both\">
-			<input type=\"checkbox\" name=\"need_auth\" dojoType=\"dijit.form.CheckBox\" id=\"feedDlg_loginCheck\"
-					onclick='checkboxToggleElement(this, \"feedDlg_loginContainer\")'>
-				<label for=\"feedDlg_loginCheck\">".
-				__('This feed requires authentication.')."</div>";
-
-		print "</form>";
-
-		print "<div class=\"dlgButtons\">
-			<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('feedAddDlg').execute()\">".__('Subscribe')."</button>";
-
-		if (!(defined('_DISABLE_FEED_BROWSER') && _DISABLE_FEED_BROWSER)) {
-			print "<button dojoType=\"dijit.form.Button\" onclick=\"return feedBrowser()\">".__('More feeds')."</button>";
-		}
-
-		print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('feedAddDlg').hide()\">".__('Cancel')."</button>
-			</div>";
-
-		//return;
-	}
-
-	function feedBrowser() {
-		if (defined('_DISABLE_FEED_BROWSER') && _DISABLE_FEED_BROWSER) return;
-
-		$browser_search = db_escape_string($this->link, $_REQUEST["search"]);
-
-		print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"op\" value=\"rpc\">";
-		print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"method\" value=\"updateFeedBrowser\">";
-
-		print "<div dojoType=\"dijit.Toolbar\">
-			<div style='float : right'>
-			<img style='display : none'
-				id='feed_browser_spinner' src='images/indicator_white.gif'>
-			<input name=\"search\" dojoType=\"dijit.form.TextBox\" size=\"20\" type=\"search\"
-				onchange=\"dijit.byId('feedBrowserDlg').update()\" value=\"$browser_search\">
-			<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('feedBrowserDlg').update()\">".__('Search')."</button>
-		</div>";
-
-		print " <select name=\"mode\" dojoType=\"dijit.form.Select\" onchange=\"dijit.byId('feedBrowserDlg').update()\">
-			<option value='1'>" . __('Popular feeds') . "</option>
-			<option value='2'>" . __('Feed archive') . "</option>
-			</select> ";
-
-		print __("limit:");
-
-		print " <select dojoType=\"dijit.form.Select\" name=\"limit\" onchange=\"dijit.byId('feedBrowserDlg').update()\">";
-
-		foreach (array(25, 50, 100, 200) as $l) {
-			$issel = ($l == $limit) ? "selected=\"1\"" : "";
-			print "<option $issel value=\"$l\">$l</option>";
-		}
-
-		print "</select> ";
-
-		print "</div>";
-
-		$owner_uid = $_SESSION["uid"];
-
-		require_once "feedbrowser.php";
-
-		print "<ul class='browseFeedList' id='browseFeedList'>";
-		print make_feed_browser($this->link, $search, 25);
-		print "</ul>";
-
-		print "<div align='center'>
-			<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('feedBrowserDlg').execute()\">".__('Subscribe')."</button>
-			<button dojoType=\"dijit.form.Button\" style='display : none' id='feed_archive_remove' onclick=\"dijit.byId('feedBrowserDlg').removeFromArchive()\">".__('Remove')."</button>
-			<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('feedBrowserDlg').hide()\" >".__('Cancel')."</button></div>";
-
-	}
-
-	function search() {
-		$this->params = explode(":", db_escape_string($this->link, $_REQUEST["param"]), 2);
-
-		$active_feed_id = sprintf("%d", $this->params[0]);
-		$is_cat = $this->params[1] != "false";
-
-		print "<div class=\"dlgSec\">".__('Look for')."</div>";
-
-		print "<div class=\"dlgSecCont\">";
-
-		print "<input dojoType=\"dijit.form.ValidationTextBox\"
-			style=\"font-size : 16px; width : 20em;\"
-			required=\"1\" name=\"query\" type=\"search\" value=''>";
-
-		print "<hr/>".__('Limit search to:')." ";
-
-		print "<select name=\"search_mode\" dojoType=\"dijit.form.Select\">
-			<option value=\"all_feeds\">".__('All feeds')."</option>";
-
-		$feed_title = getFeedTitle($this->link, $active_feed_id);
-
-		if (!$is_cat) {
-			$feed_cat_title = getFeedCatTitle($this->link, $active_feed_id);
-		} else {
-			$feed_cat_title = getCategoryTitle($this->link, $active_feed_id);
-		}
-
-		if ($active_feed_id && !$is_cat) {
-			print "<option selected=\"1\" value=\"this_feed\">$feed_title</option>";
-		} else {
-			print "<option disabled=\"1\" value=\"false\">".__('This feed')."</option>";
-		}
-
-		if ($is_cat) {
-		  	$cat_preselected = "selected=\"1\"";
-		}
-
-		if (get_pref($this->link, 'ENABLE_FEED_CATS') && ($active_feed_id > 0 || $is_cat)) {
-			print "<option $cat_preselected value=\"this_cat\">$feed_cat_title</option>";
-		} else {
-			//print "<option disabled>".__('This category')."</option>";
-		}
-
-		print "</select>";
-
-		print "</div>";
-
-		print "<div class=\"dlgButtons\">";
-
-		if (!SPHINX_ENABLED) {
-			print "<div style=\"float : left\">
-				<a class=\"visibleLink\" target=\"_blank\" href=\"http://tt-rss.org/wiki/SearchSyntax\">Search syntax</a>
-				</div>";
-		}
-
-		print "<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('searchDlg').execute()\">".__('Search')."</button>
-		<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('searchDlg').hide()\">".__('Cancel')."</button>
-		</div>";
-	}
-
-	function editArticleTags() {
-
-		print __("Tags for this article (separated by commas):")."<br>";
-
-		$tags = get_article_tags($this->link, $this->param);
-
-		$tags_str = join(", ", $tags);
-
-		print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"id\" value=\"$this->param\">";
-		print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"op\" value=\"rpc\">";
-		print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"method\" value=\"setArticleTags\">";
-
-		print "<table width='100%'><tr><td>";
-
-		print "<textarea dojoType=\"dijit.form.SimpleTextarea\" rows='4'
-			style='font-size : 12px; width : 100%' id=\"tags_str\"
-			name='tags_str'>$tags_str</textarea>
-		<div class=\"autocomplete\" id=\"tags_choices\"
-				style=\"display:none\"></div>";
-
-		print "</td></tr></table>";
-
-		print "<div class='dlgButtons'>";
-
-		print "<button dojoType=\"dijit.form.Button\"
-			onclick=\"dijit.byId('editTagsDlg').execute()\">".__('Save')."</button> ";
-		print "<button dojoType=\"dijit.form.Button\"
-			onclick=\"dijit.byId('editTagsDlg').hide()\">".__('Cancel')."</button>";
-		print "</div>";
-
-	}
-
 	function printTagCloud() {
 		print "<div class=\"tagCloudContainer\">";
 

+ 184 - 1
classes/feeds.php

@@ -4,7 +4,7 @@ require_once "colors.php";
 class Feeds extends Handler_Protected {
 
 	function csrf_ignore($method) {
-		$csrf_ignored = array("index");
+		$csrf_ignored = array("index", "feedbrowser", "quickaddfeed", "search");
 
 		return array_search($method, $csrf_ignored) !== false;
 	}
@@ -968,5 +968,188 @@ class Feeds extends Handler_Protected {
 		return $reply;
 	}
 
+	function quickAddFeed() {
+		print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"op\" value=\"rpc\">";
+		print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"method\" value=\"addfeed\">";
+
+		print "<div class=\"dlgSec\">".__("Feed or site URL")."</div>";
+		print "<div class=\"dlgSecCont\">";
+
+		print "<div style='float : right'>
+			<img style='display : none'
+				id='feed_add_spinner' src='images/indicator_white.gif'></div>";
+
+		print "<input style=\"font-size : 16px; width : 20em;\"
+			placeHolder=\"".__("Feed or site URL")."\"
+			dojoType=\"dijit.form.ValidationTextBox\" required=\"1\" name=\"feed\" id=\"feedDlg_feedUrl\">";
+
+		print "<hr/>";
+
+		if (get_pref($this->link, 'ENABLE_FEED_CATS')) {
+			print __('Place in category:') . " ";
+			print_feed_cat_select($this->link, "cat", false, 'dojoType="dijit.form.Select"');
+		}
+
+		print "</div>";
+
+		print '<div id="feedDlg_feedsContainer" style="display : none">
+
+				<div class="dlgSec">' . __('Available feeds') . '</div>
+				<div class="dlgSecCont">'.
+				'<select id="feedDlg_feedContainerSelect"
+					dojoType="dijit.form.Select" size="3">
+					<script type="dojo/method" event="onChange" args="value">
+						dijit.byId("feedDlg_feedUrl").attr("value", value);
+					</script>
+				</select>'.
+				'</div></div>';
+
+		print "<div id='feedDlg_loginContainer' style='display : none'>
+
+				<div class=\"dlgSec\">".__("Authentication")."</div>
+				<div class=\"dlgSecCont\">".
+
+				" <input dojoType=\"dijit.form.TextBox\" name='login'\"
+					placeHolder=\"".__("Login")."\"
+					style=\"width : 10em;\"> ".
+				" <input
+					placeHolder=\"".__("Password")."\"
+					dojoType=\"dijit.form.TextBox\" type='password'
+					style=\"width : 10em;\" name='pass'\">
+			</div></div>";
+
+
+		print "<div style=\"clear : both\">
+			<input type=\"checkbox\" name=\"need_auth\" dojoType=\"dijit.form.CheckBox\" id=\"feedDlg_loginCheck\"
+					onclick='checkboxToggleElement(this, \"feedDlg_loginContainer\")'>
+				<label for=\"feedDlg_loginCheck\">".
+				__('This feed requires authentication.')."</div>";
+
+		print "</form>";
+
+		print "<div class=\"dlgButtons\">
+			<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('feedAddDlg').execute()\">".__('Subscribe')."</button>";
+
+		if (!(defined('_DISABLE_FEED_BROWSER') && _DISABLE_FEED_BROWSER)) {
+			print "<button dojoType=\"dijit.form.Button\" onclick=\"return feedBrowser()\">".__('More feeds')."</button>";
+		}
+
+		print "<button dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('feedAddDlg').hide()\">".__('Cancel')."</button>
+			</div>";
+
+		//return;
+	}
+
+	function feedBrowser() {
+		if (defined('_DISABLE_FEED_BROWSER') && _DISABLE_FEED_BROWSER) return;
+
+		$browser_search = db_escape_string($this->link, $_REQUEST["search"]);
+
+		print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"op\" value=\"rpc\">";
+		print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\" name=\"method\" value=\"updateFeedBrowser\">";
+
+		print "<div dojoType=\"dijit.Toolbar\">
+			<div style='float : right'>
+			<img style='display : none'
+				id='feed_browser_spinner' src='images/indicator_white.gif'>
+			<input name=\"search\" dojoType=\"dijit.form.TextBox\" size=\"20\" type=\"search\"
+				onchange=\"dijit.byId('feedBrowserDlg').update()\" value=\"$browser_search\">
+			<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('feedBrowserDlg').update()\">".__('Search')."</button>
+		</div>";
+
+		print " <select name=\"mode\" dojoType=\"dijit.form.Select\" onchange=\"dijit.byId('feedBrowserDlg').update()\">
+			<option value='1'>" . __('Popular feeds') . "</option>
+			<option value='2'>" . __('Feed archive') . "</option>
+			</select> ";
+
+		print __("limit:");
+
+		print " <select dojoType=\"dijit.form.Select\" name=\"limit\" onchange=\"dijit.byId('feedBrowserDlg').update()\">";
+
+		foreach (array(25, 50, 100, 200) as $l) {
+			$issel = ($l == $limit) ? "selected=\"1\"" : "";
+			print "<option $issel value=\"$l\">$l</option>";
+		}
+
+		print "</select> ";
+
+		print "</div>";
+
+		$owner_uid = $_SESSION["uid"];
+
+		require_once "feedbrowser.php";
+
+		print "<ul class='browseFeedList' id='browseFeedList'>";
+		print make_feed_browser($this->link, $search, 25);
+		print "</ul>";
+
+		print "<div align='center'>
+			<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('feedBrowserDlg').execute()\">".__('Subscribe')."</button>
+			<button dojoType=\"dijit.form.Button\" style='display : none' id='feed_archive_remove' onclick=\"dijit.byId('feedBrowserDlg').removeFromArchive()\">".__('Remove')."</button>
+			<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('feedBrowserDlg').hide()\" >".__('Cancel')."</button></div>";
+
+	}
+
+	function search() {
+		$this->params = explode(":", db_escape_string($this->link, $_REQUEST["param"]), 2);
+
+		$active_feed_id = sprintf("%d", $this->params[0]);
+		$is_cat = $this->params[1] != "false";
+
+		print "<div class=\"dlgSec\">".__('Look for')."</div>";
+
+		print "<div class=\"dlgSecCont\">";
+
+		print "<input dojoType=\"dijit.form.ValidationTextBox\"
+			style=\"font-size : 16px; width : 20em;\"
+			required=\"1\" name=\"query\" type=\"search\" value=''>";
+
+		print "<hr/>".__('Limit search to:')." ";
+
+		print "<select name=\"search_mode\" dojoType=\"dijit.form.Select\">
+			<option value=\"all_feeds\">".__('All feeds')."</option>";
+
+		$feed_title = getFeedTitle($this->link, $active_feed_id);
+
+		if (!$is_cat) {
+			$feed_cat_title = getFeedCatTitle($this->link, $active_feed_id);
+		} else {
+			$feed_cat_title = getCategoryTitle($this->link, $active_feed_id);
+		}
+
+		if ($active_feed_id && !$is_cat) {
+			print "<option selected=\"1\" value=\"this_feed\">$feed_title</option>";
+		} else {
+			print "<option disabled=\"1\" value=\"false\">".__('This feed')."</option>";
+		}
+
+		if ($is_cat) {
+		  	$cat_preselected = "selected=\"1\"";
+		}
+
+		if (get_pref($this->link, 'ENABLE_FEED_CATS') && ($active_feed_id > 0 || $is_cat)) {
+			print "<option $cat_preselected value=\"this_cat\">$feed_cat_title</option>";
+		} else {
+			//print "<option disabled>".__('This category')."</option>";
+		}
+
+		print "</select>";
+
+		print "</div>";
+
+		print "<div class=\"dlgButtons\">";
+
+		if (!SPHINX_ENABLED) {
+			print "<div style=\"float : left\">
+				<a class=\"visibleLink\" target=\"_blank\" href=\"http://tt-rss.org/wiki/SearchSyntax\">Search syntax</a>
+				</div>";
+		}
+
+		print "<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('searchDlg').execute()\">".__('Search')."</button>
+		<button dojoType=\"dijit.form.Button\" onclick=\"dijit.byId('searchDlg').hide()\">".__('Cancel')."</button>
+		</div>";
+	}
+
+
 }
 ?>

+ 2 - 2
classes/rpc.php

@@ -407,8 +407,8 @@ class RPC extends Handler_Protected {
 
 		if (!$tags_str_full) $tags_str_full = __("no tags");
 
-		print json_encode(array("tags_str" => array("id" => $id,
-				"content" => $tags_str, "content_full" => $tags_str_full)));
+		print json_encode(array("id" => (int)$id,
+				"content" => $tags_str, "content_full" => $tags_str_full));
 	}
 
 	function regenOPMLKey() {

+ 2 - 2
js/functions.js

@@ -830,7 +830,7 @@ function addLabel(select, callback) {
 
 function quickAddFeed() {
 	try {
-		var query = "backend.php?op=dlg&method=quickAddFeed";
+		var query = "backend.php?op=feeds&method=quickAddFeed";
 
 		// overlapping widgets
 		if (dijit.byId("batchSubDlg")) dijit.byId("batchSubDlg").destroyRecursive();
@@ -1635,7 +1635,7 @@ function editFeed(feed, event) {
 
 function feedBrowser() {
 	try {
-		var query = "backend.php?op=dlg&method=feedBrowser";
+		var query = "backend.php?op=feeds&method=feedBrowser";
 
 		if (dijit.byId("feedAddDlg"))
 			dijit.byId("feedAddDlg").hide();

+ 1 - 1
js/tt-rss.js

@@ -159,7 +159,7 @@ function timeout() {
 }
 
 function search() {
-	var query = "backend.php?op=dlg&method=search&param=" +
+	var query = "backend.php?op=feeds&method=search&param=" +
 		param_escape(getActiveFeedId() + ":" + activeFeedIsCat());
 
 	if (dijit.byId("searchDlg"))

+ 15 - 12
js/viewfeed.js

@@ -1067,7 +1067,7 @@ function catchupSelection() {
 }
 
 function editArticleTags(id) {
-		var query = "backend.php?op=dlg&method=editArticleTags&param=" + param_escape(id);
+		var query = "backend.php?op=article&method=editArticleTags&param=" + param_escape(id);
 
 		if (dijit.byId("editTagsDlg"))
 			dijit.byId("editTagsDlg").destroyRecursive();
@@ -1085,22 +1085,25 @@ function editArticleTags(id) {
 					new Ajax.Request("backend.php",	{
 					parameters: query,
 					onComplete: function(transport) {
-						notify('');
-						dialog.hide();
+						try {
+							notify('');
+							dialog.hide();
 
-						var data = JSON.parse(transport.responseText);
+							var data = JSON.parse(transport.responseText);
 
-						if (data) {
-							var tags_str = article.tags;
-							var id = tags_str.id;
+							if (data) {
+								var id = data.id;
 
-							var tags = $("ATSTR-" + id);
-							var tooltip = dijit.byId("ATSTRTIP-" + id);
+								console.log(id);
 
-							if (tags) tags.innerHTML = tags_str.content;
-							if (tooltip) tooltip.attr('label', tags_str.content_full);
+								var tags = $("ATSTR-" + id);
+								var tooltip = dijit.byId("ATSTRTIP-" + id);
 
-							cache_delete("article:" + id);
+								if (tags) tags.innerHTML = data.content;
+								if (tooltip) tooltip.attr('label', data.content_full);
+							}
+						} catch (e) {
+							exception_error("editArticleTags/inner", e);
 						}
 
 					}});