mirror of
https://git.sr.ht/~tsileo/microblog.pub
synced 2024-12-22 21:24:28 +00:00
391 lines
14 KiB
HTML
391 lines
14 KiB
HTML
{% macro embed_csrf_token() %}
|
|
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
|
|
{% endmacro %}
|
|
|
|
{% macro embed_redirect_url() %}
|
|
<input type="hidden" name="redirect_url" value="{{ request.url }}">
|
|
{% endmacro %}
|
|
|
|
{% macro admin_follow_button(actor) %}
|
|
<form action="{{ request.url_for("admin_actions_follow") }}" method="POST">
|
|
{{ embed_csrf_token() }}
|
|
{{ embed_redirect_url() }}
|
|
<input type="hidden" name="ap_actor_id" value="{{ actor.ap_id }}">
|
|
<input type="submit" value="follow">
|
|
</form>
|
|
{% endmacro %}
|
|
|
|
{% macro admin_like_button(ap_object_id) %}
|
|
<form action="{{ request.url_for("admin_actions_like") }}" method="POST">
|
|
{{ embed_csrf_token() }}
|
|
{{ embed_redirect_url() }}
|
|
<input type="hidden" name="ap_object_id" value="{{ ap_object_id }}">
|
|
<input type="submit" value="like">
|
|
</form>
|
|
{% endmacro %}
|
|
|
|
{% macro admin_bookmark_button(ap_object_id) %}
|
|
<form action="{{ request.url_for("admin_actions_bookmark") }}" method="POST">
|
|
{{ embed_csrf_token() }}
|
|
{{ embed_redirect_url() }}
|
|
<input type="hidden" name="ap_object_id" value="{{ ap_object_id }}">
|
|
<input type="submit" value="bookmark">
|
|
</form>
|
|
{% endmacro %}
|
|
|
|
{% macro admin_unbookmark_button(ap_object_id) %}
|
|
<form action="{{ request.url_for("admin_actions_unbookmark") }}" method="POST">
|
|
{{ embed_csrf_token() }}
|
|
{{ embed_redirect_url() }}
|
|
<input type="hidden" name="ap_object_id" value="{{ ap_object_id }}">
|
|
<input type="submit" value="unbookmark">
|
|
</form>
|
|
{% endmacro %}
|
|
|
|
{% macro admin_pin_button(ap_object_id) %}
|
|
<form action="{{ request.url_for("admin_actions_pin") }}" method="POST">
|
|
{{ embed_csrf_token() }}
|
|
{{ embed_redirect_url() }}
|
|
<input type="hidden" name="ap_object_id" value="{{ ap_object_id }}">
|
|
<input type="submit" value="pin">
|
|
</form>
|
|
{% endmacro %}
|
|
|
|
{% macro admin_unpin_button(ap_object_id) %}
|
|
<form action="{{ request.url_for("admin_actions_unpin") }}" method="POST">
|
|
{{ embed_csrf_token() }}
|
|
{{ embed_redirect_url() }}
|
|
<input type="hidden" name="ap_object_id" value="{{ ap_object_id }}">
|
|
<input type="submit" value="unpin">
|
|
</form>
|
|
{% endmacro %}
|
|
|
|
{% macro admin_delete_button(ap_object_id) %}
|
|
<form action="{{ request.url_for("admin_actions_delete") }}" method="POST" onsubmit="return confirm('Do you really want to delete this object?');">
|
|
{{ embed_csrf_token() }}
|
|
{{ embed_redirect_url() }}
|
|
<input type="hidden" name="ap_object_id" value="{{ ap_object_id }}">
|
|
<input type="submit" value="delete">
|
|
</form>
|
|
{% endmacro %}
|
|
|
|
{% macro admin_announce_button(ap_object_id, disabled=False) %}
|
|
<form action="{{ request.url_for("admin_actions_announce") }}" method="POST">
|
|
{{ embed_csrf_token() }}
|
|
{{ embed_redirect_url() }}
|
|
<input type="hidden" name="ap_object_id" value="{{ ap_object_id }}">
|
|
<input type="submit" value="share" {% if disabled %}title="Cannot share non-public content" disabled{% endif %}>
|
|
</form>
|
|
{% endmacro %}
|
|
|
|
{% macro admin_undo_button(ap_object_id, action="Undo") %}
|
|
<form action="{{ request.url_for("admin_actions_undo") }}" method="POST">
|
|
{{ embed_csrf_token() }}
|
|
{{ embed_redirect_url() }}
|
|
<input type="hidden" name="ap_object_id" value="{{ ap_object_id }}">
|
|
<input type="submit" value="{{ action }}">
|
|
</form>
|
|
{% endmacro %}
|
|
|
|
{% macro sensitive_button(permalink_id) %}
|
|
<form action="" method="GET">
|
|
<input type="hidden" name="show_sensitive" value="{{ permalink_id }}">
|
|
{% for k, v in request.query_params.items() %}
|
|
<input type="hidden" name="{{k}}" value="{{v}}">
|
|
{% endfor %}
|
|
<button type="submit">display sensitive content</button>
|
|
</form>
|
|
{% endmacro %}
|
|
|
|
{% macro show_more_button(permalink_id) %}
|
|
<form action="" method="GET">
|
|
<input type="hidden" name="show_more" value="{{ permalink_id }}">
|
|
{% for k, v in request.query_params.items() %}
|
|
<input type="hidden" name="{{k}}" value="{{v}}">
|
|
{% endfor %}
|
|
<button type="submit">show more</button>
|
|
</form>
|
|
{% endmacro %}
|
|
|
|
|
|
{% macro admin_reply_button(ap_object_id) %}
|
|
<form action="/admin/new" method="GET">
|
|
<input type="hidden" name="in_reply_to" value="{{ ap_object_id }}">
|
|
<button type="submit">reply</button>
|
|
</form>
|
|
{% endmacro %}
|
|
|
|
{% macro admin_profile_button(ap_actor_id) %}
|
|
<form action="{{ url_for("admin_profile") }}" method="GET">
|
|
<input type="hidden" name="actor_id" value="{{ ap_actor_id }}">
|
|
<button type="submit">profile</button>
|
|
</form>
|
|
{% endmacro %}
|
|
|
|
{% macro admin_expand_button(ap_object_id) %}
|
|
<form action="{{ url_for("admin_object") }}" method="GET">
|
|
<input type="hidden" name="ap_id" value="{{ ap_object_id }}">
|
|
<button type="submit">expand</button>
|
|
</form>
|
|
{% endmacro %}
|
|
|
|
{% macro display_box_filters(route) %}
|
|
<nav class="flexbox">
|
|
<ul>
|
|
<li>Filter by</li>
|
|
{% for ap_type in ["Note", "Like", "Announce", "Follow"] %}
|
|
<li><a href="{{ url_for(route) }}?filter_by={{ ap_type }}" {% if request.query_params.filter_by == ap_type %}class="active"{% endif %}>
|
|
{{ ap_type }}
|
|
</a>
|
|
</li>
|
|
{% endfor %}
|
|
{% if request.query_params.filter_by %}
|
|
<li>
|
|
<a href="{{ url_for(route) }}">Reset filter</a>
|
|
</li>
|
|
{% endif %}
|
|
</nav>
|
|
{% endmacro %}
|
|
|
|
{% macro display_actor(actor, actors_metadata) %}
|
|
{% set metadata = actors_metadata.get(actor.ap_id) %}
|
|
<div class="actor-box h-card p-author">
|
|
<div class="icon-box">
|
|
<img src="{{ actor.resized_icon_url }}" class="actor-icon">
|
|
</div>
|
|
<a href="{{ actor.url }}" class="u-url" style="">
|
|
<div><strong>{{ actor.display_name | clean_html(actor) | safe }}</strong></div>
|
|
<div class="actor-handle p-name">{{ actor.handle }}</div>
|
|
</a>
|
|
</div>
|
|
{% if is_admin and metadata %}
|
|
<div>
|
|
<nav class="flexbox actor-metadata">
|
|
<ul>
|
|
{% if metadata.is_following %}
|
|
<li>already following</li>
|
|
<li>{{ admin_undo_button(metadata.outbox_follow_ap_id, "unfollow")}}</li>
|
|
{% elif metadata.is_follow_request_sent %}
|
|
<li>follow request sent</li>
|
|
{% else %}
|
|
<li>{{ admin_follow_button(actor) }}</li>
|
|
{% endif %}
|
|
{% if metadata.is_follower %}
|
|
<li>follows you</li>
|
|
{% endif %}
|
|
</li>
|
|
</ul>
|
|
</nav>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% endmacro %}
|
|
|
|
{% macro display_og_meta(object) %}
|
|
{% if object.og_meta %}
|
|
{% for og_meta in object.og_meta %}
|
|
<div class="activity-og-meta" style="display:flex;column-gap: 20px;margin:20px 0;">
|
|
{% if og_meta.image %}
|
|
<div>
|
|
<img src="{{ og_meta.image | media_proxy_url }}" style="max-width:200px;">
|
|
</div>
|
|
<div>
|
|
<a href="{{ og_meta.url }}">{{ og_meta.title }}</a>
|
|
<small style="display:block;">{{ og_meta.site_name }}</small>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
{% endfor %}
|
|
{% endif %}
|
|
{% endmacro %}
|
|
|
|
|
|
{% macro display_attachments(object) %}
|
|
{% if object.attachments and object.sensitive and not request.query_params.show_sensitive == object.permalink_id %}
|
|
{{ sensitive_button(object.permalink_id )}}
|
|
{% endif %}
|
|
|
|
{% if object.attachments and (not object.sensitive or (object.sensitive and request.query_params["show_sensitive"] == object.permalink_id)) %}
|
|
{% for attachment in object.attachments %}
|
|
{% if attachment.type == "Image" or (attachment | has_media_type("image")) %}
|
|
<img src="{{ attachment.resized_url or attachment.proxied_url }}"{% if attachment.name %} alt="{{ attachment.name }}"{% endif %} class="attachment">
|
|
{% elif attachment.type == "Video" or (attachment | has_media_type("video")) %}
|
|
<video controls preload="metadata" src="{{ attachment.url | media_proxy_url }}"{% if attachment.name %} title="{{ attachment.name }}"{% endif %} class="attachmeent"></video>
|
|
{% elif attachment.type == "Audio" or (attachment | has_media_type("audio")) %}
|
|
<audio controls preload="metadata" src="{{ attachment.url | media_proxy_url }}"{% if attachment.name%} title="{{ attachment.name }}"{% endif %} style="width:480px;" class="attachment"></audio>
|
|
{% else %}
|
|
<a href="{{ attachment.url | media_proxy_url }}"{% if attachment.name %} title="{{ attachment.name }}"{% endif %} class="attachment">{{ attachment.url }}</a>
|
|
{% endif %}
|
|
{% endfor %}
|
|
{% endif %}
|
|
{% endmacro %}
|
|
|
|
{% macro display_object_expanded(object, likes=[], shares=[]) %}
|
|
|
|
<div class="activity-expanded h-entry">
|
|
|
|
{{ display_actor(object.actor, {}) }}
|
|
|
|
{% if object.summary %}
|
|
<p class="p-summary">{{ object.summary | clean_html(object) | safe }}</p>
|
|
{% endif %}
|
|
{% if object.sensitive and object.summary and not request.query_params.show_more == object.permalink_id %}
|
|
{{ show_more_button(object.permalink_id) }}
|
|
{% endif %}
|
|
{% if not object.sensitive or (object.sensitive and object.summary and request.query_params.show_more == object.permalink_id) %}
|
|
<div class="e-content">
|
|
{{ object.content | clean_html(object) | safe }}
|
|
</div>
|
|
{% endif %}
|
|
|
|
{{ display_og_meta(object) }}
|
|
|
|
<a href="{{ object.url }}" class="u-url u-uid"><time class="dt-published" datetime="{{ object.ap_published_at }}">{{ object.ap_published_at | format_date }}</time></a>
|
|
{{ object.visibility.value }}
|
|
{% if object.is_from_outbox %}
|
|
{{ object.likes_count }} likes
|
|
{% endif %}
|
|
|
|
{% if object.is_from_outbox %}
|
|
{{ object.announces_count }} shares
|
|
{% endif %}
|
|
|
|
{{ display_attachments(object) }}
|
|
|
|
{% if likes or shares %}
|
|
<div style="display: flex;column-gap: 20px;margin:20px 0;">
|
|
<div style="flex: 0 1 50%;max-width: 50%;">Likes
|
|
<div style="display: flex;column-gap: 20px;row-gap:20px;flex-wrap: wrap;margin-top:20px;">
|
|
{% for like in likes %}
|
|
<a href="{{ like.actor.url }}" title="{{ like.actor.handle }}" style="height:50px;">
|
|
<img src="{{ like.actor.resized_icon_url }}" alt="{{ like.actor.handle}}" style="max-width:50px;">
|
|
</a>
|
|
{% endfor %}
|
|
<div style="width:50px;text-align:center;">And 2223 more.</div>
|
|
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<div style="flex: 0 1 50%;max-width: 50%;">Shares
|
|
<div style="display: flex;column-gap: 20px;row-gap:20px;flex-wrap: wrap;margin-top:20px;">
|
|
{% for share in shares %}
|
|
<a href="{{ share.actor.url }}" title="{{ share.actor.handle }}" style="height:50px;">
|
|
<img src="{{ share.actor.resized_icon_url }}" alt="{{ share.actor.handle}}" style="max-width:50px;">
|
|
</a>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
{% endmacro %}
|
|
|
|
{% macro display_object(object) %}
|
|
{% if object.ap_type in ["Note", "Article", "Video"] %}
|
|
<div class="activity-wrap h-entry" id="{{ object.permalink_id }}">
|
|
<div class="activity-content">
|
|
<img src="{{ object.actor.resized_icon_url }}" alt="" class="actor-icon">
|
|
<div class="activity-header">
|
|
<strong>{{ object.actor.display_name }}</strong>
|
|
<a href="{{ object.actor.url}}" class="actor-handle p-author h-card">{{ object.actor.handle }}</a>
|
|
<span class="activity-date" title="{{ object.ap_published_at.isoformat() }}">
|
|
<a href="{{ object.url }}" class="u-url u-uid"><time class="dt-published" datetime="{{ object.ap_published_at }}">{{ object.ap_published_at | timeago }}</time></a>
|
|
</span>
|
|
{% if is_admin %}<span class="object-visibility">{{ object.visibility.value }}</span>{% endif %}
|
|
{% if object.summary %}
|
|
<p class="p-summary">{{ object.summary | clean_html(object) | safe }}</p>
|
|
{% endif %}
|
|
{% if object.sensitive and object.summary and not request.query_params.show_more == object.permalink_id %}
|
|
{{ show_more_button(object.permalink_id) }}
|
|
{% endif %}
|
|
{% if not object.sensitive or (object.sensitive and object.summary and request.query_params.show_more == object.permalink_id) %}
|
|
<div class="activity-main e-content">
|
|
{{ object.content | clean_html(object) | safe }}
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
|
|
<div style="padding-left:60px">
|
|
{{ display_og_meta(object) }}
|
|
</div>
|
|
<div class="activity-attachment">
|
|
|
|
{{ display_attachments(object) }}
|
|
</div>
|
|
|
|
<nav class="flexbox activity-bar">
|
|
<ul>
|
|
{% if object.is_from_outbox %}
|
|
<li>
|
|
<div class="comment-count">{{ object.likes_count }} like{{ object.likes_count | pluralize }}</div>
|
|
</li>
|
|
|
|
<li>
|
|
<div class="retweet-count">{{ object.announces_count }} share{{ object.announces_count | pluralize }}</div>
|
|
</li>
|
|
|
|
<li>
|
|
<div class="retweet-count">{{ object.replies_count }} repl{{ object.replies_count | pluralize("y", "ies") }}</div>
|
|
</li>
|
|
|
|
{% if is_admin %}
|
|
<li>
|
|
{{ admin_delete_button(object.ap_id) }}
|
|
</li>
|
|
<li>
|
|
{{ admin_reply_button(object.ap_id) }}
|
|
</li>
|
|
<li>
|
|
{% if object.is_pinned %}
|
|
{{ admin_unpin_button(object.ap_id) }}
|
|
{% else %}
|
|
{{ admin_pin_button(object.ap_id) }}
|
|
{% endif %}
|
|
</li>
|
|
{% endif %}
|
|
{% endif %}
|
|
|
|
{% if object.is_from_inbox %}
|
|
<li>
|
|
{% if object.liked_via_outbox_object_ap_id %}
|
|
{{ admin_undo_button(object.liked_via_outbox_object_ap_id, "unlike") }}
|
|
{% else %}
|
|
{{ admin_like_button(object.ap_id) }}
|
|
{% endif %}
|
|
</li>
|
|
<li>
|
|
{% if object.is_bookmarked %}
|
|
{{ admin_unbookmark_button(object.ap_id) }}
|
|
{% else %}
|
|
{{ admin_bookmark_button(object.ap_id) }}
|
|
{% endif %}
|
|
</li>
|
|
<li>
|
|
{% if object.announced_via_outbox_object_ap_id %}
|
|
{{ admin_undo_button(object.liked_via_outbox_object_ap_id, "unshare") }}
|
|
{% else %}
|
|
{{ admin_announce_button(object.ap_id, disabled=object.visibility not in [visibility_enum.PUBLIC, visibility_enum.UNLISTED]) }}
|
|
{% endif %}
|
|
</li>
|
|
<li>
|
|
{{ admin_reply_button(object.ap_id) }}
|
|
</li>
|
|
<li>
|
|
{{ admin_profile_button(object.actor.ap_id) }}
|
|
</li>
|
|
<li>
|
|
{{ admin_expand_button(object.ap_id) }}
|
|
</li>
|
|
|
|
|
|
{% endif %}
|
|
</ul>
|
|
</nav>
|
|
</div>
|
|
{% endif %}
|
|
{% endmacro %}
|