123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- import React,{Component} from 'react';
- import {handleEnter,windowEventHandler,setFontColorSize,handleMouseUp} from '@utils/tools.js';
- import {DropList} from '@commonComp';
- import classNames from 'classnames';
- import style from "./index.less";
- import $ from "jquery";
- /****
- * 单选下拉
- * author:zn@2018-11.13
- * 接收参数:
- * placeholder:灰显文字
- * data:下拉内容数据
- * hideTag:是否隐藏括号
- * handleSelect:选中事件
- * prefix:前缀
- * suffix:后缀
- *
- * ***/
- class RadioDrop extends Component{
- constructor(props){
- super(props);
- this.state={
- editable:false,
- timer:null,
- tmpDom:null
- };
- this.$cont = React.createRef();
- this.isIE = navigator.appName=="Microsoft Internet Explorer" && navigator.appVersion.split(";")[1].replace(/[ ]/g,"")=="MSIE8.0";
- this.handleSelect = this.handleSelect.bind(this);
- this.handleShow = this.handleShow.bind(this);
- this.handledbClick = this.handledbClick.bind(this);
- this.handleEditLabel = this.handleEditLabel.bind(this);
- }
- getClass(){
- const {value,hideTag,show,isImports,isExtBlue,mouseSelect} = this.props;
- const ext = isExtBlue?style['ext']:'';
- const orgBorder = isImports?style['orange-border']:''; //橙色框高亮
- const editBorder = this.state.editable?style['blue-border']:'';
- const selectedArea = mouseSelect?style['selected-area']:'';
- if(show){
- $(this.$cont.current).addClass(style['borderd'],);
- }else{
- $(this.$cont.current).removeClass(style['borderd']);
- }
- // if(hideTag){
- // return classNames(style['no-tag'],ext,setFontColorSize(isExtBlue?2:''));
- // }
- if(value){
- if(hideTag){
- return classNames(style['no-tag'],ext,setFontColorSize(isExtBlue?2:''),selectedArea);
- }
- return classNames(style['selected-tag'],ext,editBorder,setFontColorSize(),selectedArea);
- }else{
- if(hideTag){
- return isExtBlue?classNames(setFontColorSize(2)):classNames(setFontColorSize(2),'prefixUnsetColor',)
- }
- return classNames(style['tag'],orgBorder,ext,setFontColorSize(1),selectedArea);
- }
- }
- handleSelect(item){
- const {handleSelect,ikey,mainSaveText,value} = this.props;
- if(!item){ //清空
- handleSelect&&handleSelect({ikey});
- return ;
- }
- let text = '';
- switch(true){
- case +item.controlType ===6:
- case +item.controlType===7:
- case +item.tagType===3:
- text = item;
- break;
- case 3:
- default:
- // text = item.labelPrefix+item.name+item.labelSuffix;
- text = item.name;
- // text = item.questionDetailList&&item.questionDetailList.length>0?item.questionDetailList[0].name: item.name;
- }
- handleSelect&&handleSelect({ikey,id:item.id,text,mainSaveText,value});
- }
- handleShow(e){
- // e.stopPropagation();
- const {handleShow,ikey,id,patId} = this.props;
- const that = this;
- const timer = setTimeout(()=>{
- if (that.state.editable) {//如果处于编辑状态点击不显示下拉框
- return
- }else {
- document.activeElement.blur()//chrome41有效,但是失去焦点的span仍能编辑
- $(e.target).parent().prev().attr({"contentEditable":false})
- this.setState({
- tmpDom:e.target
- })
- handleShow && handleShow({ikey,id:patId||id});
- }
- },300);
-
- this.setState({
- timer,
- });
- }
- componentDidMount(){ //默认值选中
- const {data,ikey,handleSelect,hideTag,mainSaveText,value,boxMark,readDefault,confDefault,isGeneray} = this.props;
- const showDefault = readDefault===-1||readDefault===undefined?confDefault:readDefault;
- const configed = (+showDefault===1&&isGeneray)||!isGeneray; //是一般情况且设置默认值显示或者不是一般情况
- const selected = data.find((it)=>{
- return it.selected === undefined&&+it.defaultSelect===1&&configed;
- });
- if(boxMark!=1&&!hideTag&&selected){
- // const text = selected.labelPrefix+selected.name+selected.labelSuffix;
- const text = selected.name;
- handleSelect&&handleSelect({ikey,id:selected.id,text,mainSaveText,value});
- }
- }
- handleEditLabel(e){
- e.stopPropagation();
- if(!this.state.editable){ //ie8点开下拉未选值存值bug修改
- return;
- }
- const {ikey,boxMark,handleLabelEdit} = this.props;
- this.setState({
- editable:false
- });
- // 更改标签的value值
- const ev = e || window.event;
- let changeVal = ev.target.innerText || ev.target.innerHTML;
- //fireFox括号删完有<br>2270
- changeVal=changeVal=="<br>"?'':changeVal;
- if(!this.isIE){
- ev.target.innerText?(ev.target.innerText = ''):(ev.target.innerHTML = '');
- }
- handleLabelEdit && handleLabelEdit({ikey,changeVal,type:boxMark});
- }
- handledbClick(e){
- window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
- const {value,id,handleDbclick,patId} = this.props;
- clearTimeout(this.state.timer);//取消延时的单击事件
- //e.preventDefault();
- if(value&&value.trim()) {//有选中值的标签才能双击编辑
- this.setState({
- editable: true
- });
- };
- //失焦关闭编辑状态
- setTimeout(()=>{
- e.target.focus();
- })
- handleDbclick&&handleDbclick({id:patId||id});
- }
- handleMouseDown(){
- const {i,setSelectArea,boxMark}= this.props;
- setSelectArea({i,boxMark,dir:'start'});
- }
- render(){
- const {data,placeholder,show,value,hideTag,boxMark,select_start,i} = this.props;
- const {tmpDom} = this.state
- if(!show&&tmpDom){
- $(tmpDom).parent().prev().attr({"contentEditable":true})
- }
- return <div className={`${style['container']} prefixUnsetColor`} ref = {this.$cont}>
- <div className={this.getClass()}
- onBlur={this.handleEditLabel}
- contentEditable={this.state.editable}
- onDoubleClick={hideTag?null:this.handledbClick}
- onFocus={(e)=>{e.stopPropagation()}}
- onClick={(e)=>this.handleShow(e,true)}
- onMouseUp={()=>handleMouseUp({select_start,i,boxMark})}
- onMouseDown={this.handleMouseDown.bind(this)}
- onKeyDown={handleEnter}>
- {value||placeholder}
- </div>
- <DropList onSelect={this.handleSelect} boxMark={boxMark} data={data} show={show} hideTag={hideTag}/>
- </div>
- }
- }
- export default RadioDrop;
|