Răsfoiți Sursa

New button to delete errored feeds from a category (#7030)

* New button to delete errored feeds from a category
fix https://github.com/FreshRSS/FreshRSS/issues/7025
fix https://github.com/FreshRSS/FreshRSS/issues/7026

* Remove English TODO

* in error state

* Feeds with errors
Alexandre Alapetite 1 an în urmă
părinte
comite
2c7e5b829f

+ 3 - 2
app/Controllers/categoryController.php

@@ -229,11 +229,12 @@ class FreshRSS_category_Controller extends FreshRSS_ActionController {
 			}
 
 			$muted = Minz_Request::paramTernary('muted');
+			$errored = Minz_Request::paramTernary('errored');
 
 			// List feeds to remove then related user queries.
-			$feeds = $feedDAO->listByCategory($id, $muted);
+			$feeds = $feedDAO->listByCategory($id, $muted, $errored);
 
-			if ($feedDAO->deleteFeedByCategory($id, $muted)) {
+			if ($feedDAO->deleteFeedByCategory($id, $muted, $errored)) {
 				// TODO: Delete old favicons
 
 				// Remove related queries

+ 10 - 2
app/Models/FeedDAO.php

@@ -267,12 +267,16 @@ class FreshRSS_FeedDAO extends Minz_ModelPdo {
 
 	/**
 	 * @param bool|null $muted to include only muted feeds
+	 * @param bool|null $errored to include only errored feeds
 	 */
-	public function deleteFeedByCategory(int $id, ?bool $muted = null): int|false {
+	public function deleteFeedByCategory(int $id, ?bool $muted = null, ?bool $errored = null): int|false {
 		$sql = 'DELETE FROM `_feed` WHERE category=?';
 		if ($muted) {
 			$sql .= ' AND ttl < 0';
 		}
+		if ($errored) {
+			$sql .= ' AND error <> 0';
+		}
 		$stm = $this->pdo->prepare($sql);
 
 		$values = [$id];
@@ -406,13 +410,17 @@ SQL;
 
 	/**
 	 * @param bool|null $muted to include only muted feeds
+	 * @param bool|null $errored to include only errored feeds
 	 * @return array<int,FreshRSS_Feed>
 	 */
-	public function listByCategory(int $cat, ?bool $muted = null): array {
+	public function listByCategory(int $cat, ?bool $muted = null, ?bool $errored = null): array {
 		$sql = 'SELECT * FROM `_feed` WHERE category=:category';
 		if ($muted) {
 			$sql .= ' AND ttl < 0';
 		}
+		if ($errored) {
+			$sql .= ' AND error <> 0';
+		}
 		$res = $this->fetchAssoc($sql, [':category' => $cat]);
 		if ($res == null) {
 			return [];

+ 2 - 0
app/i18n/cs/gen.php

@@ -18,6 +18,8 @@ return array(
 		'back_to_rss_feeds' => '← Jít zpět na vaše kanály RSS',
 		'cancel' => 'Zrušit',
 		'create' => 'Vytvořit',
+		'delete_all_feeds' => 'Delete all feeds',	// TODO
+		'delete_errored_feeds' => 'Delete feeds with errors',	// TODO
 		'delete_muted_feeds' => 'Odstranění ztlumených zdrojů',
 		'demote' => 'Snížit úroveň',
 		'disable' => 'Zakázat',

+ 2 - 0
app/i18n/de/gen.php

@@ -18,6 +18,8 @@ return array(
 		'back_to_rss_feeds' => '← Zurück zu Ihren RSS-Feeds gehen',
 		'cancel' => 'Abbrechen',
 		'create' => 'Erstellen',
+		'delete_all_feeds' => 'Delete all feeds',	// TODO
+		'delete_errored_feeds' => 'Delete feeds with errors',	// TODO
 		'delete_muted_feeds' => 'Lösche stumm gestellte Feeds',
 		'demote' => 'Zurückstufen',
 		'disable' => 'Deaktivieren',

+ 2 - 0
app/i18n/el/gen.php

@@ -18,6 +18,8 @@ return array(
 		'back_to_rss_feeds' => '← Go back to your RSS feeds',	// TODO
 		'cancel' => 'Cancel',	// TODO
 		'create' => 'Create',	// TODO
+		'delete_all_feeds' => 'Delete all feeds',	// TODO
+		'delete_errored_feeds' => 'Delete feeds with errors',	// TODO
 		'delete_muted_feeds' => 'Delete muted feeds',	// TODO
 		'demote' => 'Demote',	// TODO
 		'disable' => 'Disable',	// TODO

+ 1 - 1
app/i18n/el/sub.php

@@ -193,7 +193,7 @@ return array(
 		),
 		'method_help' => 'The POST payload has automatic support for <code>application/x-www-form-urlencoded</code> and <code>application/json</code>',	// TODO
 		'method_postparams' => 'Payload for POST',	// TODO
-		'moved_category_deleted' => 'When you delete a category, its feeds are automatically classified under <em>%s</em>.',	// TODO
+		'moved_category_deleted' => 'When you remove a category, its feeds are automatically classified under <em>%s</em>.',	// TODO
 		'mute' => array(
 			'_' => 'mute',	// TODO
 			'state_is_muted' => 'This feed is muted',	// TODO

+ 2 - 0
app/i18n/en-us/gen.php

@@ -18,6 +18,8 @@ return array(
 		'back_to_rss_feeds' => '← Go back to your RSS feeds',	// IGNORE
 		'cancel' => 'Cancel',	// IGNORE
 		'create' => 'Create',	// IGNORE
+		'delete_all_feeds' => 'Delete all feeds',	// IGNORE
+		'delete_errored_feeds' => 'Delete feeds with errors',	// IGNORE
 		'delete_muted_feeds' => 'Delete muted feeds',	// IGNORE
 		'demote' => 'Demote',	// IGNORE
 		'disable' => 'Disable',	// IGNORE

+ 1 - 1
app/i18n/en-us/sub.php

@@ -193,7 +193,7 @@ return array(
 		),
 		'method_help' => 'The POST payload has automatic support for <code>application/x-www-form-urlencoded</code> and <code>application/json</code>',	// IGNORE
 		'method_postparams' => 'Payload for POST',	// IGNORE
-		'moved_category_deleted' => 'When you delete a category, its feeds are automatically classified under <em>%s</em>.',	// IGNORE
+		'moved_category_deleted' => 'When you remove a category, its feeds are automatically classified under <em>%s</em>.',	// IGNORE
 		'mute' => array(
 			'_' => 'mute',	// IGNORE
 			'state_is_muted' => 'This feed is muted',	// IGNORE

+ 2 - 0
app/i18n/en/gen.php

@@ -18,6 +18,8 @@ return array(
 		'back_to_rss_feeds' => '← Go back to your RSS feeds',
 		'cancel' => 'Cancel',
 		'create' => 'Create',
+		'delete_all_feeds' => 'Delete all feeds',
+		'delete_errored_feeds' => 'Delete feeds with errors',
 		'delete_muted_feeds' => 'Delete muted feeds',
 		'demote' => 'Demote',
 		'disable' => 'Disable',

+ 1 - 1
app/i18n/en/sub.php

@@ -193,7 +193,7 @@ return array(
 		),
 		'method_help' => 'The POST payload has automatic support for <code>application/x-www-form-urlencoded</code> and <code>application/json</code>',
 		'method_postparams' => 'Payload for POST',
-		'moved_category_deleted' => 'When you delete a category, its feeds are automatically classified under <em>%s</em>.',
+		'moved_category_deleted' => 'When you remove a category, its feeds are automatically classified under <em>%s</em>.',
 		'mute' => array(
 			'_' => 'mute',
 			'state_is_muted' => 'This feed is muted',

+ 2 - 0
app/i18n/es/gen.php

@@ -18,6 +18,8 @@ return array(
 		'back_to_rss_feeds' => '← regresar a tus fuentes RSS',
 		'cancel' => 'Cancelar',
 		'create' => 'Crear',
+		'delete_all_feeds' => 'Delete all feeds',	// TODO
+		'delete_errored_feeds' => 'Delete feeds with errors',	// TODO
 		'delete_muted_feeds' => 'Eliminar fuentes silenciadas',
 		'demote' => 'Degradar',
 		'disable' => 'Desactivar',

+ 2 - 0
app/i18n/fa/gen.php

@@ -18,6 +18,8 @@ return array(
 		'back_to_rss_feeds' => '← به فیدهای RSS خود برگردید',
 		'cancel' => ' لغو',
 		'create' => ' ایجاد کنید',
+		'delete_all_feeds' => 'Delete all feeds',	// TODO
+		'delete_errored_feeds' => 'Delete feeds with errors',	// TODO
 		'delete_muted_feeds' => ' فیدهای خاموش را حذف کنید',
 		'demote' => ' تنزل دادن',
 		'disable' => ' غیر فعال کردن',

+ 2 - 0
app/i18n/fi/gen.php

@@ -18,6 +18,8 @@ return array(
 		'back_to_rss_feeds' => '← Palaa RSS-syötteisiin',
 		'cancel' => 'Peruuta',
 		'create' => 'Luo',
+		'delete_all_feeds' => 'Delete all feeds',	// TODO
+		'delete_errored_feeds' => 'Delete feeds with errors',	// TODO
 		'delete_muted_feeds' => 'Poista vaimennetut syötteet',
 		'demote' => 'Laske tärkeyttä',
 		'disable' => 'Poista käytöstä',

+ 2 - 0
app/i18n/fr/gen.php

@@ -18,6 +18,8 @@ return array(
 		'back_to_rss_feeds' => '← Retour à vos flux RSS',
 		'cancel' => 'Annuler',
 		'create' => 'Créer',
+		'delete_all_feeds' => 'Supprimer tous les flux',
+		'delete_errored_feeds' => 'Supprimer les flux en erreur',
 		'delete_muted_feeds' => 'Supprimer les flux désactivés',
 		'demote' => 'Rétrograder',
 		'disable' => 'Désactiver',

+ 2 - 0
app/i18n/he/gen.php

@@ -18,6 +18,8 @@ return array(
 		'back_to_rss_feeds' => '← חזרה להזנות הRSS שלך',
 		'cancel' => 'ביטול',
 		'create' => 'יצירה',
+		'delete_all_feeds' => 'Delete all feeds',	// TODO
+		'delete_errored_feeds' => 'Delete feeds with errors',	// TODO
 		'delete_muted_feeds' => 'Delete muted feeds',	// TODO
 		'demote' => 'Demote',	// TODO
 		'disable' => 'Disable',	// TODO

+ 2 - 0
app/i18n/hu/gen.php

@@ -18,6 +18,8 @@ return array(
 		'back_to_rss_feeds' => '← Vissza az RSS hírforrásokhoz',
 		'cancel' => 'Mégsem',
 		'create' => 'Létrehoz',
+		'delete_all_feeds' => 'Delete all feeds',	// TODO
+		'delete_errored_feeds' => 'Delete feeds with errors',	// TODO
 		'delete_muted_feeds' => 'Némított hírforrások törlése',
 		'demote' => 'Lefokoz',
 		'disable' => 'Kikapcsol',

+ 2 - 0
app/i18n/id/gen.php

@@ -18,6 +18,8 @@ return array(
 		'back_to_rss_feeds' => '← Go back to your RSS feeds',	// TODO
 		'cancel' => 'Cancel',	// TODO
 		'create' => 'Create',	// TODO
+		'delete_all_feeds' => 'Delete all feeds',	// TODO
+		'delete_errored_feeds' => 'Delete feeds with errors',	// TODO
 		'delete_muted_feeds' => 'Delete muted feeds',	// TODO
 		'demote' => 'Demote',	// TODO
 		'disable' => 'Disable',	// TODO

+ 1 - 1
app/i18n/id/sub.php

@@ -193,7 +193,7 @@ return array(
 		),
 		'method_help' => 'The POST payload has automatic support for <code>application/x-www-form-urlencoded</code> and <code>application/json</code>',	// TODO
 		'method_postparams' => 'Payload for POST',	// TODO
-		'moved_category_deleted' => 'When you delete a category, its feeds are automatically classified under <em>%s</em>.',	// TODO
+		'moved_category_deleted' => 'When you remove a category, its feeds are automatically classified under <em>%s</em>.',	// TODO
 		'mute' => array(
 			'_' => 'mute',	// TODO
 			'state_is_muted' => 'This feed is muted',	// TODO

+ 2 - 0
app/i18n/it/gen.php

@@ -18,6 +18,8 @@ return array(
 		'back_to_rss_feeds' => '← Indietro',
 		'cancel' => 'Annulla',
 		'create' => 'Crea',
+		'delete_all_feeds' => 'Delete all feeds',	// TODO
+		'delete_errored_feeds' => 'Delete feeds with errors',	// TODO
 		'delete_muted_feeds' => 'Cancella i feed mutati',
 		'demote' => 'Retrocedi',
 		'disable' => 'Disabilita',

+ 2 - 0
app/i18n/ja/gen.php

@@ -18,6 +18,8 @@ return array(
 		'back_to_rss_feeds' => '← RSSフィードに戻る',
 		'cancel' => 'キャンセル',
 		'create' => '作成',
+		'delete_all_feeds' => 'Delete all feeds',	// TODO
+		'delete_errored_feeds' => 'Delete feeds with errors',	// TODO
 		'delete_muted_feeds' => 'ミュートにしているフィードを削除する',
 		'demote' => '寄付',
 		'disable' => '無効',

+ 2 - 0
app/i18n/ko/gen.php

@@ -18,6 +18,8 @@ return array(
 		'back_to_rss_feeds' => '← RSS 피드로 돌아가기',
 		'cancel' => '취소',
 		'create' => '생성',
+		'delete_all_feeds' => 'Delete all feeds',	// TODO
+		'delete_errored_feeds' => 'Delete feeds with errors',	// TODO
 		'delete_muted_feeds' => '음소거된 피드 삭제',
 		'demote' => '목록 수준 내리기',
 		'disable' => '비활성화',

+ 2 - 0
app/i18n/lv/gen.php

@@ -18,6 +18,8 @@ return array(
 		'back_to_rss_feeds' => '← Atgriezieties pie RSS barotnēm',
 		'cancel' => 'Atcelt',
 		'create' => 'Uztaisīt',
+		'delete_all_feeds' => 'Delete all feeds',	// TODO
+		'delete_errored_feeds' => 'Delete feeds with errors',	// TODO
 		'delete_muted_feeds' => 'Izdzēst izslēgtās barotnes',
 		'demote' => 'Pazemināt amatu',
 		'disable' => 'Izslēgt',

+ 2 - 0
app/i18n/nl/gen.php

@@ -18,6 +18,8 @@ return array(
 		'back_to_rss_feeds' => '← Ga terug naar je RSS feeds',
 		'cancel' => 'Annuleren',
 		'create' => 'Opslaan',
+		'delete_all_feeds' => 'Delete all feeds',	// TODO
+		'delete_errored_feeds' => 'Delete feeds with errors',	// TODO
 		'delete_muted_feeds' => 'Gedempte feeds verwijderen',
 		'demote' => 'Degraderen',
 		'disable' => 'Uitzetten',

+ 2 - 0
app/i18n/oc/gen.php

@@ -18,6 +18,8 @@ return array(
 		'back_to_rss_feeds' => '← Tornar a vòstres fluxes RSS',
 		'cancel' => 'Anullar',
 		'create' => 'Crear',
+		'delete_all_feeds' => 'Delete all feeds',	// TODO
+		'delete_errored_feeds' => 'Delete feeds with errors',	// TODO
 		'delete_muted_feeds' => 'Suprimir los flux muts',
 		'demote' => 'Retrogradar',
 		'disable' => 'Desactivar',

+ 2 - 0
app/i18n/pl/gen.php

@@ -18,6 +18,8 @@ return array(
 		'back_to_rss_feeds' => '← Wróć do subskrybowanych kanałów RSS',
 		'cancel' => 'Anuluj',
 		'create' => 'Stwórz',
+		'delete_all_feeds' => 'Delete all feeds',	// TODO
+		'delete_errored_feeds' => 'Delete feeds with errors',	// TODO
 		'delete_muted_feeds' => 'Usuń wyciszone kanały',
 		'demote' => 'Zdegraduj',
 		'disable' => 'Wyłącz',

+ 2 - 0
app/i18n/pt-br/gen.php

@@ -18,6 +18,8 @@ return array(
 		'back_to_rss_feeds' => '← Volte para o seu feeds RSS',
 		'cancel' => 'Cancelar',
 		'create' => 'Criar',
+		'delete_all_feeds' => 'Delete all feeds',	// TODO
+		'delete_errored_feeds' => 'Delete feeds with errors',	// TODO
 		'delete_muted_feeds' => 'Excluir feeds silenciados',
 		'demote' => 'Despromover',
 		'disable' => 'Desabilitar',

+ 2 - 0
app/i18n/ru/gen.php

@@ -18,6 +18,8 @@ return array(
 		'back_to_rss_feeds' => '← Вернуться к вашим RSS-лентам',
 		'cancel' => 'Отменить',
 		'create' => 'Создать',
+		'delete_all_feeds' => 'Delete all feeds',	// TODO
+		'delete_errored_feeds' => 'Delete feeds with errors',	// TODO
 		'delete_muted_feeds' => 'Удалить заглушенные ленты',
 		'demote' => 'Понизить',
 		'disable' => 'Отключить',

+ 2 - 0
app/i18n/sk/gen.php

@@ -18,6 +18,8 @@ return array(
 		'back_to_rss_feeds' => '← Späť na vaše RSS kanály',
 		'cancel' => 'Zrušiť',
 		'create' => 'Vytvoriť',
+		'delete_all_feeds' => 'Delete all feeds',	// TODO
+		'delete_errored_feeds' => 'Delete feeds with errors',	// TODO
 		'delete_muted_feeds' => 'Vymazať stíšené kanály',
 		'demote' => 'Degradovať',
 		'disable' => 'Zakázať',

+ 2 - 0
app/i18n/tr/gen.php

@@ -18,6 +18,8 @@ return array(
 		'back_to_rss_feeds' => '← RSS akışlarınız için geri gidin',
 		'cancel' => 'İptal',
 		'create' => 'Oluştur',
+		'delete_all_feeds' => 'Delete all feeds',	// TODO
+		'delete_errored_feeds' => 'Delete feeds with errors',	// TODO
 		'delete_muted_feeds' => 'Sessize alınmış akışları sil',
 		'demote' => 'Yöneticilikten al',
 		'disable' => 'Pasif',

+ 2 - 0
app/i18n/zh-cn/gen.php

@@ -18,6 +18,8 @@ return array(
 		'back_to_rss_feeds' => '← 返回订阅源',
 		'cancel' => '取消',
 		'create' => '创建',
+		'delete_all_feeds' => 'Delete all feeds',	// TODO
+		'delete_errored_feeds' => 'Delete feeds with errors',	// TODO
 		'delete_muted_feeds' => '删除已暂停的订阅源',
 		'demote' => '撤销管理员',
 		'disable' => '禁用',

+ 2 - 0
app/i18n/zh-tw/gen.php

@@ -18,6 +18,8 @@ return array(
 		'back_to_rss_feeds' => '← 返回訂閱源',
 		'cancel' => '取消',
 		'create' => '創建',
+		'delete_all_feeds' => 'Delete all feeds',	// TODO
+		'delete_errored_feeds' => 'Delete feeds with errors',	// TODO
 		'delete_muted_feeds' => '刪除已暫停的訂閱源',
 		'demote' => '撤銷管理員',
 		'disable' => '禁用',

+ 7 - 1
app/views/helpers/category/update.phtml

@@ -249,10 +249,16 @@
 			<?php endif;?>
 			<div class="form-group form-actions">
 				<div class="group-controls">
+					<button type="submit" class="btn btn-attention confirm"
+						data-str-confirm="<?= _t('gen.js.confirm_action_feed_cat') ?>"
+						formaction="<?= _url('category', 'empty', 'id', $this->category->id(), 'errored', 1) ?>"
+						formmethod="post"><?= _t('gen.action.delete_errored_feeds') ?></button>
+
 					<button type="submit" class="btn btn-attention confirm"
 						data-str-confirm="<?= _t('gen.js.confirm_action_feed_cat') ?>"
 						formaction="<?= _url('category', 'empty', 'id', $this->category->id()) ?>"
-						formmethod="post"><?= _t('gen.action.empty') ?></button>
+						formmethod="post"><?= _t('gen.action.delete_all_feeds') ?></button>
+
 					<?php if (!$this->category->isDefault()): ?>
 					<button type="submit" class="btn btn-attention confirm"
 						data-str-confirm="<?= _t('gen.js.confirm_action_feed_cat') ?>"