FormInput.jsx 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. /**
  2. * Created by RaoMeng on 2020/2/19
  3. * Desc: 通用表单输入框类型
  4. */
  5. import React, { Component } from 'react'
  6. import './formCommon.css'
  7. import ApprovalBean from '../../model/ApprovalBean'
  8. import BillModel from '../../model/BillModel'
  9. import { TextareaItem, InputItem, DatePicker, List, Modal } from 'antd-mobile'
  10. import { isObjEmpty } from '../../utils/common'
  11. import moment from 'moment'
  12. export default class FormInput extends Component {
  13. constructor () {
  14. super()
  15. this.state = {
  16. billModel: new BillModel(),
  17. modalOpen: false,
  18. modalList: [],
  19. }
  20. }
  21. componentDidMount () {
  22. let { billModel } = this.props
  23. this.setState({
  24. billModel: billModel,
  25. modalVisible: false,
  26. })
  27. }
  28. componentWillReceiveProps () {
  29. this.componentDidMount()
  30. }
  31. componentWillUnmount () {
  32. }
  33. render () {
  34. const { billModel, modalOpen, modalList } = this.state
  35. let valueItem
  36. let type = billModel.type
  37. if (type === 'N') {
  38. valueItem =
  39. <InputItem className='form-input-value' clear
  40. placeholder={this.isSelect(billModel)
  41. ? '请选择'
  42. : ((billModel.readOnly === 'T' ||
  43. billModel.editable === 'F')
  44. ? ''
  45. : '请输入')}
  46. editable={(billModel.readOnly === 'T' ||
  47. billModel.editable === 'F') ? false : (this.isSelect(
  48. billModel)
  49. ? false
  50. : true)}
  51. // extra={(billModel.readOnly === 'T' &&
  52. // billModel.editable === 'F' && this.isSelect(billModel))
  53. // ? '>'
  54. // : ''}
  55. onChange={this.onTextChange}
  56. onClick={this.onInputClick}
  57. type={'number'}
  58. value={billModel.getValue()}
  59. />
  60. } else if (type === 'DT' || type === 'D' || type === 'T') {
  61. valueItem = <DatePicker
  62. style={{ width: '100%' }}
  63. locale={{
  64. okText: '确定',
  65. dismissText: '取消',
  66. }}
  67. mode={type === 'DT' ? 'datetime' : 'date'}
  68. extra={(billModel.readOnly === 'T' ||
  69. billModel.editable === 'F') ? '' : type === 'DT' ? '选择时间' : '选择日期'}
  70. disabled={(billModel.readOnly === 'T' ||
  71. billModel.editable === 'F') ? true : false}
  72. value={!isObjEmpty(billModel.getValue())
  73. ? new Date(billModel.getValue())
  74. : ''}
  75. onChange={this.onDateChange}
  76. >
  77. <DatePickerCustom>
  78. <div className='form-input-caption'>{billModel.caption}</div>
  79. <div className={billModel.allowBlank == 'F'
  80. ? 'form-input-fill'
  81. : 'visibleHidden'}>*
  82. </div>
  83. <div style={{ flex: 1 }}></div>
  84. </DatePickerCustom>
  85. </DatePicker>
  86. } else {
  87. valueItem = <TextareaItem className='form-input-value' autoHeight
  88. placeholder={this.isSelect(billModel)
  89. ? '请选择'
  90. : ((billModel.readOnly === 'T' ||
  91. billModel.editable === 'F')
  92. ? ''
  93. : '请输入')}
  94. clear={true}
  95. editable={(billModel.readOnly === 'T' ||
  96. billModel.editable === 'F')
  97. ? false
  98. : (this.isSelect(billModel)
  99. ? false
  100. : true)}
  101. disabled={false}
  102. // extra={(billModel.readOnly === 'T' &&
  103. // billModel.editable === 'F' && this.isSelect(billModel))
  104. // ? '>'
  105. // : ''}
  106. onChange={this.onTextChange}
  107. onClick={this.onInputClick}
  108. value={billModel.getValue()}
  109. />
  110. }
  111. return (
  112. (type === 'DT' || type === 'D' || type === 'T') ? <div>
  113. {valueItem}
  114. </div> : <div className='form-common-layout'
  115. style={{ minHeight: '32px' }}>
  116. <div className='form-input-caption'>{billModel.caption}</div>
  117. <div className={billModel.allowBlank == 'F'
  118. ? 'form-input-fill'
  119. : 'visibleHidden'}>*
  120. </div>
  121. {valueItem}
  122. {this.isSelect(billModel) &&
  123. <Modal visible={modalOpen}
  124. animationType={'slide-up'}
  125. onClose={() => {
  126. this.setState({
  127. modalOpen: false,
  128. })
  129. }}
  130. title={billModel.caption}
  131. popup
  132. >
  133. <List className='form-common-modal-root'>
  134. {modalList && (
  135. modalList.map((modalObj, index) => (
  136. <List.Item key={index}
  137. onClick={this.onModalSelect.bind(this,
  138. index)}>{modalObj.display}</List.Item>
  139. ))
  140. )}
  141. </List>
  142. </Modal>}
  143. </div>
  144. )
  145. }
  146. onTextChange = value => {
  147. const { billModel } = this.state
  148. billModel.value = value
  149. this.setState({
  150. billModel,
  151. }, () => {
  152. this.props.onTextChange &&
  153. this.props.onTextChange(this.props.groupIndex, this.props.childIndex,
  154. value)
  155. })
  156. }
  157. onInputClick = e => {
  158. // if (this.props.onInputClick) {
  159. // this.props.onInputClick(this.props.groupIndex, this.props.childIndex)
  160. // }
  161. const { billModel } = this.state
  162. if (!isObjEmpty(billModel.localDatas)) {
  163. console.log('modaldata', billModel.localDatas)
  164. this.setState({
  165. modalList: billModel.localDatas,
  166. modalOpen: true,
  167. })
  168. }
  169. }
  170. onModalSelect = index => {
  171. const { modalList } = this.state
  172. if (!isObjEmpty(modalList) && modalList[index] && this.props.onTextChange) {
  173. this.props.onTextChange(this.props.groupIndex, this.props.childIndex,
  174. modalList[index].display, modalList[index].value)
  175. }
  176. this.setState({
  177. modalList: [],
  178. modalOpen: false,
  179. })
  180. }
  181. onDateChange = date => {
  182. const { billModel } = this.state
  183. let dateStr = moment(date).
  184. format((billModel.type === 'D' || billModel.type === 'T')
  185. ? 'YYYY-MM-DD 00:00:00'
  186. : 'YYYY-MM-DD HH:mm:ss')
  187. console.log('date', dateStr)
  188. billModel.value = dateStr
  189. this.setState({
  190. billModel,
  191. }, () => {
  192. this.props.onTextChange &&
  193. this.props.onTextChange(this.props.groupIndex, this.props.childIndex,
  194. dateStr)
  195. })
  196. }
  197. isSelect = (billModel) => {
  198. if (!isObjEmpty(billModel.localDatas)) {
  199. return true
  200. }
  201. let dfType = billModel.type
  202. if (isObjEmpty(dfType)) {
  203. return false
  204. }
  205. switch (dfType) {
  206. case 'C':
  207. case 'D':
  208. case 'DT':
  209. case 'MF':
  210. case 'SF':
  211. case 'DF':
  212. return false
  213. // return true
  214. }
  215. return false
  216. }
  217. }
  218. const DatePickerCustom = ({ extra, onClick, children }) => (
  219. <div
  220. onClick={onClick}
  221. className='form-common-layout'
  222. >
  223. {children}
  224. <span style={{
  225. float: 'right',
  226. color: '#888',
  227. height: '32px',
  228. lineHeight: '32px',
  229. paddingRight: '12px',
  230. }}>{extra}</span>
  231. </div>
  232. )