nav_menu.phtml 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. <?php
  2. declare(strict_types=1);
  3. $actual_view = Minz_Request::actionName();
  4. ?>
  5. <nav class="nav_menu">
  6. <?php if ($actual_view === 'normal' || $actual_view === 'reader') { ?>
  7. <div id="nav_menu_toggle_aside" class="group">
  8. <button class="btn<?= $actual_view === 'normal' ? ' active' : '' ?>" title="<?= _t('conf.shortcut.toggle_aside') ?>">
  9. <?= _i('category') ?>
  10. </button>
  11. </div>
  12. <?php } ?>
  13. <?php if (FreshRSS_Auth::hasAccess()) { ?>
  14. <div id="nav_menu_actions" class="group">
  15. <?php
  16. $states = [
  17. 'read' => FreshRSS_Entry::STATE_READ,
  18. 'unread' => FreshRSS_Entry::STATE_NOT_READ,
  19. 'starred' => FreshRSS_Entry::STATE_FAVORITE,
  20. 'non-starred' => FreshRSS_Entry::STATE_NOT_FAVORITE,
  21. ];
  22. foreach ($states as $state_str => $state) {
  23. $state_enabled = FreshRSS_Context::isStateEnabled($state);
  24. $url_state = Minz_Request::currentRequest();
  25. $reverted_state = FreshRSS_Context::getRevertState($state);
  26. $reverted_state &= FreshRSS_Entry::STATE_ANDS; // Keep only the AND states
  27. $url_state['params']['state'] = $reverted_state;
  28. ?>
  29. <a id="toggle-<?= $state_str ?>"
  30. class="btn <?= $state_enabled ? 'active' : '' ?>"
  31. role="checkbox" aria-checked="<?= $state_enabled ? 'true' : 'false' ?>"
  32. title="<?= _t('index.menu.' . $state_str) ?>"
  33. href="<?= Minz_Url::display($url_state) ?>"><?= _i($state_str) ?></a>
  34. <?php } ?>
  35. <div id="dropdown-search-wrapper" class="dropdown only-mobile">
  36. <input type="hidden" name="_csrf" value="<?= FreshRSS_Auth::csrfToken() ?>" />
  37. <div id="dropdown-search" class="dropdown-target"></div>
  38. <a id="toggle-search" class="dropdown-toggle btn<?= FreshRSS_Context::$search->toString() !== '' ? ' active' : ''; ?>" title="<?= _t('gen.menu.search') ?>"
  39. href="#dropdown-search"><?= _i('search') ?></a>
  40. <ul class="dropdown-menu">
  41. <li class="item">
  42. <span>
  43. <form action="<?= _url('index', 'index') ?>" method="get">
  44. <?php if (in_array(Minz_Request::actionName(), ['normal', 'global', 'reader'], true)) { ?>
  45. <input type="hidden" name="a" value="<?= Minz_Request::actionName() ?>" />
  46. <?php } if (Minz_Request::paramString('get') !== '') { ?>
  47. <input type="hidden" name="get" value="<?= FreshRSS_Context::currentGet() ?>" />
  48. <?php } if (ctype_upper(Minz_Request::paramString('order'))) { ?>
  49. <input type="hidden" name="order" value="<?= FreshRSS_Context::$order ?>" />
  50. <?php } if (Minz_Request::paramInt('state') !== 0) { ?>
  51. <input type="hidden" name="state" value="<?= FreshRSS_Context::$state ?>" />
  52. <?php } ?>
  53. <div class="stick search">
  54. <input type="search" name="search"
  55. value="<?= htmlspecialchars(FreshRSS_Context::$search->toString(), ENT_COMPAT, 'UTF-8') ?>"
  56. placeholder="<?= _t('gen.menu.search') ?>" title="<?= _t('gen.menu.search') ?>" /><button class="btn" type="submit" title="<?= _t('index.menu.search_short') ?>"><?= _i('search') ?></button>
  57. </div>
  58. <p class="help"><?= _i('help') ?> <a href="<?= _url('search', 'index') ?>"><?= _t('gen.menu.advanced_search') ?></a></p>
  59. </form>
  60. </span>
  61. </li>
  62. </ul>
  63. <a class="dropdown-close" href="#close">❌</a>
  64. </div>
  65. <div id="nav_menu_queries" class="dropdown">
  66. <div id="dropdown-query" class="dropdown-target"></div>
  67. <a id="toggle-userqueries" class="dropdown-toggle btn" href="#dropdown-query" title="<?= _t('index.menu.queries') ?>"><?= _i('bookmark-tag') ?></a>
  68. <ul class="dropdown-menu">
  69. <li class="dropdown-header">
  70. <?= _t('index.menu.queries') ?>
  71. <a href="<?= _url('configure', 'queries') ?>"><?= _i('configure') ?></a>
  72. </li>
  73. <?php foreach (FreshRSS_Context::userConf()->queries as $raw_query): ?>
  74. <li class="item query">
  75. <?php if (!empty($raw_query['url'])): ?>
  76. <a href="<?= $raw_query['url'] ?>"><?= $raw_query['name'] ?? $raw_query['url'] ?></a>
  77. <?php else: ?>
  78. <?php $query = new FreshRSS_UserQuery($raw_query, FreshRSS_Context::categories(), FreshRSS_Context::labels()); ?>
  79. <a href="<?= $query->getUrl() ?>"><?= $query->getName() ?></a>
  80. <?php endif; ?>
  81. </li>
  82. <?php endforeach; ?>
  83. <?php
  84. $classSeparator = '';
  85. if (count(FreshRSS_Context::userConf()->queries) > 0) {
  86. $classSeparator = ' separator';
  87. }
  88. $url_query = Minz_Request::currentRequest();
  89. $url_query['c'] = 'configure';
  90. $url_query['a'] = 'bookmarkQuery';
  91. ?>
  92. <li class="item<?= $classSeparator ?>">
  93. <form method="POST">
  94. <input type="hidden" name="_csrf" value="<?= FreshRSS_Auth::csrfToken() ?>" />
  95. <button class="as-link" formaction="<?= Minz_Url::display($url_query) ?>" type="submit"><?= _i('bookmark-add') ?> <?= _t('index.menu.bookmark_query') ?></button>
  96. </form>
  97. </li>
  98. </ul>
  99. <a class="dropdown-close" href="#close">❌</a>
  100. </div>
  101. </div>
  102. <?php
  103. $get = FreshRSS_Context::currentGet();
  104. $string_mark = _t('index.menu.mark_all_read');
  105. $string_unmark = _t('index.menu.mark_selection_unread');
  106. if ($get[0] === 'f') {
  107. $string_mark = _t('index.menu.mark_feed_read');
  108. } elseif ($get[0] === 'c') {
  109. $string_mark = _t('index.menu.mark_cat_read');
  110. }
  111. $mark_read_url = [
  112. 'c' => 'entry',
  113. 'a' => 'read',
  114. 'params' => [
  115. 'get' => $get,
  116. 'nextGet' => FreshRSS_Context::$next_get,
  117. 'idMax' => FreshRSS_Context::$id_max,
  118. 'search' => FreshRSS_Context::$search->toString(),
  119. 'state' => FreshRSS_Context::$state,
  120. 'sort' => FreshRSS_Context::$sort,
  121. 'order' => FreshRSS_Context::$order,
  122. 'from' => Minz_Request::actionName(),
  123. ],
  124. ];
  125. $mark_unread_url = $mark_read_url;
  126. $mark_unread_url['params']['is_read'] = '0';
  127. $mark_unread_url['params']['nextGet'] = $get;
  128. ?>
  129. <div id="nav_menu_read_all" class="group stick">
  130. <form id="mark-read-menu" method="post">
  131. <?php $confirm = FreshRSS_Context::userConf()->reading_confirm ? 'confirm" disabled="disabled' : ''; ?>
  132. <button class="read_all btn <?= $confirm ?>"
  133. form="mark-read-menu"
  134. formaction="<?= Minz_Url::display($mark_read_url) ?>"
  135. type="submit"><?= _t('gen.action.mark_read') ?></button>
  136. <div id="nav_menu_read" class="dropdown">
  137. <input type="hidden" name="_csrf" value="<?= FreshRSS_Auth::csrfToken() ?>" />
  138. <div id="dropdown-read" class="dropdown-target"></div>
  139. <a class="dropdown-toggle btn" href="#dropdown-read"><?= _i('down') ?></a>
  140. <ul class="dropdown-menu">
  141. <li class="item">
  142. <button class="as-link <?= $confirm ?>"
  143. form="mark-read-menu"
  144. formaction="<?= Minz_Url::display($mark_read_url) ?>"
  145. type="submit"><?= $string_mark ?></button>
  146. </li>
  147. <?php
  148. $mark_read_enabled = in_array(FreshRSS_Context::$sort, ['id', 'date'], true);
  149. $today = @strtotime('today');
  150. $mark_before_today = $mark_read_url;
  151. $mark_before_one_week = $mark_read_url;
  152. switch (FreshRSS_Context::$sort) {
  153. case 'id':
  154. $mark_before_today['params']['idMax'] = $today . '000000';
  155. $mark_before_one_week['params']['idMax'] = ($today - 604800) . '000000';
  156. break;
  157. case 'date':
  158. $mark_before_today['params']['maxPubDate'] = $today;
  159. $mark_before_one_week['params']['maxPubDate'] = $today - 604800;
  160. break;
  161. }
  162. $mark_unread_enabled = FreshRSS_Context::isStateEnabled(FreshRSS_Entry::STATE_READ) ||
  163. (!FreshRSS_Context::isStateEnabled(FreshRSS_Entry::STATE_NOT_READ) && !FreshRSS_Context::isStateEnabled(FreshRSS_Entry::STATE_OR_NOT_READ));
  164. ?>
  165. <li class="item separator">
  166. <button class="as-link <?= $mark_read_enabled ? $confirm : '" disabled="disabled' ?>"
  167. form="mark-read-menu"
  168. formaction="<?= Minz_Url::display($mark_before_today) ?>"
  169. type="submit"><?= _t('index.menu.before_one_day') ?></button>
  170. </li>
  171. <li class="item">
  172. <button class="as-link <?= $mark_read_enabled ? $confirm : '" disabled="disabled' ?>"
  173. form="mark-read-menu"
  174. formaction="<?= Minz_Url::display($mark_before_one_week) ?>"
  175. type="submit"><?= _t('index.menu.before_one_week') ?></button>
  176. </li>
  177. <li class="item separator">
  178. <button class="as-link <?= $mark_unread_enabled ? $confirm : '" disabled="disabled' ?>"
  179. form="mark-read-menu"
  180. formaction="<?= Minz_Url::display($mark_unread_url) ?>"
  181. type="submit"><?= $string_unmark ?></button>
  182. </li>
  183. </ul>
  184. <a class="dropdown-close" href="#close">❌</a>
  185. </div>
  186. </form>
  187. </div>
  188. <?php } ?>
  189. <?php $url_output = Minz_Request::currentRequest(); ?>
  190. <div id="nav_menu_views" class="group">
  191. <?php
  192. $readingModes = FreshRSS_ReadingMode::getReadingModes();
  193. $readingModes = Minz_ExtensionManager::callHook(Minz_HookType::NavReadingModes, $readingModes);
  194. if (!is_iterable($readingModes)) {
  195. $readingModes = FreshRSS_ReadingMode::getReadingModes();
  196. }
  197. /** @var FreshRSS_ReadingMode $mode */
  198. foreach ($readingModes as $mode) {
  199. ?>
  200. <a class="<?= $mode->getId() ?> btn <?= $mode->isActive() ? 'active' : '' ?>" title="<?=
  201. $mode->getTitle() ?>" href="<?= Minz_Url::display($mode->getUrlParams()) ?>">
  202. <?= $mode->getName() ?>
  203. </a>
  204. <?php
  205. }
  206. ?>
  207. </div>
  208. <?php $nav_menu_hooks = Minz_ExtensionManager::callHookString(Minz_HookType::NavMenu); ?>
  209. <?php if ($nav_menu_hooks != '') { ?>
  210. <div id="nav_menu_hooks" class="group">
  211. <?= $nav_menu_hooks ?>
  212. </div>
  213. <?php } ?>
  214. <?php
  215. if (FreshRSS_Context::$order === 'ASC') {
  216. $icon = 'sort-up';
  217. $title = _t('index.menu.sort.asc');
  218. } else {
  219. $icon = 'sort-down';
  220. $title = _t('index.menu.sort.desc');
  221. }
  222. $url_order = Minz_Request::currentRequest();
  223. unset($url_order['params']['cid']);
  224. ?>
  225. <div id="nav_menu_sort" class="group">
  226. <div class="dropdown">
  227. <div id="dropdown-sort" class="dropdown-target"></div>
  228. <a id="toggle-order" class="dropdown-toggle btn" href="#dropdown-sort" title="<?= _t('index.menu.sort.primary') ?>"><?= _i($icon) ?></a>
  229. <ul class="dropdown-menu" role="radiogroup">
  230. <li class="item" role="radio" aria-checked="<?= FreshRSS_Context::$order === 'DESC' && FreshRSS_Context::$sort === 'id' ? 'true' : 'false' ?>">
  231. <a href="<?= Minz_Url::display($url_order, amend: ['params' => ['sort' => 'id', 'order' => 'DESC']]) ?>"><?= _t('index.menu.sort.id_desc') ?></a></li>
  232. <li class="item" role="radio" aria-checked="<?= FreshRSS_Context::$order === 'DESC' && FreshRSS_Context::$sort === 'date' ? 'true' : 'false' ?>">
  233. <a href="<?= Minz_Url::display($url_order, amend: ['params' => ['sort' => 'date', 'order' => 'DESC']]) ?>"><?= _t('index.menu.sort.date_desc') ?></a></li>
  234. <li class="item" role="radio" aria-checked="<?= FreshRSS_Context::$order === 'DESC' && FreshRSS_Context::$sort === 'lastUserModified' ? 'true' : 'false' ?>">
  235. <a href="<?= Minz_Url::display($url_order, amend: ['params' => ['sort' => 'lastUserModified', 'order' => 'DESC']]) ?>"><?= _t('index.menu.sort.user_modified_desc') ?></a></li>
  236. <li class="item" role="radio" aria-checked="<?= FreshRSS_Context::$order === 'DESC' && FreshRSS_Context::$sort === 'length' ? 'true' : 'false' ?>">
  237. <a href="<?= Minz_Url::display($url_order, amend: ['params' => ['sort' => 'length', 'order' => 'DESC']]) ?>"><?= _t('index.menu.sort.length_desc') ?></a></li>
  238. <li class="item" role="radio" aria-checked="<?= FreshRSS_Context::$order === 'DESC' && FreshRSS_Context::$sort === 'link' ? 'true' : 'false' ?>">
  239. <a href="<?= Minz_Url::display($url_order, amend: ['params' => ['sort' => 'link', 'order' => 'DESC']]) ?>"><?= _t('index.menu.sort.link_desc') ?></a></li>
  240. <li class="item" role="radio" aria-checked="<?= FreshRSS_Context::$order === 'DESC' && FreshRSS_Context::$sort === 'title' ? 'true' : 'false' ?>">
  241. <a href="<?= Minz_Url::display($url_order, amend: ['params' => ['sort' => 'title', 'order' => 'DESC']]) ?>"><?= _t('index.menu.sort.title_desc') ?></a></li>
  242. <li class="item" role="radio" aria-checked="<?= FreshRSS_Context::$order === 'DESC' && FreshRSS_Context::$sort === 'f.name' ? 'true' : 'false' ?>">
  243. <a href="<?= Minz_Url::display($url_order, amend: ['params' => ['sort' => 'f.name', 'order' => 'DESC']]) ?>"><?= _t('index.menu.sort.f.name_desc') ?></a></li>
  244. <li class="item" role="radio" aria-checked="<?= FreshRSS_Context::$order === 'DESC' && FreshRSS_Context::$sort === 'c.name' ? 'true' : 'false' ?>">
  245. <a href="<?= Minz_Url::display($url_order, amend: ['params' => ['sort' => 'c.name', 'order' => 'DESC']]) ?>"><?= _t('index.menu.sort.c.name_desc') ?></a></li>
  246. <li class="item separator" role="radio" aria-checked="<?= FreshRSS_Context::$sort === 'rand' ? 'true' : 'false' ?>">
  247. <a href="<?= Minz_Url::display($url_order, amend: ['params' => ['sort' => 'rand', 'order' => null]]) ?>"><?= _t('index.menu.sort.rand') ?></a></li>
  248. <li class="item separator" role="radio" aria-checked="<?= FreshRSS_Context::$order === 'ASC' && FreshRSS_Context::$sort === 'id' ? 'true' : 'false' ?>">
  249. <a href="<?= Minz_Url::display($url_order, amend: ['params' => ['sort' => 'id', 'order' => 'ASC']]) ?>"><?= _t('index.menu.sort.id_asc') ?></a></li>
  250. <li class="item" role="radio" aria-checked="<?= FreshRSS_Context::$order === 'ASC' && FreshRSS_Context::$sort === 'date' ? 'true' : 'false' ?>">
  251. <a href="<?= Minz_Url::display($url_order, amend: ['params' => ['sort' => 'date', 'order' => 'ASC']]) ?>"><?= _t('index.menu.sort.date_asc') ?></a></li>
  252. <li class="item" role="radio" aria-checked="<?= FreshRSS_Context::$order === 'ASC' && FreshRSS_Context::$sort === 'lastUserModified' ? 'true' : 'false' ?>">
  253. <a href="<?= Minz_Url::display($url_order, amend: ['params' => ['sort' => 'lastUserModified', 'order' => 'ASC']]) ?>"><?= _t('index.menu.sort.user_modified_asc') ?></a></li>
  254. <li class="item" role="radio" aria-checked="<?= FreshRSS_Context::$order === 'ASC' && FreshRSS_Context::$sort === 'length' ? 'true' : 'false' ?>">
  255. <a href="<?= Minz_Url::display($url_order, amend: ['params' => ['sort' => 'length', 'order' => 'ASC']]) ?>"><?= _t('index.menu.sort.length_asc') ?></a></li>
  256. <li class="item" role="radio" aria-checked="<?= FreshRSS_Context::$order === 'ASC' && FreshRSS_Context::$sort === 'link' ? 'true' : 'false' ?>">
  257. <a href="<?= Minz_Url::display($url_order, amend: ['params' => ['sort' => 'link', 'order' => 'ASC']]) ?>"><?= _t('index.menu.sort.link_asc') ?></a></li>
  258. <li class="item" role="radio" aria-checked="<?= FreshRSS_Context::$order === 'ASC' && FreshRSS_Context::$sort === 'title' ? 'true' : 'false' ?>">
  259. <a href="<?= Minz_Url::display($url_order, amend: ['params' => ['sort' => 'title', 'order' => 'ASC']]) ?>"><?= _t('index.menu.sort.title_asc') ?></a></li>
  260. <li class="item" role="radio" aria-checked="<?= FreshRSS_Context::$order === 'ASC' && FreshRSS_Context::$sort === 'f.name' ? 'true' : 'false' ?>">
  261. <a href="<?= Minz_Url::display($url_order, amend: ['params' => ['sort' => 'f.name', 'order' => 'ASC']]) ?>"><?= _t('index.menu.sort.f.name_asc') ?></a></li>
  262. <li class="item" role="radio" aria-checked="<?= FreshRSS_Context::$order === 'ASC' && FreshRSS_Context::$sort === 'c.name' ? 'true' : 'false' ?>">
  263. <a href="<?= Minz_Url::display($url_order, amend: ['params' => ['sort' => 'c.name', 'order' => 'ASC']]) ?>"><?= _t('index.menu.sort.c.name_asc') ?></a></li>
  264. </ul>
  265. <a class="dropdown-close" href="#close">❌</a>
  266. </div>
  267. </div>
  268. <?php if (FreshRSS_Auth::hasAccess() || FreshRSS_Context::systemConf()->allow_anonymous_refresh) { ?>
  269. <div id="nav_menu_actualize" class="group">
  270. <a id="actualize" class="btn" href="<?= _url('feed', 'actualize') ?>" title="<?= _t('gen.action.actualize') ?>"><?= _i('refresh') ?></a>
  271. </div>
  272. <?php } ?>
  273. </nav>
  274. <?php flush(); ?>