From 12ee851a887c5afa1e142541463891adcd35697f Mon Sep 17 00:00:00 2001
From: fangsmile <892739385@qq.com>
Date: Sun, 15 Jun 2025 22:09:18 +0800
Subject: [PATCH 01/17] feat: series number component
---
.../browser/examples/table-series-number.ts | 13 +
.../__tests__/browser/main.ts | 4 +
packages/vrender-components/src/index.ts | 1 +
.../src/table-series-number/index.ts | 2 +
.../src/table-series-number/register.ts | 8 +
.../table-series-number.ts | 354 ++++++++++++++++++
.../src/table-series-number/type.ts | 93 +++++
7 files changed, 475 insertions(+)
create mode 100644 packages/vrender-components/__tests__/browser/examples/table-series-number.ts
create mode 100644 packages/vrender-components/src/table-series-number/index.ts
create mode 100644 packages/vrender-components/src/table-series-number/register.ts
create mode 100644 packages/vrender-components/src/table-series-number/table-series-number.ts
create mode 100644 packages/vrender-components/src/table-series-number/type.ts
diff --git a/packages/vrender-components/__tests__/browser/examples/table-series-number.ts b/packages/vrender-components/__tests__/browser/examples/table-series-number.ts
new file mode 100644
index 000000000..ce07b9e8f
--- /dev/null
+++ b/packages/vrender-components/__tests__/browser/examples/table-series-number.ts
@@ -0,0 +1,13 @@
+import '@visactor/vrender';
+import { IPointLike } from '@visactor/vutils';
+import render from '../../util/render';
+import { EmptyTip, TableSeriesNumber } from '../../../src';
+
+export function run() {
+ const tableSeriesNumber: TableSeriesNumber = new TableSeriesNumber({
+ rowCount: 10,
+ columnCount: 10
+ });
+
+ const stage = render(tableSeriesNumber, 'main');
+}
diff --git a/packages/vrender-components/__tests__/browser/main.ts b/packages/vrender-components/__tests__/browser/main.ts
index 44d5ab92d..545648b86 100644
--- a/packages/vrender-components/__tests__/browser/main.ts
+++ b/packages/vrender-components/__tests__/browser/main.ts
@@ -2,6 +2,10 @@ import './style.css';
const LOCAL_STORAGE_KEY = 'VRENDER_COMPONENTS_DEMOS';
const specs = [
+ {
+ path: 'table-series-number',
+ name: '表格序号'
+ },
{
path: 'axis-break',
name: '轴截断'
diff --git a/packages/vrender-components/src/index.ts b/packages/vrender-components/src/index.ts
index 49db22017..10d532b4f 100644
--- a/packages/vrender-components/src/index.ts
+++ b/packages/vrender-components/src/index.ts
@@ -32,3 +32,4 @@ export * from './weather';
export * from './util';
export * from './switch';
export * from './label-item';
+export * from './table-series-number';
diff --git a/packages/vrender-components/src/table-series-number/index.ts b/packages/vrender-components/src/table-series-number/index.ts
new file mode 100644
index 000000000..bf16e5242
--- /dev/null
+++ b/packages/vrender-components/src/table-series-number/index.ts
@@ -0,0 +1,2 @@
+export * from './table-series-number';
+export * from './type';
diff --git a/packages/vrender-components/src/table-series-number/register.ts b/packages/vrender-components/src/table-series-number/register.ts
new file mode 100644
index 000000000..4b690a0d7
--- /dev/null
+++ b/packages/vrender-components/src/table-series-number/register.ts
@@ -0,0 +1,8 @@
+import { registerGroup, registerImage, registerRect, registerText } from '@visactor/vrender-kits';
+
+export function loadTableSeriesNumberComponent() {
+ registerGroup();
+ // registerRect();
+ registerText();
+ registerImage();
+}
diff --git a/packages/vrender-components/src/table-series-number/table-series-number.ts b/packages/vrender-components/src/table-series-number/table-series-number.ts
new file mode 100644
index 000000000..964132355
--- /dev/null
+++ b/packages/vrender-components/src/table-series-number/table-series-number.ts
@@ -0,0 +1,354 @@
+import type { Dict } from '@visactor/vutils';
+import { isValid, merge, normalizePadding } from '@visactor/vutils';
+import { AbstractComponent } from '../core/base';
+import type { TableSeriesNumberAttributes } from './type';
+import type { FederatedPointerEvent, Group, IGroup } from '@visactor/vrender-core';
+import { Image, Rect, Text, graphicCreator } from '@visactor/vrender-core';
+import type { ComponentOptions } from '../interface';
+import { loadTableSeriesNumberComponent } from './register';
+export enum SeriesNumberCellStateValue {
+ hover = 'hover',
+ select = 'select'
+}
+export enum SeriesNumberEvent {
+ seriesNumberCellHover = 'seriesNumberCellHover',
+ seriesNumberCellUnHover = 'seriesNumberCellUnHover',
+ seriesNumberCellClick = 'seriesNumberCellClick'
+}
+const cornerSvg =
+ '';
+
+loadTableSeriesNumberComponent();
+export class TableSeriesNumber extends AbstractComponent> {
+ static defaultAttributes: Partial = {
+ rowCount: 100,
+ columnCount: 100,
+ rowSeriesNumberWidth: 'auto',
+ columnSeriesNumberHeight: 'auto',
+ rowSeriesNumberCellStyle: {
+ text: {
+ fontSize: 14,
+ fill: '#000',
+ pickable: false
+ },
+ borderLine: {
+ stroke: '#000',
+ lineWidth: 1,
+ pickable: false
+ },
+ states: {
+ hover: {
+ fill: 'gray',
+ opacity: 0.7
+ },
+ select: {
+ fill: 'gray',
+ opacity: 0.7
+ }
+ }
+ },
+ columnSeriesNumberCellStyle: {
+ text: {
+ fontSize: 14,
+ fill: '#000',
+ pickable: false
+ },
+ borderLine: {
+ stroke: '#000',
+ lineWidth: 1,
+ pickable: false
+ },
+ states: {
+ hover: {
+ fill: 'gray',
+ opacity: 0.7
+ },
+ select: {
+ fill: 'gray',
+ opacity: 0.7
+ }
+ }
+ },
+ cornerCellStyle: {
+ borderLine: {
+ stroke: '#000',
+ lineWidth: 1,
+ pickable: false
+ },
+ states: {
+ hover: {
+ fill: 'gray',
+ opacity: 0.7
+ },
+ select: {
+ fill: 'gray',
+ opacity: 0.7
+ }
+ }
+ }
+ };
+ name = 'legend';
+ protected _innerView!: IGroup;
+ // protected _title: Tag | null = null;
+ _cornerGroup: IGroup;
+ _rowSeriesNumberGroup: IGroup;
+ _columnSeriesNumberGroup: IGroup;
+ _lastActiveItem: IGroup;
+ constructor(attributes: TableSeriesNumberAttributes, options?: ComponentOptions) {
+ super(options?.skipDefault ? attributes : merge({}, TableSeriesNumber.defaultAttributes, attributes));
+ this.render();
+ }
+
+ render() {
+ this.removeAllChild(true);
+ const {
+ rowCount,
+ columnCount,
+ rowSeriesNumberWidth,
+ columnSeriesNumberHeight,
+ rowSeriesNumberCellStyle,
+ columnSeriesNumberCellStyle,
+ rowHeight,
+ columnWidth
+ } = this.attribute;
+ // 创建一个内部的 container 用于存储所有的元素
+ const innerView = graphicCreator.group({
+ x: 0,
+ y: 0,
+ fill: 'gray',
+ width:
+ (typeof rowSeriesNumberWidth === 'number' ? rowSeriesNumberWidth : 20) +
+ columnCount * (typeof columnWidth === 'number' ? columnWidth : 20),
+ height:
+ (typeof columnSeriesNumberHeight === 'number' ? columnSeriesNumberHeight : 20) +
+ rowCount * (typeof rowHeight === 'number' ? rowHeight : 20),
+ pickable: true,
+ childrenPickable: true
+ });
+ // innerView.name = LEGEND_ELEMENT_NAME.innerView;
+ this.add(innerView);
+ this._innerView = innerView;
+
+ this._renderContent();
+
+ this._adjustLayout();
+
+ this._bindEvents();
+ }
+ _renderContent() {
+ this._renderCorner();
+ this._renderRowSeriesNumber();
+ this._renderColumnSeriesNumber();
+ }
+ _renderCorner() {
+ const {
+ rowCount,
+ columnCount,
+ cornerCellStyle: cornerSeriesNumberCellStyle,
+ rowSeriesNumberWidth,
+ columnSeriesNumberHeight,
+ rowSeriesNumberCellStyle,
+ columnSeriesNumberCellStyle,
+ rowHeight,
+ columnWidth
+ } = this.attribute;
+ // 组织角头
+ const cornerGroup = graphicCreator.group({
+ x: 0,
+ y: 0,
+ fill: 'yellow',
+ pickable: true,
+ width: typeof rowSeriesNumberWidth === 'number' ? rowSeriesNumberWidth : 20,
+ height: typeof columnSeriesNumberHeight === 'number' ? columnSeriesNumberHeight : 20
+ });
+ cornerGroup.name = `conerSeriesNumberCell`;
+ cornerGroup.id = '0,0';
+ cornerGroup.states = cornerSeriesNumberCellStyle.states;
+ this._innerView.add(cornerGroup);
+ this._cornerGroup = cornerGroup;
+ }
+ _renderRowSeriesNumber() {
+ const {
+ rowCount,
+ columnCount,
+ rowSeriesNumberWidth,
+ columnSeriesNumberHeight,
+ rowSeriesNumberCellStyle,
+ columnSeriesNumberCellStyle,
+ rowHeight,
+ columnWidth
+ } = this.attribute;
+
+ //组织行号Group
+ const rowSeriesNumberGroup = graphicCreator.group({
+ x: 0,
+ y: typeof rowSeriesNumberWidth === 'number' ? rowSeriesNumberWidth : 20,
+ pickable: true,
+ fill: 'pink',
+ width: typeof rowSeriesNumberWidth === 'number' ? rowSeriesNumberWidth : 20,
+ height: rowCount * (typeof rowHeight === 'number' ? rowHeight : 20)
+ });
+ this._innerView.add(rowSeriesNumberGroup);
+ this._rowSeriesNumberGroup = rowSeriesNumberGroup;
+ //组织每个行号单元格
+ for (let i = 0; i < rowCount; i++) {
+ const cellGroup = graphicCreator.group({
+ x: 0,
+ y: i * (typeof rowHeight === 'number' ? rowHeight : 20),
+ pickable: true,
+ stroke: 'green',
+ width: typeof rowSeriesNumberWidth === 'number' ? rowSeriesNumberWidth : 20,
+ height: typeof rowHeight === 'number' ? rowHeight : 20
+ });
+ cellGroup.name = `rowSeriesNumberCell-${i}`;
+ cellGroup.id = i;
+ cellGroup.states = rowSeriesNumberCellStyle.states;
+ rowSeriesNumberGroup.add(cellGroup);
+
+ const text = graphicCreator.text({
+ x: 0,
+ y: typeof rowHeight === 'number' ? rowHeight : 20,
+ text: `${i + 1}`,
+ pickable: false,
+ ...rowSeriesNumberCellStyle.text
+ });
+ cellGroup.add(text);
+ }
+ }
+ _renderColumnSeriesNumber() {
+ const {
+ rowCount,
+ columnCount,
+ rowSeriesNumberWidth,
+ columnSeriesNumberHeight,
+ rowSeriesNumberCellStyle,
+ columnSeriesNumberCellStyle,
+ rowHeight,
+ columnWidth
+ } = this.attribute;
+ //组织列号Group
+ const columnSeriesNumberGroup = graphicCreator.group({
+ x: typeof rowSeriesNumberWidth === 'number' ? rowSeriesNumberWidth : 20,
+ y: 0,
+ pickable: true,
+ fill: 'red',
+ width: columnCount * (typeof columnWidth === 'number' ? columnWidth : 20),
+ height: typeof columnSeriesNumberHeight === 'number' ? columnSeriesNumberHeight : 20
+ });
+ this._innerView.add(columnSeriesNumberGroup);
+ this._columnSeriesNumberGroup = columnSeriesNumberGroup;
+ //组织每个列号单元格
+ for (let i = 0; i < columnCount; i++) {
+ const cellGroup = graphicCreator.group({
+ x: i * (typeof columnWidth === 'number' ? columnWidth : 20),
+ y: 0,
+ pickable: true,
+ stroke: 'green',
+ width: typeof columnWidth === 'number' ? columnWidth : 20,
+ height: typeof columnSeriesNumberHeight === 'number' ? columnSeriesNumberHeight : 20
+ });
+ cellGroup.name = `columnSeriesNumberCell-${i}`;
+ cellGroup.id = i;
+ columnSeriesNumberGroup.add(cellGroup);
+ const text = graphicCreator.text({
+ x: 0,
+ y: typeof columnSeriesNumberHeight === 'number' ? columnSeriesNumberHeight : 20,
+ text: this.generateColumnField(i),
+ pickable: false,
+ ...columnSeriesNumberCellStyle.text
+ });
+ cellGroup.add(text);
+ cellGroup.states = columnSeriesNumberCellStyle.states;
+ }
+ }
+ _adjustLayout() {
+ //ff
+ }
+ _bindEvents() {
+ //ff
+ const { hover = true, select = true } = this.attribute;
+
+ if (hover) {
+ const trigger = 'pointermove';
+ const triggerOff = 'pointerleave';
+
+ // if (isObject(hover)) {
+ // hover.trigger && (trigger = hover.trigger);
+ // hover.triggerOff && (triggerOff = hover.triggerOff);
+ // }
+
+ this._rowSeriesNumberGroup.addEventListener(trigger, this._onHover as EventListenerOrEventListenerObject);
+ this._rowSeriesNumberGroup.addEventListener(triggerOff, this._onUnHover as EventListenerOrEventListenerObject);
+ this._columnSeriesNumberGroup.addEventListener(trigger, this._onHover as EventListenerOrEventListenerObject);
+ this._columnSeriesNumberGroup.addEventListener(triggerOff, this._onUnHover as EventListenerOrEventListenerObject);
+ this._cornerGroup.addEventListener(trigger, this._onHover as EventListenerOrEventListenerObject);
+ this._cornerGroup.addEventListener(triggerOff, this._onUnHover as EventListenerOrEventListenerObject);
+ }
+
+ if (select) {
+ const trigger = 'pointerdown';
+ // if (isObject(select) && select.trigger) {
+ // trigger = select.trigger;
+ // }
+ this._columnSeriesNumberGroup.addEventListener(trigger, this._onClick as EventListenerOrEventListenerObject);
+ }
+ }
+ private _onHover = (e: FederatedPointerEvent) => {
+ //ff
+ const target = e.target as unknown as IGroup;
+ // 如果上个激活元素存在,则判断当前元素是否和上个激活元素相同,相同则不做处理,不相同则触发 unhover
+ if (this._lastActiveItem) {
+ if (this._lastActiveItem.id === target.id) {
+ return;
+ }
+ this._unHover(this._lastActiveItem, e);
+ }
+ this._hover(target, e);
+ };
+ private _onUnHover = (e: FederatedPointerEvent) => {
+ //ff
+ if (this._lastActiveItem) {
+ this._unHover(this._lastActiveItem, e);
+ this._lastActiveItem = null;
+ }
+ };
+ private _onClick = (e: FederatedPointerEvent) => {
+ //ff
+ const target = e.target;
+ };
+
+ _hover(seriesNumberCell: IGroup, e: FederatedPointerEvent) {
+ this._lastActiveItem = seriesNumberCell;
+ const hover = seriesNumberCell.useStates([SeriesNumberCellStateValue.hover]);
+
+ this._dispatchEvent(SeriesNumberEvent.seriesNumberCellHover, { seriesNumberCell, event: e });
+ }
+
+ private _unHover(seriesNumberCell: IGroup, e: FederatedPointerEvent) {
+ seriesNumberCell.removeState(SeriesNumberCellStateValue.hover);
+ this._dispatchEvent(SeriesNumberEvent.seriesNumberCellHover, { seriesNumberCell, event: e });
+ }
+
+ /**
+ * 生成excel的列标题,规则和excel一致,如A~Z,AA~AZ,AB~AZ,AA~ZZ,AAA~ZZZ
+ * @param index 从0开始
+ * @returns
+ */
+ generateColumnField(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/vrender-components/src/table-series-number/type.ts b/packages/vrender-components/src/table-series-number/type.ts
new file mode 100644
index 000000000..39b76eddd
--- /dev/null
+++ b/packages/vrender-components/src/table-series-number/type.ts
@@ -0,0 +1,93 @@
+import type {
+ IColor,
+ IGroupGraphicAttribute,
+ IImageGraphicAttribute,
+ ILineGraphicAttribute,
+ ITextGraphicAttribute
+} from '@visactor/vrender-core';
+// export type ColumnSeriesNumberAttributes = IGroupGraphicAttribute ;
+
+// export type EmptyTipIcon = IImageGraphicAttribute;
+
+export type TableSeriesNumberAttributes = IGroupGraphicAttribute & {
+ rowSeriesNumberGenerate?: (index: number) => string;
+ rowSeriesNumberWidth?: number | 'auto';
+ rowHeight?: number | 'auto';
+ rowCount?: number;
+ rowSeriesNumberCellStyle?: {
+ text?: ITextGraphicAttribute;
+ borderLine?: ILineGraphicAttribute;
+ bgColor?: IColor;
+ states?: {
+ hover: {
+ fill: IColor;
+ opacity: number;
+ };
+ select?: {
+ fill: IColor;
+ opacity: number;
+ };
+ };
+ };
+ columnSeriesNumberGenerate?: (index: number) => string;
+ columnSeriesNumberHeight?: number | 'auto';
+ columnWidth?: number | 'auto';
+ columnSeriesNumberCellStyle?: {
+ text?: ITextGraphicAttribute;
+ borderLine?: ILineGraphicAttribute;
+ bgColor?: IColor;
+ states?: {
+ hover: {
+ fill: IColor;
+ opacity: number;
+ };
+ select?: {
+ fill: IColor;
+ opacity: number;
+ };
+ };
+ };
+ columnCount?: number;
+ cornerCellStyle?: {
+ borderLine?: ILineGraphicAttribute;
+ bgColor?: IColor;
+ states?: {
+ hover: {
+ fill: IColor;
+ opacity: number;
+ };
+ select?: {
+ fill: IColor;
+ opacity: number;
+ };
+ };
+ };
+ /**
+ * 是否开启选中交互
+ */
+ select?: boolean;
+ // | {
+ // /**
+ // * 触发选中交互的事件类型
+ // * @since 0.20.13
+ // **/
+ // trigger?: GraphicEventType;
+ // };
+
+ /**
+ * 是否开启 hover 交互
+ */
+ hover?: boolean;
+ // | {
+ // /**
+ // * 触发hover交互的事件类型
+ // * @since 0.20.13
+ // **/
+ // trigger?: GraphicEventType;
+ // /**
+ // * 触发取消hover交互的事件类型
+ // * @since 0.20.13
+ // **/
+ // triggerOff?: GraphicEventType;
+ // };
+};
From fba1c11deba820a08ac37569f62065b5eb051e1e Mon Sep 17 00:00:00 2001
From: fangsmile <892739385@qq.com>
Date: Fri, 20 Jun 2025 20:37:49 +0800
Subject: [PATCH 02/17] feat: table series number component
---
.vscode/launch.json | 7 +
.../browser/examples/table-series-number.ts | 13 +-
.../table-series-number.ts | 313 ++++++++++++------
.../src/table-series-number/type.ts | 15 +-
4 files changed, 240 insertions(+), 108 deletions(-)
create mode 100644 .vscode/launch.json
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 000000000..5c7247b40
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,7 @@
+{
+ // Use IntelliSense to learn about possible attributes.
+ // Hover to view descriptions of existing attributes.
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+ "version": "0.2.0",
+ "configurations": []
+}
\ No newline at end of file
diff --git a/packages/vrender-components/__tests__/browser/examples/table-series-number.ts b/packages/vrender-components/__tests__/browser/examples/table-series-number.ts
index ce07b9e8f..59b843e80 100644
--- a/packages/vrender-components/__tests__/browser/examples/table-series-number.ts
+++ b/packages/vrender-components/__tests__/browser/examples/table-series-number.ts
@@ -1,13 +1,22 @@
import '@visactor/vrender';
import { IPointLike } from '@visactor/vutils';
import render from '../../util/render';
-import { EmptyTip, TableSeriesNumber } from '../../../src';
+import { EmptyTip, SeriesNumberEvent, TableSeriesNumber } from '../../../src';
export function run() {
const tableSeriesNumber: TableSeriesNumber = new TableSeriesNumber({
rowCount: 10,
- columnCount: 10
+ colCount: 10
});
const stage = render(tableSeriesNumber, 'main');
+ tableSeriesNumber.on(SeriesNumberEvent.seriesNumberCellClick, e => {
+ console.log(SeriesNumberEvent.seriesNumberCellClick, e);
+ });
+ tableSeriesNumber.on(SeriesNumberEvent.seriesNumberCellHover, e => {
+ console.log(SeriesNumberEvent.seriesNumberCellHover, e);
+ });
+ tableSeriesNumber.on(SeriesNumberEvent.seriesNumberCellUnHover, e => {
+ console.log(SeriesNumberEvent.seriesNumberCellUnHover, e);
+ });
}
diff --git a/packages/vrender-components/src/table-series-number/table-series-number.ts b/packages/vrender-components/src/table-series-number/table-series-number.ts
index 964132355..3d2daf73b 100644
--- a/packages/vrender-components/src/table-series-number/table-series-number.ts
+++ b/packages/vrender-components/src/table-series-number/table-series-number.ts
@@ -13,7 +13,8 @@ export enum SeriesNumberCellStateValue {
export enum SeriesNumberEvent {
seriesNumberCellHover = 'seriesNumberCellHover',
seriesNumberCellUnHover = 'seriesNumberCellUnHover',
- seriesNumberCellClick = 'seriesNumberCellClick'
+ seriesNumberCellClick = 'seriesNumberCellClick',
+ seriesNumberCellCancelClick = 'seriesNumberCellCancelClick'
}
const cornerSvg =
'';
@@ -21,108 +22,132 @@ const cornerSvg =
loadTableSeriesNumberComponent();
export class TableSeriesNumber extends AbstractComponent> {
static defaultAttributes: Partial = {
+ frozenTopRow: 0,
+ frozenLeftCol: 0,
+ frozenRightCol: 0,
+ frozenBottomRow: 0,
+ pickable: false,
rowCount: 100,
- columnCount: 100,
+ colCount: 100,
rowSeriesNumberWidth: 'auto',
- columnSeriesNumberHeight: 'auto',
+ colSeriesNumberHeight: 'auto',
rowSeriesNumberCellStyle: {
text: {
fontSize: 14,
- fill: '#000',
+ fill: '#7A7A7A',
pickable: false
},
borderLine: {
- stroke: '#000',
+ stroke: 'red', // '#D9D9D9',
lineWidth: 1,
pickable: false
},
+ bgColor: '#F9F9F9',
states: {
hover: {
- fill: 'gray',
+ fill: 'red',
opacity: 0.7
},
select: {
- fill: 'gray',
+ fill: 'yellow',
opacity: 0.7
}
}
},
- columnSeriesNumberCellStyle: {
+ colSeriesNumberCellStyle: {
text: {
fontSize: 14,
- fill: '#000',
+ fill: '#7A7A7A',
pickable: false
},
borderLine: {
- stroke: '#000',
+ stroke: '#D9D9D9',
lineWidth: 1,
pickable: false
},
+ bgColor: '#F9F9F9',
states: {
hover: {
- fill: 'gray',
+ fill: '#98C8A5',
opacity: 0.7
},
select: {
- fill: 'gray',
+ fill: 'orange',
opacity: 0.7
}
}
},
cornerCellStyle: {
borderLine: {
- stroke: '#000',
+ stroke: '#D9D9D9',
lineWidth: 1,
pickable: false
},
+ bgColor: '#F9F9F9',
states: {
hover: {
- fill: 'gray',
+ fill: '#98C8A5',
opacity: 0.7
},
select: {
- fill: 'gray',
+ fill: '#98C8A5',
opacity: 0.7
}
}
}
};
- name = 'legend';
+ name = 'tableSeriesNumber';
protected _innerView!: IGroup;
// protected _title: Tag | null = null;
_cornerGroup: IGroup;
+ _frozenTopSeriesNumberGroup: IGroup;
+ _frozenLeftSeriesNumberGroup: IGroup;
+ _frozenRightSeriesNumberGroup: IGroup;
+ _frozenBottomSeriesNumberGroup: IGroup;
_rowSeriesNumberGroup: IGroup;
- _columnSeriesNumberGroup: IGroup;
- _lastActiveItem: IGroup;
+ _colSeriesNumberGroup: IGroup;
+ _lastHoverItem: IGroup;
+ _lastClickItem: IGroup;
constructor(attributes: TableSeriesNumberAttributes, options?: ComponentOptions) {
super(options?.skipDefault ? attributes : merge({}, TableSeriesNumber.defaultAttributes, attributes));
this.render();
}
-
+ get rowSeriesNumberWidth() {
+ const { rowSeriesNumberWidth } = this.attribute;
+ return typeof rowSeriesNumberWidth === 'number' ? rowSeriesNumberWidth : 20;
+ }
+ get colSeriesNumberHeight() {
+ const { colSeriesNumberHeight } = this.attribute;
+ return typeof colSeriesNumberHeight === 'number' ? colSeriesNumberHeight : 20;
+ }
+ get rowCount() {
+ const { rowCount } = this.attribute;
+ return rowCount;
+ }
+ get colCount() {
+ const { colCount } = this.attribute;
+ return colCount;
+ }
render() {
this.removeAllChild(true);
const {
rowCount,
- columnCount,
+ colCount,
rowSeriesNumberWidth,
- columnSeriesNumberHeight,
+ colSeriesNumberHeight,
rowSeriesNumberCellStyle,
- columnSeriesNumberCellStyle,
+ colSeriesNumberCellStyle,
rowHeight,
- columnWidth
+ colWidth
} = this.attribute;
// 创建一个内部的 container 用于存储所有的元素
const innerView = graphicCreator.group({
x: 0,
y: 0,
- fill: 'gray',
- width:
- (typeof rowSeriesNumberWidth === 'number' ? rowSeriesNumberWidth : 20) +
- columnCount * (typeof columnWidth === 'number' ? columnWidth : 20),
- height:
- (typeof columnSeriesNumberHeight === 'number' ? columnSeriesNumberHeight : 20) +
- rowCount * (typeof rowHeight === 'number' ? rowHeight : 20),
- pickable: true,
+ fill: 'rgba(1,1,1,0)',
+ width: this.rowSeriesNumberWidth + colCount * (typeof colWidth === 'number' ? colWidth : 20),
+ height: this.colSeriesNumberHeight + rowCount * (typeof rowHeight === 'number' ? rowHeight : 20),
+ pickable: false,
childrenPickable: true
});
// innerView.name = LEGEND_ELEMENT_NAME.innerView;
@@ -136,30 +161,32 @@ export class TableSeriesNumber extends AbstractComponent {
//ff
const target = e.target as unknown as IGroup;
// 如果上个激活元素存在,则判断当前元素是否和上个激活元素相同,相同则不做处理,不相同则触发 unhover
- if (this._lastActiveItem) {
- if (this._lastActiveItem.id === target.id) {
+ if (this._lastHoverItem) {
+ if (this._lastHoverItem.id === target.id) {
return;
}
- this._unHover(this._lastActiveItem, e);
+ this._unHover(this._lastHoverItem, e);
}
this._hover(target, e);
};
private _onUnHover = (e: FederatedPointerEvent) => {
//ff
- if (this._lastActiveItem) {
- this._unHover(this._lastActiveItem, e);
- this._lastActiveItem = null;
+ if (this._lastHoverItem) {
+ this._unHover(this._lastHoverItem, e);
+ this._lastHoverItem = null;
}
};
private _onClick = (e: FederatedPointerEvent) => {
//ff
- const target = e.target;
+ const target = e.target as unknown as IGroup;
+ if (this._lastClickItem) {
+ if (this._lastClickItem.id === target.id) {
+ return;
+ }
+ this._unClick(this._lastClickItem, e);
+ }
+ this._click(target, e);
};
- _hover(seriesNumberCell: IGroup, e: FederatedPointerEvent) {
- this._lastActiveItem = seriesNumberCell;
- const hover = seriesNumberCell.useStates([SeriesNumberCellStateValue.hover]);
+ private _hover(seriesNumberCell: IGroup, e: FederatedPointerEvent) {
+ this._lastHoverItem = seriesNumberCell;
+ seriesNumberCell.useStates([SeriesNumberCellStateValue.hover]);
this._dispatchEvent(SeriesNumberEvent.seriesNumberCellHover, { seriesNumberCell, event: e });
}
private _unHover(seriesNumberCell: IGroup, e: FederatedPointerEvent) {
seriesNumberCell.removeState(SeriesNumberCellStateValue.hover);
- this._dispatchEvent(SeriesNumberEvent.seriesNumberCellHover, { seriesNumberCell, event: e });
+ this._dispatchEvent(SeriesNumberEvent.seriesNumberCellUnHover, { seriesNumberCell, event: e });
}
+ private _click(seriesNumberCell: IGroup, e: FederatedPointerEvent) {
+ this._lastClickItem = seriesNumberCell;
+ seriesNumberCell.useStates([SeriesNumberCellStateValue.select]);
+
+ this._dispatchEvent(SeriesNumberEvent.seriesNumberCellClick, { seriesNumberCell, event: e });
+ }
+ private _unClick(seriesNumberCell: IGroup, e: FederatedPointerEvent) {
+ seriesNumberCell.removeState(SeriesNumberCellStateValue.select);
+ this._dispatchEvent(SeriesNumberEvent.seriesNumberCellCancelClick, { seriesNumberCell, event: e });
+ }
/**
* 生成excel的列标题,规则和excel一致,如A~Z,AA~AZ,AB~AZ,AA~ZZ,AAA~ZZZ
* @param index 从0开始
* @returns
*/
- generateColumnField(index: number): string {
+ private _generateColField(index: number): string {
// 处理0-25的情况(A-Z)
if (index < 26) {
return String.fromCharCode(65 + index);
@@ -351,4 +394,74 @@ export class TableSeriesNumber extends AbstractComponent a + b, 0);
+ const frozenTopSeriesNumberGroup = graphicCreator.group({
+ x: 0,
+ y: 0,
+ width: this.rowSeriesNumberWidth,
+ height: totalHeight
+ });
+ this._innerView.add(frozenTopSeriesNumberGroup);
+ this._frozenTopSeriesNumberGroup = frozenTopSeriesNumberGroup;
+ for (let i = 0; i < topCellNodes.length; i++) {
+ frozenTopSeriesNumberGroup.add(topCellNodes[i]);
+ }
+ }
}
diff --git a/packages/vrender-components/src/table-series-number/type.ts b/packages/vrender-components/src/table-series-number/type.ts
index 39b76eddd..1c8f7521c 100644
--- a/packages/vrender-components/src/table-series-number/type.ts
+++ b/packages/vrender-components/src/table-series-number/type.ts
@@ -5,11 +5,14 @@ import type {
ILineGraphicAttribute,
ITextGraphicAttribute
} from '@visactor/vrender-core';
-// export type ColumnSeriesNumberAttributes = IGroupGraphicAttribute ;
// export type EmptyTipIcon = IImageGraphicAttribute;
export type TableSeriesNumberAttributes = IGroupGraphicAttribute & {
+ frozenTopRow?: number;
+ frozenLeftCol?: number;
+ frozenRightCol?: number;
+ frozenBottomRow?: number;
rowSeriesNumberGenerate?: (index: number) => string;
rowSeriesNumberWidth?: number | 'auto';
rowHeight?: number | 'auto';
@@ -29,10 +32,10 @@ export type TableSeriesNumberAttributes = IGroupGraphicAttribute & {
};
};
};
- columnSeriesNumberGenerate?: (index: number) => string;
- columnSeriesNumberHeight?: number | 'auto';
- columnWidth?: number | 'auto';
- columnSeriesNumberCellStyle?: {
+ colSeriesNumberGenerate?: (index: number) => string;
+ colSeriesNumberHeight?: number | 'auto';
+ colWidth?: number | 'auto';
+ colSeriesNumberCellStyle?: {
text?: ITextGraphicAttribute;
borderLine?: ILineGraphicAttribute;
bgColor?: IColor;
@@ -47,7 +50,7 @@ export type TableSeriesNumberAttributes = IGroupGraphicAttribute & {
};
};
};
- columnCount?: number;
+ colCount?: number;
cornerCellStyle?: {
borderLine?: ILineGraphicAttribute;
bgColor?: IColor;
From b79d26ff9bc7b7d405f6df95127d31725cbb0ecd Mon Sep 17 00:00:00 2001
From: fangsmile <892739385@qq.com>
Date: Thu, 26 Jun 2025 20:12:38 +0800
Subject: [PATCH 03/17] feat: update series number component
---
.../table-series-number.ts | 855 ++++++++++++++----
.../src/table-series-number/tools.ts | 22 +
.../src/table-series-number/type.ts | 8 +-
3 files changed, 707 insertions(+), 178 deletions(-)
create mode 100644 packages/vrender-components/src/table-series-number/tools.ts
diff --git a/packages/vrender-components/src/table-series-number/table-series-number.ts b/packages/vrender-components/src/table-series-number/table-series-number.ts
index 3d2daf73b..c5ff83f40 100644
--- a/packages/vrender-components/src/table-series-number/table-series-number.ts
+++ b/packages/vrender-components/src/table-series-number/table-series-number.ts
@@ -1,9 +1,9 @@
-import type { Dict } from '@visactor/vutils';
+import { generateColField } from './tools';
import { isValid, merge, normalizePadding } from '@visactor/vutils';
import { AbstractComponent } from '../core/base';
import type { TableSeriesNumberAttributes } from './type';
-import type { FederatedPointerEvent, Group, IGroup } from '@visactor/vrender-core';
-import { Image, Rect, Text, graphicCreator } from '@visactor/vrender-core';
+import type { FederatedPointerEvent, Group, IGroup, IText } from '@visactor/vrender-core';
+import { Image, Rect, Text, createGroup, graphicCreator, parsePadding } from '@visactor/vrender-core';
import type { ComponentOptions } from '../interface';
import { loadTableSeriesNumberComponent } from './register';
export enum SeriesNumberCellStateValue {
@@ -14,7 +14,8 @@ export enum SeriesNumberEvent {
seriesNumberCellHover = 'seriesNumberCellHover',
seriesNumberCellUnHover = 'seriesNumberCellUnHover',
seriesNumberCellClick = 'seriesNumberCellClick',
- seriesNumberCellCancelClick = 'seriesNumberCellCancelClick'
+ seriesNumberCellCancelClick = 'seriesNumberCellCancelClick',
+ rowSeriesNumberWidthChange = 'rowSeriesNumberWidthChange'
}
const cornerSvg =
'';
@@ -22,10 +23,10 @@ const cornerSvg =
loadTableSeriesNumberComponent();
export class TableSeriesNumber extends AbstractComponent> {
static defaultAttributes: Partial = {
- frozenTopRow: 0,
- frozenLeftCol: 0,
- frozenRightCol: 0,
- frozenBottomRow: 0,
+ frozenRowCount: 0,
+ frozenColCount: 0,
+ rightFrozenColCount: 0,
+ bottomFrozenRowCount: 0,
pickable: false,
rowCount: 100,
colCount: 100,
@@ -35,7 +36,8 @@ export class TableSeriesNumber extends AbstractComponent; //记录选中的行号或列号 cellGroup的name
+ // selectColIndexs?:number[],
+ } = { selectIndexs: new Set() };
constructor(attributes: TableSeriesNumberAttributes, options?: ComponentOptions) {
super(options?.skipDefault ? attributes : merge({}, TableSeriesNumber.defaultAttributes, attributes));
- this.render();
+ this._skipRenderAttributes.push('frozenTopRow');
+ this._skipRenderAttributes.push('frozenLeftCol');
+ this._skipRenderAttributes.push('frozenRightCol');
+ this._skipRenderAttributes.push('frozenBottomRow');
+ this._skipRenderAttributes.push('rowCount');
+ this._skipRenderAttributes.push('colCount');
+ // this.render();
}
get rowSeriesNumberWidth() {
const { rowSeriesNumberWidth } = this.attribute;
+ if (this._maxTextWidth) {
+ const textPadding = parsePadding(this.attribute.rowSeriesNumberCellStyle.text.boundsPadding);
+ let totalPadding = 0;
+ if (typeof textPadding === 'number') {
+ totalPadding = textPadding * 2;
+ } else {
+ totalPadding = textPadding[3] + textPadding[1];
+ }
+ return Math.max(
+ this._maxTextWidth + totalPadding,
+ typeof rowSeriesNumberWidth === 'number' ? rowSeriesNumberWidth : 20
+ );
+ }
return typeof rowSeriesNumberWidth === 'number' ? rowSeriesNumberWidth : 20;
}
get colSeriesNumberHeight() {
@@ -129,7 +161,7 @@ export class TableSeriesNumber extends AbstractComponent {
+ if (Math.abs(thisTextMaxWidth - this._maxTextWidth) >= 6) {
+ const oldWidth = this._maxTextWidth;
+ this._maxTextWidth = thisTextMaxWidth;
+ this.changeRowSeriesNumberWidth(Math.max(this.rowSeriesNumberWidth, 20));
+ this._dispatchEvent(SeriesNumberEvent.rowSeriesNumberWidthChange, {
+ newWidth: this.rowSeriesNumberWidth,
+ oldWidth
+ });
+ }
+ }, 100);
}
- _adjustLayout() {
- //ff
+
+ recreateCellsToColSeriesNumberGroup(startIndex: number, endIndex: number) {
+ const { colCount, colSeriesNumberCellStyle, frozenColCount, colWidth } = this
+ .attribute as TableSeriesNumberAttributes;
+ this._frozenLeftColSeriesNumberGroup.removeAllChild();
+ this._colSeriesNumberGroup.removeAllChild();
+ // #region 冻结列序号
+ for (let i = 0; i < frozenColCount; i++) {
+ const cellGroup = this._frozenLeftColSeriesNumberGroup.createOrUpdateChild(
+ `colSeriesNumberCell-${i}`,
+ {
+ x: i * (typeof colWidth === 'number' ? colWidth : 20),
+ y: 0,
+ pickable: true,
+ fill: colSeriesNumberCellStyle.bgColor,
+ stroke: colSeriesNumberCellStyle.borderLine.stroke,
+ lineWidth: colSeriesNumberCellStyle.borderLine.lineWidth,
+ width: typeof colWidth === 'number' ? colWidth : 20,
+ height: this.colSeriesNumberHeight
+ },
+ 'group'
+ ) as IGroup;
+ cellGroup.id = i;
+ cellGroup.states = colSeriesNumberCellStyle.states;
+ if (this.interactionState.selectIndexs?.has(cellGroup.name)) {
+ cellGroup.useStates([SeriesNumberCellStateValue.select]);
+ }
+ const text = cellGroup.createOrUpdateChild(
+ `colSeriesNumberCellText-${i}`,
+ {
+ x: 0,
+ y: this.colSeriesNumberHeight,
+ text: generateColField(i),
+ pickable: false,
+ ...colSeriesNumberCellStyle.text
+ },
+ 'text'
+ );
+ }
+ // #endregion
+
+ this._firstColSeriesNumberIndex = Math.max(startIndex, frozenColCount) - frozenColCount;
+ for (let i = this._firstColSeriesNumberIndex; i <= endIndex - frozenColCount; i++) {
+ const cellGroup = this._colSeriesNumberGroup.createOrUpdateChild(
+ `colSeriesNumberCell-${i + frozenColCount}`,
+ {
+ x: 0,
+ y: 0,
+ pickable: true,
+ fill: colSeriesNumberCellStyle.bgColor,
+ stroke: colSeriesNumberCellStyle.borderLine.stroke,
+ lineWidth: colSeriesNumberCellStyle.borderLine.lineWidth,
+ width: typeof colWidth === 'number' ? colWidth : 20,
+ height: this.colSeriesNumberHeight
+ },
+ 'group'
+ ) as IGroup;
+ cellGroup.id = i + frozenColCount;
+ cellGroup.states = colSeriesNumberCellStyle.states;
+ //判断是否是当前选中的列号
+ if (this.interactionState.selectIndexs?.has(cellGroup.name)) {
+ cellGroup.useStates([SeriesNumberCellStateValue.select]);
+ }
+ const text = cellGroup.createOrUpdateChild(
+ `colSeriesNumberCellText-${i + frozenColCount}`,
+ {
+ x: 0,
+ y: this.colSeriesNumberHeight,
+ boundsPadding: 4,
+ text: generateColField(i + frozenColCount),
+ pickable: false,
+ ...colSeriesNumberCellStyle.text
+ },
+ 'text'
+ );
+ }
}
- _bindEvents() {
+
+ bindEvents() {
//ff
const { hover = true, select = true } = this.attribute;
@@ -311,12 +635,38 @@ export class TableSeriesNumber extends AbstractComponent {
@@ -327,141 +677,298 @@ export class TableSeriesNumber extends AbstractComponent {
//ff
if (this._lastHoverItem) {
- this._unHover(this._lastHoverItem, e);
+ this._unHoverhandler(this._lastHoverItem, e);
this._lastHoverItem = null;
}
};
private _onClick = (e: FederatedPointerEvent) => {
//ff
const target = e.target as unknown as IGroup;
- if (this._lastClickItem) {
- if (this._lastClickItem.id === target.id) {
- return;
+ if (this.interactionState.selectIndexs?.size) {
+ if (this.interactionState.selectIndexs.has(target.name)) {
+ if (e.nativeEvent.ctrlKey || e.nativeEvent.metaKey) {
+ this._unClickhandler(target.name, e);
+ } else {
+ for (const name of this.interactionState.selectIndexs) {
+ this._unClickhandler(name, e);
+ }
+ }
+ } else {
+ if (e.nativeEvent.ctrlKey || e.nativeEvent.metaKey) {
+ // nothing
+ } else {
+ for (const name of this.interactionState.selectIndexs) {
+ this._unClickhandler(name, e);
+ }
+ }
}
- this._unClick(this._lastClickItem, e);
}
- this._click(target, e);
+ this._clickhandler(target, e);
};
- private _hover(seriesNumberCell: IGroup, e: FederatedPointerEvent) {
+ private _hoverhandler(seriesNumberCell: IGroup, e: FederatedPointerEvent) {
this._lastHoverItem = seriesNumberCell;
- seriesNumberCell.useStates([SeriesNumberCellStateValue.hover]);
+ //需兼顾select状态
+ if (seriesNumberCell.hasState(SeriesNumberCellStateValue.select)) {
+ seriesNumberCell.useStates([SeriesNumberCellStateValue.select, SeriesNumberCellStateValue.hover]);
+ } else {
+ seriesNumberCell.useStates([SeriesNumberCellStateValue.hover]);
+ }
this._dispatchEvent(SeriesNumberEvent.seriesNumberCellHover, { seriesNumberCell, event: e });
}
- private _unHover(seriesNumberCell: IGroup, e: FederatedPointerEvent) {
+ private _unHoverhandler(seriesNumberCell: IGroup, e: FederatedPointerEvent) {
seriesNumberCell.removeState(SeriesNumberCellStateValue.hover);
this._dispatchEvent(SeriesNumberEvent.seriesNumberCellUnHover, { seriesNumberCell, event: e });
}
- private _click(seriesNumberCell: IGroup, e: FederatedPointerEvent) {
- this._lastClickItem = seriesNumberCell;
+ private _clickhandler(seriesNumberCell: IGroup, e: FederatedPointerEvent) {
+ this.interactionState.selectIndexs.add(seriesNumberCell.name);
seriesNumberCell.useStates([SeriesNumberCellStateValue.select]);
-
this._dispatchEvent(SeriesNumberEvent.seriesNumberCellClick, { seriesNumberCell, event: e });
}
- private _unClick(seriesNumberCell: IGroup, e: FederatedPointerEvent) {
+ private _unClickhandler(seriesNumberIndex: string, e: FederatedPointerEvent) {
+ const isRow = seriesNumberIndex.startsWith('row');
+ const isCol = seriesNumberIndex.startsWith('col');
+
+ this.interactionState.selectIndexs.delete(seriesNumberIndex);
+
+ const seriesNumberCell = isRow
+ ? this.getRowSeriesNumberCellGroup(Number(seriesNumberIndex.split('-')[1]))
+ : this.getColSeriesNumberCellGroup(Number(seriesNumberIndex.split('-')[1]));
seriesNumberCell.removeState(SeriesNumberCellStateValue.select);
this._dispatchEvent(SeriesNumberEvent.seriesNumberCellCancelClick, { seriesNumberCell, event: e });
}
- /**
- * 生成excel的列标题,规则和excel一致,如A~Z,AA~AZ,AB~AZ,AA~ZZ,AAA~ZZZ
- * @param index 从0开始
- * @returns
- */
- private _generateColField(index: number): string {
- // 处理0-25的情况(A-Z)
- if (index < 26) {
- return String.fromCharCode(65 + index);
- }
- const title = [];
- index++; // 调整索引,使得第一个26变成AA
+ changeRowSeriesNumberWidth(newWidth: number) {
+ const {
+ rowHeight,
+ rowCount: oldRowCount,
+ frozenRowCount,
+ frozenColCount: frozenLeftCol,
+ rowSeriesNumberCellStyle
+ } = this.attribute as TableSeriesNumberAttributes;
+ // 修改角头宽度
+ this._cornerGroup.setAttributes({
+ width: newWidth
+ });
- while (index > 0) {
- index--; // 每次循环前减1,以正确处理进位
- title.unshift(String.fromCharCode(65 + (index % 26)));
- index = Math.floor(index / 26);
+ //修改行序号冻结部分宽度
+ this._frozenTopRowSeriesNumberGroup.setAttributes({
+ width: newWidth
+ });
+ for (let i = 0; i < this._frozenTopRowSeriesNumberGroup.children.length; i++) {
+ this.setRowSeriesNumberCellAttributes(i, {
+ width: newWidth
+ });
}
- return title.join('');
+ //修改行序号整体宽度
+ this._rowSeriesNumberGroup.setAttributes({
+ width: newWidth
+ });
+ for (let i = 0; i < this._rowSeriesNumberGroup.children.length; i++) {
+ this.setRowSeriesNumberCellAttributes(i + this._firstRowSeriesNumberIndex + frozenRowCount, {
+ width: newWidth
+ });
+ }
+
+ // 修改列序号Group x坐标
+ this._frozenLeftColSeriesNumberGroup.setAttributes({
+ x: newWidth
+ });
+ // 修改列序号Group x坐标
+ this._colSeriesNumberGroup.setAttributes({
+ x: newWidth + this._frozenLeftColSeriesNumberGroup.getAttributes().width
+ });
}
+
getRowSeriesNumberCellGroup(index: number) {
+ const { frozenRowCount } = this.getAttributes() as TableSeriesNumberAttributes;
+ if (index >= 0 && index < frozenRowCount) {
+ return this._frozenTopRowSeriesNumberGroup.children[index];
+ }
const rowSeriesNumberGroup = this._rowSeriesNumberGroup;
- const rowSeriesNumberCell = rowSeriesNumberGroup.children[index];
+ const rowSeriesNumberCell = rowSeriesNumberGroup.children[index - frozenRowCount - this._firstRowSeriesNumberIndex];
return rowSeriesNumberCell;
}
getColSeriesNumberCellGroup(index: number) {
+ const { frozenColCount } = this.getAttributes() as TableSeriesNumberAttributes;
+ if (index >= 0 && index < frozenColCount) {
+ return this._frozenLeftColSeriesNumberGroup.children[index];
+ }
const colSeriesNumberGroup = this._colSeriesNumberGroup;
- const colSeriesNumberCell = colSeriesNumberGroup.children[index];
+ const colSeriesNumberCell = colSeriesNumberGroup.children[index - frozenColCount - this._firstColSeriesNumberIndex];
return colSeriesNumberCell;
}
getRowSeriesNumberCellAttributes(index: number) {
+ const { frozenRowCount } = this.getAttributes() as TableSeriesNumberAttributes;
+ if (index >= 0 && index < frozenRowCount) {
+ return this._frozenTopRowSeriesNumberGroup.children[index].attribute;
+ }
const rowSeriesNumberGroup = this._rowSeriesNumberGroup;
- const rowSeriesNumberCell = rowSeriesNumberGroup.children[index];
+ const rowSeriesNumberCell = rowSeriesNumberGroup.children[index - frozenRowCount - this._firstRowSeriesNumberIndex];
return rowSeriesNumberCell.attribute;
}
getColSeriesNumberCellAttributes(index: number) {
+ const { frozenColCount } = this.getAttributes() as TableSeriesNumberAttributes;
+ if (index >= 0 && index < frozenColCount) {
+ return this._frozenLeftColSeriesNumberGroup.children[index].attribute;
+ }
const colSeriesNumberGroup = this._colSeriesNumberGroup;
- const colSeriesNumberCell = colSeriesNumberGroup.children[index];
+ const colSeriesNumberCell = colSeriesNumberGroup.children[index - frozenColCount - this._firstColSeriesNumberIndex];
return colSeriesNumberCell.attribute;
}
setRowSeriesNumberCellAttributes(index: number, attributes: TableSeriesNumberAttributes) {
//找到rowSeriesNumberGroup中对应的子元素,并设置其属性
+ const { frozenRowCount } = this.getAttributes() as TableSeriesNumberAttributes;
+ if (index >= 0 && index < frozenRowCount) {
+ const { height: oldHeight, width: oldWidth, y } = this._frozenTopRowSeriesNumberGroup.getAttributes();
+ this._frozenTopRowSeriesNumberGroup.children[index].setAttributes(attributes);
+ if (attributes.height) {
+ this._frozenTopRowSeriesNumberGroup.setAttributes({
+ height: this._frozenTopRowSeriesNumberGroup.getAttributes().height + (attributes.height - oldHeight)
+ });
+ }
+ if (attributes.width) {
+ this._frozenTopRowSeriesNumberGroup.setAttributes({
+ width: this._frozenTopRowSeriesNumberGroup.getAttributes().width + (attributes.width - oldWidth)
+ });
+ }
+ if (attributes.height) {
+ this._rowSeriesNumberGroup.setAttributes({
+ y:
+ this._frozenTopRowSeriesNumberGroup.getAttributes().height +
+ this._frozenTopRowSeriesNumberGroup.getAttributes().y
+ });
+ }
+
+ return;
+ }
const rowSeriesNumberGroup = this._rowSeriesNumberGroup;
- const rowSeriesNumberCell = rowSeriesNumberGroup.children[index];
+ const rowSeriesNumberCell = rowSeriesNumberGroup.children[index - frozenRowCount - this._firstRowSeriesNumberIndex];
rowSeriesNumberCell.setAttributes(attributes);
}
setColSeriesNumberCellAttributes(index: number, attributes: TableSeriesNumberAttributes) {
//找到colSeriesNumberGroup中对应的子元素,并设置其属性
+ const { frozenColCount: frozenColCount } = this.getAttributes() as TableSeriesNumberAttributes;
+ if (index >= 0 && index < frozenColCount) {
+ const { height: oldHeight, width: oldWidth, x } = this._frozenLeftColSeriesNumberGroup.getAttributes();
+ this._frozenLeftColSeriesNumberGroup.children[index].setAttributes(attributes);
+ if (attributes.height) {
+ this._frozenLeftColSeriesNumberGroup.setAttributes({
+ height: this._frozenLeftColSeriesNumberGroup.getAttributes().height + (attributes.height - oldHeight)
+ });
+ }
+ if (attributes.width) {
+ this._frozenLeftColSeriesNumberGroup.setAttributes({
+ width: this._frozenLeftColSeriesNumberGroup.getAttributes().width + (attributes.width - oldWidth)
+ });
+ }
+ if (attributes.width) {
+ this._colSeriesNumberGroup.setAttributes({
+ x:
+ this._frozenLeftColSeriesNumberGroup.getAttributes().width +
+ this._frozenLeftColSeriesNumberGroup.getAttributes().x
+ });
+ }
+
+ return;
+ }
const colSeriesNumberGroup = this._colSeriesNumberGroup;
- const colSeriesNumberCell = colSeriesNumberGroup.children[index];
+ const colSeriesNumberCell = colSeriesNumberGroup.children[index - frozenColCount - this._firstColSeriesNumberIndex];
colSeriesNumberCell.setAttributes(attributes);
}
- setScrollLeft(scrollLeft: number) {
- const currentX = this._cornerGroup.getAttributes().width;
- this._colSeriesNumberGroup.setAttributes({
- x: currentX - scrollLeft
- });
+ setRowSeriesNumberGroupAttributes(attributes: TableSeriesNumberAttributes) {
+ this._rowSeriesNumberGroup.setAttributes(attributes);
}
- setScrollTop(scrollTop: number) {
- const currentY = this._cornerGroup.getAttributes().height;
- this._rowSeriesNumberGroup.setAttributes({
- y: currentY - scrollTop
- });
+ setColSeriesNumberGroupAttributes(attributes: TableSeriesNumberAttributes) {
+ this._colSeriesNumberGroup.setAttributes(attributes);
}
- setFrozenTopRow(row: number) {
- this.setAttributes({
- frozenTopRow: row
- });
- const rowHeights: number[] = [];
- const topCellNodes: IGroup[] = [];
- for (let i = 0; i < row; i++) {
- const cellGroup = this._rowSeriesNumberGroup.children[i];
- rowHeights.push(cellGroup.getAttributes().height);
- topCellNodes.push(cellGroup);
- cellGroup.parent.removeChild(cellGroup);
+ addSelectedIndex(isRow: boolean, index: number) {
+ let name: string;
+ if (isRow) {
+ name = `rowSeriesNumberCell-${index}`;
+ } else {
+ name = `colSeriesNumberCell-${index}`;
}
- const totalHeight = rowHeights.reduce((a, b) => a + b, 0);
- const frozenTopSeriesNumberGroup = graphicCreator.group({
- x: 0,
- y: 0,
- width: this.rowSeriesNumberWidth,
- height: totalHeight
- });
- this._innerView.add(frozenTopSeriesNumberGroup);
- this._frozenTopSeriesNumberGroup = frozenTopSeriesNumberGroup;
- for (let i = 0; i < topCellNodes.length; i++) {
- frozenTopSeriesNumberGroup.add(topCellNodes[i]);
+ this.interactionState.selectIndexs.add(name);
+ }
+ addRowSelectedRanges(ranges: { startIndex: number; endIndex: number }[]) {
+ const t0 = performance.now();
+ for (let i = 0; i < ranges.length; i++) {
+ const { startIndex, endIndex } = ranges[i];
+ for (let j = startIndex; j <= endIndex; j++) {
+ const name = `rowSeriesNumberCell-${j}`;
+ this.interactionState.selectIndexs.add(name);
+ }
+ }
+ const t1 = performance.now();
+ }
+ addColSelectedRanges(ranges: { startIndex: number; endIndex: number }[]) {
+ for (let i = 0; i < ranges.length; i++) {
+ const { startIndex, endIndex } = ranges[i];
+ for (let j = startIndex; j <= endIndex; j++) {
+ const name = `colSeriesNumberCell-${j}`;
+ this.interactionState.selectIndexs.add(name);
+ }
+ }
+ }
+ resetAllSelectedIndexs({ rowIndexs, colIndexs }: { rowIndexs?: number[]; colIndexs?: number[] }) {
+ this.interactionState.selectIndexs = new Set();
+ if (rowIndexs) {
+ for (let i = 0; i < rowIndexs.length; i++) {
+ const name = `rowSeriesNumberCell-${rowIndexs[i]}`;
+ this.interactionState.selectIndexs.add(name);
+ }
+ }
+ if (colIndexs) {
+ for (let i = 0; i < colIndexs.length; i++) {
+ const name = `colSeriesNumberCell-${colIndexs[i]}`;
+ this.interactionState.selectIndexs.add(name);
+ }
+ }
+ }
+ removeSelectedIndex(isRow: boolean, index: number) {
+ let name: string;
+ if (isRow) {
+ name = `rowSeriesNumberLeftCell-${index}`;
+ } else {
+ name = `colSeriesNumberCell-${index}`;
+ }
+ this.interactionState.selectIndexs.delete(name);
+ }
+ removeAllSelectedIndexs() {
+ for (const name of this.interactionState.selectIndexs) {
+ const isRow = name.startsWith('row');
+ const index = Number(name.split('-')[1]);
+ if (isRow) {
+ this.getRowSeriesNumberCellGroup(index)?.removeState(SeriesNumberCellStateValue.select);
+ } else {
+ this.getColSeriesNumberCellGroup(index)?.removeState(SeriesNumberCellStateValue.select);
+ }
+ }
+ this.interactionState.selectIndexs.clear();
+ }
+ renderSelectedIndexsState() {
+ const { rowSeriesNumberCellStyle, colSeriesNumberCellStyle } = this.attribute as TableSeriesNumberAttributes;
+ for (const name of this.interactionState.selectIndexs) {
+ const isRow = name.startsWith('row');
+ const index = Number(name.split('-')[1]);
+ if (isRow) {
+ this.getRowSeriesNumberCellGroup(index)?.useStates([SeriesNumberCellStateValue.select]);
+ } else {
+ this.getColSeriesNumberCellGroup(index)?.useStates([SeriesNumberCellStateValue.select]);
+ }
}
}
}
diff --git a/packages/vrender-components/src/table-series-number/tools.ts b/packages/vrender-components/src/table-series-number/tools.ts
new file mode 100644
index 000000000..6cffe5306
--- /dev/null
+++ b/packages/vrender-components/src/table-series-number/tools.ts
@@ -0,0 +1,22 @@
+/**
+ * 生成excel的列标题,规则和excel一致,如A~Z,AA~AZ,AB~AZ,AA~ZZ,AAA~ZZZ
+ * @param index 从0开始
+ * @returns
+ */
+export function generateColField(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/vrender-components/src/table-series-number/type.ts b/packages/vrender-components/src/table-series-number/type.ts
index 1c8f7521c..9f39ccaf1 100644
--- a/packages/vrender-components/src/table-series-number/type.ts
+++ b/packages/vrender-components/src/table-series-number/type.ts
@@ -9,10 +9,10 @@ import type {
// export type EmptyTipIcon = IImageGraphicAttribute;
export type TableSeriesNumberAttributes = IGroupGraphicAttribute & {
- frozenTopRow?: number;
- frozenLeftCol?: number;
- frozenRightCol?: number;
- frozenBottomRow?: number;
+ frozenRowCount?: number;
+ frozenColCount?: number;
+ rightFrozenColCount?: number;
+ bottomFrozenRowCount?: number;
rowSeriesNumberGenerate?: (index: number) => string;
rowSeriesNumberWidth?: number | 'auto';
rowHeight?: number | 'auto';
From 97be2509ad25cb4ee6bfd643b2035eea166c8596 Mon Sep 17 00:00:00 2001
From: fangsmile <892739385@qq.com>
Date: Tue, 1 Jul 2025 17:56:02 +0800
Subject: [PATCH 04/17] feat: series number component
---
.../browser/examples/table-series-number.ts | 13 +-
.../table-series-number.ts | 286 +++++++++++++++---
.../src/table-series-number/type.ts | 4 +-
3 files changed, 251 insertions(+), 52 deletions(-)
diff --git a/packages/vrender-components/__tests__/browser/examples/table-series-number.ts b/packages/vrender-components/__tests__/browser/examples/table-series-number.ts
index 59b843e80..e1643e94e 100644
--- a/packages/vrender-components/__tests__/browser/examples/table-series-number.ts
+++ b/packages/vrender-components/__tests__/browser/examples/table-series-number.ts
@@ -4,11 +4,14 @@ import render from '../../util/render';
import { EmptyTip, SeriesNumberEvent, TableSeriesNumber } from '../../../src';
export function run() {
- const tableSeriesNumber: TableSeriesNumber = new TableSeriesNumber({
- rowCount: 10,
- colCount: 10
- });
-
+ const tableSeriesNumber: TableSeriesNumber = new TableSeriesNumber(
+ {
+ rowCount: 100,
+ colCount: 100
+ },
+ { initRenderAll: true }
+ );
+ window.tableSeriesNumber = tableSeriesNumber;
const stage = render(tableSeriesNumber, 'main');
tableSeriesNumber.on(SeriesNumberEvent.seriesNumberCellClick, e => {
console.log(SeriesNumberEvent.seriesNumberCellClick, e);
diff --git a/packages/vrender-components/src/table-series-number/table-series-number.ts b/packages/vrender-components/src/table-series-number/table-series-number.ts
index c5ff83f40..8a5d715c3 100644
--- a/packages/vrender-components/src/table-series-number/table-series-number.ts
+++ b/packages/vrender-components/src/table-series-number/table-series-number.ts
@@ -30,24 +30,29 @@ export class TableSeriesNumber extends AbstractComponent; //记录选中的行号或列号 cellGroup的name
// selectColIndexs?:number[],
} = { selectIndexs: new Set() };
- constructor(attributes: TableSeriesNumberAttributes, options?: ComponentOptions) {
+ _parsedRowSeriesNumberCellPadding: number[] = [0, 0, 0, 0];
+ _parsedColSeriesNumberCellPadding: number[] = [0, 0, 0, 0];
+ initRenderAll: boolean = false;
+ constructor(attributes: TableSeriesNumberAttributes, options?: ComponentOptions & { initRenderAll?: boolean }) {
super(options?.skipDefault ? attributes : merge({}, TableSeriesNumber.defaultAttributes, attributes));
+ this.initRenderAll = options?.initRenderAll || false;
this._skipRenderAttributes.push('frozenTopRow');
this._skipRenderAttributes.push('frozenLeftCol');
this._skipRenderAttributes.push('frozenRightCol');
this._skipRenderAttributes.push('frozenBottomRow');
this._skipRenderAttributes.push('rowCount');
this._skipRenderAttributes.push('colCount');
+ if (this.attribute.rowSeriesNumberCellStyle.text.padding) {
+ const padding = parsePadding(this.attribute.rowSeriesNumberCellStyle.text.padding);
+ if (typeof padding === 'number') {
+ this._parsedRowSeriesNumberCellPadding = [padding, padding, padding, padding];
+ } else {
+ this._parsedRowSeriesNumberCellPadding = padding;
+ }
+ }
+ if (this.attribute.colSeriesNumberCellStyle.text.padding) {
+ const padding = parsePadding(this.attribute.colSeriesNumberCellStyle.text.padding);
+ if (typeof padding === 'number') {
+ this._parsedColSeriesNumberCellPadding = [padding, padding, padding, padding];
+ } else {
+ this._parsedColSeriesNumberCellPadding = padding;
+ }
+ }
// this.render();
}
+
get rowSeriesNumberWidth() {
const { rowSeriesNumberWidth } = this.attribute;
if (this._maxTextWidth) {
- const textPadding = parsePadding(this.attribute.rowSeriesNumberCellStyle.text.boundsPadding);
- let totalPadding = 0;
- if (typeof textPadding === 'number') {
- totalPadding = textPadding * 2;
- } else {
- totalPadding = textPadding[3] + textPadding[1];
- }
return Math.max(
- this._maxTextWidth + totalPadding,
- typeof rowSeriesNumberWidth === 'number' ? rowSeriesNumberWidth : 20
+ this._maxTextWidth + this._parsedRowSeriesNumberCellPadding[3] + this._parsedRowSeriesNumberCellPadding[1],
+ typeof rowSeriesNumberWidth === 'number' ? rowSeriesNumberWidth : 40
);
}
- return typeof rowSeriesNumberWidth === 'number' ? rowSeriesNumberWidth : 20;
+ return typeof rowSeriesNumberWidth === 'number' ? rowSeriesNumberWidth : 40;
}
get colSeriesNumberHeight() {
const { colSeriesNumberHeight } = this.attribute;
@@ -202,6 +224,26 @@ export class TableSeriesNumber extends AbstractComponent= 0 && index < frozenRowCount) {
const { height: oldHeight, width: oldWidth, y } = this._frozenTopRowSeriesNumberGroup.getAttributes();
- this._frozenTopRowSeriesNumberGroup.children[index].setAttributes(attributes);
+ targetCellGroup = this._frozenTopRowSeriesNumberGroup.children[index];
+ targetCellGroup.setAttributes(attributes);
if (attributes.height) {
this._frozenTopRowSeriesNumberGroup.setAttributes({
height: this._frozenTopRowSeriesNumberGroup.getAttributes().height + (attributes.height - oldHeight)
@@ -851,19 +966,62 @@ export class TableSeriesNumber extends AbstractComponent= 0 && index < frozenColCount) {
- const { height: oldHeight, width: oldWidth, x } = this._frozenLeftColSeriesNumberGroup.getAttributes();
- this._frozenLeftColSeriesNumberGroup.children[index].setAttributes(attributes);
+ targetCellGroup = this._frozenLeftColSeriesNumberGroup.children[index];
+ const { height: oldHeight, width: oldWidth } = targetCellGroup.getAttributes();
+ targetCellGroup.setAttributes(attributes);
+
if (attributes.height) {
this._frozenLeftColSeriesNumberGroup.setAttributes({
height: this._frozenLeftColSeriesNumberGroup.getAttributes().height + (attributes.height - oldHeight)
@@ -881,12 +1039,50 @@ export class TableSeriesNumber extends AbstractComponent
Date: Wed, 2 Jul 2025 20:32:11 +0800
Subject: [PATCH 05/17] feat: table series number
---
.../src/table-series-number/event-manager.ts | 283 ++++++++++++++++++
.../table-series-number.ts | 164 ++--------
.../src/table-series-number/type.ts | 16 +
3 files changed, 317 insertions(+), 146 deletions(-)
create mode 100644 packages/vrender-components/src/table-series-number/event-manager.ts
diff --git a/packages/vrender-components/src/table-series-number/event-manager.ts b/packages/vrender-components/src/table-series-number/event-manager.ts
new file mode 100644
index 000000000..33e2e92bd
--- /dev/null
+++ b/packages/vrender-components/src/table-series-number/event-manager.ts
@@ -0,0 +1,283 @@
+import type { TableSeriesNumber } from './table-series-number';
+import { vglobal, type FederatedPointerEvent, type Group, type IGroup, type IText } from '@visactor/vrender-core';
+import { SeriesNumberCellStateValue, SeriesNumberEvent } from './type';
+
+export class TableSeriesNumberEventManager {
+ private _tableSeriesNumber: TableSeriesNumber;
+ isPointerDown: boolean = false;
+ constructor(tableSeriesNumber: TableSeriesNumber) {
+ this._tableSeriesNumber = tableSeriesNumber;
+ }
+
+ bindEvents() {
+ //ff
+ const { hover = true, select = true } = this._tableSeriesNumber.attribute;
+
+ if (hover) {
+ this._tableSeriesNumber._rowSeriesNumberGroup.addEventListener(
+ 'pointermove',
+ this._onPointermove as EventListenerOrEventListenerObject
+ );
+ this._tableSeriesNumber._rowSeriesNumberGroup.addEventListener(
+ 'pointerleave',
+ this._onPointerleave as EventListenerOrEventListenerObject
+ );
+
+ this._tableSeriesNumber._colSeriesNumberGroup.addEventListener(
+ 'pointermove',
+ this._onPointermove as EventListenerOrEventListenerObject
+ );
+ this._tableSeriesNumber._colSeriesNumberGroup.addEventListener(
+ 'pointerleave',
+ this._onPointerleave as EventListenerOrEventListenerObject
+ );
+
+ this._tableSeriesNumber._cornerGroup.addEventListener(
+ 'pointermove',
+ this._onPointermove as EventListenerOrEventListenerObject
+ );
+ this._tableSeriesNumber._cornerGroup.addEventListener(
+ 'pointerleave',
+ this._onPointerleave as EventListenerOrEventListenerObject
+ );
+
+ this._tableSeriesNumber._frozenTopRowSeriesNumberGroup.addEventListener(
+ 'pointermove',
+ this._onPointermove as EventListenerOrEventListenerObject
+ );
+ this._tableSeriesNumber._frozenTopRowSeriesNumberGroup.addEventListener(
+ 'pointerleave',
+ this._onPointerleave as EventListenerOrEventListenerObject
+ );
+
+ this._tableSeriesNumber._frozenLeftColSeriesNumberGroup.addEventListener(
+ 'pointermove',
+ this._onPointermove as EventListenerOrEventListenerObject
+ );
+ this._tableSeriesNumber._frozenLeftColSeriesNumberGroup.addEventListener(
+ 'pointerleave',
+ this._onPointerleave as EventListenerOrEventListenerObject
+ );
+ }
+
+ if (select) {
+ this._tableSeriesNumber._rowSeriesNumberGroup.addEventListener(
+ 'pointerdown',
+ this._onPointerdown as EventListenerOrEventListenerObject
+ );
+ this._tableSeriesNumber._colSeriesNumberGroup.addEventListener(
+ 'pointerdown',
+ this._onPointerdown as EventListenerOrEventListenerObject
+ );
+ this._tableSeriesNumber._cornerGroup.addEventListener(
+ 'pointerdown',
+ this._onPointerdown as EventListenerOrEventListenerObject
+ );
+ this._tableSeriesNumber._frozenTopRowSeriesNumberGroup.addEventListener(
+ 'pointerdown',
+ this._onPointerdown as EventListenerOrEventListenerObject
+ );
+ this._tableSeriesNumber._frozenLeftColSeriesNumberGroup.addEventListener(
+ 'pointerdown',
+ this._onPointerdown as EventListenerOrEventListenerObject
+ );
+
+ vglobal.addEventListener('pointerup', this._onPointerup as EventListenerOrEventListenerObject);
+ }
+ }
+ private _onPointermove = (e: FederatedPointerEvent) => {
+ //ff
+ const target = e.target as unknown as IGroup;
+ if (this.isPointerDown) {
+ if (!this._tableSeriesNumber.interactionState.selectIndexs.has(target.name)) {
+ this._tableSeriesNumber.interactionState.selectIndexs.add(target.name);
+ this._tableSeriesNumber.renderSelectedIndexsState();
+ this._tableSeriesNumber.dispatchTableSeriesNumberEvent(SeriesNumberEvent.seriesNumberCellClick, {
+ seriesNumberCell: target,
+ event: e,
+ isDragSelect: true
+ });
+ } else {
+ }
+ return;
+ }
+
+ if (target.name.startsWith('col')) {
+ //判断鼠标是否位于列间隔线附近,如果是则设置cursor为col-resize
+ const colIndex = Number(target.name.split('-')[1]);
+ const canvasPointXY = target.stage.window.pointTransform(e.canvasX, e.canvasY);
+ const XYtoTarget = { x: 0, y: 0 };
+
+ target.globalTransMatrix.transformPoint(canvasPointXY, XYtoTarget);
+ if (
+ XYtoTarget.x <= 4 ||
+ (XYtoTarget.x <= target.getAttributes().width && XYtoTarget.x >= target.getAttributes().width - 4)
+ ) {
+ target.setAttribute('cursor', 'col-resize');
+ } else {
+ target.setAttribute('cursor', 'default');
+ }
+ } else if (target.name.startsWith('row')) {
+ //判断鼠标是否位于行间隔线附近,如果是则设置cursor为row-resize
+ const rowIndex = Number(target.name.split('-')[1]);
+ const canvasPointXY = target.stage.window.pointTransform(e.canvasX, e.canvasY);
+ const XYtoTarget = { x: 0, y: 0 };
+
+ target.globalTransMatrix.transformPoint(canvasPointXY, XYtoTarget);
+ if (
+ XYtoTarget.y <= 4 ||
+ (XYtoTarget.y <= target.getAttributes().height && XYtoTarget.y >= target.getAttributes().height - 4)
+ ) {
+ target.setAttribute('cursor', 'row-resize');
+ } else {
+ target.setAttribute('cursor', 'default');
+ }
+ }
+ // // 如果上个激活元素存在,则判断当前元素是否和上个激活元素相同,相同则不做处理,不相同则触发 unhover
+ if (this._tableSeriesNumber._lastHoverItem) {
+ if (this._tableSeriesNumber._lastHoverItem.id === target.id) {
+ return;
+ }
+ this._unHoverHandler(this._tableSeriesNumber._lastHoverItem, e);
+ }
+ if ((this._tableSeriesNumber.getAttributes() as any).hover) {
+ this._hoverHandler(target, e);
+ }
+ };
+ private _onPointerleave = (e: FederatedPointerEvent) => {
+ //ff
+ if (this._tableSeriesNumber._lastHoverItem) {
+ this._unHoverHandler(this._tableSeriesNumber._lastHoverItem, e);
+ this._tableSeriesNumber._lastHoverItem = null;
+ }
+ };
+ private _onPointerdown = (e: FederatedPointerEvent) => {
+ this.isPointerDown = true;
+ //ff
+ const target = e.target as unknown as IGroup;
+
+ if (target.name.startsWith('col')) {
+ //判断鼠标是否位于列间隔线附近,如果是则触发resizeColWidthStart事件
+ const colIndex = Number(target.name.split('-')[1]);
+ const canvasPointXY = target.stage.window.pointTransform(e.canvasX, e.canvasY);
+ const XYtoTarget = { x: 0, y: 0 };
+
+ target.globalTransMatrix.transformPoint(canvasPointXY, XYtoTarget);
+ if (
+ XYtoTarget.x <= 4 ||
+ (XYtoTarget.x <= target.getAttributes().width && XYtoTarget.x >= target.getAttributes().width - 4)
+ ) {
+ let resizeTargetColIndex = colIndex;
+ if (XYtoTarget.x <= 4) {
+ resizeTargetColIndex = colIndex - 1;
+ }
+ this._tableSeriesNumber.dispatchTableSeriesNumberEvent(SeriesNumberEvent.resizeColWidthStart, {
+ colIndex: resizeTargetColIndex,
+ event: e
+ });
+ return;
+ }
+ } else if (target.name.startsWith('row')) {
+ //判断鼠标是否位于行间隔线附近,如果是则触发resizeRowHeightStart事件
+ const rowIndex = Number(target.name.split('-')[1]);
+ const canvasPointXY = target.stage.window.pointTransform(e.canvasX, e.canvasY);
+ const XYtoTarget = { x: 0, y: 0 };
+
+ target.globalTransMatrix.transformPoint(canvasPointXY, XYtoTarget);
+ if (
+ XYtoTarget.y <= 4 ||
+ (XYtoTarget.y <= target.getAttributes().height && XYtoTarget.y >= target.getAttributes().height - 4)
+ ) {
+ let resizeTargetRowIndex = rowIndex;
+ if (XYtoTarget.y <= 4) {
+ resizeTargetRowIndex = rowIndex - 1;
+ }
+ this._tableSeriesNumber.dispatchTableSeriesNumberEvent(SeriesNumberEvent.resizeRowHeightStart, {
+ rowIndex: resizeTargetRowIndex,
+ event: e
+ });
+ return;
+ }
+ }
+ if (this._tableSeriesNumber.interactionState.selectIndexs?.size) {
+ if (this._tableSeriesNumber.interactionState.selectIndexs.has(target.name)) {
+ if (e.nativeEvent.ctrlKey || e.nativeEvent.metaKey) {
+ this._unClickHandler(target.name, e);
+ } else {
+ for (const name of this._tableSeriesNumber.interactionState.selectIndexs) {
+ this._unClickHandler(name, e);
+ }
+ }
+ } else {
+ if (e.nativeEvent.ctrlKey || e.nativeEvent.metaKey) {
+ // nothing
+ } else {
+ for (const name of this._tableSeriesNumber.interactionState.selectIndexs) {
+ if (
+ (target.name.startsWith('row') && name.startsWith('row')) ||
+ (target.name.startsWith('col') && name.startsWith('col'))
+ ) {
+ this._unClickHandler(name, e);
+ }
+ }
+ }
+ }
+ }
+ this._clickHandler(target, e);
+ };
+ private _onPointerup = (e: FederatedPointerEvent) => {
+ //ff
+ const target = e.target as unknown as IGroup;
+ if (this.isPointerDown) {
+ this.isPointerDown = false;
+ // this._tableSeriesNumber.dispatchTableSeriesNumberEvent(SeriesNumberEvent.seriesNumberCellClick, { seriesNumberCell:target, event: e });
+ }
+ };
+
+ private _hoverHandler(seriesNumberCell: IGroup, e: FederatedPointerEvent) {
+ this._tableSeriesNumber._lastHoverItem = seriesNumberCell;
+ //需兼顾select状态
+ if (seriesNumberCell.hasState(SeriesNumberCellStateValue.select)) {
+ seriesNumberCell.useStates([SeriesNumberCellStateValue.select, SeriesNumberCellStateValue.hover]);
+ } else {
+ seriesNumberCell.useStates([SeriesNumberCellStateValue.hover]);
+ }
+
+ this._tableSeriesNumber.dispatchTableSeriesNumberEvent(SeriesNumberEvent.seriesNumberCellHover, {
+ seriesNumberCell,
+ event: e
+ });
+ }
+
+ private _unHoverHandler(seriesNumberCell: IGroup, e: FederatedPointerEvent) {
+ seriesNumberCell.removeState(SeriesNumberCellStateValue.hover);
+ this._tableSeriesNumber.dispatchTableSeriesNumberEvent(SeriesNumberEvent.seriesNumberCellUnHover, {
+ seriesNumberCell,
+ event: e
+ });
+ }
+
+ private _clickHandler(seriesNumberCell: IGroup, e: FederatedPointerEvent) {
+ this._tableSeriesNumber.interactionState.selectIndexs.add(seriesNumberCell.name);
+ seriesNumberCell.useStates([SeriesNumberCellStateValue.select]);
+ this._tableSeriesNumber.dispatchTableSeriesNumberEvent(SeriesNumberEvent.seriesNumberCellClick, {
+ seriesNumberCell,
+ event: e
+ });
+ }
+ private _unClickHandler(seriesNumberIndex: string, e: FederatedPointerEvent) {
+ const isRow = seriesNumberIndex.startsWith('row');
+ const isCol = seriesNumberIndex.startsWith('col');
+
+ this._tableSeriesNumber.interactionState.selectIndexs.delete(seriesNumberIndex);
+
+ const seriesNumberCell = isRow
+ ? this._tableSeriesNumber.getRowSeriesNumberCellGroup(Number(seriesNumberIndex.split('-')[1]))
+ : this._tableSeriesNumber.getColSeriesNumberCellGroup(Number(seriesNumberIndex.split('-')[1]));
+ seriesNumberCell.removeState(SeriesNumberCellStateValue.select);
+ this._tableSeriesNumber.dispatchTableSeriesNumberEvent(SeriesNumberEvent.seriesNumberCellCancelClick, {
+ seriesNumberCell,
+ event: e
+ });
+ }
+}
diff --git a/packages/vrender-components/src/table-series-number/table-series-number.ts b/packages/vrender-components/src/table-series-number/table-series-number.ts
index 8a5d715c3..2beafc6a7 100644
--- a/packages/vrender-components/src/table-series-number/table-series-number.ts
+++ b/packages/vrender-components/src/table-series-number/table-series-number.ts
@@ -1,22 +1,14 @@
import { generateColField } from './tools';
import { isValid, merge, normalizePadding } from '@visactor/vutils';
import { AbstractComponent } from '../core/base';
+import { SeriesNumberCellStateValue, SeriesNumberEvent } from './type';
import type { TableSeriesNumberAttributes } from './type';
+import { TableSeriesNumberEventManager } from './event-manager';
import type { FederatedPointerEvent, Group, IGroup, IText } from '@visactor/vrender-core';
-import { Image, Rect, Text, createGroup, graphicCreator, parsePadding } from '@visactor/vrender-core';
+import { parsePadding } from '@visactor/vrender-core';
import type { ComponentOptions } from '../interface';
import { loadTableSeriesNumberComponent } from './register';
-export enum SeriesNumberCellStateValue {
- hover = 'hover',
- select = 'select'
-}
-export enum SeriesNumberEvent {
- seriesNumberCellHover = 'seriesNumberCellHover',
- seriesNumberCellUnHover = 'seriesNumberCellUnHover',
- seriesNumberCellClick = 'seriesNumberCellClick',
- seriesNumberCellCancelClick = 'seriesNumberCellCancelClick',
- rowSeriesNumberWidthChange = 'rowSeriesNumberWidthChange'
-}
+
const cornerSvg =
'';
@@ -32,7 +24,6 @@ export class TableSeriesNumber extends AbstractComponent {
- //ff
- const target = e.target as unknown as IGroup;
- // 如果上个激活元素存在,则判断当前元素是否和上个激活元素相同,相同则不做处理,不相同则触发 unhover
- if (this._lastHoverItem) {
- if (this._lastHoverItem.id === target.id) {
- return;
- }
- this._unHoverhandler(this._lastHoverItem, e);
- }
- this._hoverhandler(target, e);
- };
- private _onUnHover = (e: FederatedPointerEvent) => {
- //ff
- if (this._lastHoverItem) {
- this._unHoverhandler(this._lastHoverItem, e);
- this._lastHoverItem = null;
- }
- };
- private _onClick = (e: FederatedPointerEvent) => {
- //ff
- const target = e.target as unknown as IGroup;
- if (this.interactionState.selectIndexs?.size) {
- if (this.interactionState.selectIndexs.has(target.name)) {
- if (e.nativeEvent.ctrlKey || e.nativeEvent.metaKey) {
- this._unClickhandler(target.name, e);
- } else {
- for (const name of this.interactionState.selectIndexs) {
- this._unClickhandler(name, e);
- }
- }
- } else {
- if (e.nativeEvent.ctrlKey || e.nativeEvent.metaKey) {
- // nothing
- } else {
- for (const name of this.interactionState.selectIndexs) {
- this._unClickhandler(name, e);
- }
- }
- }
- }
- this._clickhandler(target, e);
- };
-
- private _hoverhandler(seriesNumberCell: IGroup, e: FederatedPointerEvent) {
- this._lastHoverItem = seriesNumberCell;
- //需兼顾select状态
- if (seriesNumberCell.hasState(SeriesNumberCellStateValue.select)) {
- seriesNumberCell.useStates([SeriesNumberCellStateValue.select, SeriesNumberCellStateValue.hover]);
- } else {
- seriesNumberCell.useStates([SeriesNumberCellStateValue.hover]);
- }
-
- this._dispatchEvent(SeriesNumberEvent.seriesNumberCellHover, { seriesNumberCell, event: e });
- }
-
- private _unHoverhandler(seriesNumberCell: IGroup, e: FederatedPointerEvent) {
- seriesNumberCell.removeState(SeriesNumberCellStateValue.hover);
- this._dispatchEvent(SeriesNumberEvent.seriesNumberCellUnHover, { seriesNumberCell, event: e });
- }
-
- private _clickhandler(seriesNumberCell: IGroup, e: FederatedPointerEvent) {
- this.interactionState.selectIndexs.add(seriesNumberCell.name);
- seriesNumberCell.useStates([SeriesNumberCellStateValue.select]);
- this._dispatchEvent(SeriesNumberEvent.seriesNumberCellClick, { seriesNumberCell, event: e });
- }
- private _unClickhandler(seriesNumberIndex: string, e: FederatedPointerEvent) {
- const isRow = seriesNumberIndex.startsWith('row');
- const isCol = seriesNumberIndex.startsWith('col');
-
- this.interactionState.selectIndexs.delete(seriesNumberIndex);
-
- const seriesNumberCell = isRow
- ? this.getRowSeriesNumberCellGroup(Number(seriesNumberIndex.split('-')[1]))
- : this.getColSeriesNumberCellGroup(Number(seriesNumberIndex.split('-')[1]));
- seriesNumberCell.removeState(SeriesNumberCellStateValue.select);
- this._dispatchEvent(SeriesNumberEvent.seriesNumberCellCancelClick, { seriesNumberCell, event: e });
- }
-
changeRowSeriesNumberWidth(newWidth: number) {
const {
rowHeight,
@@ -1166,5 +1037,6 @@ export class TableSeriesNumber extends AbstractComponent
Date: Fri, 4 Jul 2025 15:47:32 +0800
Subject: [PATCH 06/17] feat: table series number
---
.../src/table-series-number/event-manager.ts | 48 +++++++++++++------
.../table-series-number.ts | 6 ++-
.../src/table-series-number/type.ts | 1 +
3 files changed, 38 insertions(+), 17 deletions(-)
diff --git a/packages/vrender-components/src/table-series-number/event-manager.ts b/packages/vrender-components/src/table-series-number/event-manager.ts
index 33e2e92bd..d1c92d201 100644
--- a/packages/vrender-components/src/table-series-number/event-manager.ts
+++ b/packages/vrender-components/src/table-series-number/event-manager.ts
@@ -4,7 +4,7 @@ import { SeriesNumberCellStateValue, SeriesNumberEvent } from './type';
export class TableSeriesNumberEventManager {
private _tableSeriesNumber: TableSeriesNumber;
- isPointerDown: boolean = false;
+ isPointerDownStartSelect: boolean = false;
constructor(tableSeriesNumber: TableSeriesNumber) {
this._tableSeriesNumber = tableSeriesNumber;
}
@@ -88,7 +88,7 @@ export class TableSeriesNumberEventManager {
private _onPointermove = (e: FederatedPointerEvent) => {
//ff
const target = e.target as unknown as IGroup;
- if (this.isPointerDown) {
+ if (this.isPointerDownStartSelect) {
if (!this._tableSeriesNumber.interactionState.selectIndexs.has(target.name)) {
this._tableSeriesNumber.interactionState.selectIndexs.add(target.name);
this._tableSeriesNumber.renderSelectedIndexsState();
@@ -98,7 +98,20 @@ export class TableSeriesNumberEventManager {
isDragSelect: true
});
} else {
+ if (
+ this._tableSeriesNumber.interactionState._lastClickItem &&
+ this._tableSeriesNumber.interactionState._lastClickItem.id === target.id
+ ) {
+ return;
+ }
+ this._tableSeriesNumber.renderSelectedIndexsState();
+ this._tableSeriesNumber.dispatchTableSeriesNumberEvent(SeriesNumberEvent.seriesNumberCellClick, {
+ seriesNumberCell: target,
+ event: e,
+ isDragSelect: true
+ });
}
+ this._tableSeriesNumber.interactionState._lastClickItem = target;
return;
}
@@ -134,11 +147,11 @@ export class TableSeriesNumberEventManager {
}
}
// // 如果上个激活元素存在,则判断当前元素是否和上个激活元素相同,相同则不做处理,不相同则触发 unhover
- if (this._tableSeriesNumber._lastHoverItem) {
- if (this._tableSeriesNumber._lastHoverItem.id === target.id) {
+ if (this._tableSeriesNumber.interactionState._lastHoverItem) {
+ if (this._tableSeriesNumber.interactionState._lastHoverItem.id === target.id) {
return;
}
- this._unHoverHandler(this._tableSeriesNumber._lastHoverItem, e);
+ this._unHoverHandler(this._tableSeriesNumber.interactionState._lastHoverItem, e);
}
if ((this._tableSeriesNumber.getAttributes() as any).hover) {
this._hoverHandler(target, e);
@@ -146,13 +159,12 @@ export class TableSeriesNumberEventManager {
};
private _onPointerleave = (e: FederatedPointerEvent) => {
//ff
- if (this._tableSeriesNumber._lastHoverItem) {
- this._unHoverHandler(this._tableSeriesNumber._lastHoverItem, e);
- this._tableSeriesNumber._lastHoverItem = null;
+ if (this._tableSeriesNumber.interactionState._lastHoverItem) {
+ this._unHoverHandler(this._tableSeriesNumber.interactionState._lastHoverItem, e);
+ this._tableSeriesNumber.interactionState._lastHoverItem = null;
}
};
private _onPointerdown = (e: FederatedPointerEvent) => {
- this.isPointerDown = true;
//ff
const target = e.target as unknown as IGroup;
@@ -199,6 +211,7 @@ export class TableSeriesNumberEventManager {
return;
}
}
+ this.isPointerDownStartSelect = true;
if (this._tableSeriesNumber.interactionState.selectIndexs?.size) {
if (this._tableSeriesNumber.interactionState.selectIndexs.has(target.name)) {
if (e.nativeEvent.ctrlKey || e.nativeEvent.metaKey) {
@@ -228,14 +241,18 @@ export class TableSeriesNumberEventManager {
private _onPointerup = (e: FederatedPointerEvent) => {
//ff
const target = e.target as unknown as IGroup;
- if (this.isPointerDown) {
- this.isPointerDown = false;
- // this._tableSeriesNumber.dispatchTableSeriesNumberEvent(SeriesNumberEvent.seriesNumberCellClick, { seriesNumberCell:target, event: e });
+ if (this.isPointerDownStartSelect) {
+ this.isPointerDownStartSelect = false;
+ this._tableSeriesNumber.interactionState._lastClickItem = null;
+ this._tableSeriesNumber.dispatchTableSeriesNumberEvent(SeriesNumberEvent.seriesNumberCellClickUp, {
+ seriesNumberCell: target,
+ event: e
+ });
}
};
private _hoverHandler(seriesNumberCell: IGroup, e: FederatedPointerEvent) {
- this._tableSeriesNumber._lastHoverItem = seriesNumberCell;
+ this._tableSeriesNumber.interactionState._lastHoverItem = seriesNumberCell;
//需兼顾select状态
if (seriesNumberCell.hasState(SeriesNumberCellStateValue.select)) {
seriesNumberCell.useStates([SeriesNumberCellStateValue.select, SeriesNumberCellStateValue.hover]);
@@ -260,6 +277,7 @@ export class TableSeriesNumberEventManager {
private _clickHandler(seriesNumberCell: IGroup, e: FederatedPointerEvent) {
this._tableSeriesNumber.interactionState.selectIndexs.add(seriesNumberCell.name);
seriesNumberCell.useStates([SeriesNumberCellStateValue.select]);
+ this._tableSeriesNumber.interactionState._lastClickItem = seriesNumberCell;
this._tableSeriesNumber.dispatchTableSeriesNumberEvent(SeriesNumberEvent.seriesNumberCellClick, {
seriesNumberCell,
event: e
@@ -274,9 +292,9 @@ export class TableSeriesNumberEventManager {
const seriesNumberCell = isRow
? this._tableSeriesNumber.getRowSeriesNumberCellGroup(Number(seriesNumberIndex.split('-')[1]))
: this._tableSeriesNumber.getColSeriesNumberCellGroup(Number(seriesNumberIndex.split('-')[1]));
- seriesNumberCell.removeState(SeriesNumberCellStateValue.select);
+ seriesNumberCell?.removeState(SeriesNumberCellStateValue.select);
this._tableSeriesNumber.dispatchTableSeriesNumberEvent(SeriesNumberEvent.seriesNumberCellCancelClick, {
- seriesNumberCell,
+ index: seriesNumberIndex,
event: e
});
}
diff --git a/packages/vrender-components/src/table-series-number/table-series-number.ts b/packages/vrender-components/src/table-series-number/table-series-number.ts
index 2beafc6a7..773b4ab3f 100644
--- a/packages/vrender-components/src/table-series-number/table-series-number.ts
+++ b/packages/vrender-components/src/table-series-number/table-series-number.ts
@@ -109,7 +109,7 @@ export class TableSeriesNumber extends AbstractComponent; //记录选中的行号或列号 cellGroup的name
// selectColIndexs?:number[],
- } = { selectIndexs: new Set() };
+ } = { selectIndexs: new Set(), _lastHoverItem: null, _lastClickItem: null };
_parsedRowSeriesNumberCellPadding: number[] = [0, 0, 0, 0];
_parsedColSeriesNumberCellPadding: number[] = [0, 0, 0, 0];
initRenderAll: boolean = false;
diff --git a/packages/vrender-components/src/table-series-number/type.ts b/packages/vrender-components/src/table-series-number/type.ts
index 90143e264..768f15218 100644
--- a/packages/vrender-components/src/table-series-number/type.ts
+++ b/packages/vrender-components/src/table-series-number/type.ts
@@ -15,6 +15,7 @@ export enum SeriesNumberEvent {
seriesNumberCellHover = 'seriesNumberCellHover',
seriesNumberCellUnHover = 'seriesNumberCellUnHover',
seriesNumberCellClick = 'seriesNumberCellClick',
+ seriesNumberCellClickUp = 'seriesNumberCellClickUp',
seriesNumberCellCancelClick = 'seriesNumberCellCancelClick',
rowSeriesNumberWidthChange = 'rowSeriesNumberWidthChange',
From 5feda2a79bd2b41bcee472d785d106a6de5beb19 Mon Sep 17 00:00:00 2001
From: fangsmile <892739385@qq.com>
Date: Fri, 4 Jul 2025 20:30:20 +0800
Subject: [PATCH 07/17] feat: table series number
---
.../src/table-series-number/event-manager.ts | 14 ++++++++-----
.../table-series-number.ts | 21 +++++++++++++++++--
2 files changed, 28 insertions(+), 7 deletions(-)
diff --git a/packages/vrender-components/src/table-series-number/event-manager.ts b/packages/vrender-components/src/table-series-number/event-manager.ts
index d1c92d201..a9c1e2b06 100644
--- a/packages/vrender-components/src/table-series-number/event-manager.ts
+++ b/packages/vrender-components/src/table-series-number/event-manager.ts
@@ -215,8 +215,10 @@ export class TableSeriesNumberEventManager {
if (this._tableSeriesNumber.interactionState.selectIndexs?.size) {
if (this._tableSeriesNumber.interactionState.selectIndexs.has(target.name)) {
if (e.nativeEvent.ctrlKey || e.nativeEvent.metaKey) {
+ this._tableSeriesNumber.removeOneGroupSelected(target);
this._unClickHandler(target.name, e);
} else {
+ this._tableSeriesNumber.removeAllSelectedIndexs();
for (const name of this._tableSeriesNumber.interactionState.selectIndexs) {
this._unClickHandler(name, e);
}
@@ -225,6 +227,7 @@ export class TableSeriesNumberEventManager {
if (e.nativeEvent.ctrlKey || e.nativeEvent.metaKey) {
// nothing
} else {
+ this._tableSeriesNumber.removeAllSelectedIndexs();
for (const name of this._tableSeriesNumber.interactionState.selectIndexs) {
if (
(target.name.startsWith('row') && name.startsWith('row')) ||
@@ -275,8 +278,9 @@ export class TableSeriesNumberEventManager {
}
private _clickHandler(seriesNumberCell: IGroup, e: FederatedPointerEvent) {
- this._tableSeriesNumber.interactionState.selectIndexs.add(seriesNumberCell.name);
- seriesNumberCell.useStates([SeriesNumberCellStateValue.select]);
+ // this._tableSeriesNumber.interactionState.selectIndexs.add(seriesNumberCell.name);
+ // seriesNumberCell.useStates([SeriesNumberCellStateValue.select]);
+ this._tableSeriesNumber.addOneGroupSelected(seriesNumberCell);
this._tableSeriesNumber.interactionState._lastClickItem = seriesNumberCell;
this._tableSeriesNumber.dispatchTableSeriesNumberEvent(SeriesNumberEvent.seriesNumberCellClick, {
seriesNumberCell,
@@ -285,10 +289,10 @@ export class TableSeriesNumberEventManager {
}
private _unClickHandler(seriesNumberIndex: string, e: FederatedPointerEvent) {
const isRow = seriesNumberIndex.startsWith('row');
- const isCol = seriesNumberIndex.startsWith('col');
-
- this._tableSeriesNumber.interactionState.selectIndexs.delete(seriesNumberIndex);
+ // const isCol = seriesNumberIndex.startsWith('col');
+ // this._tableSeriesNumber.interactionState.selectIndexs.delete(seriesNumberIndex);
+ // this._tableSeriesNumber.removeOneGroupSelected(seriesNumberIndex);
const seriesNumberCell = isRow
? this._tableSeriesNumber.getRowSeriesNumberCellGroup(Number(seriesNumberIndex.split('-')[1]))
: this._tableSeriesNumber.getColSeriesNumberCellGroup(Number(seriesNumberIndex.split('-')[1]));
diff --git a/packages/vrender-components/src/table-series-number/table-series-number.ts b/packages/vrender-components/src/table-series-number/table-series-number.ts
index 773b4ab3f..3ebea3681 100644
--- a/packages/vrender-components/src/table-series-number/table-series-number.ts
+++ b/packages/vrender-components/src/table-series-number/table-series-number.ts
@@ -992,6 +992,9 @@ export class TableSeriesNumber extends AbstractComponent
Date: Wed, 16 Jul 2025 14:13:09 +0800
Subject: [PATCH 08/17] feat: table series component add right click event
---
.../src/table-series-number/event-manager.ts | 27 +++++++++++++++++++
.../src/table-series-number/type.ts | 4 ++-
2 files changed, 30 insertions(+), 1 deletion(-)
diff --git a/packages/vrender-components/src/table-series-number/event-manager.ts b/packages/vrender-components/src/table-series-number/event-manager.ts
index a9c1e2b06..ae9d324ed 100644
--- a/packages/vrender-components/src/table-series-number/event-manager.ts
+++ b/packages/vrender-components/src/table-series-number/event-manager.ts
@@ -84,7 +84,34 @@ export class TableSeriesNumberEventManager {
vglobal.addEventListener('pointerup', this._onPointerup as EventListenerOrEventListenerObject);
}
+ this._tableSeriesNumber._rowSeriesNumberGroup.addEventListener(
+ 'rightdown',
+ this._onRightDown as EventListenerOrEventListenerObject
+ );
+ this._tableSeriesNumber._colSeriesNumberGroup.addEventListener(
+ 'rightdown',
+ this._onRightDown as EventListenerOrEventListenerObject
+ );
+ this._tableSeriesNumber._cornerGroup.addEventListener(
+ 'rightdown',
+ this._onRightDown as EventListenerOrEventListenerObject
+ );
+ this._tableSeriesNumber._frozenTopRowSeriesNumberGroup.addEventListener(
+ 'rightdown',
+ this._onRightDown as EventListenerOrEventListenerObject
+ );
+ this._tableSeriesNumber._frozenLeftColSeriesNumberGroup.addEventListener(
+ 'rightdown',
+ this._onRightDown as EventListenerOrEventListenerObject
+ );
}
+ private _onRightDown = (e: FederatedPointerEvent) => {
+ const target = e.target as unknown as IGroup;
+ this._tableSeriesNumber.dispatchTableSeriesNumberEvent(SeriesNumberEvent.seriesNumberCellRightClick, {
+ seriesNumberCell: target,
+ event: e
+ });
+ };
private _onPointermove = (e: FederatedPointerEvent) => {
//ff
const target = e.target as unknown as IGroup;
diff --git a/packages/vrender-components/src/table-series-number/type.ts b/packages/vrender-components/src/table-series-number/type.ts
index 768f15218..df7bb09d8 100644
--- a/packages/vrender-components/src/table-series-number/type.ts
+++ b/packages/vrender-components/src/table-series-number/type.ts
@@ -23,7 +23,9 @@ export enum SeriesNumberEvent {
resizeRowHeightStart = 'resizeRowHeightStart',
/** 调整列宽开始 */
- resizeColWidthStart = 'resizeColWidthStart'
+ resizeColWidthStart = 'resizeColWidthStart',
+ /** 右键事件 */
+ seriesNumberCellRightClick = 'seriesNumberCellRightClick'
}
export type TableSeriesNumberAttributes = IGroupGraphicAttribute & {
frozenRowCount?: number;
From 12ffe7676de41eb9d01bb3803c23e6a5a6284dfd Mon Sep 17 00:00:00 2001
From: fangsmile <892739385@qq.com>
Date: Thu, 24 Jul 2025 18:47:21 +0800
Subject: [PATCH 09/17] refactor: right click not trigger click handler
---
.../src/table-series-number/event-manager.ts | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/packages/vrender-components/src/table-series-number/event-manager.ts b/packages/vrender-components/src/table-series-number/event-manager.ts
index ae9d324ed..eb432c738 100644
--- a/packages/vrender-components/src/table-series-number/event-manager.ts
+++ b/packages/vrender-components/src/table-series-number/event-manager.ts
@@ -192,7 +192,10 @@ export class TableSeriesNumberEventManager {
}
};
private _onPointerdown = (e: FederatedPointerEvent) => {
- //ff
+ //验证是否右键点击
+ if (e.button === 2) {
+ return;
+ }
const target = e.target as unknown as IGroup;
if (target.name.startsWith('col')) {
From c88661543626aa974e6e415d0838799ab56bd37b Mon Sep 17 00:00:00 2001
From: neuqzxy
Date: Tue, 26 Aug 2025 12:04:32 +0000
Subject: [PATCH 10/17] docs: generate changelog of release v1.0.13
---
docs/assets/changelog/en/changelog.md | 17 +++++++++++++++++
docs/assets/changelog/zh/changelog.md | 17 +++++++++++++++++
2 files changed, 34 insertions(+)
diff --git a/docs/assets/changelog/en/changelog.md b/docs/assets/changelog/en/changelog.md
index 90490b1e6..5068e4c93 100644
--- a/docs/assets/changelog/en/changelog.md
+++ b/docs/assets/changelog/en/changelog.md
@@ -1,3 +1,20 @@
+# v1.0.13
+
+2025-08-26
+
+
+**🆕 New feature**
+
+- **@visactor/vrender-core**: linear-gradient support ignore percent, closed [#1926](https://github.com/VisActor/VRender/issues/1926)
+
+**🐛 Bug fix**
+
+- **@visactor/vrender-core**: fix issue with scaled shadowBounds and editLine in richtext-edit-plugin, closed [#1911](https://github.com/VisActor/VRender/issues/1911)
+
+
+
+[more detail about v1.0.13](https://github.com/VisActor/VRender/releases/tag/v1.0.13)
+
# v1.0.12
2025-08-20
diff --git a/docs/assets/changelog/zh/changelog.md b/docs/assets/changelog/zh/changelog.md
index 23a1a4f38..3d12afd8c 100644
--- a/docs/assets/changelog/zh/changelog.md
+++ b/docs/assets/changelog/zh/changelog.md
@@ -1,3 +1,20 @@
+# v1.0.13
+
+2025-08-26
+
+
+**🆕 新增功能**
+
+- **@visactor/vrender-core**: linear-gradient support ignore percent, closed [#1926](https://github.com/VisActor/VRender/issues/1926)
+
+**🐛 功能修复**
+
+- **@visactor/vrender-core**: fix issue with scaled shadowBounds and editLine in richtext-edit-plugin, closed [#1911](https://github.com/VisActor/VRender/issues/1911)
+
+
+
+[更多详情请查看 v1.0.13](https://github.com/VisActor/VRender/releases/tag/v1.0.13)
+
# v1.0.12
2025-08-20
From 79cbfa2151381864aaab692ecbc19950da905edb Mon Sep 17 00:00:00 2001
From: zhouxinyu
Date: Tue, 26 Aug 2025 21:14:42 +0800
Subject: [PATCH 11/17] feat: support textMeasureId to select measure instance,
closed #1897
---
.../feat-multi-measure_2025-08-26-13-13.json | 10 ++++++++++
.../contributions/textMeasure/AtextMeasure.ts | 1 +
.../textMeasure/textMeasure-contribution.ts | 4 +++-
packages/vrender-core/src/core/graphic-utils.ts | 17 ++++++++++++++++-
packages/vrender-core/src/graphic/graphic.ts | 3 +++
packages/vrender-core/src/graphic/text.ts | 6 +++---
packages/vrender-core/src/graphic/wrap-text.ts | 2 +-
packages/vrender-core/src/interface/core.ts | 1 +
packages/vrender-core/src/interface/text.ts | 1 +
9 files changed, 39 insertions(+), 6 deletions(-)
create mode 100644 common/changes/@visactor/vrender-core/feat-multi-measure_2025-08-26-13-13.json
diff --git a/common/changes/@visactor/vrender-core/feat-multi-measure_2025-08-26-13-13.json b/common/changes/@visactor/vrender-core/feat-multi-measure_2025-08-26-13-13.json
new file mode 100644
index 000000000..2c180d415
--- /dev/null
+++ b/common/changes/@visactor/vrender-core/feat-multi-measure_2025-08-26-13-13.json
@@ -0,0 +1,10 @@
+{
+ "changes": [
+ {
+ "packageName": "@visactor/vrender-core",
+ "comment": "feat: support textMeasureId to select measure instance, closed #1897",
+ "type": "none"
+ }
+ ],
+ "packageName": "@visactor/vrender-core"
+}
diff --git a/packages/vrender-core/src/core/contributions/textMeasure/AtextMeasure.ts b/packages/vrender-core/src/core/contributions/textMeasure/AtextMeasure.ts
index 132b35486..fc7025b2e 100644
--- a/packages/vrender-core/src/core/contributions/textMeasure/AtextMeasure.ts
+++ b/packages/vrender-core/src/core/contributions/textMeasure/AtextMeasure.ts
@@ -9,6 +9,7 @@ import { Logger } from '@visactor/vutils';
@injectable()
export class ATextMeasure implements ITextMeasure {
+ id: string = 'ATextMeasure';
release: (...params: any) => void;
protected canvas?: ICanvas;
protected context?: IContext2d | null;
diff --git a/packages/vrender-core/src/core/contributions/textMeasure/textMeasure-contribution.ts b/packages/vrender-core/src/core/contributions/textMeasure/textMeasure-contribution.ts
index e1d3e2953..0638ec51b 100644
--- a/packages/vrender-core/src/core/contributions/textMeasure/textMeasure-contribution.ts
+++ b/packages/vrender-core/src/core/contributions/textMeasure/textMeasure-contribution.ts
@@ -4,4 +4,6 @@ import { ATextMeasure } from './AtextMeasure';
export const TextMeasureContribution = Symbol.for('TextMeasureContribution');
@injectable()
-export class DefaultTextMeasureContribution extends ATextMeasure {}
+export class DefaultTextMeasureContribution extends ATextMeasure {
+ id: string = 'DefaultTextMeasureContribution';
+}
diff --git a/packages/vrender-core/src/core/graphic-utils.ts b/packages/vrender-core/src/core/graphic-utils.ts
index a46b51b81..b65776150 100644
--- a/packages/vrender-core/src/core/graphic-utils.ts
+++ b/packages/vrender-core/src/core/graphic-utils.ts
@@ -37,6 +37,7 @@ export class DefaultGraphicUtil implements IGraphicUtil {
_canvas?: ICanvas;
_context?: IContext2d | null;
_textMeasure: ITextMeasure;
+ _textMeasureMap: Map;
configured: boolean;
global: IGlobal;
@@ -47,6 +48,7 @@ export class DefaultGraphicUtil implements IGraphicUtil {
) {
this.configured = false;
this.global = application.global;
+ this._textMeasureMap = new Map();
this.global.hooks.onSetEnv.tap('graphic-util', (lastEnv, env, global) => {
this.configured = false;
this.configure(global, env);
@@ -60,6 +62,14 @@ export class DefaultGraphicUtil implements IGraphicUtil {
return this._textMeasure;
}
+ getTextMeasureInstance(textMeasureId?: string): ITextMeasure {
+ if (!textMeasureId) {
+ return this.textMeasure;
+ }
+ const tm = this._textMeasureMap.get(textMeasureId);
+ return tm || this.textMeasure;
+ }
+
configure(global: IGlobal, env: EnvType) {
if (this.configured) {
return;
@@ -79,7 +89,12 @@ export class DefaultGraphicUtil implements IGraphicUtil {
}
bindTextMeasure(tm: ITextMeasure) {
- this._textMeasure = tm;
+ if (!this._textMeasure) {
+ this._textMeasure = tm;
+ }
+ if (!this._textMeasureMap.has(tm.id)) {
+ this._textMeasureMap.set(tm.id, tm);
+ }
}
measureText(
diff --git a/packages/vrender-core/src/graphic/graphic.ts b/packages/vrender-core/src/graphic/graphic.ts
index 694da97a4..810d1b2d3 100644
--- a/packages/vrender-core/src/graphic/graphic.ts
+++ b/packages/vrender-core/src/graphic/graphic.ts
@@ -317,6 +317,9 @@ export abstract class Graphic = Partial;
+ // 外部设置,用于选择所使用的textMeasureId
+ declare textMeasureId?: string;
+
constructor(params: T = {} as T) {
super();
this._AABBBounds = new AABBBounds();
diff --git a/packages/vrender-core/src/graphic/text.ts b/packages/vrender-core/src/graphic/text.ts
index e39bf91ee..0eb8a78b9 100644
--- a/packages/vrender-core/src/graphic/text.ts
+++ b/packages/vrender-core/src/graphic/text.ts
@@ -288,7 +288,7 @@ export class Text extends Graphic implements IText {
}
return this._AABBBounds;
}
- const textMeasure = application.graphicUtil.textMeasure;
+ const textMeasure = application.graphicUtil.getTextMeasureInstance(this.textMeasureId || this.stage?.textMeasureId);
const layoutObj = new CanvasTextLayout(fontFamily, { fontSize, fontWeight, fontFamily, lineHeight }, textMeasure);
const layoutData = layoutObj.GetLayoutByLines(
text,
@@ -356,7 +356,7 @@ export class Text extends Graphic implements IText {
return this._AABBBounds;
}
- const textMeasure = application.graphicUtil.textMeasure;
+ const textMeasure = application.graphicUtil.getTextMeasureInstance(this.textMeasureId || this.stage?.textMeasureId);
const textOptions = { fontSize, fontWeight, fontFamily, lineHeight };
const layoutObj = new CanvasTextLayout(fontFamily, textOptions, textMeasure as any);
@@ -529,7 +529,7 @@ export class Text extends Graphic implements IText {
*/
updateVerticalMultilineAABBBounds(text: (number | string)[]): IAABBBounds {
const textTheme = this.getGraphicTheme();
- const textMeasure = application.graphicUtil.textMeasure;
+ const textMeasure = application.graphicUtil.getTextMeasureInstance(this.textMeasureId || this.stage?.textMeasureId);
let width: number;
const attribute = this.attribute;
const {
diff --git a/packages/vrender-core/src/graphic/wrap-text.ts b/packages/vrender-core/src/graphic/wrap-text.ts
index 1fce194ae..cb078f832 100644
--- a/packages/vrender-core/src/graphic/wrap-text.ts
+++ b/packages/vrender-core/src/graphic/wrap-text.ts
@@ -65,7 +65,7 @@ export class WrapText extends Text {
return this._AABBBounds;
}
- const textMeasure = application.graphicUtil.textMeasure;
+ const textMeasure = application.graphicUtil.getTextMeasureInstance(this.textMeasureId || this.stage?.textMeasureId);
const layoutObj = new CanvasTextLayout(fontFamily, { fontSize, fontWeight, fontFamily }, textMeasure as any) as any;
// layoutObj内逻辑
diff --git a/packages/vrender-core/src/interface/core.ts b/packages/vrender-core/src/interface/core.ts
index 71d6d03f5..3ba7937af 100644
--- a/packages/vrender-core/src/interface/core.ts
+++ b/packages/vrender-core/src/interface/core.ts
@@ -11,6 +11,7 @@ export interface IGraphicUtil {
canvas?: ICanvas;
context?: IContext2d | null;
textMeasure: ITextMeasure;
+ getTextMeasureInstance: (textMeasureId?: string) => ITextMeasure;
measureText: (text: string, tc: TextOptionsType) => { width: number; height: number };
bindTextMeasure: (tm: ITextMeasure) => void;
createTextMeasureInstance: (
diff --git a/packages/vrender-core/src/interface/text.ts b/packages/vrender-core/src/interface/text.ts
index c563aed87..ade87d51f 100644
--- a/packages/vrender-core/src/interface/text.ts
+++ b/packages/vrender-core/src/interface/text.ts
@@ -14,6 +14,7 @@ export interface TextOptionsType {
}
export interface ITextMeasure extends IContribution {
+ id: string;
measureTextWidth: (text: string, options: TextOptionsType) => number;
measureTextPixelHeight: (text: string, options: TextOptionsType) => number;
measureTextBoundHieght: (text: string, options: TextOptionsType) => number;
From 7a6ceea973be2a9cf04df68fc05b68fa387dc2ee Mon Sep 17 00:00:00 2001
From: zhouxinyu
Date: Tue, 26 Aug 2025 21:20:48 +0800
Subject: [PATCH 12/17] feat: support bind DefaultTextMeasureContribution for
default
---
packages/vrender-core/src/core/graphic-utils.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/vrender-core/src/core/graphic-utils.ts b/packages/vrender-core/src/core/graphic-utils.ts
index b65776150..e13335abe 100644
--- a/packages/vrender-core/src/core/graphic-utils.ts
+++ b/packages/vrender-core/src/core/graphic-utils.ts
@@ -89,7 +89,7 @@ export class DefaultGraphicUtil implements IGraphicUtil {
}
bindTextMeasure(tm: ITextMeasure) {
- if (!this._textMeasure) {
+ if (!this._textMeasure || tm.id === 'DefaultTextMeasureContribution') {
this._textMeasure = tm;
}
if (!this._textMeasureMap.has(tm.id)) {
From fdee6b97f65357d85bc05bed0f16210711f00546 Mon Sep 17 00:00:00 2001
From: fangsmile <892739385@qq.com>
Date: Wed, 27 Aug 2025 19:16:26 +0800
Subject: [PATCH 13/17] fix: left frozen group width error
---
.../src/table-series-number/table-series-number.ts | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/packages/vrender-components/src/table-series-number/table-series-number.ts b/packages/vrender-components/src/table-series-number/table-series-number.ts
index 3ebea3681..3edb12d11 100644
--- a/packages/vrender-components/src/table-series-number/table-series-number.ts
+++ b/packages/vrender-components/src/table-series-number/table-series-number.ts
@@ -624,6 +624,10 @@ export class TableSeriesNumber extends AbstractComponent {
+ oldFrozenLeftColSeriesNumberGroupCellsWidth.set(index, child.getAttributes().width);
+ });
this._frozenLeftColSeriesNumberGroup.removeAllChild();
this._colSeriesNumberGroup.removeAllChild();
@@ -670,7 +674,7 @@ export class TableSeriesNumber extends AbstractComponent
Date: Thu, 28 Aug 2025 11:24:31 +0800
Subject: [PATCH 14/17] docs: update changlog of rush
---
...feat-series-number-component_2025-08-28-03-24.json | 11 +++++++++++
1 file changed, 11 insertions(+)
create mode 100644 common/changes/@visactor/vrender-components/feat-series-number-component_2025-08-28-03-24.json
diff --git a/common/changes/@visactor/vrender-components/feat-series-number-component_2025-08-28-03-24.json b/common/changes/@visactor/vrender-components/feat-series-number-component_2025-08-28-03-24.json
new file mode 100644
index 000000000..ab49d9166
--- /dev/null
+++ b/common/changes/@visactor/vrender-components/feat-series-number-component_2025-08-28-03-24.json
@@ -0,0 +1,11 @@
+{
+ "changes": [
+ {
+ "comment": "fix: left frozen group width error\n\n",
+ "type": "none",
+ "packageName": "@visactor/vrender-components"
+ }
+ ],
+ "packageName": "@visactor/vrender-components",
+ "email": "892739385@qq.com"
+}
\ No newline at end of file
From ba1cc98e2da28d98e0e28fa6a60b717d03c9bfa6 Mon Sep 17 00:00:00 2001
From: fangsmile <892739385@qq.com>
Date: Thu, 28 Aug 2025 11:25:54 +0800
Subject: [PATCH 15/17] docs: add change log
---
.../feat-series-number-component_2025-08-28-03-24.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/common/changes/@visactor/vrender-components/feat-series-number-component_2025-08-28-03-24.json b/common/changes/@visactor/vrender-components/feat-series-number-component_2025-08-28-03-24.json
index ab49d9166..ce50a4262 100644
--- a/common/changes/@visactor/vrender-components/feat-series-number-component_2025-08-28-03-24.json
+++ b/common/changes/@visactor/vrender-components/feat-series-number-component_2025-08-28-03-24.json
@@ -1,7 +1,7 @@
{
"changes": [
{
- "comment": "fix: left frozen group width error\n\n",
+ "comment": "feat: add table series number component \n\n",
"type": "none",
"packageName": "@visactor/vrender-components"
}
From a58b1673f2bab0ff4a8be0af769b2655ac31c38f Mon Sep 17 00:00:00 2001
From: zhouxinyu
Date: Thu, 28 Aug 2025 14:38:27 +0800
Subject: [PATCH 16/17] fix: fix issue with number text in cliped attr, closed
#1834
---
.../vrender-core/fix-text-cliped_2025-08-28-06-40.json | 10 ++++++++++
packages/vrender-core/src/graphic/text.ts | 2 +-
2 files changed, 11 insertions(+), 1 deletion(-)
create mode 100644 common/changes/@visactor/vrender-core/fix-text-cliped_2025-08-28-06-40.json
diff --git a/common/changes/@visactor/vrender-core/fix-text-cliped_2025-08-28-06-40.json b/common/changes/@visactor/vrender-core/fix-text-cliped_2025-08-28-06-40.json
new file mode 100644
index 000000000..303fc3197
--- /dev/null
+++ b/common/changes/@visactor/vrender-core/fix-text-cliped_2025-08-28-06-40.json
@@ -0,0 +1,10 @@
+{
+ "changes": [
+ {
+ "packageName": "@visactor/vrender-core",
+ "comment": "fix: fix issue with number text in cliped attr, closed #1834",
+ "type": "none"
+ }
+ ],
+ "packageName": "@visactor/vrender-core"
+}
\ No newline at end of file
diff --git a/packages/vrender-core/src/graphic/text.ts b/packages/vrender-core/src/graphic/text.ts
index e39bf91ee..e85c36f51 100644
--- a/packages/vrender-core/src/graphic/text.ts
+++ b/packages/vrender-core/src/graphic/text.ts
@@ -97,7 +97,7 @@ export class Text extends Graphic implements IText {
});
const originText = Array.isArray(text) ? text.join('') : text;
- return originText !== mergedText;
+ return originText.toString() !== mergedText;
}
if (attribute.direction === 'vertical' && this.cache.verticalList && this.cache.verticalList[0]) {
return this.cache.verticalList[0].map(item => item.text).join('') !== attribute.text.toString();
From b03d74e9f9af2b2da5e10220503bd6376a82499e Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
Date: Fri, 29 Aug 2025 09:24:04 +0000
Subject: [PATCH 17/17] build: prelease version 1.0.14
---
...ies-number-component_2025-08-28-03-24.json | 11 ------
.../feat-multi-measure_2025-08-26-13-13.json | 10 ------
.../fix-text-cliped_2025-08-28-06-40.json | 10 ------
common/config/rush/pnpm-lock.yaml | 34 +++++++++----------
common/config/rush/version-policies.json | 2 +-
docs/package.json | 2 +-
packages/react-vrender-utils/CHANGELOG.json | 6 ++++
packages/react-vrender-utils/CHANGELOG.md | 7 +++-
packages/react-vrender-utils/package.json | 6 ++--
packages/react-vrender/CHANGELOG.json | 6 ++++
packages/react-vrender/CHANGELOG.md | 7 +++-
packages/react-vrender/package.json | 4 +--
packages/vrender-animate/CHANGELOG.json | 6 ++++
packages/vrender-animate/CHANGELOG.md | 7 +++-
packages/vrender-animate/package.json | 4 +--
packages/vrender-components/CHANGELOG.json | 12 +++++++
packages/vrender-components/CHANGELOG.md | 11 +++++-
packages/vrender-components/package.json | 8 ++---
packages/vrender-core/CHANGELOG.json | 15 ++++++++
packages/vrender-core/CHANGELOG.md | 10 +++++-
packages/vrender-core/package.json | 2 +-
packages/vrender-kits/CHANGELOG.json | 6 ++++
packages/vrender-kits/CHANGELOG.md | 7 +++-
packages/vrender-kits/package.json | 4 +--
packages/vrender/CHANGELOG.json | 6 ++++
packages/vrender/CHANGELOG.md | 7 +++-
packages/vrender/package.json | 8 ++---
tools/bugserver-trigger/package.json | 10 +++---
28 files changed, 148 insertions(+), 80 deletions(-)
delete mode 100644 common/changes/@visactor/vrender-components/feat-series-number-component_2025-08-28-03-24.json
delete mode 100644 common/changes/@visactor/vrender-core/feat-multi-measure_2025-08-26-13-13.json
delete mode 100644 common/changes/@visactor/vrender-core/fix-text-cliped_2025-08-28-06-40.json
diff --git a/common/changes/@visactor/vrender-components/feat-series-number-component_2025-08-28-03-24.json b/common/changes/@visactor/vrender-components/feat-series-number-component_2025-08-28-03-24.json
deleted file mode 100644
index ce50a4262..000000000
--- a/common/changes/@visactor/vrender-components/feat-series-number-component_2025-08-28-03-24.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "changes": [
- {
- "comment": "feat: add table series number component \n\n",
- "type": "none",
- "packageName": "@visactor/vrender-components"
- }
- ],
- "packageName": "@visactor/vrender-components",
- "email": "892739385@qq.com"
-}
\ No newline at end of file
diff --git a/common/changes/@visactor/vrender-core/feat-multi-measure_2025-08-26-13-13.json b/common/changes/@visactor/vrender-core/feat-multi-measure_2025-08-26-13-13.json
deleted file mode 100644
index 2c180d415..000000000
--- a/common/changes/@visactor/vrender-core/feat-multi-measure_2025-08-26-13-13.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "changes": [
- {
- "packageName": "@visactor/vrender-core",
- "comment": "feat: support textMeasureId to select measure instance, closed #1897",
- "type": "none"
- }
- ],
- "packageName": "@visactor/vrender-core"
-}
diff --git a/common/changes/@visactor/vrender-core/fix-text-cliped_2025-08-28-06-40.json b/common/changes/@visactor/vrender-core/fix-text-cliped_2025-08-28-06-40.json
deleted file mode 100644
index 303fc3197..000000000
--- a/common/changes/@visactor/vrender-core/fix-text-cliped_2025-08-28-06-40.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "changes": [
- {
- "packageName": "@visactor/vrender-core",
- "comment": "fix: fix issue with number text in cliped attr, closed #1834",
- "type": "none"
- }
- ],
- "packageName": "@visactor/vrender-core"
-}
\ No newline at end of file
diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml
index 275ed7a8b..abb3a6bdd 100644
--- a/common/config/rush/pnpm-lock.yaml
+++ b/common/config/rush/pnpm-lock.yaml
@@ -22,7 +22,7 @@ importers:
specifier: ~0.5.7
version: 0.5.7
'@visactor/vrender':
- specifier: workspace:1.0.13
+ specifier: workspace:1.0.14
version: link:../packages/vrender
'@visactor/vutils':
specifier: 1.0.6
@@ -95,7 +95,7 @@ importers:
../../packages/react-vrender:
dependencies:
'@visactor/vrender':
- specifier: workspace:1.0.13
+ specifier: workspace:1.0.14
version: link:../vrender
'@visactor/vutils':
specifier: 1.0.6
@@ -153,10 +153,10 @@ importers:
../../packages/react-vrender-utils:
dependencies:
'@visactor/react-vrender':
- specifier: workspace:1.0.13
+ specifier: workspace:1.0.14
version: link:../react-vrender
'@visactor/vrender':
- specifier: workspace:1.0.13
+ specifier: workspace:1.0.14
version: link:../vrender
'@visactor/vutils':
specifier: 1.0.6
@@ -211,13 +211,13 @@ importers:
../../packages/vrender:
dependencies:
'@visactor/vrender-animate':
- specifier: workspace:1.0.13
+ specifier: workspace:1.0.14
version: link:../vrender-animate
'@visactor/vrender-core':
- specifier: workspace:1.0.13
+ specifier: workspace:1.0.14
version: link:../vrender-core
'@visactor/vrender-kits':
- specifier: workspace:1.0.13
+ specifier: workspace:1.0.14
version: link:../vrender-kits
devDependencies:
'@internal/bundler':
@@ -284,7 +284,7 @@ importers:
../../packages/vrender-animate:
dependencies:
'@visactor/vrender-core':
- specifier: workspace:1.0.13
+ specifier: workspace:1.0.14
version: link:../vrender-core
'@visactor/vutils':
specifier: 1.0.6
@@ -342,13 +342,13 @@ importers:
../../packages/vrender-components:
dependencies:
'@visactor/vrender-animate':
- specifier: workspace:1.0.13
+ specifier: workspace:1.0.14
version: link:../vrender-animate
'@visactor/vrender-core':
- specifier: workspace:1.0.13
+ specifier: workspace:1.0.14
version: link:../vrender-core
'@visactor/vrender-kits':
- specifier: workspace:1.0.13
+ specifier: workspace:1.0.14
version: link:../vrender-kits
'@visactor/vscale':
specifier: 1.0.6
@@ -467,7 +467,7 @@ importers:
specifier: 2.4.1
version: 2.4.1
'@visactor/vrender-core':
- specifier: workspace:1.0.13
+ specifier: workspace:1.0.14
version: link:../vrender-core
'@visactor/vutils':
specifier: 1.0.6
@@ -583,19 +583,19 @@ importers:
../../tools/bugserver-trigger:
dependencies:
'@visactor/vrender':
- specifier: workspace:1.0.13
+ specifier: workspace:1.0.14
version: link:../../packages/vrender
'@visactor/vrender-animate':
- specifier: workspace:1.0.13
+ specifier: workspace:1.0.14
version: link:../../packages/vrender-animate
'@visactor/vrender-components':
- specifier: workspace:1.0.13
+ specifier: workspace:1.0.14
version: link:../../packages/vrender-components
'@visactor/vrender-core':
- specifier: workspace:1.0.13
+ specifier: workspace:1.0.14
version: link:../../packages/vrender-core
'@visactor/vrender-kits':
- specifier: workspace:1.0.13
+ specifier: workspace:1.0.14
version: link:../../packages/vrender-kits
devDependencies:
'@internal/bundler':
diff --git a/common/config/rush/version-policies.json b/common/config/rush/version-policies.json
index 12f6b8ddf..ec39e3ab2 100644
--- a/common/config/rush/version-policies.json
+++ b/common/config/rush/version-policies.json
@@ -1 +1 @@
-[{"definitionName":"lockStepVersion","policyName":"vrenderMain","version":"1.0.13","nextBump":"patch"}]
+[{"definitionName":"lockStepVersion","policyName":"vrenderMain","version":"1.0.14","nextBump":"patch"}]
diff --git a/docs/package.json b/docs/package.json
index b40e8996e..d07ed0e73 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -13,7 +13,7 @@
"@visactor/vchart": "1.3.0",
"@visactor/vutils": "1.0.6",
"@visactor/vgrammar": "~0.5.7",
- "@visactor/vrender": "workspace:1.0.13",
+ "@visactor/vrender": "workspace:1.0.14",
"markdown-it": "^13.0.0",
"highlight.js": "^11.8.0",
"axios": "^1.4.0",
diff --git a/packages/react-vrender-utils/CHANGELOG.json b/packages/react-vrender-utils/CHANGELOG.json
index 201089dc4..71d8929d2 100644
--- a/packages/react-vrender-utils/CHANGELOG.json
+++ b/packages/react-vrender-utils/CHANGELOG.json
@@ -1,6 +1,12 @@
{
"name": "@visactor/react-vrender-utils",
"entries": [
+ {
+ "version": "1.0.14",
+ "tag": "@visactor/react-vrender-utils_v1.0.14",
+ "date": "Fri, 29 Aug 2025 09:17:17 GMT",
+ "comments": {}
+ },
{
"version": "1.0.13",
"tag": "@visactor/react-vrender-utils_v1.0.13",
diff --git a/packages/react-vrender-utils/CHANGELOG.md b/packages/react-vrender-utils/CHANGELOG.md
index a8eb322dc..3dc9070ba 100644
--- a/packages/react-vrender-utils/CHANGELOG.md
+++ b/packages/react-vrender-utils/CHANGELOG.md
@@ -1,6 +1,11 @@
# Change Log - @visactor/react-vrender-utils
-This log was last generated on Tue, 26 Aug 2025 11:35:34 GMT and should not be manually modified.
+This log was last generated on Fri, 29 Aug 2025 09:17:17 GMT and should not be manually modified.
+
+## 1.0.14
+Fri, 29 Aug 2025 09:17:17 GMT
+
+_Version update only_
## 1.0.13
Tue, 26 Aug 2025 11:35:34 GMT
diff --git a/packages/react-vrender-utils/package.json b/packages/react-vrender-utils/package.json
index a484df8a1..860b84a21 100644
--- a/packages/react-vrender-utils/package.json
+++ b/packages/react-vrender-utils/package.json
@@ -1,6 +1,6 @@
{
"name": "@visactor/react-vrender-utils",
- "version": "1.0.13",
+ "version": "1.0.14",
"description": "",
"sideEffects": false,
"main": "cjs/index.js",
@@ -24,8 +24,8 @@
"react-dom": "^18.2.0"
},
"dependencies": {
- "@visactor/vrender": "workspace:1.0.13",
- "@visactor/react-vrender": "workspace:1.0.13",
+ "@visactor/vrender": "workspace:1.0.14",
+ "@visactor/react-vrender": "workspace:1.0.14",
"@visactor/vutils": "1.0.6",
"react-reconciler": "^0.29.0",
"tslib": "^2.3.1"
diff --git a/packages/react-vrender/CHANGELOG.json b/packages/react-vrender/CHANGELOG.json
index a27f07cd8..33fe767a9 100644
--- a/packages/react-vrender/CHANGELOG.json
+++ b/packages/react-vrender/CHANGELOG.json
@@ -1,6 +1,12 @@
{
"name": "@visactor/react-vrender",
"entries": [
+ {
+ "version": "1.0.14",
+ "tag": "@visactor/react-vrender_v1.0.14",
+ "date": "Fri, 29 Aug 2025 09:17:17 GMT",
+ "comments": {}
+ },
{
"version": "1.0.13",
"tag": "@visactor/react-vrender_v1.0.13",
diff --git a/packages/react-vrender/CHANGELOG.md b/packages/react-vrender/CHANGELOG.md
index 51e807a1b..98184afcd 100644
--- a/packages/react-vrender/CHANGELOG.md
+++ b/packages/react-vrender/CHANGELOG.md
@@ -1,6 +1,11 @@
# Change Log - @visactor/react-vrender
-This log was last generated on Tue, 26 Aug 2025 11:35:34 GMT and should not be manually modified.
+This log was last generated on Fri, 29 Aug 2025 09:17:17 GMT and should not be manually modified.
+
+## 1.0.14
+Fri, 29 Aug 2025 09:17:17 GMT
+
+_Version update only_
## 1.0.13
Tue, 26 Aug 2025 11:35:34 GMT
diff --git a/packages/react-vrender/package.json b/packages/react-vrender/package.json
index 7b5fdb843..191bc8f20 100644
--- a/packages/react-vrender/package.json
+++ b/packages/react-vrender/package.json
@@ -1,6 +1,6 @@
{
"name": "@visactor/react-vrender",
- "version": "1.0.13",
+ "version": "1.0.14",
"description": "",
"sideEffects": false,
"main": "cjs/index.js",
@@ -23,7 +23,7 @@
"react": "^18.2.0"
},
"dependencies": {
- "@visactor/vrender": "workspace:1.0.13",
+ "@visactor/vrender": "workspace:1.0.14",
"@visactor/vutils": "1.0.6",
"react-reconciler": "^0.29.0",
"tslib": "^2.3.1"
diff --git a/packages/vrender-animate/CHANGELOG.json b/packages/vrender-animate/CHANGELOG.json
index 8ec668ee7..ce72bc94e 100644
--- a/packages/vrender-animate/CHANGELOG.json
+++ b/packages/vrender-animate/CHANGELOG.json
@@ -1,6 +1,12 @@
{
"name": "@visactor/vrender-animate",
"entries": [
+ {
+ "version": "1.0.14",
+ "tag": "@visactor/vrender-animate_v1.0.14",
+ "date": "Fri, 29 Aug 2025 09:17:17 GMT",
+ "comments": {}
+ },
{
"version": "1.0.13",
"tag": "@visactor/vrender-animate_v1.0.13",
diff --git a/packages/vrender-animate/CHANGELOG.md b/packages/vrender-animate/CHANGELOG.md
index ff334e6e8..3ddb2fab1 100644
--- a/packages/vrender-animate/CHANGELOG.md
+++ b/packages/vrender-animate/CHANGELOG.md
@@ -1,6 +1,11 @@
# Change Log - @visactor/vrender-animate
-This log was last generated on Tue, 26 Aug 2025 11:35:34 GMT and should not be manually modified.
+This log was last generated on Fri, 29 Aug 2025 09:17:17 GMT and should not be manually modified.
+
+## 1.0.14
+Fri, 29 Aug 2025 09:17:17 GMT
+
+_Version update only_
## 1.0.13
Tue, 26 Aug 2025 11:35:34 GMT
diff --git a/packages/vrender-animate/package.json b/packages/vrender-animate/package.json
index 974c14270..ef4b77232 100644
--- a/packages/vrender-animate/package.json
+++ b/packages/vrender-animate/package.json
@@ -1,6 +1,6 @@
{
"name": "@visactor/vrender-animate",
- "version": "1.0.13",
+ "version": "1.0.14",
"description": "",
"sideEffects": false,
"main": "cjs/index.js",
@@ -21,7 +21,7 @@
},
"dependencies": {
"@visactor/vutils": "1.0.6",
- "@visactor/vrender-core": "workspace:1.0.13"
+ "@visactor/vrender-core": "workspace:1.0.14"
},
"devDependencies": {
"@internal/bundler": "workspace:*",
diff --git a/packages/vrender-components/CHANGELOG.json b/packages/vrender-components/CHANGELOG.json
index 484090329..91c0f8f07 100644
--- a/packages/vrender-components/CHANGELOG.json
+++ b/packages/vrender-components/CHANGELOG.json
@@ -1,6 +1,18 @@
{
"name": "@visactor/vrender-components",
"entries": [
+ {
+ "version": "1.0.14",
+ "tag": "@visactor/vrender-components_v1.0.14",
+ "date": "Fri, 29 Aug 2025 09:17:17 GMT",
+ "comments": {
+ "none": [
+ {
+ "comment": "feat: add table series number component \n\n"
+ }
+ ]
+ }
+ },
{
"version": "1.0.13",
"tag": "@visactor/vrender-components_v1.0.13",
diff --git a/packages/vrender-components/CHANGELOG.md b/packages/vrender-components/CHANGELOG.md
index d77c0cfa9..5ff799b05 100644
--- a/packages/vrender-components/CHANGELOG.md
+++ b/packages/vrender-components/CHANGELOG.md
@@ -1,6 +1,15 @@
# Change Log - @visactor/vrender-components
-This log was last generated on Tue, 26 Aug 2025 11:35:34 GMT and should not be manually modified.
+This log was last generated on Fri, 29 Aug 2025 09:17:17 GMT and should not be manually modified.
+
+## 1.0.14
+Fri, 29 Aug 2025 09:17:17 GMT
+
+### Updates
+
+- feat: add table series number component
+
+
## 1.0.13
Tue, 26 Aug 2025 11:35:34 GMT
diff --git a/packages/vrender-components/package.json b/packages/vrender-components/package.json
index 63565ad4d..d02bbb094 100644
--- a/packages/vrender-components/package.json
+++ b/packages/vrender-components/package.json
@@ -1,6 +1,6 @@
{
"name": "@visactor/vrender-components",
- "version": "1.0.13",
+ "version": "1.0.14",
"description": "components library for dp visualization",
"sideEffects": false,
"main": "cjs/index.js",
@@ -27,9 +27,9 @@
"dependencies": {
"@visactor/vutils": "1.0.6",
"@visactor/vscale": "1.0.6",
- "@visactor/vrender-core": "workspace:1.0.13",
- "@visactor/vrender-kits": "workspace:1.0.13",
- "@visactor/vrender-animate": "workspace:1.0.13"
+ "@visactor/vrender-core": "workspace:1.0.14",
+ "@visactor/vrender-kits": "workspace:1.0.14",
+ "@visactor/vrender-animate": "workspace:1.0.14"
},
"devDependencies": {
"@internal/bundler": "workspace:*",
diff --git a/packages/vrender-core/CHANGELOG.json b/packages/vrender-core/CHANGELOG.json
index b8b9e3e0a..7dcf1a575 100644
--- a/packages/vrender-core/CHANGELOG.json
+++ b/packages/vrender-core/CHANGELOG.json
@@ -1,6 +1,21 @@
{
"name": "@visactor/vrender-core",
"entries": [
+ {
+ "version": "1.0.14",
+ "tag": "@visactor/vrender-core_v1.0.14",
+ "date": "Fri, 29 Aug 2025 09:17:17 GMT",
+ "comments": {
+ "none": [
+ {
+ "comment": "feat: support textMeasureId to select measure instance, closed #1897"
+ },
+ {
+ "comment": "fix: fix issue with number text in cliped attr, closed #1834"
+ }
+ ]
+ }
+ },
{
"version": "1.0.13",
"tag": "@visactor/vrender-core_v1.0.13",
diff --git a/packages/vrender-core/CHANGELOG.md b/packages/vrender-core/CHANGELOG.md
index 952adf7a6..275ada5d1 100644
--- a/packages/vrender-core/CHANGELOG.md
+++ b/packages/vrender-core/CHANGELOG.md
@@ -1,6 +1,14 @@
# Change Log - @visactor/vrender-core
-This log was last generated on Tue, 26 Aug 2025 11:35:34 GMT and should not be manually modified.
+This log was last generated on Fri, 29 Aug 2025 09:17:17 GMT and should not be manually modified.
+
+## 1.0.14
+Fri, 29 Aug 2025 09:17:17 GMT
+
+### Updates
+
+- feat: support textMeasureId to select measure instance, closed #1897
+- fix: fix issue with number text in cliped attr, closed #1834
## 1.0.13
Tue, 26 Aug 2025 11:35:34 GMT
diff --git a/packages/vrender-core/package.json b/packages/vrender-core/package.json
index 5b2194125..5007dfff3 100644
--- a/packages/vrender-core/package.json
+++ b/packages/vrender-core/package.json
@@ -1,6 +1,6 @@
{
"name": "@visactor/vrender-core",
- "version": "1.0.13",
+ "version": "1.0.14",
"description": "",
"sideEffects": [
"./src/modules.ts",
diff --git a/packages/vrender-kits/CHANGELOG.json b/packages/vrender-kits/CHANGELOG.json
index 25eaa56d5..d9f91f0ec 100644
--- a/packages/vrender-kits/CHANGELOG.json
+++ b/packages/vrender-kits/CHANGELOG.json
@@ -1,6 +1,12 @@
{
"name": "@visactor/vrender-kits",
"entries": [
+ {
+ "version": "1.0.14",
+ "tag": "@visactor/vrender-kits_v1.0.14",
+ "date": "Fri, 29 Aug 2025 09:17:17 GMT",
+ "comments": {}
+ },
{
"version": "1.0.13",
"tag": "@visactor/vrender-kits_v1.0.13",
diff --git a/packages/vrender-kits/CHANGELOG.md b/packages/vrender-kits/CHANGELOG.md
index 0dc20181e..abbe75cdb 100644
--- a/packages/vrender-kits/CHANGELOG.md
+++ b/packages/vrender-kits/CHANGELOG.md
@@ -1,6 +1,11 @@
# Change Log - @visactor/vrender-kits
-This log was last generated on Tue, 26 Aug 2025 11:35:34 GMT and should not be manually modified.
+This log was last generated on Fri, 29 Aug 2025 09:17:17 GMT and should not be manually modified.
+
+## 1.0.14
+Fri, 29 Aug 2025 09:17:17 GMT
+
+_Version update only_
## 1.0.13
Tue, 26 Aug 2025 11:35:34 GMT
diff --git a/packages/vrender-kits/package.json b/packages/vrender-kits/package.json
index 3f20da9c1..5bce4d6bb 100644
--- a/packages/vrender-kits/package.json
+++ b/packages/vrender-kits/package.json
@@ -1,6 +1,6 @@
{
"name": "@visactor/vrender-kits",
- "version": "1.0.13",
+ "version": "1.0.14",
"description": "",
"sideEffects": false,
"main": "cjs/index.js",
@@ -21,7 +21,7 @@
},
"dependencies": {
"@visactor/vutils": "1.0.6",
- "@visactor/vrender-core": "workspace:1.0.13",
+ "@visactor/vrender-core": "workspace:1.0.14",
"@resvg/resvg-js": "2.4.1",
"roughjs": "4.5.2",
"gifuct-js": "2.1.2",
diff --git a/packages/vrender/CHANGELOG.json b/packages/vrender/CHANGELOG.json
index 54cdc6e43..4455f95b3 100644
--- a/packages/vrender/CHANGELOG.json
+++ b/packages/vrender/CHANGELOG.json
@@ -1,6 +1,12 @@
{
"name": "@visactor/vrender",
"entries": [
+ {
+ "version": "1.0.14",
+ "tag": "@visactor/vrender_v1.0.14",
+ "date": "Fri, 29 Aug 2025 09:17:17 GMT",
+ "comments": {}
+ },
{
"version": "1.0.13",
"tag": "@visactor/vrender_v1.0.13",
diff --git a/packages/vrender/CHANGELOG.md b/packages/vrender/CHANGELOG.md
index 407e9c915..30b0fa365 100644
--- a/packages/vrender/CHANGELOG.md
+++ b/packages/vrender/CHANGELOG.md
@@ -1,6 +1,11 @@
# Change Log - @visactor/vrender
-This log was last generated on Tue, 26 Aug 2025 11:35:34 GMT and should not be manually modified.
+This log was last generated on Fri, 29 Aug 2025 09:17:17 GMT and should not be manually modified.
+
+## 1.0.14
+Fri, 29 Aug 2025 09:17:17 GMT
+
+_Version update only_
## 1.0.13
Tue, 26 Aug 2025 11:35:34 GMT
diff --git a/packages/vrender/package.json b/packages/vrender/package.json
index 9d61dc2c3..42aaef111 100644
--- a/packages/vrender/package.json
+++ b/packages/vrender/package.json
@@ -1,6 +1,6 @@
{
"name": "@visactor/vrender",
- "version": "1.0.13",
+ "version": "1.0.14",
"description": "",
"sideEffects": true,
"main": "cjs/index.js",
@@ -24,9 +24,9 @@
"test-watch": "cross-env DEBUG_MODE=1 jest --watch"
},
"dependencies": {
- "@visactor/vrender-core": "workspace:1.0.13",
- "@visactor/vrender-kits": "workspace:1.0.13",
- "@visactor/vrender-animate": "workspace:1.0.13"
+ "@visactor/vrender-core": "workspace:1.0.14",
+ "@visactor/vrender-kits": "workspace:1.0.14",
+ "@visactor/vrender-animate": "workspace:1.0.14"
},
"devDependencies": {
"@internal/bundler": "workspace:*",
diff --git a/tools/bugserver-trigger/package.json b/tools/bugserver-trigger/package.json
index c84bfa474..071e2eb3e 100644
--- a/tools/bugserver-trigger/package.json
+++ b/tools/bugserver-trigger/package.json
@@ -8,11 +8,11 @@
"ci": "ts-node --transpileOnly --skipProject ./scripts/trigger-test.ts"
},
"dependencies": {
- "@visactor/vrender": "workspace:1.0.13",
- "@visactor/vrender-core": "workspace:1.0.13",
- "@visactor/vrender-kits": "workspace:1.0.13",
- "@visactor/vrender-components": "workspace:1.0.13",
- "@visactor/vrender-animate": "workspace:1.0.13"
+ "@visactor/vrender": "workspace:1.0.14",
+ "@visactor/vrender-core": "workspace:1.0.14",
+ "@visactor/vrender-kits": "workspace:1.0.14",
+ "@visactor/vrender-components": "workspace:1.0.14",
+ "@visactor/vrender-animate": "workspace:1.0.14"
},
"devDependencies": {
"@rushstack/eslint-patch": "~1.1.4",