aboutsummaryrefslogtreecommitdiff
path: root/app/layout/header.phtml
AgeCommit message (Collapse)Author
2026-01-03Fix unwanted expansion of user queries in some cases (#8395)Gravatar Alexandre Alapetite
fix https://github.com/FreshRSS/FreshRSS/issues/8378
2025-12-11Fix htmlspecialchars for search (#8306)Gravatar Alexandre Alapetite
Regression from https://github.com/FreshRSS/FreshRSS/pull/8293
2025-12-10Add functions to modify a search expression (#8293)Gravatar Alexandre Alapetite
* Allows easier modifications of the search expression. * Add proper `__toString()` instead of just returning the raw input string. Allows in particular showing the result of the actual parsing of the raw input string in the UI. Needed for https://github.com/FreshRSS/FreshRSS/pull/8294
2025-11-17Show search query in the page title (#8217)Gravatar Inverle
* Show search query in the page title * Simplify encoding --------- Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
2025-09-30Add hook enums (#8036)Gravatar Alexis Degrugillier
- add an enum to handle hook types (enum are available since PHP 8.1) - change hook calls from string value to enum value
2025-04-05Use HTTP POST for logout (#7489)Gravatar Alexandre Alapetite
* Use HTTP POST for logout To avoid potential CSRF risks * Fixed button font issue * Minor whitespace
2025-01-06Implement custom order-by (#7149)Gravatar Alexandre Alapetite
Add option to sort results by received date (existing, default), publication date, title, URL (link), random. fix https://github.com/FreshRSS/FreshRSS/issues/1771 fix https://github.com/FreshRSS/FreshRSS/issues/2083 fix https://github.com/FreshRSS/FreshRSS/issues/2119 fix https://github.com/FreshRSS/FreshRSS/issues/2596 fix https://github.com/FreshRSS/FreshRSS/issues/3204 fix https://github.com/FreshRSS/FreshRSS/issues/4405 fix https://github.com/FreshRSS/FreshRSS/issues/5529 fix https://github.com/FreshRSS/FreshRSS/issues/5864 fix https://github.com/FreshRSS/Extensions/issues/161 URL parameters: * `&sort=id` (current behaviour, sorting according to newest received articles) * `&sort=date` (publication date, which is not indicative of how new an article is) * `&sort=title` * `&sort=link` * `&sort=rand` (random order - which disables infinite scrolling, at least for now) combined with `&order=ASC` or `&order=DESC` ![image](https://github.com/user-attachments/assets/2de5aef1-604e-4a73-a147-569f6f42a1be) ## Implementation notes The sorting criteria by *received date* (id), which is the default, and which was the only one before this PR, is the one that has the best sorting characteristics: * *uniqueness*: no entries have the exact same received date * *monotonicity*: new entries always have a higher received date * *performance*: this field is efficiently indexed in database for fast usage, including for paging (indexing could also be done to other fields, but with lower effective performance) In contrary, sorting criteria such as by *publication date*, by *title*, or by *link* are neither unique nor monotonic. In particular, multiple articles may share the same *publication date*, and we may receive articles with a *publication date* far in the future, and then later some new articles with a *publication date* far in the past. To understand why sorting by *publication date* is problematic, it helps to think about sorting by *title* or by *link*, as sorting by *title* and by *publication date* share more or less the same characteristics. ### Problem 1: new articles New articles may be received in the background after what is shown on screen, and before the next user action such as *mark all as read*. Due to the lack of *monotonicity* when sorting by e.g. *publication date* or *title*, users risk marking as read a batch of articles containing some fresh articles without seeing them. Mitigation: A parameter `idMax` tracks the maximum ID related to a batch of actions such as *mark all as read* to exclude articles received after those that are displayed. ### Problem 2: paging / pagination When navigating articles, only a few articles are displayed, and a new "page" of articles needs to be received from the database when scrolling down or when clicking the button to show more articles. When sorting by e.g. *publication date* or *title*, it is not trivial to show the next page without re-showing some of the same articles, and without skipping any. Indeed, views are often with additional criteria such as showing only unread articles, and users may mark some articles as read while viewing them, hereby removing some articles from the previous pages. And like for *Problem 1*, new articles may have been received in the background. Consequently, it is not possible to use `OFFSET` to implement pagination (so the patches suggested by a few users were wrong due to that, in particular). Mitigation: `idMax` is also used (just like for *Problem 1*) and a *Keyset Pagination* approach is used, combining an unstable sorting criterion such as *publication date* or *title*, together with *id* to ensure stable sorting. (So, 2 sorting criteria + 1 filter criteria) See e.g. https://www.alwaysdeveloping.net/dailydrop/2022/07/01-keyset-pagination/ ### Problem 3: performance Sorting by anything else than *received date* (id) is doomed to be slow(er) due to the combination of 3 criteria (see *Problem 2*). An `OFFSET` approach (which is not possible anyway as explained) would be even slower. Furthermore, we have no SQL index at the moment, but they would not necessarily help much due to the multiple sorting criteria needed and involving some `OR` logic which is difficult to optimise for databases. The nicest syntax would be using tuples and corresponding indexes, but that is poorly supported by MySQL https://bugs.mysql.com/bug.php?id=104128 Mitigation: a compatibility SQL syntax is used to implement *Keyset Pagination* ### Problem 4: user confusion Several users have shown that they do not fully understand the difference between *received date* and *publication date*, and particularly not the pitfalls of *publication date*. Mitigation: the menus to mark-as-read *before 1 day* and *before 1 week* are disabled when sorting by anything else than *received date*. Likewise, the separation headers *Today* and *Yesterday* and *Before yesterday* are only shown when sorting by *received date*. Again here, to better understand why, it helps to think about sorting by *title* or by *link*, as sorting by *title* and by *publication date* share more or less the same characteristics. * [ ] We should write a Q&A and/or documentation about the problems associated to *sorting by publication date*: risks of not noticing new publication, of inadvertently marking them as read, of having some articles with a date in the future hanging at the top of the views (vice versa when sorting in ascending order), performance, etc. ### Problem 5: APIs Sorting by anything else than *received date* breaks the guarantees needed for a successful synchronisation via API. Mitigation: sorting by *received date* is ensured for all API calls.
2024-12-05Revert "Implement showing and hiding header depending on scroll (#7029)" (#7064)Gravatar Alexandre Alapetite
This reverts commit be9b6c7290dddcd8b8b6a8926bd101b7123528b3. https://github.com/FreshRSS/FreshRSS/pull/7029
2024-12-04Implement showing and hiding header depending on scroll (#7029)Gravatar Frans de Jonge
* Implement showing and hiding header depending on scroll References #7011. * header.phtml: adjust indentation * minor efficiency improvement * Update p/scripts/main.js Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr> --------- Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
2024-10-20Add privacy settings on extension list retrieval (#4603)Gravatar Alexis Degrugillier
* Add privacy settings on extension list retrieval There is a new privacy page to handle all configuration related to privacy. At the moment, only privacy related to extensions can be configured. The new settings allow to change the location of the extension list file and to choose if the selected file is cached for a day or retrieved for each request. Fix #4570 * Update code to pass PHPStan * make fix-all --------- Co-authored-by: maTh <math-home@web.de> Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
2024-04-25Fix: left side border of search bar input (#6376)Gravatar maTh
2024-02-26New feature: shareable user query (#6052)Gravatar Alexandre Alapetite
* New feature: shareable user query Share the output of a user query by RSS / HTML / OPML with other people through unique URLs. Replaces the global admin token, which was the only option (but unsafe) to share RSS outputs with other people. Also add a new HTML output for people without an RSS reader. fix https://github.com/FreshRSS/FreshRSS/issues/3066#issuecomment-648977890 fix https://github.com/FreshRSS/FreshRSS/issues/3178#issuecomment-769435504 * Remove unused method * Fix token saving * Implement HTML view * Update i18n for master token * Revert i18n get_favorite * Fix missing i18n for user queries from before this PR * Remove irrelevant tests * Add link to RSS version * Fix getGet * Fix getState * Fix getSearch * Alternative getSearch * Default getOrder * Explicit default state * Fix test * Add OPML sharing * Remove many redundant SQL queries from original implementation of user queries * Fix article tags * Use default user settings * Prepare public search * Fixes * Allow user search on article tags * Implement user search * Revert filter bug * Revert wrong SQL left outer join change * Implement checkboxes * Safe check of OPML * Fix label * Remove RSS button to favour new sharing method That sharing button was using a global admin token * First version of HTTP 304 * Disallow some recusrivity fix https://github.com/FreshRSS/FreshRSS/issues/6086 * Draft of nav * Minor httpConditional * Add support for offset for pagination * Fix offset pagination * Fix explicit order ASC * Add documentation * Help links i18n * Note about deprecated master token * Typo * Doc about format
2023-12-18Pass PHPStan level 8 (#5946)Gravatar Alexandre Alapetite
* Pass PHPStan level 8 And prepare for PHPStan level 9 https://phpstan.org/user-guide/rule-levels * Revert wrong replace in comment * Fix PHPStan level 8 * Update PHPStan and other dev dependencies * Remove obsolete comment * noVariableVariables and towards bleedingEdge https://github.com/phpstan/phpstan-strict-rules https://phpstan.org/blog/what-is-bleeding-edge * More bleedingEdge * A bit more PHPStan level 9 * More PHPStan level 9 * Prepare for booleansInConditions Ignore int and null * Revert wrong line * More fixes * Fix keep_max_n_unread * Stricter attribute functions * Stricter callHooks and more PHPStan level 9 * More typing * A tiny more
2023-11-16Use strict_types (#5830)Gravatar Luc SANCHEZ
* Little's optimisations and booleans in conditions * Apply strict type * Apply strict type * Apply strict type * Fix multiple bugs with PHP 8.2 and 8.3 * Many declares missing, more errors fixed * Apply strict type * Another approach * Stronger typing for Minz_Session * Fix case of SQLite --------- Co-authored-by: Luc <sanchezluc+freshrss@gmail.com> Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
2023-05-11A few additional PHPStan rules (#5388)Gravatar Alexandre Alapetite
A subset of https://github.com/phpstan/phpstan-strict-rules
2023-04-07Use typed access to request parameters (#5267)Gravatar Alexandre Alapetite
* Use typed access to request parameters This was a big source of mixed datatypes in many places * Fix notifications * Fix bookmarkAction
2023-03-26Modernize Constants and use new constant for string 'currentUser' (#5089)Gravatar Luc SANCHEZ
* Modernize Constants and use new constant 'currentUser' * Add FreshRSS_Context::currentUser() function and use * Add FreshRSS_Context::currentUser() function and use * Add FreshRSS_Context::currentUser() function and use * Add FreshRSS_Context::currentUser() function and use * Add FreshRSS_Context::currentUser() function and use * Update app/Controllers/userController.php * Update app/Controllers/userController.php * Update app/Controllers/userController.php * Update app/Models/Auth.php * Update p/api/greader.php * Update p/api/greader.php * Update p/api/greader.php * Update app/Models/Context.php * Update app/Models/LogDAO.php * Update lib/Minz/Log.php * Update p/api/greader.php * Update app/layout/header.phtml * Update app/views/helpers/export/articles.phtml * Update cli/do-install.php * Remarque's from Alkarex * Remarque's from Alkarex * Refactor using new Minz_User class * Consistent naming of public constants --------- Co-authored-by: Luc <sanchezluc+freshrss@gmail.com> Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
2023-03-21Improved: show Terms of Service in config menu (#5215)Gravatar maTh
* Use constants for path to TOS * improve comments * TOS title moved to template * TOS available via config menu * CSS: improve handling of content of TOS/about * give info about set/unset TOS in system config * fix target * i18n FR * i18n DE
2023-01-25Improved: expanding inputs (#5040)Gravatar maTh
* fix * wider input element
2023-01-09Lazy load logo on install, logo on header and theme thumbs in config slide ↵Gravatar Sadetdin EYILI
(#4998) * feat: lazy load logo on install, logo on header and theme thumbs in config slide
2023-01-02Keep view for search landing page (#4981)Gravatar maTh
2022-11-23Improved: config dropdown structure (#4891)Gravatar maTh
* phtml and frss.css * theme Origine * theme adark * theme Ansum * theme Mapco * theme BlueLagoon * theme dark * theme flat * theme nord * theme Screwdriver * theme swage * fix * fix * RTL * fix nord theme * fix SourceMap lines
2022-11-15Fix type hints regressions (#4855)Gravatar Alexandre Alapetite
Fix regressions from https://github.com/FreshRSS/FreshRSS/pull/4561 Example: ``` PHP Fatal error: Uncaught TypeError: Argument 1 passed to checkToken() must be an instance of FreshRSS_UserConfiguration, instance of Minz_Configuration given, called in /var/www/FreshRSS/p/api/greader.php on line 1091 and defined in /var/www/FreshRSS/p/api/greader.php:223 Stack trace: #0 /var/www/FreshRSS/p/api/greader.php(1091): checkToken() #1 {main} thrown in /var/www/FreshRSS/p/api/greader.php on line 223 ``` Improvement of https://github.com/FreshRSS/FreshRSS/pull/4110
2022-10-03Improved: Remove <li> as separator (#4597)Gravatar maTh
* templates * themes * fix * fix * fixes * fix
2022-08-29Update header.phtml (#4558)Gravatar maTh
2022-07-04Dynamic OPML (#4407)Gravatar Alexandre Alapetite
* Dynamic OPML draft #fix https://github.com/FreshRSS/FreshRSS/issues/4191 * Export dynamic OPML http://opml.org/spec2.opml#1629043127000 * Restart with simpler approach * Minor revert * Export dynamic OPML also for single feeds * Special category type for importing dynamic OPML * Parameter for excludeMutedFeeds * Details * More draft * i18n * Fix update * Draft manual import working * Working manual refresh * Draft automatic update * Working Web refresh + fixes * Import/export dynamic OPML settings * Annoying numerous lines in SQL logs * Fix minor JavaScript error * Fix auto adding new columns * Add require * Add missing 🗲 * Missing space * Disable adding new feeds to dynamic categories * Link from import * i18n typo * Improve theme icon function * Fix pink-dark
2022-06-11Safer htmlspecialchars_utf8 (#4411)Gravatar Alexandre Alapetite
* Safer htmlspecialchars_utf8 #fix https://github.com/FreshRSS/FreshRSS/issues/4410 * Undefined variable
2022-05-23Custom logo HTML (#4369)Gravatar Alexandre Alapetite
* Custom logo HTML Add option for custom HTML logo/title in the main Web UI view. Can potentially be different per user. #fix https://github.com/FreshRSS/FreshRSS/pull/3830/files#r850472247 * logo_html in main config With new `./data/config.custom.php` to provide custom values before install * Docker documentation * whitespace * Auto relax CSP to allow images for HTML logo * Documentation
2022-05-15User query automatic reconstruct of URL (#4360)Gravatar Alexandre Alapetite
* User query automatic reconstruct of URL (Invisible through the Web UI, only when working with configuration files manually) Avoid the requirement of storing user queries with duplicated information (parsed parameters AND the resulting URL): Before: ``` [ 'name' => 'Hello', 'search' => 'Hello OR World', 'state' => '3', 'url' => './?search=Hello+OR+World&amp;state=3', ] ``` After: ``` [ 'name' => 'Hello', 'search' => 'Hello OR World', 'state' => '3', ] ``` * Fix test
2022-04-11Improved: dropdown close area (#4293)Gravatar maTh
* fix Ansum theme: close X in white * fix Mapco theme: close X in white * move the dropdown-close outside of the list * CSS * bring flux elemt behind the grey background * Update main.js
2021-11-12Improve mobile view: access to the config menu (#3881)Gravatar maTh
* wip * improve the header * Fix theme "Adark" * fixed theme: Ansum * Fixed theme: BlueLagoon * fixed Ansum after PR comment of Frenzie * Fixed theme: Dark * fixed theme: Flat * fixed theme: Mapco * fixed theme: Origine compact * fixed theme: Pafat * fixed theme: Screwdriver * fixed theme: Swage * hide the close button in wide view * fixed base/template RTL * fixed SCSS of theme Swage * stylelint fix * fixed theme Swage * make fix-all Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
2021-10-14Improve conf menu (#3880)Gravatar maTh
* i18n: "account" added * reordered menu + add logout in the left nav menu * Update app/i18n/fr/gen.php Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
2021-09-12Menu: move stats into subscription management (#3803)Gravatar maTh
* add stats menu into subscription management menu * delete stats menu entry from dropdown menu * Delete aside_stats.phtml * Update aside_subscription.phtml
2021-09-11Headline structure improvement (#3830)Gravatar maTh
* header: h1 deleted - full logo included * template: config - display * WIP * shortcut configs. added fieldset. do not display the border by default * system.phtml * subscription: add feed or category * wip * wip * Update bookmarklet.phtml * Update archiving.phtml * Update queries.phtml * Update profile.phtml * Update manage.phtml * auth+update * Update template.rtl.css * fixed FreshRSS logo (Theme: Mapco) * Update mapco.rtl.css * Update _layout.scss * fixed FreshRSS logo (theme: Dark) * fix: FreshRSS logo (Theme: BlueLagoon) * fix: FreshRSS logo (Theme: Ansum) * fixed: FreshRSS logo (Theme: Alternative Dark) * fix: FreshRSS logo (Theme: Pafat) * fix: FreshRSS logo (Theme: Screwdriver) * fix: FreshRSS logo (theme: Swage) * Minor lint * little fix: FreshRSS logo (Theme: Origine) * Fix: FreshRSS logo (Theme: Origine Compact) Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
2021-07-21Add HTML5 tags (#3651)Gravatar maTh
* use HTML5 tags #3643 added some HTML5 tags: header, main, nav * <main> into <div> as dicussed in the PR. Todo: check side effects (f.e. threepaneview extension) * fixed whitespace with tabs * fixed more whitespaces with tabs it was not my fault, but I fixed it * added empty lines as wished * Update app/views/index/global.phtml Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr> * Update app/views/index/global.phtml * Update app/views/index/global.phtml * Update app/views/index/global.phtml * Update app/views/index/global.phtml * Update app/views/index/global.phtml * Update app/views/index/global.phtml Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr> Co-authored-by: Frans de Jonge <fransdejonge@gmail.com>
2019-11-08Rename sharing action (#2643)Gravatar Alexis Degrugillier
Before, some ad-blocker rules were preventing to display the sharing page because of its name. I've renamed that page to integration but kept every thing else identical. So it's still called sharing through out the application. If needed, this can be addressed as well. See #2509 and #2419
2019-10-23Take advantage of PHP 5.4+ short echo (#2585)Gravatar Alexandre Alapetite
* Take advantage of PHP 5.4+ short echo https://php.net/migration54.new-features thanks to https://github.com/FreshRSS/FreshRSS/pull/2495 Use `<?= ?>` instead of `<?php echo; ?>` 10kB of code saved :-) Done with regular expression: ``` <\?php echo (.+?);? *\?> <?= \1 ?> ``` * Try Travis fix https://github.com/squizlabs/PHP_CodeSniffer/issues/2045#issuecomment-395238272
2019-08-14Add hooks to ExtensionManager (#2482)Gravatar Marien Fressinaud
Hooks allow to: - add items in menus - perform new actions at the end of FreshRSS initialization
2019-01-17Accessibility: logo alt (#2219)Gravatar Alexandre Alapetite
https://github.com/FreshRSS/FreshRSS/issues/2209
2018-11-18Add username in configuration menu and exports (#2133)Gravatar Alexandre Alapetite
* Add username in configuration menu https://github.com/FreshRSS/FreshRSS/pull/2099#issuecomment-435944803 * Add username to exported files
2018-06-22Explicit quotes decoding (#1947)Gravatar Alexandre Alapetite
* Explicit quotes decoding * Explicit htmlspecialchars_decode and htmlspecialchars
2018-06-20Fix double encoding for mark as read a search (#1945)Gravatar Alexandre Alapetite
* Fix double encoding for mark as read a search Fix https://github.com/FreshRSS/FreshRSS/issues/1944 * Fix more search encoding issues
2017-02-23Add config option to disable and hide self-updateGravatar Dennis Schwerdel
2015-08-22Add a system configuration pageGravatar Alexis Degrugillier
It allows to modify system configuration from the interface. At the moment, only limits are modifiable. The user limit was removed from the user page and added here along with categories and feeds limits.
2015-01-21Minz: missing URL key/param encodingGravatar Alexandre Alapetite
Caused searches such as "intitle:&amp;" to fail after paging, and possible XSS vulnerabilities. Discovered during https://github.com/FreshRSS/FreshRSS/issues/754
2015-01-08Merge branch 'dev' into 252-extensionsGravatar Marien Fressinaud
Conflicts: app/FreshRSS.php app/Models/Configuration.php app/views/index/index.phtml app/views/index/normal.phtml lib/Minz/Configuration.php lib/Minz/Translate.php lib/lib_rss.php
2015-01-06Fix last calls to Minz_Configuration methodsGravatar Marien Fressinaud
- We have still to fix actualize_script and greader api (refactoring?) - We have to fix the FreshRSS_Configuration calls - We have to fix availableLanguages calls See https://github.com/FreshRSS/FreshRSS/issues/730
2015-01-06BREAKING FEATURE: Remove general in configGravatar Marien Fressinaud
General attribute has been removed from system config. Now subattributes (e.g. environment, salt, title, etc.) are directly accessible. YOU HAVE TO FIX YOUR ./data/config.php file! - Remove the general array - Values inside this array must be kept - To see what it must look like, please have a look to ./data/config.default.php (but keep your values!!). See https://github.com/FreshRSS/FreshRSS/issues/730
2015-01-05New configuration system (not working yet)Gravatar Marien Fressinaud
- Use only Minz_Configuration - register() method to load a new configuration file - get() to get a configuration - new exceptions related to configuration - fix a list configuration calls to have FRSS working Current problems to resolve: - How to handle configuration param verifications (i.e. check auth_type is a value from none, http_auth, persona or form) - We must use $conf = Minz_Configuration::get('system'); $general_conf = $conf->general; to access global system configuration which is quite annoying. How to change that? See https://github.com/FreshRSS/FreshRSS/issues/730
2014-12-17Merge branch 'dev' into 252-extensionsGravatar Marien Fressinaud
Conflicts: app/i18n/en/admin.php app/i18n/en/feedback.php app/i18n/en/gen.php app/i18n/fr/admin.php app/i18n/fr/feedback.php app/i18n/fr/gen.php app/views/index/normal.phtml