@beisen/ethos
Version:
beisencloud pc react components
332 lines (282 loc) • 9.38 kB
JavaScript
'use strict';
var _commonFunc = require('../../common-func');
var React = require('react');
var assign = require('object-assign');
var normalize = require('react-style-normalizer');
var ToolTip = require('../../tool-tip');
var TEXT_ALIGN_2_JUSTIFY = {
right: 'flex-end',
center: 'center'
};
function copyProps(target, source, list) {
list.forEach(function (name) {
if (name in source) {
target[name] = source[name];
}
});
}
var PropTypes = React.PropTypes;
var Cell = React.createClass({
displayName: 'ReactDataGrid.Cell',
propTypes: {
className: PropTypes.string,
firstClassName: PropTypes.string,
lastClassName: PropTypes.string,
contentPadding: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
column: PropTypes.object,
columns: PropTypes.array,
index: PropTypes.number,
style: PropTypes.object,
text: PropTypes.any,
rowIndex: PropTypes.number
},
getDefaultProps: function getDefaultProps() {
return {
text: '',
firstClassName: 'z-first',
lastClassName: 'z-last',
defaultStyle: {}
};
},
prepareClassName: function prepareClassName(props) {
var index = props.index;
var columns = props.columns;
var column = props.column;
var textAlign = column && column.textAlign;
var className = props.className || '';
className += ' ' + Cell.className;
if (columns) {
if (!index && props.firstClassName) {
className += ' ' + props.firstClassName;
}
if (index == columns.length - 1 && props.lastClassName) {
className += ' ' + props.lastClassName;
}
}
if (column.numberType) {
textAlign = "right";
};
if (textAlign) {
className += ' z-align-' + textAlign;
}
if (props.isLookUpV2) {
className += ' LookUpV2';
}
if (column.name == 'operator') {
className += ' z-cell-operator';
}
return className;
},
prepareStyle: function prepareStyle(props) {
var column = props.column;
var sizeStyle = column && column.sizeStyle;
var alignStyle;
var textAlign = column && column.textAlign || (props.style || {}).textAlign;
if (textAlign) {
alignStyle = {
justifyContent: TEXT_ALIGN_2_JUSTIFY[textAlign]
};
}
var style = assign({}, props.defaultStyle, sizeStyle, alignStyle, props.style);
return normalize(style);
},
prepareProps: function prepareProps(thisProps) {
var props = assign({}, thisProps);
if (!props.column && props.columns) {
props.column = props.columns[props.index];
}
props.className = this.prepareClassName(props);
props.style = this.prepareStyle(props);
return props;
},
//处理编辑时的高亮逻辑
handleHighLight: function handleHighLight(data, e) {
e.preventDefault();
var className = e.target.className;
if (className && className.indexOf('z-column-header') !== -1) {
return;
}
if (className && className.indexOf('z-content') !== -1 && className.indexOf('z-cell-high') === -1) {
className = "z-content z-content-high";
}
},
handleHighLightLeave: function handleHighLightLeave(data, e) {
e.preventDefault();
if (className && className.indexOf('z-content-high') !== -1) {
className = "z-content";
}
},
//juan 新增单元格编辑功能
setEdit: function setEdit(col, rowId, event) {
//当鼠标滑过事件为表头时data不存在
if (this.props.data) {
var tar = event.target;
//计算出编辑框所在的位置
var offset = this.getPosition(tar, {
width: tar.offsetWidth,
height: 43
});
//将列索引、行索引、单元格内容、挂载组件名称、挂载组件数据和位置传至业务
if (this.props.handleEdit) {
this.props.handleEdit(col, rowId, tar.innerText, offset);
}
}
},
getPosition: function getPosition(target) {
var dom_offset = target.getBoundingClientRect();
return {
top: Math.floor(dom_offset.top),
left: Math.floor(dom_offset.left)
};
},
render: function render() {
var props = this.p = this.prepareProps(this.props);
var column = props.column;
var textAlign = column && column.textAlign;
var text = props.renderText ? props.renderText(props.text, column, props.rowIndex) : props.text;
var tipText = "";
if (typeof text == "string") {
tipText = text;
}
//juan 非表头且列为可编辑
if (props.data && props.column.editable) {
//若无行id,则返回行索引
var keyId = props.data.key_id ? props.data.key_id : props.rowIndex;
//新增编辑图标
text = React.createElement(
'span',
null,
text,
React.createElement('span', {
className: 'pc-sys-tishi-nomal-small-svg',
style: { float: 'right' } })
);
props.onMouseEnter = this.handleHighLight.bind(this, props);
props.onMouseOut = this.handleHighLightLeave.bind(this, props);
props.onDoubleClick = this.setEdit.bind(this, props.column, keyId); //传入列index和行index,从0开始
}
var cePadding = '';
if (column.numberType && props.className.indexOf("z-column-header") !== -1) {
cePadding = "0px 10px 0px 10px";
if (props.className.indexOf("z-sortable") !== -1) {
cePadding = "0px 15px 0px 10px";
}
} else if (props.className.indexOf("z-column-header") !== -1) {
cePadding = "0px 10px 0px 10px";
if (props.className.indexOf("z-sortable") !== -1) {
cePadding = "0px 15px 0px 10px";
}
} else {
cePadding = "10px 10px 10px 10px";
}
if (props.paddingSize) {
cePadding = props.paddingSize + "px 10px " + props.paddingSize + "px 10px ";
}
var sty = "";
var s = 0;
if (props.rowType) {
switch (props.rowType) {
case "small":
sty = "30px";
s = 30;
break;
case "medium":
sty = "50px";
s = 50;
break;
case "big":
sty = "80px";
s = 80;
break;
default:
s = 20;
sty = "20px";
}
}
// if(props.paddingSize){
// sty = sty -
// }
if (text && text.props && text.props.isChecked !== undefined) {
sty = s == 20 ? '23px' : '30px';
}
var contentProps = {
className: 'z-content',
style: {
padding: cePadding,
"lineHeight": sty,
height: props.paddingSize * 2 + s + 1,
'display': props.style.display
}
};
if (props.className.indexOf("z-align-right") != -1) {
contentProps.style.paddingRight = "20px";
}
var content = props.renderCell ? props.renderCell(contentProps, text, props) : React.createElement(
'div',
contentProps,
text
);
if (tipText) {
var content = props.renderCell ? props.renderCell(contentProps, text, props) : React.createElement(
'div',
contentProps,
React.createElement(
ToolTip,
{ title: (0, _commonFunc.decode)(tipText) },
React.createElement(
'span',
{ style: { "display": "block", "width": "100%", "overflow": "hidden", "textOverflow": "ellipsis", 'paddingTop': '5px' } },
(0, _commonFunc.decode)(text)
)
)
);
} else {
var content = props.renderCell ? props.renderCell(contentProps, text, props) : React.createElement(
'div',
contentProps,
text
);
}
var renderProps = assign({}, props);
//给header自定义属性titleStyle
if (renderProps.column.titleStyle && renderProps.className.indexOf('z-column-header') != -1) {
renderProps.style = assign({}, renderProps.style, renderProps.column.titleStyle);
}
delete renderProps.data;
if (renderProps.column.flexible) {
//wuzhe----兼容ie10下的flex样式
renderProps.style.WebkitBoxFlex = renderProps.column.flex || 1;
renderProps.style.MsBoxFlex = renderProps.column.flex || 1;
renderProps.style.MsFlex = renderProps.column.flex || 1;
renderProps.style.WebkitFlex = renderProps.column.flex || 1;
renderProps.style.flex = renderProps.column.flex || 1;
renderProps.style.msFlexPositive = 1;
renderProps.style.msFlexNegative = 0;
renderProps.style.msFlexPreferredSize = "1px";
} else {
if (renderProps.column.fixedWidth && !renderProps.column.dropWidth) {
renderProps.style.width = renderProps.column.fixedWidth + (renderProps.column.numberType ? 30 : 20);
//防止超出最大宽度引发的问题,限制了最大宽度为3355000px
renderProps.style.width = renderProps.style.width > 3355000 ? 3355000 : renderProps.style.width;
} else {
if (renderProps.header) {
renderProps.style.width = renderProps.column.width;
} else {
if (renderProps.columnsWith || renderProps.column.width) {
renderProps.style.width = renderProps.column.width;
} else {
renderProps.style.width = "auto";
}
}
}
}
return React.createElement(
'div',
renderProps,
content,
props.children
);
}
});
Cell.className = 'z-cell';
module.exports = Cell;