From 521d0b65c73f90d6e86c1a38dcab492b5a23982b Mon Sep 17 00:00:00 2001
From: Andrew Dolgov <noreply@fakecake.org>
Date: Sun, 21 Feb 2021 16:02:57 +0300
Subject: [PATCH] batch feed editor: use tab layout, cleanup

---
 classes/pref/feeds.php | 243 ++++++++++++++++-------------------------
 js/PrefFeedTree.js     |  21 ++--
 2 files changed, 108 insertions(+), 156 deletions(-)

diff --git a/classes/pref/feeds.php b/classes/pref/feeds.php
index 8d3f84a03..c901bc96e 100755
--- a/classes/pref/feeds.php
+++ b/classes/pref/feeds.php
@@ -22,11 +22,6 @@ class Pref_Feeds extends Handler_Protected {
 		return $rv;
 	}
 
-	function batch_edit_cbox($elem, $label = false) {
-		print "<input type=\"checkbox\" title=\"".__("Check to enable field")."\"
-			onchange=\"App.dialogOf(this).toggleField(this, '$elem', '$label')\">";
-	}
-
 	function renamecat() {
 		$title = clean($_REQUEST['title']);
 		$id = clean($_REQUEST['id']);
@@ -571,165 +566,117 @@ class Pref_Feeds extends Handler_Protected {
 		}
 	}
 
+	private function _batch_toggle_checkbox($name) {
+		return \Controls\checkbox_tag("", false, "",
+					["data-control-for" => $name, "title" => __("Check to enable field"), "onchange" => "App.dialogOf(this).toggleField(this)"]);
+	}
+
 	function editfeeds() {
 		global $purge_intervals;
 		global $update_intervals;
 
 		$feed_ids = clean($_REQUEST["ids"]);
 
-		print_notice("Enable the options you wish to apply using checkboxes on the right:");
-
-		print \Controls\hidden_tag("ids", "$feed_ids");
-		print \Controls\hidden_tag("op", "pref-feeds");
-		print \Controls\hidden_tag("method", "batchEditSave");
-
-		print "<header>".__("Feed")."</header>";
-		print "<section>";
-
-		/* Category */
-
-		if (get_pref('ENABLE_FEED_CATS')) {
-
-			print "<fieldset>";
-
-			print "<label>" . __('Place in category:') . "</label> ";
-
-			print \Controls\select_feeds_cats("cat_id", null, ['disabled' => '1']);
-
-			$this->batch_edit_cbox("cat_id");
-
-			print "</fieldset>";
-		}
-
-		/* FTS Stemming Language */
-
-		if (DB_TYPE == "pgsql") {
-			print "<fieldset>";
-
-			print "<label>" . __('Language:') . "</label> ";
-			print \Controls\select_tag("feed_language", "", $this::get_ts_languages(), ["disabled"=> 1]);
-
-			$this->batch_edit_cbox("feed_language");
-
-			print "</fieldset>";
-		}
-
-		print "</section>";
-
-		print "<header>".__("Update")."</header>";
-		print "<section>";
-
-		/* Update Interval */
-
-		print "<fieldset>";
-
-		print "<label>".__("Interval:")."</label> ";
-
 		$local_update_intervals = $update_intervals;
 		$local_update_intervals[0] .= sprintf(" (%s)", $update_intervals[get_pref("DEFAULT_UPDATE_INTERVAL")]);
 
-		print \Controls\select_hash("update_interval", "", $local_update_intervals, ["disabled" => 1]);
-
-		$this->batch_edit_cbox("update_interval");
-
-		print "</fieldset>";
-
-		/* Purge intl */
-
-		if (FORCE_ARTICLE_PURGE == 0) {
-
-			print "<fieldset>";
-
-			print "<label>" . __('Article purging:') . "</label> ";
-
-			$local_purge_intervals = $purge_intervals;
-			$default_purge_interval = get_pref("PURGE_OLD_DAYS");
-
-			if ($default_purge_interval > 0)
-				$local_purge_intervals[0] .= " " . T_sprintf("(%d days)", $default_purge_interval);
-			else
-				$local_purge_intervals[0] .= " " . sprintf("(%s)", __("Disabled"));
+		$local_purge_intervals = $purge_intervals;
+		$default_purge_interval = get_pref("PURGE_OLD_DAYS");
 
-			print \Controls\select_hash("purge_interval", "", $local_purge_intervals, ["disabled" => 1]);
-
-			$this->batch_edit_cbox("purge_interval");
-
-			print "</fieldset>";
-		}
-
-		print "</section>";
-		print "<header>".__("Authentication")."</header>";
-		print "<section>";
-
-		print "<fieldset>";
-
-		print "<input dojoType='dijit.form.TextBox'
-			placeHolder=\"".__("Login")."\" disabled='1'
-			autocomplete='new-password'
-			name='auth_login' value=''>";
-
-		$this->batch_edit_cbox("auth_login");
-
-		print "<input dojoType='dijit.form.TextBox' type='password' name='auth_pass'
-			autocomplete='new-password'
-			placeHolder=\"".__("Password")."\" disabled='1'
-			value=''>";
-
-		$this->batch_edit_cbox("auth_pass");
-
-		print "</fieldset>";
-
-		print "</section>";
-		print "<header>".__("Options")."</header>";
-		print "<section>";
-
-		print "<fieldset class='narrow'>";
-		print "<label class='checkbox'><input disabled='1' type='checkbox' id='include_in_digest'
-			name='include_in_digest' dojoType='dijit.form.CheckBox'>&nbsp;".__('Include in e-mail digest')."</label>";
-
-		print "&nbsp;"; $this->batch_edit_cbox("include_in_digest", "include_in_digest_l");
-
-		print "</fieldset><fieldset class='narrow'>";
-
-		print "<label class='checkbox'><input disabled='1' type='checkbox' id='always_display_enclosures'
-			name='always_display_enclosures' dojoType='dijit.form.CheckBox'>&nbsp;".__('Always display image attachments')."</label>";
-
-		print "&nbsp;"; $this->batch_edit_cbox("always_display_enclosures", "always_display_enclosures_l");
-
-		print "</fieldset><fieldset class='narrow'>";
-
-		print "<label class='checkbox'><input disabled='1' type='checkbox' id='hide_images'
-			name='hide_images' dojoType='dijit.form.CheckBox'>&nbsp;". __('Do not embed media')."</label>";
-
-		print "&nbsp;"; $this->batch_edit_cbox("hide_images", "hide_images_l");
-
-		print "</fieldset><fieldset class='narrow'>";
-
-		print "<label class='checkbox'><input disabled='1' type='checkbox' id='cache_images'
-			name='cache_images' dojoType='dijit.form.CheckBox'>&nbsp;".__('Cache media')."</label>";
-
-		print "&nbsp;"; $this->batch_edit_cbox("cache_images", "cache_images_l");
-
-		print "</fieldset><fieldset class='narrow'>";
+		if ($default_purge_interval > 0)
+			$local_purge_intervals[0] .= " " . T_sprintf("(%d days)", $default_purge_interval);
+		else
+			$local_purge_intervals[0] .= " " . sprintf("(%s)", __("Disabled"));
 
-		print "<label class='checkbox'><input disabled='1' type='checkbox' id='mark_unread_on_update'
-			name='mark_unread_on_update' dojoType='dijit.form.CheckBox'>&nbsp;".__('Mark updated articles as unread')."</label>";
+		$options = [
+			"include_in_digest" => __('Include in e-mail digest'),
+			"always_display_enclosures" => __('Always display image attachments'),
+			"hide_images" => __('Do not embed media'),
+			"cache_images" => __('Cache media'),
+			"mark_unread_on_update" => __('Mark updated articles as unread')
+		];
 
-		print "&nbsp;"; $this->batch_edit_cbox("mark_unread_on_update", "mark_unread_on_update_l");
+		print_notice("Enable the options you wish to apply using checkboxes on the right.");
+		?>
 
-		print "</fieldset>";
+		<?= \Controls\hidden_tag("ids", $feed_ids) ?>
+		<?= \Controls\hidden_tag("op", "pref-feeds") ?>
+		<?= \Controls\hidden_tag("method", "batchEditSave") ?>
 
-		print "</section>";
+		<div dojoType="dijit.layout.TabContainer" style="height : 450px">
+			<div dojoType="dijit.layout.ContentPane" title="<?= __('General') ?>">
+				<section>
+				<?php if (get_pref('ENABLE_FEED_CATS')) { ?>
+					<fieldset>
+						<label><?= __('Place in category:') ?></label>
+						<?= \Controls\select_feeds_cats("cat_id", null, ['disabled' => '1']) ?>
+						<?= $this->_batch_toggle_checkbox("cat_id") ?>
+					</fieldset>
+				<?php } ?>
 
-		print "<footer>
-			<button dojoType='dijit.form.Button' type='submit' class='alt-primary' type='submit'>".
-				__('Save')."</button>
-			<button dojoType='dijit.form.Button'
-			onclick='App.dialogOf(this).hide()'>".
-				__('Cancel')."</button>
-			</footer>";
+				<?php	if (DB_TYPE == "pgsql") { ?>
+					<fieldset>
+						<label><?= __('Language:') ?></label>
+						<?= \Controls\select_tag("feed_language", "", $this::get_ts_languages(), ["disabled"=> 1]) ?>
+						<?= $this->_batch_toggle_checkbox("feed_language") ?>
+					</fieldset>
+				<?php } ?>
+				</section>
+
+				<hr/>
+
+				<section>
+					<fieldset>
+						<label><?= __("Update interval:") ?></label>
+						<?= \Controls\select_hash("update_interval", "", $local_update_intervals, ["disabled" => 1]) ?>
+						<?= $this->_batch_toggle_checkbox("update_interval") ?>
+					</fieldset>
+
+					<?php if (FORCE_ARTICLE_PURGE == 0) { ?>
+						<fieldset>
+							<label><?= __('Article purging:') ?></label>
+							<?= \Controls\select_hash("purge_interval", "", $local_purge_intervals, ["disabled" => 1]) ?>
+							<?= $this->_batch_toggle_checkbox("purge_interval") ?>
+						</fieldset>
+					<?php } ?>
+				</section>
+			</div>
+			<div dojoType="dijit.layout.ContentPane" title="<?= __('Authentication') ?>">
+				<section>
+					<fieldset>
+						<label><?= __("Login:") ?></label>
+						<input dojoType='dijit.form.TextBox'
+							disabled='1' autocomplete='new-password' name='auth_login' value=''>
+						<?= $this->_batch_toggle_checkbox("auth_login") ?>
+					</fieldset>
+					<fieldset>
+						<label><?= __("Password:") ?></label>
+						<input dojoType='dijit.form.TextBox' type='password' name='auth_pass'
+							autocomplete='new-password' disabled='1' value=''>
+						<?= $this->_batch_toggle_checkbox("auth_pass") ?>
+					</fieldset>
+				</section>
+			</div>
+			<div dojoType="dijit.layout.ContentPane" title="<?= __('Options') ?>">
+			<?php
+				foreach ($options as $name => $caption) {
+					?>
+						<fieldset class='narrow'>
+							<label class="checkbox text-muted">
+								<?= \Controls\checkbox_tag($name, false, "", ["disabled" => "1"]) ?>
+								<?= $caption ?>
+								<?= $this->_batch_toggle_checkbox($name) ?>
+							</label>
+						</fieldset>
+			<?php } ?>
+			</div>
+		</div>
 
-		return;
+		<footer>
+			<?= \Controls\submit_tag(__("Save")) ?>
+			<?= \Controls\cancel_dialog_tag(__("Cancel")) ?>
+		</footer>
+		<?php
 	}
 
 	function batchEditSave() {
diff --git a/js/PrefFeedTree.js b/js/PrefFeedTree.js
index a2a7f9141..468e2025c 100644
--- a/js/PrefFeedTree.js
+++ b/js/PrefFeedTree.js
@@ -300,7 +300,6 @@ define(["dojo/_base/declare", "dojo/dom-construct", "lib/CheckBoxTree", "dojo/_b
 
 				try {
 					const dialog = new fox.SingleUseDialog({
-						id: "feedEditDlg",
 						title: __("Edit Multiple Feeds"),
 						getChildByName: function (name) {
 							let rv = null;
@@ -313,15 +312,21 @@ define(["dojo/_base/declare", "dojo/dom-construct", "lib/CheckBoxTree", "dojo/_b
 								});
 							return rv;
 						},
-						toggleField: function (checkbox, elem, label) {
-							this.getChildByName(elem).attr('disabled', !checkbox.checked);
+						toggleField: function (checkbox) {
+							const name = checkbox.attr("data-control-for");
+							const target = dijit.getEnclosingWidget(dialog.domNode.querySelector(`input[name="${name}"]`));
 
-							if ($(label))
-								if (checkbox.checked)
-									$(label).removeClassName('text-muted');
-								else
-									$(label).addClassName('text-muted');
+							target.attr('disabled', !checkbox.attr('checked'));
+							console.log(target, target.attr('type'));
+
+							if (target.attr('type') == "checkbox") {
+								const label = checkbox.domNode.closest("label");
 
+								if (checkbox.attr('checked'))
+									label.removeClassName('text-muted');
+								else
+									label.addClassName('text-muted');
+							}
 						},
 						execute: function () {
 							if (this.validate() && confirm(__("Save changes to selected feeds?"))) {
-- 
GitLab