Finish support for pinned/featured note

This commit is contained in:
Thomas Sileo 2018-07-22 22:22:30 +02:00
parent f23dbcaf05
commit a5e0983ca8
4 changed files with 91 additions and 6 deletions

51
app.py
View file

@ -803,14 +803,25 @@ def index():
"activity.object.inReplyTo": None, "activity.object.inReplyTo": None,
"meta.deleted": False, "meta.deleted": False,
"meta.undo": False, "meta.undo": False,
"$or": [{"meta.pinned": False}, {"meta.pinned": {"$exists": False}}],
} }
outbox_data, older_than, newer_than = paginated_query(DB.activities, q) q_pinned = {
"box": Box.OUTBOX.value,
"type": ActivityType.CREATE.value,
"meta.deleted": False,
"meta.undo": False,
"meta.pinned": True,
}
pinned = list(DB.activities.find(q_pinned))
outbox_data, older_than, newer_than = paginated_query(
DB.activities, q, limit=25 - len(pinned)
)
return render_template( return render_template(
"index.html", "index.html",
outbox_data=outbox_data, outbox_data=outbox_data,
older_than=older_than, older_than=older_than,
newer_than=newer_than, newer_than=newer_than,
pinned=pinned,
) )
@ -1453,6 +1464,32 @@ def api_like():
return _user_api_response(activity=like.id) return _user_api_response(activity=like.id)
@app.route("/api/note/pin", methods=["POST"])
@api_required
def api_pin():
note = _user_api_get_note(from_outbox=True)
DB.activities.update_one(
{"activity.object.id": note.id, "box": Box.OUTBOX.value},
{"$set": {"meta.pinned": True}},
)
return _user_api_response(pinned=True)
@app.route("/api/note/unpin", methods=["POST"])
@api_required
def api_unpin():
note = _user_api_get_note(from_outbox=True)
DB.activities.update_one(
{"activity.object.id": note.id, "box": Box.OUTBOX.value},
{"$set": {"meta.pinned": False}},
)
return _user_api_response(pinned=False)
@app.route("/api/undo", methods=["POST"]) @app.route("/api/undo", methods=["POST"])
@api_required @api_required
def api_undo(): def api_undo():
@ -1783,7 +1820,15 @@ def tags(tag):
def featured(): def featured():
if not is_api_request(): if not is_api_request():
abort(404) abort(404)
return jsonify(**activitypub.simple_build_ordered_collection("featured", [])) q = {
"box": Box.OUTBOX.value,
"type": ActivityType.CREATE.value,
"meta.deleted": False,
"meta.undo": False,
"meta.pinned": True,
}
data = [clean_activity(doc["activity"]["object"]) for doc in DB.activities.find(q)]
return jsonify(**activitypub.simple_build_ordered_collection("featured", data))
@app.route("/liked") @app.route("/liked")

View file

@ -237,13 +237,27 @@ a:hover {
.og-link { text-decoration: none; } .og-link { text-decoration: none; }
.og-link:hover { text-decoration: none; } .og-link:hover { text-decoration: none; }
.bar-item-no-hover { .bar-item-no-hover {
cursor: default;
background: $color-menu-background; background: $color-menu-background;
padding: 5px; padding: 5px;
color: $color-light; color: $color-light;
margin-right:5px; margin-right:5px;
border-radius:2px; border-radius:2px;
} }
.bar-item-no-hover:hover {
cursor: default;
}
.bar-item-pinned {
cursor: default;
background: $color-menu-background;
color: $color-light;
padding: 5px;
margin-right:5px;
border-radius:2px;
}
.bar-item-pinned:hover {
cursor: default;
}
.bar-item { .bar-item {
background: $color-menu-background; background: $color-menu-background;
padding: 5px; padding: 5px;

View file

@ -21,6 +21,16 @@
{% include "header.html" %} {% include "header.html" %}
<div id="notes"> <div id="notes">
{% for item in pinned %}
{% if item.meta.pinned %}
<p style="margin-left:65px;padding-bottom:5px;">
<span class="bar-item-pinned">pinned</span>
</p>
{% endif %}
{{ utils.display_note(item.activity.object, meta=item.meta, no_color=True) }}
{% endfor %}
{% for item in outbox_data %} {% for item in outbox_data %}
{% if item | has_type('Announce') %} {% if item | has_type('Announce') %}

View file

@ -105,8 +105,8 @@
{% elif meta.count_reply and session.logged_in %} {% elif meta.count_reply and session.logged_in %}
<a class ="bar-item" href="/admin/thread?oid={{aid}}"><strong>{{ meta.count_reply }}</strong> replies</a>{% endif %} <a class ="bar-item" href="/admin/thread?oid={{aid}}"><strong>{{ meta.count_reply }}</strong> replies</a>{% endif %}
{% if meta.count_boost and obj.id | is_from_outbox %}<a class ="bar-item" href="{{ obj.url | get_url }}"><strong>{{ meta.count_boost }}</strong> boosts</a>{% endif %} {% if not perma and meta.count_boost and obj.id | is_from_outbox %}<a class ="bar-item" href="{{ obj.url | get_url }}"><strong>{{ meta.count_boost }}</strong> boosts</a>{% endif %}
{% if meta.count_like and obj.id | is_from_outbox %}<a class ="bar-item" href="{{ obj.url | get_url }}"><strong>{{ meta.count_like }}</strong> likes</a>{% endif %} {% if not perma and meta.count_like and obj.id | is_from_outbox %}<a class ="bar-item" href="{{ obj.url | get_url }}"><strong>{{ meta.count_like }}</strong> likes</a>{% endif %}
{% if session.logged_in %} {% if session.logged_in %}
{% if ui%} {% if ui%}
@ -153,6 +153,22 @@
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
<button type="submit" class="bar-item">delete</button> <button type="submit" class="bar-item">delete</button>
</form> </form>
{% if meta.pinned %}
<form action="/api/note/unpin" class="action-form" method="POST">
<input type="hidden" name="redirect" value="{{ redir }}">
<input type="hidden" name="id" value="{{ obj.id }}">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
<button type="submit" class="bar-item">unpin</button>
</form>
{% else %}
<form action="/api/note/pin" class="action-form" method="POST">
<input type="hidden" name="redirect" value="{{ redir }}">
<input type="hidden" name="id" value="{{ obj.id }}">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
<button type="submit" class="bar-item">pin</button>
</form>
{% endif %}
{% else %} {% else %}
<form action="/api/block" class="action-form" method="POST"> <form action="/api/block" class="action-form" method="POST">
<input type="hidden" name="redirect" value="{{ redir }}"> <input type="hidden" name="redirect" value="{{ redir }}">