summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Roach <greg@subaqua.co.uk>2021-01-22 16:31:35 +0000
committerGreg Roach <greg@subaqua.co.uk>2021-01-22 16:31:35 +0000
commitb47837c47d7b6e97a8ae8b39adde4ac935004240 (patch)
treec76a5d7674777d799811e4987d2cf2e3280f37be
parent696f5b06e4781cc61274eb3969103cb3be76e8d3 (diff)
downloadwebtrees-b47837c47d7b6e97a8ae8b39adde4ac935004240.tar.gz
webtrees-b47837c47d7b6e97a8ae8b39adde4ac935004240.tar.bz2
webtrees-b47837c47d7b6e97a8ae8b39adde4ac935004240.zip
Fix: #3682 - add bootstrap markup to user message block
-rw-r--r--app/Module/UserMessagesModule.php90
-rw-r--r--resources/views/modules/user-messages/user-messages.phtml150
2 files changed, 159 insertions, 81 deletions
diff --git a/app/Module/UserMessagesModule.php b/app/Module/UserMessagesModule.php
index cbacda7371..5cf9ed9643 100644
--- a/app/Module/UserMessagesModule.php
+++ b/app/Module/UserMessagesModule.php
@@ -150,87 +150,15 @@ class UserMessagesModule extends AbstractModule implements ModuleBlockInterface
$user->getPreference(UserInterface::PREF_CONTACT_METHOD) !== 'none';
});
- $content = '';
- if ($users->isNotEmpty()) {
- $url = route(UserPage::class, ['tree' => $tree->name()]);
-
- $content .= '<form method="post" action="' . e(route(MessageSelect::class, ['tree' => $tree->name()])) . '">';
- $content .= csrf_field();
- $content .= '<input type="hidden" name="url" value="' . e($url) . '">';
- $content .= '<label for="to">' . I18N::translate('Send a message') . '</label>';
- $content .= '<select id="to" name="to" required>';
- $content .= '<option value="">' . I18N::translate('&lt;select&gt;') . '</option>';
- foreach ($users as $user) {
- $content .= sprintf('<option value="%1$s">%2$s - %1$s</option>', e($user->userName()), e($user->realName()));
- }
- $content .= '</select>';
- $content .= '<button type="submit">' . I18N::translate('Send') . '</button><br><br>';
- $content .= '</form>';
- }
- $content .= '<form method="post" action="' . e(route('module', [
- 'action' => 'DeleteMessage',
- 'module' => $this->name(),
- 'context' => $context,
- 'tree' => $tree->name(),
- ])) . '" data-confirm="' . I18N::translate('Are you sure you want to delete this message? It cannot be retrieved later.') . '" onsubmit="return confirm(this.dataset.confirm);" id="messageform" name="messageform">';
- $content .= csrf_field();
-
- if ($messages->isNotEmpty()) {
- $content .= '<div class="table-responsive">';
- $content .= '<table class="table table-sm w-100"><tr>';
- $content .= '<th class="list_label">' . I18N::translate('Delete') . '<br><a href="#" onclick="$(\'#block-' . $block_id . ' :checkbox\').prop(\'checked\', true); return false;">' . I18N::translate('All') . '</a></th>';
- $content .= '<th class="list_label">' . I18N::translate('Subject') . '</th>';
- $content .= '<th class="list_label">' . I18N::translate('Date sent') . '</th>';
- $content .= '<th class="list_label">' . I18N::translate('Email address') . '</th>';
- $content .= '</tr>';
- foreach ($messages as $message) {
- $content .= '<tr>' .
- '<td class="list_value_wrap center"><input type="checkbox" name="message_id[]" value="' . $message->message_id . '" id="cb_message' . $message->message_id . '"></td>' .
- '<td class="list_value_wrap">' .
- '<a href="#message' . $message->message_id . '" data-toggle="collapse" role="button" aria-expanded="false" aria-controls="message' . $message->message_id . '">' .
- view('icons/expand') .
- view('icons/collapse') .
- '<b dir="auto">' . e($message->subject) . '</b>' .
- '</a></td>' .
- '<td class="list_value_wrap">' . view('components/datetime', ['timestamp' => $message->created]) . '</td>' .
- '<td class="list_value_wrap">';
-
- $user = $this->user_service->findByIdentifier($message->sender);
-
- if ($user instanceof User) {
- $content .= '<span dir="auto">' . e($user->realName()) . '</span> - <span dir="auto">' . $user->email() . '</span>';
- } else {
- $content .= '<a href="mailto:' . e($message->sender) . '">' . e($message->sender) . '</a>';
- }
-
- $content .= '</td>';
- $content .= '</tr>';
- $content .= '<tr><td class="list_value_wrap" colspan="4"><div id="message' . $message->message_id . '" class="collapse">';
- $content .= '<div dir="auto" style="white-space: pre-wrap;">' . Filter::expandUrls($message->body, $tree) . '</div><br>';
-
- /* I18N: When replying to an email, the subject becomes “RE: <subject>” */
- if (!str_starts_with($message->subject, I18N::translate('RE: '))) {
- $message->subject = I18N::translate('RE: ') . $message->subject;
- }
-
- // If this user still exists, show a reply link.
- if ($user instanceof User) {
- $reply_url = route(MessagePage::class, [
- 'subject' => $message->subject,
- 'to' => $user->userName(),
- 'tree' => $tree->name(),
- 'url' => route(UserPage::class, ['tree' => $tree->name()]),
- ]);
-
- $content .= '<a class="btn btn-primary" href="' . e($reply_url) . '" title="' . I18N::translate('Reply') . '">' . I18N::translate('Reply') . '</a> ';
- }
- $content .= '<button type="button" class="btn btn-danger" data-confirm="' . I18N::translate('Are you sure you want to delete this message? It cannot be retrieved later.') . '" onclick="if (confirm(this.dataset.confirm)) {$(\'#messageform :checkbox\').prop(\'checked\', false); $(\'#cb_message' . $message->message_id . '\').prop(\'checked\', true); document.messageform.submit();}">' . I18N::translate('Delete') . '</button></div></td></tr>';
- }
- $content .= '</table>';
- $content .= '</div>';
- $content .= '<p><button type="submit">' . I18N::translate('Delete selected messages') . '</button></p>';
- }
- $content .= '</form>';
+ $content = view('modules/user-messages/user-messages', [
+ 'block_id' => $block_id,
+ 'context' => $context,
+ 'messages' => $messages,
+ 'module' => $this,
+ 'tree' => $tree,
+ 'user_service' => $this->user_service,
+ 'users' => $users,
+ ]);
if ($context !== self::CONTEXT_EMBED) {
$count = $messages->count();
diff --git a/resources/views/modules/user-messages/user-messages.phtml b/resources/views/modules/user-messages/user-messages.phtml
new file mode 100644
index 0000000000..4f0e99a111
--- /dev/null
+++ b/resources/views/modules/user-messages/user-messages.phtml
@@ -0,0 +1,150 @@
+<?php
+
+use Fisharebest\Webtrees\Filter;
+use Fisharebest\Webtrees\Http\RequestHandlers\MessagePage;
+use Fisharebest\Webtrees\Http\RequestHandlers\MessageSelect;
+use Fisharebest\Webtrees\Http\RequestHandlers\UserPage;
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleInterface;
+use Fisharebest\Webtrees\Services\UserService;
+use Fisharebest\Webtrees\Tree;
+use Fisharebest\Webtrees\User;
+use Illuminate\Support\Collection;
+
+/**
+ * @var int $block_id
+ * @var string $context
+ * @var ModuleInterface $module
+ * @var Tree $tree
+ * @var Collection<stdClass> $messages
+ * @var Collection<User> $users
+ * @var UserService $user_service
+ */
+
+?>
+
+<?php if ($users->isNotEmpty()): ?>
+ <form method="post" action="<?= e(route(MessageSelect::class, ['tree' => $tree->name()])) ?>">
+ <?= csrf_field() ?>
+ <input type="hidden" name="url" value="<?= e(route(UserPage::class, ['tree' => $tree->name()])) ?>">
+ <label for="to"><?= I18N::translate('Send a message') ?></label>
+
+ <div class="input-group">
+ <select class="form-control" id="to" name="to" required>
+ <option value=""><?= I18N::translate('&lt;select&gt;') ?></option>
+ <?php foreach ($users as $user): ?>
+ <option value="<?= e($user->userName()) ?>">
+ <?= e($user->realName()) ?> - <?= e($user->userName()) ?>
+ </option>
+ <?php endforeach ?>
+ </select>
+
+ <button type="submit" class="btn btn-primary"><?= I18N::translate('Send') ?></button>
+ </div>
+ <br><br>
+ </form>
+<?php endif ?>
+
+<form
+ method="post"
+ action="<?= e(route('module', ['action' => 'DeleteMessage', 'module' => $module->name(), 'context' => $context, 'tree' => $tree->name()])) ?>"
+ data-confirm="<?= I18N::translate('Are you sure you want to delete this message? It cannot be retrieved later.') ?>"
+ onsubmit="return confirm(this.dataset.confirm);"
+ id="messageform"
+ name="messageform"
+>
+ <?= csrf_field() ?>
+
+ <?php if ($messages->isNotEmpty()): ?>
+ <div class="table-responsive">
+ <table class="table table-sm w-100">
+ <tr>
+ <th class="list_label">
+ <?= I18N::translate('Delete') ?>
+ <br>
+ <a href="#"
+ onclick="$('#block-<?= $block_id ?> :checkbox').prop('checked', true); return false;">
+ <?= I18N::translate('All') ?>
+ </a>
+ </th>
+ <th class="list_label"><?= I18N::translate('Subject') ?></th>
+ <th class="list_label"><?= I18N::translate('Date sent') ?></th>
+ <th class="list_label"><?= I18N::translate('Email address') ?></th>
+ </tr>
+
+ <?php foreach ($messages as $message): ?>
+ <tr>
+ <td class="list_value_wrap center">
+ <input type="checkbox" name="message_id[]" value="<?= $message->message_id ?>" id="cb_message<?= $message->message_id ?>">
+ </td>
+
+ <td class="list_value_wrap">
+ <a href="#message<?= $message->message_id ?>" data-toggle="collapse" role="button"
+ aria-expanded="false" aria-controls="message<?= $message->message_id ?>">
+ <?= view('icons/expand') ?>
+ <?= view('icons/collapse') ?>
+ <b dir="auto"><?= e($message->subject) ?></b>
+ </a>
+ </td>
+
+ <td class="list_value_wrap">
+ <?= view('components/datetime', ['timestamp' => $message->created]) ?>
+ </td>
+
+ <td class="list_value_wrap">
+ <?php $user = $user_service->findByIdentifier($message->sender) ?>
+
+ <?php if ($user instanceof User): ?>
+ <span dir="auto"><?= e($user->realName()) ?></span> - <span
+ dir="auto"><?= $user->email() ?></span>
+ <?php else: ?>
+ <a href="mailto:<?= e($message->sender) ?>"><?= e($message->sender) ?></a>
+ <?php endif ?>
+ </td>
+ </tr>
+
+ <tr>
+ <td class="list_value_wrap" colspan="4">
+ <div id="message<?= $message->message_id ?>" class="collapse">
+ <div dir="auto" style="white-space: pre-wrap;">
+ <?= Filter::expandUrls($message->body, $tree) ?>
+ </div>
+ <br>
+
+ <?php
+ /* I18N: When replying to an email, the subject becomes “RE: subject” */
+ if (!str_starts_with($message->subject, I18N::translate('RE: '))) {
+ $message->subject = I18N::translate('RE: ') . $message->subject;
+ }
+
+ // If this user still exists, show a reply link.
+ if ($user instanceof User) {
+ $reply_url = route(MessagePage::class, [
+ 'subject' => $message->subject,
+ 'to' => $user->userName(),
+ 'tree' => $tree->name(),
+ 'url' => route(UserPage::class, ['tree' => $tree->name()]),
+ ]);
+ ?>
+
+ <a class="btn btn-primary" href="<?= e($reply_url) ?>"
+ title="<?= I18N::translate('Reply') ?>">
+ <?= I18N::translate('Reply') ?>
+ </a>
+ <?php } ?>
+ <button type="button" class="btn btn-danger"
+ data-confirm="<?= I18N::translate('Are you sure you want to delete this message? It cannot be retrieved later.') ?>"
+ onclick="if (confirm(this.dataset.confirm)) {$('#messageform :checkbox').prop('checked', false); $('#cb_message<?= $message->message_id ?>').prop('checked', true); document.messageform.submit();}">
+ <?= I18N::translate('Delete') ?>
+ </button>
+ </div>
+ </td>
+ </tr>
+ <?php endforeach ?>
+ </table>
+ </div>
+ <p>
+ <button type="submit"><?= I18N::translate('Delete selected messages') ?></button>
+ </p>
+ <?php endif ?>
+</form>