| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483 |
- import React, { Component } from 'react';
- import PropTypes from 'prop-types';
- import {
- Form,
- Select,
- InputNumber,
- Switch,
- Col,
- message,
- Row,
- Input,
- Button,
- Icon,
- AutoComplete,
- Modal
- } from 'antd';
- const Option = Select.Option;
- const FormItem = Form.Item;
- import { safeAssign } from 'client/common.js';
- import AceEditor from 'client/components/AceEditor/AceEditor';
- import constants from 'client/constants/variable.js';
- import { httpCodes } from '../index.js';
- import './CaseDesModal.scss';
- import { connect } from 'react-redux';
- import json5 from 'json5';
- const formItemLayout = {
- labelCol: { span: 5 },
- wrapperCol: { span: 12 }
- };
- const formItemLayoutWithOutLabel = {
- wrapperCol: { span: 12, offset: 5 }
- };
- @connect(state => {
- return {
- currInterface: state.inter.curdata
- };
- })
- class CaseDesForm extends Component {
- static propTypes = {
- form: PropTypes.object,
- caseData: PropTypes.object,
- currInterface: PropTypes.object,
- onOk: PropTypes.func,
- onCancel: PropTypes.func,
- isAdd: PropTypes.bool,
- visible: PropTypes.bool
- };
- // 初始化输入数据
- preProcess = caseData => {
- try {
- caseData = JSON.parse(JSON.stringify(caseData));
- } catch (error) {
- console.log(error);
- }
- const initCaseData = {
- ip: '',
- ip_enable: false,
- name: '',
- code: '200',
- delay: 0,
- headers: [{ name: '', value: '' }],
- paramsArr: [{ name: '', value: '' }],
- params: {},
- res_body: '',
- paramsForm: 'form'
- };
- caseData.params = caseData.params || {};
- const paramsArr = Object.keys(caseData.params).length
- ? Object.keys(caseData.params)
- .map(key => {
- return { name: key, value: caseData.params[key] };
- })
- .filter(item => {
- if (typeof item.value === 'object') {
- // this.setState({ paramsForm: 'json' })
- caseData.paramsForm = 'json';
- }
- return typeof item.value !== 'object';
- })
- : [{ name: '', value: '' }];
- const headers =
- caseData.headers && caseData.headers.length ? caseData.headers : [{ name: '', value: '' }];
- caseData.code = '' + caseData.code;
- caseData.params = JSON.stringify(caseData.params, null, 2);
- caseData = safeAssign(initCaseData, { ...caseData, headers, paramsArr });
- return caseData;
- };
- constructor(props) {
- super(props);
- const { caseData } = this.props;
- this.state = this.preProcess(caseData);
- }
- // 处理request_body编译器
- handleRequestBody = d => {
- this.setState({ res_body: d.text });
- };
- // 处理参数编译器
- handleParams = d => {
- this.setState({ params: d.text });
- };
- // 增加参数信息
- addValues = key => {
- const { getFieldValue } = this.props.form;
- let values = getFieldValue(key);
- values = values.concat({ name: '', value: '' });
- this.setState({ [key]: values });
- };
- // 删除参数信息
- removeValues = (key, index) => {
- const { setFieldsValue, getFieldValue } = this.props.form;
- let values = getFieldValue(key);
- values = values.filter((val, index2) => index !== index2);
- setFieldsValue({ [key]: values });
- this.setState({ [key]: values });
- };
- // 处理参数
- getParamsKey = () => {
- let {
- req_query,
- req_body_form,
- req_body_type,
- method,
- req_body_other,
- req_body_is_json_schema,
- req_params
- } = this.props.currInterface;
- let keys = [];
- req_query &&
- Array.isArray(req_query) &&
- req_query.forEach(item => {
- keys.push(item.name);
- });
- req_params &&
- Array.isArray(req_params) &&
- req_params.forEach(item => {
- keys.push(item.name);
- });
- if (constants.HTTP_METHOD[method.toUpperCase()].request_body && req_body_type === 'form') {
- req_body_form &&
- Array.isArray(req_body_form) &&
- req_body_form.forEach(item => {
- keys.push(item.name);
- });
- } else if (
- constants.HTTP_METHOD[method.toUpperCase()].request_body &&
- req_body_type === 'json' &&
- req_body_other
- ) {
- let bodyObj;
- try {
- // 针对json-schema的处理
- if (req_body_is_json_schema) {
- bodyObj = json5.parse(this.props.caseData.req_body_other);
- } else {
- bodyObj = json5.parse(req_body_other);
- }
- keys = keys.concat(Object.keys(bodyObj));
- } catch (error) {
- console.log(error);
- }
- }
- return keys;
- };
- endProcess = caseData => {
- const headers = [];
- const params = {};
- const { paramsForm } = this.state;
- caseData.headers &&
- Array.isArray(caseData.headers) &&
- caseData.headers.forEach(item => {
- if (item.name) {
- headers.push({
- name: item.name,
- value: item.value
- });
- }
- });
- caseData.paramsArr &&
- Array.isArray(caseData.paramsArr) &&
- caseData.paramsArr.forEach(item => {
- if (item.name) {
- params[item.name] = item.value;
- }
- });
- caseData.headers = headers;
- if (paramsForm === 'form') {
- caseData.params = params;
- } else {
- try {
- caseData.params = json5.parse(caseData.params);
- } catch (error) {
- console.log(error);
- message.error('请求参数 json 格式有误,请修改');
- return false;
- }
- }
- delete caseData.paramsArr;
- return caseData;
- };
- handleOk = () => {
- const form = this.props.form;
- form.validateFieldsAndScroll((err, values) => {
- if (!err) {
- values.res_body = this.state.res_body;
- values.params = this.state.params;
- this.props.onOk(this.endProcess(values));
- }
- });
- };
- render() {
- const { getFieldDecorator, getFieldValue } = this.props.form;
- const { isAdd, visible, onCancel } = this.props;
- const {
- name,
- code,
- headers,
- ip,
- ip_enable,
- params,
- paramsArr,
- paramsForm,
- res_body,
- delay
- } = this.state;
- this.props.form.initialValue;
- const valuesTpl = (values, title) => {
- const dataSource = this.getParamsKey();
- const display = paramsForm === 'json' ? 'none' : '';
- return values.map((item, index) => (
- <div key={index} className="paramsArr" style={{ display }}>
- <FormItem
- {...(index === 0 ? formItemLayout : formItemLayoutWithOutLabel)}
- wrapperCol={index === 0 ? { span: 19 } : { span: 19, offset: 5 }}
- label={index ? '' : title}
- >
- <Row gutter={8}>
- <Col span={10}>
- <FormItem>
- {getFieldDecorator(`paramsArr[${index}].name`, { initialValue: item.name })(
- <AutoComplete
- dataSource={dataSource}
- placeholder="参数名称"
- filterOption={(inputValue, option) =>
- option.props.children.toUpperCase().indexOf(inputValue.toUpperCase()) !== -1
- }
- />
- )}
- </FormItem>
- </Col>
- <Col span={10}>
- <FormItem>
- {getFieldDecorator(`paramsArr[${index}].value`, { initialValue: item.value })(
- <Input placeholder="参数值" />
- )}
- </FormItem>
- </Col>
- <Col span={4}>
- {values.length > 1 ? (
- <Icon
- className="dynamic-delete-button"
- type="minus-circle-o"
- onClick={() => this.removeValues('paramsArr', index)}
- />
- ) : null}
- </Col>
- </Row>
- </FormItem>
- </div>
- ));
- };
- const headersTpl = (values, title) => {
- const dataSource = constants.HTTP_REQUEST_HEADER;
- return values.map((item, index) => (
- <div key={index} className="headers">
- <FormItem
- {...(index === 0 ? formItemLayout : formItemLayoutWithOutLabel)}
- wrapperCol={index === 0 ? { span: 19 } : { span: 19, offset: 5 }}
- label={index ? '' : title}
- >
- <Row gutter={8}>
- <Col span={10}>
- <FormItem>
- {getFieldDecorator(`headers[${index}].name`, { initialValue: item.name })(
- <AutoComplete
- dataSource={dataSource}
- placeholder="参数名称"
- filterOption={(inputValue, option) =>
- option.props.children.toUpperCase().indexOf(inputValue.toUpperCase()) !== -1
- }
- />
- )}
- </FormItem>
- </Col>
- <Col span={10}>
- <FormItem>
- {getFieldDecorator(`headers[${index}].value`, { initialValue: item.value })(
- <Input placeholder="参数值" />
- )}
- </FormItem>
- </Col>
- <Col span={4}>
- {values.length > 1 ? (
- <Icon
- className="dynamic-delete-button"
- type="minus-circle-o"
- onClick={() => this.removeValues('headers', index)}
- />
- ) : null}
- </Col>
- </Row>
- </FormItem>
- </div>
- ));
- };
- return (
- <Modal
- title={isAdd ? '添加期望' : '编辑期望'}
- visible={visible}
- maskClosable={false}
- onOk={this.handleOk}
- width={780}
- onCancel={() => onCancel()}
- afterClose={() => this.setState({ paramsForm: 'form' })}
- className="case-des-modal"
- >
- <Form onSubmit={this.handleOk}>
- <h2 className="sub-title" style={{ marginTop: 0 }}>
- 基本信息
- </h2>
- <FormItem {...formItemLayout} label="期望名称">
- {getFieldDecorator('name', {
- initialValue: name,
- rules: [{ required: true, message: '请输入期望名称!' }]
- })(<Input placeholder="请输入期望名称" />)}
- </FormItem>
- <FormItem {...formItemLayout} label="IP 过滤" className="ip-filter">
- <Col span={6} className="ip-switch">
- <FormItem>
- {getFieldDecorator('ip_enable', {
- initialValue: ip_enable,
- valuePropName: 'checked',
- rules: [{ type: 'boolean' }]
- })(<Switch />)}
- </FormItem>
- </Col>
- <Col span={18}>
- <div style={{ display: getFieldValue('ip_enable') ? '' : 'none' }} className="ip">
- <FormItem>
- {getFieldDecorator(
- 'ip',
- getFieldValue('ip_enable')
- ? {
- initialValue: ip,
- rules: [
- {
- pattern: constants.IP_REGEXP,
- message: '请填写正确的 IP 地址',
- required: true
- }
- ]
- }
- : {}
- )(<Input placeholder="请输入过滤的 IP 地址" />)}
- </FormItem>
- </div>
- </Col>
- </FormItem>
- <Row className="params-form" style={{ marginBottom: 8 }}>
- <Col {...{ span: 12, offset: 5 }}>
- <Switch
- size="small"
- checkedChildren="JSON"
- unCheckedChildren="JSON"
- checked={paramsForm === 'json'}
- onChange={bool => {
- this.setState({ paramsForm: bool ? 'json' : 'form' });
- }}
- />
- </Col>
- </Row>
- {valuesTpl(paramsArr, '参数过滤')}
- <FormItem
- wrapperCol={{ span: 6, offset: 5 }}
- style={{ display: paramsForm === 'form' ? '' : 'none' }}
- >
- <Button
- size="default"
- type="primary"
- onClick={() => this.addValues('paramsArr')}
- style={{ width: '100%' }}
- >
- <Icon type="plus" /> 添加参数
- </Button>
- </FormItem>
- <FormItem
- {...formItemLayout}
- wrapperCol={{ span: 17 }}
- label="参数过滤"
- style={{ display: paramsForm === 'form' ? 'none' : '' }}
- >
- <AceEditor className="pretty-editor" data={params} onChange={this.handleParams} />
- <FormItem>
- {getFieldDecorator(
- 'params',
- paramsForm === 'json'
- ? {
- rules: [
- { validator: this.jsonValidator, message: '请输入正确的 JSON 字符串!' }
- ]
- }
- : {}
- )(<Input style={{ display: 'none' }} />)}
- </FormItem>
- </FormItem>
- <h2 className="sub-title">响应</h2>
- <FormItem {...formItemLayout} required label="HTTP Code">
- {getFieldDecorator('code', {
- initialValue: code
- })(
- <Select showSearch>
- {httpCodes.map(code => (
- <Option key={'' + code} value={'' + code}>
- {'' + code}
- </Option>
- ))}
- </Select>
- )}
- </FormItem>
- <FormItem {...formItemLayout} label="延时">
- {getFieldDecorator('delay', {
- initialValue: delay,
- rules: [{ required: true, message: '请输入延时时间!', type: 'integer' }]
- })(<InputNumber placeholder="请输入延时时间" min={0} />)}
- <span>ms</span>
- </FormItem>
- {headersTpl(headers, 'HTTP 头')}
- <FormItem wrapperCol={{ span: 6, offset: 5 }}>
- <Button
- size="default"
- type="primary"
- onClick={() => this.addValues('headers')}
- style={{ width: '100%' }}
- >
- <Icon type="plus" /> 添加 HTTP 头
- </Button>
- </FormItem>
- <FormItem {...formItemLayout} wrapperCol={{ span: 17 }} label="Body" required>
- <FormItem>
- <AceEditor
- className="pretty-editor"
- data={res_body}
- mode={this.props.currInterface.res_body_type === 'json' ? null : 'text'}
- onChange={this.handleRequestBody}
- />
- </FormItem>
- </FormItem>
- </Form>
- </Modal>
- );
- }
- }
- const CaseDesModal = Form.create()(CaseDesForm);
- export default CaseDesModal;
|