index.jsx 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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} from '@utils/tools.js';
  6. import {Notify} from '@commonComp';
  7. import ReactDom from "react-dom";
  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. }
  32. this.$div = React.createRef();
  33. this.handleSelect = this.handleSelect.bind(this);
  34. this.onChange = this.onChange.bind(this);
  35. this.handleBlur = this.handleBlur.bind(this);
  36. this.handleClear = this.handleClear.bind(this);
  37. this.handleComfirn = this.handleComfirn.bind(this);
  38. }
  39. getListClass(){
  40. let name = style['text-list'];
  41. let isHide = this.props.show?'':style['hide'];
  42. return classNames(style['list'],name,isHide);
  43. }
  44. getSeleStyle(id){
  45. const {seleId} = this.state;
  46. if(seleId.includes(id)){
  47. return style['selected'];
  48. }
  49. return '';
  50. }
  51. handleSelect(e,item){
  52. e&&e.stopPropagation();
  53. let {seleData,seleId} = this.state;
  54. const {name,id} = item;
  55. if(seleId.includes(id)){
  56. seleId.splice(seleId.indexOf(id),1);
  57. seleData = seleData.replace(name,'');
  58. }else{
  59. seleId.push(id);
  60. seleData += name;
  61. }
  62. this.setState({
  63. seleData,
  64. seleId
  65. })
  66. }
  67. onChange(e){
  68. const {mainSaveText,ikey,type,handleLabelChange} = this.props;
  69. const {labelVal,editable} = this.state;
  70. let mainText = filterDataArr(mainSaveText);//主诉字数
  71. if(editable){//避免IE中点击标签也会触发
  72. let val = e.target.innerText || e.target.innerHTML;
  73. if(+type==1){// 主诉字数达到上限时不允许输入
  74. if(mainText.length >= config.limited){
  75. if(val.length > labelVal.length){
  76. e.target.innerText?(e.target.innerText = labelVal):(e.target.innerHTML = labelVal);
  77. Notify.info(config.limitText);
  78. return
  79. }else if(val.length == labelVal.length){
  80. this.setState({
  81. labelVal:val
  82. });
  83. }else{
  84. handleLabelChange && handleLabelChange({ikey,changeVal:val,type});
  85. }
  86. }
  87. }
  88. }
  89. }
  90. handleBlur(e){//修改存值
  91. e.stopPropagation();
  92. const {ikey,type,handleLabelChange} = this.props;
  93. const {editable} = this.state;
  94. const ev = e || window.event;
  95. if(editable){
  96. // 更改标签的value值
  97. let changeVal = ev.target.innerText || e.target.innerHTML;
  98. if(!isIE()){
  99. e.target.innerText?(e.target.innerText = ''):(e.target.innerHTML=''); //避免出现重复输入值
  100. }
  101. handleLabelChange && handleLabelChange({ikey,changeVal,type});
  102. }
  103. this.setState({
  104. editable:false
  105. });
  106. }
  107. handleClear(e){
  108. e&&e.stopPropagation();
  109. this.setState({
  110. seleData:"",
  111. seleId:[]
  112. })
  113. }
  114. handleComfirn(e){
  115. e&&e.stopPropagation();
  116. const {handleConfirm,ikey,order,mainSaveText,value,handleHide,type} = this.props;
  117. const params = Object.assign({},this.state,{ikey,order,mainSaveText,value,type});
  118. handleConfirm&&handleConfirm(params);
  119. handleHide&&handleHide();
  120. }
  121. componentDidMount(){
  122. if(isIE()){
  123. $(this.$div.current).onIe8Input(function(e){
  124. this.onChange(e)
  125. },this);
  126. }
  127. }
  128. getStyle(){
  129. const {left,top,show} = this.props;
  130. return {
  131. left:left?left+'px':'0',
  132. top:top?top+'px':'0',
  133. display:show?'table':'none' //table onBlur阻止冒泡是为了修复multSpread中数字键盘点击触发最外层数字组件onBlur事件
  134. }
  135. }
  136. render(){
  137. const {placeholder,value,show,data} = this.props;
  138. const {editable,boxTop,boxLeft} = this.state;
  139. const domNode = document.getElementById('root');
  140. return ReactDom.createPortal(
  141. <div className={this.getListClass()} style={this.getStyle()} contentEditable="false">
  142. <ul>
  143. {data&&data.map((it)=>{
  144. return <li onClick={(e)=>this.handleSelect(e,it)} className={this.getSeleStyle(it.id)} title={it.name.length>8?it.name:''}>{it.name&&it.name.length>8?it.name.slice(0,8)+'...':it.name}</li>
  145. })}
  146. <li onClick={this.handleClear} className={style['mClear']}>清空选项</li>
  147. <li onClick={this.handleComfirn} className={style['mConfirm']}>确定</li>
  148. </ul>
  149. </div>,domNode)
  150. }
  151. }
  152. export default Multiple;