APIGroupCard.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. import React, {Component} from 'react';
  2. import {Input, Collapse, Button, Radio, Icon, Tooltip} from 'antd';
  3. import {ADD_APIGROUP, UPDATE_APIGROUP} from "../../../../gql";
  4. import {request} from 'graphql-request'
  5. import {idGen} from "../../../../func";
  6. import {graphqlUrl} from "../../../../config";
  7. import {manageUsers} from "../../../../config";
  8. import {FormattedMessage} from 'react-intl';
  9. const Panel = Collapse.Panel;
  10. // 如需改变显示,请在此处 value 处更改
  11. // 如需添加中文,请在此处 value 处添加
  12. // eg: 'xxxx': <F.. id='xxx'/>
  13. const valueToKey = {
  14. 'groupName': 'groupName',
  15. 'environmentName': 'environmentName',
  16. 'defaultDomain': 'defaultDomain',
  17. 'frontType': 'frontType',
  18. 'userDomain': 'userDomain',
  19. 'userStatus': 'userStatus',
  20. 'region': 'region',
  21. };
  22. const toolTipTitle = {
  23. 'groupName': 'its groupName',
  24. 'environmentName': 'its environmentName',
  25. 'defaultDomain': 'its defaultDomain',
  26. 'frontType': 'its frontType',
  27. 'userDomain': 'its userDomain',
  28. 'userStatus': 'its userStatus',
  29. 'region': 'its region',
  30. };
  31. const youMustFill = {
  32. 'groupName': true,
  33. 'environmentName': true,
  34. 'defaultDomain': true,
  35. 'frontType': true,
  36. 'userDomain': true,
  37. 'userStatus': true,
  38. 'region': true,
  39. };
  40. const removePrefix = (prefix, value) => {
  41. let r = new RegExp(prefix);
  42. return value.replace(r, '');
  43. };
  44. const shiftPrefix = (prefix, value) => {
  45. value = removePrefix(prefix, value);
  46. return prefix + value;
  47. };
  48. class APIGroupCard extends Component {
  49. constructor(props) {
  50. super(props);
  51. if(props.group !== '' && props.group !== null) {
  52. let {groupName, environmentName, defaultDomain, frontType, userDomain, userStatus, region} = props.group;
  53. this.state = {
  54. showOK: false,
  55. groupName,
  56. environmentName,
  57. defaultDomain,
  58. frontType,
  59. userDomain,
  60. userStatus,
  61. groupRegion: region
  62. }
  63. } else {
  64. this.state = {
  65. showOK: false,
  66. groupName: 'graphql_endpoint',
  67. environmentName: 'test',
  68. defaultDomain: '',
  69. frontType: 'http&https',
  70. userDomain: '',
  71. userStatus: 'open',
  72. groupRegion: props.region === '' ? 'ap-beijing' : props.region,
  73. };
  74. }
  75. }
  76. componentWillReceiveProps(next) {
  77. if(next.group !== '' && next.group !== null) {
  78. let {groupName, environmentName, defaultDomain, frontType, userDomain, userStatus, region} = next.group;
  79. this.setState( {
  80. groupName,
  81. environmentName,
  82. defaultDomain,
  83. frontType,
  84. userDomain,
  85. userStatus,
  86. groupRegion: next.region === '' ? region: next.region
  87. })
  88. } else {
  89. this.setState ( {
  90. groupName: 'graphql_endpoint',
  91. environmentName: 'test',
  92. defaultDomain: '',
  93. frontType: 'http&https',
  94. userDomain: '',
  95. userStatus: 'open',
  96. groupRegion: next.region === '' ? 'ap-beijing' : next.region
  97. });
  98. }
  99. };
  100. switchConfig = (label) => {
  101. return (e) => {
  102. this.setState({
  103. [label]: e.target.value
  104. })
  105. };
  106. };
  107. ok = (id) => {
  108. let {userStatus, userDomain, groupName, groupRegion, frontType, environmentName} = this.state;
  109. let region = shiftPrefix('ap-', groupRegion);
  110. let varObj = {
  111. id,
  112. cloud_id: this.props.cloudID,
  113. user_id: this.props.userID,
  114. userStatus,
  115. userDomain,
  116. groupName,
  117. frontType,
  118. region,
  119. environmentName,
  120. defaultDomain: '',
  121. status: '',
  122. serviceId: '',
  123. createdAt: new Date().getTime(),
  124. updatedAt: ''
  125. };
  126. if (this.props.group === '') {
  127. request(graphqlUrl, ADD_APIGROUP, varObj).then(
  128. data => {
  129. if (data.create_apiGWGroup !== null) {
  130. this.setState({
  131. showOK: true
  132. })
  133. }
  134. setTimeout(()=>{
  135. this.setState({
  136. showOK: false
  137. })
  138. }, 1500)
  139. }
  140. )
  141. } else {
  142. let {userStatus, userDomain, groupName, groupRegion, frontType, environmentName} = this.state;
  143. let region = shiftPrefix('ap-', groupRegion);
  144. let varObj = {
  145. id: this.props.group.id,
  146. userStatus,
  147. userDomain,
  148. groupName,
  149. frontType,
  150. region,
  151. environmentName,
  152. updatedAt: new Date().getTime()
  153. };
  154. request(graphqlUrl, UPDATE_APIGROUP, varObj).then(
  155. data => {
  156. if (data.update_apiGWGroup !== null) {
  157. this.setState({
  158. showOK: true
  159. })
  160. }
  161. setTimeout(()=>{
  162. this.setState({
  163. showOK: false
  164. })
  165. }, 1500)
  166. }
  167. )
  168. }
  169. };
  170. render() {
  171. const customPanelStyle = {
  172. background: '#f7f7f7',
  173. borderRadius: 4,
  174. marginBottom: 24,
  175. border: 0,
  176. overflow: 'hidden',
  177. };
  178. return (
  179. <div>
  180. <div style={{marginBottom: 10}}>
  181. <span className='vice-title'><FormattedMessage id={valueToKey['groupName']}/>
  182. &nbsp;
  183. <Tooltip placement="top" title={toolTipTitle['groupName']}>
  184. <Icon type="question-circle"/>
  185. </Tooltip>
  186. </span>
  187. <Input value={this.state.groupName} style={{width: 400}}
  188. onChange={this.switchConfig('groupName')}/>
  189. </div>
  190. <div style={{marginBottom: 10}}>
  191. <span className='vice-title'><FormattedMessage id={valueToKey['region']}/>
  192. &nbsp;
  193. <Tooltip placement="top" title={toolTipTitle['region']}>
  194. <Icon type="question-circle"/>
  195. </Tooltip>
  196. </span>
  197. <Radio.Group onChange={(e)=>{
  198. // 如果不想一变所有都变,就将 onchange 改成
  199. // onChange={this.switchConfig('groupRegion')}
  200. this.props.switchRegion(e);
  201. }} value={removePrefix('ap-', this.state.groupRegion)} buttonStyle="solid">
  202. <Radio.Button value="guangzhou"><FormattedMessage id="Guangzhou"/></Radio.Button>
  203. <Radio.Button value="shanghai"><FormattedMessage id="Shanghai"/></Radio.Button>
  204. <Radio.Button value="beijing"><FormattedMessage id="Beijing"/></Radio.Button>
  205. <Radio.Button value="chengdu"><FormattedMessage id="Chengdu"/></Radio.Button>
  206. </Radio.Group>
  207. </div>
  208. <div style={{marginBottom: 10}}>
  209. <span className='vice-title'><FormattedMessage id={valueToKey['environmentName']}/>
  210. &nbsp;
  211. <Tooltip placement="top" title={toolTipTitle['environmentName']}>
  212. <Icon type="question-circle"/>
  213. </Tooltip>
  214. </span>
  215. <Radio.Group onChange={this.switchConfig('environmentName')} defaultValue={this.state.environmentName}
  216. buttonStyle="solid">
  217. <Radio.Button value="test"><FormattedMessage id="test"/></Radio.Button>
  218. <Radio.Button value="prepub"><FormattedMessage id="prepub"/></Radio.Button>
  219. <Radio.Button value="release"><FormattedMessage id="release"/></Radio.Button>
  220. </Radio.Group>
  221. </div>
  222. <Collapse bordered={false}>
  223. <Panel header=<FormattedMessage id="Want more options?"/> style={customPanelStyle}>
  224. <div style={{marginBottom: 10}}>
  225. <span className='vice-title'><FormattedMessage id={valueToKey['frontType']}/>
  226. &nbsp;
  227. <Tooltip placement="top" title={toolTipTitle['frontType']}>
  228. <Icon type="question-circle"/>
  229. </Tooltip>
  230. </span>
  231. <Radio.Group onChange={this.switchConfig('frontType')} defaultValue={this.state.frontType}
  232. buttonStyle="solid">
  233. <Radio.Button value="http">http</Radio.Button>
  234. <Radio.Button value="https">https</Radio.Button>
  235. <Radio.Button value="http&https">http&https</Radio.Button>
  236. </Radio.Group>
  237. </div>
  238. {/*<div style={{marginBottom: 10}}>*/}
  239. {/*<span className='vice-title'>{valueToKey['defaultDomain']}*/}
  240. {/*&nbsp;*/}
  241. {/*<Tooltip placement="top" title={toolTipTitle['defaultDomain']}>*/}
  242. {/*<Icon type="question-circle"/>*/}
  243. {/*</Tooltip>*/}
  244. {/*</span>*/}
  245. {/*<Input value={this.state.defaultDomain} style={{width: 400}} disabled/>*/}
  246. {/*</div>*/}
  247. <div style={{marginBottom: 10}}>
  248. <span className='vice-title'><FormattedMessage id={valueToKey['userDomain']}/>
  249. &nbsp;
  250. <Tooltip placement="top" title={toolTipTitle['userDomain']}>
  251. <Icon type="question-circle"/>
  252. </Tooltip>
  253. </span>
  254. <Input value={this.state.userDomain} style={{width: 400}}
  255. onChange={this.switchConfig('userDomain')}/>
  256. </div>
  257. {/*<div style={{marginBottom: 10}}>*/}
  258. {/*<span className='vice-title'>{valueToKey['userStatus']}*/}
  259. {/*&nbsp;*/}
  260. {/*<Tooltip placement="top" title={toolTipTitle['userStatus']}>*/}
  261. {/*<Icon type="question-circle"/>*/}
  262. {/*</Tooltip>*/}
  263. {/*</span>*/}
  264. {/*<Radio.Group onChange={this.switchConfig('userStatus')} defaultValue={this.state.userStatus}*/}
  265. {/*buttonStyle="solid">*/}
  266. {/*<Radio.Button value="open">open</Radio.Button>*/}
  267. {/*<Radio.Button value="close">close</Radio.Button>*/}
  268. {/*</Radio.Group>*/}
  269. {/*</div>*/}
  270. </Panel>
  271. </Collapse>
  272. {
  273. manageUsers.includes(this.props.userID)?
  274. <div>
  275. <Button onClick={()=>{
  276. const id = idGen('group');
  277. this.ok(id);
  278. this.props.pass(id, 'group');
  279. }} type='primary'><FormattedMessage id="save"/></Button>
  280. {
  281. this.state.showOK === true?
  282. <Icon type="check-circle" theme="twoTone" twoToneColor="#52c41a"/>
  283. :
  284. ''
  285. }
  286. </div>
  287. :
  288. this.props.trialcase?
  289. ''
  290. :
  291. <div>
  292. <Button onClick={()=>{
  293. const id = idGen('group');
  294. this.ok(id);
  295. this.props.pass(id, 'group');
  296. }} type='primary'><FormattedMessage id="save"/></Button>
  297. {
  298. this.state.showOK === true?
  299. <Icon type="check-circle" theme="twoTone" twoToneColor="#52c41a"/>
  300. :
  301. ''
  302. }
  303. </div>
  304. }
  305. </div>
  306. )
  307. }
  308. }
  309. export default APIGroupCard;