Not supporting old content, existing HTML or updating yet.
return $this->tree;
}
+ public function canUpdateAny(): bool
+ {
+ foreach ($this->comments as $comment) {
+ if (userCan('comment-update', $comment)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
/**
* @param Comment[] $comments
*/
import {Component} from './component';
import {getLoading, htmlToDom} from '../services/dom';
+import {buildForInput} from "../wysiwyg/config";
export class PageComment extends Component {
this.deletedText = this.$opts.deletedText;
this.updatedText = this.$opts.updatedText;
- // Element References
+ // Editor reference and text options
+ this.wysiwygEditor = null;
+ this.wysiwygLanguage = this.$opts.wysiwygLanguage;
+ this.wysiwygTextDirection = this.$opts.wysiwygTextDirection;
+
+ // Element references
this.container = this.$el;
this.contentContainer = this.$refs.contentContainer;
this.form = this.$refs.form;
startEdit() {
this.toggleEditMode(true);
- const lineCount = this.$refs.input.value.split('\n').length;
- this.$refs.input.style.height = `${(lineCount * 20) + 40}px`;
+
+ if (this.wysiwygEditor) {
+ return;
+ }
+
+ const config = buildForInput({
+ language: this.wysiwygLanguage,
+ containerElement: this.input,
+ darkMode: document.documentElement.classList.contains('dark-mode'),
+ textDirection: this.wysiwygTextDirection,
+ translations: {},
+ translationMap: window.editor_translations,
+ });
+
+ window.tinymce.init(config).then(editors => {
+ this.wysiwygEditor = editors[0];
+ });
}
async update(event) {
import {Component} from './component';
import {getLoading, htmlToDom} from '../services/dom';
+import {buildForInput} from "../wysiwyg/config";
export class PageComments extends Component {
this.hideFormButton = this.$refs.hideFormButton;
this.removeReplyToButton = this.$refs.removeReplyToButton;
+ // WYSIWYG options
+ this.wysiwygLanguage = this.$opts.wysiwygLanguage;
+ this.wysiwygTextDirection = this.$opts.wysiwygTextDirection;
+ this.wysiwygEditor = null;
+
// Translations
this.createdText = this.$opts.createdText;
this.countText = this.$opts.countText;
this.formContainer.toggleAttribute('hidden', false);
this.addButtonContainer.toggleAttribute('hidden', true);
this.formContainer.scrollIntoView({behavior: 'smooth', block: 'nearest'});
- setTimeout(() => {
- this.formInput.focus();
- }, 100);
+ this.loadEditor();
}
hideForm() {
this.addButtonContainer.toggleAttribute('hidden', false);
}
+ loadEditor() {
+ if (this.wysiwygEditor) {
+ return;
+ }
+
+ const config = buildForInput({
+ language: this.wysiwygLanguage,
+ containerElement: this.formInput,
+ darkMode: document.documentElement.classList.contains('dark-mode'),
+ textDirection: this.wysiwygTextDirection,
+ translations: {},
+ translationMap: window.editor_translations,
+ });
+
+ window.tinymce.init(config).then(editors => {
+ this.wysiwygEditor = editors[0];
+ this.wysiwygEditor.focus();
+ });
+ }
+
getCommentCount() {
return this.container.querySelectorAll('[component="page-comment"]').length;
}
language: this.$opts.language,
containerElement: this.elem,
darkMode: document.documentElement.classList.contains('dark-mode'),
- textDirection: this.textDirection,
- translations: {
- imageUploadErrorText: this.$opts.imageUploadErrorText,
- serverUploadLimitText: this.$opts.serverUploadLimitText,
- },
+ textDirection: this.$opts.textDirection,
+ translations: {},
translationMap: window.editor_translations,
});
display: block;
}
+.wysiwyg-input.mce-content-body:before {
+ padding: 1rem;
+ top: 4px;
+ font-style: italic;
+ color: rgba(34,47,62,.5)
+}
+
// Default styles for our custom root nodes
.page-content.mce-content-body doc-root {
display: block;
option:page-comment:comment-parent-id="{{ $comment->parent_id }}"
option:page-comment:updated-text="{{ trans('entities.comment_updated_success') }}"
option:page-comment:deleted-text="{{ trans('entities.comment_deleted_success') }}"
+ option:page-comment:wysiwyg-language="{{ $locale->htmlLang() }}"
+ option:page-comment:wysiwyg-text-direction="{{ $locale->htmlDirection() }}"
id="comment{{$comment->local_id}}"
class="comment-box">
<div class="header">
option:page-comments:page-id="{{ $page->id }}"
option:page-comments:created-text="{{ trans('entities.comment_created_success') }}"
option:page-comments:count-text="{{ trans('entities.comment_count') }}"
+ option:page-comments:wysiwyg-language="{{ $locale->htmlLang() }}"
+ option:page-comments:wysiwyg-text-direction="{{ $locale->htmlDirection() }}"
class="comments-list"
aria-label="{{ trans('entities.comments') }}">
@if(userCan('comment-create-all'))
@include('comments.create')
-
@if (!$commentTree->empty())
<div refs="page-comments@addButtonContainer" class="text-right">
<button type="button"
@endif
@endif
+ @if(userCan('comment-create-all') || $commentTree->canUpdateAny())
+ @push('post-app-scripts')
+ <script src="{{ versioned_asset('libs/tinymce/tinymce.min.js') }}" nonce="{{ $cspNonce }}"></script>
+ @include('form.editor-translations')
+ @endpush
+ @endif
+
</section>
\ No newline at end of file
</div>
@yield('bottom')
+
+
@if($cspNonce ?? false)
<script src="{{ versioned_asset('dist/app.js') }}" nonce="{{ $cspNonce }}"></script>
@endif
@yield('scripts')
+ @stack('post-app-scripts')
@include('layouts.parts.base-body-end')
</body>