Переглянути джерело

Improve: manage feed in view within a slider (#4226)

* it works

* small improvements

* Update slider.js

* fixed JS syntax

* slider.js included in main.js

* fix syntax

* delete including of slider.js

* Update extra.js
maTh 4 роки тому
батько
коміт
7d00ad8ed7

+ 23 - 8
app/Controllers/feedController.php

@@ -738,16 +738,31 @@ class FreshRSS_feed_Controller extends FreshRSS_ActionController {
 	 * @todo handle "r" redirection in Minz_Request::forward()?
 	 */
 	public function deleteAction() {
-		$redirect_url = Minz_Request::param('r', false, true);
-		if (!$redirect_url) {
-			$redirect_url = array('c' => 'subscription', 'a' => 'index');
-		}
-		if (!Minz_Request::isPost()) {
-			Minz_Request::forward($redirect_url, true);
-		}
-
+		$from = Minz_Request::param('from');
 		$id = Minz_Request::param('id');
 
+		switch ($from) {
+			case 'stats':
+				$redirect_url = array('c' => 'stats', 'a' => 'idle');
+				break;
+			case 'normal':
+				$get = Minz_Request::param('get');
+				if ($get) {
+					$redirect_url = array('c' => 'index', 'a' => 'normal', 'params' => array('get' => $get));
+				} else {
+					$redirect_url = array('c' => 'index', 'a' => 'normal');
+				}
+				break;
+			default:
+				$redirect_url = Minz_Request::param('r', false, true);
+				if (!$redirect_url) {
+					$redirect_url = array('c' => 'subscription', 'a' => 'index');
+				}
+				if (!Minz_Request::isPost()) {
+					Minz_Request::forward($redirect_url, true);
+				}
+		}
+
 		if (self::deleteFeed($id)) {
 			Minz_Request::good(_t('feedback.sub.feed.deleted'), $redirect_url);
 		} else {

+ 8 - 0
app/Controllers/indexController.php

@@ -26,6 +26,14 @@ class FreshRSS_index_Controller extends FreshRSS_ActionController {
 			return;
 		}
 
+		$id = Minz_Request::param('id');
+		if ($id) {
+			$view = Minz_Request::param('a');
+			$url_redirect = array('c' => 'subscription', 'a' => 'feed', 'params' => array('id' => $id, 'from' => $view));
+			Minz_Request::forward($url_redirect, true);
+			return;
+		}
+
 		try {
 			$this->updateContext();
 		} catch (FreshRSS_Context_Exception $e) {

+ 16 - 4
app/Controllers/subscriptionController.php

@@ -225,11 +225,23 @@ class FreshRSS_subscription_Controller extends FreshRSS_ActionController {
 			invalidateHttpCache();
 
 			$from = Minz_Request::param('from');
-			if ($from === false) {
-				$url_redirect = array('c' => 'subscription', 'params' => array('id' => $id));
-			} else {
-				$url_redirect = array('c' => 'stats', 'a' => 'idle', 'params' => array('id' => $id, 'from' => 'stats'));
+			switch ($from) {
+				case 'stats':
+					$url_redirect = array('c' => 'stats', 'a' => 'idle', 'params' => array('id' => $id, 'from' => 'stats'));
+					break;
+				case 'normal':
+				case 'reader':
+					$get = Minz_Request::param('get');
+					if ($get) {
+						$url_redirect = array('c' => 'index', 'a' => $from, 'params' => array('get' => $get));
+					} else {
+						$url_redirect = array('c' => 'index', 'a' => $from);
+					}
+					break;
+				default:
+					$url_redirect = array('c' => 'subscription', 'params' => array('id' => $id));
 			}
+
 			if ($feedDAO->updateFeed($id, $values) !== false) {
 				$feed->_category($cat);
 				$feed->faviconPrepare();

+ 9 - 1
app/layout/aside_feed.phtml

@@ -141,7 +141,15 @@
 		<li class="item"><a target="_blank" rel="noreferrer" href="http://example.net/"><?= _t('gen.action.see_website') ?></a></li>
 		<?php if (FreshRSS_Auth::hasAccess()) { ?>
 		<li class="separator"></li>
-		<li class="item"><a href="<?= _url('subscription', 'index', 'id', '------') ?>"><?= _t('gen.action.manage') ?></a></li>
+		<?php
+		$get = Minz_Request::param('get');
+		if (!$get) {
+			$url = _url('subscription', 'feed', 'id', '------', 'from', $actual_view);
+		} else {
+			$url = _url('subscription', 'feed', 'id', '------', 'get', $get, 'from', $actual_view);
+		}
+		?>
+		<li class="item"><a class="configure open-slider" href="<?= $url ?>"><?= _t('gen.action.manage') ?></a></li>
 		<li class="item"><a href="<?= _url('feed', 'actualize', 'id', '------') ?>"><?= _t('gen.action.actualize') ?></a></li>
 		<li class="item">
 			<?php $confirm = FreshRSS_Context::$user_conf->reading_confirm ? 'confirm" disabled="disabled' : ''; ?>

+ 0 - 1
app/views/configure/queries.phtml

@@ -71,5 +71,4 @@
 		}
 	?>
 	</div>
-
 </main>

+ 0 - 1
app/views/extension/index.phtml

@@ -89,5 +89,4 @@
 		}
 	?>
 	</div>
-
 </main>

+ 14 - 2
app/views/helpers/feed/update.phtml

@@ -23,7 +23,12 @@
 	if ($from === false) {
 		$url = _url('subscription', 'feed', 'id', $this->feed->id());
 	} else {
-		$url = _url('subscription', 'feed', 'id', $this->feed->id(), 'from', $from);
+		$get = Minz_Request::param('get');
+		if (!$get) {
+			$url = _url('subscription', 'feed', 'id', $this->feed->id(), 'from', $from);
+		} else {
+			$url = _url('subscription', 'feed', 'id', $this->feed->id(), 'from', $from, 'get', $get);
+		}
 	}
 	?>
 	<form method="post" action="<?= $url ?>" autocomplete="off">
@@ -129,9 +134,16 @@
 			<div class="group-controls">
 				<button type="submit" class="btn btn-important"><?= _t('gen.action.submit') ?></button>
 				<button type="reset" class="btn"><?= _t('gen.action.cancel') ?></button>
+				<?php
+				if ($from === false) {
+					$url = _url('feed', 'delete', 'id', $this->feed->id());
+				} else {
+					$url = _url('feed', 'delete', 'id', $this->feed->id(), 'from', $from);
+				}
+				?>
 				<button type="submit" class="btn btn-attention confirm"
 					data-str-confirm="<?= _t('gen.js.confirm_action_feed_cat') ?>"
-					formaction="<?= _url('feed', 'delete', 'id', $this->feed->id()) ?>"
+					formaction="<?= $url ?>"
 					formmethod="post"><?= _t('gen.action.remove') ?></button>
 			</div>
 		</div>

+ 6 - 1
app/views/index/normal.phtml

@@ -114,7 +114,12 @@ $today = @strtotime('today');
 	if ($nbEntries > 0):
 		call_user_func($this->callbackBeforePagination, $this, $nbEntries, $lastEntry);
 		$this->renderHelper('stream-footer');
-?></main><?php
+?><?php $class = $this->displaySlider ? ' class="active"' : ''; ?>
+<a href="#" id="close-slider"<?= $class ?>>
+	<?= _i('close') ?>
+</a>
+<div id="slider"<?= $class ?>>
+</div></main><?php
 	else:
 		ob_end_clean();	//Discard the articles headers, as we have no articles
 ?>

+ 6 - 44
p/scripts/extra.js

@@ -1,6 +1,6 @@
 // @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-3.0
 'use strict';
-/* globals context, openNotification, openPopupWithSource, xmlHttpRequestJson */
+/* globals openNotification, openPopupWithSource, xmlHttpRequestJson */
 
 function fix_popup_preview_selector() {
 	const link = document.getElementById('popup-preview-selector');
@@ -165,50 +165,9 @@ function init_select_observers() {
 	});
 }
 
-function init_slider_observers() {
-	const slider = document.getElementById('slider');
-	const closer = document.getElementById('close-slider');
-	if (!slider) {
-		return;
-	}
-
-	document.querySelector('.post').onclick = function (ev) {
-		const a = ev.target.closest('.open-slider');
-		if (a) {
-			if (!context.ajax_loading) {
-				context.ajax_loading = true;
-
-				const req = new XMLHttpRequest();
-				req.open('GET', a.href + '&ajax=1', true);
-				req.responseType = 'document';
-				req.onload = function (e) {
-					slider.innerHTML = this.response.body.innerHTML;
-					slider.classList.add('active');
-					closer.classList.add('active');
-					context.ajax_loading = false;
-					fix_popup_preview_selector();
-					init_extra();
-				};
-				req.send();
-				return false;
-			}
-		}
-	};
-
-	closer.onclick = function (ev) {
-		if (data_leave_validation() || confirm(context.i18n.confirmation_default)) {
-			slider.querySelectorAll('form').forEach(function (f) { f.reset(); });
-			closer.classList.remove('active');
-			slider.classList.remove('active');
-			return true;
-		} else {
-			return false;
-		}
-	};
-}
-
 function data_leave_validation() {
 	const ds = document.querySelectorAll('[data-leave-validation]');
+
 	for (let i = ds.length - 1; i >= 0; i--) {
 		const input = ds[i];
 		if (input.type === 'checkbox' || input.type === 'radio') {
@@ -291,11 +250,14 @@ function init_extra() {
 	init_password_observers();
 	init_url_observers();
 	init_select_observers();
-	init_slider_observers();
 	init_configuration_alert();
 	fix_popup_preview_selector();
 	init_select_show();
 	init_valid_xpath();
+
+	if (window.console) {
+		console.log('FreshRSS extra init done.');
+	}
 }
 
 if (document.readyState && document.readyState !== 'loading') {

+ 64 - 0
p/scripts/main.js

@@ -1389,6 +1389,69 @@ function init_notifications() {
 }
 // </notification>
 
+// <slider>
+function init_slider_observers() {
+	const slider = document.getElementById('slider');
+	const closer = document.getElementById('close-slider');
+	if (!slider) {
+		return;
+	}
+
+	window.onclick = open_slider_listener;
+
+	closer.addEventListener('click', function (ev) {
+		if (slider_data_leave_validation() || confirm(context.i18n.confirmation_default)) {
+			slider.querySelectorAll('form').forEach(function (f) { f.reset(); });
+			closer.classList.remove('active');
+			slider.classList.remove('active');
+			return true;
+		} else {
+			return false;
+		}
+	});
+}
+
+function open_slider_listener(ev) {
+	const a = ev.target.closest('.open-slider');
+	if (a) {
+		if (!context.ajax_loading) {
+			location.href = '#'; // close menu/dropdown
+			context.ajax_loading = true;
+
+			const req = new XMLHttpRequest();
+			req.open('GET', a.href + '&ajax=1', true);
+			req.responseType = 'document';
+			req.onload = function (e) {
+				const slider = document.getElementById('slider');
+				const closer = document.getElementById('close-slider');
+				slider.innerHTML = this.response.body.innerHTML;
+				slider.classList.add('active');
+				closer.classList.add('active');
+				context.ajax_loading = false;
+			};
+			req.send();
+			return false;
+		}
+	}
+}
+
+function slider_data_leave_validation() {
+	const ds = document.querySelectorAll('[data-leave-validation]');
+
+	for (let i = ds.length - 1; i >= 0; i--) {
+		const input = ds[i];
+		if (input.type === 'checkbox' || input.type === 'radio') {
+			if (input.checked != input.getAttribute('data-leave-validation')) {
+				return false;
+			}
+		} else if (input.value != input.getAttribute('data-leave-validation')) {
+			return false;
+		}
+	}
+	return true;
+}
+// </slider>
+
 // <popup>
 let popup = null;
 let popup_iframe_container = null;
@@ -1753,6 +1816,7 @@ function init_beforeDOM() {
 function init_afterDOM() {
 	removeFirstLoadSpinner();
 	init_notifications();
+	init_slider_observers();
 	init_popup();
 	init_confirm_action();
 	const stream = document.getElementById('stream');