es-grid-template
Version:
es-grid-template
202 lines (196 loc) • 7.07 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.treeMetaSymbol = void 0;
exports.treeMode = treeMode;
var _classnames = _interopRequireDefault(require("classnames"));
var _react = _interopRequireDefault(require("react"));
var _commonViews = require("../../common-views");
var _internals = require("../../internals");
var _utils = require("../../utils");
var _utils2 = require("../../../table-component/hook/utils");
const treeMetaSymbol = exports.treeMetaSymbol = Symbol('treeMetaSymbol');
function treeMode(opts = {}) {
return function treeModeStep(pipeline) {
const stateKey = 'treeMode';
const ctx = pipeline.ctx;
const expandIconColumnIndex = opts.expandIconColumnIndex ?? 0;
const isTreeArray = opts.isTreeArray;
const primaryKey = pipeline.ensurePrimaryKey('treeMode');
if (typeof primaryKey !== 'string') {
throw new Error('treeMode Only strings are supported primaryKey');
}
const openKeys = opts.openKeys ?? pipeline.getStateAtKey(stateKey) ?? opts.defaultOpenKeys ?? [];
const openKeySet = new Set(openKeys);
const onChangeOpenKeys = (nextKeys, key, action) => {
opts.onChangeOpenKeys?.(nextKeys, key, action);
pipeline.setStateAtKey(stateKey, nextKeys, {
key,
action
});
};
const toggle = rowKey => {
const expanded = openKeySet.has(rowKey);
if (expanded) {
onChangeOpenKeys(openKeys.filter(key => key !== rowKey), rowKey, 'collapse');
} else {
onChangeOpenKeys([...openKeys, rowKey], rowKey, 'expand');
}
};
const isLeafNode = opts.isLeafNode ?? _utils.isLeafNode;
const clickArea = opts.clickArea ?? 'cell';
const treeMetaKey = opts.treeMetaKey ?? treeMetaSymbol;
const stopClickEventPropagation = Boolean(opts.stopClickEventPropagation);
// indents
const iconWidth = ctx.indents.iconWidth;
const iconIndent = opts.iconIndent ?? ctx.indents.iconIndent;
const iconGap = opts.iconGap ?? ctx.indents.iconGap;
const indentSize = opts.indentSize ?? ctx.indents.indentSize;
return pipeline.mapDataSource(processDataSource).mapColumns(processColumns);
function processDataSource(input) {
const result = [];
dfs(input, 0);
function dfs(nodes, depth) {
if (nodes == null) {
return;
}
for (const node of nodes) {
const rowKey = node[primaryKey];
const expanded = openKeySet.has(rowKey);
const isLeaf = isLeafNode(node, {
depth,
expanded,
rowKey
});
const treeMeta = {
depth,
isLeaf,
expanded,
rowKey
};
result.push({
[treeMetaKey]: treeMeta,
...node
});
if (!isLeaf && expanded) {
dfs(node.children, depth + 1);
}
}
}
return result;
}
function processColumns(columns) {
if (columns.length === 0) {
return columns;
}
// const [firstCol, ...others] = columns
const flatColumns = (0, _utils2.flatColumnsWithoutParent)(columns);
const firstCol = flatColumns[expandIconColumnIndex];
// const template = (value: any, record: any, recordIndex: number) => {
const template = args => {
const {
rowData: record,
index: recordIndex
} = args;
const content = _internals.internals.safeRender(firstCol, record, recordIndex);
if (record[treeMetaKey] == null) {
return content;
}
if (!isTreeArray) {
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, content);
}
const {
rowKey,
depth,
isLeaf,
expanded
} = record[treeMetaKey];
const indent = iconIndent + depth * indentSize;
if (isLeaf) {
return /*#__PURE__*/_react.default.createElement(_commonViews.InlineFlexCell, {
className: "expansion-cell leaf"
}, /*#__PURE__*/_react.default.createElement("span", {
className: "expansion-content",
style: {
marginLeft: indent + iconWidth + iconGap
}
}, content));
}
const onClick = e => {
if (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, {
className: (0, _classnames.default)('expansion-icon', expandCls),
style: {
cursor: clickArea === 'icon' ? 'pointer' : undefined,
marginLeft: indent,
marginRight: iconGap
},
onClick: clickArea === 'icon' ? onClick : undefined
}), /*#__PURE__*/_react.default.createElement("span", {
className: "expansion-content"
}, content));
};
const getCellProps = (value, record, rowIndex) => {
const prevProps = _internals.internals.safeGetCellProps(firstCol, record, rowIndex);
if (record[treeMetaKey] == null) {
return prevProps;
}
const {
isLeaf,
rowKey
} = record[treeMetaKey];
if (isLeaf) {
return prevProps;
}
return (0, _utils.mergeCellProps)(prevProps, {
onClick(e) {
if (stopClickEventPropagation) {
e.stopPropagation();
}
toggle(rowKey);
},
style: {
cursor: 'pointer'
}
});
};
const newExpandColumn = {
...firstCol,
title: /*#__PURE__*/_react.default.createElement("span", {
className: "ui-rc-table-column-title",
style: {
marginLeft: iconIndent + iconWidth + iconGap
}
}, _internals.internals.safeRenderHeader(firstCol)),
template,
getCellProps: clickArea === 'cell' ? getCellProps : firstCol.getCellProps
};
const newColumns = (0, _utils2.updateArrayByKey)(columns, newExpandColumn, 'field');
return newColumns;
// return [
// {
// ...firstCol,
// title: (
// <span style={{ marginLeft: iconIndent + iconWidth + iconGap }}>{internals.safeRenderHeader(firstCol)}</span>
// ),
// render,
// getCellProps: clickArea === 'cell' ? getCellProps : firstCol.getCellProps,
// },
// ...others,
// ]
}
};
}