395 lines
19 KiB
Twig
395 lines
19 KiB
Twig
{% macro user_card(user) %}
|
|
<div class="usercard"{% if user.user_colour is defined %} style="{{ user.user_colour|html_colour('--accent-colour') }}"{% endif %}>
|
|
<div class="usercard__background"></div>
|
|
|
|
<div class="usercard__header">
|
|
<a class="usercard__header__link" href="{{ url('user-profile', {'user': user.user_id}) }}"></a>
|
|
|
|
<div class="usercard__header__container">
|
|
<div class="avatar usercard__header__avatar"
|
|
style="background-image:url('{{ url('user-avatar', {'user': user.user_id, 'res': 120}) }}')">
|
|
</div>
|
|
|
|
<div class="usercard__header__details">
|
|
<div class="usercard__header__username"{% if user.user_colour is defined %} style="{{ user.user_colour|html_colour }}"{% endif %}>
|
|
{{ user.username }}
|
|
</div>
|
|
|
|
{% if user.user_title is defined and user.user_title is not empty %}
|
|
<div class="usercard__header__title">
|
|
{{ user.user_title }}
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if user.user_country|default('XX') != 'XX' %}
|
|
<div class="usercard__header__country">
|
|
<div class="flag flag--{{ user.user_country|lower }}"></div>
|
|
<div class="usercard__header__country__name">
|
|
{{ user.user_country|country_name }}
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="usercard__container">
|
|
<div class="usercard__stats">
|
|
{% if user.user_count_following|default(0) > 0 %}
|
|
<a class="usercard__stat" href="{{ url('user-profile-following', {'user': user.user_id}) }}">
|
|
<div class="usercard__stat__name">
|
|
Following
|
|
</div>
|
|
<div class="usercard__stat__value">
|
|
{{ user.user_count_following|number_format }}
|
|
</div>
|
|
</a>
|
|
{% endif %}
|
|
|
|
{% if user.user_count_followers|default(0) > 0 %}
|
|
<a class="usercard__stat" href="{{ url('user-profile-followers', {'user': user.user_id}) }}">
|
|
<div class="usercard__stat__name">
|
|
Followers
|
|
</div>
|
|
<div class="usercard__stat__value">
|
|
{{ user.user_count_followers|number_format }}
|
|
</div>
|
|
</a>
|
|
{% endif %}
|
|
|
|
{% if user.user_count_topics|default(0) > 0 %}
|
|
<a class="usercard__stat" href="{{ url('user-profile-forum-topics', {'user': user.user_id}) }}">
|
|
<div class="usercard__stat__name">
|
|
Topics
|
|
</div>
|
|
<div class="usercard__stat__value">
|
|
{{ user.user_count_topics|number_format }}
|
|
</div>
|
|
</a>
|
|
{% endif %}
|
|
|
|
{% if user.user_count_posts|default(0) > 0 %}
|
|
<a class="usercard__stat" href="{{ url('user-profile-forum-posts', {'user': user.user_id}) }}">
|
|
<div class="usercard__stat__name">
|
|
Posts
|
|
</div>
|
|
<div class="usercard__stat__value">
|
|
{{ user.user_count_posts|number_format }}
|
|
</div>
|
|
</a>
|
|
{% endif %}
|
|
</div>
|
|
|
|
<div class="usercard__dates">
|
|
{% if user.user_created is defined %}
|
|
<div class="usercard__date" title="{{ user.user_created|date('r') }}">
|
|
Joined <time datetime="{{ user.user_created|date('c') }}">{{ user.user_created|time_diff }}</time>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if user.user_active is defined %}
|
|
{% if user.user_active is null %}
|
|
<div class="usercard__date">
|
|
Never logged in
|
|
</div>
|
|
{% else %}
|
|
<div class="usercard__date" title="{{ user.user_active|date('r') }}">
|
|
Last seen <time datetime="{{ user.user_active|date('c') }}">{{ user.user_active|time_diff }}</time>
|
|
</div>
|
|
{% endif %}
|
|
{% endif %}
|
|
</div>
|
|
|
|
<div class="usercard__actions">
|
|
<a class="usercard__action" href="{{ url('user-profile', {'user': user.user_id}) }}" title="View Profile">
|
|
<i class="fas fa-user"></i>
|
|
</a>
|
|
|
|
{% if user.current_user_id|default(0) != 0 and user.current_user_id != user.user_id %}
|
|
{% set is_following = user.user_is_following|default(false) %}
|
|
|
|
<a class="usercard__action js-user-relation-action" href="{{ url('user-relation-follow', {'user': user.user_id}) }}" title="{{ is_following ? 'Unfollow' : 'Follow' }}"
|
|
data-relation-user="{{ user.user_id }}" data-relation-type="{{ constant(is_following ? 'MSZ_USER_RELATION_NONE' : 'MSZ_USER_RELATION_FOLLOW') }}">
|
|
<i class="fas fa-user-{{ is_following ? 'minus' : 'plus' }}"></i>
|
|
</a>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endmacro %}
|
|
|
|
{% macro user_session(session, is_current_session) %}
|
|
{% from '_layout/input.twig' import input_hidden, input_csrf, input_checkbox_raw %}
|
|
{% set browser = get_browser(session.session_user_agent) %}
|
|
|
|
<div class="settings__session{% if is_current_session %} settings__session--current{% endif %}" id="session-{{ session.session_id }}">
|
|
<div class="settings__session__container">
|
|
<div class="settings__session__important">
|
|
<div class="flag flag--{{ session.session_country|lower }} settings__session__flag" title="{{ session.session_country|country_name }}">{{ session.session_country }}</div>
|
|
|
|
<div class="settings__session__description">
|
|
{{ browser.browser }} on {{ browser.platform }}
|
|
</div>
|
|
|
|
<form class="settings__session__actions" method="post" action="{{ url('settings-sessions') }}">
|
|
{{ input_csrf('user_session') }}
|
|
{{ input_hidden('session[]', session.session_id) }}
|
|
|
|
<button class="settings__session__action" title="{{ is_current_session ? 'Logout' : 'End Session' }}">
|
|
{% if is_current_session %}
|
|
<i class="fas fa-sign-out-alt"></i>
|
|
{% else %}
|
|
<i class="fas fa-times-circle"></i>
|
|
{% endif %}
|
|
</button>
|
|
</form>
|
|
</div>
|
|
|
|
<div class="settings__session__details">
|
|
<div class="settings__session__detail">
|
|
<div class="settings__session__detail__title">
|
|
Created from IP
|
|
</div>
|
|
<div class="settings__session__detail__value">
|
|
{{ session.session_ip }}
|
|
</div>
|
|
</div>
|
|
|
|
{% if session.session_ip_last is not null %}
|
|
<div class="settings__session__detail">
|
|
<div class="settings__session__detail__title">
|
|
Last used from IP
|
|
</div>
|
|
<div class="settings__session__detail__value">
|
|
{{ session.session_ip_last }}
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<div class="settings__session__detail" title="{{ session.session_created|date('r') }}">
|
|
<div class="settings__session__detail__title">
|
|
Created
|
|
</div>
|
|
<time class="settings__session__detail__value" datetime="{{ session.session_created|date('c') }}">
|
|
{{ session.session_created|time_diff }}
|
|
</time>
|
|
</div>
|
|
|
|
<div class="settings__session__detail" title="{{ session.session_expires|date('r') }}">
|
|
<div class="settings__session__detail__title">
|
|
Expires{% if not session.session_expires_bump %} (static){% endif %}
|
|
</div>
|
|
<time class="settings__session__detail__value" datetime="{{ session.session_expires|date('c') }}">
|
|
{{ session.session_expires|time_diff }}
|
|
</time>
|
|
</div>
|
|
|
|
{% if session.session_active is not null %}
|
|
<div class="settings__session__detail" title="{{ session.session_active|date('r') }}">
|
|
<div class="settings__session__detail__title">
|
|
Last Active
|
|
</div>
|
|
<time class="settings__session__detail__value" datetime="{{ session.session_active|date('c') }}">
|
|
{{ session.session_active|time_diff }}
|
|
</time>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<div class="settings__session__detail">
|
|
<div class="settings__session__detail__title">
|
|
User Agent
|
|
</div>
|
|
<div class="settings__session__detail__value">
|
|
{{ session.session_user_agent|length > 0 ? session.session_user_agent : 'None' }}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endmacro %}
|
|
|
|
{% macro user_login_attempt(attempt) %}
|
|
{% set browser = get_browser(attempt.attempt_user_agent) %}
|
|
|
|
<div class="settings__login-attempt{% if not attempt.attempt_success %} settings__login-attempt--failed{% endif %}" id="login-attempt-{{ attempt.attempt_id }}">
|
|
<div class="settings__login-attempt__container">
|
|
<div class="settings__login-attempt__important">
|
|
<div class="flag flag--{{ attempt.attempt_country|lower }} settings__login-attempt__flag" title="{{ attempt.attempt_country|country_name }}">{{ attempt.attempt_country }}</div>
|
|
|
|
<div class="settings__login-attempt__description">
|
|
{{ browser.browser }} on {{ browser.platform }}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="settings__login-attempt__details">
|
|
<div class="settings__login-attempt__detail">
|
|
<div class="settings__login-attempt__detail__title">
|
|
IP Address
|
|
</div>
|
|
<div class="settings__login-attempt__detail__value">
|
|
{{ attempt.attempt_ip }}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="settings__login-attempt__detail">
|
|
<div class="settings__login-attempt__detail__title">
|
|
Succeeded
|
|
</div>
|
|
<div class="settings__login-attempt__detail__value">
|
|
{{ attempt.attempt_success ? 'Yes' : 'No' }}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="settings__login-attempt__detail" title="{{ attempt.attempt_created|date('r') }}">
|
|
<div class="settings__login-attempt__detail__title">
|
|
Attempted
|
|
</div>
|
|
<time class="settings__login-attempt__detail__value" datetime="{{ attempt.attempt_created|date('c') }}">
|
|
{{ attempt.attempt_created|time_diff }}
|
|
</time>
|
|
</div>
|
|
|
|
<div class="settings__login-attempt__detail">
|
|
<div class="settings__login-attempt__detail__title">
|
|
User Agent
|
|
</div>
|
|
<div class="settings__login-attempt__detail__value">
|
|
{{ attempt.attempt_user_agent|length > 0 ? attempt.attempt_user_agent : 'None' }}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endmacro %}
|
|
|
|
{% macro user_account_log(data, strings) %}
|
|
<div class="settings__account-log" id="account-log-{{ data.log_id }}">
|
|
{% if data.user_id is defined %}
|
|
<a href="{{ url('user-profile', {'user': data.user_id}) }}" class="settings__account-log__user" style="{{ data.user_colour|html_colour }}">
|
|
<div class="avatar settings__account-log__user__avatar" style="background-image:url('{{ url('user-avatar', {'user': data.user_id, 'res': 40}) }}');"></div>
|
|
<div class="settings__account-log__user__name">{{ data.username }}</div>
|
|
</a>
|
|
{% endif %}
|
|
|
|
<div class="settings__account-log__container">
|
|
<div class="settings__account-log__important">
|
|
<div class="flag flag--{{ data.log_country|lower }} settings__login-attempt__flag" title="{{ data.log_country|country_name }}">{{ data.log_country }}</div>
|
|
|
|
<div class="settings__login-attempt__description">
|
|
{% if data.log_action in strings|keys %}
|
|
{{ strings[data.log_action]|log_format(data.log_params) }}
|
|
{% else %}
|
|
{{ data.log_action }}({{ data.log_params }})
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="settings__account-log__details">
|
|
<div class="settings__account-log__detail">
|
|
<div class="settings__account-log__detail__title">
|
|
IP Address
|
|
</div>
|
|
<div class="settings__account-log__detail__value">
|
|
{{ data.log_ip }}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="settings__account-log__detail" title="{{ data.log_created|date('r') }}">
|
|
<div class="settings__account-log__detail__title">
|
|
Date
|
|
</div>
|
|
<time class="settings__account-log__detail__value" datetime="{{ data.log_created|date('c') }}">
|
|
{{ data.log_created|time_diff }}
|
|
</time>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endmacro %}
|
|
|
|
{% macro user_profile_warning(warning, show_private_note, show_user_info, delete_csrf) %}
|
|
{% if warning.warning_type == constant('MSZ_WARN_SILENCE') %}
|
|
{% set warning_text = 'Silence' %}
|
|
{% set warning_class = 'silence' %}
|
|
{% elseif warning.warning_type == constant('MSZ_WARN_BAN') %}
|
|
{% set warning_text = 'Ban' %}
|
|
{% set warning_class = 'ban' %}
|
|
{% elseif warning.warning_type == constant('MSZ_WARN_WARNING') %}
|
|
{% set warning_text = 'Warning' %}
|
|
{% set warning_class = 'warning' %}
|
|
{% else %}
|
|
{% set warning_text = 'Note' %}
|
|
{% set warning_class = 'note' %}
|
|
{% endif %}
|
|
|
|
<div class="profile__warning profile__warning--{{ warning_class }}{% if show_user_info or delete_csrf %} profile__warning--extendo{% endif %}">
|
|
<div class="profile__warning__background"></div>
|
|
|
|
{% if show_user_info or delete_csrf %}
|
|
<div class="profile__warning__tools">
|
|
{% if show_user_info %}
|
|
{% if warning.username is defined or warning.user_ip is defined %}
|
|
<div class="profile__warning__user">
|
|
{% if warning.username is defined %}
|
|
<div class="avatar profile__warning__user__avatar" style="background-image:url('{{ url('user-avatar', {'user': warning.user_id, 'res': 40}) }}');"></div>
|
|
<a class="profile__warning__user__username" href="{{ url('user-profile', {'user': warning.user_id}) }}">
|
|
{{ warning.username }}
|
|
</a>
|
|
{% endif %}
|
|
|
|
{% if warning.user_ip is defined %}
|
|
<div class="profile__warning__user__ip">
|
|
{{ warning.user_ip }}
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
{% endif %}
|
|
|
|
<div class="profile__warning__user">
|
|
<div class="avatar profile__warning__user__avatar" style="background-image:url('{{ url('user-avatar', {'user': warning.issuer_id, 'res': 40}) }}');"></div>
|
|
<a class="profile__warning__user__username" href="{{ url('user-profile', {'user': warning.user_id}) }}">
|
|
{{ warning.issuer_username }}
|
|
</a>
|
|
<div class="profile__warning__user__ip">
|
|
{{ warning.issuer_ip }}
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if delete_csrf %}
|
|
<div class="profile__warning__options">
|
|
<a href="{{ url('manage-users-warning-delete', {'warning': warning.warning_id}) }}" class="profile__warning__option"><i class="far fa-trash-alt"></i> Delete</a>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
{% endif %}
|
|
|
|
<div class="profile__warning__content">
|
|
<div class="profile__warning__type">
|
|
{{ warning_text }}
|
|
</div>
|
|
|
|
<time datetime="{{ warning.warning_created|date('c') }}" title="{{ warning.warning_created|date('r') }}" class="profile__warning__created">
|
|
{{ warning.warning_created|time_diff }}
|
|
</time>
|
|
|
|
{% if warning_has_duration(warning.warning_type) %}
|
|
<time datetime="{{ warning.warning_duration|date('c') }}" title="{{ warning.warning_duration|date('r') }}" class="profile__warning__duration">
|
|
{{ warning.warning_duration|time_diff }}
|
|
</time>
|
|
{% else %}
|
|
<div class="profile__warning__duration"></div>
|
|
{% endif %}
|
|
|
|
<div class="profile__warning__note">
|
|
{{ warning.warning_note }}
|
|
|
|
{% if show_private_note and warning.warning_note_private|length > 0 %}
|
|
<div class="profile__warning__private">
|
|
{{ warning.warning_note_private|nl2br }}
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endmacro %}
|