uxcore-mention
Version:
Mention anywhere with this component
158 lines (150 loc) • 4.62 kB
JSX
/**
* example index
*/
import React, { Component } from 'react';
import Tinymce from 'uxcore-tinymce';
import Dialog from 'uxcore-dialog';
import Mention, {
ContenteditableEditor,
TextareaEditor,
InputEditor,
TinymceMention,
} from '../src';
import mockData from './mockData.json';
function formatter(data) {
return data.map((text) => ({ text }));
}
const source = ['aaaaa', 'aabbb', 'aaccc', 'bbbcc', 'dddee', 'fffqq', 'pppaa', 'ppccc'];
function getPersonData(keyword, next) {
setTimeout(() => next(mockData), 100);
}
function personDataFormatter(data) {
return data.map((item) => Object.assign(item, {
displayName: item.name + (item.nickNameCn ? `(${item.nickNameCn})` : ''),
}));
}
function personPanelFormatter(data) {
return `<img src="${data.avatar}" width="25" height="25" title="${data.name}">
${data.displayName} - ${data.emplId}`;
}
function personMentionFormatter(data) {
return `@${data.name}(${data.emplId})`;
}
export default class Demo extends Component {
constructor(props) {
super(props);
this.state = {
content: 'xxx',
basicContent: 'basic content',
personContent: '',
readOnly: false,
showDialog: false,
};
}
onToggleReadOnly() {
this.setState({
readOnly: !this.state.readOnly,
});
}
toggleDialog() {
this.setState({
showDialog: !this.state.showDialog,
});
}
render() {
return (
<div>
<button onClick={this.toggleDialog.bind(this)}>show dialog</button>
<Dialog
title="mention in dialog"
visible={this.state.showDialog}
onOk={this.toggleDialog.bind(this)}
onCancel={this.toggleDialog.bind(this)}
formatter={formatter}
>
<Mention
matchRange={[1, 6]}
formatter={personDataFormatter}
panelFormatter={personPanelFormatter}
source={getPersonData}
>
<InputEditor
width={250}
height={30}
mentionFormatter={personMentionFormatter}
placeholder="input editor placeholder"
/>
</Mention>
</Dialog>
<div>
<label>
<input
type="checkbox"
checked={this.state.readOnly}
onChange={this.onToggleReadOnly.bind(this)}
/>
只读
</label>
</div>
<h1>BASIC:</h1>
<Mention
matchRange={[0, 6]}
source={source}
onChange={(e, content) => global.console.log(e, content)}
formatter={formatter}
>
<ContenteditableEditor
width={250}
height={150}
readOnly={this.state.readOnly}
placeholder="contenteditable editor placeholder"
defaultValue={'defaultValue'}
value={this.state.content}
maxLength={10}
/>
<TextareaEditor
width={250}
height={100}
readOnly={this.state.readOnly}
placeholder="textarea editor placeholder"
defaultValue={'defaultValue'}
value={this.state.content}
onAdd={(e, content) => global.console.log('onadd', e, content)}
onChange={(e, content) => global.console.log('onchange', e, content)}
/>
<InputEditor
width={250}
height={30}
readOnly={this.state.readOnly}
placeholder="input editor placeholder"
defaultValue={'defaultValue'}
value={this.state.content}
maxLength={10}
/>
</Mention>
<button onClick={() => this.setState({ content: new Date().toString() })}>change content</button>
<h1>SELECT PERSON:</h1>
<Mention
matchRange={[2, 6]}
source={getPersonData}
formatter={personDataFormatter}
panelFormatter={personPanelFormatter}
onChange={(e, content) => global.console.log('onchange', e, content)}
>
<ContenteditableEditor mentionFormatter={personMentionFormatter} />
</Mention>
<h1>Tinymce</h1>
<TinymceMention
insertMode={'TEXT_NODE'}
source={getPersonData}
formatter={personDataFormatter}
mentionFormatter={personMentionFormatter}
panelFormatter={personPanelFormatter}
onAdd={(e, content) => global.console.log('onadd', e, content)}
>
<Tinymce placeholder={'tinymce placeholder'}/>
</TinymceMention>
</div>
);
}
}