diff --git a/common/changes/@visactor/vtable/2298-columnSeriesNumber_2025-06-10-11-51.json b/common/changes/@visactor/vtable/2298-columnSeriesNumber_2025-06-10-11-51.json
new file mode 100644
index 0000000000..43b2154912
--- /dev/null
+++ b/common/changes/@visactor/vtable/2298-columnSeriesNumber_2025-06-10-11-51.json
@@ -0,0 +1,11 @@
+{
+ "changes": [
+ {
+ "comment": "feat: add column series number #2298\n\n",
+ "type": "none",
+ "packageName": "@visactor/vtable"
+ }
+ ],
+ "packageName": "@visactor/vtable",
+ "email": "892739385@qq.com"
+}
\ No newline at end of file
diff --git a/docs/assets/option/en/common/gantt/grid.md b/docs/assets/option/en/common/gantt/grid.md
index 35e6e7f026..71d016985d 100644
--- a/docs/assets/option/en/common/gantt/grid.md
+++ b/docs/assets/option/en/common/gantt/grid.md
@@ -54,10 +54,17 @@ Requires setting different background colors horizontally by data rows.
Optional
-${prefix} verticalBackgroundColor(string)
+${prefix} verticalBackgroundColor(string|Function)
Requires setting different background colors vertically by date columns.
+```
+ /**
+ * need to set different background colors vertically by date columns
+ */
+ verticalBackgroundColor?: string[] | ((args: GridVerticalLineStyleArgumentType) => string);
+ ```
+
Optional
${prefix} verticalLine(ILineStyle | Function)
diff --git a/docs/assets/option/zh/common/gantt/grid.md b/docs/assets/option/zh/common/gantt/grid.md
index 25b311cbb5..04a6249e5e 100644
--- a/docs/assets/option/zh/common/gantt/grid.md
+++ b/docs/assets/option/zh/common/gantt/grid.md
@@ -56,10 +56,15 @@ ${prefix} horizontalBackgroundColor(string)
非必填
-${prefix} verticalBackgroundColor(string)
+${prefix} verticalBackgroundColor(string|Function)
需要纵向按日期列设置不同背景色
+```
+ /** 需要按日期列设置不同背景色 */
+ verticalBackgroundColor?: string[] | ((args: GridVerticalLineStyleArgumentType) => string);
+ ```
+
非必填
${prefix} verticalLine(ILineStyle | Function)
diff --git a/packages/vtable/examples/list/list-columnSeriesNumber.ts b/packages/vtable/examples/list/list-columnSeriesNumber.ts
new file mode 100644
index 0000000000..13a63cb2b7
--- /dev/null
+++ b/packages/vtable/examples/list/list-columnSeriesNumber.ts
@@ -0,0 +1,320 @@
+import * as VTable from '../../src';
+import { bindDebugTool } from '../../src/scenegraph/debug-tool';
+const CONTAINER_ID = 'vTable';
+VTable.register.icon('book', {
+ type: 'svg', //指定svg格式图标,其他还支持path,image,font
+ svg: ``,
+ width: 22,
+ height: 22,
+ // funcType: VTable.TYPES.IconFuncTypeEnum.sort,//对应内部特定功能的图标,目前有sort pin expand等
+ name: 'book', //定义图标的名称,在内部会作为缓存的key值
+ positionType: VTable.TYPES.IconPosition.contentLeft, // 指定位置,可以在文本的前后,或者在绝对定位在单元格的左侧右侧
+ marginLeft: 2, // 左侧内容间隔 在特定位置position中起作用
+ marginRight: 2, // 右侧内容间隔 在特定位置position中起作用
+ visibleTime: 'always', // 显示时机, 'always' | 'mouseover_cell' | 'click_cell'
+ hover: {
+ // 热区大小
+ width: 22,
+ height: 22,
+ bgColor: 'rgba(22,44,66,0.2)'
+ },
+ tooltip: {
+ title: '书籍',
+ placement: VTable.TYPES.Placement.left
+ }
+});
+
+function generateRandomString(length) {
+ let result = '';
+ const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
+ for (let i = 0; i < length; i++) {
+ result += characters.charAt(Math.floor(Math.random() * characters.length));
+ }
+ return result;
+}
+function generateRandomHobbies() {
+ const hobbies = [
+ 'Reading books',
+ 'Playing video games',
+ 'Watching movies',
+ 'Cooking',
+ 'Hiking',
+ 'Traveling',
+ 'Photography',
+ 'Playing musical instruments',
+ 'Gardening',
+ 'Painting',
+ 'Writing',
+ 'Swimming'
+ ];
+
+ const numHobbies = Math.floor(Math.random() * 3) + 1; // 生成 1-3 之间的随机整数
+ const selectedHobbies: string[] = [];
+
+ for (let i = 0; i < numHobbies; i++) {
+ const randomIndex = Math.floor(Math.random() * hobbies.length);
+ const hobby = hobbies[randomIndex];
+ selectedHobbies.push(hobby);
+ hobbies.splice(randomIndex, 1); // 确保每个爱好只选一次
+ }
+
+ return selectedHobbies.join(', ');
+}
+function generateRandomBirthday() {
+ const start = new Date('1970-01-01');
+ const end = new Date('2000-12-31');
+ const randomDate = new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime()));
+ const year = randomDate.getFullYear();
+ const month = randomDate.getMonth() + 1;
+ const day = randomDate.getDate();
+ return `${year}-${month < 10 ? '0' + month : month}-${day < 10 ? '0' + day : day}`;
+}
+function generateRandomPhoneNumber() {
+ const areaCode = [
+ '130',
+ '131',
+ '132',
+ '133',
+ '134',
+ '135',
+ '136',
+ '137',
+ '138',
+ '139',
+ '150',
+ '151',
+ '152',
+ '153',
+ '155',
+ '156',
+ '157',
+ '158',
+ '159',
+ '170',
+ '176',
+ '177',
+ '178',
+ '180',
+ '181',
+ '182',
+ '183',
+ '184',
+ '185',
+ '186',
+ '187',
+ '188',
+ '189'
+ ];
+ const prefix = areaCode[Math.floor(Math.random() * areaCode.length)];
+ const suffix = String(Math.random()).substr(2, 8);
+ return prefix + suffix;
+}
+const generatePersons = count => {
+ return Array.from(new Array(count)).map((_, i) => {
+ const first = generateRandomString(10);
+ const last = generateRandomString(4);
+ return {
+ id: i + 1,
+ email1: `${first}_${last}@xxx.com`,
+ name: first,
+ lastName: last,
+ hobbies: generateRandomHobbies(),
+ birthday: generateRandomBirthday(),
+ tel: generateRandomPhoneNumber(),
+ sex: Math.floor(Math.random() * 100) % 2 === 0 ? 'boy' : 'girl',
+ work: i % 2 === 0 ? 'back-end engineer' : 'front-end engineer',
+ city: 'beijing'
+ };
+ });
+};
+
+export function createTable() {
+ const records = generatePersons(10);
+ const columns: VTable.ColumnsDefine = [
+ {
+ field: 'sex',
+ title: 'sex',
+ width: 100,
+ mergeCell: true
+ },
+ {
+ field: 'email1',
+ title: 'email',
+ width: 250,
+ sort: true
+ },
+ {
+ title: 'Full name',
+ columns: [
+ {
+ field: 'name',
+ title: 'First Name',
+ width: 120
+ },
+ {
+ field: 'lastName',
+ title: 'Last Name',
+ width: 100
+ }
+ ]
+ },
+ {
+ field: 'hobbies',
+ title: 'hobbies',
+ width: 200
+ },
+ {
+ field: 'birthday',
+ title: 'birthday',
+ width: 120
+ },
+
+ {
+ field: 'tel',
+ title: 'telephone',
+ width: 150
+ },
+ {
+ field: 'work',
+ title: 'job',
+ width: 200
+ },
+ {
+ field: 'city',
+ title: 'city',
+ width: 150
+ }
+ ];
+ const option: VTable.TYPES.ListTableConstructorOptions = {
+ container: document.getElementById(CONTAINER_ID),
+ records,
+ columns,
+ // heightMode: 'autoHeight',
+ autoWrapText: false,
+ defaultHeaderRowHeight: 50,
+ defaultRowHeight: 28,
+ frozenColCount: 1,
+ keyboardOptions: {
+ copySelected: true
+ },
+ theme: {
+ headerStyle: {
+ bgColor: 'yellow',
+ frameStyle: {
+ borderLineWidth: 2,
+ borderColor: 'blue'
+ }
+ },
+ cornerHeaderStyle: {
+ frameStyle: {
+ borderLineWidth: 2,
+ borderColor: 'purple'
+ }
+ },
+ bodyStyle: {
+ frameStyle: {
+ borderLineWidth: 2,
+ borderColor: 'green'
+ }
+ },
+ frameStyle: {
+ borderLineWidth: 2,
+ borderColor: 'yellow'
+ }
+ },
+
+ // sortState: {
+ // field: 'email1',
+ // order: 'asc'
+ // },
+ // pagination: {
+ // perPageCount: 20,
+ // currentPage: 1
+ // },
+ dragOrder: {
+ // validateDragOrderOnEnd(source, target) {
+ // console.log(source, target);
+ // return true;
+ // },
+ dragHeaderMode: 'all'
+ },
+ // transpose: true,
+ columnSeriesNumber: {
+ height: 30,
+ style: {
+ color: 'black',
+ bgColor: 'gray'
+ }
+ },
+ rowSeriesNumber: {
+ title: 'fffff',
+ // field: 'sex',
+ dragOrder: true,
+ headerIcon: 'book',
+ width: 'auto',
+
+ headerStyle: {
+ color: 'black',
+ bgColor: 'pink'
+ },
+ style: {
+ color: 'red'
+ }
+ // customLayout: (args: any) => {
+ // const { table, row, col, rect } = args;
+ // const record = table.getRecordByCell(col, row);
+ // const { height, width } = rect ?? table.getCellRect(col, row);
+ // const container = new VTable.CustomLayout.Group({
+ // height,
+ // width,
+ // display: 'flex',
+ // flexDirection: 'row',
+ // flexWrap: 'nowrap'
+ // });
+ // const bloggerName = new VTable.CustomLayout.Text({
+ // text: 'ttttttt ffff',
+ // fontSize: 13,
+ // fontFamily: 'sans-serif',
+ // fill: 'black',
+ // marginLeft: 10
+ // });
+ // container.add(bloggerName);
+ // return {
+ // rootContainer: container,
+ // renderDefault: true
+ // };
+ // },
+ // headerCustomLayout: (args: any) => {
+ // const { table, row, col, rect } = args;
+ // const record = table.getRecordByCell(col, row);
+ // const { height, width } = rect ?? table.getCellRect(col, row);
+ // const container = new VTable.CustomLayout.Group({
+ // height,
+ // width,
+ // display: 'flex',
+ // flexDirection: 'row',
+ // flexWrap: 'nowrap'
+ // });
+ // const bloggerName = new VTable.CustomLayout.Text({
+ // text: 'ttttttt ffff',
+ // fontSize: 13,
+ // fontFamily: 'sans-serif',
+ // fill: 'black',
+ // marginLeft: 10
+ // });
+ // container.add(bloggerName);
+ // return {
+ // rootContainer: container,
+ // renderDefault: true
+ // };
+ // }
+ }
+ // bottomFrozenRowCount: 3
+ };
+ const tableInstance = new VTable.ListTable(option);
+ tableInstance.on('change_header_position', args => {
+ console.log('change_header_position');
+ });
+ window.tableInstance = tableInstance;
+ bindDebugTool(tableInstance.scenegraph.stage, { customGrapicKeys: ['col', 'row'] });
+}
diff --git a/packages/vtable/examples/list/list-transpose.ts b/packages/vtable/examples/list/list-transpose.ts
index a8c9daf049..a810d5405f 100644
--- a/packages/vtable/examples/list/list-transpose.ts
+++ b/packages/vtable/examples/list/list-transpose.ts
@@ -16,7 +16,7 @@ const generatePersons = count => {
};
export function createTable() {
- const records = generatePersons(1000);
+ const records = generatePersons(10);
const columns: VTable.ColumnsDefine = [
{
field: 'id',
@@ -72,6 +72,7 @@ export function createTable() {
transpose: true,
dragHeaderMode: 'all',
limitMinWidth: 20,
+ rowSeriesNumber: {},
theme: VTable.themes.DEFAULT.extends({
frameStyle: { borderLineWidth: 10 },
scrollStyle: {
diff --git a/packages/vtable/examples/menu.ts b/packages/vtable/examples/menu.ts
index f0ec529f21..a81df9e120 100644
--- a/packages/vtable/examples/menu.ts
+++ b/packages/vtable/examples/menu.ts
@@ -115,7 +115,10 @@ export const menus = [
path: 'list',
name: 'list-contextMenu-disabledMenu'
},
-
+ {
+ path: 'list',
+ name: 'list-columnSeriesNumber'
+ },
{
path: 'list',
name: 'list-rowSeriesNumber'
diff --git a/packages/vtable/src/ListTable.ts b/packages/vtable/src/ListTable.ts
index 7faab784f5..59251badb3 100644
--- a/packages/vtable/src/ListTable.ts
+++ b/packages/vtable/src/ListTable.ts
@@ -34,7 +34,7 @@ import * as editors from './edit/editors';
import { EditManager } from './edit/edit-manager';
import { computeColWidth } from './scenegraph/layout/compute-col-width';
import { computeRowHeight } from './scenegraph/layout/compute-row-height';
-import { defaultOrderFn } from './tools/util';
+import { defaultOrderFn, generateColumnNumber } from './tools/util';
import type { IEditor } from '@visactor/vtable-editors';
import type { ColumnData, ColumnDefine, HeaderData } from './ts-types/list-table/layout-map/api';
import { getCellRadioState, setCellRadioState } from './state/radio/radio';
@@ -309,9 +309,9 @@ export class ListTable extends BaseTable implements ListTableAPI {
}
}
const table = this;
- if (table.internalProps.layoutMap.isSeriesNumber(col, row)) {
- if (table.internalProps.layoutMap.isSeriesNumberInHeader(col, row)) {
- const { title } = table.internalProps.layoutMap.getSeriesNumberHeader(col, row);
+ if (table.internalProps.layoutMap.isRowSeriesNumber(col, row)) {
+ if (table.internalProps.layoutMap.isRowSeriesNumberInHeader(col, row)) {
+ const { title } = table.internalProps.layoutMap.getRowSeriesNumberHeader(col, row);
return title;
}
let value;
@@ -326,10 +326,15 @@ export class ListTable extends BaseTable implements ListTableAPI {
// const indexs = this.dataSource.currentIndexedData[row - this.columnHeaderLevelCount] as number[];
// value = indexs[indexs.length - 1] + 1;
} else {
- value = row - this.columnHeaderLevelCount + 1;
+ value = row - this.columnHeaderLevelCount - this.internalProps.layoutMap.columnSeriesNumberColumnCount + 1;
}
- const { format } = table.internalProps.layoutMap.getSeriesNumberBody(col, row);
+ const { format } = table.internalProps.layoutMap.getRowSeriesNumberBody(col, row);
return typeof format === 'function' ? format(col, row, this, value) : value;
+ } else if (table.internalProps.layoutMap.isColumnSeriesNumber(col, row)) {
+ const { format } = table.internalProps.layoutMap.getColumnSeriesNumber(col, row);
+ return typeof format === 'function'
+ ? format(col, row, this)
+ : generateColumnNumber(col - this.leftRowSeriesNumberCount);
} else if (table.internalProps.layoutMap.isHeader(col, row)) {
const { title } = table.internalProps.layoutMap.getHeader(col, row);
return typeof title === 'function' ? title() : title;
@@ -351,12 +356,12 @@ export class ListTable extends BaseTable implements ListTableAPI {
return null;
}
const table = this;
- if (table.internalProps.layoutMap.isSeriesNumber(col, row)) {
- if (table.internalProps.layoutMap.isSeriesNumberInHeader(col, row)) {
- const { title } = table.internalProps.layoutMap.getSeriesNumberHeader(col, row);
+ if (table.internalProps.layoutMap.isRowSeriesNumber(col, row)) {
+ if (table.internalProps.layoutMap.isRowSeriesNumberInHeader(col, row)) {
+ const { title } = table.internalProps.layoutMap.getRowSeriesNumberHeader(col, row);
return title;
}
- const { format } = table.internalProps.layoutMap.getSeriesNumberBody(col, row);
+ const { format } = table.internalProps.layoutMap.getRowSeriesNumberBody(col, row);
return typeof format === 'function' ? format(col, row, this) : row - this.columnHeaderLevelCount;
} else if (table.internalProps.layoutMap.isHeader(col, row)) {
const { title } = table.internalProps.layoutMap.getHeader(col, row);
@@ -469,7 +474,7 @@ export class ListTable extends BaseTable implements ListTableAPI {
if (!this.transpose) {
// 列上是否配置了禁止拖拽列宽的配置项disableColumnResize
const cellDefine = this.internalProps.layoutMap.getBody(col, this.columnHeaderLevelCount);
- const isSeriesNumber = this.internalProps.layoutMap.isSeriesNumber(col, row);
+ const isSeriesNumber = this.internalProps.layoutMap.isRowSeriesNumber(col, row);
if ((cellDefine as ColumnData)?.disableColumnResize) {
return false;
} else if (isSeriesNumber && this.internalProps.rowSeriesNumber.disableColumnResize === true) {
@@ -634,6 +639,7 @@ export class ListTable extends BaseTable implements ListTableAPI {
this.options.frozenColCount ?? 0
);
this.internalProps.frozenRowCount = this.options.frozenRowCount ?? 0;
+
if (table.bottomFrozenRowCount !== (this.options.bottomFrozenRowCount ?? 0)) {
table.bottomFrozenRowCount = this.options.bottomFrozenRowCount ?? 0;
}
@@ -642,10 +648,13 @@ export class ListTable extends BaseTable implements ListTableAPI {
}
} else {
table.colCount = layoutMap.colCount ?? 0;
- table.rowCount = layoutMap.recordsCount * layoutMap.bodyRowSpanCount + layoutMap.headerLevelCount;
+ table.rowCount = layoutMap.rowCount ?? 0;
// table.frozenColCount = table.options.frozenColCount ?? 0; //这里不要这样写 这个setter会检查扁头宽度 可能将frozenColCount置为0
this.internalProps.frozenColCount = this.options.frozenColCount ?? 0;
- table.frozenRowCount = Math.max(layoutMap.headerLevelCount, this.options.frozenRowCount ?? 0);
+ table.frozenRowCount = Math.max(
+ layoutMap.headerLevelCount + this.internalProps.layoutMap.columnSeriesNumberColumnCount,
+ this.options.frozenRowCount ?? 0
+ );
if (table.bottomFrozenRowCount !== (this.options.bottomFrozenRowCount ?? 0)) {
table.bottomFrozenRowCount = this.options.bottomFrozenRowCount ?? 0;
@@ -672,10 +681,7 @@ export class ListTable extends BaseTable implements ListTableAPI {
if (table.internalProps.layoutMap.isHeader(col, row)) {
return null;
}
- const index = table.getRecordShowIndexByCell(
- table.transpose ? col - table.internalProps.layoutMap.leftRowSeriesNumberColumnCount : col,
- row
- );
+ const index = table.getRecordShowIndexByCell(col, row);
return table.internalProps.dataSource.getField(index, field, col, row, this);
}
/**
diff --git a/packages/vtable/src/PivotTable.ts b/packages/vtable/src/PivotTable.ts
index 82fa46e15b..75e1e5ae31 100644
--- a/packages/vtable/src/PivotTable.ts
+++ b/packages/vtable/src/PivotTable.ts
@@ -278,7 +278,7 @@ export class PivotTable extends BaseTable implements PivotTableAPI {
_canResizeColumn(col: number, row: number): boolean {
const ifCan = super._canResizeColumn(col, row);
if (ifCan) {
- const isSeriesNumber = this.internalProps.layoutMap.isSeriesNumber(col, row);
+ const isSeriesNumber = this.internalProps.layoutMap.isRowSeriesNumber(col, row);
if (isSeriesNumber && this.internalProps.rowSeriesNumber.disableColumnResize === true) {
return false;
} else if (!this.internalProps.layoutMap.indicatorsAsCol) {
@@ -723,12 +723,12 @@ export class PivotTable extends BaseTable implements PivotTableAPI {
return customMergeText;
}
}
- if (this.internalProps.layoutMap.isSeriesNumber(col, row)) {
- if (this.internalProps.layoutMap.isSeriesNumberInHeader(col, row)) {
+ if (this.internalProps.layoutMap.isRowSeriesNumber(col, row)) {
+ if (this.internalProps.layoutMap.isRowSeriesNumberInHeader(col, row)) {
const { title } = this.internalProps.layoutMap.getSeriesNumberHeader(col, row);
return title;
}
- const { format } = this.internalProps.layoutMap.getSeriesNumberBody(col, row);
+ const { format } = this.internalProps.layoutMap.getRowSeriesNumberBody(col, row);
return typeof format === 'function' ? format(col, row, this) : row - this.columnHeaderLevelCount + 1;
} else if (this.internalProps.layoutMap.isHeader(col, row)) {
const { title, fieldFormat } = this.internalProps.layoutMap.getHeader(col, row) as HeaderData;
diff --git a/packages/vtable/src/core/BaseTable.ts b/packages/vtable/src/core/BaseTable.ts
index 80382d9d95..39ae0937e0 100644
--- a/packages/vtable/src/core/BaseTable.ts
+++ b/packages/vtable/src/core/BaseTable.ts
@@ -43,7 +43,7 @@ import type {
CellAddressWithBound,
ColorPropertyDefine,
ColumnIconOption,
- ColumnSeriesNumber,
+ IColumnSeriesNumber,
IRowSeriesNumber,
ColumnStyleOption,
MappingRule,
@@ -282,7 +282,7 @@ export abstract class BaseTable extends EventTarget implements BaseTableAPI {
eventOptions,
rowSeriesNumber,
enableCheckboxCascade,
- // columnSeriesNumber,
+ columnSeriesNumber,
// disableRowHeaderColumnResize,
columnResizeMode,
rowResizeMode = 'none',
@@ -395,7 +395,7 @@ export abstract class BaseTable extends EventTarget implements BaseTableAPI {
internalProps.eventOptions = eventOptions;
internalProps.rowSeriesNumber = rowSeriesNumber;
internalProps.enableCheckboxCascade = enableCheckboxCascade;
- // internalProps.columnSeriesNumber = columnSeriesNumber;
+ internalProps.columnSeriesNumber = columnSeriesNumber;
internalProps.columnResizeMode = resize?.columnResizeMode ?? columnResizeMode;
internalProps.rowResizeMode = resize?.rowResizeMode ?? rowResizeMode;
@@ -1353,11 +1353,23 @@ export abstract class BaseTable extends EventTarget implements BaseTableAPI {
}
getDefaultRowHeight(row: number) {
- if (this.isColumnHeader(0, row) || this.isCornerHeader(0, row) || this.isSeriesNumberInHeader(0, row)) {
+ if (
+ this.isColumnHeader(0, row) ||
+ this.isCornerHeader(0, row) ||
+ (row >= this.internalProps.layoutMap.columnSeriesNumberColumnCount && this.isSeriesNumberInHeader(0, row))
+ ) {
return Array.isArray(this.defaultHeaderRowHeight)
? this.defaultHeaderRowHeight[row] ?? this.internalProps.defaultRowHeight
: this.defaultHeaderRowHeight;
}
+ if (row < this.internalProps.layoutMap.columnSeriesNumberColumnCount) {
+ return (
+ this.internalProps.columnSeriesNumber.height ??
+ (Array.isArray(this.defaultHeaderRowHeight)
+ ? this.defaultHeaderRowHeight[row] ?? this.internalProps.defaultRowHeight
+ : this.defaultHeaderRowHeight)
+ );
+ }
if (this.isBottomFrozenRow(row)) {
//底部冻结行默认取用了表头的行高 但针对非表头数据冻结的情况这里可能不妥
return Array.isArray(this.defaultHeaderRowHeight)
@@ -1416,15 +1428,23 @@ export abstract class BaseTable extends EventTarget implements BaseTableAPI {
this.internalProps._heightResizedRowMap.size === 0
) {
// part in header
- for (let i = startRow; i < Math.min(endRow + 1, this.columnHeaderLevelCount); i++) {
+ for (
+ let i = startRow;
+ i <
+ Math.min(endRow + 1, this.columnHeaderLevelCount + this.internalProps.layoutMap.columnSeriesNumberColumnCount);
+ i++
+ ) {
h += this.getRowHeight(i);
}
// part in body
- if (endRow >= this.columnHeaderLevelCount) {
+ if (endRow >= this.columnHeaderLevelCount + this.internalProps.layoutMap.columnSeriesNumberColumnCount) {
h +=
this.defaultRowHeight *
(Math.min(endRow, this.rowCount - this.bottomFrozenRowCount - 1) -
- Math.max(this.columnHeaderLevelCount, startRow) +
+ Math.max(
+ this.columnHeaderLevelCount + this.internalProps.layoutMap.columnSeriesNumberColumnCount,
+ startRow
+ ) +
1);
}
// part in bottom frozen
@@ -2393,7 +2413,7 @@ export abstract class BaseTable extends EventTarget implements BaseTableAPI {
eventOptions,
rowSeriesNumber,
enableCheckboxCascade,
- // columnSeriesNumber,
+ columnSeriesNumber,
// disableRowHeaderColumnResize,
columnResizeMode,
rowResizeMode = 'none',
@@ -2475,7 +2495,7 @@ export abstract class BaseTable extends EventTarget implements BaseTableAPI {
internalProps.eventOptions = eventOptions;
internalProps.rowSeriesNumber = rowSeriesNumber;
internalProps.enableCheckboxCascade = enableCheckboxCascade;
- // internalProps.columnSeriesNumber = columnSeriesNumber;
+ internalProps.columnSeriesNumber = columnSeriesNumber;
internalProps.columnResizeMode = resize?.columnResizeMode ?? columnResizeMode;
internalProps.rowResizeMode = resize?.rowResizeMode ?? rowResizeMode;
@@ -3046,7 +3066,7 @@ export abstract class BaseTable extends EventTarget implements BaseTableAPI {
* @param {number} row row index.
* @return {ColumnDefine} The column define object.
*/
- getBodyColumnDefine(col: number, row: number): ColumnDefine | IRowSeriesNumber | ColumnSeriesNumber {
+ getBodyColumnDefine(col: number, row: number): ColumnDefine | IRowSeriesNumber | IColumnSeriesNumber {
// TODO: 暂时修复透视表报错
const body = this.internalProps.layoutMap.getBody(col, row);
return body?.define;
@@ -3060,7 +3080,7 @@ export abstract class BaseTable extends EventTarget implements BaseTableAPI {
getCellType(col: number, row: number): ColumnTypeOption {
let cellType;
if (this.isSeriesNumberInHeader(col, row)) {
- return (this.internalProps.layoutMap as SimpleHeaderLayoutMap).getSeriesNumberHeader(col, row).cellType;
+ return (this.internalProps.layoutMap as SimpleHeaderLayoutMap).getRowSeriesNumberHeader(col, row).cellType;
} else if (this.isHeader(col, row)) {
cellType = (this.internalProps.layoutMap.getHeader(col, row) as HeaderData).headerType;
} else {
@@ -3083,7 +3103,7 @@ export abstract class BaseTable extends EventTarget implements BaseTableAPI {
* @param {number} row row index.
* @return {ColumnDefine} The column define object.
*/
- getHeaderDefine(col: number, row: number): ColumnDefine | IRowSeriesNumber | ColumnSeriesNumber {
+ getHeaderDefine(col: number, row: number): ColumnDefine | IRowSeriesNumber | IColumnSeriesNumber {
const hd = this.internalProps.layoutMap.getHeader(col, row);
return hd?.define;
}
@@ -3109,7 +3129,7 @@ export abstract class BaseTable extends EventTarget implements BaseTableAPI {
* @param {number} col The column index.
* @return {*} The array of header define object.
*/
- getHeadersDefine(col: number, row: number): (ColumnDefine | IRowSeriesNumber | ColumnSeriesNumber)[] {
+ getHeadersDefine(col: number, row: number): (ColumnDefine | IRowSeriesNumber | IColumnSeriesNumber)[] {
const headers = [];
while (true) {
const header = this.getHeaderDefine(col, row) as ColumnDefine;
@@ -3304,14 +3324,14 @@ export abstract class BaseTable extends EventTarget implements BaseTableAPI {
isSeriesNumberInBody(col: number, row: number): boolean {
return (
this.internalProps.layoutMap &&
- (this.internalProps.layoutMap as SimpleHeaderLayoutMap).isSeriesNumberInBody(col, row)
+ (this.internalProps.layoutMap as SimpleHeaderLayoutMap).isRowSeriesNumberInBody(col, row)
);
}
/** 判断单元格是否属于序号表头部分 */
isSeriesNumberInHeader(col: number, row: number): boolean {
return (
this.internalProps.layoutMap &&
- (this.internalProps.layoutMap as SimpleHeaderLayoutMap).isSeriesNumberInHeader(col, row)
+ (this.internalProps.layoutMap as SimpleHeaderLayoutMap).isRowSeriesNumberInHeader(col, row)
);
}
/** 判断单元格是否属于表头部分 */
@@ -3582,10 +3602,10 @@ export abstract class BaseTable extends EventTarget implements BaseTableAPI {
let icons;
if (this.isHeader(col, row)) {
icons = this.internalProps.headerHelper.getIcons(col, row);
- } else if ((this.internalProps.layoutMap as SimpleHeaderLayoutMap).isSeriesNumber(col, row)) {
+ } else if ((this.internalProps.layoutMap as SimpleHeaderLayoutMap).isRowSeriesNumber(col, row)) {
if (!(this.options as ListTableConstructorOptions).groupBy || !this.getCellRawRecord(col, row)?.vtableMerge) {
- const dragOrder = (this.internalProps.layoutMap as SimpleHeaderLayoutMap).getSeriesNumberBody(col, row)?.define
- ?.dragOrder;
+ const dragOrder = (this.internalProps.layoutMap as SimpleHeaderLayoutMap).getRowSeriesNumberBody(col, row)
+ ?.define?.dragOrder;
if (dragOrder) {
icons = this.internalProps.rowSeriesNumberHelper.getIcons(col, row);
}
@@ -4371,7 +4391,7 @@ export abstract class BaseTable extends EventTarget implements BaseTableAPI {
this.customCellStylePlugin?.arrangeCustomCellStyle(cellPos, customStyleId, forceFastUpdate);
}
isSeriesNumber(col: number, row: number): boolean {
- return this.internalProps.layoutMap.isSeriesNumber(col, row);
+ return this.internalProps.layoutMap.isRowSeriesNumber(col, row);
}
isHasSeriesNumber(): boolean {
return this.internalProps.layoutMap?.leftRowSeriesNumberColumnCount > 0;
diff --git a/packages/vtable/src/core/style-helper.ts b/packages/vtable/src/core/style-helper.ts
index 184b375c65..beece08348 100644
--- a/packages/vtable/src/core/style-helper.ts
+++ b/packages/vtable/src/core/style-helper.ts
@@ -182,9 +182,12 @@ export function getCellStyle(col: number, row: number, table: BaseTableAPI): Ful
//如果是主体部分,获取相应的style
if (rawRecord?.vtableMerge) {
cacheKey = 'merge-title';
- } else if (table.isSeriesNumberInBody(col, row)) {
+ } else if (table.internalProps.layoutMap.isRowSeriesNumberInBody(col, row)) {
// 如果是行序号
- cacheKey = `${col}-series-` + cellType;
+ cacheKey = `${col}-row-series-` + cellType;
+ } else if (table.internalProps.layoutMap.isColumnSeriesNumber(col, row)) {
+ // 如果是列序号
+ cacheKey = `${row}-column-series-` + cellType;
} else if (
(table.isListTable() && !(table as any).transpose) ||
(table.isPivotTable() && (table.internalProps.layoutMap as PivotHeaderLayoutMap).indicatorsAsCol)
diff --git a/packages/vtable/src/event/self-event-listener/list-table/checkbox.ts b/packages/vtable/src/event/self-event-listener/list-table/checkbox.ts
index bf2fa5a3f0..34e8579653 100644
--- a/packages/vtable/src/event/self-event-listener/list-table/checkbox.ts
+++ b/packages/vtable/src/event/self-event-listener/list-table/checkbox.ts
@@ -10,7 +10,7 @@ export function bindGroupTitleCheckboxChange(table: BaseTableAPI) {
const { col, row, checked, field } = args;
if (
- !table.internalProps.layoutMap.isSeriesNumber(col, row) ||
+ !table.internalProps.layoutMap.isRowSeriesNumber(col, row) ||
table.internalProps.rowSeriesNumber?.enableTreeCheckbox !== true
) {
return;
diff --git a/packages/vtable/src/layout/cell-range/simple-cell-range.ts b/packages/vtable/src/layout/cell-range/simple-cell-range.ts
index 6afeb0e2b6..0f7b1165a0 100644
--- a/packages/vtable/src/layout/cell-range/simple-cell-range.ts
+++ b/packages/vtable/src/layout/cell-range/simple-cell-range.ts
@@ -16,14 +16,14 @@ export function getCellRange(col: number, row: number, layout: SimpleHeaderLayou
cellRange = getCellRangeTranspose(col, row, layout);
} else {
// hover相关的单元格位置是-1,-1,getCellRange计算有误,先进行判断
- if (layout.headerLevelCount <= row) {
+ if (row >= layout.headerLevelCount + layout.columnSeriesNumberColumnCount) {
//如果是body部分 设置了需要合并单元格 这里判断上下是否内容相同 相同的话 将cellRange范围扩大
if (
- layout.headerLevelCount <= row &&
+ row >= layout.headerLevelCount + layout.columnSeriesNumberColumnCount &&
(layout.columnObjects[col - layout.leftRowSeriesNumberColumnCount]?.define as TextColumnDefine)?.mergeCell
) {
const value = layout._table.getCellValue(col, row);
- for (let r = row - 1; r >= layout.headerLevelCount; r--) {
+ for (let r = row - 1; r >= layout.headerLevelCount + layout.columnSeriesNumberColumnCount; r--) {
const last_Value = layout._table.getCellValue(col, r);
if (typeof layout.columnObjects[col - layout.leftRowSeriesNumberColumnCount].define.mergeCell === 'boolean') {
if (value !== last_Value) {
@@ -105,7 +105,7 @@ export function getCellRange(col: number, row: number, layout: SimpleHeaderLayou
}
cellRange.start.row = r;
}
- for (let r = row + 1; r < layout.headerLevelCount; r++) {
+ for (let r = row + 1; r < layout.headerLevelCount + layout.columnSeriesNumberColumnCount; r++) {
if (id !== layout.getCellId(col, r)) {
break;
}
diff --git a/packages/vtable/src/layout/pivot-header-layout.ts b/packages/vtable/src/layout/pivot-header-layout.ts
index e5329ab496..a14ed48b37 100644
--- a/packages/vtable/src/layout/pivot-header-layout.ts
+++ b/packages/vtable/src/layout/pivot-header-layout.ts
@@ -166,6 +166,7 @@ export class PivotHeaderLayoutMap implements LayoutMapAPI {
leftRowSeriesNumberColumnCount: number = 0;
rightRowSeriesNumberColumn: SeriesNumberColumnData[];
rightRowSeriesNumberColumnCount: number = 0;
+ columnSeriesNumberColumnCount: number = 0;
//#endregion
_useGetBodyCache: boolean = false;
@@ -1383,8 +1384,8 @@ export class PivotHeaderLayoutMap implements LayoutMapAPI {
this.isRightFrozenColumn(col) ||
this.isBottomFrozenRow(row) ||
this.isFrozenRow(row) ||
- this.isSeriesNumberInBody(col, row) ||
- this.isSeriesNumberInHeader(col, row)
+ this.isRowSeriesNumberInBody(col, row) ||
+ this.isRowSeriesNumberInHeader(col, row)
);
}
/**
@@ -1841,7 +1842,7 @@ export class PivotHeaderLayoutMap implements LayoutMapAPI {
}
getCellId(col: number, row: number): LayoutObjectId {
if (row >= 0 && col >= 0) {
- if (this.isSeriesNumber(col, row)) {
+ if (this.isRowSeriesNumber(col, row)) {
return '';
} else if (this.isCornerHeader(col, row)) {
return this._cornerHeaderCellIds[row]?.[col - this.leftRowSeriesNumberColumnCount];
@@ -1874,7 +1875,7 @@ export class PivotHeaderLayoutMap implements LayoutMapAPI {
// return 0;
// }
getHeader(col: number, row: number): HeaderData | SeriesNumberColumnData {
- if (this.isSeriesNumberInHeader(col, row)) {
+ if (this.isRowSeriesNumberInHeader(col, row)) {
return this.getSeriesNumberHeader(col, row);
}
const id = this.getCellId(col, row);
@@ -1922,8 +1923,8 @@ export class PivotHeaderLayoutMap implements LayoutMapAPI {
if (cache) {
return cache;
}
- if (this.isSeriesNumber(_col, _row)) {
- const body = this.getSeriesNumberBody(_col, _row);
+ if (this.isRowSeriesNumber(_col, _row)) {
+ const body = this.getRowSeriesNumberBody(_col, _row);
this.setBodyWidthCache(_col, _row, body);
return body;
}
@@ -2071,7 +2072,7 @@ export class PivotHeaderLayoutMap implements LayoutMapAPI {
for (let r = row + 1; r < (this.rowCount ?? 0); r++) {
if (
id !== this.getCellId(col, r) ||
- (this.isSeriesNumberInHeader(col, row) && r >= this.columnHeaderLevelCount)
+ (this.isRowSeriesNumberInHeader(col, row) && r >= this.columnHeaderLevelCount)
// ||
// (col >= 1 && this.getCellId(col - 1, row) !== this.getCellId(col - 1, r))
) {
@@ -2853,7 +2854,10 @@ export class PivotHeaderLayoutMap implements LayoutMapAPI {
* @returns boolean 是否可以移动
*/
canMoveHeaderPosition(source: CellAddress, target: CellAddress): boolean {
- if (this.isSeriesNumberInHeader(target.col, target.row) || this.isSeriesNumberInHeader(source.col, source.row)) {
+ if (
+ this.isRowSeriesNumberInHeader(target.col, target.row) ||
+ this.isRowSeriesNumberInHeader(source.col, source.row)
+ ) {
return false;
}
if (this.isCornerHeader(target.col, target.row)) {
@@ -2862,7 +2866,7 @@ export class PivotHeaderLayoutMap implements LayoutMapAPI {
if (source.col < 0 || source.row < 0 || target.col < 0 || target.row < 0) {
return false;
}
- if (this.isSeriesNumberInBody(target.col, target.row) && this.isSeriesNumberInBody(source.col, source.row)) {
+ if (this.isRowSeriesNumberInBody(target.col, target.row) && this.isRowSeriesNumberInBody(source.col, source.row)) {
// 如果是子节点之间相互换位置 则匹配表头最后一级
// if (
// this.getColumnDefine(source.col + this.leftRowSeriesNumberColumnCount, source.row).isChildNode &&
@@ -3996,7 +4000,7 @@ export class PivotHeaderLayoutMap implements LayoutMapAPI {
this.generateCellIdsConsiderHideHeader();
this.setPagination(this.pagination);
}
- isSeriesNumberInHeader(col: number, row: number): boolean {
+ isRowSeriesNumberInHeader(col: number, row: number): boolean {
if (this.leftRowSeriesNumberColumnCount > 0 && col >= 0 && row >= 0 && col < this.leftRowSeriesNumberColumnCount) {
if (row < this.headerLevelCount) {
return true;
@@ -4013,7 +4017,7 @@ export class PivotHeaderLayoutMap implements LayoutMapAPI {
}
return false;
}
- isSeriesNumberInBody(col: number, row: number): boolean {
+ isRowSeriesNumberInBody(col: number, row: number): boolean {
if (this.leftRowSeriesNumberColumnCount > 0 && col >= 0 && col < this.leftRowSeriesNumberColumnCount) {
if (row >= this.headerLevelCount) {
return true;
@@ -4026,7 +4030,7 @@ export class PivotHeaderLayoutMap implements LayoutMapAPI {
}
return false;
}
- isSeriesNumber(col: number, row: number): boolean {
+ isRowSeriesNumber(col: number, row: number): boolean {
if (isValid(col) && isValid(row)) {
if (
this.leftRowSeriesNumberColumnCount > 0 &&
@@ -4046,6 +4050,12 @@ export class PivotHeaderLayoutMap implements LayoutMapAPI {
}
return false;
}
+ isColumnSeriesNumber(col: number, row: number): boolean {
+ if (this.columnSeriesNumberColumnCount > 0 && row >= 0 && row < this.columnSeriesNumberColumnCount) {
+ return true;
+ }
+ return false;
+ }
getSeriesNumberHeader(col: number, row: number) {
if (this.leftRowSeriesNumberColumnCount > 0 && col >= 0 && col < this.leftRowSeriesNumberColumnCount) {
if (row < this.headerLevelCount) {
@@ -4070,7 +4080,7 @@ export class PivotHeaderLayoutMap implements LayoutMapAPI {
}
return undefined;
}
- getSeriesNumberBody(col: number, row: number) {
+ getRowSeriesNumberBody(col: number, row: number) {
if (this.leftRowSeriesNumberColumnCount > 0 && col >= 0 && col < this.leftRowSeriesNumberColumnCount) {
if (row >= this.headerLevelCount) {
return this.leftRowSeriesNumberColumn[col];
@@ -4259,7 +4269,7 @@ export class PivotHeaderLayoutMap implements LayoutMapAPI {
}
}
getBodyWidthCache(col: number, row: number) {
- if (!this._useGetBodyCache || this.isHeader(col, row) || this.isSeriesNumber(col, row)) {
+ if (!this._useGetBodyCache || this.isHeader(col, row) || this.isRowSeriesNumber(col, row)) {
return undefined;
}
if (this.indicatorsAsCol && this._getBodyCache.has(col)) {
@@ -4270,7 +4280,7 @@ export class PivotHeaderLayoutMap implements LayoutMapAPI {
return undefined;
}
setBodyWidthCache(col: number, row: number, cache: IndicatorData | SeriesNumberColumnData) {
- if (!this._useGetBodyCache || this.isHeader(col, row) || this.isSeriesNumber(col, row)) {
+ if (!this._useGetBodyCache || this.isHeader(col, row) || this.isRowSeriesNumber(col, row)) {
return;
}
if (this.indicatorsAsCol) {
@@ -4284,7 +4294,7 @@ export class PivotHeaderLayoutMap implements LayoutMapAPI {
if (
this._useHeaderPathCache &&
!this.isHeader(col, row) &&
- !this.isSeriesNumber(col, row) &&
+ !this.isRowSeriesNumber(col, row) &&
this._colHeaderPathCache.has(col)
) {
return this._colHeaderPathCache.get(col);
@@ -4293,7 +4303,7 @@ export class PivotHeaderLayoutMap implements LayoutMapAPI {
}
setColHeaderPathCache(col: number, row: number, cache: ITreeLayoutHeadNode[]) {
- if (this._useHeaderPathCache && !this.isHeader(col, row) && !this.isSeriesNumber(col, row)) {
+ if (this._useHeaderPathCache && !this.isHeader(col, row) && !this.isRowSeriesNumber(col, row)) {
this._colHeaderPathCache.set(col, cache);
}
}
@@ -4302,7 +4312,7 @@ export class PivotHeaderLayoutMap implements LayoutMapAPI {
if (
this._useHeaderPathCache &&
!this.isHeader(col, row) &&
- !this.isSeriesNumber(col, row) &&
+ !this.isRowSeriesNumber(col, row) &&
this._rowHeaderPathCache.has(row)
) {
return this._rowHeaderPathCache.get(row);
@@ -4311,7 +4321,7 @@ export class PivotHeaderLayoutMap implements LayoutMapAPI {
}
setRowHeaderPathCache(col: number, row: number, cache: ITreeLayoutHeadNode[]) {
- if (this._useHeaderPathCache && !this.isHeader(col, row) && !this.isSeriesNumber(col, row)) {
+ if (this._useHeaderPathCache && !this.isHeader(col, row) && !this.isRowSeriesNumber(col, row)) {
this._rowHeaderPathCache.set(row, cache);
}
}
diff --git a/packages/vtable/src/layout/simple-header-layout.ts b/packages/vtable/src/layout/simple-header-layout.ts
index 0b0a048e33..bf8d4398e8 100644
--- a/packages/vtable/src/layout/simple-header-layout.ts
+++ b/packages/vtable/src/layout/simple-header-layout.ts
@@ -10,6 +10,7 @@ import {
type LayoutObjectId,
type Aggregation,
type IRowSeriesNumber,
+ type IColumnSeriesNumber,
HierarchyState
} from '../ts-types';
import type { ChartColumnDefine, ColumnsDefine } from '../ts-types/list-table/define';
@@ -45,10 +46,12 @@ export class SimpleHeaderLayoutMap implements LayoutMapAPI {
private _columns: ColumnData[];
private _columnsIncludeHided: ColumnData[];
rowSeriesNumberColumn: SeriesNumberColumnData[];
+ columnSeriesNumberColumn: SeriesNumberColumnData;
leftRowSeriesNumberColumn: SeriesNumberColumnData[];
rightRowSeriesNumberColumn: SeriesNumberColumnData[];
leftRowSeriesNumberColumnCount: number = 0;
rightRowSeriesNumberColumnCount: number = 0;
+ columnSeriesNumberColumnCount: number = 0;
/** 后期加的 对应pivot-header-layout 中的columnDimensionTree 为了排序后获取到排序后的columns */
columnTree: DimensionTree;
readonly bodyRowSpanCount: number = 1;
@@ -111,6 +114,7 @@ export class SimpleHeaderLayoutMap implements LayoutMapAPI {
// return o;
// }, {} as { [key in string]: HeaderData });
this.handleRowSeriesNumber(table.internalProps.rowSeriesNumber);
+ this.handleColumnSeriesNumber(table.internalProps.columnSeriesNumber);
}
handleRowSeriesNumber(rowSeriesNumber: IRowSeriesNumber) {
if (rowSeriesNumber) {
@@ -165,6 +169,19 @@ export class SimpleHeaderLayoutMap implements LayoutMapAPI {
this.rightRowSeriesNumberColumnCount = this.rightRowSeriesNumberColumn.length;
}
}
+ handleColumnSeriesNumber(columnSeriesNumber: IColumnSeriesNumber) {
+ if (columnSeriesNumber) {
+ this.columnSeriesNumberColumnCount = 1;
+ this.columnSeriesNumberColumn = {
+ id: this.seqId++,
+ // title: columnSeriesNumber.title,
+ style: columnSeriesNumber.style,
+ define: merge({ field: '_vtable_columnSeries_number' }, columnSeriesNumber),
+ cellType: columnSeriesNumber.cellType ?? 'text',
+ headerType: columnSeriesNumber.cellType === 'checkbox' ? 'checkbox' : 'text'
+ };
+ }
+ }
// get columnWidths(): ColumnData[] {
// return this._columns;
// }
@@ -180,11 +197,14 @@ export class SimpleHeaderLayoutMap implements LayoutMapAPI {
set showHeader(_showHeader: boolean) {
this._showHeader = _showHeader;
}
- isSeriesNumberInHeader(col: number, row: number): boolean {
+ isRowSeriesNumberInHeader(col: number, row: number): boolean {
if (this.leftRowSeriesNumberColumnCount > 0 && col >= 0 && row >= 0 && col < this.leftRowSeriesNumberColumnCount) {
if (this.transpose) {
+ if (row < this.columnSeriesNumberColumnCount) {
+ return true;
+ }
return false;
- } else if (row < this.headerLevelCount) {
+ } else if (row < this.headerLevelCount + this.columnSeriesNumberColumnCount) {
return true;
}
}
@@ -194,19 +214,22 @@ export class SimpleHeaderLayoutMap implements LayoutMapAPI {
col >= this.colCount - this.rightRowSeriesNumberColumnCount
) {
if (this.transpose) {
+ if (row < this.columnSeriesNumberColumnCount) {
+ return true;
+ }
return false;
- } else if (row < this.headerLevelCount) {
+ } else if (row < this.headerLevelCount + this.columnSeriesNumberColumnCount) {
return true;
}
}
return false;
}
- isSeriesNumberInBody(col: number, row: number): boolean {
+ isRowSeriesNumberInBody(col: number, row: number): boolean {
if (this.leftRowSeriesNumberColumnCount > 0 && col >= 0 && col < this.leftRowSeriesNumberColumnCount) {
if (this.transpose) {
return true;
}
- if (row >= this.headerLevelCount) {
+ if (row >= this.headerLevelCount + this.columnSeriesNumberColumnCount) {
return true;
}
}
@@ -214,13 +237,13 @@ export class SimpleHeaderLayoutMap implements LayoutMapAPI {
if (this.transpose) {
return true;
}
- if (row >= this.headerLevelCount) {
+ if (row >= this.headerLevelCount + this.columnSeriesNumberColumnCount) {
return true;
}
}
return false;
}
- isSeriesNumber(col: number, row: number): boolean {
+ isRowSeriesNumber(col: number, row: number): boolean {
if (isValid(col) && isValid(row)) {
if (
this.leftRowSeriesNumberColumnCount > 0 &&
@@ -240,12 +263,26 @@ export class SimpleHeaderLayoutMap implements LayoutMapAPI {
}
return false;
}
- getSeriesNumberHeader(col: number, row: number) {
+ isColumnSeriesNumber(col: number, row: number): boolean {
+ if (
+ this.columnSeriesNumberColumnCount > 0 &&
+ col >= this.leftRowSeriesNumberColumnCount &&
+ row >= 0 &&
+ row < this.columnSeriesNumberColumnCount
+ ) {
+ return true;
+ }
+ return false;
+ }
+ getRowSeriesNumberHeader(col: number, row: number) {
if (this.leftRowSeriesNumberColumnCount > 0 && col >= 0 && col < this.leftRowSeriesNumberColumnCount) {
- if (this.transpose) {
- return undefined;
- }
- if (row < this.headerLevelCount) {
+ // if (this.transpose) {
+ // return undefined;
+ // }
+ if (
+ (!this.transpose && row < this.headerLevelCount + this.columnSeriesNumberColumnCount) ||
+ (this.transpose && row < this.columnSeriesNumberColumnCount)
+ ) {
return Object.assign({}, this.leftRowSeriesNumberColumn[col], {
style: Object.assign(
{},
@@ -260,23 +297,26 @@ export class SimpleHeaderLayoutMap implements LayoutMapAPI {
if (
this.rightRowSeriesNumberColumnCount > 0 &&
col >= this.colCount - this.rightRowSeriesNumberColumnCount &&
- row < this.headerLevelCount
+ row < this.headerLevelCount + this.columnSeriesNumberColumnCount
) {
- if (this.transpose) {
- return undefined;
- }
- if (row < this.headerLevelCount) {
+ // if (this.transpose) {
+ // return undefined;
+ // }
+ if (
+ (!this.transpose && row < this.headerLevelCount + this.columnSeriesNumberColumnCount) ||
+ (this.transpose && row < this.columnSeriesNumberColumnCount)
+ ) {
return this.rightRowSeriesNumberColumn[col - (this.colCount - this.rightRowSeriesNumberColumnCount)];
}
}
return undefined;
}
- getSeriesNumberBody(col: number, row: number) {
+ getRowSeriesNumberBody(col: number, row: number) {
if (this.leftRowSeriesNumberColumnCount > 0 && col >= 0 && col < this.leftRowSeriesNumberColumnCount) {
if (this.transpose) {
return this.leftRowSeriesNumberColumn[col];
}
- if (row >= this.headerLevelCount) {
+ if (row >= this.headerLevelCount + this.columnSeriesNumberColumnCount) {
return this.leftRowSeriesNumberColumn[col];
}
}
@@ -284,21 +324,39 @@ export class SimpleHeaderLayoutMap implements LayoutMapAPI {
if (this.transpose) {
return this.rightRowSeriesNumberColumn[col - (this.colCount - this.rightRowSeriesNumberColumnCount)];
}
- if (row >= this.headerLevelCount) {
+ if (row >= this.headerLevelCount + this.columnSeriesNumberColumnCount) {
return this.rightRowSeriesNumberColumn[col - (this.colCount - this.rightRowSeriesNumberColumnCount)];
}
}
return undefined;
}
+ getColumnSeriesNumber(col: number, row: number) {
+ if (
+ this.columnSeriesNumberColumnCount > 0 &&
+ row >= 0 &&
+ row < this.columnSeriesNumberColumnCount &&
+ col >= this.leftRowSeriesNumberColumnCount
+ ) {
+ return this.columnSeriesNumberColumn;
+ }
+ return undefined;
+ }
isHeader(col: number, row: number): boolean {
if (
this.transpose &&
- col >= this.leftRowSeriesNumberColumnCount &&
- col < this.headerLevelCount + this.leftRowSeriesNumberColumnCount
+ ((col >= this.leftRowSeriesNumberColumnCount &&
+ col < this.headerLevelCount + this.leftRowSeriesNumberColumnCount &&
+ row >= this.columnSeriesNumberColumnCount) ||
+ (col < this.leftRowSeriesNumberColumnCount && row < this.columnSeriesNumberColumnCount))
) {
return true;
}
- if (!this.transpose && row >= 0 && row < this.headerLevelCount) {
+ if (
+ !this.transpose &&
+ ((row >= this.columnSeriesNumberColumnCount &&
+ row < this.headerLevelCount + this.columnSeriesNumberColumnCount) ||
+ (row >= 0 && row < this.columnSeriesNumberColumnCount && col >= 0 && col < this.leftRowSeriesNumberColumnCount))
+ ) {
return true;
}
return false;
@@ -501,7 +559,8 @@ export class SimpleHeaderLayoutMap implements LayoutMapAPI {
if (
this.transpose &&
col >= this.leftRowSeriesNumberColumnCount &&
- col < this.headerLevelCount + this.leftRowSeriesNumberColumnCount
+ col < this.headerLevelCount + this.leftRowSeriesNumberColumnCount &&
+ row >= this.columnSeriesNumberColumnCount
) {
return true;
}
@@ -510,8 +569,8 @@ export class SimpleHeaderLayoutMap implements LayoutMapAPI {
isColumnHeader(col: number, row: number): boolean {
if (
!this.transpose &&
- row >= 0 &&
- row <= this.headerLevelCount - 1 &&
+ row >= this.columnSeriesNumberColumnCount &&
+ row < this.headerLevelCount + this.columnSeriesNumberColumnCount &&
col >= this.leftRowSeriesNumberColumnCount &&
col < this.colCount - this.rightRowSeriesNumberColumnCount
) {
@@ -752,7 +811,9 @@ export class SimpleHeaderLayoutMap implements LayoutMapAPI {
}
get rowCount(): number {
//转置表格 行数是由表头定义的field决定的;如果是标准表格,这个值么有地方用到,而且是由数据量决定的,在listTable中有定义这个值
- return this.transpose ? this._columns.length : this.headerLevelCount + this.recordsCount;
+ return this.transpose
+ ? this._columns.length + this.columnSeriesNumberColumnCount
+ : this.headerLevelCount + this.recordsCount + this.columnSeriesNumberColumnCount;
}
/** 不包括冻结的行 */
get bodyRowCount(): number {
@@ -859,33 +920,39 @@ export class SimpleHeaderLayoutMap implements LayoutMapAPI {
if (col >= this.headerLevelCount + this.leftRowSeriesNumberColumnCount) {
return this._columns[row]?.id;
}
- if (this.isSeriesNumber(col, row)) {
- return row + '_series_number';
+ if (this.isRowSeriesNumber(col, row)) {
+ return row + '_row_series_number';
+ }
+ if (this.isColumnSeriesNumber(col, row)) {
+ return col + '_column_series_number';
}
//in header
- return this._headerCellIds[col - this.leftRowSeriesNumberColumnCount]?.[row];
+ return this._headerCellIds[col - this.leftRowSeriesNumberColumnCount]?.[row - this.columnSeriesNumberColumnCount];
}
- if (this.isSeriesNumber(col, row)) {
+ if (this.isRowSeriesNumber(col, row)) {
return this.rowSeriesNumberColumn[col].id;
}
- if (this.headerLevelCount <= row) {
+ if (this.isColumnSeriesNumber(col, row)) {
+ return col + '_column_series_number';
+ }
+ if (row >= this.headerLevelCount + this.columnSeriesNumberColumnCount) {
return this._columns[col - this.leftRowSeriesNumberColumnCount]?.id;
}
//in header
- return this._headerCellIds[row]?.[col - this.leftRowSeriesNumberColumnCount];
+ return this._headerCellIds[row - this.columnSeriesNumberColumnCount]?.[col - this.leftRowSeriesNumberColumnCount];
}
getHeader(col: number, row: number): HeaderData | SeriesNumberColumnData {
- if (this.isSeriesNumberInHeader(col, row)) {
- return this.getSeriesNumberHeader(col, row);
+ if (this.isRowSeriesNumberInHeader(col, row)) {
+ return this.getRowSeriesNumberHeader(col, row);
}
const id = this.getCellId(col, row);
return this._headerObjectMap[id as number]!;
}
getHeaderField(col: number, row: number) {
- if (this.isSeriesNumberInHeader(col, row)) {
- return this.getSeriesNumberHeader(col, row)?.field;
- } else if (this.isSeriesNumberInBody(col, row)) {
- return this.getSeriesNumberBody(col, row)?.field;
+ if (this.isRowSeriesNumberInHeader(col, row)) {
+ return this.getRowSeriesNumberHeader(col, row)?.field;
+ } else if (this.isRowSeriesNumberInBody(col, row)) {
+ return this.getRowSeriesNumberBody(col, row)?.field;
}
const id = this.getCellId(col, row);
return (
@@ -902,9 +969,9 @@ export class SimpleHeaderLayoutMap implements LayoutMapAPI {
for (let j = 0; j < row.length; j++) {
if (row[j] === id) {
if (this.transpose) {
- return { col: i, row: j };
+ return { col: i + this.leftRowSeriesNumberColumnCount, row: j + this.columnSeriesNumberColumnCount };
}
- return { col: j + this.leftRowSeriesNumberColumnCount, row: i };
+ return { col: j + this.leftRowSeriesNumberColumnCount, row: i + this.columnSeriesNumberColumnCount };
}
}
}
@@ -916,10 +983,15 @@ export class SimpleHeaderLayoutMap implements LayoutMapAPI {
return hd && this.getHeaderCellAdressById(hd.id as number);
}
getBody(col: number, _row: number): ColumnData | SeriesNumberColumnData {
- if (this.isSeriesNumber(col, _row)) {
- return this.getSeriesNumberBody(col, _row);
+ if (this.isRowSeriesNumber(col, _row)) {
+ return this.getRowSeriesNumberBody(col, _row);
+ }
+ if (this.isColumnSeriesNumber(col, _row)) {
+ return this.columnSeriesNumberColumn;
}
- return this.transpose ? this._columns[_row] : this._columns[col - this.leftRowSeriesNumberColumnCount];
+ return this.transpose
+ ? this._columns[_row - this.columnSeriesNumberColumnCount]
+ : this._columns[col - this.leftRowSeriesNumberColumnCount];
}
getBodyLayoutRangeById(id: LayoutObjectId): CellRange {
if (this.transpose) {
@@ -961,7 +1033,9 @@ export class SimpleHeaderLayoutMap implements LayoutMapAPI {
);
}
getRecordShowIndexByCell(col: number, row: number): number {
- const skipRowCount = this.hasAggregationOnTopCount ? this.headerLevelCount + 1 : this.headerLevelCount;
+ const skipRowCount =
+ (this.hasAggregationOnTopCount ? this.headerLevelCount + 1 : this.headerLevelCount) +
+ this.columnSeriesNumberColumnCount;
if (this.transpose) {
if (col < skipRowCount) {
return -1;
@@ -975,7 +1049,9 @@ export class SimpleHeaderLayoutMap implements LayoutMapAPI {
return row - skipRowCount;
}
getRecordStartRowByRecordIndex(index: number): number {
- const skipRowCount = this.hasAggregationOnTopCount ? this.headerLevelCount + 1 : this.headerLevelCount;
+ const skipRowCount =
+ (this.hasAggregationOnTopCount ? this.headerLevelCount + 1 : this.headerLevelCount) +
+ this.columnSeriesNumberColumnCount;
return skipRowCount + index;
}
private _addHeaders(
@@ -1087,7 +1163,7 @@ export class SimpleHeaderLayoutMap implements LayoutMapAPI {
return newRow;
}
getCellHeaderPaths(col: number, row: number): IListTableCellHeaderPaths {
- if (this.isSeriesNumber(col, row)) {
+ if (this.isRowSeriesNumber(col, row) || this.isColumnSeriesNumber(col, row)) {
return undefined;
}
let colPath: IListTableCellHeaderPaths['colHeaderPaths'] = [];
@@ -1101,7 +1177,7 @@ export class SimpleHeaderLayoutMap implements LayoutMapAPI {
} else {
rowPath = [
{
- field: this._columns[row].field
+ field: this._columns[row - this.columnSeriesNumberColumnCount].field
}
];
}
@@ -1118,7 +1194,7 @@ export class SimpleHeaderLayoutMap implements LayoutMapAPI {
if (this.isColumnHeader(col, row)) {
return this.getCellId(col, row - 1);
} else if (this.isRowHeader(col, row)) {
- if (this.isSeriesNumberInBody(col - 1, row)) {
+ if (this.isRowSeriesNumberInBody(col - 1, row)) {
return undefined;
}
return this.getCellId(col - 1, row);
@@ -1132,12 +1208,15 @@ export class SimpleHeaderLayoutMap implements LayoutMapAPI {
* @returns boolean 是否可以移动
*/
canMoveHeaderPosition(source: CellAddress, target: CellAddress): boolean {
- if (this.isSeriesNumberInHeader(target.col, target.row) || this.isSeriesNumberInHeader(source.col, source.row)) {
+ if (
+ this.isRowSeriesNumberInHeader(target.col, target.row) ||
+ this.isRowSeriesNumberInHeader(source.col, source.row)
+ ) {
return false;
} else if (
!this.transpose &&
- this.isSeriesNumberInBody(target.col, target.row) &&
- this.isSeriesNumberInBody(source.col, source.row)
+ this.isRowSeriesNumberInBody(target.col, target.row) &&
+ this.isRowSeriesNumberInBody(source.col, source.row)
) {
// return true;
const sourceIndex = this.getRecordShowIndexByCell(0, source.row);
@@ -1146,8 +1225,8 @@ export class SimpleHeaderLayoutMap implements LayoutMapAPI {
return canMove;
} else if (
this.transpose &&
- this.isSeriesNumberInBody(target.col, target.row) &&
- this.isSeriesNumberInBody(source.col, source.row)
+ this.isRowSeriesNumberInBody(target.col, target.row) &&
+ this.isRowSeriesNumberInBody(source.col, source.row)
) {
// 如果是子节点之间相互换位置 则匹配表头最后一级
if (
@@ -1261,15 +1340,15 @@ export class SimpleHeaderLayoutMap implements LayoutMapAPI {
};
} else if (
this.isRowHeader(source.col, source.row) ||
- (this.isSeriesNumberInBody(source.col, source.row) && this.transpose)
+ (this.isRowSeriesNumberInBody(source.col, source.row) && this.transpose)
) {
- if (this.isSeriesNumberInBody(source.col, source.row)) {
+ if (this.isRowSeriesNumberInBody(source.col, source.row)) {
sourceCellRange = this.getCellRange(source.col + this.leftRowSeriesNumberColumnCount, source.row); // 把拖拽转移到拖拽表头节点
}
// source单元格包含的列数
const sourceSize = sourceCellRange.end.row - sourceCellRange.start.row + 1;
// 插入目标地址的列index
- let targetIndex;
+ let targetIndex: number;
const targetCellRange = this.getCellRange(sourceCellRange.start.col, target.row);
if (target.row >= source.row) {
targetIndex = targetCellRange.end.row - sourceSize + 1;
@@ -1283,15 +1362,21 @@ export class SimpleHeaderLayoutMap implements LayoutMapAPI {
// 逐行将每一行的source id 移动到目标地址targetCol处
for (let row = 0; row < this._headerCellIds.length; row++) {
// 从header id的二维数组中取出需要操作的source ids
- const sourceIds = this._headerCellIds[row].splice(sourceCellRange.start.row, sourceSize);
+ const sourceIds = this._headerCellIds[row].splice(
+ sourceCellRange.start.row - this.columnSeriesNumberColumnCount,
+ sourceSize
+ );
// 将source ids插入到目标地址targetCol处
// 把sourceIds变成一个适合splice的数组(包含splice前2个参数的数组) 以通过splice来插入sourceIds数组
- sourceIds.unshift(targetIndex, 0);
+ sourceIds.unshift(targetIndex - this.columnSeriesNumberColumnCount, 0);
Array.prototype.splice.apply(this._headerCellIds[row], sourceIds);
}
//将_columns的列定义调整位置 同调整_headerCellIds逻辑
- const sourceColumns = this._columns.splice(sourceCellRange.start.row, sourceSize);
- sourceColumns.unshift(targetIndex as any, 0 as any);
+ const sourceColumns = this._columns.splice(
+ sourceCellRange.start.row - this.columnSeriesNumberColumnCount,
+ sourceSize
+ );
+ (sourceColumns as any).unshift(targetIndex - this.columnSeriesNumberColumnCount, 0 as any);
Array.prototype.splice.apply(this._columns, sourceColumns);
// 对表头columnTree调整节点位置
@@ -1309,7 +1394,7 @@ export class SimpleHeaderLayoutMap implements LayoutMapAPI {
targetSize: targetCellRange.end.row - targetCellRange.start.row + 1,
moveType: 'row'
};
- } else if (this.isSeriesNumberInBody(source.col, source.row)) {
+ } else if (this.isRowSeriesNumberInBody(source.col, source.row)) {
return {
sourceIndex: source.row,
targetIndex: target.row,
diff --git a/packages/vtable/src/scenegraph/component/cell-mover.ts b/packages/vtable/src/scenegraph/component/cell-mover.ts
index fd562c68d5..ffcaac9a3a 100644
--- a/packages/vtable/src/scenegraph/component/cell-mover.ts
+++ b/packages/vtable/src/scenegraph/component/cell-mover.ts
@@ -94,7 +94,7 @@ export class CellMover {
linePoints.push({ x: 0, y: this.table.tableNoFrameHeight });
} else if (
cellLocation === 'rowHeader' ||
- (this.table.internalProps.layoutMap as SimpleHeaderLayoutMap).isSeriesNumberInBody(col, row)
+ (this.table.internalProps.layoutMap as SimpleHeaderLayoutMap).isRowSeriesNumberInBody(col, row)
) {
rectY = this.table.getRowsHeight(0, row - 1) - this.table.stateManager.scroll.verticalBarPos;
rectX = this.table.getColsWidth(0, this.table.frozenColCount - 1);
diff --git a/packages/vtable/src/scenegraph/group-creater/cell-helper.ts b/packages/vtable/src/scenegraph/group-creater/cell-helper.ts
index 9bc94abe3a..871ce54521 100644
--- a/packages/vtable/src/scenegraph/group-creater/cell-helper.ts
+++ b/packages/vtable/src/scenegraph/group-creater/cell-helper.ts
@@ -375,7 +375,7 @@ export function createCell(
} else if (type === 'checkbox') {
const isAggregation =
'isAggregation' in table.internalProps.layoutMap && table.internalProps.layoutMap.isAggregation(col, row);
- const isSeriesNumber = table.internalProps.layoutMap.isSeriesNumber(col, row);
+ const isSeriesNumber = table.internalProps.layoutMap.isRowSeriesNumber(col, row);
if (isAggregation && isSeriesNumber) {
const createTextCellGroup = Factory.getFunction('createTextCellGroup') as CreateTextCellGroup;
cellGroup = createTextCellGroup(
diff --git a/packages/vtable/src/scenegraph/group-creater/cell-type/checkbox-cell.ts b/packages/vtable/src/scenegraph/group-creater/cell-type/checkbox-cell.ts
index 36b2c77b19..ef7c50f167 100644
--- a/packages/vtable/src/scenegraph/group-creater/cell-type/checkbox-cell.ts
+++ b/packages/vtable/src/scenegraph/group-creater/cell-type/checkbox-cell.ts
@@ -333,7 +333,7 @@ function createCheckbox(
text = '';
}
// 处理 rowSeriesNumbe 在record设置checkbox是否勾选与是否禁用的场景
- if (table.internalProps.layoutMap.isSeriesNumber(col, row)) {
+ if (table.internalProps.layoutMap.isRowSeriesNumber(col, row)) {
const checkboxSeriesNumberStyle = (table as ListTable).getFieldData(define.field, col, row);
if (checkboxSeriesNumberStyle) {
isChecked = checkboxSeriesNumberStyle.checked;
diff --git a/packages/vtable/src/scenegraph/group-creater/column-helper.ts b/packages/vtable/src/scenegraph/group-creater/column-helper.ts
index 33f2abbdf8..8cc4b4cfd5 100644
--- a/packages/vtable/src/scenegraph/group-creater/column-helper.ts
+++ b/packages/vtable/src/scenegraph/group-creater/column-helper.ts
@@ -127,7 +127,7 @@ export function createComplexColumn(
if (
!table.isPivotTable() &&
(cellLocation === 'columnHeader' || cellLocation === 'cornerHeader') &&
- row >= table.columnHeaderLevelCount
+ row >= table.columnHeaderLevelCount + table.internalProps.layoutMap.columnSeriesNumberColumnCount
) {
cellLocation = 'body';
}
@@ -143,7 +143,7 @@ export function createComplexColumn(
}
const isAggregation =
'isAggregation' in table.internalProps.layoutMap && table.internalProps.layoutMap.isAggregation(col, row);
- const isSeriesNumber = table.internalProps.layoutMap.isSeriesNumber(col, row);
+ const isSeriesNumber = table.internalProps.layoutMap.isRowSeriesNumber(col, row);
let mayHaveIcon =
cellLocation !== 'body'
diff --git a/packages/vtable/src/scenegraph/group-creater/progress/create-group-for-first-screen.ts b/packages/vtable/src/scenegraph/group-creater/progress/create-group-for-first-screen.ts
index a601651e39..23af5fac20 100644
--- a/packages/vtable/src/scenegraph/group-creater/progress/create-group-for-first-screen.ts
+++ b/packages/vtable/src/scenegraph/group-creater/progress/create-group-for-first-screen.ts
@@ -86,7 +86,6 @@ export function createGroupForFirstScreen(
x: table.getFrozenColsWidth(),
y: table.getFrozenRowsHeight()
});
-
// create cornerHeaderGroup
createColGroup(
cornerHeaderGroup,
diff --git a/packages/vtable/src/state/cell-move/index.ts b/packages/vtable/src/state/cell-move/index.ts
index be41f3dbd4..ecfff19a6c 100644
--- a/packages/vtable/src/state/cell-move/index.ts
+++ b/packages/vtable/src/state/cell-move/index.ts
@@ -30,7 +30,7 @@ export function startMoveCol(
cellLocation === 'columnHeader'
? state.columnMove.x
: cellLocation === 'rowHeader' ||
- (state.table.internalProps.layoutMap as SimpleHeaderLayoutMap).isSeriesNumberInBody(col, row)
+ (state.table.internalProps.layoutMap as SimpleHeaderLayoutMap).isRowSeriesNumberInBody(col, row)
? state.columnMove.y
: 0;
@@ -108,7 +108,7 @@ export function updateMoveCol(
}
} else if (
cellLocation === 'rowHeader' ||
- (state.table.internalProps.layoutMap as SimpleHeaderLayoutMap).isSeriesNumberInBody(col, row)
+ (state.table.internalProps.layoutMap as SimpleHeaderLayoutMap).isRowSeriesNumberInBody(col, row)
) {
backY = state.columnMove.y;
if (state.table.isFrozenRow(row)) {
@@ -206,7 +206,7 @@ export function endMoveCol(state: StateManager): boolean {
}
if (
!(state.table as ListTable).transpose &&
- (state.table.internalProps.layoutMap as SimpleHeaderLayoutMap).isSeriesNumberInBody(
+ (state.table.internalProps.layoutMap as SimpleHeaderLayoutMap).isRowSeriesNumberInBody(
state.columnMove.colSource,
state.columnMove.rowSource
)
@@ -224,7 +224,10 @@ export function endMoveCol(state: StateManager): boolean {
// clear cell style cache
state.table.clearCellStyleCache();
if (
- state.table.internalProps.layoutMap.isSeriesNumberInBody(state.columnMove.colSource, state.columnMove.rowSource)
+ state.table.internalProps.layoutMap.isRowSeriesNumberInBody(
+ state.columnMove.colSource,
+ state.columnMove.rowSource
+ )
) {
// 如果是拖拽序号换位置 考虑到非拖拽单元格合并而是其他地方有合并被拆开或者独立单元格拖拽后变为合并的情况 这里直接刷新这个场景树的节点 才能覆盖所有情况
state.table.scenegraph.updateHeaderPosition(
diff --git a/packages/vtable/src/state/select/update-position.ts b/packages/vtable/src/state/select/update-position.ts
index 6dda85c6df..b619b7b197 100644
--- a/packages/vtable/src/state/select/update-position.ts
+++ b/packages/vtable/src/state/select/update-position.ts
@@ -207,7 +207,7 @@ export function updateSelectPosition(
skipBodyMerge: true
});
}
- } else if ((table.internalProps.layoutMap as SimpleHeaderLayoutMap).isSeriesNumberInHeader(col, row)) {
+ } else if ((table.internalProps.layoutMap as SimpleHeaderLayoutMap).isRowSeriesNumberInHeader(col, row)) {
// 选中表头行号单元格
extendSelectRange = false;
@@ -261,7 +261,7 @@ export function updateSelectPosition(
// skipBodyMerge: true
// });
// }
- } else if ((table.internalProps.layoutMap as SimpleHeaderLayoutMap).isSeriesNumberInBody(col, row)) {
+ } else if ((table.internalProps.layoutMap as SimpleHeaderLayoutMap).isRowSeriesNumberInBody(col, row)) {
// 选中内容行号单元格
extendSelectRange = false;
if (state.select.headerSelectMode === 'body') {
@@ -280,6 +280,25 @@ export function updateSelectPosition(
skipBodyMerge: true
});
}
+ } else if ((table.internalProps.layoutMap as SimpleHeaderLayoutMap).isColumnSeriesNumber(col, row)) {
+ // 选中列号单元格
+ extendSelectRange = false;
+ if (state.select.headerSelectMode === 'body') {
+ state.select.ranges.push({
+ start: {
+ col,
+ row: table.columnHeaderLevelCount
+ },
+ end: { col: col, row: table.rowCount - 1 },
+ skipBodyMerge: true
+ });
+ } else {
+ state.select.ranges.push({
+ start: { col, row },
+ end: { col: col, row: table.rowCount - 1 },
+ skipBodyMerge: true
+ });
+ }
} else if ((table.internalProps.layoutMap as SimpleHeaderLayoutMap).isCornerHeader(col, row)) {
// 选中表头行号单元格
extendSelectRange = false;
@@ -370,7 +389,7 @@ export function updateSelectPosition(
const currentRange = state.select.ranges[state.select.ranges.length - 1];
if (currentRange) {
if (
- (table.internalProps.layoutMap as SimpleHeaderLayoutMap).isSeriesNumberInBody(
+ (table.internalProps.layoutMap as SimpleHeaderLayoutMap).isRowSeriesNumberInBody(
currentRange.start.col,
currentRange.start.row
)
@@ -462,7 +481,7 @@ export function updateSelectPosition(
} else if (table.isColumnHeader(col, row)) {
currentRange.start.row = table.columnHeaderLevelCount;
currentRange.end.row = table.rowCount - 1;
- } else if ((table.internalProps.layoutMap as SimpleHeaderLayoutMap).isSeriesNumberInBody(col, row)) {
+ } else if ((table.internalProps.layoutMap as SimpleHeaderLayoutMap).isRowSeriesNumberInBody(col, row)) {
currentRange.start.col = table.leftRowSeriesNumberCount;
currentRange.end.col = table.colCount - 1;
} else if (table.isCornerHeader(col, row)) {
diff --git a/packages/vtable/src/tools/util.ts b/packages/vtable/src/tools/util.ts
index bdaca65227..567051c60a 100644
--- a/packages/vtable/src/tools/util.ts
+++ b/packages/vtable/src/tools/util.ts
@@ -443,3 +443,26 @@ export function traverseObject(obj: any, childrenProperty: string, callback: Fun
obj[childrenProperty].forEach((child: any) => traverseObject(child, childrenProperty, callback));
}
}
+
+/**
+ * 生成excel的列标题,规则和excel一致,如A~Z,AA~AZ,AB~AZ,AA~ZZ,AAA~ZZZ
+ * @param index 从0开始
+ * @returns
+ */
+export function generateColumnNumber(index: number): string {
+ // 处理0-25的情况(A-Z)
+ if (index < 26) {
+ return String.fromCharCode(65 + index);
+ }
+
+ const title = [];
+ index++; // 调整索引,使得第一个26变成AA
+
+ while (index > 0) {
+ index--; // 每次循环前减1,以正确处理进位
+ title.unshift(String.fromCharCode(65 + (index % 26)));
+ index = Math.floor(index / 26);
+ }
+
+ return title.join('');
+}
diff --git a/packages/vtable/src/ts-types/base-table.ts b/packages/vtable/src/ts-types/base-table.ts
index 56a8dacf83..5b4f082a8d 100644
--- a/packages/vtable/src/ts-types/base-table.ts
+++ b/packages/vtable/src/ts-types/base-table.ts
@@ -65,7 +65,7 @@ import type {
IPivotChartDataConfig,
IListTableDataConfig,
IRowSeriesNumber,
- ColumnSeriesNumber,
+ IColumnSeriesNumber,
ColumnStyleOption,
WidthAdaptiveModeDef,
HeightAdaptiveModeDef,
@@ -134,7 +134,7 @@ export interface IBaseTableProtected {
rowSeriesNumber?: IRowSeriesNumber;
/** 启动复选框级联 */
enableCheckboxCascade?: boolean;
- columnSeriesNumber?: ColumnSeriesNumber[];
+ columnSeriesNumber?: IColumnSeriesNumber;
// disableRowHeaderColumnResize?: boolean;
columnResizeMode?: 'all' | 'none' | 'header' | 'body';
@@ -541,7 +541,7 @@ export interface BaseTableConstructorOptions {
rowSeriesNumber?: IRowSeriesNumber;
/** 启用复选框级联 */
enableCheckboxCascade?: boolean;
- // columnSeriesNumber?: ColumnSeriesNumber[];
+ columnSeriesNumber?: IColumnSeriesNumber;
customCellStyle?: CustomCellStyle[];
customCellStyleArrangement?: CustomCellStyleArrangement[];
@@ -835,7 +835,7 @@ export interface BaseTableAPI {
getHeaderField: (col: number, row: number) => any | undefined;
_getHeaderCellBySortState: (sortState: SortState) => CellAddress | undefined;
- getHeaderDefine: (col: number, row: number) => ColumnDefine | IRowSeriesNumber | ColumnSeriesNumber;
+ getHeaderDefine: (col: number, row: number) => ColumnDefine | IRowSeriesNumber | IColumnSeriesNumber;
_getHeaderLayoutMap: (col: number, row: number) => HeaderData | SeriesNumberColumnData;
getContext: () => CanvasRenderingContext2D;
getCellRange: (col: number, row: number) => CellRange;
@@ -843,7 +843,7 @@ export interface BaseTableAPI {
isCellRangeEqual: (col: number, row: number, targetCol: number, targetRow: number) => boolean;
_getLayoutCellId: (col: number, row: number) => LayoutObjectId;
_getBodyLayoutMap: (col: number, row: number) => ColumnData | IndicatorData | SeriesNumberColumnData;
- getBodyColumnDefine: (col: number, row: number) => ColumnDefine | IRowSeriesNumber | ColumnSeriesNumber;
+ getBodyColumnDefine: (col: number, row: number) => ColumnDefine | IRowSeriesNumber | IColumnSeriesNumber;
getBodyColumnType: (col: number, row: number) => ColumnTypeOption;
getCellType: (col: number, row: number) => ColumnTypeOption;
fireListeners: (
diff --git a/packages/vtable/src/ts-types/table-engine.ts b/packages/vtable/src/ts-types/table-engine.ts
index ac785add4b..69f3927fde 100644
--- a/packages/vtable/src/ts-types/table-engine.ts
+++ b/packages/vtable/src/ts-types/table-engine.ts
@@ -84,7 +84,7 @@ export type CellSubLocation =
| 'leftBottomCorner'
| 'rightBottomCorner'
| 'rowSeriesNumber'
- | 'colSeriesNumber';
+ | 'columnSeriesNumber';
export interface SelectAllOnCtrlAOption {
disableHeaderSelect?: boolean;
@@ -146,16 +146,17 @@ export interface IRowSeriesNumber {
headerCustomLayout?: ICustomLayout;
}
-export interface ColumnSeriesNumber {
- enable: boolean;
- align?: 'top' | 'bottom';
- span?: number | 'dependOnNear';
+export interface IColumnSeriesNumber {
+ // enable: boolean;
+ // align?: 'top' | 'bottom';
+ // span?: number | 'dependOnNear';
title?: string;
- field?: FieldDef;
+ // field?: FieldDef;
+ height?: number | 'auto';
format?: (col?: number, row?: number, table?: BaseTableAPI) => any;
cellType?: 'text' | 'link' | 'image' | 'video' | 'checkbox';
style?: ITextStyleOption | ((styleArg: StylePropertyFunctionArg) => ITextStyleOption);
- headerStyle?: ITextStyleOption | ((styleArg: StylePropertyFunctionArg) => ITextStyleOption);
+ // headerStyle?: ITextStyleOption | ((styleArg: StylePropertyFunctionArg) => ITextStyleOption);
icon?:
| string
| ColumnIconOption
@@ -163,10 +164,10 @@ export interface ColumnSeriesNumber {
| ((args: CellInfo) => undefined | string | ColumnIconOption | (string | ColumnIconOption)[]);
/** 选中整行或者全选时 是否包括序号部分 */
selectRangeInclude?: boolean;
- /** 是否可拖拽顺序 */
- dragOrder?: boolean;
- /** 是否显示调换顺序的图标 */
- showDragOrderIcon?: boolean;
+ // /** 是否可拖拽顺序 */
+ // dragOrder?: boolean;
+ // /** 是否显示调换顺序的图标 */
+ // showDragOrderIcon?: boolean;
}
export interface DataSourceAPI {
clearCurrentIndexedData: () => void;