index.jsx 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import React,{Component} from 'react';
  2. import classNames from 'classnames';
  3. import RadioDrop from "@containers/RadioDrop";
  4. import NumberDrop from "@containers/NumberDrop";
  5. import InlineTag from '@containers/InlineTag';
  6. import addIcon from '@images/addItem.png';
  7. import style from "./index.less";
  8. import tools from '@utils/tools';
  9. import NumberUnitDrop from '@containers/NumberUnitDrop';
  10. /****
  11. * 多标签组合
  12. * author:zn@2018-11.26
  13. * 接收参数:
  14. * data:标签内容数据
  15. * showArr:显示下拉总对象
  16. * ikey:当前组件唯一标识,由模块index+标签index+标签内index三个组成的字符串
  17. *
  18. *
  19. *
  20. * ***/
  21. class MultSpread extends Component{
  22. constructor(props){
  23. super(props);
  24. this.state = {
  25. editable: false,
  26. };
  27. this.$cont = React.createRef();
  28. this.changeToEdit = this.changeToEdit.bind(this);
  29. this.handleEdit = this.handleEdit.bind(this);
  30. }
  31. getClass(){
  32. const {saveText,ikey,showAdd} = this.props;
  33. const labelInx = ikey.substr(1);
  34. const text = saveText&&saveText[+labelInx];
  35. const isSelected = text?style['selected']:style['container'];
  36. const hasAdd = showAdd?style['add']:'';
  37. return classNames(isSelected,hasAdd);
  38. }
  39. getLabels(){
  40. const {data,ikey,showArr,copyId} = this.props;
  41. const {editable}= this.state;
  42. let show = false;
  43. let inx = '';
  44. const list = data.map((it,i)=>{
  45. inx=ikey+''+i;
  46. show = editable?false:showArr&&showArr[inx];
  47. switch (+it.controlType){
  48. case 0:
  49. case 1:
  50. const list = it.questionDetailList&&it.questionDetailList.length>0?it.questionDetailList:it.questionMapping;
  51. return <RadioDrop data={list}
  52. prefix={it.labelPrefix}
  53. suffix={it.labelSuffix}
  54. placeholder={it.name}
  55. show={show}
  56. value = {it.value}
  57. ikey={inx}
  58. id={it.id}
  59. patId = {copyId}
  60. hideTag={true}></RadioDrop>;
  61. case 5://带单位数字键盘
  62. return <NumberUnitDrop prefix={it.labelPrefix}
  63. suffix={it.labelSuffix}
  64. placeholder={it.name}
  65. boxMark={ikey.substr(0,1)}
  66. id={it.id}
  67. show={show}
  68. ikey={inx}
  69. value={it.value}
  70. hideTag={true}></NumberUnitDrop>;
  71. case 3:
  72. case 6:
  73. return <InlineTag prefix={it.labelPrefix}
  74. suffix={it.labelSuffix}
  75. placeholder={it.name}
  76. value={it.value}
  77. id={it.id}
  78. ikey={inx} hideTag={true}></InlineTag>;
  79. case 7:
  80. return <NumberDrop prefix={it.labelPrefix}
  81. suffix={it.labelSuffix}
  82. placeholder={it.name}
  83. show={show}
  84. ikey={inx}
  85. id={it.id}
  86. patId = {copyId}
  87. value={it.value}
  88. hideTag={true}></NumberDrop>;
  89. default:
  90. return '';
  91. }
  92. });
  93. return list;
  94. }
  95. changeToEdit(e){
  96. const {name,copyId,ikey,placeholder,handleDbclick,saveText,prefix,suffix} = this.props;
  97. const labelInx = ikey.substr(1);
  98. const text = saveText&&saveText[+labelInx];
  99. //clearTimeout(this.state.timer);//取消延时的单击事件
  100. e.preventDefault();
  101. if(text&&text.trim()) {//有选中值的标签才能双击编辑
  102. this.setState({
  103. editable: true
  104. });
  105. //失焦关闭编辑状态
  106. setTimeout(()=>{
  107. this.$cont.current.focus();
  108. });
  109. //双击埋点记录
  110. handleDbclick && handleDbclick({id:copyId});
  111. }
  112. }
  113. handleEdit(e){
  114. const {saveEditText,ikey} = this.props;
  115. if(!this.state.editable) return;
  116. this.setState({
  117. editable: false
  118. });
  119. let totalVal = e.target.innerText;
  120. saveEditText && saveEditText({ikey,type:'4',totalVal});
  121. }
  122. componentDidMount(){
  123. //挂载完成保存有加号的项目数据
  124. const {saveAddItem,fullData,copyId,showAdd} = this.props;
  125. if(showAdd){
  126. const data = tools.deepClone(fullData);
  127. saveAddItem&&saveAddItem(copyId,data);
  128. }
  129. }
  130. getContClass(){
  131. const {editable} = this.state;
  132. const edit = editable?style['blue-border']:'';
  133. return classNames(edit);
  134. }
  135. render(){
  136. const {showAdd,addLabelItem,ikey,copyId,textPrefix,textSuffix} = this.props;
  137. return (<div className={this.getContClass()}
  138. style={{display:'inline-block'}}
  139. onDoubleClick={this.changeToEdit}
  140. ref = {this.$cont}
  141. contentEditable={this.state.editable}
  142. onBlur={this.handleEdit}
  143. onkeydown={tools.handleEnter}>
  144. {textPrefix?<span>{textPrefix}</span>:''}
  145. <div className={this.getClass()}>
  146. {this.getLabels()}
  147. {textSuffix?<span>{textSuffix}</span>:''}
  148. {showAdd?<img src={addIcon} alt="添加血压项"
  149. className={style['add-icon']}
  150. onClick={()=>addLabelItem({ikey,copyId})}/>:''}
  151. </div>
  152. </div>)
  153. }
  154. }
  155. export default MultSpread;