federation refinement

This commit is contained in:
2026-05-09 13:53:45 +02:00
parent df71748897
commit 470b29c9e1
56 changed files with 1513 additions and 544 deletions

View File

@@ -25,12 +25,14 @@
<div class="comment">{{ comment.value() }}</div>
{% endif %}
<div class="feed-meta">
<a href="/users/{{ entry.review().user_id().value() }}" class="feed-user">{{ entry.user_display_name() }}</a>
<span class="feed-time">{{ entry.review().watched_at().format("%b %-d, %Y") }}</span>
{% match entry.review().source() %}
{% when ReviewSource::Remote with { actor_url } %}
<span class="remote-badge" title="{{ actor_url }}">&#8599; federated</span>
<a href="{{ actor_url }}" class="feed-user" target="_blank" rel="noopener noreferrer">{{ entry.user_display_name() }}</a>
<span class="feed-time">{{ entry.review().watched_at().format("%b %-d, %Y") }}</span>
<span class="remote-badge">&#8599; federated</span>
{% when ReviewSource::Local %}
<a href="/users/{{ entry.review().user_id().value() }}" class="feed-user">{{ entry.user_display_name() }}</a>
<span class="feed-time">{{ entry.review().watched_at().format("%b %-d, %Y") }}</span>
{% endmatch %}
</div>
{% if ctx.is_current_user(entry.review().user_id().value()) %}

View File

@@ -10,15 +10,15 @@
<div class="stat-label">movies</div>
</div>
<div class="stat-tile">
<div class="stat-value">{{ stats.avg_rating_display() }}★</div>
<div class="stat-value">{{ avg_rating_display }}★</div>
<div class="stat-label">avg rating</div>
</div>
<div class="stat-tile">
<div class="stat-value">{{ stats.favorite_director_display() }}</div>
<div class="stat-value">{{ favorite_director_display }}</div>
<div class="stat-label">fav director</div>
</div>
<div class="stat-tile">
<div class="stat-value">{{ stats.most_active_month_display() }}</div>
<div class="stat-value">{{ most_active_month_display }}</div>
<div class="stat-label">most active</div>
</div>
</div>
@@ -36,6 +36,27 @@
{% endif %}
</section>
<a href="/users/{{ profile_user_id }}/following-list">View following ({{ following_count }})</a>
{% if !pending_followers.is_empty() %}
<section class="pending-followers">
<h3>Pending follow requests ({{ pending_followers.len() }})</h3>
<ul class="pending-list">
{% for actor in pending_followers %}
<li class="pending-item">
<span class="pending-handle"><strong>{{ actor.handle }}</strong></span>
<a href="{{ actor.url }}" class="pending-url" target="_blank" rel="noopener noreferrer">{{ actor.url }}</a>
<form method="POST" action="/users/{{ profile_user_id }}/followers/accept" class="inline-form">
<input type="hidden" name="actor_url" value="{{ actor.url }}">
<button type="submit" class="btn-accept">Accept</button>
</form>
<form method="POST" action="/users/{{ profile_user_id }}/followers/reject" class="inline-form">
<input type="hidden" name="actor_url" value="{{ actor.url }}">
<button type="submit" class="btn-reject">Reject</button>
</form>
</li>
{% endfor %}
</ul>
</section>
{% endif %}
{% endif %}
<div class="view-tabs">

View File

@@ -5,6 +5,12 @@
<p class="error">{{ err }}</p>
{% endif %}
<form method="POST" action="/register">
<label>
Username<br>
<small>230 chars: letters, digits, underscores, hyphens. This becomes your ActivityPub handle.</small><br>
<input type="text" name="username" required autocomplete="username"
pattern="[a-z0-9_\-]{2,30}" title="230 lowercase letters, digits, underscores or hyphens">
</label>
<label>
Email<br>
<input type="email" name="email" required autocomplete="email">

View File

@@ -4,12 +4,12 @@
<h2 class="page-title">Members</h2>
{% for user in users %}
<div class="user-row">
<div class="user-avatar">{{ user.initial() }}</div>
<div class="user-avatar">{{ user.initial }}</div>
<div class="user-info">
<div class="user-name">{{ user.display_name() }}</div>
<div class="user-meta">{{ user.total_movies }} movies · avg {{ user.avg_rating_display() }}★</div>
<div class="user-name">{{ user.display_name }}</div>
<div class="user-meta">{{ user.total_movies }} movies · avg {{ user.avg_rating_display }}★</div>
</div>
<a href="/users/{{ user.user_id.value() }}" class="btn-secondary">View profile →</a>
<a href="/users/{{ user.user_id }}" class="btn-secondary">View profile →</a>
</div>
{% else %}
<p class="empty">No users yet.</p>