rj-grid 0.1.0

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 (45) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +92 -0
  3. package/dist/rj-grid.js +14074 -0
  4. package/dist/style.css +2050 -0
  5. package/dist/types/index.d.ts +13 -0
  6. package/dist/types/src/RjAdvGroup.vue.d.ts +32 -0
  7. package/dist/types/src/RjAdvancedFilterDialog.vue.d.ts +38 -0
  8. package/dist/types/src/RjCell.vue.d.ts +82 -0
  9. package/dist/types/src/RjChartDialog.vue.d.ts +22 -0
  10. package/dist/types/src/RjColumnMenu.vue.d.ts +109 -0
  11. package/dist/types/src/RjConfirmDialog.vue.d.ts +23 -0
  12. package/dist/types/src/RjContextMenu.vue.d.ts +26 -0
  13. package/dist/types/src/RjEditor.vue.d.ts +28 -0
  14. package/dist/types/src/RjFilterMenu.vue.d.ts +58 -0
  15. package/dist/types/src/RjGrid.vue.d.ts +1046 -0
  16. package/dist/types/src/RjHeader.vue.d.ts +80 -0
  17. package/dist/types/src/RjImgList.vue.d.ts +29 -0
  18. package/dist/types/src/RjPager.vue.d.ts +41 -0
  19. package/dist/types/src/RjQueryBar.vue.d.ts +47 -0
  20. package/dist/types/src/RjRowFormDialog.vue.d.ts +50 -0
  21. package/dist/types/src/RjSlotRender.d.ts +56 -0
  22. package/dist/types/src/RjSparkline.vue.d.ts +43 -0
  23. package/dist/types/src/RjToolPanel.vue.d.ts +103 -0
  24. package/dist/types/src/RjViewManager.vue.d.ts +28 -0
  25. package/dist/types/src/editHistory.d.ts +27 -0
  26. package/dist/types/src/export.d.ts +24 -0
  27. package/dist/types/src/expression.d.ts +19 -0
  28. package/dist/types/src/filtering.d.ts +29 -0
  29. package/dist/types/src/formula.d.ts +88 -0
  30. package/dist/types/src/icons.d.ts +35 -0
  31. package/dist/types/src/locale.d.ts +21 -0
  32. package/dist/types/src/nlq.d.ts +51 -0
  33. package/dist/types/src/print.d.ts +37 -0
  34. package/dist/types/src/query.d.ts +28 -0
  35. package/dist/types/src/rowForm.d.ts +41 -0
  36. package/dist/types/src/serverGroups.d.ts +52 -0
  37. package/dist/types/src/ssrm.d.ts +102 -0
  38. package/dist/types/src/theme.d.ts +33 -0
  39. package/dist/types/src/types.d.ts +624 -0
  40. package/dist/types/src/useColumnState.d.ts +70 -0
  41. package/dist/types/src/useInteraction.d.ts +150 -0
  42. package/dist/types/src/useQueryViews.d.ts +16 -0
  43. package/dist/types/src/useRowModel.d.ts +225 -0
  44. package/dist/types/src/utils.d.ts +130 -0
  45. package/package.json +90 -0
@@ -0,0 +1,624 @@
1
+ import type { ComponentPublicInstance, VNode } from 'vue';
2
+ import type { RjThemeParams } from './theme';
3
+ import type { RjMessages } from './locale';
4
+ import type { RjNlqResult } from './nlq';
5
+ /** 通用行数据 */
6
+ export type RjRowData = Record<string, any>;
7
+ /** 排序方向 */
8
+ export type RjSortDir = 'asc' | 'desc' | null;
9
+ /** 冻结方向 */
10
+ export type RjFixed = 'left' | 'right' | false | undefined;
11
+ /** 聚合函数 */
12
+ export type RjAggFunc = 'sum' | 'avg' | 'min' | 'max' | 'count' | 'first' | 'last';
13
+ export type RjAggCustom = (rows: RjRowData[]) => any;
14
+ export type RjAgg = RjAggFunc | RjAggCustom;
15
+ /** 筛选类型 */
16
+ export type RjFilterType = 'text' | 'number' | 'date' | 'select';
17
+ /** 单元格筛选条件 */
18
+ export interface RjFilterCondition {
19
+ op: string;
20
+ value1?: any;
21
+ value2?: any;
22
+ }
23
+ /** 列筛选模型 */
24
+ export interface RjFilterModel {
25
+ type: RjFilterType;
26
+ operator: 'and' | 'or';
27
+ conditions: RjFilterCondition[];
28
+ }
29
+ /** 查询字段类型(由列定义推导,决定可用运算符与输入控件) */
30
+ export type RjQueryFieldKind = 'text' | 'number' | 'date' | 'select';
31
+ /** 查询运算符 */
32
+ export type RjQueryOperator = 'contains' | 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte' | 'between' | 'in';
33
+ /** 单个查询条件:字段 + 运算符 + 值(between 用 value1/value2) */
34
+ export interface RjQueryCondition {
35
+ field: string;
36
+ operator: RjQueryOperator;
37
+ value?: any;
38
+ value1?: any;
39
+ value2?: any;
40
+ /** 展示用文本(值可能是 id 等,存一份便于视图卡片直显) */
41
+ valueText?: string;
42
+ }
43
+ /** 查询字段候选(可显式传入 queryFields 覆盖,否则由列定义推导) */
44
+ export interface RjQueryFieldDef {
45
+ field: string;
46
+ title?: string;
47
+ kind?: RjQueryFieldKind;
48
+ /** select 型的候选项 */
49
+ options?: RjEditorOption[];
50
+ }
51
+ /** 已保存的自定义视图快照 */
52
+ export interface RjSavedView {
53
+ id: string;
54
+ name: string;
55
+ /** 该视图挂载了哪些查询字段 */
56
+ queryFields: string[];
57
+ /** 各字段填入的条件 */
58
+ conditions: RjQueryCondition[];
59
+ /** 列布局(顺序 + 显隐,取自列状态) */
60
+ columns?: RjColStateItem[];
61
+ /** 排序与行分组 */
62
+ gridState?: {
63
+ sort?: RjSortState[];
64
+ rowGroup?: string[];
65
+ };
66
+ /** 内置视图(只读) */
67
+ builtin?: boolean;
68
+ createTime?: number;
69
+ }
70
+ /** 查询栏操作按钮点击上下文:选中行 + 命令式 api + 内置行编辑/新增弹窗入口 */
71
+ export interface RjQueryActionCtx {
72
+ /** 当前选中行(多选语义,未选中为空数组) */
73
+ rows: RjRowData[];
74
+ /** 网格命令式 API(applyTransaction / getSelectedRows 等) */
75
+ api: any;
76
+ /** 打开内置行编辑弹窗(缺省用当前选中行) */
77
+ openRowForm: (rows?: RjRowData[]) => void;
78
+ /** 打开内置新增弹窗:空白表单(可用 preset 预置默认值),确认后组装新行并插入表格 */
79
+ openRowFormAdd: (preset?: RjRowData) => void;
80
+ }
81
+ /** 查询栏「重置」旁的自定义操作按钮(声明式;另有 #query-actions 插槽覆盖轨) */
82
+ export interface RjQueryAction {
83
+ name: string;
84
+ /** 前缀图标字形(可选,纯文本按钮直接省略) */
85
+ icon?: string;
86
+ /** 危险操作样式(删除类),红色描边 */
87
+ danger?: boolean;
88
+ /** 禁用态:布尔或按选中行动态求值(未选中时禁用交给宿主判定) */
89
+ disabled?: boolean | ((rows: RjRowData[]) => boolean);
90
+ /** 有值则先弹内置确认框,确认后才执行 onClick;函数形式可按选中行生成文案 */
91
+ confirm?: string | ((rows: RjRowData[]) => string);
92
+ onClick: (ctx: RjQueryActionCtx) => void | Promise<void>;
93
+ }
94
+ /** 内置行编辑弹窗配置(rowForm=false 关闭能力,true/缺省用默认规则) */
95
+ export interface RjRowFormConfig {
96
+ title?: string;
97
+ /** 弹窗宽度(px),默认 560 */
98
+ width?: number;
99
+ /** 哪些列进入表单;缺省:有 field、非引擎内部列且声明了 editor/editable */
100
+ columns?: (col: RjColumn) => boolean;
101
+ /** 新增弹窗标题(缺省走词条「新增」;与编辑标题分开,一个 rowForm 配置同时管两个弹窗) */
102
+ addTitle?: string;
103
+ /** 哪些列进入「新增」表单;缺省沿用 columns 钩子或默认规则(宿主常需放行编码/主键列) */
104
+ addColumns?: (col: RjColumn) => boolean;
105
+ }
106
+ /** 编辑器类型 */
107
+ export type RjEditorType = 'input' | 'number' | 'date' | 'select' | 'richSelect' | 'largeText' | 'checkbox' | 'custom';
108
+ export interface RjEditorOption {
109
+ label: string;
110
+ value: any;
111
+ }
112
+ /** 编辑器配置 */
113
+ export interface RjEditorConfig {
114
+ type?: RjEditorType;
115
+ options?: RjEditorOption[] | ((row: RjRowData) => RjEditorOption[]);
116
+ props?: Record<string, any>;
117
+ /** type=custom 时自定义编辑器组件 */
118
+ component?: any;
119
+ /** 提交前校验,返回错误信息则阻止提交 */
120
+ validator?: (newValue: any, row: RjRowData, column: RjColumn) => string | null | undefined | Promise<string | null | undefined>;
121
+ /** 是否即时提交(值改变即保存),默认 false 失焦/回车提交 */
122
+ alwaysUpdate?: boolean;
123
+ /** 下拉选择后是否立即结束编辑 */
124
+ fullRowSelect?: boolean;
125
+ }
126
+ /** 单元格渲染参数(cell-<field> 插槽 / cellRenderer 函数入参) */
127
+ export interface RjCellParams {
128
+ value: any;
129
+ row: RjRowData;
130
+ rowIndex: number;
131
+ column: RjColumn;
132
+ colIndex: number;
133
+ highlighted?: boolean;
134
+ }
135
+ /** 迷你图配置 */
136
+ export interface RjSparklineConfig {
137
+ style: 'bar' | 'line' | 'spider';
138
+ color?: string;
139
+ /** 数据取值字段(默认取本列值,约定为 number[]) */
140
+ valueField?: string;
141
+ }
142
+ /** 图片单元格配置(列 type: 'image' 时生效) */
143
+ export interface RjImageConfig {
144
+ /** 解析图片地址(默认取单元格值;值可为 url 字符串或以逗号分隔的多个 url) */
145
+ src?: (params: RjCellParams) => string | string[] | null | undefined;
146
+ /** 缩略图边长(px),默认 24;被 width/height 覆盖 */
147
+ size?: number;
148
+ /** 显式宽/高(px) */
149
+ width?: number;
150
+ height?: number;
151
+ /** 外形:square=直角 / rounded=圆角(默认) / circle=圆形(头像) */
152
+ shape?: 'square' | 'rounded' | 'circle';
153
+ /** 填充方式,默认 cover */
154
+ fit?: 'cover' | 'contain' | 'fill';
155
+ /** 一个单元格最多显示几张图(值为数组/逗号串时生效),默认 1 */
156
+ max?: number;
157
+ /** 懒加载:仅解码视口附近的图(虚拟滚动下大幅降低开销),默认 true */
158
+ lazy?: boolean;
159
+ /** 点击放大预览,默认 true */
160
+ preview?: boolean;
161
+ /** 加载失败或无值时的占位文本(默认回落为单元格文本) */
162
+ fallback?: string;
163
+ /** 无障碍替代文本(默认取列标题) */
164
+ alt?: string;
165
+ }
166
+ /** 列定义(对标 AG Grid ColDef) */
167
+ export interface RjColumn<T = RjRowData> {
168
+ /** 字段名,支持 a.b.c 路径;无 field 时可配 valueGetter */
169
+ field?: string;
170
+ /** 唯一标识,默认取 field */
171
+ colId?: string;
172
+ title?: string;
173
+ /** 固定宽度 */
174
+ width?: number;
175
+ minWidth?: number;
176
+ maxWidth?: number;
177
+ /** 剩余空间弹性分配 */
178
+ flex?: number;
179
+ fixed?: RjFixed;
180
+ hidden?: boolean;
181
+ visible?: boolean;
182
+ /** 子列(多级表头) */
183
+ children?: RjColumn<T>[];
184
+ sortable?: boolean;
185
+ initialSort?: RjSortDir;
186
+ comparator?: (a: any, b: any, rowA: T, rowB: T) => number;
187
+ filter?: boolean | RjFilterType;
188
+ filterValueGetter?: (row: T) => any;
189
+ /** 筛选值显示转换(select 面板用) */
190
+ filterValueMap?: Record<string, string>;
191
+ valueGetter?: ((row: T) => any) | string;
192
+ formatter?: ((params: RjCellParams) => string | number) | string;
193
+ /** 编辑提交前解析输入(字符串→目标类型,对标 AG Grid valueParser) */
194
+ valueParser?: (params: {
195
+ newValue: any;
196
+ oldValue: any;
197
+ row: T;
198
+ column: RjColumn;
199
+ }) => any;
200
+ /** 预设类型,控制对齐与格式化 */
201
+ type?: 'text' | 'num' | 'money' | 'percent' | 'date' | 'datetime' | 'boolean' | 'link' | 'image';
202
+ /** 图片单元格配置(type: 'image' 时生效) */
203
+ image?: RjImageConfig;
204
+ align?: 'left' | 'center' | 'right';
205
+ headerAlign?: 'left' | 'center' | 'right';
206
+ /** 列级公式:对该视图每一行求值并写入本列 field(如 '=qty*price'、'=SUM(B:B)') */
207
+ formula?: string;
208
+ /** 允许在编辑时把输入的 '=...' 作为公式存入该单元格(覆盖列级公式) */
209
+ allowFormula?: boolean;
210
+ cellClass?: string | ((params: RjCellParams) => string);
211
+ headerClass?: string;
212
+ /** 列头 tooltip:默认取列标题(窄列被截断时可看全名),传空串可关闭 */
213
+ headerTooltip?: string;
214
+ /**
215
+ * 显式指定为合计行的标签列(显示「总计」)。
216
+ * 不指定时引擎自动选:无聚合值、非图片/迷你图、且未被自定义插槽接管的列(左冻结优先)。
217
+ * 与 `#cell-xxx` 插槽共用时,插槽需自行兜底 `params.value`,否则组件算出的标签会被吞。
218
+ */
219
+ summaryLabel?: boolean;
220
+ cellStyle?: Record<string, string> | ((params: RjCellParams) => Record<string, string>);
221
+ /** 渲染函数(等价于 cell-<field> 插槽,优先级低于插槽) */
222
+ cellRenderer?: (params: RjCellParams) => VNode | VNode[] | string | number;
223
+ headerComponent?: any;
224
+ editable?: boolean | ((row: T) => boolean);
225
+ editor?: RjEditorConfig | RjEditorType;
226
+ /** 编辑值新旧合并钩子 */
227
+ onCellValueChanged?: (params: {
228
+ newValue: any;
229
+ oldValue: any;
230
+ row: T;
231
+ column: RjColumn;
232
+ }) => void;
233
+ colSpan?: (row: T) => number;
234
+ rowSpan?: (row: T) => number;
235
+ /** 分组与合计行中该列的聚合方式 */
236
+ aggFunc?: RjAgg;
237
+ /** 允许拖入分组面板 */
238
+ rowGroup?: boolean;
239
+ /** 允许作为透视列 */
240
+ allowPivot?: boolean;
241
+ /** 初始参与行分组 */
242
+ initialRowGroup?: boolean;
243
+ /** 初始作为透视列 */
244
+ initialPivot?: boolean;
245
+ /** 迷你图 */
246
+ sparkline?: RjSparklineConfig;
247
+ /** 行拖拽列(该列单元格显示拖拽手柄) */
248
+ rowDrag?: boolean;
249
+ /** 复选框列 */
250
+ checkbox?: boolean;
251
+ /** 抑制排序(如操作列) */
252
+ suppressSort?: boolean;
253
+ /** 抑制列头右侧的列菜单图标(如复选/拖拽等窄控制列,避免与内容重叠并保证与表体对齐) */
254
+ suppressMenu?: boolean;
255
+ /** 抑制导出 */
256
+ suppressExport?: boolean;
257
+ tooltip?: string | ((params: RjCellParams) => string);
258
+ /** 单元格点击是否阻止事件冒泡 */
259
+ wrapText?: boolean;
260
+ }
261
+ /** 排序状态 */
262
+ export interface RjSortState {
263
+ field: string;
264
+ dir: Exclude<RjSortDir, null>;
265
+ }
266
+ /** 列筛选持久化项 */
267
+ export interface RjColumnFilterState {
268
+ field: string;
269
+ model: RjFilterModel;
270
+ }
271
+ /** 列状态持久化项 */
272
+ export interface RjColStateItem {
273
+ colId: string;
274
+ width?: number;
275
+ hide?: boolean;
276
+ pinned?: 'left' | 'right' | null;
277
+ order?: number;
278
+ }
279
+ /** 网格完整状态(用于持久化 / getState / setState) */
280
+ export interface RjGridState {
281
+ columns?: RjColStateItem[];
282
+ sort?: RjSortState[];
283
+ filters?: RjColumnFilterState[];
284
+ quickFilter?: string;
285
+ /** 浮动筛选行 colId→文本 */
286
+ floatFilters?: Record<string, string>;
287
+ /** 高级过滤表达式树 */
288
+ advancedFilter?: {
289
+ operator: 'and' | 'or';
290
+ items: any[];
291
+ } | null;
292
+ rowGroup?: string[];
293
+ pivot?: {
294
+ cols: string[];
295
+ values: string[];
296
+ active: boolean;
297
+ };
298
+ /** 查询条件栏快照(queryable 模式下随状态一起持久化) */
299
+ queryConditions?: RjQueryCondition[];
300
+ }
301
+ /** 事件参数 */
302
+ export interface RjCellEventParams extends RjCellParams {
303
+ event: MouseEvent | KeyboardEvent;
304
+ }
305
+ export interface RjSelectionEventParams {
306
+ rows: RjRowData[];
307
+ keys: (string | number)[];
308
+ }
309
+ /** 服务端加载参数 */
310
+ export interface RjLoadServerParams {
311
+ start: number;
312
+ end: number;
313
+ page: number;
314
+ pageSize: number;
315
+ sort: RjSortState[];
316
+ filters: RjColumnFilterState[];
317
+ quickFilterText: string;
318
+ /** 浮动筛选行下发项 */
319
+ floatFilters?: {
320
+ colId: string;
321
+ value: string;
322
+ }[];
323
+ /** 行分组下推:字段及其聚合方式(服务端可据此返回已分组/聚合的行) */
324
+ rowGroup?: {
325
+ field: string;
326
+ aggFunc?: string;
327
+ }[];
328
+ /** 高级过滤:跨列 AND/OR 表达式树(服务端模式需后端应用;结构见 filtering.AdvFilterGroup) */
329
+ advancedFilter?: {
330
+ operator: 'and' | 'or';
331
+ items: any[];
332
+ } | null;
333
+ /** 查询条件栏:queryable 模式下生效(已填值)的条件,服务端模式需后端应用 */
334
+ queryConditions?: RjQueryCondition[];
335
+ signal?: AbortSignal;
336
+ /** SSRM:请求类型 select=普通行块 group=分组子块 */
337
+ type?: 'select' | 'group';
338
+ /** SSRM:分组展开时所属父组信息(type=group 时有值) */
339
+ group?: {
340
+ rowGroupKey: string;
341
+ level: number;
342
+ path: any[];
343
+ };
344
+ }
345
+ export interface RjLoadServerResult {
346
+ rows: RjRowData[];
347
+ pageSize?: number;
348
+ lastRow?: number;
349
+ success: boolean;
350
+ }
351
+ /** 数据模式 */
352
+ export type RjDataMode = 'client' | 'infinite' | 'pagination' | 'serverSide';
353
+ /** 事务(实时更新) */
354
+ export interface RjTransaction {
355
+ add?: RjRowData[];
356
+ addIndex?: number;
357
+ update?: RjRowData[];
358
+ remove?: RjRowData[];
359
+ upsert?: RjRowData[];
360
+ }
361
+ /**
362
+ * 导出/打印的数据范围(五档,菜单只列前四档可用项):
363
+ * - auto 有选中行就导选中、否则导当前视图(默认)
364
+ * - selected 仅选中行(含 keepSelectionCrossPage 跨页保留的行)
365
+ * - view 当前视图:屏上生效的列 + 过滤/排序/分组后的行(分页/服务端模式即当前已加载部分)
366
+ * - all 源数据全集(不做过滤与排序);分页/服务端模式下仍只有已加载行,要全量请用 server
367
+ * - server 交给宿主的后端导出:组件只把「生效列 + 查询状态 + 分页快照 + 选中 key」透出去
368
+ */
369
+ export type RjExportScope = 'auto' | 'selected' | 'view' | 'all' | 'server';
370
+ /** 落地后的具体范围(不含 auto) */
371
+ export type RjExportScopeResolved = Exclude<RjExportScope, 'auto'>;
372
+ /** 后端导出入参(范围为 server 时回调 props.serverExport) */
373
+ export interface RjServerExportParams {
374
+ /** 目标格式(后端导出不提供 PDF/打印:那是浏览器打印渲染,应由前端范围完成) */
375
+ type: 'csv' | 'excel';
376
+ fileName: string;
377
+ /** 当前生效列(按屏上顺序,已排除复选/拖拽控制列与隐藏列) */
378
+ columns: {
379
+ colId: string;
380
+ field?: string;
381
+ title?: string;
382
+ }[];
383
+ /** 当前视图状态(筛选/排序/分组/快速搜索),宿主据此还原查询条件 */
384
+ state: RjGridState;
385
+ /** 分页快照;客户端模式下 pageNo=1且 total=已加载行数 */
386
+ paging: {
387
+ pageNo: number;
388
+ pageSize: number;
389
+ total: number;
390
+ };
391
+ /** 选中行的 rowKey 列表(宿主可按 key 精确导出选中) */
392
+ selectedKeys: (string | number)[];
393
+ }
394
+ /** 导出参数 */
395
+ export interface RjExportParams {
396
+ fileName?: string;
397
+ /** 导出范围;不传则取 props.exportRange(默认 auto) */
398
+ scope?: RjExportScope;
399
+ /** 旧字段:等价 scope='selected'(仅在未传 scope 时生效) */
400
+ onlySelected?: boolean;
401
+ columnKeys?: string[];
402
+ /** 旧字段:false 等价 scope='all'(仅在未传 scope 时生效) */
403
+ currentView?: boolean;
404
+ }
405
+ /** 打印 / PDF 选项(零依赖:隐藏 iframe + 浏览器打印,可另存为 PDF) */
406
+ export interface RjPrintOptions {
407
+ /** 文档大标题(表格上方) */
408
+ title?: string;
409
+ /** 页眉副标题(标题下、表格上的一行说明) */
410
+ header?: string;
411
+ /** 页脚文本(表格下方) */
412
+ footer?: string;
413
+ /** 纸张尺寸;'auto' 不写死 @page size */
414
+ pageSize?: 'A4' | 'A5' | 'Letter' | 'Legal' | 'auto';
415
+ /** 方向,默认 landscape(表格多为横向更容得下) */
416
+ orientation?: 'portrait' | 'landscape';
417
+ /** 页边距(mm),默认 10 */
418
+ margins?: number;
419
+ /** 表格宽度自适应页面(table-layout:auto),默认按列宽比例固定布局 */
420
+ scaleToFit?: boolean;
421
+ /** 是否显示网格线,默认 true */
422
+ showGridLines?: boolean;
423
+ /** 斑马纹,默认 true */
424
+ zebra?: boolean;
425
+ /** 深色表头(白字),默认 true */
426
+ headerDark?: boolean;
427
+ /** 页码页脚(@page 底部居中,部分浏览器支持),默认 true */
428
+ pageNumbers?: boolean;
429
+ /** 浏览器标签页/文档标题;缺省回落 title,两者皆空时用中性文本 */
430
+ docTitle?: string;
431
+ /** 页码文案模板({p}=当前页 {t}=总页数),由调用端按语言注入 */
432
+ pageNumberText?: string;
433
+ /** 打印文档 <html lang>,默认 zh */
434
+ docLang?: string;
435
+ }
436
+ /** api.print / exportData({type:'pdf'}) 入参:导出范围 + 打印选项 */
437
+ export interface RjPrintParams extends RjExportParams, RjPrintOptions {
438
+ }
439
+ /** 上下文菜单项 */
440
+ export interface RjMenuItem {
441
+ name?: string;
442
+ icon?: string;
443
+ action?: () => void;
444
+ children?: RjMenuItem[];
445
+ isSeparator?: boolean;
446
+ disabled?: () => boolean;
447
+ }
448
+ export interface RjMenuContext {
449
+ event: MouseEvent;
450
+ column?: RjColumn | null;
451
+ row?: RjRowData | null;
452
+ params?: RjCellParams | null;
453
+ api: RjGridApi;
454
+ }
455
+ /** 合计行配置 */
456
+ export interface RjPinnedRow {
457
+ [field: string]: any;
458
+ }
459
+ /** 查找匹配项 */
460
+ export interface RjFindMatch {
461
+ rowIndex: number;
462
+ colId: string;
463
+ start: number;
464
+ end: number;
465
+ }
466
+ /** 命令式 API(expose) */
467
+ export interface RjGridApi extends ComponentPublicInstance {
468
+ /** 数据操作 */
469
+ getDisplayedRowAtIndex: (index: number) => RjRowData | undefined;
470
+ getDisplayedRowsCount: () => number;
471
+ /** 当前虚拟可见行区间 [start, end)(对标 AG Grid getVirtualRowRanges) */
472
+ getVisibleRange: () => {
473
+ start: number;
474
+ end: number;
475
+ };
476
+ applyTransaction: (tx: RjTransaction) => void;
477
+ applyTransactionAsync: (tx: RjTransaction) => Promise<void>;
478
+ /** SSRM:刷新服务端缓存(purge=true 清空全部块并重载视口) */
479
+ refreshServerSide: (params?: {
480
+ purge?: boolean;
481
+ }) => void;
482
+ /** SSRM:清空块缓存 */
483
+ purgeServerSideCache: () => void;
484
+ setRowData: (rows: RjRowData[]) => void;
485
+ updateRow: (row: RjRowData) => void;
486
+ getCellValue: (rowIndex: number, field: string) => any;
487
+ setCellValue: (rowIndex: number, field: string, value: any) => void;
488
+ /** 选择 */
489
+ getSelectedRows: () => RjRowData[];
490
+ getSelectedKeys: () => (string | number)[];
491
+ /** 内置行编辑弹窗:由列定义自动生成表单,确认后事务回填;缺省作用于当前选中行 */
492
+ openRowForm: (rows?: RjRowData[]) => void;
493
+ /** 内置新增弹窗:空白表单(preset 可预置默认值),确认后 add 事务插入新行并抛 row-form-add */
494
+ openRowFormAdd: (preset?: RjRowData) => void;
495
+ setRowSelection: (row: RjRowData, selected: boolean) => void;
496
+ selectAll: () => void;
497
+ clearSelection: () => void;
498
+ /** 排序/筛选 */
499
+ setSort: (sorts: RjSortState[]) => void;
500
+ setFilterModel: (field: string, model: RjFilterModel | null) => void;
501
+ clearAllFilters: () => void;
502
+ setQuickFilter: (text: string) => void;
503
+ /** 高级过滤:跨列 AND/OR 表达式树 */
504
+ setAdvancedFilter: (model: unknown | null) => void;
505
+ getAdvancedFilter: () => unknown;
506
+ openAdvancedFilter: () => void;
507
+ /** 分组/树/透视 */
508
+ setRowGroup: (fields: string[]) => void;
509
+ /** 设置「取前 N」显示限量(0=不限量),供 NLQ/重置等场景复位 */
510
+ setRowLimit: (n: number) => void;
511
+ expandAll: () => void;
512
+ collapseAll: () => void;
513
+ setPivot: (cols: string[], values: string[]) => void;
514
+ /** 滚动/编辑 */
515
+ scrollTo: (rowIndex: number, colId?: string) => void;
516
+ startEditing: (rowIndex: number, colId: string) => void;
517
+ stopEditing: () => void;
518
+ /** 撤销/重做编辑(对标 AG Grid undoCellEditing/redoCellEditing) */
519
+ undoCellEditing: () => void;
520
+ redoCellEditing: () => void;
521
+ canUndo: () => boolean;
522
+ canRedo: () => boolean;
523
+ /** 脏格(对标 AG Grid dirty cells):编辑未确认变更的标记与查询 */
524
+ isDirty: () => boolean;
525
+ isCellDirty: (rowIndex: number, colId: string) => boolean;
526
+ getDirtyCells: () => {
527
+ row: RjRowData;
528
+ colId: string;
529
+ oldValue: any;
530
+ newValue: any;
531
+ }[];
532
+ getDirtyRows: () => RjRowData[];
533
+ clearDirtyCells: () => void;
534
+ /** 公式引擎(对标 AG Grid Formula) */
535
+ /** 强制重算全部公式单元格(依赖拓扑 + 循环检测) */
536
+ recalculate: (force?: boolean) => void;
537
+ /** 设置某单元格公式(以 = 开头;传空串则清除并恢复列级/原始值) */
538
+ setCellFormula: (rowIndex: number, colId: string, formula: string) => void;
539
+ /** 读取某单元格的公式文本(无则 undefined) */
540
+ getCellFormula: (rowIndex: number, colId: string) => string | undefined;
541
+ /** 当前是否存在任何公式(列级或单元格) */
542
+ hasFormula: () => boolean;
543
+ /** 收集当前循环引用单元格坐标(row/col 为视图 0 基索引) */
544
+ getCircularRefs: () => {
545
+ row: number;
546
+ colId: string;
547
+ }[];
548
+ /** 导出/状态:scope 缺省时按 props.exportRange(默认 auto:有选中导选中) */
549
+ exportData: (params?: RjPrintParams & {
550
+ type?: 'csv' | 'excel' | 'pdf';
551
+ }) => void;
552
+ exportCurrentAsCsv: () => void;
553
+ /** 打印(浏览器打印对话框) */
554
+ print: (params?: RjPrintParams) => void;
555
+ /** 生成打印文档 HTML(不弹窗;供预览/测试/自定义容器) */
556
+ getPrintHtml: (params?: RjPrintParams) => string;
557
+ copySelectedToClipboard: () => void;
558
+ getState: () => RjGridState;
559
+ setState: (state: RjGridState) => void;
560
+ refresh: () => void;
561
+ refreshCells: (opts?: {
562
+ rowKeys?: (string | number)[];
563
+ colIds?: string[];
564
+ }) => void;
565
+ /** 区域选择 */
566
+ getRangeSelection: () => {
567
+ start: {
568
+ r: number;
569
+ c: number;
570
+ };
571
+ end: {
572
+ r: number;
573
+ c: number;
574
+ };
575
+ } | null;
576
+ clearRangeSelection: () => void;
577
+ /** 列便利方法(对标 AG Grid column API):返回全部叶子列(含隐藏列)的坐标 */
578
+ getColumns: () => {
579
+ colId: string;
580
+ field?: string;
581
+ title?: string;
582
+ }[];
583
+ /**
584
+ * 设置列显隐(写入用户列状态层,不改动列定义)。
585
+ * 显隐为三态覆盖:强制隐藏 / 强制显示 / 无覆盖时跟随列定义,
586
+ * 因此 visible=true 可以打开列定义里标了 hidden:true 的列(与 AG Grid setVisible 一致)
587
+ */
588
+ setColumnVisible: (colId: string, visible: boolean) => void;
589
+ /** 读当前生效显隐(已叠加用户覆盖);true=隐藏 */
590
+ isColumnHidden: (colId: string) => boolean;
591
+ /** 设置列冻结:'left' | 'right' | null(null 取消冻结) */
592
+ setColumnPinned: (colId: string, pinned: 'left' | 'right' | null) => void;
593
+ /** 设置列宽(px,内部按列的 minWidth/maxWidth 夹取) */
594
+ setColumnWidth: (colId: string, width: number) => void;
595
+ /** 单列自适应内容宽度 */
596
+ autoSizeColumn: (colId: string) => void;
597
+ /** 全部可见列自适应内容宽度 */
598
+ autoSizeAll: () => void;
599
+ /** 列宽:按视口宽度等比缩放普通区列(对标 sizeColumnsToFit) */
600
+ sizeColumnsToFit: () => void;
601
+ /** 主题引擎(对标 AG Grid Theming):运行时替换预设/明暗/强调色等 */
602
+ setTheme: (params: RjThemeParams) => void;
603
+ /** 读取当前生效的主题参数 */
604
+ getTheme: () => RjThemeParams;
605
+ /** 语言:'zh' | 'en' | 区域标识(内部归一) */
606
+ setLang: (lang: string) => void;
607
+ /** 局部覆盖文案(对标 localeText),按 key 合并、优先级最高 */
608
+ setLocaleText: (patch: RjMessages) => void;
609
+ /** 自然语言查询(AI):仅解析不应用,返回结构化意图 */
610
+ parseQuery: (text: string) => RjNlqResult;
611
+ /** 自然语言查询(AI):解析并应用到网格(筛选/排序/分组/搜索),返回解析结果 */
612
+ applyQuery: (text: string) => RjNlqResult;
613
+ /** 遍历当前视图行(经筛选/排序/分组后的显示行,含组行等引擎生成行) */
614
+ forEachNode: (fn: (data: RjRowData, index: number, drow: unknown) => void) => void;
615
+ /**
616
+ * 动态事件总线(对标 AG Grid api.addEventListener):按名订阅,返回退订函数。
617
+ * 与模板 @emit 的区别是可运行时动态增删;常用列类事件:
618
+ * columnVisible / columnMoved / columnPinned / columnResized / columnEverythingChanged
619
+ */
620
+ addEventListener: (type: string, cb: (event: any) => void) => () => void;
621
+ removeEventListener: (type: string, cb: (event: any) => void) => void;
622
+ /** 向总线主动派发事件(供宿主页面在自己改列后通知已订阅者) */
623
+ dispatchEvent: (type: string, payload?: any) => void;
624
+ }
@@ -0,0 +1,70 @@
1
+ import type { RjColumn, RjColStateItem } from './types';
2
+ export interface RjLeafCol {
3
+ col: RjColumn;
4
+ colId: string;
5
+ /** 当前宽度(px) */
6
+ width: number;
7
+ /** 全宽坐标系下的左偏移(仅 normal 区有意义) */
8
+ x: number;
9
+ fixed: 'left' | 'right' | null;
10
+ /** normal 区内的顺序号(列虚拟滚动二分用) */
11
+ idx: number;
12
+ }
13
+ export interface RjHeaderCell {
14
+ col: RjColumn;
15
+ colId: string;
16
+ colSpan: number;
17
+ rowSpan: number;
18
+ level: number;
19
+ isGroup: boolean;
20
+ }
21
+ export declare function useColumnState(sourceColumns: () => RjColumn[]): {
22
+ setViewportWidth: (w: number) => void;
23
+ setSuppressVirtual: (v: boolean) => void;
24
+ listLeafColumns: () => RjColumn[];
25
+ listLeafUi: () => {
26
+ col: RjColumn;
27
+ colId: string;
28
+ hidden: boolean;
29
+ pinned: 'left' | 'right' | null;
30
+ }[];
31
+ isColumnHidden: (colId: string) => boolean;
32
+ pinOf: (col: RjColumn) => 'left' | 'right' | null;
33
+ computeLayout: () => {
34
+ leftLeaves: RjLeafCol[];
35
+ normalLeaves: {
36
+ idx: number;
37
+ col: RjColumn<import("./types").RjRowData>;
38
+ colId: string;
39
+ /** 当前宽度(px) */
40
+ width: number;
41
+ /** 全宽坐标系下的左偏移(仅 normal 区有意义) */
42
+ x: number;
43
+ fixed: "left" | "right" | null;
44
+ }[];
45
+ rightLeaves: RjLeafCol[];
46
+ totalWidth: number;
47
+ leftWidth: number;
48
+ rightWidth: number;
49
+ /** 普通区起始 x(用于列虚拟滚动坐标换算) */
50
+ normalStartX: number;
51
+ /** 是否启用列虚拟滚动 */
52
+ virtualCols: boolean;
53
+ allCols: RjColumn<import("./types").RjRowData>[];
54
+ };
55
+ computeHeaderRows: () => {
56
+ rows: RjHeaderCell[][];
57
+ depth: number;
58
+ };
59
+ resize: (colId: string, width: number) => void;
60
+ setAutoWidth: (colId: string, width: number) => void;
61
+ hasSizedWidth: (colId: string) => boolean;
62
+ sizeToFit: () => void;
63
+ moveColumn: (dragId: string, targetId: string) => void;
64
+ togglePin: (colId: string, pin: 'left' | 'right' | null) => void;
65
+ toggleHide: (colId: string, hide?: boolean) => void;
66
+ orderedIds: () => string[];
67
+ getColumnState: () => RjColStateItem[];
68
+ applyColumnState: (items?: RjColStateItem[] | null) => void;
69
+ resetColumnState: () => void;
70
+ };