templates/_context_menus.html
Rama main · réplica de lectura del repositorio original.
<div id="folder-context-menu" class="context-menu" hidden>
<div class="ctx-group">
<button type="button" id="ctx-refresh" class="context-menu-item">Refresh</button>
<button type="button" id="ctx-youtube-sync" class="context-menu-item" hidden>Sync Subscriptions</button>
<button type="button" id="ctx-mark-read" class="context-menu-item">Mark as read</button>
{% if debug_mode %}
<button type="button" id="ctx-clear-cache" class="context-menu-item debug-item">Clear image cache</button>
{% endif %}
</div>
<div class="ctx-group">
<button type="button" id="ctx-add-feed" class="context-menu-item">Add Feed Here</button>
<div id="ctx-add-to-folder-wrap" class="context-submenu-wrap" hidden>
<button type="button" id="ctx-add-to-folder" class="context-menu-item context-submenu-trigger">Move to Folder <span class="submenu-arrow material-symbols-rounded" aria-hidden="true">chevron_right</span></button>
<div id="ctx-folder-submenu" class="context-submenu" hidden>
{% for folder in folder_options %}
<button
type="button"
class="context-menu-item context-submenu-item{% if folder.depth > 0 %} context-submenu-item--child{% endif %}"
data-target-folder-id="{{ folder.id }}"
data-target-folder-path="{{ folder.path }}"
>{{ folder.name }}</button>
{% endfor %}
</div>
</div>
<button type="button" id="ctx-rename-folder" class="context-menu-item" hidden>Rename Folder</button>
</div>
<div class="ctx-group">
<button type="button" id="ctx-feed-properties" class="context-menu-item" hidden>Properties</button>
<button type="button" id="ctx-folder-properties" class="context-menu-item" hidden>Properties</button>
<button type="button" id="ctx-highlights" class="context-menu-item" hidden>Automation…</button>
</div>
<div class="ctx-group">
{# Same picker as the per-post Re-fetch menu, applied to every article in
the batch: "Original"/"Pub date" land each one on its own date, only
"Now" is uniform across the whole scope. A separate class/variable from
the per-post one (ctx-scope-refetch-date-opt / refetchScopeDateChoice)
— sharing state would let opening one menu silently reset the other's
choice, and nothing here should be pre-selected either. #}
<div class="ctx-refetch-date-label" id="ctx-scope-refetch-date-label" hidden>Land on:</div>
<div class="ctx-refetch-date-row" id="ctx-scope-refetch-date-row" role="radiogroup" aria-label="Where each re-fetched article's date lands" hidden>
<button type="button" class="ctx-refetch-date-opt ctx-scope-refetch-date-opt" data-date-choice="now">Now</button>
<button type="button" class="ctx-refetch-date-opt ctx-scope-refetch-date-opt" data-date-choice="original">Original</button>
<button type="button" class="ctx-refetch-date-opt ctx-scope-refetch-date-opt" data-date-choice="pub" title="Each article's own published date">Pub date</button>
</div>
<button type="button" id="ctx-refetch-scope" class="context-menu-item" hidden>Re-fetch all articles…</button>
</div>
<div class="ctx-group">
<button type="button" id="ctx-disable-feed" class="context-menu-item" hidden>Disable Feed</button>
<button type="button" id="ctx-unsubscribe-feed" class="context-menu-item danger" hidden>Unsubscribe</button>
<button type="button" id="ctx-folder-remove-stars" class="context-menu-item danger" hidden>Remove all stars in folder</button>
<button type="button" id="ctx-folder-remove-tags" class="context-menu-item danger" hidden>Remove all tags in folder</button>
<button type="button" id="ctx-delete-folder" class="context-menu-item danger" hidden>Delete Folder</button>
</div>
</div>
<div id="root-context-menu" class="context-menu" hidden>
<button type="button" id="ctx-root-refresh" class="context-menu-item">Refresh</button>
<button type="button" id="ctx-root-add-folder" class="context-menu-item">Add Folder</button>
<button type="button" id="ctx-root-add-feed" class="context-menu-item">Add Feed Here</button>
</div>
<div id="post-context-menu" class="context-menu" hidden>
<div class="ctx-group">
<button type="button" id="ctx-post-mark-read" class="context-menu-item">Mark as read</button>
{# Bulk-only siblings of ctx-post-mark-read: both directions always shown
(like the star/unstar pair below) rather than one mixed-selection
toggle — there is no single "obvious direction" to collapse to when
the selection spans both read states. #}
<button type="button" id="ctx-post-mark-read-bulk" class="context-menu-item" hidden>Mark as read</button>
<button type="button" id="ctx-post-mark-unread-bulk" class="context-menu-item" hidden>Mark as unread</button>
{# Bulk-only, both directions shown regardless of the selection's mixed
star state — add and remove are equally common triage actions here
(the Saved view especially), so there's no one "obvious direction"
to collapse to. Same reasoning as the read/unread pair above. #}
<button type="button" id="ctx-post-star-bulk" class="context-menu-item" hidden>Add star</button>
<button type="button" id="ctx-post-unstar-bulk" class="context-menu-item" hidden>Remove star</button>
<button type="button" id="ctx-post-mark-above-read" class="context-menu-item">Read above</button>
<button type="button" id="ctx-post-mark-below-read" class="context-menu-item">Read below</button>
<button type="button" id="ctx-post-mark-feed-read" class="context-menu-item" hidden>Mark Feed as Read</button>
</div>
<div class="ctx-group">
{# Works on any post — the right-clicked one, or the whole multi-selection. #}
<button type="button" id="ctx-post-add-tag" class="context-menu-item" hidden>Edit tags…</button>
<button type="button" id="ctx-post-move-to-feed" class="context-menu-item">Move to feed…</button>
{# "shown", not "visible": this moves everything matching the active filters,
including rows scroll-chunking has not painted yet. #}
<button type="button" id="ctx-post-move-visible" class="context-menu-item">Move all shown to feed…</button>
<button type="button" id="ctx-post-remove-tag-shown" class="context-menu-item danger" hidden>Remove this tag from all shown</button>
{# Shown only when every post in play (the right-clicked one, or the whole
multi-selection) has a video_id — see contextSelectedPosts in app.js. #}
<button type="button" id="ctx-post-add-to-playlist" class="context-menu-item" hidden>Add to YouTube Playlist…</button>
<button type="button" id="ctx-post-add-link-to-note" class="context-menu-item" hidden>Add link to Note</button>
</div>
<div class="ctx-group">
<button type="button" id="ctx-post-open-in-feeds" class="context-menu-item" hidden>Open in Feeds</button>
<button type="button" id="ctx-post-copy-url" class="context-menu-item">Copy URL</button>
</div>
<div class="ctx-group">
{# Bulk-only: queues the selection into the paced background re-fetch job. #}
<button type="button" id="ctx-post-refetch-bulk" class="context-menu-item" hidden>Re-fetch content</button>
{# Edit and Re-fetch each collapse into a flyout: they are four and four
items that only matter once you have decided to change this post, and
inline they pushed the everyday actions (mark read, copy URL) down a menu
nobody wants to read. #}
<details class="ctx-submenu" id="ctx-post-edit-group">
<summary class="context-menu-item ctx-submenu-summary">Edit<span class="ctx-submenu-caret material-symbols-rounded" aria-hidden="true">chevron_right</span></summary>
<div class="ctx-submenu-list">
<button type="button" id="ctx-post-edit-date" class="context-menu-item">Date…</button>
<button type="button" id="ctx-post-edit-title" class="context-menu-item">Title…</button>
<button type="button" id="ctx-post-edit-link" class="context-menu-item">URL…</button>
</div>
</details>
<details class="ctx-submenu" id="ctx-post-refetch-group" hidden>
<summary class="context-menu-item ctx-submenu-summary">Re-fetch<span class="ctx-submenu-caret material-symbols-rounded" aria-hidden="true">chevron_right</span></summary>
<div class="ctx-submenu-list">
{# Where the re-fetch lands, not which mode fetches it — applies to
all three buttons below. Nothing pre-selected (decided 2026-08-24):
unset means today's default (a capture bumps to Now, a feed entry
keeps its date), same as before this existed. #}
<div class="ctx-refetch-date-label">Land on:</div>
<div class="ctx-refetch-date-row" role="radiogroup" aria-label="Where the re-fetched date lands">
<button type="button" class="ctx-refetch-date-opt" data-date-choice="now">Now</button>
<button type="button" class="ctx-refetch-date-opt" data-date-choice="original">Original</button>
<button type="button" class="ctx-refetch-date-opt" data-date-choice="pub" title="The article's own published date">Pub date</button>
</div>
<button type="button" id="ctx-post-refetch" class="context-menu-item" hidden>Content</button>
{# Whole-page capture instead of readability extraction — for a post
whose normal re-fetch keeps coming back wrong. #}
<button type="button" id="ctx-post-refetch-full" class="context-menu-item" hidden>Full page</button>
{# The archive by explicit request. The automatic fallback only fires when
the live fetch is REFUSED; a publisher serving a page that passes every
guard but is no longer the article is the case that otherwise sends you
to archive.org by hand. #}
<button type="button" id="ctx-post-refetch-archive" class="context-menu-item" hidden>From Internet Archive</button>
{# Undo. Lives here because a bad re-fetch is what you are undoing, and
the header icon it replaces was unfindable exactly when needed. Shown
only when there IS a stored original. #}
<button type="button" id="ctx-post-restore-original" class="context-menu-item" hidden>Restore original</button>
</div>
</details>
</div>
<div class="ctx-group">
<button type="button" id="ctx-post-automation" class="context-menu-item">Automation…</button>
</div>
<div class="ctx-group">
<button type="button" id="ctx-post-delete" class="context-menu-item danger">Delete post…</button>
{% if debug_mode %}<button type="button" id="ctx-post-clear-img-cache" class="context-menu-item debug-item">Clear image cache</button>{% endif %}
</div>
</div>
<div id="tag-context-menu" class="context-menu" hidden>
<div class="ctx-group">
<button type="button" id="ctx-tag-rename" class="context-menu-item">Rename tag…</button>
{# Scoped to the CURRENT view, not the whole tag: the case this serves is
"drilled down to a single feed with stars I don't need". The label carries
the server's count so the set is stated before the click. #}
<button type="button" id="ctx-tag-unstar-scope" class="context-menu-item">Unstar all in this view</button>
</div>
<div class="ctx-group">
<button type="button" id="ctx-tag-delete" class="context-menu-item danger">Delete tag everywhere</button>
</div>
</div>