arthub-table 0.2.31 → 0.2.32-next.1

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.
@@ -87,6 +87,17 @@ declare class Body {
87
87
  * Check if mouse is inside a reminder triangle area (for cursor:pointer)
88
88
  */
89
89
  private isInsideReminderArea;
90
+ /**
91
+ * 命中测试:判断 (x, y) 是否落在某个可见 cell 的 reminder 三角区域内。
92
+ * 命中则返回该 cell 的 { rowIndex, colIndex },否则返回 null。
93
+ *
94
+ * 用于 mousedown 阶段提前识别"点击 reminder 三角",从而跳过 selectCell
95
+ * 以保留当前选区(避免多选被 clearMultiSelect 清空)。
96
+ */
97
+ getReminderTriangleHit(x: number, y: number): {
98
+ rowIndex: number;
99
+ colIndex: number;
100
+ } | null;
90
101
  /**
91
102
  * Check if click hits a viewer with onClick handler
92
103
  * @returns true if viewer handled the click
@@ -1395,6 +1395,12 @@ declare class DataGrid {
1395
1395
  multiSelectCell(x: number, y: number, mouseX: number, mouseY: number): void;
1396
1396
  endMultiSelect(): void;
1397
1397
  clearMultiSelect(): void;
1398
+ /**
1399
+ * 判断指定单元格(colIndex/rowIndex)是否落在当前选区范围内。
1400
+ * 选区未显示(selector.show=false)时返回 false。
1401
+ * 用于"点击 reminder 三角时保留已有选区"的判断(仅当被点 cell 已在选区内才保留)。
1402
+ */
1403
+ isCellInsideCurrentSelection(colIndex: number, rowIndex: number): boolean;
1398
1404
  clearAllNestedGridsSelection(): void;
1399
1405
  selectCols(col: any, e?: {
1400
1406
  ctrlKey?: boolean;
@@ -1,4 +1,4 @@
1
- export function e2t(extension: any): "image" | "versionset" | "pdf" | "exe" | "aep" | "ai" | "enf" | "mcp" | "x2d" | "xd" | "sketch" | "model" | "models" | "images" | "video" | "zipped" | "na" | "misc" | "iframeOffice" | "iframe" | "audio" | "pxcook";
1
+ export function e2t(extension: any): "image" | "video" | "versionset" | "pdf" | "exe" | "aep" | "ai" | "enf" | "mcp" | "x2d" | "xd" | "sketch" | "model" | "models" | "images" | "zipped" | "na" | "misc" | "iframeOffice" | "iframe" | "audio" | "pxcook";
2
2
  export function typeArr(type: any): string[];
3
3
  export function allExt(): string[];
4
4
  export function allowUploadExt(): string[];
@@ -0,0 +1,49 @@
1
+ /**
2
+ * PreImageViewer - 文件预览图渲染器(DOM PreImageViewer 的 Canvas 对齐版)
3
+ *
4
+ * 与 ImageViewer 的差异(与 DOM `preImageViewer.ts` 行为对齐):
5
+ * 1. 当 fileFormat 不属于图片格式(且 URL 后缀也不属于图片格式)时,
6
+ * 显示 fileFormat 对应的"文件类型图标"(PDF / Word / Excel / Sketch ...),
7
+ * 而不是缩略图 — 与 DOM `PreImageViewer.updateMiddle` 的"非图片型"分支一致。
8
+ * 2. 其余渲染(hover 浮窗、双击预览、loading 占位、状态图标兜底等)100% 委托 `ImageViewer`,
9
+ * 不重复实现像素绘制逻辑。
10
+ *
11
+ * 实现策略:独立类 + 内部组合(持有)一个 ImageViewer 实例完成实际绘制,
12
+ * 在 draw 入口决定"绘制缩略图 URL"还是"绘制 fileFormat 图标 URL",
13
+ * 然后委托 `ImageViewer.draw` 完成像素级渲染。
14
+ *
15
+ * type 标识独立为 `'preImage'`,便于业务侧/适配层做精细化路由。
16
+ */
17
+ import type { CellViewer, ViewerRenderContext, PreImageViewerData } from './types';
18
+ declare class PreImageViewer implements CellViewer<PreImageViewerData> {
19
+ readonly type = "preImage";
20
+ /** 内部组合的 ImageViewer 实例,承担实际像素绘制 / hover / 命中检测 */
21
+ private imageViewer;
22
+ constructor();
23
+ /**
24
+ * 绘制入口:判定是显示缩略图还是文件类型图标
25
+ * 对齐 DOM `preImageViewer.updateMiddle` 的 ext + IMAGE_EXTENSIONS 判定逻辑
26
+ */
27
+ draw(context: ViewerRenderContext, data: PreImageViewerData): void;
28
+ /**
29
+ * 给委托给 ImageViewer 的 data 注入 __viewerType: 'preImage'
30
+ * 这样 ImageViewer 触发的 onImgMouseIn / onDblClick 回调里业务侧能识别这是 preImage 列
31
+ * (用于走"反馈面板 popper"而非"简版大图 popper")
32
+ */
33
+ private withViewerType;
34
+ /**
35
+ * 双击委托给 ImageViewer(onClickImage 由业务侧注入,签名一致)
36
+ */
37
+ onDblClick(context: ViewerRenderContext, data: PreImageViewerData, localX: number, localY: number): boolean;
38
+ /**
39
+ * 鼠标悬停光标 + hover 回调委托给 ImageViewer
40
+ * 注意:必须注入 __viewerType,否则 ImageViewer.handleHoverChange 透传给业务回调的 data 不带标记,
41
+ * 业务侧无法区分这是 preImage 列还是普通 image 列
42
+ */
43
+ getInteractiveCursor(context: ViewerRenderContext, data: PreImageViewerData, localX: number, localY: number): string | null;
44
+ /**
45
+ * hover 状态重置委托给 ImageViewer
46
+ */
47
+ resetHoverState(data: PreImageViewerData): void;
48
+ }
49
+ export default PreImageViewer;
@@ -61,6 +61,8 @@ declare class RichTextViewer implements CellViewer<RichTextViewerData> {
61
61
  getInteractiveCursor(context: ViewerRenderContext, data: RichTextViewerData, localX: number, _localY: number): string | null;
62
62
  /**
63
63
  * 绘制文本内容
64
+ * 富文本 HTML 会被拆分为多个 run,逐个保留 color / bold / italic / underline / strike 渲染;
65
+ * 非富文本 / 空值 走原有单色路径,保证零回归。
64
66
  */
65
67
  private drawText;
66
68
  /**
@@ -13,8 +13,18 @@ declare class TextViewer implements CellViewer<TextViewerData> {
13
13
  * Draw text content in the cell
14
14
  */
15
15
  draw(context: ViewerRenderContext, data: TextViewerData): void;
16
+ /**
17
+ * 富文本片段绘制:解析 HTML → runs → 在 ctx 上单行绘制(含截断)
18
+ * 与 painter.drawCellText 在常规字号 / 单行 / 中线对齐 / 左右对齐方面行为一致。
19
+ * fallback:runs 解析为空时回退到 plainText 单色绘制,保证不丢内容。
20
+ */
21
+ private drawRichText;
16
22
  /**
17
23
  * Get the display text from data
24
+ *
25
+ * 返回值新增 richHtml 字段:当原始输入为富文本 HTML 时,把原始 HTML 一并带回,
26
+ * 供 draw() 走片段渲染路径使用。strip 后的纯文本仍然作为 text 返回,
27
+ * 用于 asTag / 多标签 / 兜底单色路径,保持原行为零回归。
18
28
  */
19
29
  private getDisplayText;
20
30
  /**
@@ -7,6 +7,7 @@ export { default as ViewerRegistry, getViewerRegistry } from './ViewerRegistry';
7
7
  export { default as TextViewer } from './TextViewer';
8
8
  export { default as DropdownViewer } from './DropdownViewer';
9
9
  export { default as ImageViewer } from './ImageViewer';
10
+ export { default as PreImageViewer } from './PreImageViewer';
10
11
  export { default as PersonViewer } from './PersonViewer';
11
12
  export { default as ProgressViewer } from './ProgressViewer';
12
13
  export { default as DatetimeViewer } from './DatetimeViewer';
@@ -46,6 +47,7 @@ export { default as DeliveryExpectationsViewer } from './DeliveryExpectationsVie
46
47
  import TextViewer from './TextViewer';
47
48
  import DropdownViewer from './DropdownViewer';
48
49
  import ImageViewer from './ImageViewer';
50
+ import PreImageViewer from './PreImageViewer';
49
51
  import PersonViewer from './PersonViewer';
50
52
  import ProgressViewer from './ProgressViewer';
51
53
  import DatetimeViewer from './DatetimeViewer';
@@ -95,6 +97,7 @@ export declare const defaultViewers: {
95
97
  number: typeof TextViewer;
96
98
  select: typeof DropdownViewer;
97
99
  image: typeof ImageViewer;
100
+ preImage: typeof PreImageViewer;
98
101
  person: typeof PersonViewer;
99
102
  progress: typeof ProgressViewer;
100
103
  datetime: typeof DatetimeViewer;
@@ -0,0 +1,70 @@
1
+ /**
2
+ * richTextRuns - 富文本片段(run)解析与 Canvas 渲染工具
3
+ *
4
+ * 设计目标:
5
+ * - 把一段富文本 HTML(来源于 TinyMCE / 简单粘贴 HTML)解析成一组带样式的"文字片段"(run),
6
+ * 再按片段在 Canvas 上单行绘制,从而保留颜色 / 加粗 / 斜体 / 下划线 / 删除线等内联样式。
7
+ * - 不依赖 DOM(不会调用 document.createElement),完全用正则做结构化解析,
8
+ * 既能在 SSR / Worker 环境下使用,也避免引入 DOM 解析开销。
9
+ * - 与现有 strip-tag 路径行为保持一致:&nbsp; / &amp; 等实体会被解码、<br> 折叠为空格、
10
+ * <img> 显示为 [图片]、<video> 显示为 [视频]、空白合并。
11
+ *
12
+ * 不在本模块职责内:
13
+ * - 多行换行(保持单行 + 末尾省略号,与 release 现状一致)
14
+ * - HTML 安全清洗(业务侧已用 DOMPurify 等保证 HTML 来源可信)
15
+ * - 字号 / 字体族切换(只读取 inline color / bold / italic / underline / strike,size/face 暂不渲染,避免列高跳变)
16
+ */
17
+ /**
18
+ * 单个富文本片段
19
+ */
20
+ export interface RichTextRun {
21
+ /** 片段纯文本(已解码 HTML 实体) */
22
+ text: string;
23
+ /** 是否加粗 */
24
+ bold: boolean;
25
+ /** 是否斜体 */
26
+ italic: boolean;
27
+ /** 是否下划线 */
28
+ underline: boolean;
29
+ /** 是否删除线 */
30
+ strike: boolean;
31
+ /** 文字颜色(CSS color),若为 undefined 表示沿用调用方默认色 */
32
+ color?: string;
33
+ }
34
+ /**
35
+ * 判断给定字符串是否为"富文本 HTML"(含结构性标签)。
36
+ * 与 TextViewer.isRichTextContent / customStyle.isRichTextContent 保持同义。
37
+ */
38
+ export declare function isRichTextHtml(value: unknown): value is string;
39
+ /**
40
+ * 把一段富文本 HTML 解析为带样式的片段数组。
41
+ *
42
+ * 解析策略:
43
+ * - 用正则把 HTML 切成 token 序列(开标签 / 闭标签 / 文本),
44
+ * 维护一个样式栈,遇到样式相关的标签就压栈、闭合时出栈。
45
+ * - 文本 token 直接结合栈顶样式产出 run;连续相同样式的 run 不做合并(绘制时按顺序叠加即可)。
46
+ * - 自闭合 / 替换型标签:<br> → 单空格 run;<img> → "[图片]" run;<video> → "[视频]" run。
47
+ *
48
+ * 与 strip 路径的等价性:把所有 run.text 顺序拼起来 + 折叠空白,应得到与 extractPlainText 相同的纯文本。
49
+ */
50
+ export declare function parseHtmlToRuns(html: string): RichTextRun[];
51
+ /**
52
+ * 在 Canvas 上按片段单行绘制富文本 runs,超出 maxWidth 时末尾追加省略号。
53
+ *
54
+ * 调用约定:
55
+ * - 调用前需由外层 ctx.save / restore 包围;
56
+ * - 外层应已设置 textBaseline、整体 fillStyle 默认色(用于无 color 的 run);
57
+ * - 本函数会按 run 维度反复设置 ctx.font / ctx.fillStyle,因此调用方对这两项的预设会被覆盖;
58
+ * - 不修改 textAlign,绘制采用 left 对齐语义(startX 即第一片段左边界)。
59
+ *
60
+ * @param ctx Canvas 2D 上下文
61
+ * @param runs 已解析的片段
62
+ * @param startX 起始 X(文本左边界)
63
+ * @param baselineY 文本基线 Y(依赖外层 baseline 设置)
64
+ * @param maxWidth 文本可绘制最大宽度(超出截断 + …)
65
+ * @param defaultColor 当 run 未指定 color 时使用的默认色
66
+ * @param fontSize 字号(默认 VIEWER_FONT_SIZE)
67
+ * @param fontFamily 字体族(默认 FONT_FAMILY_SYSTEM)
68
+ * @returns 实际绘制的总宽度(含省略号)
69
+ */
70
+ export declare function drawRichTextRuns(ctx: CanvasRenderingContext2D, runs: RichTextRun[], startX: number, baselineY: number, maxWidth: number, defaultColor: string, fontSize?: number, fontFamily?: string): number;
@@ -303,8 +303,12 @@ export interface ImageViewerData extends CellViewerData {
303
303
  animated?: boolean;
304
304
  /** 点击图片回调(与 DOM multiImageViewer 的 onClickImage 签名一致) */
305
305
  onClickImage?: (imgUrls: string[], initIndex: number, assetIds: (number | string | undefined)[], data: any) => void;
306
- /** 鼠标移入图片回调(用于显示大图预览) */
307
- onImgMouseIn?: (url: string, virtualAnchor: any) => void;
306
+ /**
307
+ * 鼠标移入图片回调(用于显示大图预览)
308
+ * 第三个参数 data 透传当前 cell 的完整 ViewerData,便于业务侧根据 viewer 类型/行上下文做分支
309
+ * (如 preImage 列触发反馈面板 popper 而非简版预览,需要 _rowId / _colKey 走 findRow 拼 fullData)
310
+ */
311
+ onImgMouseIn?: (url: string, virtualAnchor: any, data?: any) => void;
308
312
  /** 鼠标移出图片回调(用于隐藏大图预览) */
309
313
  onImgMouseOut?: () => void;
310
314
  /**
@@ -323,6 +327,23 @@ export interface ImageViewerData extends CellViewerData {
323
327
  progress?: number;
324
328
  }>;
325
329
  }
330
+ /**
331
+ * 文件预览图 viewer 数据
332
+ *
333
+ * 与 ImageViewerData 的差异(与 DOM `preImageViewer.ts` 行为对齐):
334
+ * 1. 接收单值 string URL(不像 ImageViewer 接收 string[])
335
+ * 2. 多接收 `fileFormat` 字段:当 fileFormat 不属于图片格式时,
336
+ * PreImageViewer 会显示 fileFormat 对应的文件类型图标(PDF / Word / Excel / Sketch ...),
337
+ * 而不是缩略图
338
+ *
339
+ * 其余字段语义与 ImageViewerData 一致(hover / 双击回调签名兼容,可直接复用 imageCallbacks)。
340
+ */
341
+ export interface PreImageViewerData extends Omit<ImageViewerData, 'value'> {
342
+ /** 缩略图 URL(单值;空字符串/null 时显示占位符 '-') */
343
+ value: string | null;
344
+ /** 文件后缀名(如 'pdf' / 'docx' / 'png'),用于决定显示缩略图还是文件类型图标 */
345
+ fileFormat?: string;
346
+ }
326
347
  /**
327
348
  * Person/User viewer data
328
349
  */
@@ -977,6 +998,7 @@ export interface ViewerTypeMap {
977
998
  text: TextViewerData;
978
999
  select: DropdownViewerData;
979
1000
  image: ImageViewerData;
1001
+ preImage: PreImageViewerData;
980
1002
  person: PersonViewerData;
981
1003
  progress: ProgressViewerData;
982
1004
  datetime: DatetimeViewerData;
@@ -10,13 +10,14 @@ 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, 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';
13
+ export type { CellBounds, ViewerRenderContext, ViewerDragState, CellViewer, CellViewerData, ViewerOption, ViewerStyle, TextViewerData, DropdownViewerData, ImageViewerData, PreImageViewerData, 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';
17
17
  export { default as TextViewer } from './core/viewers/TextViewer';
18
18
  export { default as DropdownViewer } from './core/viewers/DropdownViewer';
19
19
  export { default as ImageViewer } from './core/viewers/ImageViewer';
20
+ export { default as PreImageViewer } from './core/viewers/PreImageViewer';
20
21
  export { default as PersonViewer } from './core/viewers/PersonViewer';
21
22
  export { default as ProgressViewer } from './core/viewers/ProgressViewer';
22
23
  export { default as DatetimeViewer } from './core/viewers/DatetimeViewer';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arthub-table",
3
- "version": "0.2.31",
3
+ "version": "0.2.32-next.1",
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",