index.jsx 7.4 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. * showAdd:是否显示加号(复制)
  18. * copyId:该标签id
  19. * fullData:该标签完整数据
  20. * showArr:是否显示下拉的总对象
  21. * ikey:当前组件唯一标识,由模块index+标签index+标签内index三个组成的字符串
  22. * boxMark:当前所在的模块
  23. * isImports:是否高亮(仅查体使用)
  24. * selecteds:选中项数据(仅多选子组件用)
  25. * saveText:该模块的预览数据
  26. * textPrefix:前缀
  27. * textSuffix:后缀
  28. *
  29. * ***/
  30. class MultSpread extends Component{
  31. constructor(props){
  32. super(props);
  33. this.state = {
  34. numDoms:[]
  35. };
  36. }
  37. getClass(){
  38. const {saveText,ikey,showAdd} = this.props;
  39. const labelInx = tools.getLabelIndex(ikey);
  40. const text = saveText&&saveText[+labelInx];
  41. //const orgBorder = isImports&&!text?style['orange-border']:'';
  42. const isSelected = text?style['selected']:style['container'];
  43. const hasAdd = showAdd?style['add']:'';
  44. return classNames(isSelected,hasAdd);
  45. }
  46. saveDoms(it){
  47. const doms = this.state.numDoms;
  48. doms.push(it);
  49. this.setState({
  50. numDoms:doms
  51. });
  52. }
  53. moveEnd(obj) {
  54. if(window.getSelection){//ie11 10 9 ff safari
  55. obj.focus(); //解决ff不获取焦点无法定位问题
  56. var range = window.getSelection();//创建range
  57. range.selectAllChildren(obj);//range 选择obj下所有子内容
  58. range.collapseToEnd();//光标移至最后
  59. }
  60. else if (document.selection) {//ie10 9 8 7 6 5
  61. var range = document.selection.createRange();//创建选择对象
  62. range.moveToElementText(obj);//range定位到obj
  63. range.collapse(false);//光标移至最后
  64. range.select();
  65. }
  66. }
  67. setNextFocus(i){
  68. const doms = this.state.numDoms;
  69. doms[i+1]&&this.moveEnd(doms[i+1].current)
  70. }
  71. getLabels(){
  72. const {data,ikey,showArr,copyId,selecteds,boxMark} = this.props;
  73. let show = false;
  74. let inx = '',count=0;
  75. const list = data.map((it,i)=>{
  76. inx=ikey+'-'+i;
  77. show = showArr&&showArr[inx];
  78. switch (true){
  79. case +it.tagType===8:
  80. return it.name;
  81. case +it.controlType===1:
  82. const list = it.questionDetailList&&it.questionDetailList.length>0?it.questionDetailList:it.questionMapping;
  83. return <RadioDrop data={list}
  84. boxMark={boxMark}
  85. placeholder={it.name}
  86. show={show}
  87. value = {it.value}
  88. ikey={inx}
  89. id={it.id}
  90. patId = {copyId}
  91. hideTag={true}></RadioDrop>;
  92. case +it.controlType===2:
  93. const dataList = it.questionDetailList&&it.questionDetailList.length>0?it.questionDetailList:it.questionMapping;
  94. return <Multiple data={dataList}
  95. ikey={inx}
  96. placeholder={it.name}
  97. value={it.value}
  98. copyType={it.copyType}
  99. selecteds={selecteds ?selecteds[i]:[]}
  100. show={showArr&&showArr[inx]}
  101. order={it.textGenerate}
  102. type={boxMark}
  103. id={it.id}
  104. hideTag={true}></Multiple>;
  105. case +it.controlType===5://带单位数字键盘
  106. return <NumberUnitDrop prefix={it.labelPrefix}
  107. suffix={it.labelSuffix}
  108. placeholder={it.name}
  109. boxMark={ikey.substr(0,1)}
  110. id={it.id}
  111. show={show}
  112. ikey={inx}
  113. value={it.value}
  114. hideTag={true}></NumberUnitDrop>;
  115. case +it.controlType===3:
  116. case +it.controlType===6:
  117. return <InlineTag prefix={it.labelPrefix}
  118. suffix={it.labelSuffix}
  119. placeholder={it.name}
  120. value={it.value}
  121. id={it.id}
  122. ikey={inx} hideTag={true}></InlineTag>;
  123. case +it.controlType===7:
  124. const min = it.minValue;//!=null&&it.minValue!=undefined?it.minValue-1:undefined;
  125. const max = it.maxValue;//!=null&&it.maxValue!=undefined?+it.maxValue+1:undefined;
  126. return <NumberDrop prefix={it.labelPrefix}
  127. suffix={it.labelSuffix}
  128. placeholder={it.name}
  129. //inputRef = {this['$inp'+(count++)]}
  130. saveDoms={this.saveDoms.bind(this)}
  131. reFocus={this.setNextFocus.bind(this)}
  132. num = {count++}
  133. min={min}
  134. max={max}
  135. show={show}
  136. allClick={false}
  137. ikey={inx}
  138. id={it.id}
  139. patId = {copyId}
  140. value={it.value}
  141. hideTag={true}></NumberDrop>;
  142. case +it.controlType===11:
  143. return <RadioInpDrop data={it.questionDetailList}
  144. vals={it.vals}
  145. placeholder={it.name}
  146. show={showArr&&showArr[inx]}
  147. value = {it.value}
  148. boxMark={boxMark}
  149. id={it.id}
  150. ikey={inx}
  151. hideTag={true}></RadioInpDrop>;
  152. default:
  153. return it.name;
  154. }
  155. });
  156. return list;
  157. }
  158. componentDidMount(){
  159. //挂载完成保存有加号的项目数据
  160. const {saveAddItem,fullData,copyId,showAdd} = this.props;
  161. if(showAdd){
  162. const data = tools.deepClone(fullData);
  163. setTimeout(function(){ //修改个别历史病例引用报错bug
  164. saveAddItem&&saveAddItem(copyId,data);
  165. })
  166. }
  167. }
  168. getContClass(){
  169. const {isImports,ikey,saveText} = this.props;
  170. const labelInx = tools.getLabelIndex(ikey);
  171. const text = saveText&&saveText[+labelInx];
  172. const orgBorder = isImports&&!text?style['orange-border']:'';
  173. return classNames(orgBorder);
  174. }
  175. render(){
  176. const {showAdd,addLabelItem,ikey,copyId,textPrefix,textSuffix} = this.props;
  177. return (<div className={this.getContClass()}
  178. style={{display:'inline-block'}}>
  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;