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",