1169 Commits

Author SHA1 Message Date
polybjorn
43b10f1d70 fix(themes): use has-date class for date-aware list layout (#8811)
Replace four :has(~.date) selectors with a has-date modifier class
on .flux_header, mirroring the existing has-thumbnail and has-summary
classes. The condition (whether the date is rendered) is known
server-side and can be exposed on the parent <ul> directly. Same
elements matched in modern browsers. The rules now also apply in
browsers without :has() support, fixing the date column overlapping
the title in SeaMonkey (#6776).

Co-authored-by: Bjørn A. Andersen <polybjorn@users.noreply.github.com>
2026-05-11 20:20:46 +02:00
polybjorn
408419f433 refactor(themes): drop redundant multiline class on title (#8810)
The multiline class on the title <a> existed only so the parent <li>
could detect it via :has(.multiline). The condition (thumbnail or
summary enabled) is already exposed on the parent <ul> by the
has-thumbnail and has-summary classes, so keying the rule on those
directly removes the indirection. Same elements matched in modern
browsers. The rule now also applies where :has() isn't supported,
relevant to #6776.

Co-authored-by: Bjørn A. Andersen <polybjorn@users.noreply.github.com>
2026-05-11 16:12:20 +02:00
polybjorn
b83c8b445e fix(themes): drop topline_website value from <li> class to avoid filter collision (#8800)
When topline_website is "icon", the <li> renders class="item website
icon". Bare .icon rules in Nord and Dark apply a filter that cascades
onto the favicon <img> inside, so article-list favicons render tinted
in icon-only mode. No theme CSS targets the unprefixed value; layout
modes are driven from the parent <ul> (.websiteicon, .websitename).

Co-authored-by: Bjørn A. Andersen <polybjorn@users.noreply.github.com>
2026-05-10 16:47:46 +02:00
Alexandre Alapetite
cb04c6cfaa More feed info: last received date, publication date (#8799)
* More feed info: last received date, publication date
Follow-up of https://github.com/FreshRSS/FreshRSS/pull/8670

* Fix <br />

* Change i18n English
2026-05-10 16:47:24 +02:00
Umaid Shahid
52be56ada7 feat(admin): visually dim disabled users in user management table (#8768)
Closes #8765 

Changes proposed in this pull request:

- Add disabled-user CSS class to user rows in the management table when the account is disabled
- Add .disabled-user { opacity: 0.5; } style to base theme to visually dim disabled accounts
- Add entry to CREDITS.md

How to test the feature manually:

1. Go to Administration → User Management
2. Have at least one disabled user account in the list
3. Verify that disabled user rows appear dimmed (50% opacity) compared to active users, without any change in functionality
2026-05-03 14:18:26 +02:00
polybjorn
e416117591 Disable unread counter in tab title and favicon (refresh of #6590) (#8728)
Closes FreshRSS/FreshRSS#6522.

Refresh of FreshRSS/FreshRSS#6590 by @sgzmd, which has been stalled with merge
conflicts since 2024. All original commits are preserved as-is in the history
(authorship intact); this PR adds a merge with current `edge` plus minor fixes.

## Summary

Adds a user setting `show_title_unread` (default `true`, so existing behavior
is preserved) that hides the unread article counter from both the tab title
and the favicon overlay. A single toggle controls both, matching the request
in #6522.

## Screenshots

Toggle in display settings:

<img width="320" height="127" alt="Display settings with new toggle" src="https://github.com/user-attachments/assets/fc78f825-161d-4b47-9b85-08e39554a4b1" />

Tab title and favicon when **enabled** (current behavior):

<img width="253" height="42" alt="Tab title and favicon with unread counter" src="https://github.com/user-attachments/assets/57387600-72e0-4b22-b059-04b5bfea673a" />

Tab title and favicon when **disabled** (new behavior):

<img width="254" height="40" alt="Tab title and favicon without unread counter" src="https://github.com/user-attachments/assets/93ac7997-dd4e-49bc-ab4a-74e4f0d2db1b" />

## Changes on top of #6590

- Resolved merge conflicts with current `edge` (controllers, model, view,
  `config.default.php`, ~25 i18n files, plus the `zh-tw` -> `zh-TW` rename).
- Replaced Czech text mistakenly placed in `de/conf.php` with an English
  `// TODO` marker so a German speaker can translate later.
- Renamed JS context key `show_unread_favicon` -> `show_title_unread` to
  match the backend property and avoid a confusing dual-name for one setting.
- Removed an unused duplicate of `show_title_unread` from `config.default.php`
  (the setting is read via `userConf()`, never `systemConf()`).
- Gated the dynamic title rewrite in `incUnreadsFeed` (`p/scripts/main.js`)
  on the setting. Without this, marking an article read while the setting
  was off would re-add the `(N)` prefix to the tab title.
- Escaped a stray apostrophe in the Occitan translation that broke parsing.
- `make fix-all` re-sorted i18n keys and added `// TODO` placeholders for
  `fi`, `pt-PT`, `uk` (untranslated by the original PR).

## Test plan

- [x] `make test-all` passes (620/620 PHPUnit, phpstan, phpcs, eslint,
      stylelint, markdownlint clean; `bin/typos` failed locally with a binary
      arch mismatch on macOS arm64 - unrelated to this change).
- [x] Manually tested on a real instance: default behavior unchanged;
      toggling the setting hides both the tab title `(N) ` prefix and the
      favicon overlay; toggling back restores both; marking articles read
      while the setting is off does not bring the counter back; opening and
      closing an article preserves the user's choice.

* Make showing the number of unread items in the title configurable.

* Proposed approach to passing show_unread_favicon setting down to client-side code

* Fixes and refactoring

* Updating default config for the user.

When user's config wasn't initialised we are copying it from `config-user.default.php` - if `show_title_unread` is not there, it is assumed to be false, whereas in `config.default.php` it's true by default. This results in inconsistency until user changes the field for the first time in Config->Display.

* Adding translations.

* fix: gate JS title rewrite + drop dead system config entry

The original PR added show_title_unread to both config-user.default.php
(read by userConf, the right place) and config.default.php (read by
systemConf, never used here). Drop the system-level entry.

Also: incUnreadsFeed dynamically rewrites document.title when articles
are marked read/unread. That code path was not gated by the setting, so
toggling the setting off and then marking an article read would re-add
the (N) prefix to the tab title. Skip the document.title / prevTitle
write when context.show_title_unread is false.

* fix: drop README pollution from local make fix-all

`make fix-all` regenerated the README translation tables on macOS, where the
case-insensitive filesystem and an untracked local `app/i18n/nb/` directory
caused the generator to emit `zh-tw` (lowercase) and an `nb` entry. Reset
both README files to upstream/edge so CI can regenerate them cleanly.

* fix: restore zh-TW/conf.php from edge (case-insensitive FS damage)

The macOS case-insensitive filesystem caused the merge to overwrite
upstream/edge's properly-translated zh-TW/conf.php with the older
zh-tw/conf.php content from the PR side, regressing translation
coverage from 94% to 71%. Reset the file to edge's content and re-add
the show_title_unread Traditional Chinese translation.

---------

Co-authored-by: sgzmd <sigizmund@gmail.com>
Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
Co-authored-by: Bjørn A. Andersen <polybjorn@users.noreply.github.com>
2026-04-29 21:35:31 +02:00
Alexandre Alapetite
62b7dc37fe Allow extension configurations to use select-input-changer (#8721)
Useful for https://github.com/FreshRSS/Extensions/pull/456
2026-04-28 09:14:09 +02:00
polybjorn
244d916966 fix: do not report PRIORITY_HIDDEN feeds in nbUnreadsPerFeed (#8715)
The sidebar does not render DOM elements for PRIORITY_HIDDEN feeds
(aside_feed.phtml:114), but nbUnreadsPerFeed still reports their unread
counts. In refreshUnreads(), the per-feed tracked count for the missing
element stays at 0 while the server keeps reporting unreads > 0, which
triggers the "new articles available" banner every poll cycle on the
"All articles" view.

Filter hidden feeds from the response, matching the convention already
used in Category.php:42.

Fixes https://github.com/FreshRSS/FreshRSS/issues/8694

Co-authored-by: Bjørn A. Andersen <polybjorn@users.noreply.github.com>
2026-04-24 10:01:49 +02:00
pe1uca
6d76dfe822 Improve add feed (#8683)
* Reorder add feed and add category

Implements some suggestions made in https://github.com/FreshRSS/FreshRSS/issues/2014

Changes proposed in this pull request:

- Move "Add feed" as the first section of the Subscriptions add page.  
- Add checkbox "Keep adding feeds" to stay on the "add" page.  

How to test the feature manually:

1. Navigate to the page "Add a feed or category"  
2. See new order.  
3. Type URL of a new feed, select a category, and check "Keep adding feeds "  
4. See FreshRSS confirm the feed was added while staying in the same page.  

* Add checkbox to stay in the add feed page

* Update i18n

* PHP CS

* Manually set i18n progress

* Change i18n

---------

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
2026-04-16 08:23:43 +02:00
Christian Weiske
1acc646222 Show time since when a feed has problems + new timeago() method and i18n plurals (#8670)
Closes https://github.com/FreshRSS/FreshRSS/issues/8508

Changes proposed in this pull request:

- Use an integer for `Feed::error` everywhere (follow up to #8646)
- Extract `Entry::machineReadableDate()` into function for use in HTML templates
- Add `timeago()` function that converts a unix timestamp into a "4 weeks ago" string
- Show the last successful feed update, and the last erroneous update

How to test the feature manually:

1. Update a feed
2. Modify the feed URL in the database and set it to a non-existing URL
3. Update the feed again
4. Open the "Manage feed" and see the expanded error message:

>  Blast! This feed has encountered a problem. If this situation persists, please verify that it is still reachable.
> Last successful update 3 hours ago, last erroneous update 1 hour ago. 

You can hover the relative dates to see the timestamp.

* Make Feed::error an int everywhere

Related: https://github.com/FreshRSS/FreshRSS/pull/8646

* Extract timestamptomachinedate()

.. for later usage in the feed error time display.

* Show time since when a feed has problems

We add our own "timeago" function that converts a unix timestamp
into a "4 weeks ago" string.

Resolves: https://github.com/FreshRSS/FreshRSS/issues/8508

* Add new translation keys

* i18n fr, en-US

* Minor XHTML preference

* Slightly shorter rewrite, also hopefully easier to read

* Rewrite to allow (simple) plural
I also moved some functions around for hopefully a more generic and better structure.
I made some changes for the sake of speed (e.g. second-based logic instead of datetime intervals).
Note: I used automatic translation as I was worried it would be too complicated to explain to translators... I proofread the few languages I have some familiarity with.

* Add reference to CLDR

* Slightly more compact syntax

* Always show last update, fix case of unknown error date

* Remove forgotten span

* No need for multi-lines anymore

* Fix error date thresshold

* plurals forms

* Extract gettext formula conversion script to cli

* Simplify a bit

* Escort excess parentheses to the door

* Simplify

* Avoid being too clever in localization

* Fix German

* Fix plural TODO parsing

* Ignore en-US translation

* make fix-all

* git update-index --chmod=+x cli/compile.plurals.php

* Heredoc indent PHP 7.3+

* compileAll: Continue on error

* PHP strict comparisons

* Light logical simplification

* Cache plural_message_families

* Avoid case of empty value

* A bit of documentation

---------

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
Co-authored-by: Frans de Jonge <frans@clevercast.com>
Co-authored-by: Frans de Jonge <fransdejonge@gmail.com>
2026-04-07 22:56:02 +02:00
Inverle
cc64991c16 Implement setting for iframe referrer allowlist (#8672)
* Implement setting for iframe referrer allowlist

* Improve config label
2026-04-07 18:29:27 +02:00
pe1uca
c44cd2b08f Category autoread by guid (#8673)
* Add configuration to mark same GUID as read in category.

Implement suggestion mentioned in #8641

Changes proposed in this pull request:

- Add a configuration to the categories to automatically mark entries as read if the same GUID is present in recent entries.  

How to test the feature manually:

1. Create a category. Check the option "Mark an article as read… if an identical GUID already exists [...]"  
2. Enable debug logs, or add an extension which registers to the hook `Minz_HookType::EntryAutoRead`.  
3. Add feeds which might have the same GUID.  
  For example: https://www.reddit.com/r/technology/hot.rss, https://www.reddit.com/r/technology/rising.rss, https://www.reddit.com/r/technology/best.rss, and https://www.reddit.com/r/technology/new.rss
4. See the logs "Mark GUID as read[...]", or the effect of the extension.  

* Implement behavior to mark same GUID as read in category.

* Update documentation

* Update i18n

* Fix PHP CS report

* Fix missing argument

* Fixes

---------

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
2026-04-05 19:41:37 +02:00
Matheus Roberson
cf5cfeff58 Add a form to create new user queries on the User Queries page (#8623)
* Add form to create user queries
Closes https://github.com/FreshRSS/FreshRSS/issues/6361

Changes proposed in this pull request:

- Add a form to create new user queries on the User Queries page
- Fix the controller to properly handle request data

How to test the feature manually:

1. Open FreshRSS
2. Open Settings
3. Click User queries
4. Create new user query 

* Add tranlation key for title in create new user query
* Fix 'for' conflict with aside in labels
* Fix input widths

* i18n: fr

* make fix-all

* Fix conditions in configureController

* Remove token condition

* Fix ctype_digits condition

* Fix errors

* Fix phpStan error

* Fix syntax and state for checkboxes

* Add new way to create user queries in docs

* Compress image more

---------

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
2026-04-03 22:29:44 +02:00
Michael
61f3151f7f Convert feed view into grid where appropriate (#8631)
* Convert feed view into grid where appropriate
This makes the feed view prettier on mobile, if thumbnails and summary are shown, as discussed in https://github.com/FreshRSS/FreshRSS/discussions/8629

**Changes proposed in this pull request:**

- Converts Feed Item list into multiple lines
- But only if both thumbnails and summaries are shown

The code is quite different from what I had done in my own hack: There I had used `display: flex` and then counted items, but that only works for my own hack: here we don't know how many items a given user may have, so we use `display:grid` instead with name grid areas.

**How to test the feature manually:**

1. Ensure you enable both thumbnails and summaries
2. Check out the feed view on mobile
3. Play around with enabling and disabling bookmarks, share button, etc.

**Pull request checklist:**

- [x] clear commit messages
- [x] code manually tested
- [ ] unit tests written (optional if too hard)
- [ ] documentation updated

**Screenshots:**

<img width="458" height="1173" alt="SCR-20260324-jnte" src="https://github.com/user-attachments/assets/1d5c1615-961a-4953-8157-f9f8a5470545" />
<img width="459" height="1172" alt="SCR-20260324-jnwf" src="https://github.com/user-attachments/assets/96ffcea3-384f-4de9-9c50-3366022713d8" />


* remove gap

* fix lint errors

* fix style errors

* remove whitespaces

* Reduce use of slow `:has()` CSS selector

---------

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
2026-03-31 09:53:09 +02:00
Inverle
ebaac787e0 Fix wrong error redirect in subscription management (#8625)
Was supposed to show feeds with errors on redirect, only if they were being shown before, not when you modify a feed with an error.
2026-03-23 11:29:57 +01:00
Inverle
815b97017b Improve consistency of slider behavior after submitting form (#8612)
Closes https://github.com/FreshRSS/FreshRSS/issues/8529

* Preserve `error` parameter after submitting form in subscription management
2026-03-18 00:10:53 +01:00
Alexandre Alapetite
a7dfd3c34b Fix loading spin regression when no article (#8588)
Fix https://github.com/FreshRSS/FreshRSS/issues/8586
Regression from https://github.com/FreshRSS/FreshRSS/pull/8577
2026-03-12 13:27:12 +01:00
Inverle
a4bcdf1a80 Create dynamic favicons from SVG instead of PNG canvas (#8577) 2026-03-08 10:46:38 +01:00
Inverle
4a2c93c9e7 Fix redirect to wrong view after mark as read (#8552)
fix https://github.com/FreshRSS/FreshRSS/issues/6509
A wrong redirect (to normal view) happened in case of both the big mark as read button on the bottom and the navbar 
one, for reader and global views.
2026-03-02 21:45:38 +01:00
rid3r45
3e4d5bb041 Add option to hide sidebar by default (#8515) (#8528)
* Add option to hide sidebar by default (#8515)

Closes https://github.com/FreshRSS/FreshRSS/issues/8515

Changes proposed in this pull request:

- Add `sidebar_hidden_by_default` user preference (default: `false`)
- Add a checkbox in the Display settings page to toggle this preference
- Hide the sidebar on page load in `normal` and `reader` views when the preference is enabled and no session state exists
- Add English translation key; mark all other languages as `TODO` for translators

How to test the feature manually:

1. Go to Settings → Display, tick "Hide sidebar by default", save
2. Go back to the main view (normal or reader): the sidebar should be hidden on load
3. Toggle the sidebar manually — it should open/stay open for the rest of the session
4. Open a new tab: the sidebar should be hidden again
5. Go to Settings → Display, untick the option, save: the sidebar should now be visible on load as usual
6. Check that the sidebar is always visible on Settings pages regardless of the preference

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: PR comment

* Update app/i18n/pl/conf.php

* i18n: fr

* make fix-all

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Inverle <inverle@proton.me>
Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
2026-03-02 13:32:10 +01:00
Christian Weiske
560b772e43 Re-add database status in installation check (#8510)
* Re-add database status in installation check

It got disabled in 2014 to get a beta out.
Time to re-enable it.

Tested on SQLite.

"checkTable" now only verifies that at least the expected columns
exist, but does not fail on additional columns provided by
e.g. extensions.

Related: https://github.com/FreshRSS/FreshRSS/issues/678

* make fix-all

* i18n

* Simpler and more correct content_bin

* Fix PostgreSQL

---------

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
2026-03-02 12:43:35 +01:00
Alexandre Alapetite
cf631b6f87 Implement filter on last modified date by server (#8131)
* Implement filter on last modified date by server
Especially relevant for API, to get the modified changes: the API will now return the articles that are new or which content has been modified since `ot`:

fix https://github.com/FreshRSS/FreshRSS/issues/7304
fix https://github.com/FreshRSS/FreshRSS/issues/2566
https://github.com/jocmp/capyreader/discussions/533#discussioncomment-11341808

New corresponding search operator `mdate:` and new UI:

<img width="650" height="627" alt="image" src="https://github.com/user-attachments/assets/8ba02937-abc7-44bf-b718-cf269cc37caf" />

* Migration from existing id column

* Fix auto-update

* Index after update for performance

* Minor comment

* Minor whitespace

* Fix regex

* Minor .gitignore

* Changelog and warning

* Update app/i18n/pl/gen.php

Co-authored-by: Inverle <inverle@proton.me>

* make fix-all

* Optimise SQL auto-update
For speed and resilience

* Minor SQLite change of sequence

* Changelog

* Speed optimisation: No DEFAULT 0

* Better migration

* Revert small bug

* Prepare filtering on multiple dates for API

* make fix-all

* Update tests

* Remaining manual merge

* Update versions

* Remove warnings no longer relevant in changelog

* Implement in API, and COALESCE

* No lastModified when adding new article

* Rework logic

* Sort IS NOT NULL

* Remove forgotten lastModified

---------

Co-authored-by: Inverle <inverle@proton.me>
2026-03-01 21:43:03 +01:00
Inverle
b98aa6b00c Improve pagination styling in logs page (#8541)
Before:

<img width="819" height="82" alt="2026-03-01_13-47" src="https://github.com/user-attachments/assets/96262bd2-25de-42b2-a19a-275b81f300cb" />

After:

<img width="842" height="77" alt="2026-03-01_13-48" src="https://github.com/user-attachments/assets/895f2db8-74ef-4aa6-ade4-b8b0794fc287" />

---


* Made button text actually centered
* Removed italic font
* Added `overflow-x: auto` so page doesn't overflow if there's too many pagination buttons displayed on a small screen
2026-03-01 21:08:41 +01:00
Alexandre Alapetite
eedefbd9fe Non-strict OPML export
fix https://github.com/FreshRSS/FreshRSS/issues/8520
2026-02-22 14:24:59 +01:00
Alexandre Alapetite
f17ed2f7c8 Add feed visibility filter to unread dates view (#8489)
* Add feed visibility filter to unread dates view

* Date field sanitize
2026-02-08 20:42:58 +01:00
PeterVavercak
ee7eb67f3c Implement sort order per feed (#8234)
* added local feed sorting

Addresses https://github.com/FreshRSS/FreshRSS/issues/4761

- Added number of sorted feeds and associative array for feed sorting option in Context.
- Number of sorted feeds and local sorting option by its index saved into Minz Request Parameters.
- Number of sorted feeds and local sorting options deleted when choosing another Option Of Global Sorting.
- Added option of allowing sorting by feed in configuration.
- Added variable for allowing local sorting in userConf.
- Added function to get feeds by current get in context.
- Added menu button for all individual feed sorting.
- New database options for individual feed sorting in EntryDAO.
- Considered choosing new entries based on chosen load limit.
- Local sorting parameter saved into continuation value in Index Controller.

How to test the feature manually:

1. At the bottom of Reading Configuration menu turn on individual sorting option menu 
2. Choose Sorting by feed option
3. Choose feed at next sorting menu and choose sorting option for that feed

* added feed sorting option

* added sort feeds display

* added template for sort feed name

* added title to feed sorting button

* added comments

* added local sorting option

* Added Docs

* css reset

* added getter and seter for local sort

* added getter and seter for local sort

* allowed sorting per feed

* allowed sorting per feed

* added sorting option for category

* deleted changes from NetryDAO

* add setting up sorting for category

* docs reset

* i18 reset

* updated i18 for category

* added i18 for categories

* added i18 for category

* added setting sorting for feeds and category

* removing userConf.allow-local-sort

* removing userConf.allow-local-sort

* removing white space

* added credits

* removed feeds_by_get

* removed whitespace

* changed escaping for values

* added escaping to user set values

* added in_array

* added secondary sort and order

* added secondary sort and order

* fixed readme

* removed whitespace change

* reseted i18n

* added translations

* added feed setting translations

* fixed i18n

* fixed i18n

* changes in sort order per feed

* changes in sort order per feed

* added secondary sort order

* primary sort

* changed to preferred sort order

* i18n

* Revert wrong whitespace changes

* Re-order new options

* added blank option

* fixed escaping

* fixed default sort in feed

* fixed default sort recovery

* siplyfied option

* added rand option

* Revert unrelated change

* Minor plaintext

* Whitespace and formatting fixes

* Avoid unneeded SQL requests and processing

* Improve syntax

* Improve logic

* Reuse existing translations as much as possible

* i18n

* Remove some options that make little sense

* Separators

* Fix old transation key

* Add help messages

* Progress on secondary sort

* raw name

* Pass parameters. Add TODO

* Progress

* Minor ordering

* Fix parenthesis

---------

Co-authored-by: root <root@LAPTOP-C8TCHHPN.localdomain>
Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
2026-02-01 13:12:47 +01:00
rupak
b59a2101b4 Add option to enable notifications (#8458)
Closes https://github.com/FreshRSS/FreshRSS/issues/7330

- Default behavior is same
- Added FreshRSS_Context::userConf()->html5_disable_notif so that, it determines weather user wants notification. (will not show any even it has permission) (i want default false so disable, so old configs get proper default values)
- Added button such that checking it makes it request permission too 
<img width="707" height="119" alt="image" src="https://github.com/user-attachments/assets/a0fdbc4d-9f15-4644-8753-f0e6c979677f" />

- test notification actually happening (how can i trigger it, do i have to wait it), this code fixes permissions.
2026-01-29 21:34:35 +01:00
rupak
85f14f92fd Message for closed registration (#8462)
* Add closed msg field

i18n

fix

* Display based on registration type

* Save as FreshRSS_Context::systemConf()->closed_registration_message instead

* Improve messages

* Revert unrelated changes

* make fix-all

* Minor whitespace

* Simplify logic

* Fix invalid use of empty() and sympler syntax

---------

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
2026-01-24 15:31:43 +01:00
Tsung-Han Yu
84604e0c64 fix validator url update (#8436)
Closes https://github.com/FreshRSS/FreshRSS/issues/8435

Changes proposed in this pull request:
- update validator links to use the same open-url handler with prefix + encoding
- ensure the validator link reflects the current #url field value before opening
- keep existing open-url behavior for other links unchanged

How to test the feature manually:
1. Open feed edit (or add feed) form.
2. Change the feed URL in the URL field.
3. Click “Check the validity of the feed” and verify it opens the validator with the updated URL.
2026-01-20 20:00:39 +01:00
Rob Loach
a5bbd679d9 Fix space between 'By:' and the author name (#8422)
* Fix space between 'By:' and the author name

* Use a different approach than sprintf()

* Revert "Use a different approach than sprintf()"

This reverts commit 3ede55f000.

* Apply a space between By: and the author name

* Apply suggestion from @Alkarex

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>

---------

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
2026-01-10 20:50:35 +01:00
Inverle
4739bcc62e Allow styling entries by category in User CSS (#8397)
* Allow styling entries by category in User CSS

Since we have `data-feed`, it is useful to have `data-category` too.

Example of usage to hide titles in all entries that belong to a specific category ID:
```css
[data-category="6"] {
	.title { display: none !important }
	.summary {
		position: relative;
		bottom: 2rem;
	}
}
```

* Add `data-link` to entries in `reader.phtml`
2026-01-04 12:03:59 +01:00
Alexandre Alapetite
2527033057 Fix unwanted expansion of user queries in some cases (#8395)
fix https://github.com/FreshRSS/FreshRSS/issues/8378
2026-01-03 16:52:33 +01:00
Alexandre Alapetite
1a3912f25a Improve configuration checks (#8334)
Add a distinction between recommended and required extensions.
Add check for recommended php-intl extension as follow-up of https://github.com/FreshRSS/FreshRSS/pull/8329#issuecomment-3677686581
Improve related checks such as ZIP.
Reduce duplicated translations and tests.
2025-12-21 19:26:08 +01:00
stag
43a8e1e2d9 Allow negative category sort numbers (#8330)
Closes https://github.com/FreshRSS/FreshRSS/issues/8304
Remove the min=1 attribute so negative numbers can be used to force categories to the bottom
2025-12-17 23:46:03 +01:00
Alexandre Alapetite
4bd5035914 Rework encoding of search filters (#8324)
Rework:
* https://github.com/FreshRSS/FreshRSS/pull/8222

now that we have:
* https://github.com/FreshRSS/FreshRSS/pull/8293

Follow-up of:
* https://github.com/FreshRSS/FreshRSS/pull/8311

* More simplification

* Deprecate getRawInput
2025-12-17 10:07:52 +01:00
Alexandre Alapetite
4b6127ee04 New links in transitions and jump to next transition (#8294)
Easier to explain graphically:

<img width="408" height="266" alt="image" src="https://github.com/user-attachments/assets/0e3724a1-155b-4a87-89b3-cfe8a18cb100" />

The jump to next section ⏭ works when the sorting criterion is a date.

Need https://github.com/FreshRSS/FreshRSS/pull/8293
2025-12-13 11:38:33 +01:00
Inverle
fd9e2843f1 Minor refactor <img class="icon"> -> _i('...') (#8297) 2025-12-08 20:32:28 +01:00
Inverle
9fb3a02b96 Keep scroll state of page when closing the slider (#8295) 2025-12-08 00:29:43 +01:00
Inverle
6d2bb24b37 Move unsafe autologin to an extension (#7958)
Completes the following TODO https://github.com/FreshRSS/FreshRSS/issues/7923:

de624dc8ce/app/Controllers/authController.php (L105)

Extension PR: https://github.com/FreshRSS/Extensions/pull/364

https://github.com/FreshRSS/Extensions/tree/main/xExtension-UnsafeAutologin
2025-12-04 20:10:20 +01:00
Alexandre Alapetite
78e40c6fe3 Scaling of user statistics (#8277)
Fix https://github.com/FreshRSS/FreshRSS/issues/8268
To better support user management on FreshRSS instance with many users.

SQL speed improved. On a reduced test with 5 users, including some large accounts (PostgreSQL on a very tiny and slow server), improving from ~2.3s to ~1.8s, which gives ~20% speed improvement.

Then tested with 1000 users, with only the default feed (on my old desktop computer):

```sh
for i in {1..1000}; do ./cli/create-user.php --user=freshrss$i --password=freshrss; done
app/actualize_script.php
cli/access-permissions.sh
```

SQLite:

```console
$ time cli/user-info.php | wc -l
1001

real    0m1.366s
user    0m0.908s
sys     0m0.475s
```

PostgreSQL:

```console
$ time cli/user-info.php | wc -l
1001

real    0m28.498s
user    0m12.137s
sys     0m2.217s
```

MariaDB:

```console
# time ./cli/user-info.php | wc -l
1001

real    0m49.485s
user    0m1.276s
sys     0m2.258s
```

Yes, SQLite is much faster - not a surprise for such use-cases, where the TCP connection is not re-used.

I have added some CLI options to disable some statistics:

```sh
cli/user-info.php --no-db-size --no-db-counts
```

For the Web UI, I have disabled detailed user statistics if it takes too long, and retrieve missing user statistics asynchronously via JavaScript. Lazy loading of the user details based on IntersectionObserver, with maximum 10 requests in parallel.
Web UI tested on 1000 users as well. Checked with SeaMonkey.
2025-12-04 19:11:31 +01:00
Inverle
d55f017ccd Implement button for toggling sidebar on all views (#8201)
* Implement button for toggling sidebar on all views

Closes https://github.com/FreshRSS/FreshRSS/issues/7673, https://github.com/FreshRSS/FreshRSS/issues/7100, https://github.com/FreshRSS/FreshRSS/issues/6119, https://github.com/FreshRSS/FreshRSS/issues/5338, https://github.com/FreshRSS/FreshRSS/issues/2792, https://github.com/FreshRSS/FreshRSS/issues/4224, https://github.com/FreshRSS/FreshRSS/issues/4136

https://github.com/user-attachments/assets/0629e465-6450-440e-b38b-430e9ff73ef9

Keyboard shortcut for doing the same: <kbd>t</kbd>

* Partially fix other views

Repartition page looks broken on Swage

* Correction

`close-aside` wasn't meant to be removed

* i18n(conf): fr

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>

* make fix-all

* Fix settings slider not opening in reader view

* make readme

---------

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
2025-12-04 08:48:03 +01:00
Alexandre Alapetite
06d34f9b8e OPML export/import of unicity criteria (#8243)
Found during https://github.com/FreshRSS/FreshRSS/discussions/8242#discussioncomment-15052838
2025-11-24 22:01:46 +01:00
András Marczinkó
14b394c72a Fix duplicate semicolon in entry_header (#8203)
* Fix duplicate semicolon in entry_header

* Fix some more redundant syntax

Co-authored-by: Inverle <inverle@proton.me>

---------

Co-authored-by: Inverle <inverle@proton.me>
2025-11-11 22:55:18 +01:00
Alexandre Alapetite
a18c35046d Housekeeping lib_rss.php (#8193)
* Housekeeping lib_rss.php
`lib_rss.php` had become much too large, especially after https://github.com/FreshRSS/FreshRSS/pull/7924
Moved most functions to other places.
Mostly no change of code otherwise (see comments).

* Extension: composer run-script phpstan-third-party
2025-11-11 08:17:12 +01:00
maTh
e3fedceeb9 less margin - wrapper div deleted (#8196)
Follow up https://github.com/FreshRSS/FreshRSS/pull/8190 and https://github.com/FreshRSS/FreshRSS/pull/8152

before:
<img width="1090" height="449" alt="grafik" src="https://github.com/user-attachments/assets/ee6a54a2-3602-4f2c-8eb2-cb186287e245" />


After:
<img width="907" height="452" alt="grafik" src="https://github.com/user-attachments/assets/3a3066e5-90e1-4b65-a1c4-18964494f644" />
2025-11-08 22:53:28 +01:00
Inverle
8cb2158a39 Replace arrow navigation in theme switcher with <select> (#8190)
Follow-up (or replacement) of https://github.com/FreshRSS/FreshRSS/pull/8167

![gif](https://github.com/user-attachments/assets/96cdeaff-36bc-4d0b-9b75-97bd7ff78ba1)
2025-11-06 20:45:44 +01:00
Alexandre Alapetite
b6c63d2239 Better transitions between groups of articles (#8174)
fix https://github.com/FreshRSS/FreshRSS/issues/7520
fix https://github.com/FreshRSS/FreshRSS/issues/8168
fix https://github.com/FreshRSS/FreshRSS/discussions/8172
2025-11-04 12:49:21 +01:00
maTh
430ab511f8 Update manage.phtml (#8185)
I think that the placeholder for new user names should not be "demo". An empty field is good enough IMHO

<img width="825" height="533" alt="grafik" src="https://github.com/user-attachments/assets/e2bde73b-4472-4bf7-ac4e-81138f3d9a3f" />


<img width="866" height="516" alt="grafik" src="https://github.com/user-attachments/assets/f7586470-d0e8-4962-9e5f-5aa6912670d3" />
2025-11-03 00:00:28 +01:00
scollovati
04c55fa1b8 [sqlite export] add username and timestamp (#8169)
* [sqlite export] add username and timestamp
add username and timestamp to sqlite user export, similar to the ZIP export. Useful for archiving purposes.

* Fix case of backups and other DB types
https://github.com/FreshRSS/FreshRSS/pull/8169#issuecomment-3476079108

---------

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
2025-11-02 20:39:41 +01:00
maTh
b0a663f6ee Fix/improve <textarea> (#8171)
## Feed configuration slider:

### Before:
<img width="747" height="346" alt="grafik" src="https://github.com/user-attachments/assets/37056ef8-1163-48d1-a3dd-99e745418b2d" />

### After:
<img width="743" height="473" alt="grafik" src="https://github.com/user-attachments/assets/388a0ef6-633e-43ee-8ea5-5cbe7b40e6e4" />

## CustomCSS, CustomJS extensions
### Before:
<img width="762" height="504" alt="grafik" src="https://github.com/user-attachments/assets/279801fb-06a7-477a-81e7-c681087595a5" />

### After:
<img width="767" height="922" alt="grafik" src="https://github.com/user-attachments/assets/ca4cf304-03c7-4028-89d0-1c3094086176" />

And cleaning some CSS

* UserCSS+JS: w100 h50
* clean textarea width height
* feed config slider
* Update base.rtl.css
* fix class="valid-json"
* padding + vertical-align
* fix ansum mapco
2025-11-01 10:15:59 +01:00