src/routes/Plugin/PluginRuleHandle/RequestRuleHandle.js (459 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import React, { Component } from "react"; import { Tabs, Form, Select, Row, Col, Input, Button } from "antd"; import styles from "../index.less"; import { getIntlContent } from '../../../utils/IntlUtils' const FormItem = Form.Item; const { Option } = Select; const { TabPane } = Tabs; export default class RequestRuleHandle extends Component { constructor(props) { super(props); props.onRef(this); this.state = { headerOperateType: [ { label: "addHeaders", value: "addHeaders" }, { label: "replaceHeaderKeys", value: "replaceHeaderKeys" }, { label: "setHeaders", value: "setHeaders" }, { label: "removeHeaderKeys", value: "removeHeaderKeys" }, ], parameterOperateType: [ { label: "addParameters", value: "addParameters" }, { label: "replaceParameterKeys", value: "replaceParameterKeys" }, { label: "setParameters", value: "setParameters" }, { label: "removeParameterKeys", value: "removeParameterKeys" }, ], cookieOperateType: [ { label: "addCookies", value: "addCookies" }, { label: "replaceCookieKeys", value: "replaceCookieKeys" }, { label: "setCookies", value: "setCookies" }, { label: "removeCookieKeys", value: "removeCookieKeys" }, ], currentType: "parameter", } this.initList(props); } initList = (props) => { let handle = props.handle && JSON.parse(props.handle); this.state.parameterList = this.initListByType(handle, "parameter"); this.state.headerList = this.initListByType(handle, "header"); this.state.cookieList = this.initListByType(handle, "cookie"); } initListByType = (handle, dataType) => { let dataTypeFirstUpper = dataType.substring(0, 1).toUpperCase() + dataType.substring(1, dataType.length); let dataTypeUpper = dataType.toUpperCase(); let addFields = `add${dataTypeFirstUpper}s`; let replaceFieldKeys = `replace${dataTypeFirstUpper}Keys`; let setFields = `set${dataTypeFirstUpper}s`; let removeFields = `remove${dataTypeFirstUpper}Keys`; let list = [ [ { fieldLabel: "OperateType", fieldName: `${dataType}_type_0`, fieldValue: `add${dataTypeFirstUpper}s` }, { fieldLabel: getIntlContent(`SHENYU.PLUGIN.REQUEST.${dataTypeUpper}.KEY`), fieldName: `${dataType}_key_0`, fieldValue: null }, { fieldLabel: getIntlContent(`SHENYU.PLUGIN.REQUEST.${dataTypeUpper}.VALUE`), fieldName: `${dataType}_value_0`, fieldValue: null }, ] ]; if (handle && handle[dataType] && ( (handle[dataType][addFields]&&Object.keys(handle[dataType][addFields]).length > 0) || (handle[dataType][replaceFieldKeys] && Object.keys(handle[dataType][replaceFieldKeys]).length > 0) || (handle[dataType][setFields] && Object.keys(handle[dataType][setFields]).length > 0) || (handle[dataType][removeFields] && handle[dataType][removeFields].length > 0) )) { list = []; let index = 0; // eslint-disable-next-line no-unused-expressions handle[dataType][addFields] && Object.keys(handle[dataType][addFields]).length > 0 && Object.keys(handle[dataType][addFields]).forEach((e) => { let v = handle[dataType][addFields][e]; list.push([ { fieldLabel: "OperateType", fieldName: `${dataType}_type_${index}`, fieldValue: `add${dataTypeFirstUpper}s` }, { fieldLabel: getIntlContent(`SHENYU.PLUGIN.REQUEST.${dataTypeUpper}.KEY`), fieldName: `${dataType}_key_${index}`, fieldValue: e }, { fieldLabel: getIntlContent(`SHENYU.PLUGIN.REQUEST.${dataTypeUpper}.VALUE`), fieldName: `${dataType}_value_${index}`, fieldValue: v }, ]); index += 1; }) // eslint-disable-next-line no-unused-expressions handle[dataType][replaceFieldKeys] && Object.keys(handle[dataType][replaceFieldKeys]).length > 0 && Object.keys(handle[dataType][replaceFieldKeys]).forEach((e) => { let v = handle[dataType][replaceFieldKeys][e]; list.push([ { fieldLabel: "OperateType", fieldName: `${dataType}_type_${index}`, fieldValue: `replace${dataTypeFirstUpper}Keys` }, { fieldLabel: getIntlContent(`SHENYU.PLUGIN.REQUEST.${dataTypeUpper}.OLD.KEY`), fieldName: `${dataType}_key_${index}`, fieldValue: e }, { fieldLabel: getIntlContent(`SHENYU.PLUGIN.REQUEST.${dataTypeUpper}.NEW.KEY`), fieldName: `${dataType}_value_${index}`, fieldValue: v }, ]) index += 1; }) // eslint-disable-next-line no-unused-expressions handle[dataType][setFields] && Object.keys(handle[dataType][setFields]).length > 0 && Object.keys(handle[dataType][setFields]).forEach((e) => { let v = handle[dataType][setFields][e]; list.push([ { fieldLabel: "OperateType", fieldName: `${dataType}_type_${index}`, fieldValue: `set${dataTypeFirstUpper}s` }, { fieldLabel: getIntlContent(`SHENYU.PLUGIN.REQUEST.${dataTypeUpper}.KEY`), fieldName: `${dataType}_key_${index}`, fieldValue: e }, { fieldLabel: getIntlContent(`SHENYU.PLUGIN.REQUEST.${dataTypeUpper}.VALUE`), fieldName: `${dataType}_value_${index}`, fieldValue: v }, ]) index += 1; }) let removeKeys = []; // eslint-disable-next-line no-unused-expressions (handle[dataType][removeFields] && handle[dataType][removeFields].length > 0) && handle[dataType][removeFields].forEach((e, i) => { if (i % 2 === 0) { removeKeys.push([]); } removeKeys[removeKeys.length - 1].push(e); }); // eslint-disable-next-line no-unused-expressions (removeKeys && removeKeys.length > 0) && removeKeys.forEach((e) => { let dataItem = [ { fieldLabel: "OperateType", fieldName: `${dataType}_type_${index}`, fieldValue: `remove${dataTypeFirstUpper}Keys` }, { fieldLabel: getIntlContent(`SHENYU.PLUGIN.REQUEST.${dataTypeUpper}.KEY`), fieldName: `${dataType}_key_${index}`, fieldValue: e[0] } ]; if (e[1]) { dataItem.push( { fieldLabel: getIntlContent(`SHENYU.PLUGIN.REQUEST.${dataTypeUpper}.KEY`), fieldName: `${dataType}_value_${index}`, fieldValue: e[1] } ) } list.push(dataItem) index += 1; }) } return list; } handleTabChange = (currentType) => { this.setState({ currentType }) } handleAddRow = (type) => { // eslint-disable-next-line react/no-access-state-in-setstate let list = this.state[`${type}List`]; let strs = list[list.length - 1][0].fieldName.split("_"); // eslint-disable-next-line radix let index = parseInt(strs[strs.length - 1]) + 1; let defaultFieldType = this.state[`${type}OperateType`][0].value; list.push( [ { fieldLabel: "OperateType", fieldName: `${type}_type_${index}`, fieldValue: defaultFieldType }, { fieldLabel: getIntlContent(`SHENYU.PLUGIN.REQUEST.${type.toUpperCase()}.KEY`), fieldName: `${type}_key_${index}`, fieldValue: null }, { fieldLabel: getIntlContent(`SHENYU.PLUGIN.REQUEST.${type.toUpperCase()}.VALUE`), fieldName: `${type}_value_${index}`, fieldValue: null }, ] ) this.setState({ [`${type}List`]: list }) } handleDeleteRow = (type, rowIndex) => { if (rowIndex === 0) { return; } // eslint-disable-next-line react/no-access-state-in-setstate let list = this.state[`${type}List`]; list.splice(rowIndex, 1); this.setState({ [`${type}List`]: list }) } handleTypeChange = (val, type, rowIndex) => { // eslint-disable-next-line react/no-access-state-in-setstate let list = this.state[`${type}List`]; if (val.startsWith("replace")) { list[rowIndex][1].fieldLabel = getIntlContent(`SHENYU.PLUGIN.REQUEST.${type.toUpperCase()}.OLD.KEY`); list[rowIndex][2].fieldLabel = getIntlContent(`SHENYU.PLUGIN.REQUEST.${type.toUpperCase()}.NEW.KEY`); } else if (val.startsWith("remove")) { list[rowIndex][1].fieldLabel = getIntlContent(`SHENYU.PLUGIN.REQUEST.${type.toUpperCase()}.KEY`); list[rowIndex][2].fieldLabel = getIntlContent(`SHENYU.PLUGIN.REQUEST.${type.toUpperCase()}.KEY`); } else { list[rowIndex][1].fieldLabel = getIntlContent(`SHENYU.PLUGIN.REQUEST.${type.toUpperCase()}.KEY`); list[rowIndex][2].fieldLabel = getIntlContent(`SHENYU.PLUGIN.REQUEST.${type.toUpperCase()}.VALUE`); } this.setState({ [`${type}List`]: list }) } getData = (formValues) => { let handle = { header: { addHeaders: {}, replaceHeaderKeys: {}, setHeaders: {}, removeHeaderKeys: [] }, parameter: { addParameters: {}, replaceParameterKeys: {}, setParameters: {}, removeParameterKeys: [] }, cookie: { addCookies: {}, replaceCookieKeys: {}, setCookies: {}, removeCookieKeys: [] } }; this.buildData(handle, formValues, "parameter"); this.buildData(handle, formValues, "header"); this.buildData(handle, formValues, "cookie"); return JSON.stringify(handle); } buildData = (handle, formValues, dataType) => { // eslint-disable-next-line react/no-access-state-in-setstate let list = this.state[`${dataType}List`]; list.forEach(row => { let type = formValues[row[0].fieldName]; let value1 = row[1]&&formValues[row[1].fieldName]; let value2 = row.length>2&&formValues[row[2].fieldName]; if (!type.startsWith("remove") && value1 && value2) { handle[dataType][type][value1] = value2 } if (type.startsWith("remove")) { if (value1) { handle[dataType][type].push(value1) } if (value2) { handle[dataType][type].push(value2) } } }) } render() { const { headerOperateType, parameterOperateType, cookieOperateType, currentType, headerList, parameterList, cookieList } = this.state; const { form } = this.props; const { getFieldDecorator } = form; return ( <div className={styles.handleWrap} style={{ padding: "0px 40px" }}> <div className={styles.header}> <h3 style={{ width: 60, marginTop: 10 }}>{getIntlContent("SHENYU.COMMON.DEAL")}: </h3> </div> <Tabs style={{ marginLeft: 10 }} defaultActiveKey={currentType} onChange={this.handleTabChange}> <TabPane tab="Params" key="parameter"> {parameterList && parameterList.length > 0 && ( parameterList.map((row, rowIndex) => { return ( <Row gutter={24} key={rowIndex}> { row.map((field, i) => { let rules = []; let placeholder = field.fieldLabel; return ( <Col span={6} key={i}> { field.fieldName.includes("type") ? ( <FormItem> {getFieldDecorator(field.fieldName, { rules, initialValue: field.fieldValue, })( <Select onChange={(val) => { this.handleTypeChange(val, "parameter", rowIndex) }} placeholder={placeholder} style={{ width: 200 }}> { parameterOperateType.map(opt => { return <Option value={opt.value}>{opt.label}</Option> }) } </Select> ) } </FormItem> ) : ( <FormItem> {getFieldDecorator(field.fieldName, { rules, initialValue: field.fieldValue, })( <Input // addonBefore={<div style={{width: labelWidth}}>{item.label}</div>} placeholder={placeholder} key={field.fieldName} // type="number" />) } </FormItem> ) } </Col> ) }) } <Col span={6}> <Button type="danger" style={{ marginRight: "20px" }} onClick={() => { this.handleDeleteRow("parameter", rowIndex); }} > {getIntlContent("SHENYU.COMMON.DELETE.NAME")} </Button> {rowIndex === 0 && ( <Button onClick={() => this.handleAddRow("parameter")} type="primary"> {getIntlContent("SHENYU.COMMON.ADD")} </Button> )} </Col> </Row> ) }) )} </TabPane> <TabPane tab="Headers" key="header"> {headerList && headerList.length > 0 && ( headerList.map((row, rowIndex) => { return ( <Row gutter={24} key={rowIndex}> { row.map((field, i) => { let rules = []; let placeholder = field.fieldLabel; return ( <Col span={6} key={i}> { field.fieldName.includes("type") ? ( <FormItem> {getFieldDecorator(field.fieldName, { rules, initialValue: field.fieldValue, })( <Select onChange={(val) => { this.handleTypeChange(val, "header", rowIndex) }} placeholder={placeholder} style={{ width: 200 }}> { headerOperateType.map(opt => { return <Option value={opt.value}>{opt.label}</Option> }) } </Select> ) } </FormItem> ) : ( <FormItem> {getFieldDecorator(field.fieldName, { rules, initialValue: field.fieldValue, })( <Input // addonBefore={<div style={{width: labelWidth}}>{item.label}</div>} placeholder={placeholder} key={field.fieldName} // type="number" />) } </FormItem> ) } </Col> ) }) } <Col span={6}> <Button type="danger" style={{ marginRight: "20px" }} onClick={() => { this.handleDeleteRow("header", rowIndex); }} > {getIntlContent("SHENYU.COMMON.DELETE.NAME")} </Button> {rowIndex === 0 && ( <Button onClick={() => this.handleAddRow("header")} type="primary"> {getIntlContent("SHENYU.COMMON.ADD")} </Button> )} </Col> </Row> ) }) )} </TabPane> <TabPane tab="Cookies" key="cookie"> {cookieList && cookieList.length > 0 && ( cookieList.map((row, rowIndex) => { return ( <Row gutter={24} key={rowIndex}> { row.map((field, i) => { let rules = []; let placeholder = field.fieldLabel; return ( <Col span={6} key={i}> { field.fieldName.includes("type") ? ( <FormItem> {getFieldDecorator(field.fieldName, { rules, initialValue: field.fieldValue, })( <Select onChange={(val) => { this.handleTypeChange(val, "cookie", rowIndex) }} placeholder={placeholder} style={{ width: 200 }}> { cookieOperateType.map(opt => { return <Option value={opt.value}>{opt.label}</Option> }) } </Select> ) } </FormItem> ) : ( <FormItem> {getFieldDecorator(field.fieldName, { rules, initialValue: field.fieldValue, })( <Input // addonBefore={<div style={{width: labelWidth}}>{item.label}</div>} placeholder={placeholder} key={field.fieldName} // type="number" />) } </FormItem> ) } </Col> ) }) } <Col span={6}> <Button type="danger" style={{ marginRight: "20px" }} onClick={() => { this.handleDeleteRow("cookie", rowIndex); }} > {getIntlContent("SHENYU.COMMON.DELETE.NAME")} </Button> {rowIndex === 0 && ( <Button onClick={() => this.handleAddRow("cookie")} type="primary"> {getIntlContent("SHENYU.COMMON.ADD")} </Button> )} </Col> </Row> ) }) )} </TabPane> </Tabs> </div> ); } }