UNPKG

joywok-material-components

Version:

<h1 align="center"> Joywok Material Components </h1>

325 lines (316 loc) 11.3 kB
/** * * @api {} 富文本编辑器 * @apiName 带自定义功能的富文本编辑器组件 * @apiGroup 组件使用 * * @apiParam {Object} config 非必填,编辑器配置 { language: 'en', ..... } * @apiParam {Object} value 非必填,内容默认值, 当此值为对象时, onChange中返回的也是此对象 * @apiParam {String} value 非必填,内容默认值, 当此值为对象时, onChange中返回的是字符串 * @apiParam {Object} varSetting 非必填,插件值 * @apiParam {function} onChange 编辑器内容发生变化之后的回调事件,function({value: object||string, varSelected: Array, event: event}) * @apiSuccessExample {json} 使用案例: * 参数说明: config 所有参数非必填 https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html config = { toolbarPosition: 'jwedtoolbar', 工具栏位置 autoGrow_maxHeight: 300, 自增最大高度 autoGrow_minHeight: 300, 自增最小高度 editorName: 'editor01', 编辑器名称,当一个页面中同时存在两个编辑器时需要区分 imageFormat: ['.jpg', '.png'], audioFormat: ['.mp3'], videoFormat: ['.mp4'], ... } multilang = false multilang = { langs:[ {lang: 'zh-cn', name:'中文'}, {lang: 'en', name:'en'} ], curLang: 'zh-cn' } value = { 'zh-cn': 'awefaewawef', 'en': '1134567', } value = 'SQEEFEFEWFEF'; varSetting = false varSetting = { list:[ {id:'1',name: {'zh-cn': '活动名称', en: 'awef', jan: '11111'} }, {id:'2',name: {'zh-cn': '活动内容', en: 'awef', jan: '22222'} }, ], selected:[] } import FCKEditor from 'joywok-material-components/lib/jweditor/extplugin'; onChange({value: object||string, varSelected: Array, event: event}){ } <FCKEditor onChange={(e)=>this.onChange(v)} config={config} value={value} multilang={multilang} varSetting={varSetting} /> * * */ import React from 'react'; require('./style/index.css'); import Editor from './index'; import { Select, MenuItem } from '@material-ui/core'; require('./crypto'); class ExtPluginsEditor extends React.Component{ initConfig(){ let s = { editorName: 'JWCK' + this.guid(), editorConfig: this.props.config === undefined?{}:this.props.config, showAudioDialog: false, showVideoDialog: false, showImageDialog: false, toolbarPosition: this.props.toolbarPosition || false, showLangs: this.props.showLangs===false?false:true, varSetting: this.props.varSetting || false, value: '', curValue: '', curLang: '', varSelected: this.props.varSetting !== false && this.props.varSetting!==undefined && this.props.varSetting.selected?this.props.varSetting.selected:[] } if( _.isEmpty(s.editorConfig) ){ s.editorConfig = {appType: '', appId: ''}; } if( this.props.multilang ){ if( _.isArray(this.props.multilang.langs) ){ s.multilang = {langs: this.props.multilang.langs}; if( _.isString(this.props.multilang.curLang) ){ s.multilang.curLang = this.props.multilang.curLang; s.curLang = this.props.multilang.curLang; }else{ s.multilang.curLang = s.multilang[0].lang; s.curLang = s.multilang[0].lang; } }else{ s.multilang = false; } }else{ s.multilang = false; } if( _.isString( this.props.value ) === true ){ s.curValue = this.props.value; s.value = this.props.value; }else if( _.isObject(this.props.value) ){ s.value = {}; _.each(s.multilang.langs, (item)=>{ s.value[item.lang] = this.props.value[item.lang] || ''; }); s.curValue = s.value[s.multilang.curLang] || ''; }else{ s.curValue = ''; s.value = ''; } if( this.props.varSetting ){ if( _.isArray(this.props.varSetting.list) ){ s.varSetting = { list: this.props.varSetting.list } if( _.isArray(this.props.varSetting.selected) ){ s.varSetting.selected = this.props.varSetting.selected; }else{ s.varSetting.selected = []; } }else{ s.varSetting = false; s.varSelected = []; } }else{ s.varSetting = false; s.varSelected = []; } if( s.varSetting!==false && s.toolbarPosition===false ){ s.toolbarPosition = 'jwedtoolbar' + this.guid(); } this.state = s; } componentDidMount(){ let s = { curValue: this.encodeValue( this.state.curValue ), value: this.encodeValue( this.state.value ) }; this.setState( s ); } guid(){ function S4(){ return (((1+Math.random())*0x10000)|0).toString(16).substring(1); } return (S4()+S4()+S4()+S4()+S4()+S4()+S4()+S4()); } constructor(props) { super(props); this.initConfig(); } componentWillReceiveProps(d){ let setVal = {}; let difVar = false; if( d.varSetting===undefined ) d.varSetting = false; if( !_.isEqual( d.varSetting, this.state.varSetting ) ){ setVal.varSetting = d.varSetting; setVal.toolbarPosition = 'jwedtoolbar' + this.guid(); if(d.varSetting && d.varSetting.list && d.varSetting.list.length>0){ difVar = true; }; } if( d.multilang===undefined ) d.multilang = false; if( !_.isEqual( d.multilang, this.state.multilang ) ){ setVal.multilang = d.multilang; setVal.curValue = this.encodeValue(d.value[ d.multilang.curLang ], d.multilang.curLang); setVal.curLang = d.multilang.curLang; } if( !_.isEqual( d.value, this.state.value ) ){ setVal.value = d.value; if( d.multilang && d.multilang.curLang ){ setVal.curValue = this.encodeValue(d.value[ d.multilang.curLang ], d.multilang.curLang); }else{ setVal.curValue = d.value; } } if(d.multilang===false && this.state.multilang===false && d.value==='' ){ setVal.value = d.value; setVal.curValue = d.value; } if( Object.keys( setVal ).length>0 ){ this.setState( setVal, ()=>{ if(difVar===true) this.decodeDiffValue(); }); } } decodeDiffValue(){ console.log('111') let {value, curValue} = this.state; this.setState({value: this.encodeValue( value ), curValue: this.encodeValue(curValue) }); } render(){ let value = this.state.curValue || ''; return <div className="joywok-editor-wrap" id={this.state.editorName}> { this.state.multilang===false?'':<div className={this.state.showLangs===true?'jwck-lang-bg':'jwck-lang-bg jwck-hide'}> <div className="jwck-lang"> <Select inputProps={{name: 'language'}} value={this.state.multilang.curLang} onChange={this.changeLanguage}> { this.state.multilang.langs.map(item=>{ return <MenuItem value={item.lang}>{item.name}</MenuItem> }) } </Select> </div> </div> } { this.state.toolbarPosition===false?'':<div className={'jwedtoolbar ' + this.state.toolbarPosition }><div></div></div> } { this.state.varSetting===false?'':this.renderExtPluginsList() } <Editor toolbarStyle={this.state.showLangs===true?'':'jwedtoolbarborder'} onRef={ (ref) => {this.$Child = ref; }} curLang={this.state.curLang} editorName={this.state.editorName} toolbarPosition={this.state.toolbarPosition} onChange={this.onChangeEditor} defaultValue={value} config={this.state.editorConfig} /> </div> } encodeValue( v, curLang ){ let self = this; if( this.state===undefined || this.state.varSetting===undefined || this.state.varSetting===false ){ return v; }else{ if( typeof v === 'string' ){ _.each( this.state.varSetting.list, (item)=>{ let lang = curLang===undefined?self.state.multilang.curLang:curLang let name = item[lang]; v = v.replace(eval('/(\\\{'+ item.id +'\\\})/g'), '<div contenteditable="false" id="jwpl_'+ item.id +'" class="jwck-plugin-item" >'+ name +'<del>&nbsp;</del></div>'); }); return v; }else{ _.each(v, (val, key)=>{ _.each(self.state.varSetting.list, (item)=>{ let lang = curLang===undefined?self.state.multilang.curLang:curLang let name = item[lang]; v[key] = (val + '').replace(eval('/(\\\{'+ item.id +'\\\})/g'), '<div contenteditable="false" id="jwpl_'+ item.id +'" class="jwck-plugin-item">'+ name +'<del>&nbsp;</del></div>'); }) }); return v; } } } decodeValue( v ){ if( this.state.varSetting===false ){ return v; }else{ if( typeof v === 'string' ){ v = v.replace(/<div contenteditable="false" id="jwpl_(.*?)" class="jwck-plugin-item">(.*?)<\/div>/ig, '{$1}'); }else{ _.each(v, (val, key)=>{ v[key] = (val + '').replace(/<div contenteditable="false" id="jwpl_(.*?)" class="jwck-plugin-item">(.*?)<\/div>/ig, '{$1}'); }); } return v; } } selectPluginItem( item, name ){ this.$Child.insertItem( '<div contenteditable="false" id="jwpl_'+ item.id +'" class="jwck-plugin-item">'+ name +'<del></del></div>' ); } onChangeEditor = (e)=>{ let v = this.state.value; if( this.state.multilang===false ){ v = e.editor.getData(); }else{ if( typeof v==='string' ) v={}; v[this.state.multilang.curLang] = e.editor.getData(); } this.setState({value: v}, ()=>{ this.changeHandle(); }); } changeHandle(lang){ let v = this.state.value; let varSelected = this.state.varSelected; v = this.decodeValue( v ); let ret = {value: v, varSelected: varSelected}; if( !_.isEmpty(lang) ){ ret.multilang = lang; if( _.isEmpty( ret.value[lang.curLang] ) ){ ret.value[ lang.curLang ] = ''; } }else{ if( this.state.multilang!==false ){ ret.curLang = this.state.multilang.curLang; ret.multilang = this.state.multilang; if( _.isEmpty( ret.value[ret.curLang] ) ){ ret.value[ret.curLang] = ''; } } } typeof this.props.onChange === 'function' && this.props.onChange( ret ); } changeLanguage = (e)=>{ let lang = _.clone( this.state.multilang ); lang.curLang = e.target.value; this.changeHandle( lang ); // this.setState({multilang: lang}, ()=>{ // this.changeHandle(lang); // }); } renderExtPluginsList(){ let self = this; return <div className="jwck-plugin-items"><div className="jwck-plugin-items-w">{_.map(this.state.varSetting.list, item=>{ // let name = ''; // if( self.state.multilang === false ){ // name = item.name; // }else{ // name = item.name[self.state.multilang.curLang] || '' // } let name = item[self.state.multilang.curLang] || ''; // item.cname = name; return name===''?'':<div className="jwck-plugin-item" onClick={()=>self.selectPluginItem(item, name)}>{name}</div>; })}</div></div>; } removePluginItem( index ){ let items = this.state.varSelected; items.splice(index, 1); this.setState({varSelected: items}, ()=>{ this.changeHandle(); }); } } export default ExtPluginsEditor;