index.jsx 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. import React,{Component} from 'react';
  2. import style from './index.less';
  3. import {ItemBox,Notify,Textarea,TailInlineTag} from '@commonComp';
  4. import chooseType from '@containers/eleType.js';
  5. import SearchDrop from '@components/SearchDrop';
  6. import {filterDataArr,getPageCoordinate,windowEventHandler,isIE} from '@utils/tools'
  7. import $ from 'jquery';
  8. class CurrentIll extends Component{
  9. constructor(props){
  10. super(props);
  11. this.state = {
  12. boxEditable:true,
  13. forbidInput:false,
  14. boxLeft:0,
  15. boxTop:0,
  16. tmpScroll:0,
  17. tmpTop:0,
  18. setDataTimer:null
  19. }
  20. this.toggleEditable = this.toggleEditable.bind(this);
  21. this.handleFocus = this.handleFocus.bind(this);
  22. this.onchange = this.onchange.bind(this);
  23. this.handleSearchSelect = this.handleSearchSelect.bind(this);
  24. this.handleClick = this.handleClick.bind(this);
  25. this.handleBlur = this.handleBlur.bind(this);
  26. }
  27. componentWillReceiveProps(nextProps){
  28. this.setState({boxLeft:nextProps.boxLeft})
  29. }
  30. toggleEditable(){
  31. this.setState({
  32. boxEditable:!this.state.boxEditable
  33. })
  34. }
  35. handleFocus(e){
  36. // 判断主诉是否为空
  37. const {mainData,mainText,setData,moduleNum,mainIds,mainTailIds,data,changeEditIll,editClear,symptomFeature,isChronic} = this.props;
  38. const that = this;
  39. const ev = e || window.event;
  40. const text = ev.target.innerText || ev.target.innerHTML;
  41. let {setDataTimer} = this.state;
  42. let mainFinallyText = filterDataArr(mainText);
  43. if(!mainFinallyText){
  44. //弹窗提醒
  45. Notify.error("无法操作,请先输入主诉");
  46. this.setState({
  47. forbidInput:true
  48. })
  49. }else if(!text) {//现病史框里没有内容时才设置模板
  50. let num = moduleNum.num;//主诉使用了几个模板
  51. console.log(999,isChronic)
  52. if(data.length==0 && !isChronic){
  53. clearTimeout(setDataTimer);
  54. setDataTimer = setTimeout(function(){//延时,等待主诉失焦数据返回
  55. setData && setData({num,mainData,mainIds,symptomFeature:symptomFeature.featureData,isChronic,mainTailIds});
  56. },200)
  57. this.setState({
  58. setDataTimer
  59. })
  60. }
  61. this.setState({
  62. forbidInput:false,
  63. boxEditable:false,
  64. setDataTimer
  65. })
  66. changeEditIll(false)
  67. }
  68. }
  69. onchange(e){//监听输入事件,主诉无数据不能输入
  70. const ev = e || window.event;
  71. ev.target.innerText?(ev.target.innerText = ""):(ev.target.innerHTML="");
  72. }
  73. handleClick(e){//让搜索框跟随鼠标点击移动
  74. // e.stopPropagation(); //冒泡到最顶层关闭其他下拉
  75. //若使用e.target,因为是onClick事件中,值可能是itembox的而不是span因此会有bug
  76. const {getSearchLocation} = this.props;
  77. let leftL=0; //用焦点元素的左边距替换鼠标点击的左边距,高度还是鼠标点击的位置
  78. if(isIE()){
  79. leftL = getPageCoordinate(e).boxLeft
  80. }else{
  81. const ele = document.activeElement;
  82. if(ele.toString().indexOf('HTMLSpanElement') == -1){ //点击的不是span无法聚焦就不再设置位置
  83. return;
  84. }
  85. leftL = ele.offsetLeft+90
  86. }
  87. getSearchLocation(getPageCoordinate(e).boxTop,leftL)
  88. this.setState({
  89. tmpScroll: $("#addScrollEvent")[0].scrollTop,
  90. tmpTop:getPageCoordinate(e).boxTop
  91. });
  92. windowEventHandler('scroll',()=>{ //弹窗跟随滚动条滚动或者关闭弹窗
  93. let scrollYs = $("#addScrollEvent")[0].scrollTop;
  94. let boxTop = this.state.tmpTop - scrollYs + this.state.tmpScroll
  95. getSearchLocation(boxTop,this.state.boxLeft)
  96. },$("#addScrollEvent")[0])
  97. }
  98. handleSearchSelect(obj){
  99. const {questionId,name,conceptId} = obj;
  100. const {fetchModules,focusIndex,span} = this.props;
  101. fetchModules&&fetchModules({id:questionId,index:focusIndex,name,span,conceptId});
  102. }
  103. getInlineTag(){
  104. const {data,showArr,selecteds,saveText,insertProcess,symptomIds,allModules} = this.props;
  105. const boxMark = '2';
  106. let list = data&&data.map((item,i)=>{
  107. if(item.flag && item.flag==3){
  108. return <TailInlineTag {...item} showText={item.relationModuleName} handleTailClick={(obj)=>{insertProcess(obj,allModules)}}></TailInlineTag>
  109. }else {
  110. return chooseType({item,boxMark,i,hideTag:false,showArr,selecteds,saveText,mainIds:symptomIds});
  111. }
  112. })
  113. return list;
  114. }
  115. handleBlur(e){
  116. const {freeText,data} = this.props;
  117. if(data&&data.length==0){//无模板纯手动输入时存值
  118. const ev = e || window.event;
  119. const innerData = ev.target.innerText || e.target.innerHTML;
  120. if(!isIE()){
  121. e.target.innerText?(e.target.innerText=""):(e.target.innerHTML="")
  122. freeText && freeText(innerData.trim());
  123. }else{
  124. freeText && freeText(innerData);
  125. }
  126. }
  127. }
  128. render(){
  129. const {fuzhen,isChronic,type,fetchPushInfos,handleInput,isRead,saveText,searchData,totalHide,editClear,data,boxLeft,boxTop} = this.props;
  130. const {forbidInput} = this.state;
  131. const searchFlag = searchData.length > 0 ? true : false;
  132. if(+type===1){ //文本模式
  133. return <Textarea title='现病史' boxMark='2'
  134. isRead={isRead}
  135. value={saveText[0]}
  136. fuzhen={fuzhen}
  137. isChronic={isChronic}
  138. handlePush={fetchPushInfos}
  139. handleInput={handleInput}/>;
  140. }
  141. return <div className={style['current-ill']}>
  142. <ItemBox title='现病史'
  143. editable={editClear||data.length==0?true:false}
  144. handleFocus={this.handleFocus}
  145. onchange={forbidInput?this.onchange:''}
  146. handleClick={this.handleClick}
  147. handleBlur={this.handleBlur}>
  148. {data.length>0?this.getInlineTag():(saveText[0]?saveText[0]:'')}
  149. </ItemBox>
  150. {searchFlag ? <SearchDrop data={searchData} show={!totalHide} onSelect={this.handleSearchSelect} left={boxLeft} top={boxTop} />:""}
  151. </div>
  152. }
  153. }
  154. export default CurrentIll;