es-grid-template
Version:
es-grid-template
167 lines (166 loc) • 6.17 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.rowDetail = rowDetail;
var _classnames = _interopRequireDefault(require("classnames"));
var _react = _interopRequireDefault(require("react"));
var _internals = require("../../internals");
var _utils = require("../../utils");
var _others = require("../../utils/others");
var _commonViews = require("../../common-views");
const rowDetailSymbol = Symbol('row-detail');
const fallbackRenderDetail = () => /*#__PURE__*/_react.default.createElement("div", {
style: {
margin: '8px 24px'
}
}, /*#__PURE__*/_react.default.createElement("b", {
style: {
color: 'indianred'
}
}, "\u8BBE\u7F6E ", /*#__PURE__*/_react.default.createElement("code", null, "rowDetail.renderDetail"), " \u6765\u81EA\u5B9A\u4E49\u8BE6\u60C5\u5185\u5BB9"));
function rowDetail(opts = {}) {
return function rowDetailStep(pipeline) {
const stateKey = 'rowDetail';
const primaryKey = pipeline.ensurePrimaryKey('rowDetail');
if (typeof primaryKey !== 'string') {
throw new Error('rowDetail 仅支持字符串作为 primaryKey');
}
const rowDetailMetaKey = opts.rowDetailMetaKey ?? rowDetailSymbol;
const indents = pipeline.ctx.indents;
const textOffset = indents.iconIndent + indents.iconWidth + indents.iconGap;
const clickArea = opts.clickArea ?? 'cell';
const getDetailKey = opts.getDetailKey ?? (row => row[primaryKey] + '_detail');
const renderDetail = opts.renderDetail ?? fallbackRenderDetail;
const hasDetail = opts.hasDetail ?? (0, _others.always)(true);
const openKeys = opts.openKeys ?? pipeline.getStateAtKey(stateKey) ?? (opts.defaultOpenAll ? pipeline.getDataSource().filter(hasDetail).map(row => row[primaryKey]) : opts.defaultOpenKeys) ?? [];
const onChangeOpenKeys = (nextKeys, key, action) => {
opts.onChangeOpenKeys?.(nextKeys, key, action);
pipeline.setStateAtKey(stateKey, nextKeys, {
key,
action
});
};
const openKeySet = new Set(openKeys);
const toggle = rowKey => {
const expanded = openKeySet.has(rowKey);
if (expanded) {
onChangeOpenKeys(openKeys.filter(key => key !== rowKey), rowKey, 'collapse');
} else {
onChangeOpenKeys([...openKeys, rowKey], rowKey, 'expand');
}
};
return pipeline.dataSource((0, _others.flatMap)(pipeline.getDataSource(), (row, rowIndex) => {
if (openKeySet.has(row[primaryKey])) {
return [row, {
[rowDetailMetaKey]: true,
...row,
[primaryKey]: getDetailKey(row, rowIndex)
}];
} else {
return [row];
}
})).columns(processColumns(pipeline.getColumns())).appendRowPropsGetter(row => {
if (row[rowDetailMetaKey]) {
return {
className: 'no-hover'
};
} else {
return {};
}
});
function processColumns(columns) {
if (columns.length === 0) {
return columns;
}
const columnFlatCount = (0, _utils.collectNodes)(columns, 'leaf-only').length;
const [firstCol, ...others] = columns;
const render = (value, row, rowIndex) => {
if (row[rowDetailMetaKey]) {
return renderDetail(row, rowIndex);
}
const content = _internals.internals.safeRender(firstCol, row, rowIndex);
if (!hasDetail(row, rowIndex)) {
return /*#__PURE__*/_react.default.createElement(_commonViews.InlineFlexCell, {
style: {
marginLeft: textOffset
}
}, content);
}
const rowKey = row[primaryKey];
const expanded = openKeySet.has(rowKey);
const onClick = e => {
if (opts.stopClickEventPropagation) {
e.stopPropagation();
}
toggle(rowKey);
};
const expandCls = expanded ? 'expanded' : 'collapsed';
return /*#__PURE__*/_react.default.createElement(_commonViews.ExpansionCell, {
className: (0, _classnames.default)('expansion-cell', expandCls),
style: {
cursor: clickArea === 'content' ? 'pointer' : undefined
},
onClick: clickArea === 'content' ? onClick : undefined
}, /*#__PURE__*/_react.default.createElement(_commonViews.icons.CaretRight, {
style: {
cursor: clickArea === 'icon' ? 'pointer' : undefined,
marginLeft: indents.iconIndent,
marginRight: indents.iconGap
},
className: (0, _classnames.default)('expansion-icon', expandCls),
onClick: clickArea === 'icon' ? onClick : undefined
}), content);
};
const getCellProps = (value, row, rowIndex) => {
if (row[rowDetailMetaKey]) {
return {
style: {
'--cell-padding': '0',
overflow: 'hidden',
...opts.detailCellStyle
}
};
}
const prevProps = firstCol.getCellProps?.(value, row, rowIndex);
if (!hasDetail(row, rowIndex)) {
return prevProps;
}
return (0, _utils.mergeCellProps)(prevProps, {
onClick(e) {
if (opts.stopClickEventPropagation) {
e.stopPropagation();
}
toggle(row[primaryKey]);
},
style: {
cursor: 'pointer'
}
});
};
return [{
...firstCol,
title: /*#__PURE__*/_react.default.createElement("div", {
style: {
display: 'inline-block',
marginLeft: textOffset
}
}, _internals.internals.safeRenderHeader(firstCol)),
render,
getCellProps: clickArea === 'cell' ? getCellProps : firstCol.getCellProps,
getSpanRect(value, row, rowIndex) {
if (row[rowDetailMetaKey]) {
// detail 总是成一行
return {
top: rowIndex,
bottom: rowIndex + 1,
left: 0,
right: columnFlatCount
};
}
}
}, ...others];
}
};
}