RadarSection.tsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import React from 'react'
  2. import { Row, Col, Select, Checkbox, InputNumber } from 'antd'
  3. const Option = Select.Option
  4. import { CheckboxChangeEvent } from 'antd/lib/checkbox'
  5. import ColorPicker from 'components/ColorPicker'
  6. import { IRadarConfig } from './'
  7. import { chartFontFamilyOptions, chartFontSizeOptions } from './constants'
  8. import styles from '../Workbench.less'
  9. interface IRadarSectionProps {
  10. config: IRadarConfig
  11. onChange: (
  12. value: string | number | boolean,
  13. propPath: string | string[]
  14. ) => void
  15. }
  16. const BasePropPath = ['radar']
  17. const change = (
  18. onChange: IRadarSectionProps['onChange'],
  19. propPath:
  20. | Exclude<keyof IRadarConfig, 'name'>
  21. | ['name', keyof IRadarConfig['name']]
  22. ) => (e: CheckboxChangeEvent | string | number) => {
  23. const value: string | number | boolean = (e as CheckboxChangeEvent).target
  24. ? (e as CheckboxChangeEvent).target.checked
  25. : (e as string | number)
  26. onChange(value, BasePropPath.concat(propPath as string | string[]))
  27. }
  28. function RadarSection (props: IRadarSectionProps) {
  29. const { config, onChange } = props
  30. const { shape, name, nameGap, splitNumber } = config
  31. const { show, fontFamily, fontSize, color } = name
  32. return (
  33. <div className={styles.paneBlock}>
  34. <div className={styles.blockBody}>
  35. <Row gutter={8} type="flex" align="middle" className={styles.blockRow}>
  36. <Col span={6}>形状</Col>
  37. <Col span={12}>
  38. <Select
  39. placeholder="形状"
  40. className={styles.blockElm}
  41. value={shape}
  42. onChange={change(onChange, 'shape')}
  43. >
  44. <Option key="polygon" value="polygon">
  45. 多边形
  46. </Option>
  47. <Option key="circle" value="circle">
  48. 圆形
  49. </Option>
  50. </Select>
  51. </Col>
  52. </Row>
  53. <Row gutter={8} type="flex" align="middle" className={styles.blockRow}>
  54. <Col span={6}>轴段数</Col>
  55. <Col span={12}>
  56. <InputNumber
  57. className={styles.blockElm}
  58. value={splitNumber}
  59. onChange={change(onChange, 'splitNumber')}
  60. />
  61. </Col>
  62. </Row>
  63. <Row gutter={8} type="flex" align="middle" className={styles.blockRow}>
  64. <Col span={12}>
  65. <Checkbox
  66. checked={show}
  67. onChange={change(onChange, ['name', 'show'])}
  68. >
  69. 显示外标签
  70. </Checkbox>
  71. </Col>
  72. {show && (
  73. <>
  74. <Col span={4}>距离</Col>
  75. <Col span={8}>
  76. <InputNumber
  77. className={styles.blockElm}
  78. value={nameGap}
  79. onChange={change(onChange, 'nameGap')}
  80. />
  81. </Col>
  82. </>
  83. )}
  84. </Row>
  85. {show && (
  86. <>
  87. <Row
  88. gutter={8}
  89. type="flex"
  90. align="middle"
  91. className={styles.blockRow}
  92. >
  93. <Col span={10}>
  94. <Select
  95. placeholder="字体"
  96. className={styles.blockElm}
  97. value={fontFamily}
  98. onChange={change(onChange, ['name', 'fontFamily'])}
  99. >
  100. {chartFontFamilyOptions}
  101. </Select>
  102. </Col>
  103. <Col span={10}>
  104. <Select
  105. placeholder="文字大小"
  106. className={styles.blockElm}
  107. value={fontSize}
  108. onChange={change(onChange, ['name', 'fontSize'])}
  109. >
  110. {chartFontSizeOptions}
  111. </Select>
  112. </Col>
  113. <Col span={4}>
  114. <ColorPicker
  115. value={color}
  116. onChange={change(onChange, ['name', 'color']) as (e: string) => void}
  117. />
  118. </Col>
  119. </Row>
  120. </>
  121. )}
  122. </div>
  123. </div>
  124. )
  125. }
  126. export default RadarSection