UNPKG

@antv/s2

Version:

effective spreadsheet render core lib

403 lines (399 loc) 12.2 kB
import type { FederatedPointerEvent as Event, PointLike } from '@antv/g'; import type { DataCell, MergedCell, TableDataCell } from '../../cell'; import type { CustomTreeNode, Data, IconPosition, RawData, ResizeInfo, SimpleData } from '../../common/interface'; import type { FrameConfig } from '../../common/interface/frame'; import type { Query } from '../../data-set'; import type { CellData } from '../../data-set/cell-data'; import type { BaseHeaderConfig, CornerHeader, Frame } from '../../facet/header'; import type { Node } from '../../facet/layout/node'; import type { SpreadSheet } from '../../sheet-type'; import type { CellType } from '../constant'; import type { S2CellType } from './interaction'; import type { CustomRendererConfig } from './renderer'; import type { DataItem } from './s2DataConfig'; export type { GetCellMeta, LayoutResult } from './facet'; /** * 第二个参数在以下情况会传入: * 1. data cell 格式化 * 2. copy/export * 3. tooltip, 且仅在选择多个单元格时,data 类型为数组 */ export type Formatter = (value: DataItem, data?: DataItem | ViewMetaData | ViewMetaData[], meta?: Node | ViewMeta | null | undefined) => SimpleData; export interface FormatResult { formattedValue: SimpleData; value: DataItem; } export type SortMethod = 'ASC' | 'DESC' | 'NONE' | 'asc' | 'desc' | 'none'; export declare enum CellBorderPosition { TOP = "TOP", BOTTOM = "BOTTOM", LEFT = "LEFT", RIGHT = "RIGHT" } /** * 类似 background-clip 属性: https://developer.mozilla.org/en-US/docs/Web/CSS/background-clip * 分为三种类型: * borderBox: 整个 cell 的范围 * paddingBox: cell 去除 border 的范围 * contentBox: cell 去除 (border + padding) 的范围 * ------------------------------- * |b| padding | * |o| |---------------------| | * |r| | | | * |d| | | | * |e| |---------------------| | * |r| padding | * ------------------------------- * -------border-bottom----------- * ------------------------------- */ export declare enum CellClipBox { BORDER_BOX = "borderBox", PADDING_BOX = "paddingBox", CONTENT_BOX = "contentBox" } export interface Meta { /** * 字段名 * @example 1. 'city' 2. ['city', 'type'] 3. /^city/ */ field?: string | string[] | RegExp; /** * 字段名称 */ name?: string; /** * 字段描述 */ description?: string; /** * 格式化 * 数值字段:一般用于格式化数字单位 * 文本字段:一般用于做字段枚举值的别名 * @see https://s2.antv.antgroup.com/manual/basic/formatter */ formatter?: Formatter; /** 渲染器配置 */ renderer?: CustomRendererConfig; } export type CustomHeaderField = CustomTreeNode | string; export type CustomHeaderFields = CustomHeaderField[]; export interface BaseFields { /** 行头字段 */ rows?: CustomHeaderFields; /** 列头字段 */ columns?: CustomHeaderFields; /** 数值字段 */ values?: string[]; /** 数值是否置于列头 (透视表有效) */ valueInCols?: boolean; } export interface Fields extends BaseFields { /** * 自定义指标维度在行列头中的层级顺序 (即 `values` 的 顺序,从 `0` 开始 */ customValueOrder?: number | null; } export declare enum Aggregation { SUM = "SUM", MIN = "MIN", MAX = "MAX", AVG = "AVG", COUNT = "COUNT" } export interface CalcTotals { /** * 聚合方式 */ aggregation?: `${Aggregation}`; /** * 自定义计算汇总 * @see https://s2.antv.antgroup.com/examples/analysis/totals/#custom */ calcFunc?: (query: Query, data: CellData[], spreadsheet: SpreadSheet) => number; } export interface Total { /** * 是否显示总计 */ showGrandTotals?: boolean; /** * 是否显示小计 */ showSubTotals?: boolean | { /** 当子维度个数 <=1 时,仍然展示小计:默认 true */ always: boolean; }; /** * 自定义计算总计 */ calcGrandTotals?: CalcTotals; /** * 自定义计算小计 */ calcSubTotals?: CalcTotals; /** * 小计的汇总维度 * @example subTotalsDimensions: ['province'] */ subTotalsDimensions?: string[]; /** * 总计分组 * @example grandTotalsGroupDimensions: ['city'] */ grandTotalsGroupDimensions?: string[]; /** * 小计分组 * @example subTotalsGroupDimensions: ['city'] */ subTotalsGroupDimensions?: string[]; /** * 总计布局位置,默认是下或右 */ reverseGrandTotalsLayout?: boolean; /** * 小计布局位置,默认是下或右 */ reverseSubTotalsLayout?: boolean; /** * 总计展示名 * @default "总计" */ grandTotalsLabel?: string; /** * 小计展示名 * @default "小计" */ subTotalsLabel?: string; } export interface Totals { row?: Total; col?: Total; } export interface Sort { /** 字段 id */ sortFieldId: string; /** 排序方式 */ sortMethod?: SortMethod; /** 自定义排序 */ sortBy?: string[]; /** 按照数值字段排序 */ sortByMeasure?: string; /** 筛选条件,缩小排序范围 */ query?: Query; /** 组内排序用来显示icon */ type?: string; } export interface SortFuncParam extends Sort { data: Array<string | Record<string, any>> | undefined; } export interface SortParam extends Sort { /** 自定义排序 */ sortFunc?: (param: SortFuncParam) => Array<string | Record<string, any>>; } export interface FilterParam { filterKey: string; filteredValues?: unknown[]; customFilter?: (row: Query) => boolean; } export type SortParams = SortParam[]; export interface Pagination { /** 每页数量 */ pageSize: number; /** 当前页 (从 1 开始) */ current: number; /** 数据总条数 */ total?: number; } export interface CustomSVGIcon { /** * icon 名称 */ name: string; /** * @example 1、base64 * @example 2. svg本地文件 (兼容老方式, 可以改颜色) import Icon from 'path/to/xxx.svg' => { name: 'iconA', src: Icon } => { name: 'iconB', src: '<svg>...</svg>' } * @example 3. 线上支持的图片地址 (不支持改颜色) 带后缀: https://gw.alipayobjects.com/zos/antfincdn/gu1Fsz3fw0/filter%26sort_filter.svg 无后缀: https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*5nsESLuvc_EAAAAAAAAAAAAADmJ7AQ/original */ src: string; } export interface HeaderIconClickParams { name: string; meta: Node; event?: Event; } export type HeaderActionIconProps = HeaderIconClickParams; export interface HeaderIconHoverParams extends HeaderIconClickParams { hovering: boolean; } export interface HeaderActionIconOptions extends HeaderActionIconBaseOptions { fill?: string | null; name: string; x: number; y: number; isSortIcon?: boolean; } export type HeaderActionNameOptions = HeaderActionIconBaseOptions & { /** * icon 颜色配置 * @description 优先级: 单个 icon > 主题 icon 配置 > 文本颜色,null 则使用图标原有颜色 */ fill?: string | null; /** * icon 名称 */ name: string; /** * icon 相对文本的位置 * 可选: 'left' | 'right' */ position?: IconPosition; /** * 是否是条件格式的 icon */ isConditionIcon?: boolean; }; export type HeaderActionName = string | Omit<HeaderActionNameOptions, 'isConditionIcon'>; export interface HeaderActionIconBaseOptions { /** * 是否默认隐藏, 开启后 hover 后才显示, 关闭后则始终显示, 可根据当前单元格信息动态判断 * @example defaultHide: (meta, iconName) => meta.id === 'xxx' * @default false */ defaultHide?: boolean | ((meta: Node, iconName: string) => boolean); /** * 是否展示, 可根据当前单元格信息动态判断 * @example displayCondition: (meta, iconName) => !meta.isTotals */ displayCondition?: (meta: Node, iconName: string) => boolean; /** * 点击回调函数 */ onClick?: (headerIconClickParams: HeaderIconClickParams) => void; /** * 悬停回调函数 */ onHover?: (headerIconHoverParams: HeaderIconHoverParams) => void; } export interface HeaderActionIcon extends HeaderActionIconBaseOptions { /** * 内置 icon 或通过 @customSVGIcons 自定义的 icon 名称 * 如果是 string[], 则默认 icon 位置为右侧 * @see https://s2.antv.antgroup.com/manual/advanced/custom/custom-icon * @example icons: ['iconNameA', 'iconNameB'] * @example icons: [{ name: 'iconNameA', position: "left", fill: "red" }] */ icons: HeaderActionName[]; /** * 所属的 cell 类型, 即当前 icon 展示在哪种类型单元格中 * @example belongsCell: 'rowCell' */ belongsCell: Exclude<`${CellType}`, 'dataCell' | 'mergedCell' | 'seriesNumberCell'>; } export interface InternalFullyHeaderActionIcon extends HeaderActionIcon { icons: HeaderActionNameOptions[]; isSortIcon?: boolean; } export type CellCallbackParams<T extends BaseHeaderConfig = BaseHeaderConfig> = [ node: Node, spreadsheet: SpreadSheet, headerConfig: T ]; export type CellCallback<T extends Partial<BaseHeaderConfig>, K extends S2CellType> = (node: Node, spreadsheet: SpreadSheet, headerConfig: T) => K; export type DataCellCallback = (viewMeta: ViewMeta, spreadsheet: SpreadSheet) => DataCell | TableDataCell; export type MergedCellCallback = (spreadsheet: SpreadSheet, cells: DataCell[], meta?: ViewMeta) => MergedCell; export type FrameCallback = (cfg: FrameConfig) => Frame; export type CornerHeaderCallback = (cornerHeader: CornerHeader, spreadsheet: SpreadSheet, ...restOptions: unknown[]) => void; export interface MergedCellInfo { colIndex?: number; rowIndex?: number; showText?: boolean; } export type TempMergedCell = { cells: DataCell[]; viewMeta: ViewMeta; }; export type ViewMetaData = Data | CellData; export interface ViewMeta { /** 表格实例 */ spreadsheet: SpreadSheet; /** 数据唯一标识 */ id: string; /** x 坐标 */ x: number; /** y 坐标 */ y: number; /** 单元格宽度 */ width: number; /** 单元格高度 */ height: number; /** 单元格数据 */ data: ViewMetaData | undefined; /** 行索引 */ rowIndex: number; /** 列索引 */ colIndex: number; /** 数值字段, 对应 s2DataConfig.fields */ valueField: string; /** 数值 */ fieldValue: DataItem; /** 是否是汇总字段 */ isTotals?: boolean; /** 行查询条件 */ rowQuery?: Query; /** 列查询条件 */ colQuery?: Query; /** 行 id */ rowId?: string; /** 列 id */ colId?: string; /** 查询条件 */ query?: Query; /** 叶子节点 */ isLeaf?: boolean; /** 是否是浅渲染 */ shallowRender?: boolean; /** 其他字段 */ [key: string]: unknown; } export type ViewMetaIndexType = keyof Pick<ViewMeta, 'colIndex' | 'rowIndex'>; export interface CellAppendInfo<T = Node> extends Partial<Omit<ResizeInfo, 'meta'>> { isLinkFieldText?: boolean; meta?: T; } export type S2MountContainer = string | Element; export interface OriginalEvent extends Event { layerX: number; layerY: number; } export interface PartDrillDownDataCache { rowId: string; drillLevel: number; drillField: string; drillData: RawData[]; } export interface PartDrillDownFieldInLevel { drillField: string; drillLevel: number; } export interface TableSortParam extends SortParam { sortKey: string; } export interface GridInfo { cols: number[]; rows: number[]; } export interface Point extends PointLike { } export type RowData = Data | CellData[]; export interface ContentPositionParams { contentWidth?: number; }