dataConnectConfig.jsx 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. import React from 'react'
  2. import { Layout, Button, Table, Form, Row, Col, Input, InputNumber, Select, Icon, Menu, Dropdown, Divider, Upload, message, Card } from 'antd'
  3. const { Header, Content } = Layout
  4. const CardGrid = Card.Grid
  5. const FormItem = Form.Item
  6. const SelectOption = Select.Option
  7. const OptionGroup = Select.OptGroup
  8. const InputGroup = Input.Group
  9. const SubMenu = Menu.SubMenu
  10. const MenuItem = Menu.Item
  11. const MenuItemGroup = Menu.ItemGroup
  12. const UploadDragger = Upload.Dragger
  13. const Search = Input.Search
  14. import { connect } from 'dva'
  15. import DataConnectBox from './dataConnectBox'
  16. import '../../models/dataSource'
  17. import '../../models/dataConnect'
  18. class DataConnectConfig extends React.Component {
  19. constructor(props) {
  20. super(props);
  21. this.state = {
  22. visibleBox: false,
  23. operation: 'modify',
  24. selected: null
  25. };
  26. }
  27. render() {
  28. const { dataSource, dataConnect, dispatch } = this.props;
  29. const { visibleBox, operation, selected } = this.state;
  30. const formItemLayout = {
  31. labelCol: { span: 4 },
  32. wrapperCol: { span: 20 },
  33. };
  34. const generateCard = () => {
  35. const operationMenu = (
  36. <Menu className='menu-operation'>
  37. <Menu.Item onClick={() => {
  38. dispatch({ type: 'dataConnect/setNewModel', model: selected });
  39. this.setState({
  40. visibleBox: true,
  41. operation: 'modify'
  42. })
  43. }}>
  44. <Icon type='edit'/>编辑
  45. </Menu.Item>
  46. <Menu.Item onClick={(e) => {
  47. dispatch({ type: 'chart/remoteDelete', code: this.state.selectedCode });
  48. }}>
  49. <Icon type='delete'/>删除
  50. </Menu.Item>
  51. </Menu>
  52. )
  53. let cards = dataConnect.list.map( (l, i) => (
  54. <CardGrid className='dataconnect-card' key={i}>
  55. <Card
  56. title={
  57. <Row type='flex' justify='start'>
  58. <Col>{l.name}</Col>
  59. <div style={{ display: (selected && selected.code === l.code) ? 'block' : 'none' }} className='selected'></div>
  60. </Row>
  61. }
  62. onClick={() => {
  63. this.setState({ selected: l }, () => {
  64. let s = this.state.selected;
  65. console.log(s);
  66. dispatch({ type: 'dataSource/setNewModelFields', fields: [
  67. { name: 'dbType', value: s.dbType },
  68. { name: 'address', value: s.address },
  69. { name: 'port', value: s.port },
  70. { name: 'dbName', value: s.dbName },
  71. { name: 'userName', value: s.userName },
  72. { name: 'password', value: s.password },
  73. ] });
  74. });
  75. }}
  76. >
  77. <div>
  78. <Row>
  79. {`说明 :${l.description}`}
  80. </Row>
  81. <Row type='flex' justify='space-between'>
  82. <Col>{l.dbType}</Col>
  83. <Col>
  84. <Dropdown overlay={operationMenu} trigger={['click']}>
  85. <Icon type="ellipsis" />
  86. </Dropdown>
  87. </Col>
  88. </Row>
  89. </div>
  90. </Card>
  91. </CardGrid>
  92. ))
  93. cards.unshift(
  94. <CardGrid className='dataconnect-card dataconnect-card-create' key='create' onClick={() => {
  95. dispatch({ type: 'dataConnect/setNewModel', model: {} });
  96. this.setState({
  97. operation: 'create',
  98. visibleBox: true
  99. })
  100. }}>
  101. <Card>
  102. <Icon type="plus-circle-o" />
  103. </Card>
  104. </CardGrid>
  105. );
  106. return cards;
  107. }
  108. return (
  109. <Form className='form-base' size='small'>
  110. {
  111. dataSource.newOne.type=='file'?(
  112. <div>
  113. <Divider orientation="left">选择文件</Divider>
  114. <UploadDragger
  115. className='upload'
  116. name='file' // 上传到后台的文件名
  117. fileList={dataSource.newOne.fileList}
  118. accept='application/vnd.ms-excel,.csv' // 只支持excel和csv格式文件
  119. action='//jsonplaceholder.typicode.com/posts/'
  120. headers={{authorization: 'authorization-text'}}
  121. beforeUpload={(file, fileList) => {
  122. const trueType = file.type === 'application/vnd.ms-excel';
  123. if (!trueType) {
  124. message.error('选择文件格式错误!');
  125. }
  126. const trueSize = file.size / 1024 / 1024 < 30;
  127. if (!trueSize) {
  128. message.error('选择文件过大!');
  129. }
  130. return trueType && trueSize;
  131. }}
  132. onChange={(info) => {
  133. const file = info.file;
  134. let fileList = info.fileList;
  135. fileList = fileList.slice(-1); // 只保留最后一个
  136. if (info.file.status !== 'uploading') {
  137. console.log(file, info.fileList);
  138. const trueType = file.type === 'application/vnd.ms-excel';
  139. const trueSize = file.size / 1024 / 1024 < 30;
  140. if(!trueType || !trueSize) {
  141. fileList = [];
  142. }
  143. }
  144. if (file.status === 'done') {
  145. message.success(`${file.name} 文件上传成功`);
  146. } else if (file.status === 'error') {
  147. fileList = [];
  148. message.error(`${file.name} 文件上传失败.`);
  149. }
  150. dispatch({ type: 'dataSource/setNewModelField', name: 'fileList', value: fileList })
  151. }}
  152. >
  153. <p className="ant-upload-drag-icon">
  154. <Icon type="inbox" />
  155. </p>
  156. <p className="ant-upload-text">点击选择或拖动文件到该区域</p>
  157. <p className="ant-upload-hint">仅支持上传单个30MB以内EXCEL/CSV格式文件</p>
  158. </UploadDragger>
  159. </div>
  160. ):(
  161. <Layout className='dataconnect'>
  162. <Content>
  163. <Card title={
  164. <Row type='flex' justify='end'>
  165. <Search
  166. style={{ width: '200px' }}
  167. placeholder="请输入关键字"
  168. onSearch={value => console.log(value)}
  169. />
  170. </Row>
  171. }>
  172. <div className='dataconnect-list'>
  173. { generateCard() }
  174. </div>
  175. <DataConnectBox visibleBox={visibleBox} hideBox={() => {this.setState({visibleBox: false})}} operation={operation} />
  176. </Card>
  177. </Content>
  178. </Layout>
  179. )
  180. }
  181. </Form>
  182. );
  183. }
  184. }
  185. function mapStateToProps({ present: {dataSource, dataConnect} }) {
  186. return { dataSource, dataConnect }
  187. }
  188. export default connect(mapStateToProps)(DataConnectConfig);