import { TreeContext } from 'valor-app-utils'; import { FormulaManagerConfig as FormulaManagerConfig_ } from './formula-manager/index.data'; import { getQueries } from './SpreadSheetProvider/helper'; export type ID = number | string; export type IRowType = 'header' | 'body' | 'footer'; export type IDimension = { width: number; height: number; left: number; top: number; offsetWidth: number; offsetHeight: number; offsetLeft: number; offsetTop: number; }; export interface NumericFormat { // 显示小数位数 decimalLength?: number; // 比如10000, 如果scale=0.0001, 则显示 10000* scale = 1 scale?: number; // 是否显示零值 zeroValue?: boolean; // 是否显示百分比 percent?: boolean; // 是否显示千分位分隔符 showThousandsSeparator?: boolean; } export type ICellType = 'text' | 'numeric' | 'row-no' | string; export type ICellNN = { id: ID; // 初始化时由程序填入 rowId?: ID; // 初始化时由程序填入 i?: number; // 初始化时由程序填入 j?: number; colspan?: number; rowspan?: number; style?: React.CSSProperties; format?: NumericFormat; value?: any; type?: ICellType; // 数据类型 , 如number/string等 dataType?: string; locked?: boolean; // 是否延迟计算 ? 如果为 true, 则只有 recalculate(force=true)时才计算 // 避免象比例这样的单元格全局刷新 delay?: boolean; meta?: any; formula?: string; formulaDisabled?: boolean; error?: string | null; // 公式计算错误, 如 #DIV/0! }; export type ICell = ICellNN | null; export type IColumnWithCells = IColumn & { cells: ICell[]; }; export type IRow = { id: ID; type?: IRowType; // 例如:一个sheet中, 上半部分是flatten, 下半部分是tree area?: 'tree' | 'flatten'; meta?: any; sealed?: boolean; // 如果为true, 表示不可插入下级, 主要用于 预置的一级节点 level?: number; // 初始化时由程序填入 i?: number; style?: React.CSSProperties; // 如果cell有rowspan/colspan, 则用null补白 cellIds?: (ID | null)[]; // 工程建设费的2-5列, 由外部提供 ( 暂不用 ) // checkableList?: ID[]; // 外部对象, 包含: 例如 从外部传入的 sourceId additions?: any; // 如果为undefined, 则默认为 auto, height?: number; }; export type IColumn = { // 初始化时由程序填入 id?: ID; // 初始化时由程序填入 j?: number; width: number; type?: ICellType; format?: NumericFormat; }; // selection export type ISelectionType = 'row' | 'cell' | 'column'; // as matrix export type ISize = { rowCount: number; colCount: number; }; export type IRowDimensions = { // top仅考虑折叠 // offsetTop/offsetHeight用于容器内的显示(考虑折叠 + 不显示(适用于懒加载)) // height: 始终为正确的height // offsetHeight: 如果不显示, 则为0 [rowId: string]: { top: number; height: number; offsetTop: number; offsetHeight: number }; }; export type IColDimensions = { // left仅考虑折叠 // offsetLeft/offsetHeight用于容器内的显示(考虑折叠 + 不显示(适用于懒加载)) [colId: string]: { left: number; width: number; offsetLeft: number; offsetWidth: number }; }; export type ISelection = { selectionType: ISelectionType | null; selectedRowRange: [ID, ID]; selectedCellRange: [ID, ID]; selectedColumnRange: [ID, ID]; }; // 用于单元格命名, 用途示例: 用于显示 "1号楼.建筑费" export interface IBodyCellNamePolicy { // 1号楼, 在第1列 rowNameJ: number; // 比如 第1行的 title, 在 第2列 读取 // [编号, 细项名, 建筑费, 安装费, ...] colNames: Record; // {3:'小计', 4:'合计'} } // store export type IStoreState = { // 如果是test环境, 则象flatingRect的getSelectedDimension无需执行 ( 否则会报错,无法测试 ) env?: 'test'; id: ID; // 用于表示普通单元格: string // 用于表示合并单元格: [string, string[]] => ['x', ['x1,', 'x2']] columns: IColumn[]; rows: IRow[]; cells: { [id: string]: ICellNN }; // 比如 A1 单元格的 title = '测试.小计' // 暂时放在这里, 后面可能通过重构删除 bodyCellNamePolicy?: IBodyCellNamePolicy; // 用于表示树形 treeContext: TreeContext; usage: EditorUsage; // sheet处于编辑状态, 还是查看状态 mode: any; // 当且仅当单元格为单选时, isActiving才可能为true isActiving: boolean; collapsedRowIds: ID[]; // A1->[A2,A3], 表示 1 修改, 将引起2与3修改 ( 注意与parse出来的结果是相反的 ) cellDeps: Record; // k -> [A1, A2], 表示外部参数k将影响 A1与A2的值 varDeps: Record; // 外部变量, 用于给单元格提供统一的参数 variables: Record; // 高亮单元格, 暂时仅用到 公式单元格高亮显示 highlightedCells: { id: ID; color: string }[]; // 是否懒加载 ( 可能取消 ) lazyLoad?: boolean; // 表示在哪个位置冻结 // {i:-1, j:0}: 冻结第1列 // {i:0, j: -1}: 冻结第1行 // {i:-1, j:-1} | undefined: 不冻结 freezeAt: { i: number; j: number }; scrollX: number; scrollY: number; // 行的top和height rowDimensions: IRowDimensions; // 列的left和width colDimensions: IColDimensions; // 容器的width / height, 用于计算滚动条尺寸 containerBox: { w: number; h: number }; // sheet留白 padding: { bottom: number; right: number }; // 例如滚动一格, 此时: 1. 重绘table; 2. 计算colDimensions/rowDimensions // 在第1步, 表格显示正常, 但 selected位置是错的, 因其依赖于colDimensions/rowDimensions // 这会造成 Selected 位置闪动, presentCell也一样 readyDimensions?: boolean; } & ISelection; export type EditorUsage = 'editor' | 'cell-picker' | 'row-picker'; export type FormulaManagerConfig = FormulaManagerConfig_; export type SheetQueries = ReturnType;