@antv/s2
Version:
effective spreadsheet render core lib
104 lines • 4.59 kB
JavaScript
import { isEmpty } from 'lodash';
import { EMPTY_FIELD_VALUE, EXTRA_FIELD } from '../../common/constant';
import { filterOutDetail } from '../../utils/data-set-operate';
import { addTotals } from '../../utils/layout/add-totals';
import { generateHeaderNodes } from '../../utils/layout/generate-header-nodes';
import { getDimsCondition } from '../../utils/layout/get-dims-condition-by-node';
import { whetherLeafByLevel } from '../../utils/layout/whether-leaf-by-level';
import { layoutArrange } from '../layout/layout-hooks';
import { TotalMeasure } from '../layout/total-measure';
import { TotalClass } from './total-class';
const buildTotalGridHierarchy = (params) => {
const { addTotalMeasureInTotal, parentNode, currentField, fields, hierarchy, spreadsheet, } = params;
const index = fields.indexOf(currentField);
const dataSet = spreadsheet.dataSet;
const { values = [] } = dataSet.fields;
const fieldValues = [];
let query = {};
const totalsConfig = spreadsheet.getTotalsConfig(currentField);
const defaultDimensionGroup = parentNode.isGrandTotals
? totalsConfig.grandTotalsGroupDimensions || []
: totalsConfig.subTotalsGroupDimensions || [];
const dimensionGroup = !dataSet.isEmpty() ? defaultDimensionGroup : [];
if (dimensionGroup === null || dimensionGroup === void 0 ? void 0 : dimensionGroup.includes(currentField)) {
query = getDimsCondition(parentNode);
const dimValues = dataSet.getDimensionValues(currentField, query);
fieldValues.push(...(dimValues || []).map((value) => new TotalClass({
label: value,
isSubTotals: parentNode.isSubTotals,
isGrandTotals: parentNode.isGrandTotals,
isTotalRoot: false,
})));
if (isEmpty(fieldValues) && currentField) {
fieldValues.push(EMPTY_FIELD_VALUE);
}
}
else if (addTotalMeasureInTotal && currentField === EXTRA_FIELD) {
// add total measures
query = getDimsCondition(parentNode);
fieldValues.push(...values.map((v) => new TotalMeasure(v)));
}
else if (whetherLeafByLevel({ spreadsheet, level: index, fields })) {
// 如果最后一级没有分组维度,则将上一个结点设为叶子节点
parentNode.isLeaf = true;
hierarchy.pushIndexNode(parentNode);
parentNode.rowIndex = hierarchy.getIndexNodes().length - 1;
return;
}
else {
// 如果是空维度,则跳转到下一级 level
buildTotalGridHierarchy(Object.assign(Object.assign({}, params), { currentField: fields[index + 1] }));
return;
}
const displayFieldValues = filterOutDetail(fieldValues);
generateHeaderNodes(Object.assign(Object.assign({}, params), { fieldValues: displayFieldValues, level: index, parentNode,
query,
// eslint-disable-next-line @typescript-eslint/no-use-before-define
handler: buildGridHierarchy }));
};
const buildNormalGridHierarchy = (params) => {
const { parentNode, currentField, fields, spreadsheet } = params;
const dataSet = spreadsheet.dataSet;
const { values = [] } = dataSet.fields;
const index = fields.indexOf(currentField);
const fieldValues = [];
let query = {};
// field(dimension)'s all values
query = getDimsCondition(parentNode, true);
const dimValues = dataSet.getDimensionValues(currentField, query);
const arrangedValues = layoutArrange(spreadsheet, dimValues, parentNode, currentField);
fieldValues.push(...(arrangedValues || []));
// add skeleton for empty data
if (isEmpty(fieldValues) && currentField) {
if (currentField === EXTRA_FIELD) {
fieldValues.push(...values);
}
else {
fieldValues.push(EMPTY_FIELD_VALUE);
}
}
addTotals({
currentField,
lastField: fields[index - 1],
isFirstField: index === 0,
fieldValues,
spreadsheet,
});
const displayFieldValues = filterOutDetail(fieldValues);
generateHeaderNodes(Object.assign(Object.assign({}, params), { fieldValues: displayFieldValues, level: index, parentNode,
query,
// eslint-disable-next-line @typescript-eslint/no-use-before-define
handler: buildGridHierarchy }));
};
/**
* Build grid hierarchy in rows or columns
*/
export function buildGridHierarchy(params) {
if (params.parentNode.isTotals) {
buildTotalGridHierarchy(params);
}
else {
buildNormalGridHierarchy(params);
}
}
//# sourceMappingURL=build-gird-hierarchy.js.map