Merge branch 'fix/mixsetter-bugs' into 'release/1.0.0'

fix-mixsetter bugs



See merge request !962380
This commit is contained in:
荣彬 2020-09-02 23:02:15 +08:00
commit fa4415e333
3 changed files with 101 additions and 15 deletions

View File

@ -1137,11 +1137,7 @@
},{ },{
"name": "callback", "name": "callback",
"description": "callback", "description": "callback",
"propType": "JsonSetter", "setter": "FunctionSetter"
"defaultValue": {
"type": "JSFunction",
"value": "(rowData, action, table) => {\n return table.editRow(rowData).then((row) => {\n console.log(row);\n })}"
}
}] }]
} }
}, },
@ -1149,7 +1145,7 @@
"title": "Title", "title": "Title",
"callback": { "callback": {
"type": "JSFunction", "type": "JSFunction",
"value": "(rowData, action, table) => {\n return table.editRow(rowData).then((row) => {\n console.log(row);\n })}" "value": "function(){}"
} }
} }
} }

View File

@ -1,12 +1,39 @@
import React, { PureComponent } from 'react'; import React, { PureComponent } from 'react';
// import PropTypes from 'prop-types'; // import PropTypes from 'prop-types';
import { Button, Icon } from '@alifd/next'; import { Button, Icon,Dialog } from '@alifd/next';
import MonacoEditor from 'react-monaco-editor';
import { js_beautify, css_beautify } from 'js-beautify';
import './index.scss'; import './index.scss';
import { timingSafeEqual } from 'crypto'; import { timingSafeEqual } from 'crypto';
const SETTER_NAME = 'function-setter' const SETTER_NAME = 'function-setter'
const defaultEditorOption = {
width: '100%',
height: '100%',
options: {
readOnly: false,
automaticLayout: true,
folding: true, //默认开启折叠代码功能
lineNumbers: 'on',
wordWrap: 'off',
formatOnPaste: true,
fontSize: 12,
tabSize: 2,
scrollBeyondLastLine: false,
fixedOverflowWidgets: false,
snippetSuggestions: 'top',
minimap: {
enabled: false,
},
scrollbar: {
vertical: 'auto',
horizontal: 'auto',
},
},
};
interface FunctionSetterProps { interface FunctionSetterProps {
value: string; value: string;
type: string; type: string;
@ -30,6 +57,8 @@ export default class FunctionSetter extends PureComponent<FunctionSetterProps, {
state = { state = {
firstLoad: true, firstLoad: true,
isShowDialog:false,
functionCode:null
}; };
componentDidMount() { componentDidMount() {
@ -54,6 +83,22 @@ export default class FunctionSetter extends PureComponent<FunctionSetterProps, {
field.editor.emit('eventBindDialog.openDialog', field.name, this.emitEventName); field.editor.emit('eventBindDialog.openDialog', field.name, this.emitEventName);
} }
openDialog = () => {
const {value={}} = this.props;
this.setState({
isShowDialog:true
})
this.functionCode = value.value;
}
closeDialog = () => {
this.setState({
isShowDialog:false
})
}
removeFunctionBind = () => { removeFunctionBind = () => {
const { field ,removeProp} = this.props; const { field ,removeProp} = this.props;
removeProp(); removeProp();
@ -61,14 +106,14 @@ export default class FunctionSetter extends PureComponent<FunctionSetterProps, {
parseFunctionName = (functionString: String) => { parseFunctionName = (functionString: String) => {
// 因为函数格式是固定的,所以可以按照字符换去匹配获取函数名 // 因为函数格式是固定的,所以可以按照字符换去匹配获取函数名
let funNameStr = functionString.split('.')[1]; let funNameStr = functionString.split('this.')[1];
if (funNameStr){ if (funNameStr){
let endIndex = funNameStr.indexOf('('); let endIndex = funNameStr.indexOf('(');
return funNameStr.substr(0, endIndex); return funNameStr.substr(0, endIndex);
}else{ }else{
return '匿名函数' return ''
} }
} }
@ -79,6 +124,20 @@ export default class FunctionSetter extends PureComponent<FunctionSetterProps, {
return <Button type="normal" onClick={() => this.bindFunction()}></Button> return <Button type="normal" onClick={() => this.bindFunction()}></Button>
} }
updateCode = (newCode) => {
this.functionCode = newCode;
}
onDialogOk = () => {
const {onChange} = this.props;
onChange({
type: 'JSFunction',
value: this.functionCode
});
this.closeDialog();
}
focusFunctionName = (functionName) => { focusFunctionName = (functionName) => {
const { editor } = this.props.field; const { editor } = this.props.field;
@ -96,11 +155,11 @@ export default class FunctionSetter extends PureComponent<FunctionSetterProps, {
*/ */
renderBindFunction = () => { renderBindFunction = () => {
const { value } = this.props; const { value } = this.props;
// 解析函数名 // 解析函数名
let functionName = this.parseFunctionName(value.value); let functionName = this.parseFunctionName(value.value);
// let functionName = 'onClick';
return <div className="function-container"> return <div className="function-container">
<img className="funtion-icon" src="https://gw.alicdn.com/tfs/TB1os6KRFT7gK0jSZFpXXaTkpXa-200-200.png"></img> <img className="funtion-icon" src="https://gw.alicdn.com/tfs/TB1NXNhk639YK4jSZPcXXXrUFXa-200-200.png"></img>
<span className="function-name" onClick={() => this.focusFunctionName(functionName)}>{functionName}</span> <span className="function-name" onClick={() => this.focusFunctionName(functionName)}>{functionName}</span>
<Icon type="set" size="medium" className="funtion-operate-icon" onClick={this.bindFunction} /> <Icon type="set" size="medium" className="funtion-operate-icon" onClick={this.bindFunction} />
<Icon type="ashbin" size="medium" className="funtion-operate-icon" onClick={this.removeFunctionBind} /> <Icon type="ashbin" size="medium" className="funtion-operate-icon" onClick={this.removeFunctionBind} />
@ -108,6 +167,16 @@ export default class FunctionSetter extends PureComponent<FunctionSetterProps, {
} }
/**
* ()
*/
renderEditFunctionButton = () => {
return <div>
<Button type="primary" onClick={this.openDialog}><Icon type="edit" /></Button>
</div>
}
bindEventCallback = (eventName: String) => { bindEventCallback = (eventName: String) => {
const { onChange } = this.props; const { onChange } = this.props;
onChange({ onChange({
@ -118,10 +187,31 @@ export default class FunctionSetter extends PureComponent<FunctionSetterProps, {
render() { render() {
const { value } = this.props; const { value } = this.props;
const {isShowDialog} = this.state;
let functionName = '';
if (value && value.value){
functionName = this.parseFunctionName(value.value);
}
return <div className="lc-function-setter"> return <div className="lc-function-setter">
{ {
value ? this.renderBindFunction() : this.renderButton() value ? (functionName?this.renderBindFunction():this.renderEditFunctionButton()) : this.renderButton()
} }
{
value && value.value && <Dialog visible={isShowDialog} closeable={'close'} title="函数编辑" onCancel={this.closeDialog} onOk={this.onDialogOk} onClose={()=>{this.closeDialog()}}>
<div style={{width:'500px',height:'400px'}}>
<MonacoEditor
value={js_beautify(value.value)}
{...defaultEditorOption}
{...{ language: 'javascript' }}
onChange={(newCode) => this.updateCode(newCode)}
/>
</div>
</Dialog>
}
</div>; </div>;
} }
} }

View File

@ -125,11 +125,11 @@ export class PopupContent extends PureComponent<{ safeId?: string }> {
safeNode={id} safeNode={id}
visible={visible} visible={visible}
style={{ width }} style={{ width }}
onVisibleChange={(visible) => { onVisibleChange={(visible,type) => {
if (avoidLaterHidden) { if (avoidLaterHidden) {
return; return;
} }
if (!visible) { if (!visible && type === 'closeClick') {
this.setState({ visible: false }); this.setState({ visible: false });
} }
}} }}