diff options
| author | Greg Roach <greg@subaqua.co.uk> | 2021-01-22 16:31:35 +0000 |
|---|---|---|
| committer | Greg Roach <greg@subaqua.co.uk> | 2021-01-22 16:31:35 +0000 |
| commit | b47837c47d7b6e97a8ae8b39adde4ac935004240 (patch) | |
| tree | c76a5d7674777d799811e4987d2cf2e3280f37be | |
| parent | 696f5b06e4781cc61274eb3969103cb3be76e8d3 (diff) | |
| download | webtrees-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.php | 90 | ||||
| -rw-r--r-- | resources/views/modules/user-messages/user-messages.phtml | 150 |
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('<select>') . '</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('<select>') ?></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> |
