- Tools
- How to Enable the Toolbar
- Expanding the Toolbar
- Configuring a Multi-row Toolbar
- Implementing a Scrollable Toolbar
- Creating a Sticky Toolbar
- Quick inline toolbar
- See Also
Contact Support
Toolbar in React Rich Text Editor component
25 Mar 202524 minutes to read
The Syncfusion React Rich Text Editor component provides a versatile and powerful toolbar to enhance your text editing experience. The toolbar contains a variety of formatting, styling, and editing tools, allowing users to create and modify content efficiently.
Tools
Default Toolbar Items
By default, the Angular Rich Text Editor displays the following toolbar items:
Bold
,Italic
,Underline
,|
,Formats
,Alignments
,Blockquote
,OrderedList
,UnorderedList
,|
,CreateLink
,Image
,|
,SourceCode
,Undo
,Redo
These default items cover essential text editing features, such as text formatting, lists, alignment, and linking.
Available Toolbar Items
The following table shows the list of available tools in the Rich Text Editor’s toolbar.
The order of items in the toolbar can be customized to meet your application’s requirements. If no specific order is set, the editor will render the above default toolbar items. Below is a list of all available toolbar items in the Rich Text Editor.
Text formatting
It provides tools for applying text styles such as bold, italic, underline, strike-through, and more to modify the appearance of the text.
Name | Icons | Summary | Initialization |
---|---|---|---|
Bold | ![]() |
Text that is thicker and darker than usual. | toolbarSettings: { items: [‘Bold’]} |
Italic | ![]() |
Shows a text that is leaned to the right. | toolbarSettings: { items: [‘Italic’]} |
Underline | ![]() |
The underline is added to the selected text. | toolbarSettings: { items: [‘Underline’]} |
StrikeThrough | ![]() |
Apply double line strike through formatting for the selected text. | toolbarSettings: { items: [‘StrikeThrough’]} |
ClearFormat | ![]() |
The clear format tool is useful to remove all formatting styles (such as bold, italic, underline, color, superscript, subscript, and more) from currently selected text. As a result, all the text formatting will be cleared and return to its default formatting styles. | toolbarSettings: { items: [‘ClearFormat’]} |
Blockquote | ![]() |
Blockquotes visually highlight important text within an editor, emphasizing key information or quotations. | toobarSettings: { items: [‘Blockquote’]} |
SubScript | ![]() |
Makes the selected text as subscript (lower). | toolbarSettings: { items: [‘SubScript’]} |
SuperScript | ![]() |
Makes the selected text as superscript (higher). | toolbarSettings: { items: [‘SuperScript’]} |
LowerCase | ![]() |
Change the case of selected text to lower in the content. | toolbarSettings: { items: [‘LowerCase’]} |
UpperCase | ![]() |
Change the case of selected text to upper in the content. | toolbarSettings: { items: [‘UpperCase’’]} |
Font & styling
Tools in this section allow users to customize font properties such as font family, size, color, background color, and paragraph formatting.
Name | Icons | Summary | Initialization |
---|---|---|---|
FontName | ![]() |
Defines the fonts that appear under the Font Family DropDownList from the Rich Text Editor’s toolbar. | toolbarSettings: { items: [‘FontName’]} |
FontSize | ![]() |
Defines the font sizes that appear under the Font Size DropDownList from the Rich Text Editor’s toolbar. | toolbarSettings: { items: [‘FontSize’]} |
FontColor | ![]() |
Specifies an array of colors can be used in the colors popup for font color. | toolbarSettings: { items: [‘FontColor’]} |
BackgroundColor | ![]() |
Specifies an array of colors can be used in the colors popup for background color. | toolbarSettings: { items: [‘BackgroundColor’]} |
Formats (Paragraph, Headings) | ![]() |
An Object with the options that will appear in the Paragraph Format dropdown from the toolbar. | toolbarSettings: { items: [‘Formats’]} |
Alignment
This section provides alignment options for the text or content, allowing users to justify text or align it to the left, center, or right.
Name | Icons | Summary | Initialization |
---|---|---|---|
Alignment | ![]() |
Align the content with left, center, and right margin. | toolbarSettings: { items: [‘Alignments’]} |
JustifyLeft | ![]() |
Allows each line to begin at the same distance from the editor’s left-hand side. | toolbarSettings: { items: [‘JustifyLeft’]} |
JustifyCenter | ![]() |
There is an even space on each side of each line since the text is not aligned to the left or right margins. | toolbarSettings: { items: [‘JustifyCenter’]} |
JustifyRight | ![]() |
Allows each line to end at the same distance from the editor’s right-hand side. | toolbarSettings: { items: [‘JustifyRight’]} |
JustifyFull | ![]() |
The text is aligned with both right and left margins. | toolbarSettings: { items: [‘JustifyFull’]} |
Lists & indentation
Tools here allow users to create ordered and unordered lists, change the list style, and adjust indentation levels for improved document structure.
Name | Icons | Summary | Initialization |
---|---|---|---|
OrderedList | ![]() |
Create a new list item(numbered). | toolbarSettings: { items: [‘OrderedList’]} |
UnorderedList | ![]() |
Create a new list item(bulleted). | toolbarSettings: { items: [‘UnorderedList’]} |
NumberFormatList | ![]() |
Allows to create list items with various list style types(numbered). | toolbarSettings: { items: [‘NumberFormatList’]} |
BulletFormatList | ![]() |
Allows to create list items with various list style types(bulleted). | toolbarSettings: { items: [‘BulletFormatList’]} |
Indent | ![]() |
Allows to increase the indent level of the content. | toolbarSettings: { items: [‘Indent’]} |
Outdent | ![]() |
Allows to decrease the indent level of the content. | toolbarSettings: { items: [‘Outdent’]} |
Hyperlinks
This section provides tools for inserting and managing hyperlinks within the content. Users can create new links or modify existing ones to enhance document navigation and interactivity.
Name | Icons | Summary | Initialization |
---|---|---|---|
Hyperlink | ![]() |
Creates a hyperlink to a text or image to a specific location in the content. | toolbarSettings: { items: [‘CreateLink’]} |
InsertLink | ![]() |
Allows users to add a link to a particular item. | toolbarSettings: { items: [‘InsertLink’]} |
Link quicktoolbar items
The link quicktoolbar provides tools to manage hyperlinks in the Rich Text Editor, allowing users to add, edit, or remove links from selected text or images directly within the editor.
Name | Icons | Summary | Initialization |
---|---|---|---|
OpenLink | ![]() |
To open the URL link that is attached to the selected text. | quickToolbarSettings: { link: [‘OpenLink’]} |
EditLink | ![]() |
Allows you to change the URL that has been attached to a specific item. | quickToolbarSettings: { link: [‘EditLink’]} |
RemoveLink | ![]() |
Allows you to remove the applied link from the selected item. | quickToolbarSettings: { link: [‘RemoveLink’]} |
Images
This section contains the primary tool for inserting images into the editor.
Name | Icons | Summary | Initialization |
---|---|---|---|
Insert Image | ![]() |
Inserts an image from an online source or local computer. | toolbarSettings: { items: [‘Image’]} |
Image quicktoolbar items
The image quicktoolbar offers a set of tools to edit images inserted in the Rich Text Editor. It allows users to modify image properties, including alignment, size, alternate text, and links, enhancing image management in the content.
Name | Icons | Summary | Initialization |
---|---|---|---|
Replace Image | ![]() |
Replace the selected image with another image. | quickToolbarSettings: { image: [‘Replace’]} |
Align Image | ![]() |
The image can be aligned to the right, left, or center. | quickToolbarSettings: { image: [‘Align’]} |
Remove Image | ![]() |
Allows to remove the selected image from the editor. | quickToolbarSettings: { image: [‘Remove’]} |
OpenImageLink | ![]() |
Opens the link that is attached to the selected image. | quickToolbarSettings: { image: [‘OpenImageLink’]} |
EditImageLink | ![]() |
Allows to edit the link that is attached to the selected image. | quickToolbarSettings: { image: [‘EditImageLink’]} |
RemoveImageLink | ![]() |
Removes the link that is attached to the selected image. | quickToolbarSettings: { image: [‘RemoveImageLink’]} |
Display | ![]() |
Allows you to choose whether an image should be shown inline or as a block. | quickToolbarSettings: { image: [‘Display’]} |
AltText | ![]() |
To display image description when an image on a Web page cannot be displayed. | quickToolbarSettings: { image: [‘AltText’]} |
Dimension | ![]() |
Allows you to customize the image’s height and width. | quickToolbarSettings: { image: [‘Dimension’]} |
Tables
This section offers the main tool for creating tables within the content.
Name | Icons | Summary | Initialization |
---|---|---|---|
CreateTable | ![]() |
Create a table with defined columns and rows. | toolbarSettings: { items: [‘CreateTable’]} |
Table quicktoolbar items
The table quicktoolbar provides options for table editing within the Rich Text Editor. Users can insert or remove rows and columns, merge or split cells, and access table properties for easier table management and customization.
Name | Icons | Summary | Initialization |
---|---|---|---|
RemoveTable | ![]() |
Removes the selected table and its contents. | quickToolbarSettings: { table: [‘TableRemove’]} |
TableHeader | ![]() |
Allows you to add a table header. | quickToolbarSettings: { table: [‘TableHeader’]} |
TableColumns | ![]() |
Shows the dropdown to insert a column or delete the selected column. | quickToolbarSettings: { table: [‘TableColumns’]} |
TableRows | ![]() |
Shows the dropdown to insert a row ors delete the selected row. | quickToolbarSettings: { table: [‘TableRows’]} |
TableCellHorizontalAlign | ![]() |
Allows the table cell content to be aligned horizontally. | quickToolbarSettings: { table: [‘TableCellHorizontalAlign’]} |
TableCellVerticalAlign | ![]() |
Allows the table cell content to be aligned vertically. | quickToolbarSettings: { table: [‘TableCellVerticalAlign’]} |
TableEditProperties | ![]() |
Allows you to change the table width, padding, and cell spacing styles. | quickToolbarSettings: { table: [‘TableEditProperties’]} |
Undo & redo
These tools allow users to easily undo or redo any changes made within the editor to restore or repeat previous actions.
Name | Icons | Summary | Initialization |
---|---|---|---|
Undo | ![]() |
Allows to undo the actions. | toolbarSettings: { items: [‘Undo’]} |
Redo | ![]() |
Allows to redo the actions. | toolbarSettings: { items: [‘Redo’]} |
Other tools
This section contains miscellaneous tools such as full-screen mode, print, preview, source code editing, and clearing all styles from text.
Name | Icons | Summary | Initialization |
---|---|---|---|
FullScreen | ![]() |
Stretches the editor to the maximum width and height of the browser window. | toolbarSettings: { items: [‘FullScreen’]} |
Maximize | ![]() |
Stretches the editor to the maximum width and height of the browser window. | toolbarSettings: { items: [‘Maximize’]} |
Minimize | ![]() |
Shrinks the editor to the default width and height. | toolbarSettings: { items: [‘Minimize’]} |
Preview | ![]() |
Allows to see how the editor’s content looks in a browser. | toolbarSettings: { items: [‘Preview’]} |
InsertCode | ![]() |
Represents preformatted text which is to be presented exactly as written in the HTML file. | toolbarSettings: { items: [‘InsertCode’]} |
![]() |
Allows to print the editor content. | toolbarSettings: { items: [‘Print’]} | |
ClearAll | ![]() |
Removes all styles that have been applied to the selected text. | toolbarSettings: { items: [‘ClearAll’]} |
SourceCode | ![]() |
Rich Text Editor includes the ability for users to directly edit HTML code via “Source View”. If you made any modification in Source view directly, synchronize with Design view. | toolbarSettings: { items: [‘SourceCode’]} |
Custom Toolbar Items
The Rich Text Editor allows you to configure your own commands to its toolbar using the toolbarSettings property. The command can be plain text, icon, or HTML template. The order and the group can also be defined where the command should be included. Bind action to the command by getting its instance.
This sample shows how to add your own commands to the toolbar of the Rich Text Editor. The “Ω” command is added to insert special characters in the editor. By clicking the “Ω” command, it will show the special characters list, and then choose the character to be inserted in the editor.
The following code snippet illustrates custom tool with tooltip text which will be included in items field of the toolbarSettings property.
The Rich Text Editor provides options to customize tool functionalities. Use the undo property to enable or disable the react function for specific tools. Additionally, the click
property lets you configure and bind the onclick event of a tool to a specific method.
This sample demonstrates how to add a custom “Ω” icon to the toolbar. Clicking on this icon opens a dialog where you can insert special characters into the editor. It also shows how to enable undo and redo functionalities.
{
template: '<button class="e-tbar-btn e-btn" tabindex="-1" id="custom_tbar" style="width:100%"><div class="e-tbar-btn-text" style="font-weight: 500;"> Ω</div></button>',
undo: true,
click: this.onClick.bind(this),
tooltipText: 'Insert Symbol'
}
[Class-component]
/**
* Rich Text Editor - Custom Tool Sample
*/
import { DialogComponent } from '@syncfusion/ej2-react-popups';
import { HtmlEditor, Image, Inject, Link, NodeSelection, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
class App extends React.Component {
rteObj;
// set the value to Rich Text Editor
template = `<div style="display:block;"><p style="margin-right:10px">The custom command "insert special character" is configured as the last item of the toolbar. Click on the command and choose the special character you want to include from the popup.</p></div>`;
selection = new NodeSelection();
ranges;
dialogObj;
// Rich Text Editor items list
items = ['Bold', 'Italic', 'Underline', '|', 'Formats', 'Alignments', 'OrderedList',
'UnorderedList', '|', 'CreateLink', 'Image', '|', 'SourceCode',
{
template: '<button class="e-tbar-btn e-btn" tabindex="-1" id="custom_tbar" style="width:100%"><div class="e-tbar-btn-text" style="font-weight: 500;"> Ω</div></button>',
undo: true,
click: this.onClick.bind(this),
tooltipText: 'Insert Symbol'
}, '|', 'Undo', 'Redo'
];
// Rich Text Editor ToolbarSettings
toolbarSettings = {
items: this.items
};
dlgButtons = [
{ buttonModel: { content: "Insert", isPrimary: true }, click: this.onInsert.bind(this) },
{ buttonModel: { content: 'Cancel' }, click: this.onCancel }
];
header = 'Special Characters';
target = document.getElementById('rteSection');
height = 'auto';
dialogCreate() {
const dialogCtn = document.getElementById('rteSpecial_char');
dialogCtn.onclick = (e) => {
const target = e.target;
const activeEle = this.dialogObj.element.querySelector('.char_block.e-active');
if (target.classList.contains('char_block')) {
target.classList.add('e-active');
if (activeEle) {
activeEle.classList.remove('e-active');
}
}
};
}
onInsert() {
const activeEle = this.dialogObj.element.querySelector('.char_block.e-active');
if (activeEle) {
this.ranges.insertNode(document.createTextNode(activeEle.textContent));
}
this.dialogOverlay();
}
onClick() {
this.ranges = this.selection.getRange(document);
this.dialogObj.width = this.rteObj.element.offsetWidth * 0.5;
this.dialogObj.content = document.getElementById('rteSpecial_char');
this.dialogObj.dataBind();
this.dialogObj.show();
}
dialogOverlay() {
const activeEle = this.dialogObj.element.querySelector('.char_block.e-active');
if (activeEle) {
activeEle.classList.remove('e-active');
}
this.dialogObj.hide();
}
onCancel(e) {
const activeEle = this.element.querySelector('.char_block.e-active');
if (activeEle) {
activeEle.classList.remove('e-active');
}
this.hide();
}
render() {
const hideDiv = { display: "none" };
return (<div className='control-pane'>
<div className='control-section e-rte-custom-tbar-section' id="rteCustomTool">
<div className='rte-control-section' id='rteSection'>
<RichTextEditorComponent id="defaultRTE" ref={(scope) => { this.rteObj = scope; }} valueTemplate={this.template} toolbarSettings={this.toolbarSettings}>
<Inject services={[HtmlEditor, Toolbar, Link, Image, QuickToolbar]}/>
</RichTextEditorComponent>
<DialogComponent id='customTbarDlg' ref={(scope) => { this.dialogObj = scope; }} buttons={this.dlgButtons} overlayClick={this.dialogOverlay = this.dialogOverlay.bind(this)} header={this.header} visible={false} showCloseIcon={false} target={'#rteSection'} height={this.height} created={this.dialogCreate = this.dialogCreate.bind(this)} isModal={true} cssClass={'e-rte-elements'}/>
<div id="customTbarDialog" style={hideDiv}>
<div id="rteSpecial_char">
<div className="char_block" title="^">^</div>
<div className="char_block" title="_">_</div>
<div className="char_block" title="`">`</div>
<div className="char_block" title="{">{</div>
<div className="char_block" title="|">|</div>
<div className="char_block" title="}">}</div>
<div className="char_block" title="~">~</div>
<div className="char_block" title=" "> </div>
<div className="char_block" title="¡">¡</div>
<div className="char_block" title="¢">¢</div>
<div className="char_block" title="£">£</div>
<div className="char_block" title="¤">¤</div>
<div className="char_block" title="¥">¥</div>
<div className="char_block" title="₹">₹</div>
<div className="char_block" title="¦">¦</div>
<div className="char_block" title="§">§</div>
<div className="char_block" title="¨">¨</div>
<div className="char_block" title="©">©</div>
<div className="char_block" title="ª">ª</div>
<div className="char_block" title="«">«</div>
<div className="char_block" title="¬">¬</div>
<div className="char_block" title="­">­</div>
<div className="char_block" title="®">®</div>
<div className="char_block" title="¯">¯</div>
<div className="char_block" title="°">°</div>
<div className="char_block" title="±">±</div>
<div className="char_block" title="²">²</div>
<div className="char_block" title="³">³</div>
<div className="char_block" title="´">´</div>
<div className="char_block" title="µ">µ</div>
<div className="char_block" title="¶">¶</div>
<div className="char_block" title="·">·</div>
<div className="char_block" title="¸">¸</div>
<div className="char_block" title="¹">¹</div>
<div className="char_block" title="º">º</div>
<div className="char_block" title="»">»</div>
<div className="char_block" title="¼">¼</div>
<div className="char_block" title="½">½</div>
<div className="char_block" title="¾">¾</div>
<div className="char_block" title="¿">¿</div>
<div className="char_block" title="À">À</div>
<div className="char_block" title="Á">Á</div>
<div className="char_block" title="Â">Â</div>
<div className="char_block" title="Ã">Ã</div>
</div>
</div>
</div>
</div>
</div>);
}
}
export default App;
/**
* Rich Text Editor - Custom Tool Sample
*/
import { DialogComponent } from '@syncfusion/ej2-react-popups';
import { HtmlEditor, Image, Inject, Link, NodeSelection, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
class App extends React.Component<{},{}> {
public rteObj: RichTextEditorComponent;
// set the value to Rich Text Editor
public template: string = `<div style="display:block;"><p style="margin-right:10px">The custom command "insert special character" is configured as the last item of the toolbar. Click on the command and choose the special character you want to include from the popup.</p></div>`;
public selection: NodeSelection = new NodeSelection();
public ranges: Range;
public dialogObj: DialogComponent;
// Rich Text Editor items list
public items: object = ['Bold', 'Italic', 'Underline', '|', 'Formats', 'Alignments', 'OrderedList',
'UnorderedList', '|', 'CreateLink', 'Image', '|', 'SourceCode',
{
template: '<button class="e-tbar-btn e-btn" tabindex="-1" id="custom_tbar" style="width:100%"><div class="e-tbar-btn-text" style="font-weight: 500;"> Ω</div></button>',
undo: true,
click: this.onClick.bind(this),
tooltipText: 'Insert Symbol'
}, '|', 'Undo', 'Redo'
];
// Rich Text Editor ToolbarSettings
public toolbarSettings: object = {
items: this.items
};
public dlgButtons: any = [
{ buttonModel: { content: "Insert", isPrimary: true }, click: this.onInsert.bind(this) },
{ buttonModel: { content: 'Cancel' }, click: this.onCancel }
];
public header: string = 'Special Characters';
public target: Element = document.getElementById('rteSection') as any;
public height: any = 'auto';
public dialogCreate(): void {
const dialogCtn: HTMLElement = document.getElementById('rteSpecial_char') as HTMLElement;
dialogCtn.onclick = (e: Event) => {
const target: HTMLElement = e.target as HTMLElement;
const activeEle: Element = this.dialogObj.element.querySelector('.char_block.e-active') as HTMLElement;
if (target.classList.contains('char_block')) {
target.classList.add('e-active');
if (activeEle) {
activeEle.classList.remove('e-active');
}
}
};
}
public onInsert(): void {
const activeEle: Element = this.dialogObj.element.querySelector('.char_block.e-active') as any;
if (activeEle) {
this.ranges.insertNode(document.createTextNode(activeEle.textContent as string));
}
this.dialogOverlay();
}
public onClick(): void {
this.ranges = this.selection.getRange(document);
this.dialogObj.width = (this.rteObj as any).element.offsetWidth * 0.5;
this.dialogObj.content = document.getElementById('rteSpecial_char') as HTMLElement;
this.dialogObj.dataBind();
this.dialogObj.show();
}
public dialogOverlay(): void {
const activeEle: Element = this.dialogObj.element.querySelector('.char_block.e-active') as HTMLElement;
if (activeEle) {
activeEle.classList.remove('e-active');
}
this.dialogObj.hide();
}
public onCancel(e: any): void {
const activeEle: Element = (this as any).element.querySelector('.char_block.e-active');
if (activeEle) {
activeEle.classList.remove('e-active');
}
(this as any).hide();
}
public render() {
const hideDiv = { display: "none" };
return (
<div className='control-pane'>
<div className='control-section e-rte-custom-tbar-section' id="rteCustomTool">
<div className='rte-control-section' id='rteSection'>
<RichTextEditorComponent id="defaultRTE" ref={(scope) => { this.rteObj = scope! }}
valueTemplate={this.template} toolbarSettings={this.toolbarSettings}>
<Inject services={[HtmlEditor, Toolbar, Link, Image, QuickToolbar]} />
</RichTextEditorComponent>
<DialogComponent id='customTbarDlg' ref={(scope) => { this.dialogObj = scope! }}
buttons={this.dlgButtons} overlayClick={this.dialogOverlay = this.dialogOverlay.bind(this) } header={this.header} visible={false}
showCloseIcon={false} target={'#rteSection'} height={this.height} created={this.dialogCreate = this.dialogCreate.bind(this)} isModal={true} cssClass={'e-rte-elements'} />
<div id="customTbarDialog" style={hideDiv}>
<div id="rteSpecial_char">
<div className="char_block" title="^">^</div>
<div className="char_block" title="_">_</div>
<div className="char_block" title="`">`</div>
<div className="char_block" title="{">{</div>
<div className="char_block" title="|">|</div>
<div className="char_block" title="}">}</div>
<div className="char_block" title="~">~</div>
<div className="char_block" title=" "> </div>
<div className="char_block" title="¡">¡</div>
<div className="char_block" title="¢">¢</div>
<div className="char_block" title="£">£</div>
<div className="char_block" title="¤">¤</div>
<div className="char_block" title="¥">¥</div>
<div className="char_block" title="₹">₹</div>
<div className="char_block" title="¦">¦</div>
<div className="char_block" title="§">§</div>
<div className="char_block" title="¨">¨</div>
<div className="char_block" title="©">©</div>
<div className="char_block" title="ª">ª</div>
<div className="char_block" title="«">«</div>
<div className="char_block" title="¬">¬</div>
<div className="char_block" title="­">­</div>
<div className="char_block" title="®">®</div>
<div className="char_block" title="¯">¯</div>
<div className="char_block" title="°">°</div>
<div className="char_block" title="±">±</div>
<div className="char_block" title="²">²</div>
<div className="char_block" title="³">³</div>
<div className="char_block" title="´">´</div>
<div className="char_block" title="µ">µ</div>
<div className="char_block" title="¶">¶</div>
<div className="char_block" title="·">·</div>
<div className="char_block" title="¸">¸</div>
<div className="char_block" title="¹">¹</div>
<div className="char_block" title="º">º</div>
<div className="char_block" title="»">»</div>
<div className="char_block" title="¼">¼</div>
<div className="char_block" title="½">½</div>
<div className="char_block" title="¾">¾</div>
<div className="char_block" title="¿">¿</div>
<div className="char_block" title="À">À</div>
<div className="char_block" title="Á">Á</div>
<div className="char_block" title="Â">Â</div>
<div className="char_block" title="Ã">Ã</div>
</div>
</div>
</div>
</div>
</div>
);
}
}
export default App;
[Functional-component]
/**
* Rich Text Editor - Custom Tool Sample
*/
import { DialogComponent } from '@syncfusion/ej2-react-popups';
import { HtmlEditor, Image, Inject, Link, NodeSelection, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
function App() {
let rteObj;
// set the value to Rich Text Editor
let template = `<div style="display:block;"><p style="margin-right:10px">The custom command "insert special character" is configured as the last item of the toolbar. Click on the command and choose the special character you want to include from the popup.</p></div>`;
let selection = new NodeSelection();
let ranges;
let dialogObj;
// Rich Text Editor items list
let items = ['Bold', 'Italic', 'Underline', '|', 'Formats', 'Alignments', 'OrderedList',
'UnorderedList', '|', 'CreateLink', 'Image', '|', 'SourceCode',
{
template: '<button class="e-tbar-btn e-btn" tabindex="-1" id="custom_tbar" style="width:100%"><div class="e-tbar-btn-text" style="font-weight: 500;"> Ω</div></button>',
undo: true,
click: onClick.bind(this),
tooltipText: 'Insert Symbol'
}, '|', 'Undo', 'Redo'
];
// Rich Text Editor ToolbarSettings
let toolbarSettings = {
items: items
};
let dlgButtons = [
{ buttonModel: { content: "Insert", isPrimary: true }, click: onInsert.bind(this) },
{ buttonModel: { content: 'Cancel' }, click: onCancel }
];
let header = 'Special Characters';
let target = document.getElementById('rteSection');
let height = 'auto';
function dialogCreate() {
const dialogCtn = document.getElementById('rteSpecial_char');
dialogCtn.onclick = (e) => {
const target = e.target;
const activeEle = dialogObj.element.querySelector('.char_block.e-active');
if (target.classList.contains('char_block')) {
target.classList.add('e-active');
if (activeEle) {
activeEle.classList.remove('e-active');
}
}
};
}
function onInsert() {
const activeEle = dialogObj.element.querySelector('.char_block.e-active');
if (activeEle) {
ranges.insertNode(document.createTextNode(activeEle.textContent));
}
dialogOverlay();
}
function onClick() {
ranges = selection.getRange(document);
dialogObj.width = rteObj.element.offsetWidth * 0.5;
dialogObj.content = document.getElementById('rteSpecial_char');
dialogObj.dataBind();
dialogObj.show();
}
function dialogOverlay() {
const activeEle = dialogObj.element.querySelector('.char_block.e-active');
if (activeEle) {
activeEle.classList.remove('e-active');
}
dialogObj.hide();
}
function onCancel(e) {
const activeEle = this.element.querySelector('.char_block.e-active');
if (activeEle) {
activeEle.classList.remove('e-active');
}
this.hide();
}
const hideDiv = { display: "none" };
return (<div className='control-pane'>
<div className='control-section e-rte-custom-tbar-section' id="rteCustomTool">
<div className='rte-control-section' id='rteSection'>
<RichTextEditorComponent id="defaultRTE" ref={(scope) => { rteObj = scope; }} valueTemplate={template} toolbarSettings={toolbarSettings}>
<Inject services={[HtmlEditor, Toolbar, Link, Image, QuickToolbar]}/>
</RichTextEditorComponent>
<DialogComponent id='customTbarDlg' ref={(scope) => { dialogObj = scope; }} buttons={dlgButtons} overlayClick={dialogOverlay.bind(this)} header={header} visible={false} showCloseIcon={false} target={'#rteSection'} height={height} created={dialogCreate.bind(this)} isModal={true} cssClass={'e-rte-elements'}/>
<div id="customTbarDialog" style={hideDiv}>
<div id="rteSpecial_char">
<div className="char_block" title="^">^</div>
<div className="char_block" title="_">_</div>
<div className="char_block" title="`">`</div>
<div className="char_block" title="{">{</div>
<div className="char_block" title="|">|</div>
<div className="char_block" title="}">}</div>
<div className="char_block" title="~">~</div>
<div className="char_block" title=" "> </div>
<div className="char_block" title="¡">¡</div>
<div className="char_block" title="¢">¢</div>
<div className="char_block" title="£">£</div>
<div className="char_block" title="¤">¤</div>
<div className="char_block" title="¥">¥</div>
<div className="char_block" title="₹">₹</div>
<div className="char_block" title="¦">¦</div>
<div className="char_block" title="§">§</div>
<div className="char_block" title="¨">¨</div>
<div className="char_block" title="©">©</div>
<div className="char_block" title="ª">ª</div>
<div className="char_block" title="«">«</div>
<div className="char_block" title="¬">¬</div>
<div className="char_block" title="­">­</div>
<div className="char_block" title="®">®</div>
<div className="char_block" title="¯">¯</div>
<div className="char_block" title="°">°</div>
<div className="char_block" title="±">±</div>
<div className="char_block" title="²">²</div>
<div className="char_block" title="³">³</div>
<div className="char_block" title="´">´</div>
<div className="char_block" title="µ">µ</div>
<div className="char_block" title="¶">¶</div>
<div className="char_block" title="·">·</div>
<div className="char_block" title="¸">¸</div>
<div className="char_block" title="¹">¹</div>
<div className="char_block" title="º">º</div>
<div className="char_block" title="»">»</div>
<div className="char_block" title="¼">¼</div>
<div className="char_block" title="½">½</div>
<div className="char_block" title="¾">¾</div>
<div className="char_block" title="¿">¿</div>
<div className="char_block" title="À">À</div>
<div className="char_block" title="Á">Á</div>
<div className="char_block" title="Â">Â</div>
<div className="char_block" title="Ã">Ã</div>
</div>
</div>
</div>
</div>
</div>);
}
export default App;
/**
* Rich Text Editor - Custom Tool Sample
*/
import { DialogComponent } from '@syncfusion/ej2-react-popups';
import { HtmlEditor, Image, Inject, Link, NodeSelection, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
function App(){
let rteObj: RichTextEditorComponent;
// set the value to Rich Text Editor
let template: string = `<div style="display:block;"><p style="margin-right:10px">The custom command "insert special character" is configured as the last item of the toolbar. Click on the command and choose the special character you want to include from the popup.</p></div>`;
let selection: NodeSelection = new NodeSelection();
let ranges: Range;
let dialogObj: DialogComponent;
// Rich Text Editor items list
let items: object = ['Bold', 'Italic', 'Underline', '|', 'Formats', 'Alignments', 'OrderedList',
'UnorderedList', '|', 'CreateLink', 'Image', '|', 'SourceCode',
{
template: '<button class="e-tbar-btn e-btn" tabindex="-1" id="custom_tbar" style="width:100%"><div class="e-tbar-btn-text" style="font-weight: 500;"> Ω</div></button>',
undo: true,
click: onClick.bind(this),
tooltipText: 'Insert Symbol'
}, '|', 'Undo', 'Redo'
];
// Rich Text Editor ToolbarSettings
let toolbarSettings: object = {
items: items
};
let dlgButtons: any = [
{ buttonModel: { content: "Insert", isPrimary: true }, click: onInsert.bind(this) },
{ buttonModel: { content: 'Cancel' }, click: onCancel }
];
let header: string = 'Special Characters';
let target: Element = document.getElementById('rteSection') as any;
let height: any = 'auto';
function dialogCreate(): void {
const dialogCtn: HTMLElement = document.getElementById('rteSpecial_char') as HTMLElement;
dialogCtn.onclick = (e: Event) => {
const target: HTMLElement = e.target as HTMLElement;
const activeEle: Element = dialogObj.element.querySelector('.char_block.e-active') as HTMLElement;
if (target.classList.contains('char_block')) {
target.classList.add('e-active');
if (activeEle) {
activeEle.classList.remove('e-active');
}
}
};
}
function onInsert(): void {
const activeEle: Element = dialogObj.element.querySelector('.char_block.e-active') as any;
if (activeEle) {
ranges.insertNode(document.createTextNode(activeEle.textContent as string));
}
dialogOverlay();
}
function onClick(): void {
ranges = selection.getRange(document);
dialogObj.width = (rteObj as any).element.offsetWidth * 0.5;
dialogObj.content = document.getElementById('rteSpecial_char') as HTMLElement;
dialogObj.dataBind();
dialogObj.show();
}
function dialogOverlay(): void {
const activeEle: Element = dialogObj.element.querySelector('.char_block.e-active') as HTMLElement;
if (activeEle) {
activeEle.classList.remove('e-active');
}
dialogObj.hide();
}
function onCancel(e: any): void {
const activeEle: Element = (this as any).element.querySelector('.char_block.e-active');
if (activeEle) {
activeEle.classList.remove('e-active');
}
(this as any).hide();
}
const hideDiv = { display: "none" };
return (
<div className='control-pane'>
<div className='control-section e-rte-custom-tbar-section' id="rteCustomTool">
<div className='rte-control-section' id='rteSection'>
<RichTextEditorComponent id="defaultRTE" ref={(scope) => { rteObj = scope! }}
valueTemplate={template} toolbarSettings={toolbarSettings}>
<Inject services={[HtmlEditor, Toolbar, Link, Image, QuickToolbar]} />
</RichTextEditorComponent>
<DialogComponent id='customTbarDlg' ref={(scope) => { dialogObj = scope! }}
buttons={dlgButtons} overlayClick={dialogOverlay.bind(this) } header={header} visible={false}
showCloseIcon={false} target={'#rteSection'} height={height} created={dialogCreate.bind(this)} isModal={true} cssClass={'e-rte-elements'}/>
<div id="customTbarDialog" style={hideDiv}>
<div id="rteSpecial_char">
<div className="char_block" title="^">^</div>
<div className="char_block" title="_">_</div>
<div className="char_block" title="`">`</div>
<div className="char_block" title="{">{</div>
<div className="char_block" title="|">|</div>
<div className="char_block" title="}">}</div>
<div className="char_block" title="~">~</div>
<div className="char_block" title=" "> </div>
<div className="char_block" title="¡">¡</div>
<div className="char_block" title="¢">¢</div>
<div className="char_block" title="£">£</div>
<div className="char_block" title="¤">¤</div>
<div className="char_block" title="¥">¥</div>
<div className="char_block" title="₹">₹</div>
<div className="char_block" title="¦">¦</div>
<div className="char_block" title="§">§</div>
<div className="char_block" title="¨">¨</div>
<div className="char_block" title="©">©</div>
<div className="char_block" title="ª">ª</div>
<div className="char_block" title="«">«</div>
<div className="char_block" title="¬">¬</div>
<div className="char_block" title="­">­</div>
<div className="char_block" title="®">®</div>
<div className="char_block" title="¯">¯</div>
<div className="char_block" title="°">°</div>
<div className="char_block" title="±">±</div>
<div className="char_block" title="²">²</div>
<div className="char_block" title="³">³</div>
<div className="char_block" title="´">´</div>
<div className="char_block" title="µ">µ</div>
<div className="char_block" title="¶">¶</div>
<div className="char_block" title="·">·</div>
<div className="char_block" title="¸">¸</div>
<div className="char_block" title="¹">¹</div>
<div className="char_block" title="º">º</div>
<div className="char_block" title="»">»</div>
<div className="char_block" title="¼">¼</div>
<div className="char_block" title="½">½</div>
<div className="char_block" title="¾">¾</div>
<div className="char_block" title="¿">¿</div>
<div className="char_block" title="À">À</div>
<div className="char_block" title="Á">Á</div>
<div className="char_block" title="Â">Â</div>
<div className="char_block" title="Ã">Ã</div>
</div>
</div>
</div>
</div>
</div>
);
}
export default App;
When rendering any component for the custom toolbar, like a dropdown, the focus may be lost, causing it to render outside the Rich Text Editor and triggering a blur event. This can interfere with proper functionalities like cursor focus. To prevent this issue, it is recommended to assign the
e-rte-element
s class to the component rendered in the custom toolbar.
Enabling and Disabling Toolbar Items
You can use the enableToolbarItem and 1disableToolbarItem methods to control the state of toolbar items. This methods takes a single item or an array of items as parameter.
You can add the command name
Custom
to disable the custom toolbar items on source code view and other quicktoolbar operations.
How to Enable the Toolbar
The Rich Text Editor toolbar contains a collection of tools such as bold, italic, and text alignment buttons that are used to format the content. However, in most integrations, you can customize the toolbar configurations easily to suit your needs.
To create Rich Text Editor with Toolbar feature, inject the toolbar module to the Rich Text Editor using the
RichTextEditor.Inject(Toolbar)
method.
The Rich Text Editor allows you to configure different types of toolbar using toolbarSettings.type field in toolbarSettings property. The types of toolbar are:
- Expand
- MultiRow
- Scrollable
Expanding the Toolbar
Setting the type
as MultiRow
in toolbarSettings will arrange the toolbar items across multiple rows, displaying all configured toolbar items.
[Class-component]
/**
* Rich Text Editor - Expand Toolbar Sample
*/
import { HtmlEditor, Image, Inject, Link, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
class App extends React.Component {
rteValue = "<p>The Syncfudion Rich Text Editor, a WYSIWYG (what you see is what you get) editor, is a user interface that allows you to create, edit, and format rich text content. You can try out a demo of this editor here.</p><p><b>Key features:</b></p><ul><li><p>Provides <IFRAME> and <DIV> modes.</p></li><li><p>Bulleted and numbered lists.</p></li><li><p>Handles images, hyperlinks, videos, hyperlinks, uploads, etc.</p></li><li><p>Contains undo/redo manager. </p></li></ul><div style='display: inline-block; width: 60%; vertical-align: top; cursor: auto;'><img alt='Sky with sun' src='https://cdn.syncfusion.com/ej2/richtexteditor-resources/RTE-Overview.png' width='309' style='min-width: 10px; min-height: 10px; width: 309px; height: 174px;' class='e-rte-image e-imginline e-rte-drag-image' height='174' /></div>";
toolbarSettings = {
items: ['Bold', 'Italic', 'Underline', 'StrikeThrough',
'FontName', 'FontSize', 'FontColor', 'BackgroundColor',
'LowerCase', 'UpperCase', '|',
'Formats', 'Alignments', 'OrderedList', 'UnorderedList',
'Outdent', 'Indent', '|',
'CreateLink', 'Image', '|', 'ClearFormat', 'Print',
'SourceCode', 'FullScreen', '|', 'Undo', 'Redo'
],
type: 'Expand'
};
render() {
return (<RichTextEditorComponent height={450} value={this.rteValue} toolbarSettings={this.toolbarSettings}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]}/>
</RichTextEditorComponent>);
}
}
export default App;
/**
* Rich Text Editor - Expand Toolbar Sample
*/
import { HtmlEditor, Image, Inject, Link, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
class App extends React.Component<{},{}> {
private rteValue:string = "<p>The Syncfudion Rich Text Editor, a WYSIWYG (what you see is what you get) editor, is a user interface that allows you to create, edit, and format rich text content. You can try out a demo of this editor here.</p><p><b>Key features:</b></p><ul><li><p>Provides <IFRAME> and <DIV> modes.</p></li><li><p>Bulleted and numbered lists.</p></li><li><p>Handles images, hyperlinks, videos, hyperlinks, uploads, etc.</p></li><li><p>Contains undo/redo manager. </p></li></ul><div style='display: inline-block; width: 60%; vertical-align: top; cursor: auto;'><img alt='Sky with sun' src='https://cdn.syncfusion.com/ej2/richtexteditor-resources/RTE-Overview.png' width='309' style='min-width: 10px; min-height: 10px; width: 309px; height: 174px;' class='e-rte-image e-imginline e-rte-drag-image' height='174' /></div>";
public toolbarSettings: object = {
items: ['Bold', 'Italic', 'Underline', 'StrikeThrough',
'FontName', 'FontSize', 'FontColor', 'BackgroundColor',
'LowerCase', 'UpperCase', '|',
'Formats', 'Alignments', 'OrderedList', 'UnorderedList',
'Outdent', 'Indent', '|',
'CreateLink', 'Image', '|', 'ClearFormat', 'Print',
'SourceCode', 'FullScreen', '|', 'Undo', 'Redo'
],
type: 'Expand'
}
public render() {
return (
<RichTextEditorComponent height={450} value={this.rteValue} toolbarSettings={this.toolbarSettings}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]} />
</RichTextEditorComponent>
);
}
}
export default App;
[Functional-component]
/**
* Rich Text Editor - Expand Toolbar Sample
*/
import { HtmlEditor, Image, Inject, Link, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
function App() {
let rteValue = "<p>The Syncfudion Rich Text Editor, a WYSIWYG (what you see is what you get) editor, is a user interface that allows you to create, edit, and format rich text content. You can try out a demo of this editor here.</p><p><b>Key features:</b></p><ul><li><p>Provides <IFRAME> and <DIV> modes.</p></li><li><p>Bulleted and numbered lists.</p></li><li><p>Handles images, hyperlinks, videos, hyperlinks, uploads, etc.</p></li><li><p>Contains undo/redo manager. </p></li></ul><div style='display: inline-block; width: 60%; vertical-align: top; cursor: auto;'><img alt='Sky with sun' src='https://cdn.syncfusion.com/ej2/richtexteditor-resources/RTE-Overview.png' width='309' style='min-width: 10px; min-height: 10px; width: 309px; height: 174px;' class='e-rte-image e-imginline e-rte-drag-image' height='174' /></div>";
let toolbarSettings = {
items: ['Bold', 'Italic', 'Underline', 'StrikeThrough',
'FontName', 'FontSize', 'FontColor', 'BackgroundColor',
'LowerCase', 'UpperCase', '|',
'Formats', 'Alignments', 'OrderedList', 'UnorderedList',
'Outdent', 'Indent', '|',
'CreateLink', 'Image', '|', 'ClearFormat', 'Print',
'SourceCode', 'FullScreen', '|', 'Undo', 'Redo'
],
type: 'Expand'
};
return (<RichTextEditorComponent height={450} value={rteValue} toolbarSettings={toolbarSettings}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]}/>
</RichTextEditorComponent>);
}
export default App;
/**
* Rich Text Editor - Expand Toolbar Sample
*/
import { HtmlEditor, Image, Inject, Link, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
function App(){
let rteValue: string = "<p>The Syncfudion Rich Text Editor, a WYSIWYG (what you see is what you get) editor, is a user interface that allows you to create, edit, and format rich text content. You can try out a demo of this editor here.</p><p><b>Key features:</b></p><ul><li><p>Provides <IFRAME> and <DIV> modes.</p></li><li><p>Bulleted and numbered lists.</p></li><li><p>Handles images, hyperlinks, videos, hyperlinks, uploads, etc.</p></li><li><p>Contains undo/redo manager. </p></li></ul><div style='display: inline-block; width: 60%; vertical-align: top; cursor: auto;'><img alt='Sky with sun' src='https://cdn.syncfusion.com/ej2/richtexteditor-resources/RTE-Overview.png' width='309' style='min-width: 10px; min-height: 10px; width: 309px; height: 174px;' class='e-rte-image e-imginline e-rte-drag-image' height='174' /></div>";
let toolbarSettings: object = {
items: ['Bold', 'Italic', 'Underline', 'StrikeThrough',
'FontName', 'FontSize', 'FontColor', 'BackgroundColor',
'LowerCase', 'UpperCase', '|',
'Formats', 'Alignments', 'OrderedList', 'UnorderedList',
'Outdent', 'Indent', '|',
'CreateLink', 'Image', '|', 'ClearFormat', 'Print',
'SourceCode', 'FullScreen', '|', 'Undo', 'Redo'
],
type: 'Expand'
}
return (
<RichTextEditorComponent height={450} value={rteValue} toolbarSettings={toolbarSettings}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]} />
</RichTextEditorComponent>
);
}
export default App;
Configuring a Multi-row Toolbar
Setting the type
as MultiRow
in toolbarSettings will arrange the toolbar items across multiple rows, displaying all configured toolbar items.
[Class-component]
/**
* Rich Text Editor - MultiRow Toolbar Sample
*/
import { HtmlEditor, Image, Inject, Link, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
class App extends React.Component {
rteValue = "<p>The Syncfudion Rich Text Editor, a WYSIWYG (what you see is what you get) editor, is a user interface that allows you to create, edit, and format rich text content. You can try out a demo of this editor here.</p><p><b>Key features:</b></p><ul><li><p>Provides <IFRAME> and <DIV> modes.</p></li><li><p>Bulleted and numbered lists.</p></li><li><p>Handles images, hyperlinks, videos, hyperlinks, uploads, etc.</p></li><li><p>Contains undo/redo manager. </p></li></ul><div style='display: inline-block; width: 60%; vertical-align: top; cursor: auto;'><img alt='Sky with sun' src='https://cdn.syncfusion.com/ej2/richtexteditor-resources/RTE-Overview.png' width='309' style='min-width: 10px; min-height: 10px; width: 309px; height: 174px;' class='e-rte-image e-imginline e-rte-drag-image' height='174' /></div>";
toolbarSettings = {
items: ['Bold', 'Italic', 'Underline', 'StrikeThrough',
'FontName', 'FontSize', 'FontColor', 'BackgroundColor',
'LowerCase', 'UpperCase', '|',
'Formats', 'Alignments', 'OrderedList', 'UnorderedList',
'Outdent', 'Indent', '|',
'CreateLink', 'Image', '|', 'ClearFormat', 'Print',
'SourceCode', 'FullScreen', '|', 'Undo', 'Redo'
],
type: 'MultiRow'
};
render() {
return (<RichTextEditorComponent height={450} value={this.rteValue} toolbarSettings={this.toolbarSettings}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]}/>
</RichTextEditorComponent>);
}
}
export default App;
/**
* Rich Text Editor - MultiRow Toolbar Sample
*/
import { HtmlEditor, Image, Inject, Link, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
class App extends React.Component<{},{}> {
private rteValue: string = "<p>The Syncfudion Rich Text Editor, a WYSIWYG (what you see is what you get) editor, is a user interface that allows you to create, edit, and format rich text content. You can try out a demo of this editor here.</p><p><b>Key features:</b></p><ul><li><p>Provides <IFRAME> and <DIV> modes.</p></li><li><p>Bulleted and numbered lists.</p></li><li><p>Handles images, hyperlinks, videos, hyperlinks, uploads, etc.</p></li><li><p>Contains undo/redo manager. </p></li></ul><div style='display: inline-block; width: 60%; vertical-align: top; cursor: auto;'><img alt='Sky with sun' src='https://cdn.syncfusion.com/ej2/richtexteditor-resources/RTE-Overview.png' width='309' style='min-width: 10px; min-height: 10px; width: 309px; height: 174px;' class='e-rte-image e-imginline e-rte-drag-image' height='174' /></div>";
private toolbarSettings: object = {
items: ['Bold', 'Italic', 'Underline', 'StrikeThrough',
'FontName', 'FontSize', 'FontColor', 'BackgroundColor',
'LowerCase', 'UpperCase', '|',
'Formats', 'Alignments', 'OrderedList', 'UnorderedList',
'Outdent', 'Indent', '|',
'CreateLink', 'Image', '|', 'ClearFormat', 'Print',
'SourceCode', 'FullScreen', '|', 'Undo', 'Redo'
],
type: 'MultiRow'
}
public render() {
return (
<RichTextEditorComponent height={450} value={this.rteValue} toolbarSettings={this.toolbarSettings}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]} />
</RichTextEditorComponent>
);
}
}
export default App;
[Functional-component]
/**
* Rich Text Editor - MultiRow Toolbar Sample
*/
import { HtmlEditor, Image, Inject, Link, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
function App() {
let rteValue = "<p>The Syncfudion Rich Text Editor, a WYSIWYG (what you see is what you get) editor, is a user interface that allows you to create, edit, and format rich text content. You can try out a demo of this editor here.</p><p><b>Key features:</b></p><ul><li><p>Provides <IFRAME> and <DIV> modes.</p></li><li><p>Bulleted and numbered lists.</p></li><li><p>Handles images, hyperlinks, videos, hyperlinks, uploads, etc.</p></li><li><p>Contains undo/redo manager. </p></li></ul><div style='display: inline-block; width: 60%; vertical-align: top; cursor: auto;'><img alt='Sky with sun' src='https://cdn.syncfusion.com/ej2/richtexteditor-resources/RTE-Overview.png' width='309' style='min-width: 10px; min-height: 10px; width: 309px; height: 174px;' class='e-rte-image e-imginline e-rte-drag-image' height='174' /></div>";
let toolbarSettings = {
items: ['Bold', 'Italic', 'Underline', 'StrikeThrough',
'FontName', 'FontSize', 'FontColor', 'BackgroundColor',
'LowerCase', 'UpperCase', '|',
'Formats', 'Alignments', 'OrderedList', 'UnorderedList',
'Outdent', 'Indent', '|',
'CreateLink', 'Image', '|', 'ClearFormat', 'Print',
'SourceCode', 'FullScreen', '|', 'Undo', 'Redo'
],
type: 'MultiRow'
};
return (<RichTextEditorComponent height={450} value={rteValue} toolbarSettings={toolbarSettings}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]}/>
</RichTextEditorComponent>);
}
export default App;
/**
* Rich Text Editor - MultiRow Toolbar Sample
*/
import { HtmlEditor, Image, Inject, Link, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
function App() {
let rteValue:string = "<p>The Syncfudion Rich Text Editor, a WYSIWYG (what you see is what you get) editor, is a user interface that allows you to create, edit, and format rich text content. You can try out a demo of this editor here.</p><p><b>Key features:</b></p><ul><li><p>Provides <IFRAME> and <DIV> modes.</p></li><li><p>Bulleted and numbered lists.</p></li><li><p>Handles images, hyperlinks, videos, hyperlinks, uploads, etc.</p></li><li><p>Contains undo/redo manager. </p></li></ul><div style='display: inline-block; width: 60%; vertical-align: top; cursor: auto;'><img alt='Sky with sun' src='https://cdn.syncfusion.com/ej2/richtexteditor-resources/RTE-Overview.png' width='309' style='min-width: 10px; min-height: 10px; width: 309px; height: 174px;' class='e-rte-image e-imginline e-rte-drag-image' height='174' /></div>";
let toolbarSettings: object = {
items: ['Bold', 'Italic', 'Underline', 'StrikeThrough',
'FontName', 'FontSize', 'FontColor', 'BackgroundColor',
'LowerCase', 'UpperCase', '|',
'Formats', 'Alignments', 'OrderedList', 'UnorderedList',
'Outdent', 'Indent', '|',
'CreateLink', 'Image', '|', 'ClearFormat', 'Print',
'SourceCode', 'FullScreen', '|', 'Undo', 'Redo'
],
type: 'MultiRow'
}
return (
<RichTextEditorComponent height={450} value={rteValue} toolbarSettings={toolbarSettings}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]} />
</RichTextEditorComponent>
);
}
export default App;
Implementing a Scrollable Toolbar
Setting the type
to Scrollable
in toolbarSettings will display the toolbar items in a single line, enabling horizontal scrolling in the toolbar.
[Class-component]
/**
* Rich Text Editor - Scrollable Toolbar Sample
*/
import { HtmlEditor, Image, Inject, Link, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
class App extends React.Component {
rteValue = "<p>The Syncfudion Rich Text Editor, a WYSIWYG (what you see is what you get) editor, is a user interface that allows you to create, edit, and format rich text content. You can try out a demo of this editor here.</p><p><b>Key features:</b></p><ul><li><p>Provides <IFRAME> and <DIV> modes.</p></li><li><p>Bulleted and numbered lists.</p></li><li><p>Handles images, hyperlinks, videos, hyperlinks, uploads, etc.</p></li><li><p>Contains undo/redo manager. </p></li></ul><div style='display: inline-block; width: 60%; vertical-align: top; cursor: auto;'><img alt='Sky with sun' src='https://cdn.syncfusion.com/ej2/richtexteditor-resources/RTE-Overview.png' width='309' style='min-width: 10px; min-height: 10px; width: 309px; height: 174px;' class='e-rte-image e-imginline e-rte-drag-image' height='174' /></div>";
toolbarSettings = {
items: ['Bold', 'Italic', 'Underline', 'StrikeThrough',
'FontName', 'FontSize', 'FontColor', 'BackgroundColor',
'LowerCase', 'UpperCase', '|',
'Formats', 'Alignments', 'OrderedList', 'UnorderedList',
'Outdent', 'Indent', '|',
'CreateLink', 'Image', '|', 'ClearFormat', 'Print',
'SourceCode', 'FullScreen', '|', 'Undo', 'Redo'
],
type: 'Scrollable'
};
render() {
return (<RichTextEditorComponent height={450} value={this.rteValue} toolbarSettings={this.toolbarSettings}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]}/>
</RichTextEditorComponent>);
}
}
export default App;
/**
* Rich Text Editor - Scrollable Toolbar Sample
*/
import { HtmlEditor, Image, Inject, Link, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
class App extends React.Component<{},{}> {
private rteValue: string = "<p>The Syncfudion Rich Text Editor, a WYSIWYG (what you see is what you get) editor, is a user interface that allows you to create, edit, and format rich text content. You can try out a demo of this editor here.</p><p><b>Key features:</b></p><ul><li><p>Provides <IFRAME> and <DIV> modes.</p></li><li><p>Bulleted and numbered lists.</p></li><li><p>Handles images, hyperlinks, videos, hyperlinks, uploads, etc.</p></li><li><p>Contains undo/redo manager. </p></li></ul><div style='display: inline-block; width: 60%; vertical-align: top; cursor: auto;'><img alt='Sky with sun' src='https://cdn.syncfusion.com/ej2/richtexteditor-resources/RTE-Overview.png' width='309' style='min-width: 10px; min-height: 10px; width: 309px; height: 174px;' class='e-rte-image e-imginline e-rte-drag-image' height='174' /></div>";
private toolbarSettings: object = {
items: ['Bold', 'Italic', 'Underline', 'StrikeThrough',
'FontName', 'FontSize', 'FontColor', 'BackgroundColor',
'LowerCase', 'UpperCase', '|',
'Formats', 'Alignments', 'OrderedList', 'UnorderedList',
'Outdent', 'Indent', '|',
'CreateLink', 'Image', '|', 'ClearFormat', 'Print',
'SourceCode', 'FullScreen', '|', 'Undo', 'Redo'
],
type: 'Scrollable'
}
public render() {
return (
<RichTextEditorComponent height={450} value={this.rteValue} toolbarSettings={this.toolbarSettings}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]} />
</RichTextEditorComponent>
);
}
}
export default App;
[functional-component]
/**
* Rich Text Editor - Scrollable Toolbar Sample
*/
import { HtmlEditor, Image, Inject, Link, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
function App() {
let rteValue = "<p>The Syncfudion Rich Text Editor, a WYSIWYG (what you see is what you get) editor, is a user interface that allows you to create, edit, and format rich text content. You can try out a demo of this editor here.</p><p><b>Key features:</b></p><ul><li><p>Provides <IFRAME> and <DIV> modes.</p></li><li><p>Bulleted and numbered lists.</p></li><li><p>Handles images, hyperlinks, videos, hyperlinks, uploads, etc.</p></li><li><p>Contains undo/redo manager. </p></li></ul><div style='display: inline-block; width: 60%; vertical-align: top; cursor: auto;'><img alt='Sky with sun' src='https://cdn.syncfusion.com/ej2/richtexteditor-resources/RTE-Overview.png' width='309' style='min-width: 10px; min-height: 10px; width: 309px; height: 174px;' class='e-rte-image e-imginline e-rte-drag-image' height='174' /></div>";
let toolbarSettings = {
items: ['Bold', 'Italic', 'Underline', 'StrikeThrough',
'FontName', 'FontSize', 'FontColor', 'BackgroundColor',
'LowerCase', 'UpperCase', '|',
'Formats', 'Alignments', 'OrderedList', 'UnorderedList',
'Outdent', 'Indent', '|',
'CreateLink', 'Image', '|', 'ClearFormat', 'Print',
'SourceCode', 'FullScreen', '|', 'Undo', 'Redo'
],
type: 'Scrollable'
};
return (<RichTextEditorComponent height={450} value={rteValue} toolbarSettings={toolbarSettings}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]}/>
</RichTextEditorComponent>);
}
export default App;
/**
* Rich Text Editor - Scrollable Toolbar Sample
*/
import { HtmlEditor, Image, Inject, Link, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
function App() {
let rteValue: string = "<p>The Syncfudion Rich Text Editor, a WYSIWYG (what you see is what you get) editor, is a user interface that allows you to create, edit, and format rich text content. You can try out a demo of this editor here.</p><p><b>Key features:</b></p><ul><li><p>Provides <IFRAME> and <DIV> modes.</p></li><li><p>Bulleted and numbered lists.</p></li><li><p>Handles images, hyperlinks, videos, hyperlinks, uploads, etc.</p></li><li><p>Contains undo/redo manager. </p></li></ul><div style='display: inline-block; width: 60%; vertical-align: top; cursor: auto;'><img alt='Sky with sun' src='https://cdn.syncfusion.com/ej2/richtexteditor-resources/RTE-Overview.png' width='309' style='min-width: 10px; min-height: 10px; width: 309px; height: 174px;' class='e-rte-image e-imginline e-rte-drag-image' height='174' /></div>";
let toolbarSettings: object = {
items: ['Bold', 'Italic', 'Underline', 'StrikeThrough',
'FontName', 'FontSize', 'FontColor', 'BackgroundColor',
'LowerCase', 'UpperCase', '|',
'Formats', 'Alignments', 'OrderedList', 'UnorderedList',
'Outdent', 'Indent', '|',
'CreateLink', 'Image', '|', 'ClearFormat', 'Print',
'SourceCode', 'FullScreen', '|', 'Undo', 'Redo'
],
type: 'Scrollable'
}
return (
<RichTextEditorComponent height={450} value={rteValue} toolbarSettings={toolbarSettings}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]} />
</RichTextEditorComponent>
);
}
export default App;
Creating a Sticky Toolbar
By default, the toolbar remains fixed at the top of the Rich Text Editor when scrolling. You can customize the position of this sticky toolbar by setting the floatingToolbarOffset to adjust its offset from the top of the document.
Additionally, you can enable or disable the floating toolbar using the enableFloating property.
[Class-component]
import { CheckBoxComponent } from '@syncfusion/ej2-react-buttons';
import { HtmlEditor, Image, Inject, Link, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
class App extends React.Component {
checkboxObj;
rteObj;
toolbarSettings = {
enableFloating: false
};
onChange(args) {
this.rteObj.toolbarSettings.enableFloating = args.checked;
this.rteObj.dataBind();
}
rteValue = "<p>The Syncfudion Rich Text Editor, a WYSIWYG (what you see is what you get) editor, is a user interface that allows you to create, edit, and format rich text content. You can try out a demo of this editor here.</p><p><b>Key features:</b></p><ul><li><p>Provides <IFRAME> and <DIV> modes.</p></li><li><p>Bulleted and numbered lists.</p></li><li><p>Handles images, hyperlinks, videos, hyperlinks, uploads, etc.</p></li><li><p>Contains undo/redo manager. </p></li></ul><div style='display: inline-block; width: 60%; vertical-align: top; cursor: auto;'><img alt='Sky with sun' src='https://cdn.syncfusion.com/ej2/richtexteditor-resources/RTE-Overview.png' width='309' style='min-width: 10px; min-height: 10px; width: 309px; height: 174px;' class='e-rte-image e-imginline e-rte-drag-image' height='174' /></div>";
render() {
return (<div>
<CheckBoxComponent checked={false} label='Enable Floating' ref={(scope) => { this.checkboxObj = scope; }} change={this.onChange = this.onChange.bind(this)}/>
<br />
<br />
<br />
<RichTextEditorComponent ref={(scope) => { this.rteObj = scope; }} height={450} value={this.rteValue} toolbarSettings={this.toolbarSettings}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]}/>
</RichTextEditorComponent>
</div>);
}
}
export default App;
/**
* Rich Text Editor - Floating Toolbar Sample
*/
import { ChangeEventArgs } from '@syncfusion/ej2-buttons';
import { CheckBoxComponent } from '@syncfusion/ej2-react-buttons';
import { HtmlEditor, Image, Inject, Link, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
class App extends React.Component<{},{}> {
public checkboxObj: CheckBoxComponent;
public rteObj: RichTextEditorComponent;
public toolbarSettings: object = {
enableFloating: false
}
private rteValue: string = "<p>The Syncfudion Rich Text Editor, a WYSIWYG (what you see is what you get) editor, is a user interface that allows you to create, edit, and format rich text content. You can try out a demo of this editor here.</p><p><b>Key features:</b></p><ul><li><p>Provides <IFRAME> and <DIV> modes.</p></li><li><p>Bulleted and numbered lists.</p></li><li><p>Handles images, hyperlinks, videos, hyperlinks, uploads, etc.</p></li><li><p>Contains undo/redo manager. </p></li></ul><div style='display: inline-block; width: 60%; vertical-align: top; cursor: auto;'><img alt='Sky with sun' src='https://cdn.syncfusion.com/ej2/richtexteditor-resources/RTE-Overview.png' width='309' style='min-width: 10px; min-height: 10px; width: 309px; height: 174px;' class='e-rte-image e-imginline e-rte-drag-image' height='174' /></div>";
public onChange(args: ChangeEventArgs): void {
this.rteObj.toolbarSettings.enableFloating = args.checked;
this.rteObj.dataBind();
}
public render() {
return (
<div>
<CheckBoxComponent checked={false} label='Enable Floating' ref={(scope) => { this.checkboxObj = scope! }} change={ this.onChange=this.onChange.bind(this) } />
<br />
<br />
<br />
<RichTextEditorComponent ref={(scope) => { this.rteObj = scope! }} value={this.rteValue} height={450} toolbarSettings={this.toolbarSettings}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]} />
</RichTextEditorComponent>
</div>
);
}
}
export default App;
[functional-component]
import { CheckBoxComponent } from '@syncfusion/ej2-react-buttons';
import { HtmlEditor, Image, Inject, Link, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
function App() {
let checkboxObj;
let rteObj;
let toolbarSettings = {
enableFloating: false
};
let rteValue = "<p>The Syncfudion Rich Text Editor, a WYSIWYG (what you see is what you get) editor, is a user interface that allows you to create, edit, and format rich text content. You can try out a demo of this editor here.</p><p><b>Key features:</b></p><ul><li><p>Provides <IFRAME> and <DIV> modes.</p></li><li><p>Bulleted and numbered lists.</p></li><li><p>Handles images, hyperlinks, videos, hyperlinks, uploads, etc.</p></li><li><p>Contains undo/redo manager. </p></li></ul><div style='display: inline-block; width: 60%; vertical-align: top; cursor: auto;'><img alt='Sky with sun' src='https://cdn.syncfusion.com/ej2/richtexteditor-resources/RTE-Overview.png' width='309' style='min-width: 10px; min-height: 10px; width: 309px; height: 174px;' class='e-rte-image e-imginline e-rte-drag-image' height='174' /></div>";
function onChange(args) {
rteObj.toolbarSettings.enableFloating = args.checked;
rteObj.dataBind();
}
return (<div>
<CheckBoxComponent checked={false} label='Enable Floating' ref={(scope) => { checkboxObj = scope; }} change={onChange.bind(this)}/>
<br />
<br />
<br />
<RichTextEditorComponent ref={(scope) => { rteObj = scope; }} value={rteValue} height={450} toolbarSettings={toolbarSettings}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]}/>
</RichTextEditorComponent>
</div>);
}
export default App;
/**
* Rich Text Editor - Floating Toolbar Sample
*/
import { ChangeEventArgs } from '@syncfusion/ej2-buttons';
import { CheckBoxComponent } from '@syncfusion/ej2-react-buttons';
import { HtmlEditor, Image, Inject, Link, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
function App() {
let checkboxObj: CheckBoxComponent;
let rteObj: RichTextEditorComponent;
let toolbarSettings: object = {
enableFloating: false
}
let rteValue: string = "<p>The Syncfudion Rich Text Editor, a WYSIWYG (what you see is what you get) editor, is a user interface that allows you to create, edit, and format rich text content. You can try out a demo of this editor here.</p><p><b>Key features:</b></p><ul><li><p>Provides <IFRAME> and <DIV> modes.</p></li><li><p>Bulleted and numbered lists.</p></li><li><p>Handles images, hyperlinks, videos, hyperlinks, uploads, etc.</p></li><li><p>Contains undo/redo manager. </p></li></ul><div style='display: inline-block; width: 60%; vertical-align: top; cursor: auto;'><img alt='Sky with sun' src='https://cdn.syncfusion.com/ej2/richtexteditor-resources/RTE-Overview.png' width='309' style='min-width: 10px; min-height: 10px; width: 309px; height: 174px;' class='e-rte-image e-imginline e-rte-drag-image' height='174' /></div>";
function onChange(args: ChangeEventArgs): void {
rteObj.toolbarSettings.enableFloating = args.checked;
rteObj.dataBind();
}
return (
<div>
<CheckBoxComponent checked={false} label='Enable Floating' ref={(scope) => {checkboxObj = scope! }} change={onChange.bind(this) } />
<br />
<br />
<br />
<RichTextEditorComponent ref={(scope) => {rteObj = scope! }} value={rteValue} height={450} toolbarSettings={toolbarSettings}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]} />
</RichTextEditorComponent>
</div>
);
}
export default App;
Quick inline toolbar
Quick commands are opened as context-menu on clicking the corresponding element. The commands must be passed as string collection to image, text, and link attributes of the quickToolbarSettings property.
Target element | Default quick toolbar items |
---|---|
Image | ‘Replace’, ‘Align’, ‘Caption’, ‘Remove’, ‘InsertLink’, ‘Display’, ‘AltText’, and ‘Dimension’ |
Link | ‘Open’, ‘Edit’, and ‘UnLink’ |
Text | null (Any toolbar items in the Rich Text Editor can be configured here). |
Table | ‘TableHeader’, ‘TableRows’, ‘TableColumns’, ‘BackgroundColor’, ‘TableRemove’, ‘Alignments’, ‘TableCellVerticalAlign’ and ‘Styles’ |
Custom tool can be added to the corresponding quick toolbar, using the quickToolbarSettings property.
The following sample demonstrates the option to insert the image to the Rich Text Editor content as well as option to rotate the image through the quick toolbar. The image rotation functionalities have been achieved through the toolbarClick event.
[Class-component]
/**
* Rich Text Editor - Quick Inline Toolbar Sample
*/
import { HtmlEditor, Image, Inject, Link, NodeSelection, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
class App extends React.Component {
rteObj;
quickToolbarSettings = {
image: [
'Replace', 'Align', 'Caption', 'Remove', 'InsertLink', 'OpenImageLink', '-',
'EditImageLink', 'RemoveImageLink', 'Display', 'AltText', 'Dimension',
{
template: '<button class="e-tbar-btn e-btn" id="roatateLeft"><span class="e-btn-icon e-icons e-rotate-left"></span>',
tooltipText: 'Rotate Left'
},
{
template: '<button class="e-tbar-btn e-btn" id="roatateRight"><span class="e-btn-icon e-icons e-rotate-right"></span>',
tooltipText: 'Rotate Right'
}
]
};
rteValue = "<p>The Syncfudion Rich Text Editor, a WYSIWYG (what you see is what you get) editor, is a user interface that allows you to create, edit, and format rich text content. You can try out a demo of this editor here.</p><p><b>Key features:</b></p><ul><li><p>Provides <IFRAME> and <DIV> modes.</p></li><li><p>Bulleted and numbered lists.</p></li><li><p>Handles images, hyperlinks, videos, hyperlinks, uploads, etc.</p></li><li><p>Contains undo/redo manager. </p></li></ul><div style='display: inline-block; width: 60%; vertical-align: top; cursor: auto;'><img alt='Sky with sun' src='https://cdn.syncfusion.com/ej2/richtexteditor-resources/RTE-Overview.png' width='309' style='min-width: 10px; min-height: 10px; width: 309px; height: 174px;' class='e-rte-image e-imginline e-rte-drag-image' height='174' /></div>";
onToolbarClick(e) {
const nodeObj = new NodeSelection();
const range = nodeObj.getRange(this.rteObj.contentModule.getDocument());
const imgEle = nodeObj.getNodeCollection(range)[0];
if (e.item.tooltipText === 'Rotate Right') {
const transform = (imgEle.style.transform === '') ? 0 :
parseInt(imgEle.style.transform.split('(')[1].split(')')[0], 10);
imgEle.style.transform = 'rotate(' + (transform + 90) + 'deg)';
}
else if (e.item.tooltipText === 'Rotate Left') {
const transform = (imgEle.style.transform === '') ? 0 :
Math.abs(parseInt(imgEle.style.transform.split('(')[1].split(')')[0], 10));
imgEle.style.transform = 'rotate(-' + (transform + 90) + 'deg)';
}
}
render() {
return (<RichTextEditorComponent value={this.rteValue} height={450} ref={(richtexteditor) => { this.rteObj = richtexteditor; }} quickToolbarSettings={this.quickToolbarSettings} toolbarClick={this.onToolbarClick = this.onToolbarClick.bind(this)}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]}/>
</RichTextEditorComponent>);
}
}
export default App;
/**
* Rich Text Editor - Quick Inline Toolbar Sample
*/
import { HtmlEditor, Image, Inject, Link, NodeSelection, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
class App extends React.Component<{},{}> {
public rteObj: RichTextEditorComponent;
public quickToolbarSettings: object = {
image: [
'Replace', 'Align', 'Caption', 'Remove', 'InsertLink', 'OpenImageLink', '-',
'EditImageLink', 'RemoveImageLink', 'Display', 'AltText', 'Dimension',
{
template: '<button class="e-tbar-btn e-btn" id="roatateLeft"><span class="e-btn-icon e-icons e-rotate-left"></span>',
tooltipText: 'Rotate Left'
},
{
template: '<button class="e-tbar-btn e-btn" id="roatateRight"><span class="e-btn-icon e-icons e-rotate-right"></span>',
tooltipText: 'Rotate Right'
}
]
}
private rteValue: string = "<p>The Syncfudion Rich Text Editor, a WYSIWYG (what you see is what you get) editor, is a user interface that allows you to create, edit, and format rich text content. You can try out a demo of this editor here.</p><p><b>Key features:</b></p><ul><li><p>Provides <IFRAME> and <DIV> modes.</p></li><li><p>Bulleted and numbered lists.</p></li><li><p>Handles images, hyperlinks, videos, hyperlinks, uploads, etc.</p></li><li><p>Contains undo/redo manager. </p></li></ul><div style='display: inline-block; width: 60%; vertical-align: top; cursor: auto;'><img alt='Sky with sun' src='https://cdn.syncfusion.com/ej2/richtexteditor-resources/RTE-Overview.png' width='309' style='min-width: 10px; min-height: 10px; width: 309px; height: 174px;' class='e-rte-image e-imginline e-rte-drag-image' height='174' /></div>";
public onToolbarClick(e: any): void {
const nodeObj: NodeSelection = new NodeSelection();
const range: Range = nodeObj.getRange((this.rteObj as any).contentModule.getDocument());
const imgEle: HTMLElement = nodeObj.getNodeCollection(range)[0] as HTMLElement;
if (e.item.tooltipText === 'Rotate Right') {
const transform: number = (imgEle.style.transform === '') ? 0 :
parseInt((imgEle as any).style.transform.split('(')[1].split(')')[0], 10);
imgEle.style.transform = 'rotate(' + (transform + 90) + 'deg)';
} else if (e.item.tooltipText === 'Rotate Left') {
const transform: number = (imgEle.style.transform === '') ? 0 :
Math.abs(parseInt((imgEle as any).style.transform.split('(')[1].split(')')[0], 10));
imgEle.style.transform = 'rotate(-' + (transform + 90) + 'deg)';
}
}
public render() {
return (
<RichTextEditorComponent height={450} value={this.rteValue} ref={(richtexteditor) => { this.rteObj = richtexteditor! }} quickToolbarSettings={this.quickToolbarSettings} toolbarClick={this.onToolbarClick = this.onToolbarClick.bind(this)}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]} />
</RichTextEditorComponent>
);
}
}
export default App;
[Functional-component]
/**
* Rich Text Editor - Quick Inline Toolbar Sample
*/
import { HtmlEditor, Image, Inject, Link, NodeSelection, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
function App() {
let rteObj;
let quickToolbarSettings = {
image: [
'Replace', 'Align', 'Caption', 'Remove', 'InsertLink', 'OpenImageLink', '-',
'EditImageLink', 'RemoveImageLink', 'Display', 'AltText', 'Dimension',
{
template: '<button class="e-tbar-btn e-btn" id="roatateLeft"><span class="e-btn-icon e-icons e-rotate-left"></span>',
tooltipText: 'Rotate Left'
},
{
template: '<button class="e-tbar-btn e-btn" id="roatateRight"><span class="e-btn-icon e-icons e-rotate-right"></span>',
tooltipText: 'Rotate Right'
}
]
};
let rteValue = "<p>The Syncfudion Rich Text Editor, a WYSIWYG (what you see is what you get) editor, is a user interface that allows you to create, edit, and format rich text content. You can try out a demo of this editor here.</p><p><b>Key features:</b></p><ul><li><p>Provides <IFRAME> and <DIV> modes.</p></li><li><p>Bulleted and numbered lists.</p></li><li><p>Handles images, hyperlinks, videos, hyperlinks, uploads, etc.</p></li><li><p>Contains undo/redo manager. </p></li></ul><div style='display: inline-block; width: 60%; vertical-align: top; cursor: auto;'><img alt='Sky with sun' src='https://cdn.syncfusion.com/ej2/richtexteditor-resources/RTE-Overview.png' width='309' style='min-width: 10px; min-height: 10px; width: 309px; height: 174px;' class='e-rte-image e-imginline e-rte-drag-image' height='174' /></div>";
function onToolbarClick(e) {
const nodeObj = new NodeSelection();
const range = nodeObj.getRange(rteObj.contentModule.getDocument());
const imgEle = nodeObj.getNodeCollection(range)[0];
if (e.item.tooltipText === 'Rotate Right') {
const transform = (imgEle.style.transform === '') ? 0 :
parseInt(imgEle.style.transform.split('(')[1].split(')')[0], 10);
imgEle.style.transform = 'rotate(' + (transform + 90) + 'deg)';
}
else if (e.item.tooltipText === 'Rotate Left') {
const transform = (imgEle.style.transform === '') ? 0 :
Math.abs(parseInt(imgEle.style.transform.split('(')[1].split(')')[0], 10));
imgEle.style.transform = 'rotate(-' + (transform + 90) + 'deg)';
}
}
return (<RichTextEditorComponent height={450} value={rteValue} ref={(richtexteditor) => { rteObj = richtexteditor; }} quickToolbarSettings={quickToolbarSettings} toolbarClick={onToolbarClick.bind(this)}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]}/>
</RichTextEditorComponent>);
}
export default App;
/**
* Rich Text Editor - Quick Inline Toolbar Sample
*/
import { HtmlEditor, Image, Inject, Link, NodeSelection, QuickToolbar, RichTextEditorComponent, Toolbar } from '@syncfusion/ej2-react-richtexteditor';
import * as React from 'react';
function App (){
let rteObj: RichTextEditorComponent;
let quickToolbarSettings: object = {
image: [
'Replace', 'Align', 'Caption', 'Remove', 'InsertLink', 'OpenImageLink', '-',
'EditImageLink', 'RemoveImageLink', 'Display', 'AltText', 'Dimension',
{
template: '<button class="e-tbar-btn e-btn" id="roatateLeft"><span class="e-btn-icon e-icons e-rotate-left"></span>',
tooltipText: 'Rotate Left'
},
{
template: '<button class="e-tbar-btn e-btn" id="roatateRight"><span class="e-btn-icon e-icons e-rotate-right"></span>',
tooltipText: 'Rotate Right'
}
]
}
let rteValue: string = "<p>The Syncfudion Rich Text Editor, a WYSIWYG (what you see is what you get) editor, is a user interface that allows you to create, edit, and format rich text content. You can try out a demo of this editor here.</p><p><b>Key features:</b></p><ul><li><p>Provides <IFRAME> and <DIV> modes.</p></li><li><p>Bulleted and numbered lists.</p></li><li><p>Handles images, hyperlinks, videos, hyperlinks, uploads, etc.</p></li><li><p>Contains undo/redo manager. </p></li></ul><div style='display: inline-block; width: 60%; vertical-align: top; cursor: auto;'><img alt='Sky with sun' src='https://cdn.syncfusion.com/ej2/richtexteditor-resources/RTE-Overview.png' width='309' style='min-width: 10px; min-height: 10px; width: 309px; height: 174px;' class='e-rte-image e-imginline e-rte-drag-image' height='174' /></div>";
function onToolbarClick(e: any): void {
const nodeObj: NodeSelection = new NodeSelection();
const range: Range = nodeObj.getRange((rteObj as any).contentModule.getDocument());
const imgEle: HTMLElement = nodeObj.getNodeCollection(range)[0] as HTMLElement;
if (e.item.tooltipText === 'Rotate Right') {
const transform: number = (imgEle.style.transform === '') ? 0 :
parseInt((imgEle as any).style.transform.split('(')[1].split(')')[0], 10);
imgEle.style.transform = 'rotate(' + (transform + 90) + 'deg)';
} else if (e.item.tooltipText === 'Rotate Left') {
const transform: number = (imgEle.style.transform === '') ? 0 :
Math.abs(parseInt((imgEle as any).style.transform.split('(')[1].split(')')[0], 10));
imgEle.style.transform = 'rotate(-' + (transform + 90) + 'deg)';
}
}
return (
<RichTextEditorComponent height={450} value={rteValue} ref={(richtexteditor) => { rteObj = richtexteditor! }} quickToolbarSettings={quickToolbarSettings} toolbarClick={onToolbarClick.bind(this)}>
<Inject services={[Toolbar, Image, Link, HtmlEditor, QuickToolbar]} />
</RichTextEditorComponent>
);
}
export default App;
Rich Text Editor features are segregated into individual feature-wise modules. To use quick toolbar, inject the quick toolbar module using the
RichTextEditor.Inject(QuickToolbar)
.