A ⋯ button on row hover and right-click on a feed row open the same floating menu: Keep / Open / Copy link / Delete. Dismisses on click-away/Escape, edge-flips to stay on-screen. Standalone one-click Delete icon stays; the Trash view keeps its dedicated Undelete. - Row markup: actions grouped in a .row-actions container (delete + ⋯ in the feed/keep views; undelete in trash). Reuses the existing keep endpoint. - Menu only in the normal/keep views, not trash. Keep-toggle syncs the row's kept badge + the preview Keep button, and (in the Keep folder) drops the row when unkept. - Frontend-only (no backend change); inline JS validated with node --check; 152 tests pass; feed renders in all views. Share + Add-label join the menu in later slices. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
42 lines
3.2 KiB
HTML
42 lines
3.2 KiB
HTML
{% for artifact in artifacts %}
|
|
<a class="artifact-row {% if selected_artifact.id == artifact.id %}selected{% endif %} {% if artifact.is_unread %}unread{% endif %} {% if artifact.is_kept %}kept{% endif %} {% if artifact.is_shared %}shared{% endif %}"
|
|
href="?{% if selected_source %}source={{ selected_source|urlencode }}&{% endif %}{% if selected_label %}label={{ selected_label|urlencode }}&{% endif %}{% if selected_kind %}kind={{ selected_kind|urlencode }}&{% endif %}{% if title_query %}q={{ title_query|urlencode }}&{% endif %}artifact={{ artifact.id }}&view={{ selected_view }}"
|
|
data-artifact-id="{{ artifact.id }}"
|
|
data-title="{{ artifact.title }}"
|
|
data-kind="{{ artifact.kind }}"
|
|
data-source="{{ artifact.source }}"
|
|
data-source-type="{{ artifact.source_type }}"
|
|
data-source-name="{{ artifact.source_name }}"
|
|
data-created="{{ artifact.created_at|date:'M j Y, H:i' }}"
|
|
data-size="{{ artifact.size_bytes|filesizeformat }}"
|
|
data-kept="{{ artifact.is_kept|yesno:'1,0' }}"
|
|
data-shared="{{ artifact.is_shared|yesno:'1,0' }}"
|
|
data-share-url="{% if artifact.is_shared %}{{ request.scheme }}://{{ request.get_host }}{% url 'artifact-shared' artifact.share_token %}{% endif %}"
|
|
data-tags="{{ artifact.tags|join:', ' }}"
|
|
data-rendered-url="{% url 'artifact' artifact.id %}"
|
|
data-raw-url="{% url 'artifact' artifact.id %}?raw=1">
|
|
<time class="artifact-time" datetime="{{ artifact.created_at|date:'c' }}">{{ artifact.created_at|date:"H:i" }}</time>
|
|
<span class="artifact-row-main">
|
|
<span class="artifact-title">{{ artifact.title }}</span>
|
|
<span class="artifact-kind-text">{% if artifact.kind == "image" %}image{% elif artifact.kind == "pdf" %}pdf{% elif artifact.kind == "markdown" %}markdown{% elif artifact.kind == "deck" %}deck{% elif artifact.kind == "binary" %}binary{% else %}html{% endif %}</span>
|
|
<span class="kept-badge" data-kept-badge title="Kept — never auto-deleted"{% if not artifact.is_kept %} hidden{% endif %}>K</span>
|
|
<span class="shared-badge" data-shared-badge title="Shared — anyone with the link can view"{% if not artifact.is_shared %} hidden{% endif %}>🔗</span>
|
|
{% if artifact.label_chips %}
|
|
<span class="tag-chips">
|
|
{% for label in artifact.label_chips %}
|
|
<span class="tag-chip" style="background:{{ label.color }}">{{ label.name }}</span>
|
|
{% endfor %}
|
|
</span>
|
|
{% endif %}
|
|
</span>
|
|
<span class="artifact-source">{{ artifact.source }}</span>
|
|
<span class="row-actions">
|
|
{% if in_trash %}
|
|
<span class="row-action row-undelete" role="button" tabindex="0" data-undelete="{{ artifact.id }}" title="Restore from Trash" aria-label="Restore {{ artifact.title }}">↩</span>
|
|
{% else %}
|
|
<span class="row-action row-delete" role="button" tabindex="0" data-delete="{{ artifact.id }}" title="Delete" aria-label="Delete {{ artifact.title }}">🗑</span>
|
|
<span class="row-action row-menu-trigger" role="button" tabindex="0" data-menu-trigger title="More actions" aria-label="More actions for {{ artifact.title }}">⋯</span>
|
|
{% endif %}
|
|
</span>
|
|
</a>
|
|
{% endfor %}
|