diff --git a/app/Activity/Controllers/CommentController.php b/app/Activity/Controllers/CommentController.php index b198d2d56..9e7491fd7 100644 --- a/app/Activity/Controllers/CommentController.php +++ b/app/Activity/Controllers/CommentController.php @@ -10,11 +10,9 @@ use Illuminate\Validation\ValidationException; class CommentController extends Controller { - protected $commentRepo; - - public function __construct(CommentRepo $commentRepo) - { - $this->commentRepo = $commentRepo; + public function __construct( + protected CommentRepo $commentRepo + ) { } /** @@ -43,7 +41,12 @@ class CommentController extends Controller $this->checkPermission('comment-create-all'); $comment = $this->commentRepo->create($page, $request->get('text'), $request->get('parent_id')); - return view('comments.comment', ['comment' => $comment]); + return view('comments.comment-branch', [ + 'branch' => [ + 'comment' => $comment, + 'children' => [], + ] + ]); } /** diff --git a/resources/js/components/page-comment.js b/resources/js/components/page-comment.js index ff86297e2..43159b42c 100644 --- a/resources/js/components/page-comment.js +++ b/resources/js/components/page-comment.js @@ -25,7 +25,10 @@ export class PageComment extends Component { } setupListeners() { - this.replyButton.addEventListener('click', () => this.$emit('reply', {id: this.commentLocalId})); + this.replyButton.addEventListener('click', () => this.$emit('reply', { + id: this.commentLocalId, + element: this.container, + })); this.editButton.addEventListener('click', this.startEdit.bind(this)); this.deleteButton.addEventListener('click', this.delete.bind(this)); this.form.addEventListener('submit', this.update.bind(this)); diff --git a/resources/js/components/page-comments.js b/resources/js/components/page-comments.js index 9dc529963..1eaa7cfa4 100644 --- a/resources/js/components/page-comments.js +++ b/resources/js/components/page-comments.js @@ -41,7 +41,7 @@ export class PageComments extends Component { }); this.elem.addEventListener('page-comment-reply', event => { - this.setReply(event.detail.id); + this.setReply(event.detail.id, event.detail.element); }); if (this.form) { @@ -66,15 +66,16 @@ export class PageComments extends Component { window.$http.post(`/comment/${this.pageId}`, reqData).then(resp => { const newElem = htmlToDom(resp.data); - this.container.appendChild(newElem); + this.formContainer.after(newElem); window.$events.success(this.createdText); - this.resetForm(); + this.hideForm(); this.updateCount(); }).catch(err => { this.form.toggleAttribute('hidden', false); window.$events.showValidationErrors(err); }); + this.form.toggleAttribute('hidden', false); loading.remove(); } @@ -85,32 +86,38 @@ export class PageComments extends Component { resetForm() { this.formInput.value = ''; - this.hideForm(); this.removeReplyTo(); + this.container.append(this.formContainer); } showForm() { this.formContainer.toggleAttribute('hidden', false); this.addButtonContainer.toggleAttribute('hidden', true); - this.formInput.focus(); + setTimeout(() => { + this.formInput.focus(); + }, 100); } hideForm() { + this.resetForm(); this.formContainer.toggleAttribute('hidden', true); if (this.getCommentCount() > 0) { - this.elem.appendChild(this.addButtonContainer); + this.elem.append(this.addButtonContainer); } else { - this.commentCountBar.appendChild(this.addButtonContainer); + this.commentCountBar.append(this.addButtonContainer); } this.addButtonContainer.toggleAttribute('hidden', false); } getCommentCount() { - return this.container.querySelectorAll('[compontent="page-comment"]').length; + return this.container.querySelectorAll('[component="page-comment"]').length; } - setReply(commentLocalId) { + setReply(commentLocalId, commentElement) { + const targetFormLocation = commentElement.closest('.comment-branch').querySelector('.comment-branch-children'); this.showForm(); + targetFormLocation.append(this.formContainer); + this.formContainer.scrollIntoView({behavior: 'smooth', block: 'nearest'}); this.parentId = commentLocalId; this.replyToRow.toggleAttribute('hidden', false); const replyLink = this.replyToRow.querySelector('a'); diff --git a/resources/sass/_components.scss b/resources/sass/_components.scss index bd85bb99f..a3818168f 100644 --- a/resources/sass/_components.scss +++ b/resources/sass/_components.scss @@ -682,6 +682,9 @@ body.flexbox-support #entity-selector-wrap .popup-body .form-group { &:hover .actions, &:focus-within .actions { opacity: 1; } + .actions button:focus { + outline: 1px dotted var(--color-primary); + } } .comment-box .header { @@ -709,6 +712,7 @@ body.flexbox-support #entity-selector-wrap .popup-body .form-group { @include lightDark(border-color, #DDD, #444); margin-inline-start: $-xs; width: $-l; + height: calc(100% - $-m); } #tag-manager .drag-card { diff --git a/resources/views/comments/comment-branch.blade.php b/resources/views/comments/comment-branch.blade.php index 69c967cd2..78d19ac3e 100644 --- a/resources/views/comments/comment-branch.blade.php +++ b/resources/views/comments/comment-branch.blade.php @@ -2,16 +2,14 @@ <div class="mb-m"> @include('comments.comment', ['comment' => $branch['comment']]) </div> - @if(count($branch['children']) > 0) - <div class="flex-container-row"> - <div class="pb-m"> - <div class="comment-thread-indicator fill-height"></div> - </div> - <div class="flex"> - @foreach($branch['children'] as $childBranch) - @include('comments.comment-branch', ['branch' => $childBranch]) - @endforeach - </div> + <div class="flex-container-row"> + <div class="comment-thread-indicator-parent"> + <div class="comment-thread-indicator"></div> </div> - @endif + <div class="comment-branch-children flex"> + @foreach($branch['children'] as $childBranch) + @include('comments.comment-branch', ['branch' => $childBranch]) + @endforeach + </div> + </div> </div> \ No newline at end of file diff --git a/resources/views/comments/comment.blade.php b/resources/views/comments/comment.blade.php index ce0d59473..924b465fa 100644 --- a/resources/views/comments/comment.blade.php +++ b/resources/views/comments/comment.blade.php @@ -28,14 +28,14 @@ </div> <div class="actions text-right"> @if(userCan('comment-update', $comment)) - <button refs="page-comment@edit-button" type="button" class="text-button" aria-label="{{ trans('common.edit') }}" title="{{ trans('common.edit') }}">@icon('edit')</button> + <button refs="page-comment@edit-button" type="button" class="text-button icon p-xs" aria-label="{{ trans('common.edit') }}" title="{{ trans('common.edit') }}">@icon('edit')</button> @endif @if(userCan('comment-create-all')) - <button refs="page-comment@reply-button" type="button" class="text-button" aria-label="{{ trans('common.reply') }}" title="{{ trans('common.reply') }}">@icon('reply')</button> + <button refs="page-comment@reply-button" type="button" class="text-button icon p-xs" aria-label="{{ trans('common.reply') }}" title="{{ trans('common.reply') }}">@icon('reply')</button> @endif @if(userCan('comment-delete', $comment)) <div component="dropdown" class="dropdown-container"> - <button type="button" refs="dropdown@toggle" aria-haspopup="true" aria-expanded="false" class="text-button" title="{{ trans('common.delete') }}">@icon('delete')</button> + <button type="button" refs="dropdown@toggle" aria-haspopup="true" aria-expanded="false" class="text-button icon p-xs" title="{{ trans('common.delete') }}">@icon('delete')</button> <ul refs="dropdown@menu" class="dropdown-menu" role="menu"> <li class="px-m text-small text-muted pb-s">{{trans('entities.comment_delete_confirm')}}</li> <li> diff --git a/resources/views/comments/create.blade.php b/resources/views/comments/create.blade.php index 5f9f6d449..88cec4876 100644 --- a/resources/views/comments/create.blade.php +++ b/resources/views/comments/create.blade.php @@ -1,30 +1,32 @@ -<div refs="page-comments@form-container" hidden class="comment-box"> +<div refs="page-comments@form-container" hidden class="comment-branch mb-m"> + <div class="comment-box"> - <div class="header p-s">{{ trans('entities.comment_new') }}</div> - <div refs="page-comments@reply-to-row" hidden class="primary-background-light text-muted px-s py-xs mb-s"> - <div class="grid left-focus v-center"> - <div> - {!! trans('entities.comment_in_reply_to', ['commentId' => '<a href=""></a>']) !!} - </div> - <div class="text-right"> - <button refs="page-comments@remove-reply-to-button" class="text-button">{{ trans('common.remove') }}</button> + <div class="header p-s">{{ trans('entities.comment_new') }}</div> + <div refs="page-comments@reply-to-row" hidden class="primary-background-light text-muted px-s py-xs mb-s"> + <div class="grid left-focus v-center"> + <div> + {!! trans('entities.comment_in_reply_to', ['commentId' => '<a href=""></a>']) !!} + </div> + <div class="text-right"> + <button refs="page-comments@remove-reply-to-button" class="text-button">{{ trans('common.remove') }}</button> + </div> </div> </div> - </div> - <div class="content px-s"> - <form refs="page-comments@form" novalidate> - <div class="form-group description-input"> + <div class="content px-s"> + <form refs="page-comments@form" novalidate> + <div class="form-group description-input"> <textarea refs="page-comments@form-input" name="markdown" rows="3" placeholder="{{ trans('entities.comment_placeholder') }}"></textarea> - </div> - <div class="form-group text-right"> - <button type="button" class="button outline" - refs="page-comments@hide-form-button">{{ trans('common.cancel') }}</button> - <button type="submit" class="button">{{ trans('entities.comment_save') }}</button> - </div> - </form> - </div> + </div> + <div class="form-group text-right"> + <button type="button" class="button outline" + refs="page-comments@hide-form-button">{{ trans('common.cancel') }}</button> + <button type="submit" class="button">{{ trans('entities.comment_save') }}</button> + </div> + </form> + </div> + </div> </div> \ No newline at end of file