Custom view
TinyMCE allows developers to create custom views and attach them to the main editor view. This feature enables the creation of additional UI components that can be toggled on or off. When toggled on, the custom view replaces the editor, providing a distinct visual space for specialized functionality.
This feature is only supported when TinyMCE is run in classic mode. It is not supported in inline mode. For more information on the differences between the editing modes, see Classic editing mode. |
Editor View API
The addView
API in the editor’s UI registry allows developers to register new view containers. These containers are initially hidden (off) and attached next to the main view. The visibility of these custom views can be toggled using the ToggleView
command. The state of the custom view can be queried using the queryCommandValue
method.
This is the syntax for the addView
function: editor.ui.registry.addView(name: String, obj: View.ViewSpec)
Parameters
Parameter | Type | Description |
---|---|---|
|
|
The |
|
|
The |
View Specification Object
Property | Type | Description |
---|---|---|
|
|
The |
|
|
The |
|
|
The |
Interactive example
This example shows how to integrate a custom view using the addView
API.
-
TinyMCE
-
HTML
-
JS
-
Edit on CodePen
<textarea id="custom-view">
<p><img style="display: block; margin-left: auto; margin-right: auto;" title="Tiny Logo" src="https://www.tiny.cloud/docs/images/logos/android-chrome-256x256.png" alt="TinyMCE Logo" width="128" height="128"></p>
<h2 style="text-align: center;">Welcome to the TinyMCE editor demo!</h2>
<p>Select the "Show Code View" toolbar button to open the custom view. This will enable you to modify the source code of the editor content.</p>
<h2>Got questions or need help?</h2>
<ul>
<li>Our <a href="https://www.tiny.cloud/docs/tinymce/6/">documentation</a> is a great resource for learning how to configure TinyMCE.</li>
<li>Have a specific question? Try the <a href="https://stackoverflow.com/questions/tagged/tinymce" target="_blank" rel="noopener"><code>tinymce</code> tag at Stack Overflow</a>.</li>
<li>We also offer enterprise grade support as part of <a href="https://www.tiny.cloud/pricing">TinyMCE premium plans</a>.</li>
</ul>
<h2>Found a bug?</h2>
<p>If you think you have found a bug please create an issue on the <a href="https://github.com/tinymce/tinymce/issues">GitHub repo</a> to report it to the developers.</p>
<h2>Finally ...</h2>
<p>Thanks for supporting TinyMCE! We hope it helps you and your users create great content.<br/>
All the best from the TinyMCE team.</p>
</textarea>
tinymce.init({
selector: "textarea#custom-view",
toolbar: "showCodeView",
height: 600,
setup: (ed) => {
ed.ui.registry.addView('code', {
buttons: [
{
type: 'button',
text: 'Cancel',
buttonType: 'secondary',
onAction: () => {
ed.execCommand('ToggleView', false, 'code');
console.log('close');
}
},
{
type: 'button',
text: 'Save code',
buttonType: 'primary',
onAction: () => {
const codeContent = document.querySelector('.tox-view__pane_panel').value;
ed.setContent(codeContent);
ed.execCommand('ToggleView', false, 'code');
console.log('save');
}
},
],
onShow: (api) => {
const editorContent = ed.getContent();
api.getContainer().innerHTML = `
<div style="height: 100%">
<textarea class="tox-view__pane_panel" style="width: 100%; height: 100%; resize: none; padding: 0.5em">
${editorContent}
</textarea>
</div>`.replace(/\s+/g, '');
},
onHide: (api) => {
console.log('Deactivate code', api.getContainer());
}
});
ed.ui.registry.addButton('showCodeView', {
icon: 'sourcecode',
text: 'Show Code View',
onAction: (_api) => {
console.log('source code editor');
ed.execCommand('ToggleView', false, 'code');
}
});
},
content_style: 'body { font-family:Helvetica,Arial,sans-serif; font-size:16px }'
});