mirror of https://github.com/openspug/spug
A web update
parent
473f8cd9e8
commit
9f2e699e94
|
@ -11,7 +11,7 @@ class Store {
|
|||
|
||||
fetchRecords = () => {
|
||||
this.isFetching = true;
|
||||
http.get('/api/config/environment/')
|
||||
return http.get('/api/config/environment/')
|
||||
.then(res => this.records = res)
|
||||
.finally(() => this.isFetching = false)
|
||||
};
|
||||
|
|
|
@ -1,9 +1,11 @@
|
|||
import { makeRoute } from 'libs/router';
|
||||
import Environment from './environment';
|
||||
import Service from './service';
|
||||
import Setting from './setting';
|
||||
|
||||
|
||||
export default [
|
||||
makeRoute('/environment', Environment),
|
||||
makeRoute('/service', Service),
|
||||
makeRoute('/setting/:type/:id', Setting),
|
||||
]
|
|
@ -1,5 +1,6 @@
|
|||
import React from 'react';
|
||||
import { observer } from 'mobx-react';
|
||||
import { Link } from 'react-router-dom';
|
||||
import { Table, Divider, Modal, message } from 'antd';
|
||||
import ComForm from './Form';
|
||||
import http from 'libs/http';
|
||||
|
@ -34,6 +35,8 @@ class ComTable extends React.Component {
|
|||
<LinkButton onClick={() => store.showForm(info)}>编辑</LinkButton>
|
||||
<Divider type="vertical"/>
|
||||
<LinkButton onClick={() => this.handleDelete(info)}>删除</LinkButton>
|
||||
<Divider type="vertical"/>
|
||||
<Link to={`/config/setting/src/${info.id}`}>配置</Link>
|
||||
</span>
|
||||
)
|
||||
}];
|
||||
|
|
|
@ -0,0 +1,105 @@
|
|||
import React from 'react';
|
||||
import { observer } from 'mobx-react';
|
||||
import { Modal, Form, Input, Checkbox, Row, Col, message } from 'antd';
|
||||
import http from 'libs/http';
|
||||
import store from './store';
|
||||
import envStore from '../environment/store'
|
||||
import lds from 'lodash';
|
||||
|
||||
@observer
|
||||
class ComForm extends React.Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.isModify = store.record.id !== undefined;
|
||||
this.state = {
|
||||
loading: false,
|
||||
envs: this.isModify ? [store.env.id] : []
|
||||
}
|
||||
}
|
||||
|
||||
handleSubmit = () => {
|
||||
this.setState({loading: true});
|
||||
const formData = this.props.form.getFieldsValue();
|
||||
let request;
|
||||
if (this.isModify) {
|
||||
formData['id'] = store.record.id;
|
||||
request = http.patch('/api/config/', formData)
|
||||
} else {
|
||||
formData['type'] = store.type;
|
||||
formData['o_id'] = store.id;
|
||||
formData['envs'] = this.state.envs;
|
||||
formData['is_public'] = true;
|
||||
request = http.post('/api/config/', formData)
|
||||
}
|
||||
request.then(res => {
|
||||
message.success('操作成功');
|
||||
store.formVisible = false;
|
||||
store.fetchRecords()
|
||||
}, () => this.setState({loading: false}))
|
||||
};
|
||||
|
||||
handleEnvCheck = (id) => {
|
||||
if (!this.isModify) {
|
||||
const index = this.state.envs.indexOf(id);
|
||||
if (index !== -1) {
|
||||
this.state.envs.splice(index, 1);
|
||||
} else {
|
||||
this.state.envs.push(id);
|
||||
}
|
||||
this.setState({envs: this.state.envs})
|
||||
}
|
||||
};
|
||||
|
||||
render() {
|
||||
const info = store.record;
|
||||
const {envs} = this.state;
|
||||
const {getFieldDecorator} = this.props.form;
|
||||
const itemLayout = {
|
||||
labelCol: {span: 6},
|
||||
wrapperCol: {span: 14}
|
||||
};
|
||||
return (
|
||||
<Modal
|
||||
visible
|
||||
width={800}
|
||||
maskClosable={false}
|
||||
title={store.record.id ? '更新配置' : '新增配置'}
|
||||
onCancel={() => store.formVisible = false}
|
||||
confirmLoading={this.state.loading}
|
||||
onOk={this.handleSubmit}>
|
||||
<Form>
|
||||
<Form.Item {...itemLayout} required label="Key">
|
||||
{getFieldDecorator('key', {initialValue: info['key']})(
|
||||
<Input disabled={this.isModify} placeholder="请输入"/>
|
||||
)}
|
||||
</Form.Item>
|
||||
<Form.Item {...itemLayout} label="Value">
|
||||
{getFieldDecorator('value', {initialValue: info['value']})(
|
||||
<Input.TextArea placeholder="请输入"/>
|
||||
)}
|
||||
</Form.Item>
|
||||
<Form.Item {...itemLayout} label="备注">
|
||||
{getFieldDecorator('desc', {initialValue: info['desc']})(
|
||||
<Input.TextArea placeholder="请输入备注信息"/>
|
||||
)}
|
||||
</Form.Item>
|
||||
<Form.Item {...itemLayout} label="选择环境">
|
||||
{envStore.records.map((item, index) => (
|
||||
<Row
|
||||
key={item.id}
|
||||
onClick={() => this.handleEnvCheck(item.id)}
|
||||
style={{cursor: 'pointer', borderTop: index ? '1px solid #e8e8e8' : ''}}>
|
||||
<Col span={2}><Checkbox disabled={this.isModify} checked={envs.includes(item.id)}/></Col>
|
||||
<Col span={3}>{item.key}</Col>
|
||||
<Col span={4}>{item.name}</Col>
|
||||
<Col span={15}>{item.desc}</Col>
|
||||
</Row>
|
||||
))}
|
||||
</Form.Item>
|
||||
</Form>
|
||||
</Modal>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
export default Form.create()(ComForm)
|
|
@ -0,0 +1,61 @@
|
|||
import React from 'react';
|
||||
import { observer } from 'mobx-react';
|
||||
import { Table, Divider, Modal, message } from 'antd';
|
||||
import { LinkButton } from 'components';
|
||||
import ComForm from './Form';
|
||||
import http from 'libs/http';
|
||||
import store from './store';
|
||||
import lds from 'lodash';
|
||||
|
||||
@observer
|
||||
class ComTable extends React.Component {
|
||||
columns = [{
|
||||
title: 'Key',
|
||||
dataIndex: 'key',
|
||||
}, {
|
||||
title: 'Value',
|
||||
dataIndex: 'value',
|
||||
}, {
|
||||
title: '描述信息',
|
||||
dataIndex: 'desc',
|
||||
ellipsis: true
|
||||
}, {
|
||||
title: '操作',
|
||||
render: info => (
|
||||
<span>
|
||||
<LinkButton onClick={() => store.showForm(info)}>编辑</LinkButton>
|
||||
<Divider type="vertical"/>
|
||||
<LinkButton onClick={() => this.handleDelete(info)}>删除</LinkButton>
|
||||
</span>
|
||||
)
|
||||
}];
|
||||
|
||||
handleDelete = (text) => {
|
||||
Modal.confirm({
|
||||
title: '删除确认',
|
||||
content: `确定要删除【${store.env.name}】环境下的配置【${text['key']}】?`,
|
||||
onOk: () => {
|
||||
return http.delete('/api/config/', {params: {id: text.id}})
|
||||
.then(() => {
|
||||
message.success('删除成功');
|
||||
store.fetchRecords()
|
||||
})
|
||||
}
|
||||
})
|
||||
};
|
||||
|
||||
render() {
|
||||
let data = store.records;
|
||||
if (store.f_name) {
|
||||
data = data.filter(item => item['key'].toLowerCase().includes(store.f_name.toLowerCase()))
|
||||
}
|
||||
return (
|
||||
<React.Fragment>
|
||||
<Table rowKey="id" loading={store.isFetching} dataSource={data} columns={this.columns}/>
|
||||
{store.formVisible && <ComForm/>}
|
||||
</React.Fragment>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
export default ComTable
|
|
@ -0,0 +1,72 @@
|
|||
import React from 'react';
|
||||
import { observer } from 'mobx-react';
|
||||
import { Menu, Input, Button } from 'antd';
|
||||
import envStore from '../environment/store';
|
||||
import styles from './index.module.css';
|
||||
import { SearchForm } from 'components';
|
||||
import ComTable from './Table';
|
||||
import store from './store';
|
||||
|
||||
@observer
|
||||
class Index extends React.Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.state = {
|
||||
// envId: 0
|
||||
}
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
const {type, id} = this.props.match.params;
|
||||
store.type = type;
|
||||
store.id = id;
|
||||
if (envStore.records.length === 0) {
|
||||
envStore.fetchRecords().then(() => this.updateEnv())
|
||||
} else {
|
||||
this.updateEnv()
|
||||
}
|
||||
}
|
||||
|
||||
updateEnv = (env) => {
|
||||
store.env = env || envStore.records[0];
|
||||
store.fetchRecords()
|
||||
};
|
||||
|
||||
render() {
|
||||
return (
|
||||
<div className={styles.container}>
|
||||
<div className={styles.left}>
|
||||
<Menu
|
||||
mode="inline"
|
||||
selectedKeys={[String(store.env.id)]}
|
||||
style={{border: 'none'}}
|
||||
onSelect={({item}) => this.updateEnv(item.props.env)}>
|
||||
{envStore.records.map(item => (
|
||||
<Menu.Item key={item.id} env={item}>{item.name} ({item.key})</Menu.Item>
|
||||
))}
|
||||
</Menu>
|
||||
</div>
|
||||
<div className={styles.right}>
|
||||
<SearchForm>
|
||||
<SearchForm.Item span={8} title="Key">
|
||||
<Input allowClear onChange={e => store.f_name = e.target.value} placeholder="请输入"/>
|
||||
</SearchForm.Item>
|
||||
<SearchForm.Item span={4}>
|
||||
<Button type="primary" icon="sync" onClick={store.fetchRecords}>刷新</Button>
|
||||
</SearchForm.Item>
|
||||
<SearchForm.Item span={4}>
|
||||
<Button type="primary" style={{backgroundColor: 'orange', borderColor: 'orange'}} icon="history"
|
||||
onClick={store.fetchRecords}>更改历史</Button>
|
||||
</SearchForm.Item>
|
||||
<SearchForm.Item span={8} style={{textAlign: 'right'}}>
|
||||
<Button type="primary" icon="plus" onClick={() => store.showForm()}>新增配置</Button>
|
||||
</SearchForm.Item>
|
||||
</SearchForm>
|
||||
<ComTable/>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
export default Index
|
|
@ -0,0 +1,25 @@
|
|||
.container {
|
||||
display: flex;
|
||||
background-color: #fff;
|
||||
padding: 16px 0;
|
||||
}
|
||||
.left {
|
||||
flex: 2;
|
||||
border-right: 1px solid #e8e8e8;
|
||||
}
|
||||
.right {
|
||||
flex: 7;
|
||||
padding: 8px 40px;
|
||||
}
|
||||
|
||||
.title {
|
||||
margin-bottom: 12px;
|
||||
color: rgba(0, 0, 0, .85);
|
||||
font-weight: 500;
|
||||
font-size: 20px;
|
||||
line-height: 28px;
|
||||
}
|
||||
|
||||
.form {
|
||||
max-width: 320px;
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
import { observable } from "mobx";
|
||||
import http from 'libs/http';
|
||||
|
||||
class Store {
|
||||
@observable records = [];
|
||||
@observable record = {};
|
||||
@observable env = {};
|
||||
@observable type;
|
||||
@observable id;
|
||||
@observable isFetching = false;
|
||||
@observable formVisible = false;
|
||||
|
||||
@observable f_name;
|
||||
|
||||
fetchRecords = () => {
|
||||
const params = {type: this.type, id: this.id, env_id: this.env.id};
|
||||
this.isFetching = true;
|
||||
http.get('/api/config/', {params})
|
||||
.then(res => this.records = res)
|
||||
.finally(() => this.isFetching = false)
|
||||
};
|
||||
|
||||
showForm = (info) => {
|
||||
this.formVisible = true;
|
||||
this.record = info || {};
|
||||
}
|
||||
}
|
||||
|
||||
export default new Store()
|
Loading…
Reference in New Issue