forked from mirrors/bookwyrm
Merge pull request #1485 from bookwyrm-social/notifications
Refactors notifications templates
This commit is contained in:
commit
eaa77906b2
16 changed files with 531 additions and 164 deletions
21
bookwyrm/static/js/block_href.js
Normal file
21
bookwyrm/static/js/block_href.js
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
/* exported BlockHref */
|
||||||
|
|
||||||
|
let BlockHref = new class {
|
||||||
|
constructor() {
|
||||||
|
document.querySelectorAll('[data-href]')
|
||||||
|
.forEach(t => t.addEventListener('click', this.followLink.bind(this)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Follow a fake link
|
||||||
|
*
|
||||||
|
* @param {Event} event
|
||||||
|
* @return {undefined}
|
||||||
|
*/
|
||||||
|
followLink(event) {
|
||||||
|
const url = event.currentTarget.dataset.href;
|
||||||
|
|
||||||
|
window.location.href = url;
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
|
|
@ -1,160 +0,0 @@
|
||||||
{% extends 'layout.html' %}
|
|
||||||
{% load i18n %}
|
|
||||||
{% load bookwyrm_tags %}
|
|
||||||
{% load humanize %}
|
|
||||||
|
|
||||||
{% block title %}{% trans "Notifications" %}{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<header class="columns">
|
|
||||||
<div class="column">
|
|
||||||
<h1 class="title">{% trans "Notifications" %}</h1>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<form name="clear" action="/notifications" method="POST" class="column is-narrow">
|
|
||||||
{% csrf_token %}
|
|
||||||
<button class="button is-danger is-light" type="submit" class="secondary">{% trans "Delete notifications" %}</button>
|
|
||||||
</form>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<div class="block">
|
|
||||||
<nav class="tabs">
|
|
||||||
<ul>
|
|
||||||
{% url 'notifications' as tab_url %}
|
|
||||||
<li {% if tab_url == request.path %}class="is-active"{% endif %}>
|
|
||||||
<a href="{{ tab_url }}">{% trans "All" %}</a>
|
|
||||||
</li>
|
|
||||||
{% url 'notifications' 'mentions' as tab_url %}
|
|
||||||
<li {% if tab_url == request.path %}class="is-active"{% endif %}>
|
|
||||||
<a href="{{ tab_url }}">{% trans "Mentions" %}</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="block">
|
|
||||||
{% for notification in notifications %}
|
|
||||||
{% related_status notification as related_status %}
|
|
||||||
<div class="notification {% if notification.id in unread %} is-primary{% endif %}">
|
|
||||||
<div class="columns is-mobile">
|
|
||||||
<div class="column is-narrow is-size-3 {% if notification.id in unread%}has-text-white{% else %}has-text-grey{% endif %}">
|
|
||||||
{% if notification.notification_type == 'MENTION' %}
|
|
||||||
<span class="icon icon-comment"></span>
|
|
||||||
{% elif notification.notification_type == 'REPLY' %}
|
|
||||||
<span class="icon icon-comments"></span>
|
|
||||||
{% elif notification.notification_type == 'FOLLOW' or notification.notification_type == 'FOLLOW_REQUEST' %}
|
|
||||||
<span class="icon icon-local"></span>
|
|
||||||
{% elif notification.notification_type == 'BOOST' %}
|
|
||||||
<span class="icon icon-boost"></span>
|
|
||||||
{% elif notification.notification_type == 'FAVORITE' %}
|
|
||||||
<span class="icon icon-heart"></span>
|
|
||||||
{% elif notification.notification_type == 'IMPORT' %}
|
|
||||||
<span class="icon icon-list"></span>
|
|
||||||
{% elif notification.notification_type == 'ADD' %}
|
|
||||||
<span class="icon icon-plus"></span>
|
|
||||||
{% elif notification.notification_type == 'REPORT' %}
|
|
||||||
<span class="icon icon-warning"></span>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
<div class="column is-clipped">
|
|
||||||
<div class="block">
|
|
||||||
<p>
|
|
||||||
{# DESCRIPTION #}
|
|
||||||
{% if notification.related_user %}
|
|
||||||
<a href="{{ notification.related_user.local_path }}">
|
|
||||||
{% include 'snippets/avatar.html' with user=notification.related_user %}
|
|
||||||
{{ notification.related_user.display_name }}
|
|
||||||
</a>
|
|
||||||
{% if notification.notification_type == 'FAVORITE' %}
|
|
||||||
{% if related_status.status_type == 'Review' %}
|
|
||||||
{% blocktrans with book_title=related_status.book.title related_path=related_status.local_path %}favorited your <a href="{{ related_path }}">review of <em>{{ book_title }}</em></a>{% endblocktrans %}
|
|
||||||
{% elif related_status.status_type == 'Comment' %}
|
|
||||||
{% blocktrans with book_title=related_status.book.title related_path=related_status.local_path %}favorited your <a href="{{ related_path }}">comment on <em>{{ book_title }}</em></a>{% endblocktrans %}
|
|
||||||
{% elif related_status.status_type == 'Quotation' %}
|
|
||||||
{% blocktrans with book_title=related_status.book.title related_path=related_status.local_path %}favorited your <a href="{{ related_path }}">quote from <em>{{ book_title }}</em></a>{% endblocktrans %}
|
|
||||||
{% else %}
|
|
||||||
{% blocktrans with related_path=related_status.local_path %}favorited your <a href="{{ related_path }}">status</a>{% endblocktrans %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% elif notification.notification_type == 'MENTION' %}
|
|
||||||
{% if related_status.status_type == 'Review' %}
|
|
||||||
{% blocktrans with related_path=related_status.local_path book_title=related_status.book.title %}mentioned you in a <a href="{{ related_path }}">review of <em>{{ book_title }}</em></a>{% endblocktrans %}
|
|
||||||
{% elif related_status.status_type == 'Comment' %}
|
|
||||||
{% blocktrans with related_path=related_status.local_path book_title=related_status.book.title %}mentioned you in a <a href="{{ related_path }}">comment on <em>{{ book_title }}</em></a>{% endblocktrans %}
|
|
||||||
{% elif related_status.status_type == 'Quotation' %}
|
|
||||||
{% blocktrans with related_path=related_status.local_path book_title=related_status.book.title %}mentioned you in a <a href="{{ related_path }}">quote from <em>{{ book_title }}</em></a>{% endblocktrans %}
|
|
||||||
{% else %}
|
|
||||||
{% blocktrans with related_path=related_status.local_path %}mentioned you in a <a href="{{ related_path }}">status</a>{% endblocktrans %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% elif notification.notification_type == 'REPLY' %}
|
|
||||||
{% if related_status.status_type == 'Review' %}
|
|
||||||
{% blocktrans with related_path=related_status.local_path parent_path=related_status.reply_parent.local_path book_title=related_status.reply_parent.book.title %}<a href="{{ related_path }}">replied</a> to your <a href="{{ parent_path }}">review of <em>{{ book_title }}</em></a>{% endblocktrans %}
|
|
||||||
{% elif related_status.status_type == 'Comment' %}
|
|
||||||
{% blocktrans with related_path=related_status.local_path parent_path=related_status.reply_parent.local_path book_title=related_status.reply_parent.book.title %}<a href="{{ related_path }}">replied</a> to your <a href="{{ parent_path }}">comment on <em>{{ book_title }}</em></a>{% endblocktrans %}
|
|
||||||
{% elif related_status.status_type == 'Quotation' %}
|
|
||||||
{% blocktrans with related_path=related_status.local_path parent_path=related_status.reply_parent.local_path book_title=related_status.reply_parent.book.title %}<a href="{{ related_path }}">replied</a> to your <a href="{{ parent_path }}">quote from <em>{{ book_title }}</em></a>{% endblocktrans %}
|
|
||||||
{% else %}
|
|
||||||
{% blocktrans with related_path=related_status.local_path parent_path=related_status.reply_parent.local_path %}<a href="{{ related_path }}">replied</a> to your <a href="{{ parent_path }}">status</a>{% endblocktrans %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% elif notification.notification_type == 'FOLLOW' %}
|
|
||||||
{% trans "followed you" %}
|
|
||||||
{% include 'snippets/follow_button.html' with user=notification.related_user %}
|
|
||||||
{% elif notification.notification_type == 'FOLLOW_REQUEST' %}
|
|
||||||
{% trans "sent you a follow request" %}
|
|
||||||
<div class="row shrink">
|
|
||||||
{% include 'snippets/follow_request_buttons.html' with user=notification.related_user %}
|
|
||||||
</div>
|
|
||||||
{% elif notification.notification_type == 'BOOST' %}
|
|
||||||
{% if related_status.status_type == 'Review' %}
|
|
||||||
{% blocktrans with related_path=related_status.local_path book_title=related_status.book.title %}boosted your <a href="{{ related_path }}">review of <em>{{ book_title }}</em></a>{% endblocktrans %}
|
|
||||||
{% elif related_status.status_type == 'Comment' %}
|
|
||||||
{% blocktrans with related_path=related_status.local_path book_title=related_status.book.title %}boosted your <a href="{{ related_path }}">comment on<em>{{ book_title }}</em></a>{% endblocktrans %}
|
|
||||||
{% elif related_status.status_type == 'Quotation' %}
|
|
||||||
{% blocktrans with related_path=related_status.local_path book_title=related_status.book.title %}boosted your <a href="{{ related_path }}">quote from <em>{{ book_title }}</em></a>{% endblocktrans %}
|
|
||||||
{% else %}
|
|
||||||
{% blocktrans with related_path=related_status.local_path %}boosted your <a href="{{ related_path }}">status</a>{% endblocktrans %}
|
|
||||||
{% endif %}
|
|
||||||
{% elif notification.notification_type == 'ADD' %}
|
|
||||||
{% if notification.related_list_item.approved %}
|
|
||||||
{% blocktrans with book_path=notification.related_list_item.book.local_path book_title=notification.related_list_item.book.title list_path=notification.related_list_item.book_list.local_path list_name=notification.related_list_item.book_list.name %} added <em><a href="{{ book_path }}">{{ book_title }}</a></em> to your list "<a href="{{ list_path }}">{{ list_name }}</a>"{% endblocktrans %}
|
|
||||||
{% else %}
|
|
||||||
{% blocktrans with book_path=notification.related_list_item.book.local_path book_title=notification.related_list_item.book.title list_path=notification.related_list_item.book_list.local_path list_name=notification.related_list_item.book_list.name %} suggested adding <em><a href="{{ book_path }}">{{ book_title }}</a></em> to your list "<a href="{{ list_path }}/curate">{{ list_name }}</a>"{% endblocktrans %}
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
|
||||||
{% elif notification.related_import %}
|
|
||||||
{% url 'import-status' notification.related_import.id as url %}
|
|
||||||
{% blocktrans %}Your <a href="{{ url }}">import</a> completed.{% endblocktrans %}
|
|
||||||
{% elif notification.related_report %}
|
|
||||||
{% url 'settings-report' notification.related_report.id as path %}
|
|
||||||
{% blocktrans with related_id=path %}A new <a href="{{ path }}">report</a> needs moderation.{% endblocktrans %}
|
|
||||||
{% endif %}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
{% if related_status %}
|
|
||||||
<div class="block">
|
|
||||||
{# PREVIEW #}
|
|
||||||
<div class="notification py-2 {% if notification.id in unread %}is-primary is-light{% else %}has-background-white{% if notification.notification_type == 'REPLY' or notification.notification_type == 'MENTION' %} has-text-black{% else %}-bis has-text-grey-dark{% endif %}{% endif %}">
|
|
||||||
<div class="columns">
|
|
||||||
<div class="column is-clipped">
|
|
||||||
{% include 'snippets/status_preview.html' with status=related_status %}
|
|
||||||
</div>
|
|
||||||
<div class="column is-narrow {% if notification.notification_type == 'REPLY' or notification.notification_type == 'MENTION' %}has-text-black{% else %}has-text-grey-dark{% endif %}">
|
|
||||||
{{ related_status.published_date|timesince }}
|
|
||||||
{% include 'snippets/privacy-icons.html' with item=related_status %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
{% if not notifications %}
|
|
||||||
<p>{% trans "You're all caught up!" %}</p>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
20
bookwyrm/templates/notifications/item.html
Normal file
20
bookwyrm/templates/notifications/item.html
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
{# load the right template #}
|
||||||
|
{% if notification.notification_type == 'MENTION' %}
|
||||||
|
{% include 'notifications/items/mention.html' %}
|
||||||
|
{% elif notification.notification_type == 'REPLY' %}
|
||||||
|
{% include 'notifications/items/reply.html' %}
|
||||||
|
{% elif notification.notification_type == 'BOOST' %}
|
||||||
|
{% include 'notifications/items/boost.html' %}
|
||||||
|
{% elif notification.notification_type == 'FAVORITE' %}
|
||||||
|
{% include 'notifications/items/fav.html' %}
|
||||||
|
{% elif notification.notification_type == 'FOLLOW' %}
|
||||||
|
{% include 'notifications/items/follow.html' %}
|
||||||
|
{% elif notification.notification_type == 'FOLLOW_REQUEST' %}
|
||||||
|
{% include 'notifications/items/follow_request.html' %}
|
||||||
|
{% elif notification.notification_type == 'IMPORT' %}
|
||||||
|
{% include 'notifications/items/import.html' %}
|
||||||
|
{% elif notification.notification_type == 'ADD' %}
|
||||||
|
{% include 'notifications/items/add.html' %}
|
||||||
|
{% elif notification.notification_type == 'REPORT' %}
|
||||||
|
{% include 'notifications/items/report.html' %}
|
||||||
|
{% endif %}
|
42
bookwyrm/templates/notifications/items/add.html
Normal file
42
bookwyrm/templates/notifications/items/add.html
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
{% extends 'notifications/items/item_layout.html' %}
|
||||||
|
|
||||||
|
{% load i18n %}
|
||||||
|
{% load utilities %}
|
||||||
|
|
||||||
|
{% block primary_link %}{% spaceless %}
|
||||||
|
{% if notification.related_list_item.approved %}
|
||||||
|
{{ notification.related_list_item.book_list.local_path }}
|
||||||
|
{% else %}
|
||||||
|
{% url 'list-curate' notification.related_list_item.book_list.id %}
|
||||||
|
{% endif %}
|
||||||
|
{% endspaceless %}{% endblock %}
|
||||||
|
|
||||||
|
{% block icon %}
|
||||||
|
<span class="icon icon-plus"></span>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block description %}
|
||||||
|
{% with book_path=notification.related_list_item.book.local_path %}
|
||||||
|
{% with book_title=notification.related_list_item.book|book_title %}
|
||||||
|
{% with list_name=notification.related_list_item.book_list.name %}
|
||||||
|
|
||||||
|
{% if notification.related_list_item.approved %}
|
||||||
|
{% blocktrans trimmed with list_path=notification.related_list_item.book_list.local_path %}
|
||||||
|
|
||||||
|
added <em><a href="{{ book_path }}">{{ book_title }}</a></em> to your list "<a href="{{ list_path }}">{{ list_name }}</a>"
|
||||||
|
|
||||||
|
{% endblocktrans %}
|
||||||
|
{% else %}
|
||||||
|
{% url 'list-curate' notification.related_list_item.book_list.id as list_path %}
|
||||||
|
{% blocktrans trimmed with list_path=list_path %}
|
||||||
|
|
||||||
|
suggested adding <em><a href="{{ book_path }}">{{ book_title }}</a></em> to your list "<a href="{{ list_path }}">{{ list_name }}</a>"
|
||||||
|
|
||||||
|
{% endblocktrans %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% endwith %}
|
||||||
|
{% endwith %}
|
||||||
|
{% endwith %}
|
||||||
|
{% endblock %}
|
||||||
|
|
61
bookwyrm/templates/notifications/items/boost.html
Normal file
61
bookwyrm/templates/notifications/items/boost.html
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
{% extends 'notifications/items/item_layout.html' %}
|
||||||
|
|
||||||
|
{% load i18n %}
|
||||||
|
{% load utilities %}
|
||||||
|
|
||||||
|
{% block primary_link %}{% spaceless %}
|
||||||
|
{{ notification.related_status.local_path }}
|
||||||
|
{% endspaceless %}{% endblock %}
|
||||||
|
|
||||||
|
{% block icon %}
|
||||||
|
<span class="icon icon-boost"></span>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block description %}
|
||||||
|
{% with related_status.book|book_title as book_title %}
|
||||||
|
{% with related_status.local_path as related_path %}
|
||||||
|
|
||||||
|
{% if related_status.status_type == 'Review' %}
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
|
||||||
|
boosted your <a href="{{ related_path }}">review of <em>{{ book_title }}</em></a>
|
||||||
|
|
||||||
|
{% endblocktrans %}
|
||||||
|
{% elif related_status.status_type == 'Comment' %}
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
|
||||||
|
boosted your <a href="{{ related_path }}">comment on<em>{{ book_title }}</em></a>
|
||||||
|
|
||||||
|
{% endblocktrans %}
|
||||||
|
{% elif related_status.status_type == 'Quotation' %}
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
|
||||||
|
boosted your <a href="{{ related_path }}">quote from <em>{{ book_title }}</em></a>
|
||||||
|
|
||||||
|
{% endblocktrans %}
|
||||||
|
{% else %}
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
|
||||||
|
boosted your <a href="{{ related_path }}">status</a>
|
||||||
|
|
||||||
|
{% endblocktrans %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% endwith %}
|
||||||
|
{% endwith %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block preview %}
|
||||||
|
<div class="notification py-2 {% if notification.id in unread %}is-primary is-light{% else %}has-background-white has-text-grey-dark{% endif %}">
|
||||||
|
<div class="columns">
|
||||||
|
<div class="column is-clipped">
|
||||||
|
{% include 'snippets/status_preview.html' with status=related_status %}
|
||||||
|
</div>
|
||||||
|
<div class="column is-narrow has-grey-dark">
|
||||||
|
{{ related_status.published_date|timesince }}
|
||||||
|
{% include 'snippets/privacy-icons.html' with item=related_status %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
61
bookwyrm/templates/notifications/items/fav.html
Normal file
61
bookwyrm/templates/notifications/items/fav.html
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
{% extends 'notifications/items/item_layout.html' %}
|
||||||
|
|
||||||
|
{% load i18n %}
|
||||||
|
{% load utilities %}
|
||||||
|
|
||||||
|
{% block primary_link %}{% spaceless %}
|
||||||
|
{{ notification.related_status.local_path }}
|
||||||
|
{% endspaceless %}{% endblock %}
|
||||||
|
|
||||||
|
{% block icon %}
|
||||||
|
<span class="icon icon-heart"></span>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block description %}
|
||||||
|
{% with related_status.book|book_title as book_title %}
|
||||||
|
{% with related_status.local_path as related_path %}
|
||||||
|
|
||||||
|
{% if related_status.status_type == 'Review' %}
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
|
||||||
|
favorited your <a href="{{ related_path }}">review of <em>{{ book_title }}</em></a>
|
||||||
|
|
||||||
|
{% endblocktrans %}
|
||||||
|
{% elif related_status.status_type == 'Comment' %}
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
|
||||||
|
favorited your <a href="{{ related_path }}">comment on<em>{{ book_title }}</em></a>
|
||||||
|
|
||||||
|
{% endblocktrans %}
|
||||||
|
{% elif related_status.status_type == 'Quotation' %}
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
|
||||||
|
favorited your <a href="{{ related_path }}">quote from <em>{{ book_title }}</em></a>
|
||||||
|
|
||||||
|
{% endblocktrans %}
|
||||||
|
{% else %}
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
|
||||||
|
favorited your <a href="{{ related_path }}">status</a>
|
||||||
|
|
||||||
|
{% endblocktrans %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% endwith %}
|
||||||
|
{% endwith %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block preview %}
|
||||||
|
<div class="notification py-2 {% if notification.id in unread %}is-primary is-light{% else %}has-background-white has-text-grey-dark{% endif %}">
|
||||||
|
<div class="columns">
|
||||||
|
<div class="column is-clipped">
|
||||||
|
{% include 'snippets/status_preview.html' with status=related_status %}
|
||||||
|
</div>
|
||||||
|
<div class="column is-narrow has-grey-dark">
|
||||||
|
{{ related_status.published_date|timesince }}
|
||||||
|
{% include 'snippets/privacy-icons.html' with item=related_status %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
17
bookwyrm/templates/notifications/items/follow.html
Normal file
17
bookwyrm/templates/notifications/items/follow.html
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
{% extends 'notifications/items/item_layout.html' %}
|
||||||
|
|
||||||
|
{% load i18n %}
|
||||||
|
{% load utilities %}
|
||||||
|
|
||||||
|
{% block primary_link %}{% spaceless %}
|
||||||
|
{{ notification.related_user.local_path }}
|
||||||
|
{% endspaceless %}{% endblock %}
|
||||||
|
|
||||||
|
{% block icon %}
|
||||||
|
<span class="icon icon-local"></span>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block description %}
|
||||||
|
{% trans "followed you" %}
|
||||||
|
{% include 'snippets/follow_button.html' with user=notification.related_user %}
|
||||||
|
{% endblock %}
|
15
bookwyrm/templates/notifications/items/follow_request.html
Normal file
15
bookwyrm/templates/notifications/items/follow_request.html
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{% extends 'notifications/items/item_layout.html' %}
|
||||||
|
|
||||||
|
{% load i18n %}
|
||||||
|
{% load utilities %}
|
||||||
|
|
||||||
|
{% block icon %}
|
||||||
|
<span class="icon icon-local"></span>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block description %}
|
||||||
|
{% trans "sent you a follow request" %}
|
||||||
|
<div class="row shrink">
|
||||||
|
{% include 'snippets/follow_request_buttons.html' with user=notification.related_user %}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
15
bookwyrm/templates/notifications/items/import.html
Normal file
15
bookwyrm/templates/notifications/items/import.html
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{% extends 'notifications/items/item_layout.html' %}
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
{% block primary_link %}{% spaceless %}
|
||||||
|
{% url 'import-status' notification.related_import.id %}
|
||||||
|
{% endspaceless %}{% endblock %}
|
||||||
|
|
||||||
|
{% block icon %}
|
||||||
|
<span class="icon icon-list"></span>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block description %}
|
||||||
|
{% url 'import-status' notification.related_import.id as url %}
|
||||||
|
{% blocktrans %}Your <a href="{{ url }}">import</a> completed.{% endblocktrans %}
|
||||||
|
{% endblock %}
|
29
bookwyrm/templates/notifications/items/item_layout.html
Normal file
29
bookwyrm/templates/notifications/items/item_layout.html
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
{% load humanize %}
|
||||||
|
{% load bookwyrm_tags %}
|
||||||
|
{% related_status notification as related_status %}
|
||||||
|
<div class="notification is-clickable {% if notification.id in unread %} is-primary{% endif %}" data-href="{% block primary_link %}{% endblock %}">
|
||||||
|
<div class="columns is-mobile">
|
||||||
|
<div class="column is-narrow is-size-3 {% if notification.id in unread%}has-text-white{% else %}has-text-grey{% endif %}">
|
||||||
|
{% block icon %}{% endblock %}
|
||||||
|
</div>
|
||||||
|
<div class="column is-clipped">
|
||||||
|
<div class="block">
|
||||||
|
<p>
|
||||||
|
{% if notification.related_user %}
|
||||||
|
<a href="{{ notification.related_user.local_path }}">
|
||||||
|
{% include 'snippets/avatar.html' with user=notification.related_user %}
|
||||||
|
{{ notification.related_user.display_name }}
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
|
{% block description %}{% endblock %}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
{% if related_status %}
|
||||||
|
<div class="block">
|
||||||
|
{% block preview %}{% endblock %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
62
bookwyrm/templates/notifications/items/mention.html
Normal file
62
bookwyrm/templates/notifications/items/mention.html
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
{% extends 'notifications/items/item_layout.html' %}
|
||||||
|
|
||||||
|
{% load i18n %}
|
||||||
|
{% load utilities %}
|
||||||
|
|
||||||
|
{% block primary_link %}{% spaceless %}
|
||||||
|
{{ notification.related_status.local_path }}
|
||||||
|
{% endspaceless %}{% endblock %}
|
||||||
|
|
||||||
|
{% block icon %}
|
||||||
|
<span class="icon icon-comment"></span>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block description %}
|
||||||
|
{% with related_status.book|book_title as book_title %}
|
||||||
|
{% with related_status.local_path as related_path %}
|
||||||
|
|
||||||
|
{% if related_status.status_type == 'Review' %}
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
|
||||||
|
mentioned you in a <a href="{{ related_path }}">review of <em>{{ book_title }}</em></a>
|
||||||
|
|
||||||
|
{% endblocktrans %}
|
||||||
|
{% elif related_status.status_type == 'Comment' %}
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
|
||||||
|
mentioned you in a <a href="{{ related_path }}">comment on <em>{{ book_title }}</em></a>
|
||||||
|
|
||||||
|
{% endblocktrans %}
|
||||||
|
{% elif related_status.status_type == 'Quotation' %}
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
|
||||||
|
mentioned you in a <a href="{{ related_path }}">quote from <em>{{ book_title }}</em></a>
|
||||||
|
|
||||||
|
{% endblocktrans %}
|
||||||
|
{% else %}
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
|
||||||
|
mentioned you in a <a href="{{ related_path }}">status</a>
|
||||||
|
|
||||||
|
{% endblocktrans %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% endwith %}
|
||||||
|
{% endwith %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block preview %}
|
||||||
|
<div class="notification py-2 {% if notification.id in unread %}is-primary is-light{% else %}has-background-white has-text-black{% endif %}">
|
||||||
|
<div class="columns">
|
||||||
|
<div class="column is-clipped">
|
||||||
|
{% include 'snippets/status_preview.html' with status=related_status %}
|
||||||
|
</div>
|
||||||
|
<div class="column is-narrow has-text-black">
|
||||||
|
{{ related_status.published_date|timesince }}
|
||||||
|
{% include 'snippets/privacy-icons.html' with item=related_status %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
65
bookwyrm/templates/notifications/items/reply.html
Normal file
65
bookwyrm/templates/notifications/items/reply.html
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
{% extends 'notifications/items/item_layout.html' %}
|
||||||
|
|
||||||
|
{% load i18n %}
|
||||||
|
{% load utilities %}
|
||||||
|
|
||||||
|
{% block primary_link %}{% spaceless %}
|
||||||
|
{{ notification.related_status.local_path }}
|
||||||
|
{% endspaceless %}{% endblock %}
|
||||||
|
|
||||||
|
{% block icon %}
|
||||||
|
<span class="icon icon-comments"></span>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block description %}
|
||||||
|
{% with related_status.reply_parent.book|book_title as book_title %}
|
||||||
|
{% with related_status.local_path as related_path %}
|
||||||
|
{% with related_status.reply_parent.local_path as parent_path %}
|
||||||
|
|
||||||
|
{% if related_status.reply_parent.status_type == 'Review' %}
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
|
||||||
|
<a href="{{ related_path }}">replied</a> to your <a href="{{ parent_path }}">review of <em>{{ book_title }}</em></a>
|
||||||
|
|
||||||
|
{% endblocktrans %}
|
||||||
|
{% elif related_status.reply_parent.status_type == 'Comment' %}
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
|
||||||
|
<a href="{{ related_path }}">replied</a> to your <a href="{{ parent_path }}">comment on <em>{{ book_title }}</em></a>
|
||||||
|
|
||||||
|
{% endblocktrans %}
|
||||||
|
{% elif related_status.reply_parent.status_type == 'Quotation' %}
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
|
||||||
|
<a href="{{ related_path }}">replied</a> to your <a href="{{ parent_path }}">quote from <em>{{ book_title }}</em></a>
|
||||||
|
|
||||||
|
{% endblocktrans %}
|
||||||
|
{% else %}
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
|
||||||
|
<a href="{{ related_path }}">replied</a> to your <a href="{{ parent_path }}">status</a>
|
||||||
|
|
||||||
|
{% endblocktrans %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% endwith %}
|
||||||
|
{% endwith %}
|
||||||
|
{% endwith %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{% block preview %}
|
||||||
|
<div class="notification py-2 {% if notification.id in unread %}is-primary is-light{% else %}has-background-white has-text-black{% endif %}">
|
||||||
|
<div class="columns">
|
||||||
|
<div class="column is-clipped">
|
||||||
|
{% include 'snippets/status_preview.html' with status=related_status %}
|
||||||
|
</div>
|
||||||
|
<div class="column is-narrow has-text-black">
|
||||||
|
{{ related_status.published_date|timesince }}
|
||||||
|
{% include 'snippets/privacy-icons.html' with item=related_status %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
16
bookwyrm/templates/notifications/items/report.html
Normal file
16
bookwyrm/templates/notifications/items/report.html
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
{% extends 'notifications/items/item_layout.html' %}
|
||||||
|
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
{% block primary_link %}{% spaceless %}
|
||||||
|
{% url 'settings-report' notification.related_report.id %}
|
||||||
|
{% endspaceless %}{% endblock %}
|
||||||
|
|
||||||
|
{% block icon %}
|
||||||
|
<span class="icon icon-warning"></span>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block description %}
|
||||||
|
{% url 'settings-report' notification.related_report.id as path %}
|
||||||
|
{% blocktrans %}A new <a href="{{ path }}">report</a> needs moderation.{% endblocktrans %}
|
||||||
|
{% endblock %}
|
52
bookwyrm/templates/notifications/notifications_page.html
Normal file
52
bookwyrm/templates/notifications/notifications_page.html
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
{% extends 'layout.html' %}
|
||||||
|
{% load i18n %}
|
||||||
|
{% load static %}
|
||||||
|
|
||||||
|
{% block title %}{% trans "Notifications" %}{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<header class="columns is-mobile">
|
||||||
|
<div class="column">
|
||||||
|
<h1 class="title">{% trans "Notifications" %}</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form name="clear" action="/notifications" method="POST" class="column is-narrow">
|
||||||
|
{% csrf_token %}
|
||||||
|
{% spaceless %}
|
||||||
|
<button class="button is-danger is-light" type="submit">
|
||||||
|
<span class="icon icon-x m-0-mobile" aria-hidden="true"></span>
|
||||||
|
<span class="is-sr-only-mobile">{% trans "Delete notifications" %}</span>
|
||||||
|
</button>
|
||||||
|
{% endspaceless %}
|
||||||
|
</form>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="block">
|
||||||
|
<nav class="tabs">
|
||||||
|
<ul>
|
||||||
|
{% url 'notifications' as tab_url %}
|
||||||
|
<li {% if tab_url == request.path %}class="is-active"{% endif %}>
|
||||||
|
<a href="{{ tab_url }}">{% trans "All" %}</a>
|
||||||
|
</li>
|
||||||
|
{% url 'notifications' 'mentions' as tab_url %}
|
||||||
|
<li {% if tab_url == request.path %}class="is-active"{% endif %}>
|
||||||
|
<a href="{{ tab_url }}">{% trans "Mentions" %}</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="block">
|
||||||
|
{% for notification in notifications %}
|
||||||
|
{% include 'notifications/item.html' %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% if not notifications %}
|
||||||
|
<p>{% trans "You're all caught up!" %}</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block scripts %}
|
||||||
|
<script src="{% static "js/block_href.js" %}?v={{ js_cache }}"></script>
|
||||||
|
{% endblock %}
|
|
@ -6,6 +6,7 @@ from django.test.client import RequestFactory
|
||||||
|
|
||||||
from bookwyrm import models
|
from bookwyrm import models
|
||||||
from bookwyrm import views
|
from bookwyrm import views
|
||||||
|
from bookwyrm.tests.validate_html import validate_html
|
||||||
|
|
||||||
|
|
||||||
class NotificationViews(TestCase):
|
class NotificationViews(TestCase):
|
||||||
|
@ -24,16 +25,53 @@ class NotificationViews(TestCase):
|
||||||
local=True,
|
local=True,
|
||||||
localname="mouse",
|
localname="mouse",
|
||||||
)
|
)
|
||||||
|
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
|
||||||
|
self.status = models.Status.objects.create(
|
||||||
|
content="hi",
|
||||||
|
user=self.local_user,
|
||||||
|
)
|
||||||
models.SiteSettings.objects.create()
|
models.SiteSettings.objects.create()
|
||||||
|
|
||||||
def test_notifications_page(self):
|
def test_notifications_page_empty(self):
|
||||||
"""there are so many views, this just makes sure it LOADS"""
|
"""there are so many views, this just makes sure it LOADS"""
|
||||||
view = views.Notifications.as_view()
|
view = views.Notifications.as_view()
|
||||||
request = self.factory.get("")
|
request = self.factory.get("")
|
||||||
request.user = self.local_user
|
request.user = self.local_user
|
||||||
result = view(request)
|
result = view(request)
|
||||||
self.assertIsInstance(result, TemplateResponse)
|
self.assertIsInstance(result, TemplateResponse)
|
||||||
result.render()
|
validate_html(result.render())
|
||||||
|
self.assertEqual(result.status_code, 200)
|
||||||
|
|
||||||
|
def test_notifications_page_notifications(self):
|
||||||
|
"""there are so many views, this just makes sure it LOADS"""
|
||||||
|
models.Notification.objects.create(
|
||||||
|
user=self.local_user,
|
||||||
|
notification_type="FAVORITE",
|
||||||
|
related_status=self.status,
|
||||||
|
)
|
||||||
|
models.Notification.objects.create(
|
||||||
|
user=self.local_user,
|
||||||
|
notification_type="BOOST",
|
||||||
|
related_status=self.status,
|
||||||
|
)
|
||||||
|
models.Notification.objects.create(
|
||||||
|
user=self.local_user,
|
||||||
|
notification_type="MENTION",
|
||||||
|
related_status=self.status,
|
||||||
|
)
|
||||||
|
self.status.reply_parent = self.status
|
||||||
|
self.status.save(broadcast=False)
|
||||||
|
models.Notification.objects.create(
|
||||||
|
user=self.local_user,
|
||||||
|
notification_type="REPLY",
|
||||||
|
related_status=self.status,
|
||||||
|
)
|
||||||
|
view = views.Notifications.as_view()
|
||||||
|
request = self.factory.get("")
|
||||||
|
request.user = self.local_user
|
||||||
|
result = view(request)
|
||||||
|
self.assertIsInstance(result, TemplateResponse)
|
||||||
|
validate_html(result.render())
|
||||||
self.assertEqual(result.status_code, 200)
|
self.assertEqual(result.status_code, 200)
|
||||||
|
|
||||||
def test_clear_notifications(self):
|
def test_clear_notifications(self):
|
||||||
|
|
|
@ -13,7 +13,20 @@ class Notifications(View):
|
||||||
|
|
||||||
def get(self, request, notification_type=None):
|
def get(self, request, notification_type=None):
|
||||||
"""people are interacting with you, get hyped"""
|
"""people are interacting with you, get hyped"""
|
||||||
notifications = request.user.notification_set.all().order_by("-created_date")
|
notifications = (
|
||||||
|
request.user.notification_set.all()
|
||||||
|
.order_by("-created_date")
|
||||||
|
.select_related(
|
||||||
|
"related_status",
|
||||||
|
"related_status__reply_parent",
|
||||||
|
"related_import",
|
||||||
|
"related_report",
|
||||||
|
"related_user",
|
||||||
|
"related_book",
|
||||||
|
"related_list_item",
|
||||||
|
"related_list_item__book",
|
||||||
|
)
|
||||||
|
)
|
||||||
if notification_type == "mentions":
|
if notification_type == "mentions":
|
||||||
notifications = notifications.filter(
|
notifications = notifications.filter(
|
||||||
notification_type__in=["REPLY", "MENTION", "TAG"]
|
notification_type__in=["REPLY", "MENTION", "TAG"]
|
||||||
|
@ -24,7 +37,7 @@ class Notifications(View):
|
||||||
"unread": unread,
|
"unread": unread,
|
||||||
}
|
}
|
||||||
notifications.update(read=True)
|
notifications.update(read=True)
|
||||||
return TemplateResponse(request, "notifications.html", data)
|
return TemplateResponse(request, "notifications/notifications_page.html", data)
|
||||||
|
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
"""permanently delete notification for user"""
|
"""permanently delete notification for user"""
|
||||||
|
|
Loading…
Reference in a new issue