diff --git a/framework/core/js/src/common/components/TextEditor.js b/framework/core/js/src/common/components/TextEditor.js
index 2360df133..249d60eb8 100644
--- a/framework/core/js/src/common/components/TextEditor.js
+++ b/framework/core/js/src/common/components/TextEditor.js
@@ -21,6 +21,7 @@ import LoadingIndicator from './LoadingIndicator';
* - `placeholder`
* - `disabled`
* - `preview`
+ * - `onTextEditorBuilt`
*/
export default class TextEditor extends Component {
oninit(vnode) {
@@ -78,6 +79,7 @@ export default class TextEditor extends Component {
onbuild() {
this.attrs.composer.editor = this.buildEditor(this.$('.TextEditor-editorContainer')[0]);
+ this.attrs.onTextEditorBuilt?.();
}
onupdate(vnode) {
diff --git a/framework/core/js/src/forum/components/Composer.js b/framework/core/js/src/forum/components/Composer.js
index 94c6a1686..562ac0e0b 100644
--- a/framework/core/js/src/forum/components/Composer.js
+++ b/framework/core/js/src/forum/components/Composer.js
@@ -31,6 +31,8 @@ export default class Composer extends Component {
// Store the initial position so that we can trigger animations correctly.
this.prevPosition = this.state.position;
+
+ this.textEditorBuilt = false;
}
view() {
@@ -53,7 +55,9 @@ export default class Composer extends Component {
{listItems(this.controlItems().toArray())}
- {ComposerBody && }
+ {ComposerBody && (
+
+ )}
);
@@ -62,6 +66,17 @@ export default class Composer extends Component {
onupdate(vnode) {
super.onupdate(vnode);
+ if (this.textEditorBuilt) {
+ this.updateContainer();
+ }
+ }
+
+ onTextEditorBuilt() {
+ this.updateContainer();
+ this.textEditorBuilt = true;
+ }
+
+ updateContainer() {
if (this.state.position === this.prevPosition) {
// Set the height of the Composer element and its contents on each redraw,
// so that they do not lose it if their DOM elements are recreated.
diff --git a/framework/core/js/src/forum/components/ComposerBody.tsx b/framework/core/js/src/forum/components/ComposerBody.tsx
index 5789d7640..08fa6bdb4 100644
--- a/framework/core/js/src/forum/components/ComposerBody.tsx
+++ b/framework/core/js/src/forum/components/ComposerBody.tsx
@@ -17,6 +17,7 @@ export interface IComposerBodyAttrs extends ComponentAttrs {
user: any;
confirmExit: string;
disabled: boolean;
+ onTextEditorBuilt?: Function | null;
}
/**
@@ -63,6 +64,7 @@ export default abstract class ComposerBody
diff --git a/framework/core/js/src/forum/components/DiscussionComposer.js b/framework/core/js/src/forum/components/DiscussionComposer.js
index 42eb77aeb..632a3c137 100644
--- a/framework/core/js/src/forum/components/DiscussionComposer.js
+++ b/framework/core/js/src/forum/components/DiscussionComposer.js
@@ -15,6 +15,8 @@ import Stream from '../../common/utils/Stream';
* - `titlePlaceholder`
*/
export default class DiscussionComposer extends ComposerBody {
+ static focusOnSelector = () => '.DiscussionComposer-title';
+
static initAttrs(attrs) {
super.initAttrs(attrs);
@@ -47,7 +49,7 @@ export default class DiscussionComposer extends ComposerBody {
'discussionTitle',