Your search did not match any results.
Html Editor

Mentions

Our HtmlEditor allows end-users to insert "mentions" and reference others within text or conversation threads as demonstrated in this demo. With this feature, you can introduce functionality that emulates capabilities found in collaboration tools like Microsoft Teams.

A "mention" is triggered by a marker. You are free to choose a "marker" of your choice (this demo uses the @ symbol to trigger a "mention"). User names are stored as items in a dataSource. Data can be retrieved from multiple data sources. When using multiple data sources, you must assign an unique marker to each.

To "mention" a user, simply enter the @ symbol and select the desired record from the "Mentions" drop-down user list. Like today's most popular collaboration tools, you can enter additional characters to filter the records displayed within the "Mentions" drop-down user list.

Copy to CodeSandBox
Apply
Reset
import React from 'react'; import { employees } from './data.js'; import HtmlEditor from 'devextreme-react/html-editor'; const mentionsConfig = [{ dataSource: employees, searchExpr: 'text', displayExpr: 'text', valueExpr: 'text' }]; class App extends React.Component { render() { return ( <div> <div id="chat-window"> <div className="message dx-theme-background-color"> <div className="photo"> <img src="../../../../images/mentions/Kevin-Carter.png" /> </div> <div className="name"> Kevin Carter </div> <div className="date"> 07/03/19 - 12:22AM </div> <div className="text"> <span className="dx-mention" spellCheck="false"><span><span>@</span>John Heart</span></span> What experience do you have in this field? </div> </div> <br /> <div className="message dx-theme-background-color"> <div className="photo"> <img src="../../../../images/mentions/John-Heart.png" /> </div> <div className="name"> John Heart </div> <div className="date"> 07/03/19 - 12:25AM </div> <div className="text"> I&apos;ve been in the audio/video industry since 2001, and I&apos;ve been the CEO of DevAv since 2009. </div> </div> <br /> <div className="message dx-theme-background-color"> <div className="photo"> <img src="../../../../images/mentions/Kevin-Carter.png" /> </div> <div className="name"> Kevin Carter </div> <div className="date"> 07/03/19 - 12:26AM </div> <div className="text"> That&apos;s very interesting. <span className="dx-mention" spellCheck="false"><span><span>@</span>Olivia Peyton</span></span>, what do you think? </div> </div> </div> <HtmlEditor mentions={mentionsConfig}> <p> <span className="dx-mention" spellCheck="false" data-marker="@" data-mention-value="Kevin Carter"><span><span>@</span>Kevin Carter</span></span> {" I think John's expertise can be very valuable in our startup."} </p> </HtmlEditor> </div> ); } } export default App;
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.js'; ReactDOM.render( <App />, document.getElementById('app') );
<!DOCTYPE html> <html> <head> <title>DevExtreme Demo</title> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/21.1.3/css/dx.common.css" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/21.1.3/css/dx.light.css" /> <link rel="stylesheet" type="text/css" href="styles.css" /> <script src="https://unpkg.com/core-js@2.4.1/client/shim.min.js"></script> <script src="https://unpkg.com/systemjs@0.21.3/dist/system.js"></script> <script type="text/javascript" src="config.js"></script> <script type="text/javascript"> System.import('./index.js'); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="app"></div> </div> </body> </html>
#chat-window { background-color: rgba(191, 191, 191, 0.15); height: 350px; padding: 10px; } .dx-htmleditor { height: 100px; } #send { float: right; margin: 10px 0px; } .message { height: 85px; background-color: inherit; display: inline-block; max-width: 60%; border-radius: 5px; margin: 5px; padding: 10px; box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.1); } .name { font-weight: bold; } .date { opacity: 0.5; } .photo { float: left; height: 100%; } .photo > img { width: 40px; height: 40px; display: block; border-radius: 40px; margin-right: 10px; }
export const employees = [{ text: 'John Heart', team: 'Engineering', icon: '../../../../images/mentions/John-Heart.png' }, { text: 'Kevin Carter', team: 'Engineering', icon: '../../../../images/mentions/Kevin-Carter.png' }, { text: 'Olivia Peyton', team: 'Management', icon: '../../../../images/mentions/Olivia-Peyton.png' }, { text: 'Robert Reagan', team: 'Management', icon: '../../../../images/mentions/Robert-Reagan.png' }, { text: 'Cynthia Stanwick', team: 'Engineering', icon: '../../../../images/mentions/Cynthia-Stanwick.png' }, { text: 'Brett Wade ', team: 'Analysis', icon: '../../../../images/mentions/Brett-Wade.png' }, { text: 'Greta Sims', team: 'QA', icon: '../../../../images/mentions/Greta-Sims.png' }];
window.config = { transpiler: 'plugin-babel', meta: { 'devextreme/localization.js': { "esModule": true }, }, paths: { 'npm:': 'https://unpkg.com/' }, defaultExtension: 'js', map: { 'react': 'npm:react@17.0.2/umd/react.development.js', 'react-dom': 'npm:react-dom@17.0.2/umd/react-dom.development.js', 'prop-types': 'npm:prop-types@15.7.2/prop-types.js', 'rrule': 'npm:rrule@2.6.6/dist/es5/rrule.js', 'luxon': 'npm:luxon@1.27.0/build/global/luxon.min.js', 'es6-object-assign': 'npm:es6-object-assign@1.1.0', 'devextreme': 'npm:devextreme@21.1.3/cjs', 'devextreme-react': 'npm:devextreme-react@21.1.3', 'jszip': 'npm:jszip@3.6.0/dist/jszip.min.js', 'devextreme-quill': 'npm:devextreme-quill@1.0.0/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.1.15/dist/dx-diagram.js', 'devexpress-gantt': 'npm:devexpress-gantt@2.1.31/dist/dx-gantt.js', '@devextreme/vdom': 'npm:@devextreme/vdom@1.2.1', 'inferno': 'npm:inferno@7.4.8/dist/inferno.min.js', 'inferno-compat': 'npm:inferno-compat@7.4.8/dist/inferno-compat.min.js', 'inferno-create-element': 'npm:inferno-create-element@7.4.8/dist/inferno-create-element.min.js', 'inferno-dom': 'npm:inferno-dom@1.0.7/dist/inferno-dom.min.js', 'inferno-hydrate': 'npm:inferno-hydrate@7.4.8/dist/inferno-hydrate.min.js', 'inferno-clone-vnode': 'npm:inferno-clone-vnode@7.4.8/dist/inferno-clone-vnode.min.js', 'inferno-create-class': 'npm:inferno-create-class@7.4.8/dist/inferno-create-class.min.js', 'inferno-extras': 'npm:inferno-extras@7.4.8/dist/inferno-extras.min.js', // SystemJS plugins 'plugin-babel': 'npm:systemjs-plugin-babel@0.0.25/plugin-babel.js', 'systemjs-babel-build': 'npm:systemjs-plugin-babel@0.0.25/systemjs-babel-browser.js' }, packages: { 'devextreme': { defaultExtension: 'js' }, '@devextreme/vdom': { defaultExtension: 'js' }, 'devextreme-react': { main: 'index.js' }, 'devextreme/events/utils': { main: 'index' }, 'devextreme/events': { main: 'index' }, 'es6-object-assign': { main: './index.js', defaultExtension: 'js' } }, packageConfigPaths: [ "npm:@devextreme/*/package.json", ], babelOptions: { sourceMaps: false, stage0: true, react: true } }; System.config(window.config);