UNPKG

es-grid-template

Version:

es-grid-template

202 lines (196 loc) 7.07 kB
"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, // ] } }; }