From c36b2adf8488cdf88b0ef05d211c16815f8c5407 Mon Sep 17 00:00:00 2001
From: Andrew Dolgov <noreply@fakecake.org>
Date: Sat, 13 Feb 2021 21:57:02 +0300
Subject: [PATCH] feeds with errors: use client dialog

---
 classes/pref/feeds.php |  53 ++-----------------
 js/CommonDialogs.js    | 113 +++++++++++++++++++++++++++--------------
 2 files changed, 80 insertions(+), 86 deletions(-)

diff --git a/classes/pref/feeds.php b/classes/pref/feeds.php
index 03e8b1b81..f337d7f4e 100755
--- a/classes/pref/feeds.php
+++ b/classes/pref/feeds.php
@@ -1500,58 +1500,13 @@ class Pref_Feeds extends Handler_Protected {
 			FROM ttrss_feeds WHERE last_error != '' AND owner_uid = ?");
 		$sth->execute([$_SESSION['uid']]);
 
-		print "<div dojoType=\"fox.Toolbar\">";
-		print "<div dojoType=\"fox.form.DropDownButton\">".
-				"<span>" . __('Select')."</span>";
-		print "<div dojoType=\"dijit.Menu\" style=\"display: none;\">";
-		print "<div onclick=\"Tables.select('error-feeds-list', true)\"
-			dojoType=\"dijit.MenuItem\">".__('All')."</div>";
-		print "<div onclick=\"Tables.select('error-feeds-list', false)\"
-			dojoType=\"dijit.MenuItem\">".__('None')."</div>";
-		print "</div></div>";
-		print "</div>"; #toolbar
-
-		print "<div class='panel panel-scrollable'>";
-		print "<table width='100%' id='error-feeds-list'>";
-
-		$lnum = 1;
-
-		while ($line = $sth->fetch()) {
-
-			$feed_id = $line["id"];
-
-			print "<tr data-row-id='$feed_id'>";
-
-			print "<td width='5%' align='center'><input
-				onclick='Tables.onRowChecked(this);' dojoType=\"dijit.form.CheckBox\"
-				type=\"checkbox\"></td>";
-			print "<td>";
-
-			print "<a class=\"visibleLink\" href=\"#\" ".
-				"title=\"".__("Click to edit feed")."\" ".
-				"onclick=\"CommonDialogs.editFeed(".$line["id"].")\">".
-				htmlspecialchars($line["title"])."</a>: ";
-
-			print "<span class=\"text-muted\">";
-			print htmlspecialchars($line["last_error"]);
-			print "</span>";
-
-			print "</td>";
-			print "</tr>";
+		$rv = [];
 
-			++$lnum;
+		while ($row = $sth->fetch()) {
+			array_push($rv, $row);
 		}
 
-		print "</table>";
-		print "</div>";
-
-		print "<footer>";
-		print "<button style='float : left' class='alt-danger' dojoType='dijit.form.Button' onclick='App.dialogOf(this).removeSelected()'>"
-			.__('Unsubscribe from selected feeds')."</button> ";
-		print "<button dojoType='dijit.form.Button' class='alt-primary' type='submit'>".
-			__('Close this window')."</button>";
-
-		print "</footer>";
+		print json_encode($rv);
 	}
 
 	private function remove_feed_category($id, $owner_uid) {
diff --git a/js/CommonDialogs.js b/js/CommonDialogs.js
index 70596539b..5a72f705b 100644
--- a/js/CommonDialogs.js
+++ b/js/CommonDialogs.js
@@ -188,52 +188,91 @@ const	CommonDialogs = {
 					});
 		},
 		showFeedsWithErrors: function() {
-			const dialog = new fox.SingleUseDialog({
-				id: "errorFeedsDlg",
-				title: __("Feeds with update errors"),
-				getSelectedFeeds: function () {
-					return Tables.getSelected("error-feeds-list");
-				},
-				removeSelected: function () {
-					const sel_rows = this.getSelectedFeeds();
 
-					if (sel_rows.length > 0) {
-						if (confirm(__("Remove selected feeds?"))) {
-							Notify.progress("Removing selected feeds...", true);
+			xhrJson("backend.php", {op: "pref-feeds", method: "feedsWithErrors"}, (reply) => {
 
-							const query = {
-								op: "pref-feeds", method: "remove",
-								ids: sel_rows.toString()
-							};
+				const dialog = new fox.SingleUseDialog({
+					id: "errorFeedsDlg",
+					title: __("Feeds with update errors"),
+					getSelectedFeeds: function () {
+						return Tables.getSelected("error-feeds-list");
+					},
+					removeSelected: function () {
+						const sel_rows = this.getSelectedFeeds();
 
-							xhrPost("backend.php", query, () => {
-								Notify.close();
-								dialog.hide();
+						if (sel_rows.length > 0) {
+							if (confirm(__("Remove selected feeds?"))) {
+								Notify.progress("Removing selected feeds...", true);
 
-								if (App.isPrefs())
-									dijit.byId("feedTree").reload();
-								else
-									Feeds.reload();
+								const query = {
+									op: "pref-feeds", method: "remove",
+									ids: sel_rows.toString()
+								};
 
-							});
-						}
+								xhrPost("backend.php", query, () => {
+									Notify.close();
+									dialog.hide();
 
-					} else {
-						alert(__("No feeds selected."));
-					}
-				},
-				content: __("Loading, please wait...")
-			});
+									if (App.isPrefs())
+										dijit.byId("feedTree").reload();
+									else
+										Feeds.reload();
 
-			const tmph = dojo.connect(dialog, 'onShow', function () {
-				dojo.disconnect(tmph);
+								});
+							}
 
-				xhrPost("backend.php", {op: "pref-feeds", method: "feedsWithErrors"}, (transport) => {
-					dialog.attr('content', transport.responseText);
-				})
-			});
+						} else {
+							alert(__("No feeds selected."));
+						}
+					},
+					content: `
+						<div dojoType="fox.Toolbar">
+							<div dojoType="fox.form.DropDownButton">
+								<span>${__('Select')}</span>
+								<div dojoType="dijit.Menu" style="display: none">
+									<div onclick="Tables.select('error-feeds-list', true)"
+										dojoType="dijit.MenuItem">${__('All')}</div>
+									<div onclick="Tables.select('error-feeds-list', false)"
+										dojoType="dijit.MenuItem">${__('None')}</div>
+								</div>
+							</div>
+						</div>
+
+						<div class='panel panel-scrollable'>
+							<table width='100%' id='error-feeds-list'>
+
+							${reply.map((row) => `
+								<tr data-row-id='${row.id}'>
+									<td width='5%' align='center'>
+										<input onclick='Tables.onRowChecked(this)' dojoType="dijit.form.CheckBox"
+											type="checkbox">
+									</td>
+									<td>
+										<a href="#" title="${__("Click to edit feed")}" onclick="CommonDialogs.editFeed(${row.id})">
+											${App.escapeHtml(row.title)}
+										</a>
+									</td>
+									<td class='text-muted small' align='right' width='50%'>
+											${App.escapeHtml(row.last_error)}
+									</td>
+									</tr>
+							`).join("")}
+							</table>
+						</div>
+
+						<footer>
+							<button style='float : left' class='alt-danger' dojoType='dijit.form.Button' onclick='App.dialogOf(this).removeSelected()'>
+								${__('Unsubscribe from selected feeds')}
+							</button>
+							<button dojoType='dijit.form.Button' class='alt-primary' type='submit'>
+								${__('Close this window')}
+							</button>
+						</footer>
+					`
+				});
 
-			dialog.show();
+				dialog.show();
+			})
 		},
 		addLabel: function(select, callback) {
 			const caption = prompt(__("Please enter label caption:"), "");
-- 
GitLab