choerodon-ui
Version:
An enterprise-class UI design language and React-based implementation
295 lines (252 loc) • 10.4 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"];
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var React = _interopRequireWildcard(require("react"));
var _isFunction = _interopRequireDefault(require("lodash/isFunction"));
var _groupBy = _interopRequireDefault(require("lodash/groupBy"));
var _get = _interopRequireDefault(require("lodash/get"));
var _ColumnGroup = _interopRequireDefault(require("../ColumnGroup"));
var _HeaderCell = _interopRequireDefault(require("../HeaderCell"));
var _isNullOrUndefined = _interopRequireDefault(require("./isNullOrUndefined"));
var _excluded = ["width", "sortable", "children", "dataKey", "onSortColumn", "sortColumn", "sortType", "headerHeight", "groupHeader", "left", "resizable", "fixed"];
function cloneCell(Cell, props) {
return /*#__PURE__*/React.cloneElement(Cell, props);
}
function mergeCells(cells) {
var leftFixedLength = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
var nextCells = [];
var columnGroupLeft = 0;
var mergeMaxCells = [];
var currentGroupName = '';
var usedCells = [];
var preWidth = [0];
var _loop = function _loop(_i) {
var _cells$_i$props = cells[_i].props,
width = _cells$_i$props.width,
colSpan = _cells$_i$props.colSpan,
groupCount = _cells$_i$props.groupCount,
groupHeader = _cells$_i$props.groupHeader,
isHeaderCell = _cells$_i$props.isHeaderCell,
headerHeight = _cells$_i$props.headerHeight,
verticalAlign = _cells$_i$props.verticalAlign,
parent = _cells$_i$props.parent,
cellLeft = _cells$_i$props.left,
fixed = _cells$_i$props.fixed;
if (usedCells.includes(cells[_i].key)) {
i = _i;
return "continue";
}
var groupChildrenStore = [];
var groupChildren = []; // fix(ColumnGroup): fix column cannot be sorted in ColumnGroup
/**
* 为列头添加分组
*/
if (parent && isHeaderCell) {
var nextWidth = width;
var left = 0;
var resizeLeft = 0;
for (var j = 0; j < groupCount; j += 1) {
var nextCell = cells[_i + j];
var _nextCell$props = nextCell.props,
nextCellWidth = _nextCell$props.width,
sortable = _nextCell$props.sortable,
children = _nextCell$props.children,
dataKey = _nextCell$props.dataKey,
onSortColumn = _nextCell$props.onSortColumn,
sortColumn = _nextCell$props.sortColumn,
sortType = _nextCell$props.sortType,
_headerHeight = _nextCell$props.headerHeight,
_nextCell$props$group = _nextCell$props.groupHeader,
nextGroupHeader = _nextCell$props$group === void 0 ? currentGroupName : _nextCell$props$group,
columnLeft = _nextCell$props.left,
resizable = _nextCell$props.resizable,
_fixed = _nextCell$props.fixed,
otherProps = (0, _objectWithoutProperties2["default"])(_nextCell$props, _excluded);
if (j === 0) {
currentGroupName = nextGroupHeader;
resizeLeft = columnLeft;
}
if (currentGroupName !== nextGroupHeader) {
groupChildrenStore = [].concat(groupChildren);
_i = _i + j;
break;
}
if (j !== 0) {
nextWidth += nextCellWidth;
left += cells[_i + j - 1].props.width;
cells[_i + j] = cloneCell(nextCell, {
hidden: true
});
}
var otherHeaderProps = void 0;
if (resizable) {
otherHeaderProps = {
resizable: resizable,
resizeLeft: resizeLeft,
onColumnResizeEnd: otherProps.onColumnResizeEnd,
onColumnResizeMove: otherProps.onColumnResizeMove,
onColumnResizeStart: otherProps.onColumnResizeStart,
onMouseEnterHandler: otherProps.onMouseEnterHandler,
onMouseLeaveHandler: otherProps.onMouseLeaveHandler
};
}
groupChildren.push( /*#__PURE__*/React.createElement(_HeaderCell["default"], (0, _extends2["default"])({
key: j,
index: leftFixedLength + _i + j,
left: left,
fixed: _fixed,
dataKey: dataKey,
width: nextCellWidth,
sortable: sortable,
sortColumn: sortColumn,
sortType: sortType,
onSortColumn: onSortColumn,
verticalAlign: verticalAlign,
headerHeight: _headerHeight / 2
}, otherHeaderProps), children));
usedCells.push(nextCell.key);
}
if (groupHeader !== parent.props.header) {
if (mergeMaxCells.length && parent.props.header !== mergeMaxCells[mergeMaxCells.length - 1].header) {
columnGroupLeft = nextWidth;
preWidth = [0];
} else {
columnGroupLeft += nextWidth;
}
mergeMaxCells.push((0, _objectSpread2["default"])((0, _objectSpread2["default"])({
index: _i,
content: groupCount ? /*#__PURE__*/React.createElement(_ColumnGroup["default"], {
left: preWidth[preWidth.length - 1],
width: nextWidth,
header: groupHeader,
verticalAlign: verticalAlign,
headerHeight: headerHeight / 3 * 2,
headerLeft: cellLeft,
fixed: fixed
}, groupChildren.map(function (x) {
return /*#__PURE__*/React.cloneElement(x, (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, x.props), {}, {
headerHeight: headerHeight / 3
}));
})) : /*#__PURE__*/React.cloneElement(cells[_i], {
left: preWidth[preWidth.length - 1],
resizeLeft: cellLeft - preWidth[preWidth.length - 1],
headerHeight: headerHeight / 3 * 2
})
}, parent.props), {}, {
headerHeight: headerHeight,
width: nextWidth
}));
preWidth.push(columnGroupLeft);
} else if (groupChildrenStore.length) {
columnGroupLeft += nextWidth;
preWidth.push(columnGroupLeft);
groupChildrenStore.forEach(function (x) {
mergeMaxCells.push((0, _objectSpread2["default"])((0, _objectSpread2["default"])({
index: _i,
content: /*#__PURE__*/React.cloneElement(x, (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, x.props), {}, {
headerHeight: headerHeight * (2 / 3)
}))
}, parent.props), {}, {
headerHeight: headerHeight,
width: x.props.width
}));
});
} else {
nextCells.push(cloneCell(cells[_i], {
width: nextWidth,
children: /*#__PURE__*/React.createElement(_ColumnGroup["default"], {
width: nextWidth,
headerHeight: headerHeight,
header: groupHeader,
verticalAlign: verticalAlign,
headerLeft: cellLeft,
fixed: fixed
}, groupChildren)
}));
}
i = _i;
return "continue";
} else if (colSpan) {
/**
* 如果存在 colSpan 属性,就去找它的下一个 Cell,
* 看看值是否是 isNullOrUndefined,,如果为空这可以合并这个单元格
*/
var _nextWidth = width;
for (var _j = 0; _j < colSpan; _j += 1) {
var _nextCell = cells[_i + _j];
if (_nextCell) {
var _nextCell$props2 = _nextCell.props,
rowData = _nextCell$props2.rowData,
rowIndex = _nextCell$props2.rowIndex,
_children = _nextCell$props2.children,
colSpanWidth = _nextCell$props2.width,
_isHeaderCell = _nextCell$props2.isHeaderCell,
_dataKey = _nextCell$props2.dataKey;
var cellText = (0, _isFunction["default"])(_children) ? _children(rowData, rowIndex) : (0, _get["default"])(rowData, _dataKey);
if (rowData && (0, _isNullOrUndefined["default"])(cellText) || _isHeaderCell && (0, _isNullOrUndefined["default"])(_children)) {
_nextWidth += colSpanWidth;
cells[_i + _j] = cloneCell(_nextCell, {
hidden: true
});
}
}
}
nextCells.push(cloneCell(cells[_i], {
width: _nextWidth,
// Fix this use of the variablecolSpan always evaluates to true
'aria-colspan': _nextWidth > width ? colSpan : undefined
}));
i = _i;
return "continue";
}
nextCells.push(cells[_i]);
i = _i;
};
for (var i = 0; i < cells.length; i += 1) {
var _ret = _loop(i);
if (_ret === "continue") continue;
}
if (mergeMaxCells.length) {
var groupByHeader = (0, _groupBy["default"])(mergeMaxCells, 'header');
for (var key in groupByHeader) {
var mapGroup = groupByHeader[key];
var firstMerge = mapGroup[0];
var width = mapGroup.reduce(function (total, col) {
return total += col.width;
}, 0);
var align = firstMerge.align,
verticalAlign = firstMerge.verticalAlign,
headerHeight = firstMerge.headerHeight,
header = firstMerge.header,
fixed = firstMerge.fixed,
index = firstMerge.index;
nextCells.push(cloneCell(cells[index], {
width: width,
align: align,
fixed: fixed,
resizable: false,
children: /*#__PURE__*/React.createElement(_ColumnGroup["default"], {
width: width,
headerHeight: headerHeight / 3 * 2,
header: header,
verticalAlign: verticalAlign,
headerLeft: cells[index].props.left,
fixed: fixed
}, mapGroup.map(function (x) {
return x.content;
}))
}));
}
}
return nextCells;
}
var _default = mergeCells;
exports["default"] = _default;
//# sourceMappingURL=mergeCells.js.map