templates/_settings_feeds_failing.html
Rama main · réplica de lectura del repositorio original.
{# Settings → Feeds → Failing list. Served by /settings/feeds/panel/failing
and injected on first open of the Failing view — up to
LECTIO_FAILING_FEEDS_LIMIT (default 500) rows of markup, so at that size it
must never ship inline with the page. Row actions are delegated
document-wide ([data-problem-feed-*]), so no rebinding. #}
<div id="problematic-feeds-modal">
<div data-problem-panel="failing">
{% if failing_feeds %}
<div class="problem-feed-filter" data-problem-feed-filter role="tablist" aria-label="Filter failing feeds by cause"></div>
<ul class="problem-feed-list">
{% for row in failing_feeds %}
<li class="problem-feed-item" data-feed-url="{{ row.feed_url }}" data-category="{{ row.category }}">
<div class="problem-feed-row">
<button type="button" class="problem-feed-link" data-problem-feed-properties data-feed-url="{{ row.feed_url }}" title="{{ row.feed_url }}">{{ row.feed_title }}</button>
<div class="problem-feed-actions">
<a class="problem-feed-action" href="{{ row.feed_url }}" target="_blank" rel="noopener noreferrer" title="Open feed URL"><span class="material-symbols-rounded" aria-hidden="true">open_in_new</span></a>
{% if row.can_suggest_migration %}
<button type="button" class="problem-feed-action" data-problem-feed-suggest-migration data-feed-url="{{ row.feed_url }}" title="Suggest a replacement feed URL" aria-label="Suggest a replacement feed URL"><span class="material-symbols-rounded" aria-hidden="true">auto_fix_high</span></button>
{% endif %}
<button type="button" class="problem-feed-action problem-feed-action-ack" data-problem-feed-ack data-feed-url="{{ row.feed_url }}" title="Working — they're just blocking us (mute; stays on ~daily retry)" aria-label="Mute — feed is fine"><span class="material-symbols-rounded" aria-hidden="true">check_circle</span></button>
<button type="button" class="problem-feed-action" data-problem-feed-mark-dead data-feed-url="{{ row.feed_url }}" title="Dead — needs a replacement (stop fetching; keep saved/tagged posts)" aria-label="Dead — needs replacement"><span class="material-symbols-rounded" aria-hidden="true">heart_broken</span></button>
<button type="button" class="problem-feed-action problem-feed-action-danger" data-problem-feed-unsubscribe data-feed-url="{{ row.feed_url }}" data-folder-id="{{ row.folder_id or selected_folder_id }}" title="Unsubscribe" aria-label="Unsubscribe"><span class="material-symbols-rounded" aria-hidden="true">delete</span></button>
</div>
</div>
<div class="problem-feed-meta">
<span class="problem-feed-cat problem-feed-cat--{{ row.category }}">{{ row.category_label }}</span>
<span>{{ row.consecutive_failures }} failure{{ 's' if row.consecutive_failures != 1 else '' }}</span>
{% if row.next_retry_display %}<span>Retry: {{ row.next_retry_display }}</span>{% endif %}
</div>
{% if row.last_error %}<div class="problem-feed-error">{{ row.last_error }}</div>{% endif %}
</li>
{% endfor %}
</ul>
<p class="muted problem-feed-empty-filtered" hidden>No failing feeds in this category.</p>
{% else %}
<p class="muted">No failing feeds right now.</p>
{% endif %}
</div>
<div class="problem-feed-section-divider" {% if not acked_feeds %}hidden{% endif %}>Checked OK</div>
<div data-problem-panel="acked">
{% if acked_feeds %}
<ul class="problem-feed-list">
{% for row in acked_feeds %}
<li class="problem-feed-item" data-feed-url="{{ row.feed_url }}">
<div class="problem-feed-row">
<button type="button" class="problem-feed-link" data-problem-feed-properties data-feed-url="{{ row.feed_url }}" title="{{ row.feed_url }}">{{ row.feed_title }}</button>
<div class="problem-feed-actions">
<a class="problem-feed-action" href="{{ row.feed_url }}" target="_blank" rel="noopener noreferrer" title="Open feed URL"><span class="material-symbols-rounded" aria-hidden="true">open_in_new</span></a>
<button type="button" class="problem-feed-action" data-problem-feed-unack data-feed-url="{{ row.feed_url }}" title="Move back to Failing" aria-label="Move back to Failing"><span class="material-symbols-rounded" aria-hidden="true">undo</span></button>
<button type="button" class="problem-feed-action problem-feed-action-danger" data-problem-feed-unsubscribe data-feed-url="{{ row.feed_url }}" data-folder-id="{{ row.folder_id or selected_folder_id }}" title="Unsubscribe" aria-label="Unsubscribe"><span class="material-symbols-rounded" aria-hidden="true">delete</span></button>
</div>
</div>
<div class="problem-feed-meta">
<span>{{ row.consecutive_failures }} failure{{ 's' if row.consecutive_failures != 1 else '' }}</span>
{% if row.next_retry_display %}<span>Retry: {{ row.next_retry_display }}</span>{% endif %}
</div>
{% if row.last_error %}<div class="problem-feed-error">{{ row.last_error }}</div>{% endif %}
</li>
{% endfor %}
</ul>
{% endif %}
</div>
<div class="problem-feed-section-divider" {% if not needs_replacement_feeds %}hidden{% endif %} data-needs-replacement-divider>Needs replacement</div>
<div data-problem-panel="needs-replacement">
{% if needs_replacement_feeds %}
<ul class="problem-feed-list">
{% for row in needs_replacement_feeds %}
<li class="problem-feed-item" data-feed-url="{{ row.feed_url }}">
<div class="problem-feed-row">
<button type="button" class="problem-feed-link" data-problem-feed-properties data-feed-url="{{ row.feed_url }}" title="{{ row.feed_url }}">{{ row.feed_title }}</button>
<div class="problem-feed-actions">
<button type="button" class="problem-feed-action" data-problem-feed-properties data-feed-url="{{ row.feed_url }}" title="Find a replacement (Change feed URL in properties)" aria-label="Find replacement"><span class="material-symbols-rounded" aria-hidden="true">published_with_changes</span></button>
<a class="problem-feed-action" href="{{ row.feed_url }}" target="_blank" rel="noopener noreferrer" title="Open feed URL"><span class="material-symbols-rounded" aria-hidden="true">open_in_new</span></a>
<button type="button" class="problem-feed-action" data-problem-feed-unmark-dead data-feed-url="{{ row.feed_url }}" title="Back to Failing (re-enable fetching)" aria-label="Back to Failing"><span class="material-symbols-rounded" aria-hidden="true">undo</span></button>
<button type="button" class="problem-feed-action problem-feed-action-danger" data-problem-feed-unsubscribe data-feed-url="{{ row.feed_url }}" data-folder-id="{{ row.folder_id or selected_folder_id }}" title="Unsubscribe" aria-label="Unsubscribe"><span class="material-symbols-rounded" aria-hidden="true">delete</span></button>
</div>
</div>
<div class="problem-feed-meta">
<span class="problem-feed-cat problem-feed-cat--{{ row.category }}">{{ row.category_label }}</span>
<span>{{ row.consecutive_failures }} failure{{ 's' if row.consecutive_failures != 1 else '' }}</span>
</div>
{% if row.last_error %}<div class="problem-feed-error">{{ row.last_error }}</div>{% endif %}
</li>
{% endfor %}
</ul>
{% endif %}
</div>
</div>