Skip to content

Commit

Permalink
feat(integrationCenter): add integration center module (#683)
Browse files Browse the repository at this point in the history
* feat(integrationCenter): add integration center module

* feat(integrationCenter): modify mock data && i18

* feat(integrationCenter): fix detail
  • Loading branch information
huxiangtao authored and cd1989 committed Jan 3, 2019
1 parent 2cf3d28 commit 1aa32bd
Show file tree
Hide file tree
Showing 9 changed files with 291 additions and 16 deletions.
147 changes: 147 additions & 0 deletions web/src/components/integration/component/DataForm.js
@@ -0,0 +1,147 @@
import React from 'react';
import PropTypes from 'prop-types';
import { Form, Select, Input, Button } from 'antd';

const FormItem = Form.Item;
const Option = Select.Option;
const formMap = {
git: [
{
label: 'URL',
key: 'url',
},
{
label: 'Token',
key: 'Token',
},
],
imagesregistry: [
{
label: intl.get('integration.dataform.registryaddress'),
key: 'registryAddress',
},
{
label: intl.get('integration.dataform.username'),
key: 'username',
},
{
label: intl.get('integration.dataform.pwd'),
key: 'pwd',
},
],
};

class DataForm extends React.Component {
static propTypes = {
form: PropTypes.object,
onSubmit: PropTypes.func,
onCancel: PropTypes.func,
};
state = {
inputList: [],
};

componentDidMount() {
this.resetForm();
}

componentWillUnmount() {
this.resetForm();
}

resetForm = () => {
const { resetFields } = this.props.form;
this.setState({ inputList: [] });
resetFields();
};

handleSubmit = e => {
const { onSubmit } = this.props;
e.preventDefault();
this.props.form.validateFields((err, values) => {
if (!err) {
// TODO post request
this.resetForm();
onSubmit();
}
});
};

handleCancle = () => {
const { onCancel } = this.props;
this.resetForm();
onCancel();
};

handleSelectChange = value => {
this.setState({
inputList: formMap[value],
});
};

renderFormInputs = () => {
const { inputList } = this.state;
const { getFieldDecorator } = this.props.form;
return (
inputList.length > 0 &&
inputList.map((v, i) => (
<FormItem
key={i}
label={v.label}
labelCol={{ span: 5 }}
wrapperCol={{ span: 12 }}
>
{getFieldDecorator(v.key)(<Input autoComplete="off" />)}
</FormItem>
))
);
};

render() {
const { getFieldDecorator } = this.props.form;
const { inputList } = this.state;
return (
<Form onSubmit={this.handleSubmit}>
<FormItem
label={intl.get('integration.type')}
labelCol={{ span: 5 }}
wrapperCol={{ span: 12 }}
>
{getFieldDecorator('type', {
rules: [
{
required: true,
message: intl.get('integration.dataform.datasourcetype'),
},
],
})(
<Select
placeholder={intl.get('integration.dataform.datasourcetype')}
onChange={this.handleSelectChange}
>
<Option value="git">git</Option>
<Option value="imagesregistry">
{intl.get('integration.dataform.imagesregistry')}
</Option>
</Select>
)}
</FormItem>
{this.renderFormInputs()}
<Form.Item wrapperCol={{ span: 8, offset: 10 }}>
<Button style={{ marginRight: '10px' }} onClick={this.handleCancle}>
{intl.get('integration.dataform.cancel')}
</Button>
<Button
disabled={inputList.length <= 0}
type="primary"
htmlType="submit"
>
{intl.get('integration.dataform.confirm')}
</Button>
</Form.Item>
</Form>
);
}
}

export default Form.create()(DataForm);
78 changes: 78 additions & 0 deletions web/src/components/integration/component/List.js
@@ -0,0 +1,78 @@
import React from 'react';
import { Table, Button, Modal } from 'antd';
import { inject, observer } from 'mobx-react';
import IntegrationForm from './DataForm';
import PropTypes from 'prop-types';

@inject('integration')
@observer
class List extends React.Component {
static propTypes = {
integration: PropTypes.object,
};
state = { visible: false };
componentDidMount() {
this.props.integration.getIntegrationList();
}
addDataSource = () => {
this.setState({
visible: true,
});
};
handleOk = e => {
this.setState({
visible: false,
});
};

handleCancel = e => {
this.setState({
visible: false,
});
};
render() {
const { integration } = this.props;
const columns = [
{
title: intl.get('name'),
dataIndex: 'name',
key: 'name',
},
{
title: intl.get('integration.type'),
dataIndex: 'type',
key: 'type',
},
{
title: intl.get('integration.creationTime'),
dataIndex: 'time',
key: 'time',
},
];
return (
<div>
<div className="head-bar">
<h2>{intl.get('integration.datasource')}</h2>
<Button type="primary" onClick={this.addDataSource}>
{intl.get('operation.add')}
</Button>
</div>
<Table columns={columns} dataSource={integration.integrationList} />
<Modal
ref="modal"
title={intl.get('integration.adddatasource')}
visible={this.state.visible}
footer={null}
onCancel={this.handleCancel}
>
<IntegrationForm
onSubmit={this.handleOk}
onCancel={this.handleCancel}
/>
</Modal>
</div>
);
}
}

export default List;
2 changes: 2 additions & 0 deletions web/src/components/integration/index.js
@@ -0,0 +1,2 @@
import Integration from './component/List';
export default Integration;
6 changes: 6 additions & 0 deletions web/src/layout/index.js
Expand Up @@ -80,6 +80,12 @@ class CoreLayout extends Component {
<span>{intl.get('sideNav.workflow')}</span>
</NavLink>
</Menu.Item>
<Menu.Item key="integration">
<NavLink to="/integration" activeClassName="active">
<Icon type="sliders" />
<span>{intl.get('sideNav.integration')}</span>
</NavLink>
</Menu.Item>
{/* TODO: manage and setting */}
{/* <SubMenu
key="manage"
Expand Down
25 changes: 17 additions & 8 deletions web/src/locale/en-US.json
Expand Up @@ -15,18 +15,27 @@
"project": "Project",
"resource": "Resource",
"template": "Template",
"workflow": "Workflow"
"workflow": "Workflow",
"integration": "Integration Center"
},
"workflow": {
"recentVersion": "Recent version",
"creator": "Creator"
"creator": "Creator",
"creationTime": "Creation time"
},
"project": {
"workflowCount": "Workflow count",
"createProject": "Create Project",
"authentication": "Authentication",
"formTip": {
"projectNameRequired": "Please input the name of project"
"integration": {
"type": "Type",
"integrationTime": "Integration time",
"datasource": "Data source",
"adddatasource": "Add new data source",
"dataform": {
"dockerregistry": "Docker registry",
"registryaddress": "Registry Address",
"confirm": "Confirm",
"cancel": "Cancel",
"username": "Username",
"pwd": "password",
"datasourcetype": "Please select a resource type"
}
}
}
25 changes: 17 additions & 8 deletions web/src/locale/zh-CN.json
Expand Up @@ -15,18 +15,27 @@
"project": "项目",
"resource": "资源",
"template": "模板",
"workflow": "工作流"
"workflow": "流水线",
"integration": "集成中心"
},
"workflow": {
"recentVersion": "最近版本",
"creator": "创建者"
"creator": "创建者",
"creationTime": "创建时间"
},
"project": {
"workflowCount": "工作流数量",
"createProject": "新增项目",
"authentication": "认证",
"formTip": {
"projectNameRequired": "请输入项目名称"
"integration": {
"type": "类型",
"creationTime": "创建时间",
"datasource": "数据源",
"adddatasource": "新增数据源",
"dataform": {
"dockerregistry": "镜像仓库",
"registryaddress": "仓库地址",
"confirm": "确定",
"cancel": "取消",
"username": "用户吗",
"pwd": "密码",
"datasourcetype": "请选择资源类型"
}
}
}
2 changes: 2 additions & 0 deletions web/src/routes/index.js
Expand Up @@ -4,6 +4,7 @@ import Workflow from '../components/workflow';
import Template from '../components/template';
import Resource from '../components/resource';
import Overview from '../components/overview';
import Integration from '../components/integration';

import React from 'react';

Expand All @@ -14,6 +15,7 @@ const Routes = () => (
<Route path="/resource" component={Resource} />
<Route path="/template" component={Template} />
<Route path="/workflow" component={Workflow} />
<Route path="/integration" component={Integration} />
<Redirect to="/" />
</Switch>
);
Expand Down
2 changes: 2 additions & 0 deletions web/src/store/index.js
@@ -1,6 +1,8 @@
import workflow from './workflow';
import integration from './integration';

const stores = {
workflow,
integration,
};
export default stores;
20 changes: 20 additions & 0 deletions web/src/store/integration.js
@@ -0,0 +1,20 @@
import { observable, useStrict, action } from 'mobx';

useStrict(true);

class Integration {
@observable integrationList = [];
@action.bound
getIntegrationList(workflowId) {
this.integrationList = [
{
name: 'svn-2',
type: 'svn-1',
time: '2018-12-21',
},
];
return;
}
}

export default new Integration();

0 comments on commit 1aa32bd

Please sign in to comment.