mock平台

AddProject.js 6.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. import React, { PureComponent as Component } from 'react';
  2. import PropTypes from 'prop-types';
  3. import { connect } from 'react-redux';
  4. import { Button, Form, Input, Icon, Tooltip, Select, message, Row, Col, Radio } from 'antd';
  5. import { addProject } from '../../reducer/modules/project.js';
  6. import { fetchGroupList } from '../../reducer/modules/group.js';
  7. import { autobind } from 'core-decorators';
  8. import { setBreadcrumb } from '../../reducer/modules/user';
  9. const { TextArea } = Input;
  10. const FormItem = Form.Item;
  11. const Option = Select.Option;
  12. const RadioGroup = Radio.Group;
  13. import { pickRandomProperty, handlePath, nameLengthLimit } from '../../common';
  14. import constants from '../../constants/variable.js';
  15. import { withRouter } from 'react-router';
  16. import './Addproject.scss';
  17. const formItemLayout = {
  18. labelCol: {
  19. lg: { span: 3 },
  20. xs: { span: 24 },
  21. sm: { span: 6 }
  22. },
  23. wrapperCol: {
  24. lg: { span: 21 },
  25. xs: { span: 24 },
  26. sm: { span: 14 }
  27. },
  28. className: 'form-item'
  29. };
  30. @connect(
  31. state => {
  32. return {
  33. groupList: state.group.groupList,
  34. currGroup: state.group.currGroup
  35. };
  36. },
  37. {
  38. fetchGroupList,
  39. addProject,
  40. setBreadcrumb
  41. }
  42. )
  43. @withRouter
  44. class ProjectList extends Component {
  45. constructor(props) {
  46. super(props);
  47. this.state = {
  48. groupList: [],
  49. currGroupId: null
  50. };
  51. }
  52. static propTypes = {
  53. groupList: PropTypes.array,
  54. form: PropTypes.object,
  55. currGroup: PropTypes.object,
  56. addProject: PropTypes.func,
  57. history: PropTypes.object,
  58. setBreadcrumb: PropTypes.func,
  59. fetchGroupList: PropTypes.func
  60. };
  61. handlePath = e => {
  62. let val = e.target.value;
  63. this.props.form.setFieldsValue({
  64. basepath: handlePath(val)
  65. });
  66. };
  67. // 确认添加项目
  68. @autobind
  69. handleOk(e) {
  70. const { form, addProject } = this.props;
  71. e.preventDefault();
  72. form.validateFields((err, values) => {
  73. if (!err) {
  74. values.group_id = values.group;
  75. values.icon = constants.PROJECT_ICON[0];
  76. values.color = pickRandomProperty(constants.PROJECT_COLOR);
  77. addProject(values).then(res => {
  78. if (res.payload.data.errcode == 0) {
  79. form.resetFields();
  80. message.success('创建成功! ');
  81. this.props.history.push('/project/' + res.payload.data.data._id + '/interface/api');
  82. }
  83. });
  84. }
  85. });
  86. }
  87. async componentWillMount() {
  88. this.props.setBreadcrumb([{ name: '新建项目' }]);
  89. if (!this.props.currGroup._id) {
  90. await this.props.fetchGroupList();
  91. }
  92. if (this.props.groupList.length === 0) {
  93. return null;
  94. }
  95. this.setState({
  96. currGroupId: this.props.currGroup._id ? this.props.currGroup._id : this.props.groupList[0]._id
  97. });
  98. this.setState({ groupList: this.props.groupList });
  99. }
  100. render() {
  101. const { getFieldDecorator } = this.props.form;
  102. return (
  103. <div className="g-row">
  104. <div className="g-row m-container">
  105. <Form>
  106. <FormItem {...formItemLayout} label="项目名称">
  107. {getFieldDecorator('name', {
  108. rules: nameLengthLimit('项目')
  109. })(<Input />)}
  110. </FormItem>
  111. <FormItem {...formItemLayout} label="所属分组">
  112. {getFieldDecorator('group', {
  113. initialValue: this.state.currGroupId + '',
  114. rules: [
  115. {
  116. required: true,
  117. message: '请选择项目所属的分组!'
  118. }
  119. ]
  120. })(
  121. <Select>
  122. {this.state.groupList.map((item, index) => (
  123. <Option
  124. disabled={
  125. !(item.role === 'dev' || item.role === 'owner' || item.role === 'admin')
  126. }
  127. value={item._id.toString()}
  128. key={index}
  129. >
  130. {item.group_name}
  131. </Option>
  132. ))}
  133. </Select>
  134. )}
  135. </FormItem>
  136. <hr className="breakline" />
  137. <FormItem
  138. {...formItemLayout}
  139. label={
  140. <span>
  141. 基本路径&nbsp;
  142. <Tooltip title="接口基本路径,为空是根路径">
  143. <Icon type="question-circle-o" />
  144. </Tooltip>
  145. </span>
  146. }
  147. >
  148. {getFieldDecorator('basepath', {
  149. rules: [
  150. {
  151. required: false,
  152. message: '请输入项目基本路径'
  153. }
  154. ]
  155. })(<Input onBlur={this.handlePath} />)}
  156. </FormItem>
  157. <FormItem {...formItemLayout} label="描述">
  158. {getFieldDecorator('desc', {
  159. rules: [
  160. {
  161. required: false,
  162. message: '描述不超过144字!',
  163. max: 144
  164. }
  165. ]
  166. })(<TextArea rows={4} />)}
  167. </FormItem>
  168. <FormItem {...formItemLayout} label="权限">
  169. {getFieldDecorator('project_type', {
  170. rules: [
  171. {
  172. required: true
  173. }
  174. ],
  175. initialValue: 'private'
  176. })(
  177. <RadioGroup>
  178. <Radio value="private" className="radio">
  179. <Icon type="lock" />私有<br />
  180. <span className="radio-desc">只有组长和项目开发者可以索引并查看项目信息</span>
  181. </Radio>
  182. <br />
  183. {/* <Radio value="public" className="radio">
  184. <Icon type="unlock" />公开<br />
  185. <span className="radio-desc">任何人都可以索引并查看项目信息</span>
  186. </Radio> */}
  187. </RadioGroup>
  188. )}
  189. </FormItem>
  190. </Form>
  191. <Row>
  192. <Col sm={{ offset: 6 }} lg={{ offset: 3 }}>
  193. <Button className="m-btn" icon="plus" type="primary" onClick={this.handleOk}>
  194. 创建项目
  195. </Button>
  196. </Col>
  197. </Row>
  198. </div>
  199. </div>
  200. );
  201. }
  202. }
  203. export default Form.create()(ProjectList);