shineout
Version:
Shein 前端组件库
303 lines (249 loc) • 11.4 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireWildcard(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _uid = require("../utils/uid");
var _styles = require("./styles");
var _Sorter = _interopRequireDefault(require("./Sorter"));
var _CheckboxAll = _interopRequireDefault(require("./CheckboxAll"));
var _element = require("../utils/dom/element");
var _is = require("../utils/is");
var cacheGroup = new Map();
var MIN_RESIZABLE_WIDTH = 20;
var Thead =
/*#__PURE__*/
function (_PureComponent) {
(0, _inheritsLoose2.default)(Thead, _PureComponent);
function Thead(props) {
var _this;
_this = _PureComponent.call(this, props) || this;
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleMouseDown", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleMouseMove", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleMouseUp", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "resizingTh", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "resizingTable", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "columnLevel", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "resizingIndex", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "resizingCol", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "lastX", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "rightBorderRecord", void 0);
_this.handleMouseDown = _this.handleResize.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'mousedown');
_this.handleMouseMove = _this.handleResize.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'mousemove');
_this.handleMouseUp = _this.handleResize.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), 'mouseup');
return _this;
}
var _proto = Thead.prototype;
_proto.setColumns = function setColumns(columns, col, level, index) {
if (index === void 0) {
index = 0;
}
if (!col.group) {
columns.push(col);
return 1;
}
if (level > this.columnLevel) this.columnLevel = level;
var g = Array.isArray(col.group) ? col.group : [col.group];
var last = columns[columns.length - 1];
if (!g[level]) {
columns.push(col);
return 1;
}
var colSpan = 0;
if (last && last.name === g[level]) {
colSpan = this.setColumns(last.columns, col, level + 1, index);
last.colSpan += colSpan;
if (col.fixed) last.fixed = col.fixed;
if (col.lastFixed) last.lastFixed = true;
} else {
var sub = [];
colSpan = this.setColumns(sub, col, level + 1, index);
var group = g[level];
columns.push({
name: g[level],
key: typeof g[level] === 'string' ? index + "-" + g[level] : cacheGroup.get(group) || cacheGroup.set(group, (0, _uid.getUidStr)()).get(group),
colSpan: colSpan,
level: level,
fixed: col.fixed,
firstFixed: col.firstFixed,
columns: sub
});
}
return colSpan;
};
_proto.resizeColgroup = function resizeColgroup(deltaX) {
var columns = this.props.columns;
var item = columns[this.resizingIndex];
var minWidth = item.minWidth,
maxWidth = item.maxWidth;
var oWidth = parseInt(this.resizingCol.style.width, 10);
if (Number.isNaN(oWidth) || oWidth === 0) {
oWidth = this.resizingTh.getBoundingClientRect().width;
}
var w = oWidth + deltaX;
if ((0, _is.isNumber)(minWidth)) {
w = Math.max(w, minWidth);
} else {
w = Math.max(w, MIN_RESIZABLE_WIDTH);
}
if ((0, _is.isNumber)(maxWidth)) {
w = Math.min(w, maxWidth);
}
this.resizingCol.style.width = w + "px";
};
_proto.handleResize = function handleResize(type, e) {
if (type === 'mousedown') {
var target = e.target;
this.resizingTh = (0, _element.getParent)(target, 'th');
this.resizingTable = (0, _element.getParent)(target, 'table');
var thList = (0, _element.getParent)(target, 'tr').children;
var indexInTr = [].indexOf.call(thList, this.resizingTh);
this.resizingIndex = [].slice.call(thList, 0, indexInTr).reduce(function (total, th) {
var count = Number(th.getAttribute('colspan')) || 1;
return total + count;
}, 0);
this.resizingCol = this.resizingTable.querySelectorAll('col')[this.resizingIndex];
this.resizingTable.classList.add((0, _styles.tableClass)('resizing'));
this.resizingTh.classList.add((0, _styles.tableClass)('resizing-item'));
document.addEventListener('mousemove', this.handleMouseMove);
document.addEventListener('mouseup', this.handleMouseUp);
} else if (type === 'mousemove') {
var x = e.clientX;
if (typeof this.lastX === 'number') {
var deltaX = x - this.lastX;
this.resizeColgroup(deltaX);
}
this.lastX = x;
} else if (type === 'mouseup') {
var _this$props = this.props,
onColChange = _this$props.onColChange,
colgroup = _this$props.colgroup;
document.removeEventListener('mousemove', this.handleMouseMove);
document.removeEventListener('mouseup', this.handleMouseUp);
this.resizingTable.classList.remove((0, _styles.tableClass)('resizing'));
this.resizingTh.classList.remove((0, _styles.tableClass)('resizing-item'));
this.lastX = undefined;
if (onColChange) onColChange(this.resizingIndex, parseInt(this.resizingCol.style.width, 10), colgroup);
}
};
_proto.createTh = function createTh(trs, col, level) {
var _this2 = this;
var columnResizable = this.props.columnResizable;
var colTemp = col;
var colTemp2 = col;
var fixed = [];
if (col.fixed) fixed.push("fixed-" + col.fixed);
if (col.firstFixed) fixed.push('fixed-first');
if (col.lastFixed) fixed.push('fixed-last');
var _this$props2 = this.props,
sorter = _this$props2.sorter,
onSortChange = _this$props2.onSortChange,
data = _this$props2.data,
datum = _this$props2.datum,
showSelectAll = _this$props2.showSelectAll,
disabled = _this$props2.disabled,
treeColumnsName = _this$props2.treeColumnsName,
treeCheckAll = _this$props2.treeCheckAll;
var isEmpty = !(data && data.length);
var align = colTemp.align && "align-" + colTemp.align;
var ignoreBorderRight = this.rightBorderRecord[col.key] && 'ignore-right-border';
var resize = level === 0 && !isEmpty && columnResizable && col.columnResizable !== false ? _react.default.createElement("span", {
onMouseDown: this.handleMouseDown,
className: (0, _styles.tableClass)('resize-spanner')
}) : null;
if (colTemp.title) {
trs[level].push(_react.default.createElement("th", {
className: (0, _classnames.default)(_styles.tableClass.apply(void 0, [level > 0 && 'condensed', align, ignoreBorderRight].concat(fixed)), col.className),
rowSpan: this.columnLevel - level + 1,
key: col.key
}, _react.default.createElement("div", {
className: (0, _styles.tableClass)(colTemp.sorter && 'has-sorter')
}, _react.default.createElement("span", null, typeof colTemp.title === 'function' ? colTemp.title(data) : colTemp.title), colTemp.sorter && _react.default.createElement(_Sorter.default, (0, _extends2.default)({}, colTemp, {
sorter: colTemp.sorter,
current: sorter,
keyStr: col.key,
onChange: onSortChange,
renderSorter: this.props.renderSorter
})), resize)));
return;
}
if (colTemp.type === 'checkbox') {
trs[level].push(_react.default.createElement("th", {
key: "checkbox",
rowSpan: trs.length,
className: (0, _classnames.default)(_styles.tableClass.apply(void 0, ['checkbox'].concat(fixed)), colTemp.className)
}, showSelectAll && _react.default.createElement(_CheckboxAll.default, {
disabled: disabled === true,
data: data,
datum: datum,
treeColumnsName: treeCheckAll ? treeColumnsName : undefined,
col: col
})));
return;
}
var style = typeof colTemp2.name === 'string' ? undefined : {
padding: 0
};
trs[level].push(_react.default.createElement("th", {
className: (0, _classnames.default)(_styles.tableClass.apply(void 0, ['center', 'condensed', ignoreBorderRight].concat(fixed)), col.className),
colSpan: colTemp2.colSpan,
key: col.key,
style: style
}, colTemp2.name, resize));
if (colTemp2.columns) {
colTemp2.columns.forEach(function (c) {
return _this2.createTh(trs, c, level + 1);
});
}
};
_proto.ignoreRightBorder = function ignoreRightBorder(column) {
var columnGroup = column;
this.rightBorderRecord[column.key] = true;
if (columnGroup.columns) this.ignoreRightBorder(columnGroup.columns[columnGroup.columns.length - 1]);
};
_proto.formatColumns = function formatColumns() {
var _this3 = this;
this.columnLevel = 0;
var columns = [];
this.props.columns.forEach(function (col, index) {
_this3.setColumns(columns, col, 0, index);
});
this.rightBorderRecord = {};
if (columns.length > 0 && this.props.bordered) {
this.ignoreRightBorder(columns[columns.length - 1]);
}
return columns;
};
_proto.formatTrs = function formatTrs() {
var _this4 = this;
var columns = this.formatColumns();
var trs = [];
for (var i = 0; i <= this.columnLevel; i++) {
trs.push([]);
}
columns.forEach(function (col) {
return _this4.createTh(trs, col, 0);
});
return trs;
};
_proto.render = function render() {
var trs = this.formatTrs();
return _react.default.createElement("thead", null, trs.map(function (tr, i) {
return _react.default.createElement("tr", {
key: i
}, tr);
}));
};
return Thead;
}(_react.PureComponent);
(0, _defineProperty2.default)(Thead, "defaultProps", {
showSelectAll: true
});
var _default = Thead;
exports.default = _default;