arthub-table 0.1.0-beta.2 → 0.1.0-beta.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/arthub-table.common.js +1 -1
  2. package/dist/arthub-table.common.js.map +1 -1
  3. package/dist/arthub-table.umd.js +1 -1
  4. package/dist/arthub-table.umd.js.map +1 -1
  5. package/dist/arthub-table.umd.min.js +1 -1
  6. package/dist/arthub-table.umd.min.js.map +1 -1
  7. package/dist/types/adapters/DataGridIntegration.d.ts +128 -0
  8. package/dist/types/adapters/index.d.ts +2 -2
  9. package/dist/types/adapters/rowDataAdapter.d.ts +80 -47
  10. package/dist/types/adapters/styleAdapter.d.ts +2 -0
  11. package/dist/types/assets/icon/defaultAvatar.d.ts +1 -1
  12. package/dist/types/core/Body.d.ts +7 -1
  13. package/dist/types/core/Cell.d.ts +16 -3
  14. package/dist/types/core/ColumnHeader.d.ts +16 -0
  15. package/dist/types/core/DataGrid.d.ts +325 -3
  16. package/dist/types/core/Footer.d.ts +29 -2
  17. package/dist/types/core/GroupRow.d.ts +83 -12
  18. package/dist/types/core/Header.d.ts +9 -0
  19. package/dist/types/core/ImageManager.d.ts +23 -0
  20. package/dist/types/core/NestedGrid.d.ts +21 -0
  21. package/dist/types/core/Paint.d.ts +26 -0
  22. package/dist/types/core/Row.d.ts +2 -2
  23. package/dist/types/core/RowHeader.d.ts +37 -0
  24. package/dist/types/core/StyleManager.d.ts +20 -0
  25. package/dist/types/core/constants.d.ts +3 -2
  26. package/dist/types/core/types.d.ts +83 -3
  27. package/dist/types/core/viewers/BooleanViewer.d.ts +1 -0
  28. package/dist/types/core/viewers/FileViewer.d.ts +1 -0
  29. package/dist/types/core/viewers/GroupNameViewer.d.ts +56 -0
  30. package/dist/types/core/viewers/PersonViewer.d.ts +6 -0
  31. package/dist/types/core/viewers/PriorityTextViewer.d.ts +0 -4
  32. package/dist/types/core/viewers/TaskNodeViewer.d.ts +5 -1
  33. package/dist/types/core/viewers/TextViewerWithSwitcher.d.ts +15 -1
  34. package/dist/types/core/viewers/index.d.ts +3 -3
  35. package/dist/types/core/viewers/types.d.ts +83 -1
  36. package/dist/types/index.d.ts +4 -4
  37. package/package.json +1 -1
@@ -0,0 +1,56 @@
1
+ /**
2
+ * GroupNameViewer - Group header name rendering viewer
3
+ * Renders the group name in group header rows with proper formatting.
4
+ *
5
+ * Supports 5 render modes:
6
+ * - text: Plain text (default, for workflow_state, workflow_id, taskNode, etc.)
7
+ * - person: Avatar + person name with click-to-jump support
8
+ * - tag: Colored background tags (for module, dropdown, treeDropdown)
9
+ * - boolean: Check/cross icon + text (for boolean fields)
10
+ * - priority: P{n} colored tag (for priority fields)
11
+ *
12
+ * The business layer (AssetMatrix) builds GroupNameViewerData from formatSpecialGroupHeader logic,
13
+ * and this viewer only handles rendering. This keeps arthub-table free of business dependencies.
14
+ */
15
+ import type { CellViewer, ViewerRenderContext, GroupNameViewerData } from './types';
16
+ declare class GroupNameViewer implements CellViewer<GroupNameViewerData> {
17
+ readonly type = "group-name";
18
+ private imageManager;
19
+ private _sm;
20
+ /** Index of the person currently hovered by mouse (-1 = none) */
21
+ private _hoverPersonIndex;
22
+ private get avatarColors();
23
+ constructor();
24
+ /**
25
+ * Draw group name content
26
+ */
27
+ draw(context: ViewerRenderContext, data: GroupNameViewerData): void;
28
+ /**
29
+ * Handle click events - detect person name clicks for jump
30
+ */
31
+ onClick(context: ViewerRenderContext, data: GroupNameViewerData, localX: number, _localY: number): boolean;
32
+ /**
33
+ * Show pointer cursor when hovering over person names
34
+ */
35
+ getInteractiveCursor(context: ViewerRenderContext, data: GroupNameViewerData, localX: number, _localY: number): string | null;
36
+ /**
37
+ * Reset hover state when mouse leaves the viewer area
38
+ */
39
+ resetHoverState(_data?: GroupNameViewerData): void;
40
+ private drawTextMode;
41
+ private drawPersonMode;
42
+ /**
43
+ * Draw person avatar from URL
44
+ */
45
+ private drawAvatar;
46
+ /**
47
+ * Draw fallback avatar with initial letter
48
+ */
49
+ private drawFallbackAvatar;
50
+ private getColorIndex;
51
+ private getInitial;
52
+ private drawTagMode;
53
+ private drawBooleanMode;
54
+ private drawPriorityMode;
55
+ }
56
+ export default GroupNameViewer;
@@ -31,6 +31,12 @@ declare class PersonViewer implements CellViewer<PersonViewerData> {
31
31
  * Draw persons
32
32
  */
33
33
  private drawPersons;
34
+ /**
35
+ * showNameBackground (tag) 模式下的 flex 均匀分配布局
36
+ * 对齐 DOM 版本:容器 padding 4px,卡片间距 4px,卡片内 padding 4px 6px
37
+ * 所有卡片先按最小宽度(头像+padding)分配,剩余空间均匀分给文本
38
+ */
39
+ private drawPersonsFlexLayout;
34
40
  /**
35
41
  * Draw a single person with width constraint
36
42
  * @returns Width of the drawn person item
@@ -27,9 +27,5 @@ declare class PriorityTextViewer implements CellViewer<PriorityTextViewerData> {
27
27
  * 绘制圆角矩形
28
28
  */
29
29
  private drawRoundedRect;
30
- /**
31
- * 截断文本并添加省略号
32
- */
33
- private truncateText;
34
30
  }
35
31
  export default PriorityTextViewer;
@@ -41,7 +41,11 @@ declare class TaskNodeViewer implements CellViewer<TaskNodeViewerData> {
41
41
  */
42
42
  private parseValue;
43
43
  /**
44
- * 通过 ID 数组和 customTaskNodeInfo 映射解析节点信息
44
+ * 通过 ID 数组解析节点信息
45
+ * 解析优先级(与 DOM 版 findNeedFetchNodeAndFormatNode 对齐):
46
+ * 1. customTaskNodeInfo(行数据上的映射表,TemplateDetail 场景)
47
+ * 2. taskNodeResolver(通过 graph.getNode 查询,进度表场景)
48
+ * 3. 兜底使用 ID 数字作为名称
45
49
  */
46
50
  private resolveNodesByIds;
47
51
  /**
@@ -15,6 +15,8 @@ declare class TextViewerWithSwitcher implements CellViewer<TextViewerWithSwitche
15
15
  private totalNumImage;
16
16
  private iomcImages;
17
17
  private iomcColoredCanvases;
18
+ private downstreamImage;
19
+ private downstreamColoredCanvas;
18
20
  private loadingAngle;
19
21
  private lastLayoutBounds;
20
22
  private _sm;
@@ -26,6 +28,14 @@ declare class TextViewerWithSwitcher implements CellViewer<TextViewerWithSwitche
26
28
  /**
27
29
  * Main draw method
28
30
  */
31
+ /**
32
+ * Live-refresh iconFile & tapdHighlight from rowData (overlay Proxy).
33
+ * transformTextWithSwitcherValue snapshots these values at preprocess time,
34
+ * but the underlying proxyedData may be updated asynchronously (e.g. updateTableTaskByNode).
35
+ * Reading from data.extra.rowData triggers the overlay Proxy get handler,
36
+ * which falls back to proxyedData for the latest value.
37
+ */
38
+ private refreshDataFromRowData;
29
39
  draw(context: ViewerRenderContext, data: TextViewerWithSwitcherData): void;
30
40
  /**
31
41
  * Draw tree indent lines
@@ -65,6 +75,10 @@ declare class TextViewerWithSwitcher implements CellViewer<TextViewerWithSwitche
65
75
  * the correct color using source-in composite operation.
66
76
  */
67
77
  private recolorIomcIcon;
78
+ /**
79
+ * Recolor an icon image to the specified color using offscreen canvas.
80
+ */
81
+ private recolorIcon;
68
82
  /**
69
83
  * Draw IOMC order state icon (已提单/未提单/已驳回)
70
84
  * Renders before text, after task icon.
@@ -90,7 +104,7 @@ declare class TextViewerWithSwitcher implements CellViewer<TextViewerWithSwitche
90
104
  */
91
105
  private drawTotalNum;
92
106
  /**
93
- * Draw downstream node indicator
107
+ * Draw downstream node indicator (icon_history1.svg, colored #ffb74d, 16x16)
94
108
  * @returns New right X position (moving leftward)
95
109
  */
96
110
  private drawDownstreamIcon;
@@ -12,7 +12,7 @@ export { default as ProgressViewer } from './ProgressViewer';
12
12
  export { default as DatetimeViewer } from './DatetimeViewer';
13
13
  export { default as BooleanViewer } from './BooleanViewer';
14
14
  export { default as StatusViewer } from './StatusViewer';
15
- export { default as GroupHeaderViewer } from './GroupHeaderViewer';
15
+ export { default as GroupNameViewer } from './GroupNameViewer';
16
16
  export { default as SeparatorRowViewer } from './SeparatorRowViewer';
17
17
  export { default as NestedGridViewer } from './NestedGridViewer';
18
18
  export { default as PunchViewer } from './PunchViewer';
@@ -48,7 +48,7 @@ import ProgressViewer from './ProgressViewer';
48
48
  import DatetimeViewer from './DatetimeViewer';
49
49
  import BooleanViewer from './BooleanViewer';
50
50
  import StatusViewer from './StatusViewer';
51
- import GroupHeaderViewer from './GroupHeaderViewer';
51
+ import GroupNameViewer from './GroupNameViewer';
52
52
  import SeparatorRowViewer from './SeparatorRowViewer';
53
53
  import NestedGridViewer from './NestedGridViewer';
54
54
  import PunchViewer from './PunchViewer';
@@ -98,7 +98,7 @@ export declare const defaultViewers: {
98
98
  boolean: typeof BooleanViewer;
99
99
  checkbox: typeof BooleanViewer;
100
100
  status: typeof StatusViewer;
101
- 'group-header': typeof GroupHeaderViewer;
101
+ 'group-name': typeof GroupNameViewer;
102
102
  'separator-row': typeof SeparatorRowViewer;
103
103
  nested: typeof NestedGridViewer;
104
104
  punch: typeof PunchViewer;
@@ -166,6 +166,26 @@ export interface CellViewerData {
166
166
  /** Extra data for specific viewers */
167
167
  extra?: Record<string, any>;
168
168
  }
169
+ /**
170
+ * Cell value transformer callback type.
171
+ *
172
+ * Called by Cell.drawWithViewer() before passing data to viewer.draw().
173
+ * The transformer receives the raw cell value and column metadata, and returns
174
+ * a transformed value suitable for the viewer. If no transformation is needed,
175
+ * return the original value unchanged (or undefined to skip transformation).
176
+ *
177
+ * This decouples value transformation from the data preprocessing layer
178
+ * (rowDataAdapter.transformCellValues) and moves it to the rendering layer,
179
+ * aligning with the DOM table's approach where viewers (e.g. textViewer.ts
180
+ * getDisplayValue / getTreeCustomInfo) handle value-to-display conversion.
181
+ *
182
+ * @param rawValue - The raw cell value from row data
183
+ * @param columnKey - The column key (header key / property UUID)
184
+ * @param viewerType - The viewer type identifier (e.g. 'text', 'person', 'wf-state')
185
+ * @param rowData - The full row data object
186
+ * @returns Transformed value to use for rendering, or undefined to keep original
187
+ */
188
+ export type CellValueTransformer = (rawValue: any, columnKey: string, viewerType: string, rowData: Record<string, any>) => any | undefined;
169
189
  /**
170
190
  * Option item for select-type viewers
171
191
  */
@@ -237,7 +257,7 @@ export interface ImageViewerData extends CellViewerData {
237
257
  /** Placeholder image URL */
238
258
  placeholder?: string;
239
259
  /** Image fit mode */
240
- fit?: 'contain' | 'cover' | 'fill';
260
+ fit?: 'contain' | 'cover' | 'fill' | 'height-full' | 'width-full';
241
261
  /** Border radius */
242
262
  borderRadius?: number;
243
263
  /** Whether the image is animated (GIF) */
@@ -330,6 +350,10 @@ export interface DatetimeViewerData extends CellViewerData {
330
350
  formattedText?: string;
331
351
  /** 文本颜色(如逾期提醒的红色) */
332
352
  textColor?: string;
353
+ /** hover 时显示的 tooltip 文本(完整日期格式) */
354
+ hoverText?: string;
355
+ /** hover 时是否显示下划线(用于时间型字段变更提醒) */
356
+ showUnderlineOnHover?: boolean;
333
357
  }
334
358
  /**
335
359
  * Boolean/Checkbox viewer data
@@ -396,6 +420,55 @@ export interface GroupHeaderViewerData extends CellViewerData {
396
420
  /** Whether to show working hours icon */
397
421
  showUserWorkingHours?: boolean;
398
422
  }
423
+ /**
424
+ * Group name tag item (for module/dropdown/treeDropdown colored tags)
425
+ */
426
+ export interface GroupNameTagItem {
427
+ /** Display text */
428
+ text: string;
429
+ /** Tag background color */
430
+ bgColor: string;
431
+ /** Tag text color */
432
+ textColor: string;
433
+ /** Whether bgColor is an original color (not derived) */
434
+ isOriginalColor?: boolean;
435
+ }
436
+ /**
437
+ * Group name person item (for person-type group headers)
438
+ */
439
+ export interface GroupNamePersonItem {
440
+ /** Person display name */
441
+ name: string;
442
+ /** Person avatar URL */
443
+ avatar?: string;
444
+ /** Person account name (used for click-to-jump) */
445
+ accountName?: string;
446
+ /** Whether this is an empty/placeholder person */
447
+ isEmpty?: boolean;
448
+ }
449
+ /**
450
+ * Group name viewer data
451
+ * Used by GroupNameViewer to render group header names with proper formatting.
452
+ * The business layer (AssetMatrix) builds this data from formatSpecialGroupHeader logic,
453
+ * and the viewer only handles rendering.
454
+ */
455
+ export interface GroupNameViewerData extends CellViewerData {
456
+ value: any;
457
+ /** Render mode */
458
+ renderType: 'text' | 'person' | 'tag' | 'boolean' | 'priority';
459
+ /** Plain text display name (used for text/boolean/fallback rendering) */
460
+ displayName?: string;
461
+ /** Tag items for tag render mode (module/dropdown/treeDropdown) */
462
+ tags?: GroupNameTagItem[];
463
+ /** Person items for person render mode */
464
+ persons?: GroupNamePersonItem[];
465
+ /** Boolean value string ('true' or 'false') for boolean render mode */
466
+ boolValue?: 'true' | 'false';
467
+ /** Priority numeric value for priority render mode */
468
+ priorityValue?: number | string;
469
+ /** Callback when a person name is clicked (for user profile jump) */
470
+ onPersonClick?: (accountName: string) => void;
471
+ }
399
472
  /**
400
473
  * Separator row viewer data
401
474
  */
@@ -575,6 +648,8 @@ export interface FileViewerData extends CellViewerData {
575
648
  } | null;
576
649
  /** 是否仅显示缩略图(隐藏文件名) */
577
650
  isDisplayThumbnail?: boolean;
651
+ /** 缩略图模式下的图片适配方式(与 ImageViewerData.fit 对齐) */
652
+ thumbnailFit?: 'contain' | 'cover' | 'fill' | 'height-full' | 'width-full';
578
653
  /** 鼠标移入文件项回调(用于显示大图预览,与 ImageViewer 的 onImgMouseIn 签名一致) */
579
654
  onFileMouseIn?: (previewUrl: string, virtualAnchor: any) => void;
580
655
  /** 鼠标移出文件项回调(用于隐藏大图预览,与 ImageViewer 的 onImgMouseOut 签名一致) */
@@ -738,6 +813,12 @@ export interface TaskNodeViewerData extends CellViewerData {
738
813
  name: string;
739
814
  iconFile?: string;
740
815
  }>;
816
+ /** 节点详情解析回调(渲染时通过 graph.getNode 查询,与 DOM 版 findNeedFetchNodeAndFormatNode 对齐) */
817
+ taskNodeResolver?: (nodeId: number) => {
818
+ id: number;
819
+ name: string;
820
+ iconFile?: string;
821
+ } | null;
741
822
  /** 点击任务节点回调(打开业务节点详情页) */
742
823
  onTaskGoToDetail?: (nodeId: number) => void;
743
824
  }
@@ -811,6 +892,7 @@ export interface ViewerTypeMap {
811
892
  checkbox: BooleanViewerData;
812
893
  status: StatusViewerData;
813
894
  'group-header': GroupHeaderViewerData;
895
+ 'group-name': GroupNameViewerData;
814
896
  'separator-row': SeparatorRowViewerData;
815
897
  nested: NestedGridViewerData;
816
898
  punch: PunchViewerData;
@@ -10,7 +10,7 @@ export { install };
10
10
  export default DataGrid;
11
11
  export type { CellData, CellStyle, RowData, ColData, DataGridOptions, Position, Size, Rect, Range, CellRange, HistoryItem, ValidatorRule, ColumnType, ColumnConfig, SelectorState, EditorState, AutofillState, RangeState, DrawOptions, TextOptions, ClipboardState, EventHandlers, Direction, ScrollDirection, GroupLevel, SeparateLevel, BaseGroupedRowData, GroupRowData, SeparateRowData, NormalRowData, GroupedTableRowData, GroupRowStyle, SeparatorRowStyle, StatisticOption, FooterCellData, FooterData, FooterCellClickInfo, } from './core/types';
12
12
  export { isGroupRow, isSeparateRow, isNormalRow, GROUP_TABLE_CONSTANTS, DEFAULT_GROUP_STYLES, DEFAULT_SEPARATOR_STYLES, } from './core/types';
13
- export type { CellBounds, ViewerRenderContext, ViewerDragState, CellViewer, CellViewerData, ViewerOption, ViewerStyle, TextViewerData, DropdownViewerData, ImageViewerData, PersonViewerData, PersonInfo, ProgressViewerData, DatetimeViewerData, BooleanViewerData, StatusViewerData, StatusOption, GroupHeaderViewerData, SeparatorRowViewerData, PunchViewerData, PunchValue, ModuleInfo, ModuleViewerData, TextViewerWithSwitcherData, FileItem, FileViewerData, HyperlinkTextViewerData, IUpstreamModule, IUpstreamReminderProperties, IUpstreamSyncProperty, IUpstreamFieldViewItem, UpstreamViewerData, TaskNodeItem, TaskNodeViewerData, NestedGridViewerData, NestedColumnConfig, ViewerConstructor, ViewerFactory, ViewerTypeMap, ViewerType, TypedCellData, TableActionButtonOption, TableActionButtonViewerData, } from './core/viewers/types';
13
+ export type { CellBounds, ViewerRenderContext, ViewerDragState, CellViewer, CellViewerData, ViewerOption, ViewerStyle, TextViewerData, DropdownViewerData, ImageViewerData, PersonViewerData, PersonInfo, ProgressViewerData, DatetimeViewerData, BooleanViewerData, StatusViewerData, StatusOption, GroupHeaderViewerData, GroupNameViewerData, GroupNameTagItem, GroupNamePersonItem, SeparatorRowViewerData, PunchViewerData, PunchValue, ModuleInfo, ModuleViewerData, TextViewerWithSwitcherData, FileItem, FileViewerData, HyperlinkTextViewerData, IUpstreamModule, IUpstreamReminderProperties, IUpstreamSyncProperty, IUpstreamFieldViewItem, UpstreamViewerData, TaskNodeItem, TaskNodeViewerData, NestedGridViewerData, NestedColumnConfig, ViewerConstructor, ViewerFactory, ViewerTypeMap, ViewerType, TypedCellData, TableActionButtonOption, TableActionButtonViewerData, } from './core/viewers/types';
14
14
  export { isTextViewerData, isDropdownViewerData, isPersonViewerData, isProgressViewerData, isNestedGridViewerData, } from './core/viewers/types';
15
15
  export { default as ViewerRegistry, getViewerRegistry, } from './core/viewers/ViewerRegistry';
16
16
  export { registerDefaultViewers, defaultViewers } from './core/viewers/index';
@@ -22,7 +22,7 @@ export { default as ProgressViewer } from './core/viewers/ProgressViewer';
22
22
  export { default as DatetimeViewer } from './core/viewers/DatetimeViewer';
23
23
  export { default as BooleanViewer } from './core/viewers/BooleanViewer';
24
24
  export { default as StatusViewer } from './core/viewers/StatusViewer';
25
- export { default as GroupHeaderViewer } from './core/viewers/GroupHeaderViewer';
25
+ export { default as GroupNameViewer } from './core/viewers/GroupNameViewer';
26
26
  export { default as SeparatorRowViewer } from './core/viewers/SeparatorRowViewer';
27
27
  export { default as NestedGridViewer } from './core/viewers/NestedGridViewer';
28
28
  export { default as PunchViewer } from './core/viewers/PunchViewer';
@@ -41,11 +41,11 @@ export { CSS_PREFIX, HEADER_HEIGHT, ROW_INDEX_WIDTH, CHECK_BOX_WIDTH, CELL_HEIGH
41
41
  export { getFieldStatisticTypes } from './core/footer/utils';
42
42
  export { convertToDataGridColumns, } from './adapters/columnAdapter';
43
43
  export type { ITableHeader, } from './adapters/columnAdapter';
44
- export { convertToDataGridRows, } from './adapters/rowDataAdapter';
44
+ export { convertToDataGridRows, isPerfLogEnabled, } from './adapters/rowDataAdapter';
45
45
  export type { PreprocessedRow, } from './adapters/rowDataAdapter';
46
46
  export { preprocessRowStyles, } from './adapters/styleAdapter';
47
47
  export type { RowStyleResult, } from './adapters/styleAdapter';
48
48
  export { DataGridEventAdapter, EventCategory, extractEventContext, mapDomEventToDataGridEvent, } from './adapters/DataGridEventAdapter';
49
49
  export type { EventContext, } from './adapters/DataGridEventAdapter';
50
- export { buildDataGridInitParams, refreshDataGridRows, refreshDataGridColumns, refreshDataGridColumnByKeys, refreshDataGridRowByIndex, } from './adapters/DataGridIntegration';
50
+ export { buildDataGridInitParams, refreshDataGridRows, refreshDataGridColumns, refreshDataGridColumnByKeys, refreshDataGridColumnByKeysAsync, refreshDataGridRowByIndex, } from './adapters/DataGridIntegration';
51
51
  export type { DataGridInitOptions, DataGridCallbacks, DataGridInitResult, } from './adapters/DataGridIntegration';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arthub-table",
3
- "version": "0.1.0-beta.2",
3
+ "version": "0.1.0-beta.21",
4
4
  "description": "High-performance canvas-based table/grid component for Vue 3 with TypeScript support, featuring virtual scrolling, cell viewers, grouped rows, and nested grids.",
5
5
  "main": "dist/arthub-table.common.js",
6
6
  "module": "dist/arthub-table.umd.min.js",