@antv/s2
Version:
effective spreadsheet render core lib
198 lines • 8.96 kB
JavaScript
/* eslint-disable import/order */
// eslint-disable-next-line prettier/prettier
import { compact, find, get, identity, isArray, isEmpty, isNil, isString, map, max, memoize, min, } from 'lodash';
import { CellType, SERIES_NUMBER_FIELD } from '../common';
import { getValueRangeState, setValueRangeState, } from '../utils/condition/state-controller';
import { generateExtraFieldMeta } from '../utils/dataset/pivot-data-set';
import { getDisplayText, getEmptyPlaceholder, replaceEmptyFieldValue, } from '../utils/text';
export class BaseDataSet {
constructor(spreadsheet) {
/**
* 单元格所对应格式化后的值(用于编辑表)
*/
this.displayFormattedValueMap = new Map();
/**
* 获取字段
*/
this.getField = (field) => {
const realField = isString(field) ? field : field === null || field === void 0 ? void 0 : field.field;
return realField || field;
};
/**
* 获取字段信息
*/
this.getFieldMeta = memoize((field, meta) => {
const realField = this.getField(field);
return find(this.meta || meta, ({ field: currentField }) => {
if (currentField instanceof RegExp) {
return currentField.test(realField);
}
if (isArray(currentField)) {
return currentField.includes(realField);
}
return currentField === realField;
});
});
/**
* 获取自定义单元格字段描述
* @param cell
*/
this.getCustomFieldDescription = (cell) => {
var _a, _b;
if (!cell) {
return;
}
const meta = (_a = cell.getMeta) === null || _a === void 0 ? void 0 : _a.call(cell);
if (meta === null || meta === void 0 ? void 0 : meta.isTotals) {
return;
}
// 数值单元格
if (cell.cellType === CellType.DATA_CELL) {
const currentMeta = find(meta === null || meta === void 0 ? void 0 : meta.spreadsheet.dataCfg.meta, {
field: (meta === null || meta === void 0 ? void 0 : meta.field) || (meta === null || meta === void 0 ? void 0 : meta.value) || (meta === null || meta === void 0 ? void 0 : meta.valueField),
});
return this.getFieldDescription(currentMeta === null || currentMeta === void 0 ? void 0 : currentMeta.field);
}
// 行/列头单元格, 取节点本身描述
return (((_b = meta === null || meta === void 0 ? void 0 : meta.extra) === null || _b === void 0 ? void 0 : _b['description']) ||
this.getFieldDescription(meta === null || meta === void 0 ? void 0 : meta.field));
};
this.spreadsheet = spreadsheet;
}
/**
* 获取字段名称
* @param field
*/
getFieldName(field, defaultValue) {
var _a, _b, _c, _d;
if (field === SERIES_NUMBER_FIELD) {
return (_a = this.spreadsheet) === null || _a === void 0 ? void 0 : _a.getSeriesNumberText();
}
const realField = this.getField(field);
let headerNode;
if ((_b = this.spreadsheet) === null || _b === void 0 ? void 0 : _b.isCustomHeaderFields()) {
// 兼容自定义行列头场景
headerNode = (_d = (_c = this.spreadsheet) === null || _c === void 0 ? void 0 : _c.facet) === null || _d === void 0 ? void 0 : _d.getHeaderNodes().find((node) => {
var _a;
return node.field === realField && ((_a = node === null || node === void 0 ? void 0 : node.extra) === null || _a === void 0 ? void 0 : _a.isCustomNode);
});
}
const realDefaultValue = (headerNode === null || headerNode === void 0 ? void 0 : headerNode.value) ||
(isString(field) ? field : field === null || field === void 0 ? void 0 : field.title) ||
field;
return get(this.getFieldMeta(realField, this.meta), 'name', replaceEmptyFieldValue(defaultValue !== null && defaultValue !== void 0 ? defaultValue : realDefaultValue));
}
/**
* 获取自定义单元格字段名称
* @param cell
*/
getCustomRowFieldName(cell) {
var _a;
if (!cell) {
return;
}
const meta = (_a = cell.getMeta) === null || _a === void 0 ? void 0 : _a.call(cell);
// 数值单元格, 根据 rowIndex 匹配所对应的行头单元格名字
if (cell.cellType === CellType.DATA_CELL) {
const rowNode = this.spreadsheet.facet.getRowNodeByIndex(meta === null || meta === void 0 ? void 0 : meta.rowIndex);
return ((rowNode === null || rowNode === void 0 ? void 0 : rowNode.value) || this.getFieldName(rowNode === null || rowNode === void 0 ? void 0 : rowNode.field));
}
// 行/列头单元格, 取节点本身标题
return ((meta === null || meta === void 0 ? void 0 : meta.value) ||
this.getFieldName(meta === null || meta === void 0 ? void 0 : meta.field));
}
/**
* 获得字段格式化方法
* @param field
*/
getFieldFormatter(field) {
const realField = this.getField(field);
const formatter = get(this.getFieldMeta(realField, this.meta), 'formatter', identity);
// 如果格式化后的值是空,则兜底占位符, 保证导出结果和表格一致: https://github.com/antvis/S2/issues/2808
return (value, data, meta) => {
var _a, _b;
const placeholder = getEmptyPlaceholder(meta, (_b = (_a = this.spreadsheet) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.placeholder);
return getDisplayText(formatter === null || formatter === void 0 ? void 0 : formatter(value, data, meta), placeholder);
};
}
/**
* 获得字段描述
* @param field
*/
getFieldDescription(field) {
const realField = this.getField(field);
return get(this.getFieldMeta(realField, this.meta), 'description');
}
/**
* 设置数据配置
* @param dataCfg
*/
setDataCfg(dataCfg) {
var _a, _b, _c;
(_c = (_b = (_a = this.getFieldMeta) === null || _a === void 0 ? void 0 : _a.cache) === null || _b === void 0 ? void 0 : _b.clear) === null || _c === void 0 ? void 0 : _c.call(_b);
const { fields, meta, data, sortParams, filterParams } = this.processDataCfg(dataCfg);
this.fields = fields;
this.meta = meta;
this.originData = data;
this.sortParams = sortParams;
this.filterParams = filterParams;
this.displayData = this.originData;
this.indexesData = {};
}
/**
* 添加 (角头/数值虚拟字段) 格式化信息
*/
processMeta(meta = [], defaultExtraFieldText) {
var _a, _b;
const newMeta = [
...meta,
generateExtraFieldMeta(meta, (_b = (_a = this.spreadsheet) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.cornerExtraFieldText, defaultExtraFieldText),
];
return newMeta;
}
getDisplayDataSet() {
return this.displayData || [];
}
isEmpty() {
return isEmpty(this.getDisplayDataSet());
}
// https://github.com/antvis/S2/issues/2255
getEmptyViewIndexes() {
return [];
}
/**
* 获取 field 的取值范围
* ! 取值范围是以传入的 data 作为的值做计算
* ! 没有考虑总计、小计的情况,如果存在总计、小计,但是 data 里面并没有传,这里计算出来的范围就会不准确
* ! 表格会采用计算明细数据得出,而这些计算出来的总计、小计是和布局结构强相关
* ! 而要根据 totals 配置来覆盖所有情况,场景非常复杂
* @param field values 中的具体数值字段
* @returns 对应 field 的取值范围
*/
getValueRangeByField(field) {
const cacheRange = getValueRangeState(this.spreadsheet, field);
if (cacheRange) {
return cacheRange;
}
const fieldValues = compact(map(this.originData, (item) => {
const value = item[field];
return isNil(value) ? null : Number.parseFloat(value);
}));
const range = {
maxValue: max(fieldValues),
minValue: min(fieldValues),
};
setValueRangeState(this.spreadsheet, {
[field]: range,
});
return range;
}
/**
* 是否超过 1 个数值
*/
moreThanOneValue() {
var _a, _b;
return ((_b = (_a = this.fields) === null || _a === void 0 ? void 0 : _a.values) === null || _b === void 0 ? void 0 : _b.length) > 1;
}
}
//# sourceMappingURL=base-data-set.js.map