aside_feed.phtml 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <?php
  2. /** @var FreshRSS_View $this */
  3. $actual_view = Minz_Request::actionName();
  4. $class = '';
  5. if (FreshRSS_Context::$user_conf->hide_read_feeds &&
  6. FreshRSS_Context::isStateEnabled(FreshRSS_Entry::STATE_NOT_READ) &&
  7. !FreshRSS_Context::isStateEnabled(FreshRSS_Entry::STATE_READ)) {
  8. $class = ' state_unread';
  9. }
  10. $state_filter_manual = Minz_Request::paramString('state');
  11. if ($state_filter_manual !== '') {
  12. $state_filter_manual = '&state=' . $state_filter_manual;
  13. }
  14. ?>
  15. <nav class="nav aside aside_feed<?= $class ?>" id="aside_feed">
  16. <a class="toggle_aside" href="#close"><?= _i('close') ?></a>
  17. <?php if (FreshRSS_Auth::hasAccess()) { ?>
  18. <div class="stick configure-feeds">
  19. <a id="btn-subscription" class="btn btn-important" href="<?= _url('subscription', 'index') ?>"><?= _t('index.menu.subscription') ?></a>
  20. <a id="btn-add" class="btn btn-important" href="<?= _url('subscription', 'add') ?>"><?= _i('add') ?></a>
  21. </div>
  22. <?php } elseif (FreshRSS_Auth::accessNeedsLogin()) { ?>
  23. <a href="<?= _url('index', 'about') ?>" class="about"><?= _t('index.menu.about') ?></a>
  24. <?php } ?>
  25. <form id="mark-read-aside" method="post">
  26. <input type="hidden" name="_csrf" value="<?= FreshRSS_Auth::csrfToken() ?>" />
  27. <ul id="sidebar" class="tree scrollbar-thin">
  28. <li class="tree-folder category all<?= FreshRSS_Context::isCurrentGet('a') ? ' active' : '' ?>">
  29. <div class="tree-folder-title">
  30. <?= _i('all') ?><a class="title" data-unread="<?= format_number(FreshRSS_Context::$total_unread) ?>" href="<?=
  31. _url('index', $actual_view) . $state_filter_manual ?>"><?= _t('index.menu.main_stream') ?></a>
  32. </div>
  33. </li>
  34. <li class="tree-folder category favorites<?= FreshRSS_Context::isCurrentGet('s') ? ' active' : '' ?>">
  35. <div class="tree-folder-title">
  36. <?= _i('starred') ?><a class="title" data-unread="<?= format_number(FreshRSS_Context::$total_starred['unread']) ?>" href="<?= _url('index', $actual_view, 'get', 's') . $state_filter_manual ?>">
  37. <?= _t('index.menu.favorites', format_number(FreshRSS_Context::$total_starred['all'])) ?>
  38. </a>
  39. </div>
  40. </li>
  41. <?php
  42. $t_active = FreshRSS_Context::isCurrentGet('T');
  43. $t_show = ($t_active && in_array(FreshRSS_Context::$user_conf->display_categories, ['active', 'remember'], true)) || FreshRSS_Context::$user_conf->display_categories === 'all';
  44. ?>
  45. <li id="tags" class="tree-folder category tags<?= $t_active ? ' active' : '' ?>" data-unread="<?= format_number($this->nbUnreadTags) ?>">
  46. <div class="tree-folder-title">
  47. <a class="dropdown-toggle" href="#"><?= _i($t_show ? 'up' : 'down') ?></a><a class="title" data-unread="<?= format_number($this->nbUnreadTags) ?>" href="<?= _url('index', $actual_view, 'get', 'T') . $state_filter_manual ?>"><?= _t('index.menu.tags') ?></a>
  48. </div>
  49. <ul class="tree-folder-items<?= $t_show ? ' active' : '' ?>">
  50. <?php
  51. foreach ($this->tags as $tag):
  52. ?>
  53. <li id="t_<?= $tag->id() ?>" class="item feed<?= FreshRSS_Context::isCurrentGet('t_' . $tag->id()) ? ' active' : '' ?>" data-unread="<?= $tag->nbUnread() ?>">
  54. <div class="dropdown no-mobile">
  55. <div class="dropdown-target"></div>
  56. <a class="dropdown-toggle"><?= _i('configure') ?></a>
  57. <?php /* tag_config_template */ ?>
  58. </div>
  59. <a class="item-title" data-unread="<?= format_number($tag->nbUnread()) ?>" href="<?=
  60. _url('index', $actual_view, 'get', 't_' . $tag->id()) . $state_filter_manual ?>"><?= _i('label') ?> <?= $tag->name() ?></a>
  61. </li>
  62. <?php endforeach; ?>
  63. </ul>
  64. </li>
  65. <?php
  66. $nbFeedsTotal = 0;
  67. foreach ($this->categories as $cat) {
  68. $nbFeedsTotal += $cat->nbFeeds();
  69. }
  70. foreach ($this->categories as $cat):
  71. $feeds = $cat->feeds();
  72. $position = $cat->attributes('position');
  73. if (!empty($feeds)) {
  74. $c_active = FreshRSS_Context::isCurrentGet('c_' . $cat->id());
  75. $c_show = ($c_active && in_array(FreshRSS_Context::$user_conf->display_categories, ['active', 'remember'], true))
  76. || FreshRSS_Context::$user_conf->display_categories === 'all';
  77. ?>
  78. <li id="c_<?= $cat->id() ?>" class="tree-folder category<?= $c_active ? ' active' : '' ?>"<?=
  79. null === $position ? '' : " data-position='$position'" ?> data-unread="<?= $cat->nbNotRead() ?>">
  80. <div class="tree-folder-title">
  81. <a class="dropdown-toggle" href="#"><?= _i($c_show ? 'up' : 'down') ?></a><a class="title<?= $cat->hasFeedsWithError() ? ' error' : '' ?>" data-unread="<?=
  82. format_number($cat->nbNotRead()) ?>" href="<?= _url('index', $actual_view, 'get', 'c_' . $cat->id()) . $state_filter_manual ?>"><?=
  83. $cat->name()
  84. ?><?php if ($cat->kind() == FreshRSS_Category::KIND_DYNAMIC_OPML) { echo _i('opml-dyn'); } ?></a>
  85. </div>
  86. <ul class="tree-folder-items<?= $c_show ? ' active' : '' ?>">
  87. <?php
  88. // NB: Reduce whitespace in that loop
  89. foreach ($feeds as $feed):
  90. $f_active = FreshRSS_Context::isCurrentGet('f_' . $feed->id());
  91. $f_active_class = $f_active ? ' active' : '';
  92. $error_class = '';
  93. $error_title = '';
  94. if ($feed->inError()) {
  95. $error_class = ' error';
  96. $error_title = _t('sub.feed.error');
  97. }
  98. $empty_class = '';
  99. $empty_title = '';
  100. if ($feed->nbEntries() <= 0) {
  101. $empty_class = ' empty';
  102. $empty_title = _t('sub.feed.empty');
  103. }
  104. $mute_class = $feed->mute() ? ' mute' : '';
  105. ?>
  106. <li id="f_<?= $feed->id() ?>" class="item feed<?= $f_active_class, $mute_class, $error_class, $empty_class ?>" title="<?= $error_title, $empty_title ?>"
  107. data-unread="<?= $feed->nbNotRead() ?>" data-priority="<?= $feed->priority() ?>"><?php
  108. if ($f_active || $nbFeedsTotal < FreshRSS_Context::$user_conf->simplify_over_n_feeds):
  109. ?><div class="dropdown no-mobile">
  110. <div class="dropdown-target"></div><a class="dropdown-toggle" data-fweb="<?= $feed->website() ?>"><?= _i('configure') ?></a><?php /* feed_config_template */ ?>
  111. </div><?php
  112. if (FreshRSS_Context::$user_conf->show_favicons) { ?><img class="favicon test" src="<?= $feed->favicon() ?>" alt="✇" loading="lazy" /><?php }
  113. endif;
  114. ?><a class="item-title" data-unread="<?= format_number($feed->nbNotRead()) ?>" href="<?=
  115. _url('index', $actual_view, 'get', 'f_' . $feed->id()) . $state_filter_manual ?>"><?= $feed->name() ?></a></li>
  116. <?php
  117. endforeach;
  118. ?>
  119. </ul>
  120. </li>
  121. <?php
  122. }
  123. endforeach;
  124. ?>
  125. <li class="tree-bottom"></li>
  126. </ul>
  127. </form>
  128. </nav>
  129. <a class="close-aside" href="#close">❌</a>
  130. <div id="first_load" class="loading"></div>
  131. <?php flush(); ?>
  132. <script id="tag_config_template" type="text/html">
  133. <ul class="dropdown-menu">
  134. <li class="item">
  135. <button class="as-link confirm" disabled="disabled"
  136. form="mark-read-aside" formaction="<?= _url('tag', 'delete', 'id_tag', '------') ?>"
  137. type="submit"><?= _t('gen.action.remove') ?></button>
  138. </li>
  139. </ul>
  140. <a class="dropdown-close" href="#close">❌</a>
  141. </script>
  142. <script id="feed_config_template" type="text/html">
  143. <ul class="dropdown-menu">
  144. <li class="item"><a href="<?= _url('index', $actual_view, 'get', 'f_------') ?>"><?= _t('gen.action.filter') ?></a></li>
  145. <?php if (FreshRSS_Auth::hasAccess()) { ?>
  146. <li class="item"><a href="<?= _url('stats', 'repartition', 'id', '------') ?>"><?= _t('index.menu.stats') ?></a></li>
  147. <?php } ?>
  148. <li class="item link website"><a target="_blank" rel="noreferrer" href="http://example.net/"><?= _t('gen.action.see_website') ?></a></li>
  149. <?php if (FreshRSS_Auth::hasAccess()) {
  150. $get = Minz_Request::paramString('get');
  151. if ($get === '') {
  152. $url = _url('subscription', 'feed', 'id', '------', 'from', $actual_view);
  153. } else {
  154. $url = _url('subscription', 'feed', 'id', '------', 'get', $get, 'from', $actual_view);
  155. }
  156. ?>
  157. <li class="item"><a class="configure open-slider" href="<?= $url ?>"><?= _t('gen.action.manage') ?></a></li>
  158. <li class="item"><a href="<?= _url('feed', 'actualize', 'id', '------') ?>"><?= _t('gen.action.actualize') ?></a></li>
  159. <li class="item">
  160. <?php $confirm = FreshRSS_Context::$user_conf->reading_confirm ? 'confirm" disabled="disabled' : ''; ?>
  161. <button class="read_all as-link <?= $confirm ?>"
  162. form="mark-read-aside"
  163. formaction="<?= _url('entry', 'read', 'get', 'f_------') ?>"
  164. type="submit"><?= _t('index.menu.mark_feed_read') ?></button>
  165. </li>
  166. <?php } ?>
  167. </ul>
  168. <a class="dropdown-close" href="#close">❌</a>
  169. </script>