@agile-team/mach-report 2.3.2 → 2.4.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 (39) hide show
  1. package/README.md +40 -5
  2. package/dist/ReportPreview-CL9J9MEE.js +1907 -0
  3. package/dist/ReportPreview-DJvv3h8m.cjs +6 -0
  4. package/dist/grid-geometry-BNIvw52m.cjs +1 -0
  5. package/dist/{grid-geometry-Dw7BlENr.js → grid-geometry-C8hGoe9o.js} +10 -10
  6. package/dist/index.cjs +5 -5
  7. package/dist/index.d.cts +74 -0
  8. package/dist/index.d.ts +74 -0
  9. package/dist/index.js +946 -782
  10. package/dist/number-format-BA_KwrZe.js +55 -0
  11. package/dist/number-format-CZ2T_5kF.cjs +1 -0
  12. package/dist/pdf.cjs +1 -1
  13. package/dist/pdf.d.cts +6 -0
  14. package/dist/pdf.d.ts +6 -0
  15. package/dist/pdf.js +2 -2
  16. package/dist/{plugin-2lqgTX26.cjs → plugin-BkK2mm_p.cjs} +1 -1
  17. package/dist/{plugin-5R00MJQs.js → plugin-DRnvIbdP.js} +1 -1
  18. package/dist/render-plan-CCTL4F9v.cjs +1 -0
  19. package/dist/{render-plan-I9AHvQv7.js → render-plan-CXBWRog4.js} +12 -7
  20. package/dist/style.css +1 -1
  21. package/dist/vue/async.d.cts +598 -1
  22. package/dist/vue/async.d.ts +598 -1
  23. package/dist/vue/index.d.cts +820 -10
  24. package/dist/vue/index.d.ts +820 -10
  25. package/dist/vue-async.cjs +1 -1
  26. package/dist/vue-async.js +3 -3
  27. package/dist/vue.cjs +1 -1
  28. package/dist/vue.js +96 -73
  29. package/dist/xlsx.cjs +24 -24
  30. package/dist/xlsx.d.cts +209 -0
  31. package/dist/xlsx.d.ts +209 -0
  32. package/dist/xlsx.js +9805 -9284
  33. package/package.json +1 -1
  34. package/dist/ReportPreview-B-mwUSk9.cjs +0 -6
  35. package/dist/ReportPreview-DKjr4cwO.js +0 -1688
  36. package/dist/defaults-D4o0NCLo.js +0 -9
  37. package/dist/defaults-DOO1yHwx.cjs +0 -1
  38. package/dist/grid-geometry-bkciiZ4Q.cjs +0 -1
  39. package/dist/render-plan-CfJ3wf1l.cjs +0 -1
@@ -30,6 +30,29 @@ declare type ColumnFormat =
30
30
  | { kind: "percent"; digits?: number }
31
31
  | { kind: "date"; pattern?: string };
32
32
 
33
+ /**
34
+ * 列值格式化(声明式、JSON 可序列化)。
35
+ * 在 paginate 的 cellText 出口统一消费:格式化发生在进 RenderPlan 之前,
36
+ * 三后端(DOM/Canvas/PDF)零改动。
37
+ *
38
+ * 语义约定(v0.9 固化):
39
+ * - number.digits 显式给出 → 精确保留(12.5 + digits:2 → "12.50")
40
+ * - number.thousands 默认 false(千分位显式开启)
41
+ * - date 字符串按"本地时区的日历日"解析(YYYY-MM-DD / YYYY/MM/DD 直取年月日,
42
+ * 不经 Date 字符串构造——后者按 UTC 零点,负时区环境会少一天)
43
+ */
44
+ declare type ColumnFormat_2 = {
45
+ kind: "number";
46
+ thousands?: boolean;
47
+ digits?: number;
48
+ } | {
49
+ kind: "percent";
50
+ digits?: number;
51
+ } | {
52
+ kind: "date";
53
+ pattern?: string;
54
+ };
55
+
33
56
  declare type ComponentKind =
34
57
  | "text"
35
58
  | "image"
@@ -40,6 +63,10 @@ declare type ComponentKind =
40
63
  | "rect"
41
64
  | "ellipse";
42
65
 
66
+ declare type ComponentKind_2 = "text" | "image" | "barcode" | "qrcode" | "chart" | "line" | "rect" | "ellipse";
67
+
68
+ declare type ComponentKind_3 = "text" | "image" | "barcode" | "qrcode" | "chart" | "line" | "rect" | "ellipse";
69
+
43
70
  declare interface ComponentStyle {
44
71
  fontSizePx?: number;
45
72
  fontSize?: number;
@@ -64,8 +91,136 @@ declare interface ComponentStyle {
64
91
  rotateDeg?: number;
65
92
  }
66
93
 
94
+ declare interface ComponentStyle_2 {
95
+ fontSizePx?: number;
96
+ fontSize?: number;
97
+ fontFamily?: string;
98
+ bold?: boolean;
99
+ italic?: boolean;
100
+ underline?: boolean;
101
+ color?: string;
102
+ backgroundColor?: string;
103
+ align?: "left" | "center" | "right" | "justify";
104
+ verticalAlign?: "top" | "middle" | "bottom";
105
+ lineColor?: string;
106
+ borderColor?: string;
107
+ lineWidthPt?: number;
108
+ borderTop?: boolean;
109
+ borderRight?: boolean;
110
+ borderBottom?: boolean;
111
+ borderLeft?: boolean;
112
+ lineHeight?: number;
113
+ letterSpacing?: number;
114
+ opacity?: number;
115
+ rotateDeg?: number;
116
+ }
117
+
118
+ declare interface ComponentStyle_3 {
119
+ fontSizePx?: number;
120
+ fontSize?: number;
121
+ fontFamily?: string;
122
+ bold?: boolean;
123
+ italic?: boolean;
124
+ underline?: boolean;
125
+ color?: string;
126
+ backgroundColor?: string;
127
+ align?: "left" | "center" | "right" | "justify";
128
+ verticalAlign?: "top" | "middle" | "bottom";
129
+ lineColor?: string;
130
+ borderColor?: string;
131
+ lineWidthPt?: number;
132
+ borderTop?: boolean;
133
+ borderRight?: boolean;
134
+ borderBottom?: boolean;
135
+ borderLeft?: boolean;
136
+ lineHeight?: number;
137
+ letterSpacing?: number;
138
+ opacity?: number;
139
+ rotateDeg?: number;
140
+ }
141
+
67
142
  declare type DatasetRows = Record<string, Record<string, unknown>[]>;
68
143
 
144
+ declare interface ExcelImportedSheet {
145
+ name: string;
146
+ /** Original, one-based workbook position. */
147
+ index: number;
148
+ range: string;
149
+ rowCount: number;
150
+ columnCount: number;
151
+ /** Zero-based index into template.pages. */
152
+ pageStart: number;
153
+ pageCount: number;
154
+ }
155
+
156
+ /** Limits apply to the selected rectangular ranges, including their empty cells. */
157
+ declare interface ExcelImportLimits {
158
+ /** Compressed input, default 20 MiB. */
159
+ maxFileBytes?: number;
160
+ /** Declared ZIP uncompressed total, default 64 MiB. */
161
+ maxUncompressedBytes?: number;
162
+ /** Total selected cells across sheets, default 250,000; hard ceiling 1,000,000. */
163
+ maxCells?: number;
164
+ /** Rows per selected sheet, default 100,000; hard ceiling 1,048,576. */
165
+ maxRows?: number;
166
+ /** Columns per selected sheet, default 2,048; hard ceiling 16,384. */
167
+ maxColumns?: number;
168
+ /** Workbook sheets, default 32. */
169
+ maxSheets?: number;
170
+ }
171
+
172
+ /** Limits apply to the selected rectangular ranges, including their empty cells. */
173
+ declare interface ExcelImportLimits_2 {
174
+ /** Compressed input, default 20 MiB. */
175
+ maxFileBytes?: number;
176
+ /** Declared ZIP uncompressed total, default 64 MiB. */
177
+ maxUncompressedBytes?: number;
178
+ /** Total selected cells across sheets, default 250,000; hard ceiling 1,000,000. */
179
+ maxCells?: number;
180
+ /** Rows per selected sheet, default 100,000; hard ceiling 1,048,576. */
181
+ maxRows?: number;
182
+ /** Columns per selected sheet, default 2,048; hard ceiling 16,384. */
183
+ maxColumns?: number;
184
+ /** Workbook sheets, default 32. */
185
+ maxSheets?: number;
186
+ }
187
+
188
+ declare interface ExcelImportOptions {
189
+ /** Sheet names or one-based workbook positions. Default: all visible sheets. */
190
+ sheets?: Array<string | number>;
191
+ /** A1 range for every sheet, or ranges keyed by exact sheet name. */
192
+ range?: string | Record<string, string>;
193
+ /** Wide preserves natural column widths. A3/A4 scale the complete width to paper. */
194
+ layout?: "wide" | "a3" | "a4";
195
+ /** Only applies to A3/A4; default landscape. */
196
+ landscape?: boolean;
197
+ /** Vertical preview segment limit, default 80, maximum 200. Merges remain intact. */
198
+ maxRowsPerPage?: number;
199
+ /** Optional resource limits; hard ceilings prevent unbounded allocations. */
200
+ limits?: ExcelImportLimits;
201
+ }
202
+
203
+ declare interface ExcelImportOptions_2 {
204
+ /** Sheet names or one-based workbook positions. Default: all visible sheets. */
205
+ sheets?: Array<string | number>;
206
+ /** A1 range for every sheet, or ranges keyed by exact sheet name. */
207
+ range?: string | Record<string, string>;
208
+ /** Wide preserves natural column widths. A3/A4 scale the complete width to paper. */
209
+ layout?: "wide" | "a3" | "a4";
210
+ /** Only applies to A3/A4; default landscape. */
211
+ landscape?: boolean;
212
+ /** Vertical preview segment limit, default 80, maximum 200. Merges remain intact. */
213
+ maxRowsPerPage?: number;
214
+ /** Optional resource limits; hard ceilings prevent unbounded allocations. */
215
+ limits?: ExcelImportLimits_2;
216
+ }
217
+
218
+ declare interface ExcelImportResult {
219
+ template: ReportTemplate_2;
220
+ warnings: string[];
221
+ sheets: ExcelImportedSheet[];
222
+ }
223
+
69
224
  declare interface GridCell {
70
225
  text?: string;
71
226
  rawText?: string;
@@ -73,15 +228,62 @@ declare interface GridCell {
73
228
  value?: string | number | boolean | null;
74
229
  /** Excel 数字格式(例如 #,##0.00 / 0.00%),不改变 text。 */
75
230
  numberFormat?: string;
231
+ /** 编辑输入类型;省略时只按原始值推断,数字字符串不会被转换为数值。 */
232
+ valueType?: "text" | "number" | "boolean";
233
+ /** 单元格级编辑控制;预览仍需显式开启 editing。 */
234
+ editable?: boolean;
235
+ /** Excel 公式保留元数据;当前引擎不计算公式,公式格始终只读。 */
236
+ formula?: string;
76
237
  children?: PlanComponent[];
77
238
  colSpan?: number;
78
239
  rowSpan?: number;
79
240
  style?: ComponentStyle;
80
241
  }
81
242
 
243
+ declare interface GridCell_2 {
244
+ text?: string;
245
+ rawText?: string;
246
+ /** 原始值,仅供 Excel raw 模式消费;不参与预览、分页与 PDF 绘制。 */
247
+ value?: string | number | boolean | null;
248
+ /** Excel 数字格式(例如 #,##0.00 / 0.00%),不改变 text。 */
249
+ numberFormat?: string;
250
+ /** 编辑输入类型;省略时只按原始值推断,数字字符串不会被转换为数值。 */
251
+ valueType?: "text" | "number" | "boolean";
252
+ /** 单元格级编辑控制;预览仍需显式开启 editing。 */
253
+ editable?: boolean;
254
+ /** Excel 公式保留元数据;当前引擎不计算公式,公式格始终只读。 */
255
+ formula?: string;
256
+ children?: PlanComponent_2[];
257
+ colSpan?: number;
258
+ rowSpan?: number;
259
+ style?: ComponentStyle_2;
260
+ }
261
+
262
+ declare interface GridCell_3 {
263
+ text?: string;
264
+ rawText?: string;
265
+ /** 原始值,仅供 Excel raw 模式消费;不参与预览、分页与 PDF 绘制。 */
266
+ value?: string | number | boolean | null;
267
+ /** Excel 数字格式(例如 #,##0.00 / 0.00%),不改变 text。 */
268
+ numberFormat?: string;
269
+ /** 编辑输入类型;省略时只按原始值推断,数字字符串不会被转换为数值。 */
270
+ valueType?: "text" | "number" | "boolean";
271
+ /** 单元格级编辑控制;预览仍需显式开启 editing。 */
272
+ editable?: boolean;
273
+ /** Excel 公式保留元数据;当前引擎不计算公式,公式格始终只读。 */
274
+ formula?: string;
275
+ children?: PlanComponent_3[];
276
+ colSpan?: number;
277
+ rowSpan?: number;
278
+ style?: ComponentStyle_3;
279
+ }
280
+
82
281
  /** auto:真实数字/显式数值格式居右,日期与布尔居中,其他内容居左。 */
83
282
  declare type ListAlignment = NonNullable<ComponentStyle["align"]> | "auto";
84
283
 
284
+ /** auto:真实数字/显式数值格式居右,日期与布尔居中,其他内容居左。 */
285
+ declare type ListAlignment_2 = NonNullable<ComponentStyle_3["align"]> | "auto";
286
+
85
287
  declare interface ListColumn {
86
288
  header: string;
87
289
  field: string;
@@ -97,6 +299,31 @@ declare interface ListColumn {
97
299
  format?: ColumnFormat;
98
300
  /** 条件格式规则(声明式,命中合并进单元格样式;如负数红字) */
99
301
  rules?: StyleRule[];
302
+ /** 内容列编辑控制;仍需由预览显式开启 editing,不影响表头/小计只读规则。 */
303
+ editable?: boolean;
304
+ /** 空值列或特殊数据类型可显式声明编辑输入类型。 */
305
+ valueType?: GridCell["valueType"];
306
+ }
307
+
308
+ declare interface ListColumn_2 {
309
+ header: string;
310
+ field: string;
311
+ widthMm: number;
312
+ style?: ComponentStyle_3;
313
+ /** 内容对齐,优先于 style.align;数值字符串不会自动判为数字。 */
314
+ align?: ListAlignment_2;
315
+ /** 独立的表头对齐,不改变内容对齐。 */
316
+ headerAlign?: ComponentStyle_3["align"];
317
+ /** 独立的表头样式,优先于列表级表头样式。 */
318
+ headerStyle?: ComponentStyle_3;
319
+ /** 值格式化(声明式):千分位/小数位、百分比、日期 pattern */
320
+ format?: ColumnFormat_2;
321
+ /** 条件格式规则(声明式,命中合并进单元格样式;如负数红字) */
322
+ rules?: StyleRule_2[];
323
+ /** 内容列编辑控制;仍需由预览显式开启 editing,不影响表头/小计只读规则。 */
324
+ editable?: boolean;
325
+ /** 空值列或特殊数据类型可显式声明编辑输入类型。 */
326
+ valueType?: GridCell_3["valueType"];
100
327
  }
101
328
 
102
329
  declare interface ListComponent {
@@ -129,6 +356,36 @@ declare interface ListComponent {
129
356
  grandTotal?: ListGrandTotal;
130
357
  }
131
358
 
359
+ declare interface ListComponent_2 {
360
+ kind: "list";
361
+ id?: string;
362
+ /** 宽表标记用于连续 Excel;不改变低层列表的列宽和分页算法。 */
363
+ layout?: "page" | "wide";
364
+ /** 逻辑表名称,供 Excel Sheet 命名;不额外生成标题组件。 */
365
+ title?: string;
366
+ leftMm: number;
367
+ topMm: number;
368
+ widthMm: number;
369
+ dataset: string;
370
+ columns: ListColumn_2[];
371
+ fontSizePt?: number;
372
+ headerBold?: boolean;
373
+ rowHeightMm?: number;
374
+ paddingMm?: number;
375
+ headerEveryPage?: boolean;
376
+ headerBackgroundColor?: string;
377
+ /** 内容默认对齐,列配置可覆盖;低层模板缺省仍为 left。 */
378
+ align?: ListAlignment_2;
379
+ /** 表头默认对齐,列配置可覆盖。 */
380
+ headerAlign?: ComponentStyle_3["align"];
381
+ headerStyle?: ComponentStyle_3;
382
+ border?: boolean;
383
+ /** 分组小计(组头/组尾小计/组头防孤行) */
384
+ groupBy?: ListGroupBy_2;
385
+ /** 末尾总合计行(依赖 groupBy.subtotal 或显式 fields) */
386
+ grandTotal?: ListGrandTotal_2;
387
+ }
388
+
132
389
  declare type ListGrandTotal =
133
390
  | boolean
134
391
  | {
@@ -138,6 +395,13 @@ declare type ListGrandTotal =
138
395
  fields?: string[];
139
396
  };
140
397
 
398
+ declare type ListGrandTotal_2 = boolean | {
399
+ label?: string;
400
+ style?: ComponentStyle_3;
401
+ /** 合计列(缺省沿用 groupBy.subtotal) */
402
+ fields?: string[];
403
+ };
404
+
141
405
  /** 分组小计配置(声明式,见 ListComponent.groupBy) */
142
406
  declare interface ListGroupBy {
143
407
  /** 分组字段(值变化即切组) */
@@ -153,6 +417,21 @@ declare interface ListGroupBy {
153
417
  keepWithNext?: boolean;
154
418
  }
155
419
 
420
+ /** 分组小计配置(声明式,见 ListComponent.groupBy) */
421
+ declare interface ListGroupBy_2 {
422
+ /** 分组字段(值变化即切组) */
423
+ field: string;
424
+ /** 组头文案模板,{value} 占位(默认 "{value}") */
425
+ headerTemplate?: string;
426
+ headerStyle?: ComponentStyle_3;
427
+ /** 需要小计的列字段(组尾输出合计行;数值列求和,其余输出首值/留空) */
428
+ subtotal?: string[];
429
+ subtotalStyle?: ComponentStyle_3;
430
+ subtotalLabel?: string;
431
+ /** 组头防孤行(默认 true:页尾放不下"组头+首行"时整体换页) */
432
+ keepWithNext?: boolean;
433
+ }
434
+
156
435
  declare const machReportAsyncPlugin: {
157
436
  install(app: App, options?: MachReportPluginOptions): void;
158
437
  };
@@ -184,13 +463,17 @@ declare interface MachReportDefaults {
184
463
  preview?: MachReportPreviewOptions;
185
464
  /** Excel 出口配置,按字段继承;不配置使用导出器默认值。 */
186
465
  xlsx?: XlsxRenderOptions;
466
+ /** 默认关闭;true 为本地草稿,对象可提供权限、校验和保存回调。 */
467
+ editable?: boolean | ReportEditingOptions;
468
+ /** 默认关闭;启用后提供导入按钮。ExcelJS 仅在导入时加载。 */
469
+ excelImport?: boolean | ExcelImportOptions;
187
470
  }
188
471
 
189
472
  /**
190
473
  * 结构化错误(code 分类,宿主可按码决定 UX:重试 / 提示 / 降级)。
191
474
  * error 事件契约保持 `(message: string)` 不变,新增第二参数 detail(可选)。
192
475
  */
193
- declare type MachReportErrorCode = "param" | "fetch" | "validate" | "render" | "pdf" | "print" | "export" | "config";
476
+ declare type MachReportErrorCode = "param" | "fetch" | "validate" | "render" | "pdf" | "print" | "export" | "edit" | "import" | "config";
194
477
 
195
478
  /** 日志通道(默认 console;可注入 noop 静默或上报 collector) */
196
479
  declare type MachReportLogger = Pick<Console, "warn" | "info">;
@@ -242,6 +525,14 @@ declare interface MachReportMessages {
242
525
  paramRequired: string;
243
526
  /** 可选搜索进度文案,旧完整 messages 对象无需新增字段。 */
244
527
  searching?: string;
528
+ importExcel?: string;
529
+ importing?: string;
530
+ editCell?: string;
531
+ editingHint?: string;
532
+ saving?: string;
533
+ editInvalidNumber?: string;
534
+ editInvalidBoolean?: string;
535
+ editConflict?: string;
245
536
  }
246
537
 
247
538
  declare interface MachReportPluginOptions {
@@ -319,6 +610,14 @@ export declare const MachReportPreview: {
319
610
  type: BooleanConstructor;
320
611
  default: undefined;
321
612
  };
613
+ editable: {
614
+ type: PropType<boolean | ReportEditingOptions>;
615
+ default: undefined;
616
+ };
617
+ excelImport: {
618
+ type: PropType<boolean | ExcelImportOptions_2>;
619
+ default: undefined;
620
+ };
322
621
  fetcher: {
323
622
  type: PropType<PlanFetcher | null>;
324
623
  default: null;
@@ -330,6 +629,8 @@ export declare const MachReportPreview: {
330
629
  } | undefined) => any) | undefined;
331
630
  onLoaded?: ((pageCount: number) => any) | undefined;
332
631
  onWarning?: ((message: string) => any) | undefined;
632
+ "onCell-edit"?: ((edit: ReportCellEdit_2) => any) | undefined;
633
+ "onTemplate-import"?: ((result: ExcelImportResult) => any) | undefined;
333
634
  }>, {
334
635
  reload: () => Promise<void>;
335
636
  print: () => Promise<void>;
@@ -340,6 +641,9 @@ export declare const MachReportPreview: {
340
641
  reload?: boolean;
341
642
  }) => Promise<void>;
342
643
  checkPdfFont: () => Promise<PdfFontCheckResult>;
644
+ importExcel: (input: ArrayBuffer | Uint8Array | Blob, options?: ExcelImportOptions_2) => Promise<ExcelImportResult | null>;
645
+ getPlan: () => RenderPlan | null;
646
+ getChanges: () => ReportCellEdit_2[];
343
647
  state: ComputedRef<MachReportState>;
344
648
  }, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {} & {
345
649
  error: (message: string, detail?: {
@@ -348,7 +652,10 @@ export declare const MachReportPreview: {
348
652
  } | undefined) => any;
349
653
  loaded: (pageCount: number) => any;
350
654
  warning: (message: string) => any;
655
+ "cell-edit": (edit: ReportCellEdit_2) => any;
656
+ "template-import": (result: ExcelImportResult) => any;
351
657
  }, PublicProps, {
658
+ editable: boolean | ReportEditingOptions;
352
659
  height: string;
353
660
  gapPx: number;
354
661
  params: Record<string, string>;
@@ -359,11 +666,13 @@ export declare const MachReportPreview: {
359
666
  showPdfWindow: boolean;
360
667
  showParams: boolean;
361
668
  messages: Partial<MachReportMessages>;
669
+ excelImport: boolean | ExcelImportOptions_2;
362
670
  autoLoad: boolean;
363
671
  preset: string;
364
672
  paramDefs: ReportParamDef[] | undefined;
365
673
  fetcher: PlanFetcher | null;
366
674
  }, true, {}, {}, { [K in keyof GlobalComponents]: GlobalComponents[K] }, { [K in keyof GlobalDirectives]: GlobalDirectives[K] }, string, {
675
+ importInputRef: HTMLInputElement;
367
676
  viewportRef: HTMLDivElement;
368
677
  containerRef: HTMLDivElement;
369
678
  thumbsRef: HTMLElement;
@@ -427,6 +736,14 @@ export declare const MachReportPreview: {
427
736
  type: BooleanConstructor;
428
737
  default: undefined;
429
738
  };
739
+ editable: {
740
+ type: PropType<boolean | ReportEditingOptions>;
741
+ default: undefined;
742
+ };
743
+ excelImport: {
744
+ type: PropType<boolean | ExcelImportOptions_2>;
745
+ default: undefined;
746
+ };
430
747
  fetcher: {
431
748
  type: PropType<PlanFetcher | null>;
432
749
  default: null;
@@ -438,6 +755,8 @@ export declare const MachReportPreview: {
438
755
  } | undefined) => any) | undefined;
439
756
  onLoaded?: ((pageCount: number) => any) | undefined;
440
757
  onWarning?: ((message: string) => any) | undefined;
758
+ "onCell-edit"?: ((edit: ReportCellEdit_2) => any) | undefined;
759
+ "onTemplate-import"?: ((result: ExcelImportResult) => any) | undefined;
441
760
  }>, {
442
761
  reload: () => Promise<void>;
443
762
  print: () => Promise<void>;
@@ -448,8 +767,12 @@ export declare const MachReportPreview: {
448
767
  reload?: boolean;
449
768
  }) => Promise<void>;
450
769
  checkPdfFont: () => Promise<PdfFontCheckResult>;
770
+ importExcel: (input: ArrayBuffer | Uint8Array | Blob, options?: ExcelImportOptions_2) => Promise<ExcelImportResult | null>;
771
+ getPlan: () => RenderPlan | null;
772
+ getChanges: () => ReportCellEdit_2[];
451
773
  state: ComputedRef<MachReportState>;
452
774
  }, {}, {}, {}, {
775
+ editable: boolean | ReportEditingOptions;
453
776
  height: string;
454
777
  gapPx: number;
455
778
  params: Record<string, string>;
@@ -460,6 +783,7 @@ export declare const MachReportPreview: {
460
783
  showPdfWindow: boolean;
461
784
  showParams: boolean;
462
785
  messages: Partial<MachReportMessages>;
786
+ excelImport: boolean | ExcelImportOptions_2;
463
787
  autoLoad: boolean;
464
788
  preset: string;
465
789
  paramDefs: ReportParamDef[] | undefined;
@@ -521,6 +845,14 @@ showParams: {
521
845
  type: BooleanConstructor;
522
846
  default: undefined;
523
847
  };
848
+ editable: {
849
+ type: PropType<boolean | ReportEditingOptions>;
850
+ default: undefined;
851
+ };
852
+ excelImport: {
853
+ type: PropType<boolean | ExcelImportOptions_2>;
854
+ default: undefined;
855
+ };
524
856
  fetcher: {
525
857
  type: PropType<PlanFetcher | null>;
526
858
  default: null;
@@ -532,6 +864,8 @@ cause?: unknown;
532
864
  } | undefined) => any) | undefined;
533
865
  onLoaded?: ((pageCount: number) => any) | undefined;
534
866
  onWarning?: ((message: string) => any) | undefined;
867
+ "onCell-edit"?: ((edit: ReportCellEdit_2) => any) | undefined;
868
+ "onTemplate-import"?: ((result: ExcelImportResult) => any) | undefined;
535
869
  }>, {
536
870
  reload: () => Promise<void>;
537
871
  print: () => Promise<void>;
@@ -542,6 +876,9 @@ setParams: (values: Record<string, string>, opts?: {
542
876
  reload?: boolean;
543
877
  }) => Promise<void>;
544
878
  checkPdfFont: () => Promise<PdfFontCheckResult>;
879
+ importExcel: (input: ArrayBuffer | Uint8Array | Blob, options?: ExcelImportOptions_2) => Promise<ExcelImportResult | null>;
880
+ getPlan: () => RenderPlan | null;
881
+ getChanges: () => ReportCellEdit_2[];
545
882
  state: ComputedRef<MachReportState>;
546
883
  }, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {} & {
547
884
  error: (message: string, detail?: {
@@ -550,7 +887,10 @@ cause?: unknown;
550
887
  } | undefined) => any;
551
888
  loaded: (pageCount: number) => any;
552
889
  warning: (message: string) => any;
890
+ "cell-edit": (edit: ReportCellEdit_2) => any;
891
+ "template-import": (result: ExcelImportResult) => any;
553
892
  }, string, {
893
+ editable: boolean | ReportEditingOptions;
554
894
  height: string;
555
895
  gapPx: number;
556
896
  params: Record<string, string>;
@@ -561,6 +901,7 @@ showPrint: boolean;
561
901
  showPdfWindow: boolean;
562
902
  showParams: boolean;
563
903
  messages: Partial<MachReportMessages>;
904
+ excelImport: boolean | ExcelImportOptions_2;
564
905
  autoLoad: boolean;
565
906
  preset: string;
566
907
  paramDefs: ReportParamDef[] | undefined;
@@ -592,6 +933,10 @@ declare interface MachReportState {
592
933
  readonly canPrint: boolean;
593
934
  readonly error: Readonly<MachReportStateError> | null;
594
935
  readonly pdfFont: Readonly<PdfFontCheckResult>;
936
+ readonly editing?: boolean;
937
+ readonly saving?: boolean;
938
+ readonly importing?: boolean;
939
+ readonly dirty?: boolean;
595
940
  }
596
941
 
597
942
  declare interface MachReportStateError {
@@ -659,6 +1004,48 @@ declare interface PlanComponent {
659
1004
  fallbackText?: string;
660
1005
  }
661
1006
 
1007
+ declare interface PlanComponent_2 {
1008
+ kind: ComponentKind_2;
1009
+ leftMm: number;
1010
+ topMm: number;
1011
+ widthMm: number;
1012
+ heightMm: number;
1013
+ nid?: string;
1014
+ rkey?: string;
1015
+ text?: string;
1016
+ rawText?: string;
1017
+ lines?: string[];
1018
+ richParagraphs?: RichParagraph_2[];
1019
+ imageData?: string;
1020
+ grid?: PlanGrid_2;
1021
+ table?: PlanTableFragment_2;
1022
+ style?: ComponentStyle_2;
1023
+ meta?: Record<string, unknown>;
1024
+ /** MachReport 扩展字段:未知 kind 的兜底渲染标记 */
1025
+ fallbackText?: string;
1026
+ }
1027
+
1028
+ declare interface PlanComponent_3 {
1029
+ kind: ComponentKind_3;
1030
+ leftMm: number;
1031
+ topMm: number;
1032
+ widthMm: number;
1033
+ heightMm: number;
1034
+ nid?: string;
1035
+ rkey?: string;
1036
+ text?: string;
1037
+ rawText?: string;
1038
+ lines?: string[];
1039
+ richParagraphs?: RichParagraph_3[];
1040
+ imageData?: string;
1041
+ grid?: PlanGrid_3;
1042
+ table?: PlanTableFragment_3;
1043
+ style?: ComponentStyle_3;
1044
+ meta?: Record<string, unknown>;
1045
+ /** MachReport 扩展字段:未知 kind 的兜底渲染标记 */
1046
+ fallbackText?: string;
1047
+ }
1048
+
662
1049
  declare interface PlanFetcher {
663
1050
  (input: ReportFetchInput): Promise<RenderPlan>;
664
1051
  getParamDefs?: ReportFetcher["getParamDefs"];
@@ -674,6 +1061,26 @@ declare interface PlanGrid {
674
1061
  paddingMm?: number;
675
1062
  }
676
1063
 
1064
+ declare interface PlanGrid_2 {
1065
+ /** 行内允许 null 空位;渲染器按空单元格处理 */
1066
+ cells: (GridCell_2 | null)[][];
1067
+ colWidthsMm?: number[];
1068
+ rowHeightsMm?: number[];
1069
+ gapMm?: number;
1070
+ /** 单元格四边内距;旧静态网格默认 0.5mm,分页列表使用其真实测量内距。 */
1071
+ paddingMm?: number;
1072
+ }
1073
+
1074
+ declare interface PlanGrid_3 {
1075
+ /** 行内允许 null 空位;渲染器按空单元格处理 */
1076
+ cells: (GridCell_3 | null)[][];
1077
+ colWidthsMm?: number[];
1078
+ rowHeightsMm?: number[];
1079
+ gapMm?: number;
1080
+ /** 单元格四边内距;旧静态网格默认 0.5mm,分页列表使用其真实测量内距。 */
1081
+ paddingMm?: number;
1082
+ }
1083
+
677
1084
  declare interface PlanPage {
678
1085
  /** wide 表示完整自然列宽;页面仅为预览的垂直窗口分段。 */
679
1086
  layout?: "page" | "wide";
@@ -699,6 +1106,32 @@ declare interface PlanTableFragment {
699
1106
  title?: string;
700
1107
  }
701
1108
 
1109
+ /** 列表的逻辑行来源;用于连续 Excel 重组,避免按文本猜测重复表头。 */
1110
+ declare interface PlanTableFragment_2 {
1111
+ /** 在整个计划中唯一的逻辑表身份;同一表的分页片段共享身份。 */
1112
+ id: string;
1113
+ /** 表头固定 -1;其余行(包括组头/小计/总计)从 0 连续递增。 */
1114
+ rowIndex: number;
1115
+ role: "header" | "body" | "group-header" | "subtotal" | "grand-total";
1116
+ /** 按物理列顺序保存字段身份;不以表头显示文本判断列结构。 */
1117
+ columnKeys: string[];
1118
+ layout?: "page" | "wide";
1119
+ title?: string;
1120
+ }
1121
+
1122
+ /** 列表的逻辑行来源;用于连续 Excel 重组,避免按文本猜测重复表头。 */
1123
+ declare interface PlanTableFragment_3 {
1124
+ /** 在整个计划中唯一的逻辑表身份;同一表的分页片段共享身份。 */
1125
+ id: string;
1126
+ /** 表头固定 -1;其余行(包括组头/小计/总计)从 0 连续递增。 */
1127
+ rowIndex: number;
1128
+ role: "header" | "body" | "group-header" | "subtotal" | "grand-total";
1129
+ /** 按物理列顺序保存字段身份;不以表头显示文本判断列结构。 */
1130
+ columnKeys: string[];
1131
+ layout?: "page" | "wide";
1132
+ title?: string;
1133
+ }
1134
+
702
1135
  /** 预取组件分片(路由 hover / 空闲时调用,正式渲染零等待) */
703
1136
  export declare function preloadMachReport(): Promise<unknown>;
704
1137
 
@@ -707,6 +1140,75 @@ declare interface RenderPlan {
707
1140
  pages: PlanPage[];
708
1141
  }
709
1142
 
1143
+ /** 预览中的物理坐标;合并单元格使用左上角坐标。 */
1144
+ declare interface ReportCellAddress {
1145
+ pageIndex: number;
1146
+ componentIndex: number;
1147
+ rowIndex: number;
1148
+ columnIndex: number;
1149
+ }
1150
+
1151
+ /** 预览中的物理坐标;合并单元格使用左上角坐标。 */
1152
+ declare interface ReportCellAddress_2 {
1153
+ pageIndex: number;
1154
+ componentIndex: number;
1155
+ rowIndex: number;
1156
+ columnIndex: number;
1157
+ }
1158
+
1159
+ declare interface ReportCellContext {
1160
+ address: ReportCellAddress;
1161
+ cell: Readonly<GridCell_2>;
1162
+ component: Readonly<PlanComponent_2>;
1163
+ value: ReportCellValue;
1164
+ valueType: ReportCellValueType;
1165
+ table?: ReportCellTableIdentity;
1166
+ editable: boolean;
1167
+ readOnlyReason?: ReportCellReadOnlyReason;
1168
+ }
1169
+
1170
+ declare interface ReportCellEdit {
1171
+ address: ReportCellAddress;
1172
+ table?: ReportCellTableIdentity;
1173
+ previousValue: ReportCellValue;
1174
+ previousText: string;
1175
+ value: ReportCellValue;
1176
+ text: string;
1177
+ }
1178
+
1179
+ declare interface ReportCellEdit_2 {
1180
+ address: ReportCellAddress_2;
1181
+ table?: ReportCellTableIdentity_2;
1182
+ previousValue: ReportCellValue_2;
1183
+ previousText: string;
1184
+ value: ReportCellValue_2;
1185
+ text: string;
1186
+ }
1187
+
1188
+ declare type ReportCellReadOnlyReason = "cell" | "formula" | "complex" | "structure";
1189
+
1190
+ declare interface ReportCellTableIdentity {
1191
+ id: string;
1192
+ /** 逻辑表行索引;跨分页的同一行保持不变。 */
1193
+ rowIndex: number;
1194
+ role: PlanTableFragment_2["role"];
1195
+ columnKey?: string;
1196
+ }
1197
+
1198
+ declare interface ReportCellTableIdentity_2 {
1199
+ id: string;
1200
+ /** 逻辑表行索引;跨分页的同一行保持不变。 */
1201
+ rowIndex: number;
1202
+ role: PlanTableFragment["role"];
1203
+ columnKey?: string;
1204
+ }
1205
+
1206
+ declare type ReportCellValue = string | number | boolean | null;
1207
+
1208
+ declare type ReportCellValue_2 = string | number | boolean | null;
1209
+
1210
+ declare type ReportCellValueType = NonNullable<GridCell_2["valueType"]>;
1211
+
710
1212
  declare interface ReportDefinition {
711
1213
  /** 静态模板或宿主提供的异步模板加载器;动态模板默认每次重新读取,不缓存版本。 */
712
1214
  template: ReportTemplate | ReportTemplateLoader;
@@ -718,6 +1220,20 @@ declare interface ReportDefinition {
718
1220
  pagination?: PaginateOptions;
719
1221
  }
720
1222
 
1223
+ /** Opt in with true for local drafts, or provide host validation and persistence. */
1224
+ declare interface ReportEditingOptions {
1225
+ canEdit?(context: ReportCellContext): boolean;
1226
+ /** Return an error message or throw to reject the edit. */
1227
+ validate?(edit: Readonly<ReportCellEdit>, operation: ReportEditOperation): void | string | Promise<void | string>;
1228
+ /** Called before applying the change. A rejection leaves the current report untouched. */
1229
+ save?(edit: Readonly<ReportCellEdit>, operation: ReportEditOperation): void | Promise<void>;
1230
+ }
1231
+
1232
+ declare interface ReportEditOperation {
1233
+ /** Reload, another import or unmount aborts the operation. Save adapters should forward this signal. */
1234
+ signal: AbortSignal;
1235
+ }
1236
+
721
1237
  /** 保持 Promise<RenderPlan> 契约;元数据为可选,旧业务 fetcher 无需改造。 */
722
1238
  declare interface ReportFetcher {
723
1239
  (input: ReportFetchInput): Promise<RenderPlan>;
@@ -753,6 +1269,23 @@ declare interface ReportParamDef {
753
1269
  placeholder?: string;
754
1270
  }
755
1271
 
1272
+ /** 报表参数定义(声明式,模板自描述参数面:渲染组件据此生成查询面板) */
1273
+ declare interface ReportParamDef_2 {
1274
+ /** 参数名(传入 params,与数据集 SQL #{field} 绑定对应) */
1275
+ field: string;
1276
+ /** 显示名(缺省用 field) */
1277
+ label?: string;
1278
+ type?: "text" | "number" | "date" | "select";
1279
+ /** select 选项 */
1280
+ options?: Array<{
1281
+ label: string;
1282
+ value: string;
1283
+ }>;
1284
+ defaultValue?: string;
1285
+ required?: boolean;
1286
+ placeholder?: string;
1287
+ }
1288
+
756
1289
  declare type ReportRegistry = Record<string, ReportDefinition>;
757
1290
 
758
1291
  declare interface ReportTemplate {
@@ -762,6 +1295,13 @@ declare interface ReportTemplate {
762
1295
  pages: TemplatePage[];
763
1296
  }
764
1297
 
1298
+ declare interface ReportTemplate_2 {
1299
+ schemaVersion?: string;
1300
+ /** 参数定义(可选;宿主也可经 ReportPreview 的 paramDefs prop 提供,prop 优先) */
1301
+ params?: ReportParamDef_2[];
1302
+ pages: TemplatePage_2[];
1303
+ }
1304
+
765
1305
  declare type ReportTemplateLoader = (context: ReportLoadContext) => ReportTemplate | Promise<ReportTemplate>;
766
1306
 
767
1307
  declare interface RichParagraph {
@@ -773,6 +1313,24 @@ declare interface RichParagraph {
773
1313
  indentMm?: number;
774
1314
  }
775
1315
 
1316
+ declare interface RichParagraph_2 {
1317
+ segments: RichSegment_2[];
1318
+ align?: ComponentStyle_2["align"];
1319
+ lineHeight?: number;
1320
+ spaceBeforeMm?: number;
1321
+ spaceAfterMm?: number;
1322
+ indentMm?: number;
1323
+ }
1324
+
1325
+ declare interface RichParagraph_3 {
1326
+ segments: RichSegment_3[];
1327
+ align?: ComponentStyle_3["align"];
1328
+ lineHeight?: number;
1329
+ spaceBeforeMm?: number;
1330
+ spaceAfterMm?: number;
1331
+ indentMm?: number;
1332
+ }
1333
+
776
1334
  declare interface RichSegment {
777
1335
  kind?: "text" | "field";
778
1336
  text?: string;
@@ -780,6 +1338,20 @@ declare interface RichSegment {
780
1338
  style?: ComponentStyle;
781
1339
  }
782
1340
 
1341
+ declare interface RichSegment_2 {
1342
+ kind?: "text" | "field";
1343
+ text?: string;
1344
+ field?: string;
1345
+ style?: ComponentStyle_2;
1346
+ }
1347
+
1348
+ declare interface RichSegment_3 {
1349
+ kind?: "text" | "field";
1350
+ text?: string;
1351
+ field?: string;
1352
+ style?: ComponentStyle_3;
1353
+ }
1354
+
783
1355
  /** 条件格式规则求值(声明式,见 ListColumn.rules) */
784
1356
  declare interface StyleRule {
785
1357
  when: {
@@ -791,8 +1363,21 @@ declare interface StyleRule {
791
1363
  style: Record<string, unknown>;
792
1364
  }
793
1365
 
1366
+ /** 条件格式规则求值(声明式,见 ListColumn.rules) */
1367
+ declare interface StyleRule_2 {
1368
+ when: {
1369
+ field: string;
1370
+ op: ">" | ">=" | "<" | "<=" | "==" | "!=";
1371
+ value: number | string;
1372
+ };
1373
+ /** 命中时合并进单元格样式(color/bold/backgroundColor 等) */
1374
+ style: Record<string, unknown>;
1375
+ }
1376
+
794
1377
  declare type TemplateComponent = PlanComponent | ListComponent;
795
1378
 
1379
+ declare type TemplateComponent_2 = PlanComponent_3 | ListComponent_2;
1380
+
796
1381
  declare interface TemplatePage {
797
1382
  widthMm: number;
798
1383
  heightMm: number;
@@ -805,6 +1390,18 @@ declare interface TemplatePage {
805
1390
  components: TemplateComponent[];
806
1391
  }
807
1392
 
1393
+ declare interface TemplatePage_2 {
1394
+ widthMm: number;
1395
+ heightMm: number;
1396
+ /** 宽表保持全列自然宽度,页高只控制内部纵向分段。 */
1397
+ layout?: "page" | "wide";
1398
+ marginTopMm?: number;
1399
+ marginBottomMm?: number;
1400
+ marginLeftMm?: number;
1401
+ marginRightMm?: number;
1402
+ components: TemplateComponent_2[];
1403
+ }
1404
+
808
1405
  /**
809
1406
  * 文本测量与折行(分页/Canvas/PDF 共用的唯一折行真相源)。
810
1407
  *