UNPKG

@antv/s2

Version:

effective spreadsheet render core lib

126 lines 5.94 kB
import { EMPTY_FIELD_VALUE, EXTRA_FIELD } from '../../common/constant'; import { i18n } from '../../common/i18n'; import { layoutHierarchy } from '../../facet/layout/layout-hooks'; import { Node } from '../../facet/layout/node'; import { TotalClass } from '../../facet/layout/total-class'; import { TotalMeasure } from '../../facet/layout/total-measure'; import { generateId, resolveNillString } from '../../utils/layout/generate-id'; import { whetherLeafByLevel } from './whether-leaf-by-level'; // eslint-disable-next-line max-lines-per-function export const generateHeaderNodes = (params) => { var _a, _b; const { currentField, fields, fieldValues, hierarchy, parentNode, level, query, addMeasureInTotalQuery, addTotalMeasureInTotal, spreadsheet, handler, } = params; const isTableMode = spreadsheet.isTableMode(); for (const [index, originalFieldValue] of fieldValues.entries()) { const fieldValue = resolveNillString(originalFieldValue); const isTotals = TotalClass.isTotalClassInstance(fieldValue); const isTotalMeasure = TotalMeasure.isTotalMeasureInstance(fieldValue); let value; let nodeQuery; let isLeaf = false; let isGrandTotals = false; let isSubTotals = false; let isTotalRoot = false; let adjustedField = currentField; if (isTotals) { isGrandTotals = fieldValue.isGrandTotals; isSubTotals = fieldValue.isSubTotals; isTotalRoot = fieldValue.isTotalRoot; value = i18n(fieldValue.label); if (isTotalRoot) { nodeQuery = Object.assign({}, query); } else { // root[&]四川[&]总计 => {province: '四川'} nodeQuery = Object.assign(Object.assign({}, query), { [currentField]: value }); } if (addMeasureInTotalQuery) { // root[&]四川[&]总计 => {province: '四川', EXTRA_FIELD: 'price'} nodeQuery[EXTRA_FIELD] = (_a = spreadsheet === null || spreadsheet === void 0 ? void 0 : spreadsheet.dataSet) === null || _a === void 0 ? void 0 : _a.fields.values[0]; } isLeaf = whetherLeafByLevel({ spreadsheet, level, fields }); } else if (isTotalMeasure) { value = i18n(fieldValue.label); // root[&]四川[&]总计[&]price => {province: '四川',EXTRA_FIELD: 'price' } nodeQuery = Object.assign(Object.assign({}, query), { [EXTRA_FIELD]: value }); adjustedField = EXTRA_FIELD; isGrandTotals = parentNode.isGrandTotals; isSubTotals = parentNode.isSubTotals; isLeaf = whetherLeafByLevel({ spreadsheet, level, fields }); } else if (isTableMode) { value = fieldValue; adjustedField = fields[index]; nodeQuery = Object.assign(Object.assign({}, query), { [adjustedField]: value }); isLeaf = true; } else { value = fieldValue; // root[&]四川[&]成都 => {province: '四川', city: '成都' } // 子维度的维值为空时, 使用父级节点的 query, 避免查询不到数据 nodeQuery = value === EMPTY_FIELD_VALUE ? Object.assign({}, query) : Object.assign(Object.assign({}, query), { [currentField]: value }); isLeaf = whetherLeafByLevel({ spreadsheet, level, fields }); } // 明细表使用 field 生成 id, 保证唯一性, 避免同名的情况 const displayField = isTableMode ? adjustedField : value; const nodeId = generateId(parentNode.id, displayField); if (!nodeId) { return; } const isCollapsed = false; // create new header nodes const node = new Node({ id: nodeId, value, level, field: adjustedField, parent: parentNode, isTotals: isTotals || isTotalMeasure, isGrandTotals, isSubTotals, isTotalMeasure, isCollapsed, isTotalRoot, hierarchy, query: nodeQuery, spreadsheet, isLeaf: isLeaf || isCollapsed, }); const expandCurrentNode = layoutHierarchy(spreadsheet, parentNode, node, hierarchy); // 如果当前是隐藏节点, 给其父节点挂载相应信息 (兄弟节点, 当前哪个子节点隐藏了), 这样在 facet 层可以直接使用, 不用每次都去遍历 const hiddenColumnsInfo = (_b = spreadsheet === null || spreadsheet === void 0 ? void 0 : spreadsheet.facet) === null || _b === void 0 ? void 0 : _b.getHiddenColumnsInfo(node); // omit the the whole column or row of the grandTotal or subTotals if (level > hierarchy.maxLevel && !isGrandTotals && !parentNode.isGrandTotals && !parentNode.isSubTotals && !node.isSubTotals && !hiddenColumnsInfo) { hierarchy.sampleNodesForAllLevels.push(node); hierarchy.maxLevel = level; // 如果当前是隐藏节点, 则采样其兄弟节点 hierarchy.sampleNodeForLastLevel = node; } const isLeafNode = isLeaf || isCollapsed || !expandCurrentNode; if (isLeafNode) { node.isLeaf = true; hierarchy.pushIndexNode(node); node.rowIndex = hierarchy.getIndexNodes().length - 1; } else { handler === null || handler === void 0 ? void 0 : handler({ addTotalMeasureInTotal, addMeasureInTotalQuery, parentNode: node, currentField: fields[level + 1], fields, hierarchy, spreadsheet, }); } } }; //# sourceMappingURL=generate-header-nodes.js.map