LinkageForm.tsx 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. import React from 'react'
  2. import { Form, Row, Col, Cascader, Select } from 'antd'
  3. import { FormComponentProps } from 'antd/lib/form/Form'
  4. const FormItem = Form.Item
  5. const Option = Select.Option
  6. import { DEFAULT_SPLITER } from 'app/globalConstants'
  7. import { LinkageOperatorTypes } from 'utils/operatorTypes'
  8. const styles = require('./Linkage.less')
  9. interface ILinkageFormProps {
  10. cascaderSource: any[]
  11. }
  12. export interface ILinkageForm {
  13. trigger: string
  14. linkager: string
  15. relation: string
  16. }
  17. export class LinkageForm extends React.PureComponent<ILinkageFormProps & FormComponentProps, {}> {
  18. private displayRenderHandles = {
  19. trigger: (labels) => labels.join(' - '),
  20. linkager: (labels) => labels.join(' - ')
  21. }
  22. // FIXME 解决循环联动问题
  23. private checkRepeatAndType = (rule, value, callback) => {
  24. const form = this.props.form
  25. const linkagerValue = form.getFieldValue('linkager')
  26. if (value && linkagerValue && value.length && linkagerValue.length) {
  27. const triggerValueArr = value[1].split(DEFAULT_SPLITER)
  28. const linkagerValueArr = linkagerValue[1].split(DEFAULT_SPLITER)
  29. const triggerSqlType = triggerValueArr[1]
  30. const linkagerSqlType = linkagerValueArr[1]
  31. const linkagerColumnType = linkagerValueArr[2]
  32. if (value[0] === linkagerValue[0]) {
  33. callback('不能联动自身')
  34. }
  35. if (linkagerColumnType !== 'variable') {
  36. if (triggerSqlType !== linkagerSqlType) {
  37. callback('字段类型不一致')
  38. } else {
  39. callback()
  40. }
  41. } else {
  42. callback()
  43. }
  44. } else {
  45. callback()
  46. }
  47. }
  48. private confirmCheck = (rule, value, callback) => {
  49. if (value) {
  50. this.props.form.validateFields(['trigger'], { force: true }, () => void 0)
  51. }
  52. callback()
  53. }
  54. public render () {
  55. const { form, cascaderSource } = this.props
  56. const { getFieldDecorator } = form
  57. const relations = LinkageOperatorTypes
  58. const relationOptions = relations.map((r) => (
  59. <Option key={r} value={r}>{r}</Option>
  60. ))
  61. const commonFormItemStyle = {
  62. labelCol: { span: 8 },
  63. wrapperCol: { span: 12 }
  64. }
  65. const triggerOptions = cascaderSource
  66. .map(({ label, value, children: { triggerColumns } }) =>
  67. ({ label, value, children: triggerColumns })
  68. )
  69. const linkagerOptions = cascaderSource
  70. .map(({ label, value, children: { linkagerColumns, variables } }) =>
  71. ({ label, value, children: [].concat(linkagerColumns, variables) })
  72. )
  73. return (
  74. <Form className={styles.linkageForm}>
  75. <Row gutter={8}>
  76. <Col md={24}>
  77. <FormItem
  78. label="触发器"
  79. className={styles.linkageFormItem}
  80. {...commonFormItemStyle}
  81. >
  82. {getFieldDecorator('trigger', {
  83. rules: [{
  84. required: true,
  85. message: '不能为空'
  86. }, {
  87. validator: this.checkRepeatAndType
  88. }]
  89. })(
  90. <Cascader
  91. placeholder="请选择"
  92. options={triggerOptions}
  93. expandTrigger="hover"
  94. displayRender={this.displayRenderHandles.trigger}
  95. />
  96. )}
  97. </FormItem>
  98. </Col>
  99. <Col md={24}>
  100. <FormItem
  101. label="联动图表"
  102. className={styles.linkageFormItem}
  103. {...commonFormItemStyle}
  104. >
  105. {getFieldDecorator('linkager', {
  106. rules: [{
  107. required: true,
  108. message: '不能为空'
  109. }, {
  110. validator: this.confirmCheck
  111. }]
  112. })(
  113. <Cascader
  114. placeholder="请选择"
  115. options={linkagerOptions}
  116. expandTrigger="hover"
  117. displayRender={this.displayRenderHandles.linkager}
  118. />
  119. )}
  120. </FormItem>
  121. </Col>
  122. <Col md={24}>
  123. <FormItem
  124. label="关系"
  125. className={styles.linkageFormItem}
  126. {...commonFormItemStyle}
  127. >
  128. {getFieldDecorator('relation', {
  129. initialValue: '='
  130. })(
  131. <Select>{relationOptions}</Select>
  132. )}
  133. </FormItem>
  134. </Col>
  135. </Row>
  136. </Form>
  137. )
  138. }
  139. }
  140. export default Form.create<ILinkageFormProps & FormComponentProps>()(LinkageForm)