@antv/s2
Version:
effective spreadsheet render core lib
126 lines • 5.94 kB
JavaScript
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