Browse Source

bind headlines menu to a selector to avoid remaking it unnecessarily

Andrew Dolgov 7 years ago
parent
commit
5161460048
3 changed files with 53 additions and 106 deletions
  1. 2 2
      classes/feeds.php
  2. 1 0
      js/tt-rss.js
  3. 50 104
      js/viewfeed.js

+ 2 - 2
classes/feeds.php

@@ -484,7 +484,7 @@ class Feeds extends Handler_Protected {
 					$mouseover_attrs = "onmouseover='postMouseIn(event, $id)'
 						onmouseout='postMouseOut($id)'";
 
-					$reply['content'] .= "<div class='hl $class' data-orig-feed-id='$feed_id' data-article-id='$id' id='RROW-$id' $mouseover_attrs>";
+					$reply['content'] .= "<div class='hl hlMenuAttach $class' data-orig-feed-id='$feed_id' data-article-id='$id' id='RROW-$id' $mouseover_attrs>";
 
 					$reply['content'] .= "<div class='hlLeft'>";
 
@@ -613,7 +613,7 @@ class Feeds extends Handler_Protected {
 
 					$reply['content'] .= "<span id=\"RTITLE-$id\"
 						onclick=\"return cdmClicked(event, $id);\"
-						class=\"titleWrap $hlc_suffix\">
+						class=\"titleWrap hlMenuAttach $hlc_suffix\">
 						<a class=\"title $hlc_suffix\"
 						title=\"".htmlspecialchars($line["title"])."\"
 						target=\"_blank\" rel=\"noopener noreferrer\" href=\"".

+ 1 - 0
js/tt-rss.js

@@ -226,6 +226,7 @@ function init() {
 				"dojo/parser",
 				"dojo/_base/loader",
 				"dojo/_base/html",
+				"dojo/query",
 				"dijit/ProgressBar",
 				"dijit/ColorPalette",
 				"dijit/Dialog",

+ 50 - 104
js/viewfeed.js

@@ -150,8 +150,6 @@ function headlines_callback2(transport, offset, background, infscroll_req) {
 					tmp.innerHTML = reply['headlines']['content'];
 					dojo.parser.parse(tmp);
 
-					var new_rows = [];
-
 					while (tmp.hasChildNodes()) {
 						var row = tmp.removeChild(tmp.firstChild);
 
@@ -159,16 +157,6 @@ function headlines_callback2(transport, offset, background, infscroll_req) {
 							dijit.byId("headlines-frame").domNode.appendChild(row);
 
 							loaded_article_ids.push(row.id);
-
-							if (!isCdmMode() || row.hasClassName("cdmFeedTitle")) {
-								new_rows.push(row);
-							} else if (isCdmMode()) {
-								var titleWrap = $$("#" + row.id + " .titleWrap")[0];
-
-								if (titleWrap) {
-									new_rows.push(titleWrap);
-								}
-							}
 						}
 					}
 
@@ -183,7 +171,7 @@ function headlines_callback2(transport, offset, background, infscroll_req) {
 						markHeadline(ids[i]);
 					}
 
-					initHeadlinesMenu(new_rows);
+					initHeadlinesMenu();
 
 					if (_infscroll_disable) {
 						hsp.innerHTML = "<a href='#' onclick='openNextUnreadFeed()'>" +
@@ -1992,28 +1980,14 @@ function headlinesMenuCommon(menu) {
 	}
 }
 
-function initHeadlinesMenu(append_rows) {
+function initHeadlinesMenu() {
 	try {
-		if (!append_rows) {
-
-			if (dijit.byId("headlinesMenu"))
-				dijit.byId("headlinesMenu").destroyRecursive();
-
-			var ids = [];
-
-			if (!isCdmMode()) {
-				nodes = $$("#headlines-frame > div[id*=RROW]");
-			} else {
-				nodes = $$("#headlines-frame span[id*=RTITLE]");
-			}
-
-			nodes.each(function (node) {
-				ids.push(node.id);
-			});
+		if (!dijit.byId("headlinesMenu")) {
 
 			var menu = new dijit.Menu({
 				id: "headlinesMenu",
-				targetNodeIds: ids
+				targetNodeIds: ["headlines-frame"],
+				selector: ".hlMenuAttach"
 			});
 
 			var tmph = dojo.connect(menu, '_openMyself', function (event) {
@@ -2033,96 +2007,68 @@ function initHeadlinesMenu(append_rows) {
 			headlinesMenuCommon(menu);
 
 			menu.startup();
-
-		} else {
-			var menu = dijit.byId("headlinesMenu");
-
-			append_rows.each(function (row) {
-				if (!row.hasClassName("cdmFeedTitle")) {
-					menu.bindDomNode(row);
-				}
-			});
 		}
 
 		/* vgroup feed title menu */
 
-		if (!append_rows) {
-
-			var nodes = $$("#headlines-frame > div[class='cdmFeedTitle']");
-			var ids = [];
+		if (!dijit.byId("headlinesFeedTitleMenu")) {
 
-			nodes.each(function(node) {
-				ids.push(node.id);
+			var menu = new dijit.Menu({
+				id: "headlinesFeedTitleMenu",
+				targetNodeIds: ["headlines-frame"],
+				selector: "div.cdmFeedTitle"
 			});
 
-			if (ids.length > 0) {
-				if (dijit.byId("headlinesFeedTitleMenu"))
-					dijit.byId("headlinesFeedTitleMenu").destroyRecursive();
-
-				var menu = new dijit.Menu({
-					id: "headlinesFeedTitleMenu",
-					targetNodeIds: ids
-				});
-
-				var tmph = dojo.connect(menu, '_openMyself', function (event) {
-					var callerNode = event.target, match = null, tries = 0;
-
-					while (match == null && callerNode && tries <= 3) {
-						match = callerNode.getAttribute("data-feed-id")
-						callerNode = callerNode.parentNode;
-						++tries;
-					}
-
-					if (match) this.callerRowId = match;
+			var tmph = dojo.connect(menu, '_openMyself', function (event) {
+				var callerNode = event.target, match = null, tries = 0;
 
-				});
+				while (match == null && callerNode && tries <= 3) {
+					match = callerNode.getAttribute("data-feed-id")
+					callerNode = callerNode.parentNode;
+					++tries;
+				}
 
-				menu.addChild(new dijit.MenuItem({
-					label: __("Select articles in group"),
-					onClick: function (event) {
-						selectArticles("all",
-							"#headlines-frame > div[id*=RROW]" +
-							"[data-orig-feed-id='" + menu.callerRowId + "']");
+				if (match) this.callerRowId = match;
 
-					}
-				}));
+			});
 
-				menu.addChild(new dijit.MenuItem({
-					label: __("Mark group as read"),
-					onClick: function (event) {
-						selectArticles("none");
-						selectArticles("all",
-							"#headlines-frame > div[id*=RROW]" +
-							"[data-orig-feed-id='" + menu.callerRowId + "']");
+			menu.addChild(new dijit.MenuItem({
+				label: __("Select articles in group"),
+				onClick: function (event) {
+					selectArticles("all",
+						"#headlines-frame > div[id*=RROW]" +
+						"[data-orig-feed-id='" + menu.callerRowId + "']");
 
-						catchupSelection();
-					}
-				}));
+				}
+			}));
 
-				menu.addChild(new dijit.MenuItem({
-					label: __("Mark feed as read"),
-					onClick: function (event) {
-						catchupFeedInGroup(menu.callerRowId);
-					}
-				}));
+			menu.addChild(new dijit.MenuItem({
+				label: __("Mark group as read"),
+				onClick: function (event) {
+					selectArticles("none");
+					selectArticles("all",
+						"#headlines-frame > div[id*=RROW]" +
+						"[data-orig-feed-id='" + menu.callerRowId + "']");
 
-				menu.addChild(new dijit.MenuItem({
-					label: __("Edit feed"),
-					onClick: function (event) {
-						editFeed(menu.callerRowId);
-					}
-				}));
+					catchupSelection();
+				}
+			}));
 
-				menu.startup();
-			}
-		} else {
-			var menu = dijit.byId("headlinesFeedTitleMenu");
+			menu.addChild(new dijit.MenuItem({
+				label: __("Mark feed as read"),
+				onClick: function (event) {
+					catchupFeedInGroup(menu.callerRowId);
+				}
+			}));
 
-			append_rows.each(function (row) {
-				if (row.hasClassName("cdmFeedTitle")) {
-					menu.bindDomNode(row);
+			menu.addChild(new dijit.MenuItem({
+				label: __("Edit feed"),
+				onClick: function (event) {
+					editFeed(menu.callerRowId);
 				}
-			});
+			}));
+
+			menu.startup();
 		}
 
 	} catch (e) {