{# Settings → Feeds → Folders table. Served by /settings/feeds/panel/folders and injected on first open of the Feeds tab — at thousands of feeds this table is the single heaviest fragment in the app (every feed gets a hidden row), so it must never ship inline with the page. All row interactions are delegated on #settings-tab-feeds, so injected rows need no rebinding. #} {% set child_rows = folder_rows | selectattr('depth', 'equalto', 1) | list %} {# Also list feeds attached directly to the root "All Feeds" folder (depth 0) — otherwise feeds added without a folder are invisible and unmanageable here. Shown last, labelled "Ungrouped". #} {% set _root_rows = folder_rows | selectattr('depth', 'equalto', 0) | list %} {% if _root_rows and settings_feeds_by_folder.get(_root_rows[0].id) %} {% set child_rows = child_rows + [_root_rows[0]] %} {% endif %} {% if child_rows %} {% set cadence_options = [(0, 'Global'), (1, '1 min'), (2, '2 min'), (5, '5 min'), (10, '10 min'), (15, '15 min'), (30, '30 min'), (60, '1 hr'), (120, '2 hr'), (360, '6 hr'), (720, '12 hr'), (1440, '1 day')] %}
| Folder | Feeds | Refresh | {# Select every feed the filter is showing, across folders — the per-folder boxes below only ever reach their own folder, so a search spanning several of them had no "select what I searched for". With no filter it selects everything, which is what a header checkbox reads as anyway. The count lives in the tooltip because the column is 2rem wide; the toolbar states it again once something is selected. #} | |
|---|---|---|---|---|
|
{{ 'Ungrouped' if row.depth == 0 else row.name }}
{% if failing %}{{ failing }}{% endif %}
|
{{ row.feed_count }} | {% if not row.virtual %} {% endif %} | {% if not row.virtual %} {% endif %} | {% if folder_feeds %} {% endif %} |
| {% if feed.url in push_feed_urls %}⚡{% endif %} {% if feed.has_error %}!{% endif %} {% if feed.disabled %}disabled{% endif %} | {% if feed.disabled %} {% else %} {% endif %} | |||
No folders yet.
{% endif %}