From ad4bbdb78e15744220992fa1a9d8438be8a012bd Mon Sep 17 00:00:00 2001
From: Ashutosh Chaudhary <216.ashutosh@gmail.com>
Date: Sun, 7 Feb 2021 01:38:21 +0530
Subject: [PATCH 1/4] Added ykit Removed clutter
---
package.json | 3 ++-
src/index.js | 44 +-------------------------------------------
2 files changed, 3 insertions(+), 44 deletions(-)
diff --git a/package.json b/package.json
index 83b7706..2bafece 100644
--- a/package.json
+++ b/package.json
@@ -11,11 +11,12 @@
},
"dependencies": {
"antd": "^3.1.6",
+ "brace": "^0.10.0",
"generate-schema": "^2.6.0",
"moox": "^1.0.2",
"react-redux": "^5.0.6",
"underscore": "^1.8.3",
- "brace": "^0.10.0"
+ "ykit": "^0.8.13"
},
"devDependencies": {
"autoprefixer": "^7.2.1",
diff --git a/src/index.js b/src/index.js
index aa82b65..cf58c74 100644
--- a/src/index.js
+++ b/src/index.js
@@ -9,46 +9,12 @@ if (process.env.NODE_ENV !== 'production') {
}
//import '../dist/main.css'
const jeditor = require('../package/index.js');
-const mock = [
- { name: '字符串', mock: '@string' },
- { name: '自然数', mock: '@natural' },
- { name: '浮点数', mock: '@float' },
- { name: '字符', mock: '@character' },
- { name: '布尔', mock: '@boolean' },
- { name: 'url', mock: '@url' },
- { name: '域名', mock: '@domain' },
- { name: 'ip地址', mock: '@ip' },
- { name: 'id', mock: '@id' },
- { name: 'guid', mock: '@guid' },
- { name: '当前时间', mock: '@now' },
- { name: '时间戳', mock: '@timestamp' }
-];
+const mock = [];
const JEditor1 = jeditor({mock: mock});
render(
-
- JSON-Schema-Editor
-
-
- A json-schema editor of high efficient and easy-to-use, base on React.{' '}
-
- Github
-
-
-
-
- 该工具已被用于开源接口管理平台:{' '}
-
- YApi
-
-
-
-
-
Example:
-
-
-
- {/*
{
- // console.log("changeValue", e);
- }}
- /> */}
,
document.getElementById('root')
);
From 574efe14e179e3be4f6d8de8cb62aa01759a189f Mon Sep 17 00:00:00 2001
From: Ashutosh Chaudhary <216.ashutosh@gmail.com>
Date: Sun, 7 Feb 2021 19:00:16 +0530
Subject: [PATCH 2/4] Added redux
Fixed bugs
---
package.json | 7 +-
package/App.js | 55 +++---
package/components/LocalProvider/index.js | 16 +-
.../components/SchemaComponents/SchemaJson.js | 167 +++++++---------
.../SchemaComponents/SchemaOther.js | 4 +-
package/index.js | 26 +--
package/models/schema.js | 86 --------
package/redux/actionTypes.js | 10 +
package/redux/actions.js | 56 ++++++
package/redux/reducers/index.js | 5 +
package/redux/reducers/open.js | 20 ++
package/redux/reducers/schema.js | 187 ++++++++++++++++++
package/redux/store.js | 4 +
package/utils.js | 32 ++-
14 files changed, 409 insertions(+), 266 deletions(-)
create mode 100644 package/redux/actionTypes.js
create mode 100644 package/redux/actions.js
create mode 100644 package/redux/reducers/index.js
create mode 100644 package/redux/reducers/open.js
create mode 100644 package/redux/reducers/schema.js
create mode 100644 package/redux/store.js
diff --git a/package.json b/package.json
index 2bafece..12a066d 100644
--- a/package.json
+++ b/package.json
@@ -13,9 +13,10 @@
"antd": "^3.1.6",
"brace": "^0.10.0",
"generate-schema": "^2.6.0",
- "moox": "^1.0.2",
- "react-redux": "^5.0.6",
- "underscore": "^1.8.3",
+ "lodash": "^4.17.20",
+ "react-redux": "^5.1.2",
+ "redux": "^4.0.5",
+ "reselect": "^4.0.0",
"ykit": "^0.8.13"
},
"devDependencies": {
diff --git a/package/App.js b/package/App.js
index 1e40af9..bb30a73 100644
--- a/package/App.js
+++ b/package/App.js
@@ -21,7 +21,7 @@ const TabPane = Tabs.TabPane;
import './index.css';
import AceEditor from './components/AceEditor/AceEditor.js';
-import _ from 'underscore';
+import _ from 'lodash';
import { connect } from 'react-redux';
import SchemaJson from './components/SchemaComponents/SchemaJson.js';
import PropTypes from 'prop-types';
@@ -32,7 +32,9 @@ const utils = require('./utils');
import CustomItem from './components/SchemaComponents/SchemaOther.js';
import LocalProvider from './components/LocalProvider/index.js';
import MockSelect from './components/MockSelect/index.js';
-
+import {
+ changeEditorSchema, changeType, addChildField, changeValue, requireAll
+} from './redux/actions';
class jsonSchema extends React.Component {
@@ -52,7 +54,6 @@ class jsonSchema extends React.Component {
editorModalName: '', // 弹窗名称desctiption | mock
mock: ''
};
- this.Model = this.props.Model.schema;
this.jsonSchemaData = null;
this.jsonData = null;
}
@@ -70,12 +71,12 @@ class jsonSchema extends React.Component {
}
let jsonData = GenerateSchema(this.jsonData);
- this.Model.changeEditorSchemaAction({ value: jsonData });
+ this.props.changeEditorSchema({ value: jsonData });
} else {
if (!this.jsonSchemaData) {
return message.error('json 数据格式有误');
}
- this.Model.changeEditorSchemaAction({ value: this.jsonSchemaData });
+ this.props.changeEditorSchema({ value: this.jsonSchemaData });
}
this.setState({ visible: false });
};
@@ -90,7 +91,7 @@ class jsonSchema extends React.Component {
if (oldData !== newData) return this.props.onChange(newData);
}
if (this.props.data && this.props.data !== nextProps.data) {
- this.Model.changeEditorSchemaAction({ value: JSON.parse(nextProps.data) });
+ this.props.changeEditorSchema({ value: JSON.parse(nextProps.data) });
}
}
@@ -103,13 +104,13 @@ class jsonSchema extends React.Component {
"properties":{}
}`;
}
- this.Model.changeEditorSchemaAction({ value: JSON.parse(data) });
+ this.props.changeEditorSchema({ value: JSON.parse(data) });
}
getChildContext() {
return {
getOpenValue: keys => {
- return utils.getData(this.props.open, keys);
+ return _.get(this.props.open, keys.join(utils.JSONPATH_JOIN_CHAR));
},
changeCustomValue: this.changeCustomValue,
Model: this.props.Model,
@@ -129,14 +130,14 @@ class jsonSchema extends React.Component {
return this.alterMsg();
}
handleSchema(e.jsonData);
- this.Model.changeEditorSchemaAction({
+ this.props.changeEditorSchema({
value: e.jsonData
});
};
// 修改数据类型
changeType = (key, value) => {
- this.Model.changeTypeAction({ key: [key], value });
+ this.props.changeType({ key: [key], value });
};
handleImportJson = e => {
@@ -154,7 +155,7 @@ class jsonSchema extends React.Component {
};
// 增加子节点
addChildField = key => {
- this.Model.addChildFieldAction({ key: [key] });
+ this.props.addChildField({ key: [key] });
this.setState({ show: true });
};
@@ -167,7 +168,7 @@ class jsonSchema extends React.Component {
if (key[0] === 'mock') {
value = value ? { mock: value } : '';
}
- this.Model.changeValueAction({ key, value });
+ this.props.changeValue({ key, value });
};
// 备注/mock弹窗 点击ok 时
@@ -179,7 +180,7 @@ class jsonSchema extends React.Component {
if (name === 'mock') {
value = value ? { mock: value } : '';
}
- this.Model.changeValueAction({ key: this.state.descriptionKey, value });
+ this.props.changeValue({ key: this.state.descriptionKey, value });
};
handleEditCancel = () => {
@@ -219,11 +220,11 @@ class jsonSchema extends React.Component {
// 高级设置
handleAdvOk = () => {
if (this.state.itemKey.length === 0) {
- this.Model.changeEditorSchemaAction({
+ this.props.changeEditorSchema({
value: this.state.curItemCustomValue
});
} else {
- this.Model.changeValueAction({
+ this.props.changeValue({
key: this.state.itemKey,
value: this.state.curItemCustomValue
});
@@ -254,7 +255,7 @@ class jsonSchema extends React.Component {
changeCheckBox = e => {
this.setState({ checked: e });
- this.Model.requireAllAction({ required: e, value: this.props.schema });
+ this.props.requireAll({ required: e, value: this.props.schema });
};
render() {
@@ -471,13 +472,10 @@ class jsonSchema extends React.Component {
) : null}
- {this.state.show && (
-
- )}
+ />)}
@@ -497,10 +495,15 @@ jsonSchema.propTypes = {
onChange: PropTypes.func,
showEditor: PropTypes.bool,
isMock: PropTypes.bool,
- Model: PropTypes.object
};
-export default connect(state => ({
- schema: state.schema.data,
- open: state.schema.open
-}))(jsonSchema);
+const mapStateToProps = ({ schema, open }) => {
+ return {schema, open};
+};
+
+export default connect(
+ mapStateToProps,
+ {
+ changeEditorSchema, changeType, addChildField, changeValue, requireAll
+ }
+)(jsonSchema);
diff --git a/package/components/LocalProvider/index.js b/package/components/LocalProvider/index.js
index 84d40ab..aec6fd6 100644
--- a/package/components/LocalProvider/index.js
+++ b/package/components/LocalProvider/index.js
@@ -1,5 +1,4 @@
-import utils from '../../utils'
-import React from 'react';
+import { lang } from '../../utils'
const langs = {
en_US: {
@@ -75,14 +74,5 @@ const langs = {
}
export default (message) => {
- return langs[utils.lang][message]
-}
-
-
-
-
-// exports.LocalProvider = (props)=>{
-// console.log(langs[utils.lang][props.message])
-// return {langs[utils.lang][props.message]}
-// // return langs[utils.lang][props.message]
-// }
+ return langs[lang][message]
+}
\ No newline at end of file
diff --git a/package/components/SchemaComponents/SchemaJson.js b/package/components/SchemaComponents/SchemaJson.js
index e48e80f..9d69415 100644
--- a/package/components/SchemaComponents/SchemaJson.js
+++ b/package/components/SchemaComponents/SchemaJson.js
@@ -4,50 +4,45 @@ import {
Menu,
Row,
Col,
- Form,
Select,
Checkbox,
- Button,
Icon,
Input,
- Modal,
message,
Tooltip
} from 'antd';
import FieldInput from './FieldInput'
-const FormItem = Form.Item;
+import {
+ changeEditorSchema, changeType, addChildField, changeValue, requireAll,
+ setOpenValue, changeName, deleteItem, enableRequire, addField
+} from '../../redux/actions';
+
const Option = Select.Option;
-const { TextArea } = Input;
import './schemaJson.css';
-import _ from 'underscore';
+import _ from 'lodash';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import { JSONPATH_JOIN_CHAR, SCHEMA_TYPE } from '../../utils.js';
-const InputGroup = Input.Group;
import LocaleProvider from '../LocalProvider/index.js';
-import utils from '../../utils';
import MockSelect from '../MockSelect/index.js';
const mapping = (name, data, showEdit, showAdv) => {
switch (data.type) {
case 'array':
return ;
- break;
case 'object':
let nameArray = [].concat(name, 'properties');
return ;
- break;
default:
return null;
}
};
-class SchemaArray extends PureComponent {
+class SchemaArrayComponent extends PureComponent {
constructor(props, context) {
super(props);
this._tagPaddingLeftStyle = {};
- this.Model = context.Model.schema;
}
componentWillMount() {
@@ -65,8 +60,8 @@ class SchemaArray extends PureComponent {
// 修改数据类型
handleChangeType = value => {
let prefix = this.getPrefix();
- let key = [].concat(prefix, 'type');
- this.Model.changeTypeAction({ key, value });
+ let keys = [].concat(prefix, 'type');
+ this.props.changeType({ keys, value });
};
// 修改备注信息
@@ -74,7 +69,7 @@ class SchemaArray extends PureComponent {
let prefix = this.getPrefix();
let key = [].concat(prefix, `description`);
let value = e.target.value;
- this.Model.changeValueAction({ key, value });
+ this.props.changeValue({ key, value });
};
// 修改mock信息
@@ -82,29 +77,29 @@ class SchemaArray extends PureComponent {
let prefix = this.getPrefix();
let key = [].concat(prefix, `mock`);
let value = e ? { mock: e } : '';
- this.Model.changeValueAction({ key, value });
+ this.props.changeValue({ key, value });
};
handleChangeTitle = e =>{
let prefix = this.getPrefix();
let key = [].concat(prefix, `title`);
let value = e.target.value;
- this.Model.changeValueAction({ key, value });
+ this.props.changeValue({ key, value });
}
// 增加子节点
handleAddChildField = () => {
let prefix = this.getPrefix();
let keyArr = [].concat(prefix, 'properties');
- this.Model.addChildFieldAction({ key: keyArr });
- this.Model.setOpenValueAction({ key: keyArr, value: true });
+ this.props.addChildField({ key: keyArr });
+ this.props.setOpenValue({ key: keyArr, value: true });
};
handleClickIcon = () => {
let prefix = this.getPrefix();
// 数据存储在 properties.name.properties下
let keyArr = [].concat(prefix, 'properties');
- this.Model.setOpenValueAction({ key: keyArr });
+ this.props.setOpenValue({ key: keyArr });
};
handleShowEdit = (name, type) => {
@@ -116,13 +111,17 @@ class SchemaArray extends PureComponent {
this.props.showAdv(this.getPrefix(), this.props.data.items);
};
+ getOpenValue = jsonPath => {
+ return _.get(this.props.open, jsonPath);
+ };
+
render() {
const { data, prefix, showEdit, showAdv } = this.props;
const items = data.items;
let prefixArray = [].concat(prefix, 'items');
let prefixArrayStr = [].concat(prefixArray, 'properties').join(JSONPATH_JOIN_CHAR);
- let showIcon = this.context.getOpenValue([prefixArrayStr]);
+ let showIcon = this.getOpenValue([prefixArrayStr]);
return (
!_.isUndefined(data.items) && (
@@ -214,18 +213,16 @@ class SchemaArray extends PureComponent {
}
}
-SchemaArray.contextTypes = {
- getOpenValue: PropTypes.func,
- Model: PropTypes.object,
- isMock: PropTypes.bool
-};
+const SchemaArray = connect(({ open }) => { return { open }}, {
+ changeEditorSchema, changeType, addChildField, changeValue, requireAll,
+ setOpenValue, changeName, deleteItem, enableRequire, addField
+})(SchemaArrayComponent);
-class SchemaItem extends PureComponent {
+class SchemaItemComponent extends PureComponent {
constructor(props, context) {
super(props);
this._tagPaddingLeftStyle = {};
// this.num = 0
- this.Model = context.Model.schema;
}
componentWillMount() {
@@ -249,7 +246,7 @@ class SchemaItem extends PureComponent {
return message.error(`The field "${value}" already exists.`);
}
- this.Model.changeNameAction({ value, prefix, name });
+ this.props.changeName({ keys: prefix, name, value });
};
// 修改备注信息
@@ -257,7 +254,7 @@ class SchemaItem extends PureComponent {
let prefix = this.getPrefix();
let key = [].concat(prefix, 'description');
let value = e.target.value;
- this.Model.changeValueAction({ key, value });
+ this.props.changeValue({ key, value });
};
// 修改mock 信息
@@ -265,29 +262,28 @@ class SchemaItem extends PureComponent {
let prefix = this.getPrefix();
let key = [].concat(prefix, `mock`);
let value = e ? { mock: e } : '';
- this.Model.changeValueAction({ key, value });
+ this.props.changeValue({ key, value });
};
handleChangeTitle = e => {
let prefix = this.getPrefix();
let key = [].concat(prefix, `title`);
let value = e.target.value;
- this.Model.changeValueAction({ key, value });
+ this.props.changeValue({ key, value });
}
// 修改数据类型
handleChangeType = e => {
let prefix = this.getPrefix();
- let key = [].concat(prefix, 'type');
- this.Model.changeTypeAction({ key, value: e });
+ let keys = [].concat(prefix, 'type');
+ this.props.changeType({ keys, value: e });
};
- // 删除节点
handleDeleteItem = () => {
const { prefix, name } = this.props;
let nameArray = this.getPrefix();
- this.Model.deleteItemAction({ key: nameArray });
- this.Model.enableRequireAction({ prefix, name, required: false });
+ this.props.deleteItem({ keys: nameArray });
+ this.props.enableRequire({ keys: prefix, name, required: false });
};
/*
展示备注编辑弹窗
@@ -300,7 +296,6 @@ class SchemaItem extends PureComponent {
showEdit(this.getPrefix(), editorName, data.properties[name][editorName], type);
};
- // 展示高级设置弹窗
handleShowAdv = () => {
const { data, name, showAdv } = this.props;
showAdv(this.getPrefix(), data.properties[name]);
@@ -309,7 +304,7 @@ class SchemaItem extends PureComponent {
// 增加子节点
handleAddField = () => {
const { prefix, name } = this.props;
- this.Model.addFieldAction({ prefix, name });
+ this.props.addField({ keys: prefix, name });
};
// 控制三角形按钮
@@ -317,26 +312,22 @@ class SchemaItem extends PureComponent {
let prefix = this.getPrefix();
// 数据存储在 properties.xxx.properties 下
let keyArr = [].concat(prefix, 'properties');
- this.Model.setOpenValueAction({ key: keyArr });
+ this.props.setOpenValue({ key: keyArr });
};
// 修改是否必须
handleEnableRequire = e => {
const { prefix, name } = this.props;
let required = e.target.checked;
- // this.enableRequire(this.props.prefix, this.props.name, e.target.checked);
- this.Model.enableRequireAction({ prefix, name, required });
+ this.props.enableRequire({ keys: prefix, name, required });
};
render() {
- let { name, data, prefix, showEdit, showAdv } = this.props;
+ let { name, data, prefix, open, showEdit, showAdv } = this.props;
let value = data.properties[name];
let prefixArray = [].concat(prefix, name);
-
- let prefixStr = prefix.join(JSONPATH_JOIN_CHAR);
- let prefixArrayStr = [].concat(prefixArray, 'properties').join(JSONPATH_JOIN_CHAR);
- let show = this.context.getOpenValue([prefixStr]);
- let showIcon = this.context.getOpenValue([prefixArrayStr]);
+ let show = _.get(open, prefix);
+ let showIcon = _.get(open, [].concat(prefix, name, 'properties'));
return show ? (
@@ -396,15 +387,6 @@ class SchemaItem extends PureComponent {
{this.context.isMock && (
- {/* this.handleShowEdit('mock', value.type)} />
- }
- placeholder={LocaleProvider('mock')}
- value={value.mock ? value.mock.mock : ''}
- onChange={this.handleChangeMock}
- disabled={value.type === 'object' || value.type === 'array'}
- /> */}
this.handleShowEdit('mock', value.type)}
@@ -458,62 +440,55 @@ class SchemaItem extends PureComponent {
}
}
-SchemaItem.contextTypes = {
- getOpenValue: PropTypes.func,
- Model: PropTypes.object,
+SchemaItemComponent.contextTypes = {
isMock: PropTypes.bool
};
-class SchemaObjectComponent extends Component {
- shouldComponentUpdate(nextProps) {
- if (
- _.isEqual(nextProps.data, this.props.data) &&
- _.isEqual(nextProps.prefix, this.props.prefix) &&
- _.isEqual(nextProps.open, this.props.open)
- ) {
- return false;
- }
- return true;
- }
+const SchemaItem = connect(({ open }) => { return { open }}, {
+ changeEditorSchema, changeType, addChildField, changeValue, requireAll,
+ setOpenValue, changeName, deleteItem, enableRequire, addField
+})(SchemaItemComponent);
+class SchemaObjectComponent extends Component {
render() {
const { data, prefix, showEdit, showAdv } = this.props;
return (
- {Object.keys(data.properties).map((name, index) => (
-
- ))}
+ {Object.keys(data.properties).map((name, index) => {
+ return (
+
+ );
+ })}
);
}
}
-const SchemaObject = connect(state => ({
- open: state.schema.open
-}))(SchemaObjectComponent);
+const SchemaObject = connect(
+ ({ schema }) => {return { schema }}
+)(SchemaObjectComponent);
-const DropPlus = (props, context) => {
- const { prefix, name, add } = props;
- const Model = context.Model.schema;
+const DropPlusComponent = (props, context) => {
+ const { prefix, name, addField, setOpenValue, addChildField} = props;
const menu = (