Added private messages.
This commit is contained in:
parent
4e38a537ea
commit
3e7935fb79
46 changed files with 3143 additions and 156 deletions
templates
|
@ -7,17 +7,17 @@
|
|||
{% set browser_title = globals.site_info.name %}
|
||||
{% endif %}
|
||||
|
||||
<title>{{ browser_title }}</title>
|
||||
<title>{{ browser_title }}</title>
|
||||
|
||||
<meta property="og:title" content="{{ title|default(globals.site_info.name) }}">
|
||||
<meta property="og:site_name" content="{{ globals.site_info.name }}">
|
||||
<meta property="og:title" content="{{ title|default(globals.site_info.name) }}">
|
||||
<meta property="og:site_name" content="{{ globals.site_info.name }}">
|
||||
|
||||
{% if description|length > 0 %}
|
||||
<meta name="description" content="{{ description }}">
|
||||
<meta property="og:description" content="{{ description }}">
|
||||
{% endif %}
|
||||
|
||||
<meta property="og:type" content="object">
|
||||
<meta property="og:type" content="object">
|
||||
|
||||
{% if image is defined %}
|
||||
{% if image|slice(0, 1) == '/' %}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{% extends 'forum/master.twig' %}
|
||||
{% from 'macros.twig' import avatar %}
|
||||
{% from 'forum/macros.twig' import forum_header %}
|
||||
{% from '_layout/input.twig' import input_hidden, input_csrf, input_text, input_button, input_select, input_checkbox %}
|
||||
{% from '_layout/input.twig' import input_hidden, input_csrf, input_text, input_select, input_checkbox %}
|
||||
|
||||
{% set title = 'Posting' %}
|
||||
{% set is_reply = posting_topic is defined %}
|
||||
|
@ -74,73 +74,9 @@
|
|||
{% endif %}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<textarea name="post[text]" class="forum__post__text forum__post__text--edit js-forum-posting-text js-ctrl-enter-submit" placeholder="Type your post content here...">{{ posting_defaults.text|default(posting_post.info.body|default('')) }}</textarea>
|
||||
<div class="forum__post__text js-forum-posting-preview" hidden></div>
|
||||
|
||||
<div class="forum__post__actions forum__post__actions--bbcode" hidden>
|
||||
<div class="forum__post__action forum__post__action--tag forum__post__action--bb-bold js-forum-posting-markup" title="Bold [b]<text>[/b]" data-tag-open="[b]" data-tag-close="[/b]">
|
||||
<i class="fas fa-bold fa-fw"></i>
|
||||
</div>
|
||||
<div class="forum__post__action forum__post__action--tag forum__post__action--bb-italic js-forum-posting-markup" title="Italic [i]<text>[/i]" data-tag-open="[i]" data-tag-close="[/i]">
|
||||
<i class="fas fa-italic fa-fw"></i>
|
||||
</div>
|
||||
<div class="forum__post__action forum__post__action--tag forum__post__action--bb-underline js-forum-posting-markup" title="Underline [u]<text>[/u]" data-tag-open="[u]" data-tag-close="[/u]">
|
||||
<i class="fas fa-underline fa-fw"></i>
|
||||
</div>
|
||||
<div class="forum__post__action forum__post__action--tag forum__post__action--bb-strike js-forum-posting-markup" title="Strikethrough [s]<text>[/s]" data-tag-open="[s]" data-tag-close="[/s]">
|
||||
<i class="fas fa-strikethrough fa-fw"></i>
|
||||
</div>
|
||||
<div class="forum__post__action forum__post__action--tag forum__post__action--bb-link js-forum-posting-markup" title="Link [url]<url>[/url] or [url=<url>]<text>[/url]" data-tag-open="[url=]" data-tag-close="[/url]">
|
||||
<i class="fas fa-link fa-fw"></i>
|
||||
</div>
|
||||
<div class="forum__post__action forum__post__action--tag forum__post__action--bb-image js-forum-posting-markup" title="Image [img]<url>[/img]" data-tag-open="[img]" data-tag-close="[/img]">
|
||||
<i class="fas fa-image fa-fw"></i>
|
||||
</div>
|
||||
<div class="forum__post__action forum__post__action--tag forum__post__action--bb-audio js-forum-posting-markup" title="Audio [audio]<url>[/url]" data-tag-open="[audio]" data-tag-close="[/audio]">
|
||||
<i class="fas fa-music fa-fw"></i>
|
||||
</div>
|
||||
<div class="forum__post__action forum__post__action--tag forum__post__action--bb-video js-forum-posting-markup" title="Video [video]<url>[/video]" data-tag-open="[video]" data-tag-close="[/video]">
|
||||
<i class="fas fa-video fa-fw"></i>
|
||||
</div>
|
||||
<div class="forum__post__action forum__post__action--tag forum__post__action--bb-code js-forum-posting-markup" title="Code [code]<code>[/code]" data-tag-open="[code]" data-tag-close="[/code]">
|
||||
<i class="fas fa-code fa-fw"></i>
|
||||
</div>
|
||||
<div class="forum__post__action forum__post__action--tag forum__post__action--bb-zalgo" title="Zalgo [zalgo]<text>[/zalgo]" data-tag-open="[zalgo]" data-tag-close="[/zalgo]">
|
||||
<i class="fas fa-frog fa-fw"></i>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="forum__post__actions forum__post__actions--markdown" hidden>
|
||||
<div class="forum__post__action forum__post__action--tag forum__post__action--md-bold js-forum-posting-markup" title="Bold **<text>**" data-tag-open="**" data-tag-close="**">
|
||||
<i class="fas fa-bold fa-fw"></i>
|
||||
</div>
|
||||
<div class="forum__post__action forum__post__action--tag forum__post__action--md-italic js-forum-posting-markup" title="Italic *<text>* or _<text>_" data-tag-open="*" data-tag-close="*">
|
||||
<i class="fas fa-italic fa-fw"></i>
|
||||
</div>
|
||||
<div class="forum__post__action forum__post__action--tag forum__post__action--md-underline js-forum-posting-markup" title="Underline __<text>__" data-tag-open="__" data-tag-close="__">
|
||||
<i class="fas fa-underline fa-fw"></i>
|
||||
</div>
|
||||
<div class="forum__post__action forum__post__action--tag forum__post__action--md-strike js-forum-posting-markup" title="Strikethrough ~~<text>~~" data-tag-open="~~" data-tag-close="~~">
|
||||
<i class="fas fa-strikethrough fa-fw"></i>
|
||||
</div>
|
||||
<div class="forum__post__action forum__post__action--tag forum__post__action--md-link js-forum-posting-markup" title="Link [<text>](<url>)" data-tag-open="[](" data-tag-close=")">
|
||||
<i class="fas fa-link fa-fw"></i>
|
||||
</div>
|
||||
<div class="forum__post__action forum__post__action--tag forum__post__action--md-image js-forum-posting-markup" title="Image " data-tag-open="">
|
||||
<i class="fas fa-image fa-fw"></i>
|
||||
</div>
|
||||
<div class="forum__post__action forum__post__action--tag forum__post__action--md-audio js-forum-posting-markup" title="Audio " data-tag-open="">
|
||||
<i class="fas fa-music fa-fw"></i>
|
||||
</div>
|
||||
<div class="forum__post__action forum__post__action--tag forum__post__action--md-video js-forum-posting-markup" title="Video " data-tag-open="">
|
||||
<i class="fas fa-video fa-fw"></i>
|
||||
</div>
|
||||
<div class="forum__post__action forum__post__action--tag forum__post__action--md-code js-forum-posting-markup" title="Code `<code>` or ```<code>```" data-tag-open="```" data-tag-close="```">
|
||||
<i class="fas fa-code fa-fw"></i>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="forum__post__actions js-forum-posting-actions"></div>
|
||||
<div class="forum__post__options">
|
||||
<div class="forum__post__settings">
|
||||
{{ input_select(
|
||||
|
@ -167,7 +103,6 @@
|
|||
)
|
||||
) }}
|
||||
</div>
|
||||
|
||||
<div class="forum__post__buttons js-forum-posting-buttons">
|
||||
<button class="input__button" onclick="MszForumEditorAllowClose = true;">Submit</button>
|
||||
</div>
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
{% include '_layout/meta.twig' %}
|
||||
<meta name="csrfp-token" content="{{ csrf_token() }}">
|
||||
<link href="/vendor/fontawesome/css/all.min.css" type="text/css" rel="stylesheet">
|
||||
<link href="{{ asset('misuzu.css') }}" type="text/css" rel="stylesheet">
|
||||
{% if site_background is defined %}
|
||||
|
@ -43,7 +44,7 @@
|
|||
{% endif %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container" style="margin: 2px 0; padding: 2px 5px;">
|
||||
<div class="container">
|
||||
This page is empty, populate it.
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
63
templates/messages/compose.twig
Normal file
63
templates/messages/compose.twig
Normal file
|
@ -0,0 +1,63 @@
|
|||
{% extends 'messages/master.twig' %}
|
||||
{% from 'macros.twig' import avatar, container_title %}
|
||||
{% from '_layout/input.twig' import input_hidden, input_text, input_select %}
|
||||
|
||||
{% set title = 'Composing message' %}
|
||||
{% set canonical_url = url('messages-compose') %}
|
||||
|
||||
{% block messages_content %}
|
||||
<div class="messages-columns js-messages-compose">
|
||||
<div class="messages-columns-sidebar">
|
||||
<div class="messages-sidebar">
|
||||
<div class="messages-sidebar-button">
|
||||
<a class="input__button" href="{{ url('messages-index') }}">Return</a>
|
||||
</div>
|
||||
|
||||
<div class="container messages-sidebar-section">
|
||||
{{ container_title('<i class="fas fa-address-card fa-fw"></i> Recipient') }}
|
||||
|
||||
<div class="messages-recipient js-messages-recipient" data-msg-lookup="{{ url('messages-recipient') }}">
|
||||
<div class="messages-recipient-avatar js-messages-recipient-avatar">
|
||||
{{ avatar(0, 100) }}
|
||||
</div>
|
||||
<div class="messages-recipient-name">
|
||||
{{ input_text('name', 'messages-recipient-name-input js-messages-recipient-name', recipient, 'text', 'Recipient name') }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="warning">
|
||||
<div class="warning__content">
|
||||
<p>UI is VERY not final. It will be not awful before 2025 I promise for real this time!!!</p>
|
||||
<p>I need to clean up a lot of code first because a lot of things are specifically written for the forum editor and it will become a big mess otherwise.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="messages-columns-content">
|
||||
<div class="container messages-reply messages-reply-compose js-messages-reply">
|
||||
{{ container_title('<i class="fas fa-pencil-alt"></i> Writing a message') }}
|
||||
|
||||
<form class="messages-reply-form js-messages-reply-form">
|
||||
{{ input_hidden('recipient', '') }}
|
||||
<div class="messages-reply-subject">
|
||||
{{ input_text('title', 'messages-reply-subject-input', '', 'text', 'Subject', true) }}
|
||||
</div>
|
||||
<div class="messages-reply-body">
|
||||
<textarea name="body" placeholder="Write your reply here... Press Ctrl+Enter to send your reply Press Ctrl+Shift+Enter to save a draft" class="input__textarea messages-reply-body-input js-messages-reply-body"></textarea>
|
||||
</div>
|
||||
<div class="messages-reply-actions js-messages-reply-actions" hidden></div>
|
||||
<div class="messages-reply-options">
|
||||
<div class="messages-reply-settings">
|
||||
{{ input_select('parser', constant('\\Misuzu\\Parsers\\Parser::NAMES'), '1', null, null, null, 'js-messages-reply-parser') }}
|
||||
</div>
|
||||
<div class="messages-reply-buttons">
|
||||
<button class="input__button js-messages-reply-save" name="draft" value="1">Save draft</button>
|
||||
<button class="input__button js-messages-reply-send" name="draft" value="0">Reply</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
89
templates/messages/index.twig
Normal file
89
templates/messages/index.twig
Normal file
|
@ -0,0 +1,89 @@
|
|||
{% extends 'messages/master.twig' %}
|
||||
{% from 'macros.twig' import container_title, pagination %}
|
||||
|
||||
{% set title = folder_name == 'inbox' ? 'Messages' : ('%s :: Messages'|format(folder_meta[folder_name].title)) %}
|
||||
{% set canonical_url = url('messages-index') %}
|
||||
|
||||
{% block messages_content %}
|
||||
<div class="messages-columns">
|
||||
<div class="messages-columns-sidebar">
|
||||
<div class="messages-sidebar">
|
||||
{% if can_send_messages %}
|
||||
<div class="messages-sidebar-button">
|
||||
<a class="input__button" href="{{ url('messages-compose') }}">New Message</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="container messages-sidebar-section messages-actions">
|
||||
{{ container_title('<i class="fas fa-folder fa-fw"></i> Folders') }}
|
||||
|
||||
{% for name, meta in folder_meta %}
|
||||
<a class="{{ html_classes('messages-actions-item', {'messages-actions-item-current': folder_name == name}) }}" href="{{ url('messages-index', {folder: name == 'inbox' ? '' : name}) }}">
|
||||
<div class="messages-actions-item-icon"><i class="{{ meta.icon }}"></i></div>
|
||||
<div class="messages-actions-item-label">{{ meta.title }}</div>
|
||||
</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<div class="container messages-sidebar-section messages-actions">
|
||||
{{ container_title('<i class="fas fa-comments fa-fw"></i> Actions') }}
|
||||
|
||||
<button class="messages-actions-item js-messages-actions-select-all" data-state="inactive" data-inactive-str="Select all" data-inactive-ico="far fa-check-square fa-fw" data-active-str="Unselect all" data-active-ico="far fa-square fa-fw">
|
||||
<div class="messages-actions-item-icon js-messages-button-icon"><i></i></div>
|
||||
<div class="messages-actions-item-label js-messages-button-label"></div>
|
||||
</button>
|
||||
{% if folder_name == 'inbox' %}
|
||||
<button class="messages-actions-item js-messages-actions-mark-read" data-state="inactive" data-inactive-str="Mark as read" data-inactive-ico="fas fa-envelope-open fa-fw" data-active-str="Mark as unread" data-active-ico="fas fa-envelope">
|
||||
<div class="messages-actions-item-icon js-messages-button-icon"><i></i></div>
|
||||
<div class="messages-actions-item-label js-messages-button-label"></div>
|
||||
</button>
|
||||
{% endif %}
|
||||
<button class="messages-actions-item js-messages-actions-move-trash" data-state="{{ folder_name == 'trash' ? 'active' : 'inactive' }}" data-inactive-str="Move to Trash" data-inactive-ico="fas fa-trash-alt fa-fw" data-active-str="Restore item" data-active-ico="fas fa-trash-restore-alt">
|
||||
<div class="messages-actions-item-icon js-messages-button-icon"><i></i></div>
|
||||
<div class="messages-actions-item-label js-messages-button-label"></div>
|
||||
</button>
|
||||
{% if folder_name == 'trash' %}
|
||||
<button class="messages-actions-item js-messages-actions-nuke">
|
||||
<div class="messages-actions-item-icon"><i class="fas fa-radiation-alt"></i></div>
|
||||
<div class="messages-actions-item-label">Permanently delete</div>
|
||||
</button>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="messages-columns-content">
|
||||
<div class="container">
|
||||
{{ container_title('<i class="%s"></i> %s'|format(folder_meta[folder_name].icon, folder_meta[folder_name].title)) }}
|
||||
|
||||
<div class="messages-folder js-messages-list">
|
||||
<div class="messages-folder-notice js-messages-folder-empty"{% if folder_messages is not empty %} hidden{% endif %}>
|
||||
<div class="messages-folder-notice-icon"><i class="fas fa-tenge fa-fw fa-4x"></i></div>
|
||||
<div class="messages-folder-notice-text">There are no messages to display.</div>
|
||||
</div>
|
||||
{% if folder_messages is not empty %}
|
||||
{% for message in folder_messages %}
|
||||
{% set user_info = (folder_name == 'drafts' or folder_name == 'sent' ? message.recipient_info : message.author_info) %}
|
||||
{% set user_colour = (folder_name == 'drafts' or folder_name == 'sent' ? message.recipient_colour : message.author_colour) %}
|
||||
<div class="messages-folder-item messages-entry js-messages-entry" tabindex="0" data-msg-id="{{ message.info.id }}" data-msg-url="{{ url('messages-view', {message: message.info.id}) }}" data-msg-sent="{{ message.info.isSent ? 'sent' : 'draft' }}" data-msg-read="{{ message.info.isRead ? 'read' : 'unread' }}" style="--user-colour: {{ user_colour }};">
|
||||
<div class="messages-entry-header">
|
||||
<div class="messages-entry-check"><input type="checkbox" class="js-entry-checkbox"></div>
|
||||
<div class="messages-entry-unread js-messages-entry-unread"{% if not message.info.isSent or message.info.isRead %} hidden{% endif %}><div class="messages-entry-unread-orb"></div></div>
|
||||
<div class="messages-entry-author"><div class="messages-entry-overflow">{{ user_info.name|default('Deleted User') }}</div></div>
|
||||
<div class="messages-entry-spacing"></div>
|
||||
<div class="messages-entry-datetime"><time datetime="{{ message.info.displayTime|date('c') }}" title="{{ message.info.displayTime|date('r') }}">{{ message.info.displayTime|time_format }}</time></div>
|
||||
</div>
|
||||
<div class="messages-entry-subject">
|
||||
<div class="messages-entry-overflow">{{ message.info.title }}</div>
|
||||
</div>
|
||||
<div class="messages-entry-preview">
|
||||
<div class="messages-entry-overflow">{{ message.info.body }}</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{{ pagination(folder_pagination, 'messages-index', {folder: (folder_name == 'index' ? '' : folder_name)}) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
12
templates/messages/master.twig
Normal file
12
templates/messages/master.twig
Normal file
|
@ -0,0 +1,12 @@
|
|||
{% extends 'master.twig' %}
|
||||
|
||||
{% block content %}
|
||||
{% block messages_content %}
|
||||
{% endblock %}
|
||||
|
||||
{% if globals.eeprom_path is not empty and globals.eeprom_app_messages is not empty %}
|
||||
<script type="text/javascript">
|
||||
const peepPath = '{{ globals.eeprom_path }}', peepApp = '{{ globals.eeprom_app_messages }}';
|
||||
</script>
|
||||
{% endif %}
|
||||
{% endblock %}
|
179
templates/messages/thread.twig
Normal file
179
templates/messages/thread.twig
Normal file
|
@ -0,0 +1,179 @@
|
|||
{% extends 'messages/master.twig' %}
|
||||
{% from 'macros.twig' import avatar, container_title %}
|
||||
{% from '_layout/input.twig' import input_hidden, input_text, input_select %}
|
||||
|
||||
{% set title = 'Viewing message' %}
|
||||
{% set canonical_url = url('messages-view', { message: message.info.id }) %}
|
||||
|
||||
{% block messages_content %}
|
||||
<div class="messages-columns">
|
||||
<div class="messages-columns-sidebar">
|
||||
<div class="messages-sidebar">
|
||||
<div class="messages-sidebar-button">
|
||||
<a class="input__button" href="{{ url('messages-index') }}">Back</a>
|
||||
</div>
|
||||
|
||||
<div class="container messages-sidebar-section messages-actions">
|
||||
{{ container_title('<i class="fas fa-comments fa-fw"></i> Actions') }}
|
||||
|
||||
<button class="messages-actions-item js-messages-actions-mark-read"{% if not message.info.isSent %} hidden{% endif %} data-state="active" data-inactive-str="Mark as read" data-inactive-ico="fas fa-envelope-open fa-fw" data-active-str="Mark as unread" data-active-ico="fas fa-envelope">
|
||||
<div class="messages-actions-item-icon js-messages-button-icon"><i></i></div>
|
||||
<div class="messages-actions-item-label js-messages-button-label"></div>
|
||||
</button>
|
||||
<button class="messages-actions-item js-messages-actions-move-trash" data-state="{{ message.info.isDeleted ? 'active' : 'inactive' }}" data-inactive-str="Move to Trash" data-inactive-ico="fas fa-trash-alt fa-fw" data-active-str="Restore item" data-active-ico="fas fa-trash-restore-alt">
|
||||
<div class="messages-actions-item-icon js-messages-button-icon"><i></i></div>
|
||||
<div class="messages-actions-item-label js-messages-button-label"></div>
|
||||
</button>
|
||||
<button class="messages-actions-item js-messages-actions-nuke"{% if not message.info.isDeleted %} hidden{% endif %}>
|
||||
<div class="messages-actions-item-icon"><i class="fas fa-radiation-alt"></i></div>
|
||||
<div class="messages-actions-item-label">Permanently delete</div>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="messages-columns-content">
|
||||
<div class="messages-thread js-messages-thread">
|
||||
{% if reply_to is defined and reply_to is not empty %}
|
||||
<article class="{{ html_classes('container', 'messages-message', 'messages-message-snippet', 'js-messages-message', {'messages-message-deleted': reply_to.info.isDeleted, 'messages-message-draft': not reply_to.info.isSent}) }}" tabindex="0" data-msg-id="{{ reply_to.info.id }}" data-msg-url="{{ url('messages-view', {message: reply_to.info.id}) }}" data-msg-type="snip" data-msg-sent="{{ reply_to.info.isSent ? 'sent' : 'draft' }}" data-msg-read="{{ reply_to.info.isRead ? 'read' : 'unread' }}">
|
||||
<div class="messages-message-header">
|
||||
<div class="messages-message-sender-avatar">
|
||||
{{ avatar(reply_to.author_info.id|default(0), 80) }}
|
||||
</div>
|
||||
<div class="messages-message-details">
|
||||
<div class="messages-message-header-columns">
|
||||
<div class="messages-message-sender-name" style="--user-colour: {{ reply_to.author_colour }};">
|
||||
<a href="{{ url('user-profile', {user: reply_to.author_info.id|default(0)}) }}" class="messages-message-overflow">{{ reply_to.author_info.name|default('Deleted User') }}</a>
|
||||
</div>
|
||||
<div class="messages-message-details-spacing"></div>
|
||||
<div class="messages-message-datetime">
|
||||
<time datetime="{{ reply_to.info.displayTime|date('c') }}" title="{{ reply_to.info.displayTime|date('r') }}">{{ reply_to.info.displayTime|time_format }}</time>
|
||||
</div>
|
||||
</div>
|
||||
<div class="messages-message-addressee">
|
||||
<div class="messages-message-addressee-to">To: </div>
|
||||
<div class="messages-message-addressee-user" style="--user-colour: {{ reply_to.recipient_colour }};">
|
||||
<a href="{{ url('user-profile', {user: reply_to.recipient_info.id|default(0)}) }}" class="messages-message-overflow">{{ reply_to.recipient_info.name|default('Deleted User') }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="messages-message-subject">
|
||||
<h1>{{ reply_to.info.title }}</h1>
|
||||
</div>
|
||||
<div class="messages-message-snippet-body">
|
||||
<p>{{ reply_to.info.body }}</p>
|
||||
</div>
|
||||
</article>
|
||||
{% endif %}
|
||||
|
||||
<article class="{{ html_classes('container', 'messages-message', 'js-messages-message', {'messages-message-deleted': message.info.isDeleted, 'messages-message-draft': not message.info.isSent}) }}" data-msg-id="{{ message.info.id }}" data-msg-url="{{ url('messages-view', {message: message.info.id}) }}" data-msg-type="full" data-msg-sent="{{ message.info.isSent ? 'sent' : 'draft' }}" data-msg-read="{{ message.info.isRead ? 'read' : 'unread' }}" data-msg-deleted="{{ message.info.isDeleted ? 'yes' : 'no' }}">
|
||||
<div class="messages-message-header">
|
||||
<div class="messages-message-sender-avatar">
|
||||
{{ avatar(message.author_info.id|default(0), 80) }}
|
||||
</div>
|
||||
<div class="messages-message-details">
|
||||
<div class="messages-message-header-columns">
|
||||
<div class="messages-message-sender-name" style="--user-colour: {{ message.author_colour }};">
|
||||
<a href="{{ url('user-profile', {user: message.author_info.id|default(0)}) }}" class="messages-message-overflow">{{ message.author_info.name|default('Deleted User') }}</a>
|
||||
</div>
|
||||
<div class="messages-message-details-spacing"></div>
|
||||
<div class="messages-message-datetime">
|
||||
<time datetime="{{ message.info.displayTime|date('c') }}" title="{{ message.info.displayTime|date('r') }}">{{ message.info.displayTime|time_format }}</time>
|
||||
</div>
|
||||
</div>
|
||||
<div class="messages-message-addressee">
|
||||
<div class="messages-message-addressee-to">To: </div>
|
||||
<div class="messages-message-addressee-user" style="--user-colour: {{ message.recipient_colour }};">
|
||||
<a href="{{ url('user-profile', {user: message.recipient_info.id|default(0)}) }}" class="messages-message-overflow">{{ message.recipient_info.name|default('Deleted User') }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="messages-message-subject">
|
||||
<h1>{{ message.info.title }}</h1>
|
||||
</div>
|
||||
<div class="messages-message-body{% if message.info.isBodyMarkdown %} markdown{% endif %}">{{ message.info.body|escape|parse_text(message.info.parser)|raw }}</div>
|
||||
</article>
|
||||
|
||||
{% if can_send_messages %}
|
||||
{% set has_draft_info = draft_info is defined and draft_info is not null %}
|
||||
{% set reply_field_is_draft = false %}
|
||||
{% if not has_draft_info and not message.info.isSent %}
|
||||
{% set has_draft_info = true %}
|
||||
{% set reply_field_is_draft = true %}
|
||||
{% set draft_info = message.info %}
|
||||
{% endif %}
|
||||
|
||||
{% set msg_author_id = message.info.authorId|default(0) %}
|
||||
{% set msg_recipient_id = message.info.recipientId|default(0) %}
|
||||
|
||||
{% if has_draft_info or (msg_author_id > 0 and msg_recipient_id > 0) %}
|
||||
<div class="container messages-reply js-messages-reply"{% if (reply_field_is_draft ? draft_info.isDeleted : message.info.isDeleted) %} hidden{% endif %}>
|
||||
{{ container_title(has_draft_info ? '<i class="fas fa-edit"></i> Edit' : '<i class="fas fa-reply"></i> Reply') }}
|
||||
|
||||
<form class="messages-reply-form js-messages-reply-form">
|
||||
{% if has_draft_info %}
|
||||
{{ input_hidden('message', draft_info.id) }}
|
||||
{% else %}
|
||||
{{ input_hidden('reply', message.info.id) }}
|
||||
{{ input_hidden('recipient', self_info.id == msg_author_id ? msg_recipient_id : msg_author_id) }}
|
||||
{% endif %}
|
||||
<div class="messages-reply-subject">
|
||||
{{ input_text('title', 'messages-reply-subject-input', draft_info.title|default('%s%s'|format((message.info.title|slice(0, 4) == 'Re: ' ? '' : 'Re: '), message.info.title)), 'text', 'Subject', true) }}
|
||||
</div>
|
||||
<div class="messages-reply-body">
|
||||
<textarea name="body" placeholder="Write your reply here... Press Ctrl+Enter to send your reply Press Ctrl+Shift+Enter to save a draft" class="input__textarea messages-reply-body-input js-messages-reply-body">{{ draft_info.body|default('') }}</textarea>
|
||||
</div>
|
||||
<div class="messages-reply-actions js-messages-reply-actions" hidden></div>
|
||||
<div class="messages-reply-options">
|
||||
<div class="messages-reply-settings">
|
||||
{{ input_select('parser', constant('\\Misuzu\\Parsers\\Parser::NAMES'), draft_info.parser|default('1'), null, null, null, 'js-messages-reply-parser') }}
|
||||
</div>
|
||||
<div class="messages-reply-buttons">
|
||||
<button class="input__button js-messages-reply-save" name="draft" value="1">Save draft</button>
|
||||
<button class="input__button js-messages-reply-send" name="draft" value="0">Reply</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
{% if replies_for is defined and replies_for is iterable %}
|
||||
{% for reply_for in replies_for %}
|
||||
<article class="{{ html_classes('container', 'messages-message', 'messages-message-snippet', 'js-messages-message', {'messages-message-deleted': reply_for.info.isDeleted, 'messages-message-draft': not reply_for.info.isSent}) }}" tabindex="0" data-msg-id="{{ reply_for.info.id }}" data-msg-url="{{ url('messages-view', {message: reply_for.info.id}) }}" data-msg-type="snip" data-msg-sent="{{ reply_for.info.isSent ? 'sent' : 'draft' }}" data-msg-read="{{ reply_for.info.isRead ? 'read' : 'unread' }}">
|
||||
<div class="messages-message-header">
|
||||
<div class="messages-message-sender-avatar">
|
||||
{{ avatar(reply_for.author_info.id|default(0), 80) }}
|
||||
</div>
|
||||
<div class="messages-message-details">
|
||||
<div class="messages-message-header-columns">
|
||||
<div class="messages-message-sender-name" style="--user-colour: {{ reply_for.author_colour }};">
|
||||
<a href="{{ url('user-profile', {user: reply_for.author_info.id|default(0)}) }}" class="messages-message-overflow">{{ reply_for.author_info.name|default('Deleted User') }}</a>
|
||||
</div>
|
||||
<div class="messages-message-details-spacing"></div>
|
||||
<div class="messages-message-datetime">
|
||||
<time datetime="{{ reply_for.info.displayTime|date('c') }}" title="{{ reply_for.info.displayTime|date('r') }}">{{ reply_for.info.displayTime|time_format }}</time>
|
||||
</div>
|
||||
</div>
|
||||
<div class="messages-message-addressee">
|
||||
<div class="messages-message-addressee-to">To: </div>
|
||||
<div class="messages-message-addressee-user" style="--user-colour: {{ reply_for.recipient_colour }};">
|
||||
<a href="{{ url('user-profile', {user: reply_for.recipient_info.id|default(0) }) }}" class="messages-message-overflow">{{ reply_for.recipient_info.name|default('Deleted User') }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="messages-message-subject">
|
||||
<h1>{{ reply_for.info.title }}</h1>
|
||||
</div>
|
||||
<div class="messages-message-snippet-body">
|
||||
<p>{{ reply_for.info.body }}</p>
|
||||
</div>
|
||||
</article>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -71,8 +71,13 @@
|
|||
<button class="input__button input__button--save profile__header__action">Save</button>
|
||||
<a href="{{ url('user-profile', {'user': profile_user.id}) }}" class="input__button input__button--destroy profile__header__action">Discard</a>
|
||||
<a href="{{ url('settings-index') }}" class="input__button profile__header__action">Settings</a>
|
||||
{% elseif profile_can_edit %}
|
||||
<a href="{{ url('user-profile-edit', {'user': profile_user.id}) }}" class="input__button profile__header__action">Edit Profile</a>
|
||||
{% else %}
|
||||
{% if profile_can_edit %}
|
||||
<a href="{{ url('user-profile-edit', {'user': profile_user.id}) }}" class="input__button profile__header__action">Edit Profile</a>
|
||||
{% endif %}
|
||||
{% if profile_can_send_messages %}
|
||||
<a href="{{ url('messages-compose', {'recipient': profile_user.name}) }}" class="input__button profile__header__action">Send Message</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<a href="{{ url('user-profile', {'user': profile_user.id}) }}" class="input__button profile__header__action">Return</a>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue