index.jsx 7.3 KB

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