index.jsx 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  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. setDataTimer:null
  17. }
  18. this.toggleEditable = this.toggleEditable.bind(this);
  19. this.handleFocus = this.handleFocus.bind(this);
  20. this.onchange = this.onchange.bind(this);
  21. this.handleSearchSelect = this.handleSearchSelect.bind(this);
  22. this.handleClick = this.handleClick.bind(this);
  23. this.handleBlur = this.handleBlur.bind(this);
  24. }
  25. toggleEditable(){
  26. this.setState({
  27. boxEditable:!this.state.boxEditable
  28. })
  29. }
  30. handleFocus(e){
  31. // 判断主诉是否为空
  32. const {mainData,mainText,setData,moduleNum,mainIds,mainTailIds,data,changeEditIll,editClear,symptomFeature,isChronic} = this.props;
  33. const that = this;
  34. const ev = e || window.event;
  35. const text = ev.target.innerText || ev.target.innerHTML;
  36. let {setDataTimer} = this.state;
  37. let mainFinallyText = filterDataArr(mainText);
  38. if(!mainFinallyText && !text){
  39. //弹窗提醒
  40. Notify.error("无法操作,请先输入主诉");
  41. this.setState({
  42. forbidInput:true
  43. })
  44. }else if(!text || (isIE() && text=='<br>')) {//现病史框里没有内容时才设置模板
  45. let num = moduleNum.num;//主诉使用了几个模板
  46. if(data.length==0 && !isChronic){
  47. clearTimeout(setDataTimer);
  48. setDataTimer = setTimeout(function(){//延时,等待主诉失焦数据返回
  49. setData && setData({num,mainData,mainIds,symptomFeature:symptomFeature.featureData,isChronic,mainTailIds});
  50. },200)
  51. this.setState({
  52. setDataTimer
  53. })
  54. }
  55. this.setState({
  56. forbidInput:false,
  57. boxEditable:false,
  58. setDataTimer
  59. })
  60. changeEditIll(false)
  61. }
  62. }
  63. onchange(e){//监听输入事件,主诉无数据不能输入
  64. const ev = e || window.event;
  65. ev.target.innerText?(ev.target.innerText = ""):(ev.target.innerHTML="");
  66. }
  67. handleClick(e){
  68. //搜索框位置
  69. const ele = document.activeElement;
  70. const height = ele.offsetHeight;
  71. let boxTop = (+(ele.offsetTop)+height);
  72. let boxLeft = ele.offsetLeft;
  73. this.setState({
  74. boxLeft:boxLeft,
  75. boxTop:boxTop
  76. });
  77. }
  78. handleSearchSelect(obj){
  79. const {questionId,name,conceptId} = obj;
  80. const {fetchModules,focusIndex,span} = this.props;
  81. fetchModules&&fetchModules({id:questionId,index:focusIndex,name,span,conceptId});
  82. }
  83. getInlineTag(){
  84. const {data,showArr,saveText,insertProcess,symptomIds,allModules} = this.props;
  85. const boxMark = '2';
  86. let list = data&&data.map((item,i)=>{
  87. if(item.flag && item.flag==3){
  88. return <TailInlineTag {...item} showText={item.relationModuleName} handleTailClick={(obj)=>{insertProcess(obj,allModules)}}></TailInlineTag>
  89. }else {
  90. return chooseType({item,boxMark,i,hideTag:false,showArr,saveText,mainIds:symptomIds});
  91. }
  92. })
  93. return list;
  94. }
  95. handleBlur(e){
  96. const {freeText,data} = this.props;
  97. if(data&&data.length==0){//无模板纯手动输入时存值
  98. const ev = e || window.event;
  99. const innerData = ev.target.innerText || e.target.innerHTML;
  100. if(!isIE()){
  101. e.target.innerText?(e.target.innerText=""):(e.target.innerHTML="")
  102. freeText && freeText(innerData.trim());
  103. }else{
  104. freeText && freeText(innerData);
  105. }
  106. }
  107. }
  108. //componentWillReceiveProps(nextProps){
  109. /*const contHeightDiff = nextProps.data&&this.props.data&&nextProps.data.length!==this.props.data.length;
  110. const dataDiff = !!nextProps.data!==!!this.props.data;
  111. if(contHeightDiff||dataDiff){*/ //走慢病否,现病史消失滚动才出现bug修改
  112. /* if(this.props.data&&this.props.data.length>0){
  113. return ;
  114. }
  115. this.context.scrollArea.refresh();*/
  116. //}
  117. //}
  118. render(){
  119. const {hasMain,readMode,fuzhen,isChronic,type,fetchPushInfos,handleInput,isRead,saveText,searchData,totalHide,editClear,data} = this.props;
  120. const {forbidInput,boxLeft,boxTop} = this.state;
  121. const searchFlag = searchData.length > 0 ? true : false;
  122. const mode = readMode===null||readMode===-1?type:readMode;
  123. if(+mode===1){ //文本模式
  124. return <Textarea title='现病史' boxMark='2'
  125. isRead={isRead}
  126. value={saveText[0]}
  127. fuzhen={fuzhen}
  128. hasMain={hasMain}
  129. isChronic={isChronic}
  130. handlePush={fetchPushInfos}
  131. handleInput={handleInput}/>;
  132. }
  133. return <div className={style['current-ill']}>
  134. <ItemBox title='现病史'
  135. editable={editClear||data.length==0?true:false}
  136. handleFocus={this.handleFocus}
  137. handleChange={forbidInput?this.onchange:''}
  138. handleClick={this.handleClick}
  139. handleBlur={this.handleBlur}>
  140. {data.length>0?this.getInlineTag():(saveText[0]?saveText[0]:'')}
  141. </ItemBox>
  142. {searchFlag ? <SearchDrop data={searchData} show={!totalHide} onSelect={this.handleSearchSelect} left={boxLeft} top={boxTop} />:""}
  143. </div>
  144. }
  145. }
  146. /*CurrentIll.contextTypes = {
  147. scrollArea: React.PropTypes.object
  148. };*/
  149. export default CurrentIll;