index.jsx 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. import react from "react";
  2. import style from "./index.less";
  3. import $ from 'jquery';
  4. import classNames from 'classnames';
  5. import {handleEnter,isIE,filterArr,deepClone,filterDataArr,getPageCoordinate} from '@utils/tools.js';
  6. import {Notify} from '@commonComp';
  7. import SlideItem from "./SlideItem";
  8. import config from '@config/index.js';
  9. /**
  10. 单列多选组件(tagtype=1,controlType=2)
  11. 2019-2-20 By_liucf
  12. 接收参数:
  13. placeholder:标签名
  14. value:标签选中的值
  15. show:是否展示下拉
  16. data:下拉数据
  17. type:1-主诉,2-现病史,3-其他史,4-查体
  18. **/
  19. class Multiple extends react.Component{
  20. constructor(props){
  21. super(props);
  22. const {seleData,seleId} = deepClone(props.selecteds||[]);
  23. this.state={
  24. editable:false,
  25. timer:null,
  26. labelVal:"",
  27. seleData:seleData||"",
  28. seleId:seleId||[],
  29. boxLeft:null,
  30. boxTop:null,
  31. tmpScroll:null,
  32. tmpTop:null
  33. }
  34. this.$div = React.createRef();
  35. this.handleShow = this.handleShow.bind(this);
  36. this.changeToEdit = this.changeToEdit.bind(this);
  37. this.onChange = this.onChange.bind(this);
  38. this.handleBlur = this.handleBlur.bind(this);
  39. this.handleConfirm = this.handleConfirm.bind(this);
  40. }
  41. getClass(){
  42. const {show,value,hideTag} = this.props;
  43. if(show){
  44. $(this.$div.current).addClass(style['borderd']);
  45. }else{
  46. $(this.$div.current).removeClass(style['borderd']);
  47. }
  48. if(value){
  49. return hideTag?style['hide-tag']:style['selected-tag'];
  50. }
  51. return hideTag?'':style['tag'];
  52. }
  53. getListClass(){
  54. let name = style['text-list'];
  55. let isHide = this.props.show?'':style['hide'];
  56. return classNames(style['list'],name,isHide);
  57. }
  58. handleShow(e){//单击
  59. e&&e.stopPropagation();
  60. let boxLeft = e.pageX -133 + 'px';
  61. let offsetTop = e.target.offsetTop;
  62. const ht = e.target.offsetHeight; //如杂音选中文字有多行时,写死会遮挡
  63. let boxTop = offsetTop + ht +2 + 'px';
  64. this.setState({
  65. boxLeft:getPageCoordinate(e).boxLeft,
  66. boxTop:getPageCoordinate(e).boxTop,
  67. tmpScroll: $("#addScrollEvent")[0].scrollTop,
  68. tmpTop:getPageCoordinate(e).boxTop
  69. })
  70. $("#addScrollEvent").scroll(()=>{
  71. let scrollYs = $("#addScrollEvent")[0].scrollTop;
  72. this.setState({
  73. boxTop:this.state.tmpTop - scrollYs + this.state.tmpScroll
  74. })
  75. })
  76. this.setStateInit();
  77. const {ikey,handleShow,placeholder,flag,id,value,tagType,type} = this.props;
  78. const that = this;
  79. clearTimeout(this.state.timer);
  80. this.state.timer = setTimeout(function(){
  81. if (that.state.editable) {//如果处于编辑状态点击不显示下拉框
  82. return
  83. }else{
  84. handleShow&&handleShow({ikey,placeholder,flag,id,value,tagType,type});
  85. }
  86. },300)
  87. }
  88. setStateInit(){//恢复初始选中状态
  89. const {seleData,seleId} = deepClone(this.props.selecteds||[]);
  90. this.setState({
  91. seleData:seleData||"",
  92. seleId:seleId||[],
  93. })
  94. }
  95. changeToEdit(e){//双击
  96. const {value,id,placeholder,handleDbclick,handleHide} = this.props;
  97. let text = e.target.innerText || e.target.innerHTML;
  98. handleHide&&handleHide(); //展开情况下双击收起
  99. // clearTimeout(this.state.timer);//取消延时的单击事件
  100. e.stopPropagation();
  101. if(value&&value.trim()){//有选中值的标签才能双击编辑
  102. this.setState({
  103. labelVal:text,
  104. editable:true
  105. });
  106. e.target.focus();
  107. handleDbclick && handleDbclick({value,id,placeholder});
  108. }
  109. }
  110. onChange(e){
  111. const {mainSaveText,ikey,type,handleLabelChange} = this.props;
  112. const {labelVal,editable} = this.state;
  113. let mainText = filterDataArr(mainSaveText);//主诉字数
  114. if(editable){//避免IE中点击标签也会触发
  115. let val = e.target.innerText || e.target.innerHTML;
  116. if(+type==1){// 主诉字数达到上限时不允许输入
  117. if(mainText.length >= config.limited){
  118. if(val.length > labelVal.length){
  119. e.target.innerText?(e.target.innerText = labelVal):(e.target.innerHTML = labelVal);
  120. Notify.info(config.limitText);
  121. return
  122. }else if(val.length == labelVal.length){
  123. this.setState({
  124. labelVal:val
  125. });
  126. }else{
  127. handleLabelChange && handleLabelChange({ikey,changeVal:val,type});
  128. }
  129. }
  130. }
  131. }
  132. }
  133. handleBlur(e){//修改存值
  134. e.stopPropagation();
  135. const {ikey,type,handleLabelChange} = this.props;
  136. const {editable} = this.state;
  137. const ev = e || window.event;
  138. if(editable){
  139. // 更改标签的value值
  140. let changeVal = ev.target.innerText || e.target.innerHTML;
  141. if(!isIE()){
  142. e.target.innerText?(e.target.innerText = ''):(e.target.innerHTML=''); //避免出现重复输入值
  143. }
  144. handleLabelChange && handleLabelChange({ikey,changeVal,type});
  145. }
  146. this.setState({
  147. editable:false
  148. });
  149. }
  150. handleConfirm(obj){
  151. const {handleConfirm,ikey,order,mainSaveText,value,handleHide,type} = this.props;
  152. const params = Object.assign({},obj,{ikey,order,mainSaveText,value,type});
  153. handleConfirm&&handleConfirm(params);
  154. handleHide&&handleHide();
  155. }
  156. componentDidMount(){
  157. if(isIE()){
  158. $(this.$div.current).onIe8Input(function(e){
  159. this.onChange(e)
  160. },this);
  161. }
  162. }
  163. render(){
  164. const {placeholder,value,show,data,handleConfirm,ikey,order,mainSaveText,handleHide,type} = this.props;
  165. const {editable,boxTop,boxLeft,seleData,seleId} = this.state;
  166. return <div className={style["container"]}>
  167. <div className={this.getClass()}
  168. ref={this.$div}
  169. onClick={this.handleShow}
  170. onDoubleClick={this.changeToEdit}
  171. onBlur={this.handleBlur}
  172. onInput={this.onChange}
  173. onkeydown={handleEnter}
  174. contentEditable={editable}>{value||placeholder}</div>
  175. <div className={this.getListClass()} contentEditable="false">
  176. <SlideItem
  177. show={show}
  178. left={boxLeft}
  179. top={boxTop}
  180. data={data}
  181. seleData={seleData}
  182. seleId={seleId}
  183. handleConfirm={(obj)=>this.handleConfirm(obj)}
  184. ></SlideItem>
  185. </div>
  186. </div>
  187. }
  188. }
  189. export default Multiple;