@agile-team/mach-report 2.0.0 → 2.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 (77) hide show
  1. package/LICENSE +2 -4
  2. package/LICENSING.md +15 -0
  3. package/README.md +232 -76
  4. package/dist/ReportPreview-Dwdsyk9b.js +1558 -0
  5. package/dist/ReportPreview-VHAIfsz1.cjs +6 -0
  6. package/dist/index.cjs +5 -5
  7. package/dist/index.d.cts +738 -13
  8. package/dist/index.d.ts +738 -13
  9. package/dist/index.js +821 -631
  10. package/dist/pdf.cjs +47 -47
  11. package/dist/pdf.d.cts +155 -6
  12. package/dist/pdf.d.ts +155 -6
  13. package/dist/pdf.js +3542 -3466
  14. package/dist/plugin-Bl00j_CP.cjs +1 -0
  15. package/dist/plugin-DVScnZ4C.js +25 -0
  16. package/dist/report-params-BB85g7mg.js +10 -0
  17. package/dist/report-params-D1NeY-eR.cjs +1 -0
  18. package/dist/sql.cjs +65 -64
  19. package/dist/sql.d.cts +109 -5
  20. package/dist/sql.d.ts +109 -5
  21. package/dist/sql.js +7947 -7922
  22. package/dist/style.css +1 -1
  23. package/dist/vue/async.d.cts +769 -320
  24. package/dist/vue/async.d.ts +769 -320
  25. package/dist/vue/index.d.cts +1321 -14
  26. package/dist/vue/index.d.ts +1321 -14
  27. package/dist/vue-async.cjs +1 -1
  28. package/dist/vue-async.js +11 -12
  29. package/dist/vue.cjs +1 -1
  30. package/dist/vue.js +129 -49
  31. package/dist/xlsx.cjs +20 -20
  32. package/dist/xlsx.d.cts +2292 -5
  33. package/dist/xlsx.d.ts +2292 -5
  34. package/dist/xlsx.js +5452 -5443
  35. package/package.json +6 -2
  36. package/dist/ReportPreview-Cr0IH1Rz.cjs +0 -6
  37. package/dist/ReportPreview-DwknBgsJ.js +0 -1266
  38. package/dist/builder/template-builder.d.ts +0 -69
  39. package/dist/defaults.d.ts +0 -23
  40. package/dist/format.d.ts +0 -48
  41. package/dist/layout/paginate.d.ts +0 -97
  42. package/dist/layout/textwrap.d.ts +0 -36
  43. package/dist/pdf/font-loader.d.ts +0 -6
  44. package/dist/pdf/index.d.ts +0 -2
  45. package/dist/pdf/render-pdf.d.ts +0 -25
  46. package/dist/plugin-Cj3c2wJc.cjs +0 -1
  47. package/dist/plugin-DJf_6_fl.js +0 -18
  48. package/dist/render/canvas.d.ts +0 -76
  49. package/dist/render/dom.d.ts +0 -10
  50. package/dist/render/grid-geometry.d.ts +0 -41
  51. package/dist/render/style.d.ts +0 -33
  52. package/dist/render/window.d.ts +0 -23
  53. package/dist/schema/render-plan.d.ts +0 -88
  54. package/dist/schema/validate.d.ts +0 -15
  55. package/dist/sql/ast-check.d.ts +0 -14
  56. package/dist/sql/compile.d.ts +0 -31
  57. package/dist/sql/expr.d.ts +0 -21
  58. package/dist/sql/index.d.ts +0 -4
  59. package/dist/sql/tokenizer.d.ts +0 -25
  60. package/dist/units.d.ts +0 -11
  61. package/dist/vue/ReportParamPanel.d.ts +0 -19
  62. package/dist/vue/ReportPreview.d.ts +0 -200
  63. package/dist/vue/ReportToolbar.d.ts +0 -42
  64. package/dist/vue/adapters.d.ts +0 -34
  65. package/dist/vue/composables/useHighlight.d.ts +0 -8
  66. package/dist/vue/composables/usePageWindow.d.ts +0 -25
  67. package/dist/vue/composables/usePrintExport.d.ts +0 -40
  68. package/dist/vue/composables/useReportSearch.d.ts +0 -73
  69. package/dist/vue/composables/useZoom.d.ts +0 -15
  70. package/dist/vue/config.d.ts +0 -108
  71. package/dist/vue/controller.d.ts +0 -29
  72. package/dist/vue/errors.d.ts +0 -16
  73. package/dist/vue/injection-keys.d.ts +0 -14
  74. package/dist/vue/local-adapter.d.ts +0 -11
  75. package/dist/vue/pdf-exporter.d.ts +0 -13
  76. package/dist/vue/plugin.d.ts +0 -332
  77. package/dist/xlsx/render-xlsx.d.ts +0 -20
@@ -1,320 +1,769 @@
1
- import { MachReportPluginOptions } from './plugin';
2
- /**
3
- * 异步插件入口(@agile-team/mach-report/vue/async):
4
- *
5
- * 首屏敏感页面用异步全局组件代替静态 import——组件与其引擎依赖
6
- * 拆为独立 chunk,路由级按需加载:
7
- *
8
- * ```ts
9
- * import AsyncMachReportPlugin, { preloadMachReport } from "@agile-team/mach-report/vue/async";
10
- * app.use(AsyncMachReportPlugin, { baseUrl: "/sub/mach-report" });
11
- * void preloadMachReport(); // 可选:路由 hover 时预取
12
- * // 模板:<MachReportPreview report-id="X" />
13
- * ```
14
- */
15
- /** 全局异步组件(懒加载 ReportPreview 及其引擎分片;与主插件同源共享) */
16
- export declare const MachReportPreview: {
17
- new (...args: any[]): import('vue').CreateComponentPublicInstanceWithMixins<Readonly<import('vue').ExtractPropTypes<{
18
- reportId: {
19
- type: import('vue').PropType<string | string[] | null>;
20
- default: null;
21
- };
22
- params: {
23
- type: import('vue').PropType<Record<string, string>>;
24
- default: () => {};
25
- };
26
- height: {
27
- type: StringConstructor;
28
- default: string;
29
- };
30
- autoLoad: {
31
- type: BooleanConstructor;
32
- default: boolean;
33
- };
34
- showExport: {
35
- type: BooleanConstructor;
36
- default: undefined;
37
- };
38
- showPrint: {
39
- type: BooleanConstructor;
40
- default: undefined;
41
- };
42
- showPdfWindow: {
43
- type: BooleanConstructor;
44
- default: undefined;
45
- };
46
- gapPx: {
47
- type: NumberConstructor;
48
- default: undefined;
49
- };
50
- messages: {
51
- type: import('vue').PropType<Partial<import('./config').MachReportMessages>>;
52
- default: undefined;
53
- };
54
- preset: {
55
- type: StringConstructor;
56
- default: undefined;
57
- };
58
- debug: {
59
- type: BooleanConstructor;
60
- default: boolean;
61
- };
62
- paramDefs: {
63
- type: import('vue').PropType<import('..').ReportParamDef[] | undefined>;
64
- default: undefined;
65
- };
66
- showParams: {
67
- type: BooleanConstructor;
68
- default: undefined;
69
- };
70
- fetcher: {
71
- type: import('vue').PropType<import('./adapters').PlanFetcher | null>;
72
- default: null;
73
- };
74
- }>> & Readonly<{
75
- onError?: ((message: string, detail?: {
76
- code: string;
77
- cause?: unknown;
78
- } | undefined) => any) | undefined;
79
- onLoaded?: ((pageCount: number) => any) | undefined;
80
- onWarning?: ((message: string) => any) | undefined;
81
- }>, {
82
- reload: () => Promise<void>;
83
- print: () => Promise<void>;
84
- exportAs: (format: string) => void;
85
- openPdfWindow: () => void;
86
- gotoPage: (n: number) => void;
87
- setParams: (values: Record<string, string>, opts?: {
88
- reload?: boolean;
89
- }) => void;
90
- }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
91
- error: (message: string, detail?: {
92
- code: string;
93
- cause?: unknown;
94
- } | undefined) => any;
95
- loaded: (pageCount: number) => any;
96
- warning: (message: string) => any;
97
- }, import('vue').PublicProps, {
98
- height: string;
99
- gapPx: number;
100
- params: Record<string, string>;
101
- debug: boolean;
102
- showExport: boolean;
103
- showPrint: boolean;
104
- showPdfWindow: boolean;
105
- showParams: boolean;
106
- messages: Partial<import('./config').MachReportMessages>;
107
- reportId: string | string[] | null;
108
- autoLoad: boolean;
109
- preset: string;
110
- paramDefs: import('..').ReportParamDef[] | undefined;
111
- fetcher: import('./adapters').PlanFetcher | null;
112
- }, true, {}, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, {
113
- viewportRef: HTMLDivElement;
114
- containerRef: HTMLDivElement;
115
- thumbsRef: HTMLElement;
116
- }, HTMLDivElement, import('vue').ComponentProvideOptions, {
117
- P: {};
118
- B: {};
119
- D: {};
120
- C: {};
121
- M: {};
122
- Defaults: {};
123
- }, Readonly<import('vue').ExtractPropTypes<{
124
- reportId: {
125
- type: import('vue').PropType<string | string[] | null>;
126
- default: null;
127
- };
128
- params: {
129
- type: import('vue').PropType<Record<string, string>>;
130
- default: () => {};
131
- };
132
- height: {
133
- type: StringConstructor;
134
- default: string;
135
- };
136
- autoLoad: {
137
- type: BooleanConstructor;
138
- default: boolean;
139
- };
140
- showExport: {
141
- type: BooleanConstructor;
142
- default: undefined;
143
- };
144
- showPrint: {
145
- type: BooleanConstructor;
146
- default: undefined;
147
- };
148
- showPdfWindow: {
149
- type: BooleanConstructor;
150
- default: undefined;
151
- };
152
- gapPx: {
153
- type: NumberConstructor;
154
- default: undefined;
155
- };
156
- messages: {
157
- type: import('vue').PropType<Partial<import('./config').MachReportMessages>>;
158
- default: undefined;
159
- };
160
- preset: {
161
- type: StringConstructor;
162
- default: undefined;
163
- };
164
- debug: {
165
- type: BooleanConstructor;
166
- default: boolean;
167
- };
168
- paramDefs: {
169
- type: import('vue').PropType<import('..').ReportParamDef[] | undefined>;
170
- default: undefined;
171
- };
172
- showParams: {
173
- type: BooleanConstructor;
174
- default: undefined;
175
- };
176
- fetcher: {
177
- type: import('vue').PropType<import('./adapters').PlanFetcher | null>;
178
- default: null;
179
- };
180
- }>> & Readonly<{
181
- onError?: ((message: string, detail?: {
182
- code: string;
183
- cause?: unknown;
184
- } | undefined) => any) | undefined;
185
- onLoaded?: ((pageCount: number) => any) | undefined;
186
- onWarning?: ((message: string) => any) | undefined;
187
- }>, {
188
- reload: () => Promise<void>;
189
- print: () => Promise<void>;
190
- exportAs: (format: string) => void;
191
- openPdfWindow: () => void;
192
- gotoPage: (n: number) => void;
193
- setParams: (values: Record<string, string>, opts?: {
194
- reload?: boolean;
195
- }) => void;
196
- }, {}, {}, {}, {
197
- height: string;
198
- gapPx: number;
199
- params: Record<string, string>;
200
- debug: boolean;
201
- showExport: boolean;
202
- showPrint: boolean;
203
- showPdfWindow: boolean;
204
- showParams: boolean;
205
- messages: Partial<import('./config').MachReportMessages>;
206
- reportId: string | string[] | null;
207
- autoLoad: boolean;
208
- preset: string;
209
- paramDefs: import('..').ReportParamDef[] | undefined;
210
- fetcher: import('./adapters').PlanFetcher | null;
211
- }>;
212
- __isFragment?: never;
213
- __isTeleport?: never;
214
- __isSuspense?: never;
215
- } & import('vue').ComponentOptionsBase<Readonly<import('vue').ExtractPropTypes<{
216
- reportId: {
217
- type: import('vue').PropType<string | string[] | null>;
218
- default: null;
219
- };
220
- params: {
221
- type: import('vue').PropType<Record<string, string>>;
222
- default: () => {};
223
- };
224
- height: {
225
- type: StringConstructor;
226
- default: string;
227
- };
228
- autoLoad: {
229
- type: BooleanConstructor;
230
- default: boolean;
231
- };
232
- showExport: {
233
- type: BooleanConstructor;
234
- default: undefined;
235
- };
236
- showPrint: {
237
- type: BooleanConstructor;
238
- default: undefined;
239
- };
240
- showPdfWindow: {
241
- type: BooleanConstructor;
242
- default: undefined;
243
- };
244
- gapPx: {
245
- type: NumberConstructor;
246
- default: undefined;
247
- };
248
- messages: {
249
- type: import('vue').PropType<Partial<import('./config').MachReportMessages>>;
250
- default: undefined;
251
- };
252
- preset: {
253
- type: StringConstructor;
254
- default: undefined;
255
- };
256
- debug: {
257
- type: BooleanConstructor;
258
- default: boolean;
259
- };
260
- paramDefs: {
261
- type: import('vue').PropType<import('..').ReportParamDef[] | undefined>;
262
- default: undefined;
263
- };
264
- showParams: {
265
- type: BooleanConstructor;
266
- default: undefined;
267
- };
268
- fetcher: {
269
- type: import('vue').PropType<import('./adapters').PlanFetcher | null>;
270
- default: null;
271
- };
272
- }>> & Readonly<{
273
- onError?: ((message: string, detail?: {
274
- code: string;
275
- cause?: unknown;
276
- } | undefined) => any) | undefined;
277
- onLoaded?: ((pageCount: number) => any) | undefined;
278
- onWarning?: ((message: string) => any) | undefined;
279
- }>, {
280
- reload: () => Promise<void>;
281
- print: () => Promise<void>;
282
- exportAs: (format: string) => void;
283
- openPdfWindow: () => void;
284
- gotoPage: (n: number) => void;
285
- setParams: (values: Record<string, string>, opts?: {
286
- reload?: boolean;
287
- }) => void;
288
- }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
289
- error: (message: string, detail?: {
290
- code: string;
291
- cause?: unknown;
292
- } | undefined) => any;
293
- loaded: (pageCount: number) => any;
294
- warning: (message: string) => any;
295
- }, string, {
296
- height: string;
297
- gapPx: number;
298
- params: Record<string, string>;
299
- debug: boolean;
300
- showExport: boolean;
301
- showPrint: boolean;
302
- showPdfWindow: boolean;
303
- showParams: boolean;
304
- messages: Partial<import('./config').MachReportMessages>;
305
- reportId: string | string[] | null;
306
- autoLoad: boolean;
307
- preset: string;
308
- paramDefs: import('..').ReportParamDef[] | undefined;
309
- fetcher: import('./adapters').PlanFetcher | null;
310
- }, {}, string, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, import('vue').ComponentProvideOptions> & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps & (new () => {
311
- $slots: {
312
- default?(_: {}): any;
313
- };
314
- });
315
- /** 预取组件分片(路由 hover / 空闲时调用,正式渲染零等待) */
316
- export declare function preloadMachReport(): Promise<unknown>;
317
- export declare const machReportAsyncPlugin: {
318
- install(app: import('vue').App, options?: MachReportPluginOptions): void;
319
- };
320
- export default machReportAsyncPlugin;
1
+ import { AllowedComponentProps } from 'vue';
2
+ import { App } from 'vue';
3
+ import { ComponentCustomProps } from 'vue';
4
+ import { ComponentOptionsBase } from 'vue';
5
+ import { ComponentOptionsMixin } from 'vue';
6
+ import { ComponentProvideOptions } from 'vue';
7
+ import { ComputedRef } from 'vue';
8
+ import { CreateComponentPublicInstanceWithMixins } from 'vue';
9
+ import { ExtractPropTypes } from 'vue';
10
+ import { GlobalComponents } from 'vue';
11
+ import { GlobalDirectives } from 'vue';
12
+ import { PropType } from 'vue';
13
+ import { PublicProps } from 'vue';
14
+ import { VNodeProps } from 'vue';
15
+
16
+ /**
17
+ * 列值格式化(声明式、JSON 可序列化)。
18
+ * 在 paginate 的 cellText 出口统一消费:格式化发生在进 RenderPlan 之前,
19
+ * 三后端(DOM/Canvas/PDF)零改动。
20
+ *
21
+ * 语义约定(v0.9 固化):
22
+ * - number.digits 显式给出 → 精确保留(12.5 + digits:2 → "12.50")
23
+ * - number.thousands 默认 false(千分位显式开启)
24
+ * - date 字符串按"本地时区的日历日"解析(YYYY-MM-DD / YYYY/MM/DD 直取年月日,
25
+ * 不经 Date 字符串构造——后者按 UTC 零点,负时区环境会少一天)
26
+ */
27
+
28
+ declare type ColumnFormat =
29
+ | { kind: "number"; thousands?: boolean; digits?: number }
30
+ | { kind: "percent"; digits?: number }
31
+ | { kind: "date"; pattern?: string };
32
+
33
+ declare type ComponentKind =
34
+ | "text"
35
+ | "image"
36
+ | "barcode"
37
+ | "qrcode"
38
+ | "chart"
39
+ | "line"
40
+ | "rect"
41
+ | "ellipse";
42
+
43
+ declare interface ComponentStyle {
44
+ fontSizePx?: number;
45
+ fontSize?: number;
46
+ fontFamily?: string;
47
+ bold?: boolean;
48
+ italic?: boolean;
49
+ underline?: boolean;
50
+ color?: string;
51
+ backgroundColor?: string;
52
+ align?: "left" | "center" | "right" | "justify";
53
+ verticalAlign?: "top" | "middle" | "bottom";
54
+ lineColor?: string;
55
+ borderColor?: string;
56
+ lineWidthPt?: number;
57
+ borderTop?: boolean;
58
+ borderRight?: boolean;
59
+ borderBottom?: boolean;
60
+ borderLeft?: boolean;
61
+ lineHeight?: number;
62
+ letterSpacing?: number;
63
+ opacity?: number;
64
+ rotateDeg?: number;
65
+ }
66
+
67
+ declare type DatasetRows = Record<string, Record<string, unknown>[]>;
68
+
69
+ declare interface GridCell {
70
+ text?: string;
71
+ rawText?: string;
72
+ children?: PlanComponent[];
73
+ colSpan?: number;
74
+ rowSpan?: number;
75
+ style?: ComponentStyle;
76
+ }
77
+
78
+ declare interface ListColumn {
79
+ header: string;
80
+ field: string;
81
+ widthMm: number;
82
+ style?: ComponentStyle;
83
+ /** 值格式化(声明式):千分位/小数位、百分比、日期 pattern */
84
+ format?: ColumnFormat;
85
+ /** 条件格式规则(声明式,命中合并进单元格样式;如负数红字) */
86
+ rules?: StyleRule[];
87
+ }
88
+
89
+ declare interface ListComponent {
90
+ kind: "list";
91
+ id?: string;
92
+ leftMm: number;
93
+ topMm: number;
94
+ widthMm: number;
95
+ dataset: string;
96
+ columns: ListColumn[];
97
+ fontSizePt?: number;
98
+ headerBold?: boolean;
99
+ rowHeightMm?: number;
100
+ paddingMm?: number;
101
+ headerEveryPage?: boolean;
102
+ headerBackgroundColor?: string;
103
+ border?: boolean;
104
+ /** 分组小计(组头/组尾小计/组头防孤行) */
105
+ groupBy?: ListGroupBy;
106
+ /** 末尾总合计行(依赖 groupBy.subtotal 或显式 fields) */
107
+ grandTotal?: ListGrandTotal;
108
+ }
109
+
110
+ declare type ListGrandTotal =
111
+ | boolean
112
+ | {
113
+ label?: string;
114
+ style?: ComponentStyle;
115
+ /** 合计列(缺省沿用 groupBy.subtotal) */
116
+ fields?: string[];
117
+ };
118
+
119
+ /** 分组小计配置(声明式,见 ListComponent.groupBy) */
120
+ declare interface ListGroupBy {
121
+ /** 分组字段(值变化即切组) */
122
+ field: string;
123
+ /** 组头文案模板,{value} 占位(默认 "{value}") */
124
+ headerTemplate?: string;
125
+ headerStyle?: ComponentStyle;
126
+ /** 需要小计的列字段(组尾输出合计行;数值列求和,其余输出首值/留空) */
127
+ subtotal?: string[];
128
+ subtotalStyle?: ComponentStyle;
129
+ subtotalLabel?: string;
130
+ /** 组头防孤行(默认 true:页尾放不下"组头+首行"时整体换页) */
131
+ keepWithNext?: boolean;
132
+ }
133
+
134
+ declare const machReportAsyncPlugin: {
135
+ install(app: App, options?: MachReportPluginOptions): void;
136
+ };
137
+ export default machReportAsyncPlugin;
138
+ export { machReportAsyncPlugin }
139
+
140
+ declare interface MachReportConfig {
141
+ defaults: MachReportDefaults;
142
+ presets: Record<string, MachReportPreset>;
143
+ /** 默认启用的 preset 名 */
144
+ defaultPreset?: string;
145
+ }
146
+
147
+ /** defaults 层可配置项(全部可选,均有内置缺省) */
148
+ declare interface MachReportDefaults {
149
+ showExport?: boolean;
150
+ showPrint?: boolean;
151
+ showPdfWindow?: boolean;
152
+ /** 参数面板显隐(有参数定义且未显式关闭时显示;缺省 true) */
153
+ showParams?: boolean;
154
+ /** 页间距 px */
155
+ gapPx?: number;
156
+ /** PDF 导出中文字体 URL */
157
+ pdfFontUrl?: string;
158
+ theme?: Partial<MachReportTheme>;
159
+ messages?: Partial<MachReportMessages>;
160
+ /** 校验告警等内部日志通道(默认 console;静默传 { warn: () => {}, info: () => {} }) */
161
+ logger?: MachReportLogger;
162
+ }
163
+
164
+ /**
165
+ * 结构化错误(code 分类,宿主可按码决定 UX:重试 / 提示 / 降级)。
166
+ * error 事件契约保持 `(message: string)` 不变,新增第二参数 detail(可选)。
167
+ */
168
+ declare type MachReportErrorCode = "param" | "fetch" | "validate" | "render" | "pdf" | "print" | "export" | "config";
169
+
170
+ /** 日志通道(默认 console;可注入 noop 静默或上报 collector) */
171
+ declare type MachReportLogger = Pick<Console, "warn" | "info">;
172
+
173
+ /**
174
+ * 配置中心(对齐 mach-table 的 defineMachTableConfig 体验):
175
+ * - 应用级:app.use(machReportPlugin, { config: defineMachReportConfig({...}) })
176
+ * - 路由级叠加:provideMachReportConfig(overlay)(响应式,就近覆盖)
177
+ * - 优先级:组件 props > 路由级叠加 > preset > defaults(props 永远最高)
178
+ */
179
+ /** 工具栏与状态文案(默认简体中文;出海场景覆写) */
180
+ declare interface MachReportMessages {
181
+ title: string;
182
+ prevPage: string;
183
+ nextPage: string;
184
+ /** 页码显示模板,{cur}/{total} 占位 */
185
+ pageInfo: string;
186
+ fitWidth: string;
187
+ exportHtml: string;
188
+ exportPdf: string;
189
+ exportExcel: string;
190
+ exportImage: string;
191
+ exportWord: string;
192
+ /** 导出进行中提示,{format} 占位 */
193
+ exporting: string;
194
+ print: string;
195
+ pdfWindow: string;
196
+ loading: string;
197
+ empty: string;
198
+ /** @deprecated 未被组件消费,将在下个大版本移除(保留仅为类型兼容) */
199
+ errorPrefix: string;
200
+ retry: string;
201
+ /** 可选新增文案,保留旧完整文案对象兼容。 */
202
+ pdfFontUnavailable?: string;
203
+ /** 搜索框占位文案 */
204
+ searchPlaceholder: string;
205
+ /** 搜索命中计数,{cur}/{total} 占位 */
206
+ matchInfo: string;
207
+ /** 上/下一个命中 */
208
+ prevMatch: string;
209
+ nextMatch: string;
210
+ /** 缩略图侧栏开关 */
211
+ thumbnails: string;
212
+ /** 参数面板 */
213
+ paramsTitle: string;
214
+ query: string;
215
+ reset: string;
216
+ /** 必填缺失提示({label} 占位) */
217
+ paramRequired: string;
218
+ }
219
+
220
+ declare interface MachReportPluginOptions {
221
+ /** 报表数据源;也可直接传给 ReportPreview 的 fetcher prop */
222
+ fetcher?: PlanFetcher;
223
+ /** 常规业务接入:注册模板与取数,包内完成分页与参数面板;显式 fetcher 优先。 */
224
+ reports?: ReportRegistry;
225
+ /** 应用级配置中心(defaults/presets/文案/主题),见 defineMachReportConfig */
226
+ config?: MachReportConfig;
227
+ /** PDF 导出字体 URL(默认 /simhei.ttf;'' 跳过字体) */
228
+ pdfFontUrl?: string;
229
+ /** 自定义 PDF 导出器(缺省用懒加载引擎 /pdf 子路径的默认实现) */
230
+ pdfExporter?: PdfExporter;
231
+ /** 注册全局组件 <MachReportPreview>(默认 true;懒加载分片不影响首屏) */
232
+ globalComponent?: boolean;
233
+ }
234
+
235
+ declare type MachReportPreset = MachReportDefaults;
236
+
237
+ /**
238
+ * 全局组件(懒加载分片:首次渲染才拉取组件与引擎依赖,
239
+ * 与局部 import 等价——首屏敏感页面零额外成本)
240
+ */
241
+ export declare const MachReportPreview: {
242
+ new (...args: any[]): CreateComponentPublicInstanceWithMixins<Readonly<ExtractPropTypes< {
243
+ reportId: {
244
+ type: PropType<string | string[] | null>;
245
+ default: null;
246
+ };
247
+ params: {
248
+ type: PropType<Record<string, string>>;
249
+ default: () => {};
250
+ };
251
+ height: {
252
+ type: StringConstructor;
253
+ default: string;
254
+ };
255
+ autoLoad: {
256
+ type: BooleanConstructor;
257
+ default: boolean;
258
+ };
259
+ showExport: {
260
+ type: BooleanConstructor;
261
+ default: undefined;
262
+ };
263
+ showPrint: {
264
+ type: BooleanConstructor;
265
+ default: undefined;
266
+ };
267
+ showPdfWindow: {
268
+ type: BooleanConstructor;
269
+ default: undefined;
270
+ };
271
+ gapPx: {
272
+ type: NumberConstructor;
273
+ default: undefined;
274
+ };
275
+ messages: {
276
+ type: PropType<Partial<MachReportMessages>>;
277
+ default: undefined;
278
+ };
279
+ preset: {
280
+ type: StringConstructor;
281
+ default: undefined;
282
+ };
283
+ debug: {
284
+ type: BooleanConstructor;
285
+ default: boolean;
286
+ };
287
+ paramDefs: {
288
+ type: PropType<ReportParamDef[] | undefined>;
289
+ default: undefined;
290
+ };
291
+ showParams: {
292
+ type: BooleanConstructor;
293
+ default: undefined;
294
+ };
295
+ fetcher: {
296
+ type: PropType<PlanFetcher | null>;
297
+ default: null;
298
+ };
299
+ }>> & Readonly<{
300
+ onError?: ((message: string, detail?: {
301
+ code: string;
302
+ cause?: unknown;
303
+ } | undefined) => any) | undefined;
304
+ onLoaded?: ((pageCount: number) => any) | undefined;
305
+ onWarning?: ((message: string) => any) | undefined;
306
+ }>, {
307
+ reload: () => Promise<void>;
308
+ print: () => Promise<void>;
309
+ exportAs: (format: string) => Promise<void>;
310
+ openPdfWindow: () => void;
311
+ gotoPage: (n: number) => void;
312
+ setParams: (values: Record<string, string>, opts?: {
313
+ reload?: boolean;
314
+ }) => Promise<void>;
315
+ checkPdfFont: () => Promise<PdfFontCheckResult>;
316
+ state: ComputedRef<MachReportState>;
317
+ }, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {} & {
318
+ error: (message: string, detail?: {
319
+ code: string;
320
+ cause?: unknown;
321
+ } | undefined) => any;
322
+ loaded: (pageCount: number) => any;
323
+ warning: (message: string) => any;
324
+ }, PublicProps, {
325
+ height: string;
326
+ gapPx: number;
327
+ params: Record<string, string>;
328
+ debug: boolean;
329
+ showExport: boolean;
330
+ showPrint: boolean;
331
+ showPdfWindow: boolean;
332
+ showParams: boolean;
333
+ messages: Partial<MachReportMessages>;
334
+ reportId: string | string[] | null;
335
+ autoLoad: boolean;
336
+ preset: string;
337
+ paramDefs: ReportParamDef[] | undefined;
338
+ fetcher: PlanFetcher | null;
339
+ }, true, {}, {}, { [K in keyof GlobalComponents]: GlobalComponents[K] }, { [K in keyof GlobalDirectives]: GlobalDirectives[K] }, string, {
340
+ viewportRef: HTMLDivElement;
341
+ containerRef: HTMLDivElement;
342
+ thumbsRef: HTMLElement;
343
+ }, HTMLDivElement, ComponentProvideOptions, {
344
+ P: {};
345
+ B: {};
346
+ D: {};
347
+ C: {};
348
+ M: {};
349
+ Defaults: {};
350
+ }, Readonly<ExtractPropTypes< {
351
+ reportId: {
352
+ type: PropType<string | string[] | null>;
353
+ default: null;
354
+ };
355
+ params: {
356
+ type: PropType<Record<string, string>>;
357
+ default: () => {};
358
+ };
359
+ height: {
360
+ type: StringConstructor;
361
+ default: string;
362
+ };
363
+ autoLoad: {
364
+ type: BooleanConstructor;
365
+ default: boolean;
366
+ };
367
+ showExport: {
368
+ type: BooleanConstructor;
369
+ default: undefined;
370
+ };
371
+ showPrint: {
372
+ type: BooleanConstructor;
373
+ default: undefined;
374
+ };
375
+ showPdfWindow: {
376
+ type: BooleanConstructor;
377
+ default: undefined;
378
+ };
379
+ gapPx: {
380
+ type: NumberConstructor;
381
+ default: undefined;
382
+ };
383
+ messages: {
384
+ type: PropType<Partial<MachReportMessages>>;
385
+ default: undefined;
386
+ };
387
+ preset: {
388
+ type: StringConstructor;
389
+ default: undefined;
390
+ };
391
+ debug: {
392
+ type: BooleanConstructor;
393
+ default: boolean;
394
+ };
395
+ paramDefs: {
396
+ type: PropType<ReportParamDef[] | undefined>;
397
+ default: undefined;
398
+ };
399
+ showParams: {
400
+ type: BooleanConstructor;
401
+ default: undefined;
402
+ };
403
+ fetcher: {
404
+ type: PropType<PlanFetcher | null>;
405
+ default: null;
406
+ };
407
+ }>> & Readonly<{
408
+ onError?: ((message: string, detail?: {
409
+ code: string;
410
+ cause?: unknown;
411
+ } | undefined) => any) | undefined;
412
+ onLoaded?: ((pageCount: number) => any) | undefined;
413
+ onWarning?: ((message: string) => any) | undefined;
414
+ }>, {
415
+ reload: () => Promise<void>;
416
+ print: () => Promise<void>;
417
+ exportAs: (format: string) => Promise<void>;
418
+ openPdfWindow: () => void;
419
+ gotoPage: (n: number) => void;
420
+ setParams: (values: Record<string, string>, opts?: {
421
+ reload?: boolean;
422
+ }) => Promise<void>;
423
+ checkPdfFont: () => Promise<PdfFontCheckResult>;
424
+ state: ComputedRef<MachReportState>;
425
+ }, {}, {}, {}, {
426
+ height: string;
427
+ gapPx: number;
428
+ params: Record<string, string>;
429
+ debug: boolean;
430
+ showExport: boolean;
431
+ showPrint: boolean;
432
+ showPdfWindow: boolean;
433
+ showParams: boolean;
434
+ messages: Partial<MachReportMessages>;
435
+ reportId: string | string[] | null;
436
+ autoLoad: boolean;
437
+ preset: string;
438
+ paramDefs: ReportParamDef[] | undefined;
439
+ fetcher: PlanFetcher | null;
440
+ }>;
441
+ __isFragment?: never;
442
+ __isTeleport?: never;
443
+ __isSuspense?: never;
444
+ } & ComponentOptionsBase<Readonly<ExtractPropTypes< {
445
+ reportId: {
446
+ type: PropType<string | string[] | null>;
447
+ default: null;
448
+ };
449
+ params: {
450
+ type: PropType<Record<string, string>>;
451
+ default: () => {};
452
+ };
453
+ height: {
454
+ type: StringConstructor;
455
+ default: string;
456
+ };
457
+ autoLoad: {
458
+ type: BooleanConstructor;
459
+ default: boolean;
460
+ };
461
+ showExport: {
462
+ type: BooleanConstructor;
463
+ default: undefined;
464
+ };
465
+ showPrint: {
466
+ type: BooleanConstructor;
467
+ default: undefined;
468
+ };
469
+ showPdfWindow: {
470
+ type: BooleanConstructor;
471
+ default: undefined;
472
+ };
473
+ gapPx: {
474
+ type: NumberConstructor;
475
+ default: undefined;
476
+ };
477
+ messages: {
478
+ type: PropType<Partial<MachReportMessages>>;
479
+ default: undefined;
480
+ };
481
+ preset: {
482
+ type: StringConstructor;
483
+ default: undefined;
484
+ };
485
+ debug: {
486
+ type: BooleanConstructor;
487
+ default: boolean;
488
+ };
489
+ paramDefs: {
490
+ type: PropType<ReportParamDef[] | undefined>;
491
+ default: undefined;
492
+ };
493
+ showParams: {
494
+ type: BooleanConstructor;
495
+ default: undefined;
496
+ };
497
+ fetcher: {
498
+ type: PropType<PlanFetcher | null>;
499
+ default: null;
500
+ };
501
+ }>> & Readonly<{
502
+ onError?: ((message: string, detail?: {
503
+ code: string;
504
+ cause?: unknown;
505
+ } | undefined) => any) | undefined;
506
+ onLoaded?: ((pageCount: number) => any) | undefined;
507
+ onWarning?: ((message: string) => any) | undefined;
508
+ }>, {
509
+ reload: () => Promise<void>;
510
+ print: () => Promise<void>;
511
+ exportAs: (format: string) => Promise<void>;
512
+ openPdfWindow: () => void;
513
+ gotoPage: (n: number) => void;
514
+ setParams: (values: Record<string, string>, opts?: {
515
+ reload?: boolean;
516
+ }) => Promise<void>;
517
+ checkPdfFont: () => Promise<PdfFontCheckResult>;
518
+ state: ComputedRef<MachReportState>;
519
+ }, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {} & {
520
+ error: (message: string, detail?: {
521
+ code: string;
522
+ cause?: unknown;
523
+ } | undefined) => any;
524
+ loaded: (pageCount: number) => any;
525
+ warning: (message: string) => any;
526
+ }, string, {
527
+ height: string;
528
+ gapPx: number;
529
+ params: Record<string, string>;
530
+ debug: boolean;
531
+ showExport: boolean;
532
+ showPrint: boolean;
533
+ showPdfWindow: boolean;
534
+ showParams: boolean;
535
+ messages: Partial<MachReportMessages>;
536
+ reportId: string | string[] | null;
537
+ autoLoad: boolean;
538
+ preset: string;
539
+ paramDefs: ReportParamDef[] | undefined;
540
+ fetcher: PlanFetcher | null;
541
+ }, {}, string, {}, { [K in keyof GlobalComponents]: GlobalComponents[K] }, { [K in keyof GlobalDirectives]: GlobalDirectives[K] }, string, ComponentProvideOptions> & VNodeProps & AllowedComponentProps & ComponentCustomProps & (new () => {
542
+ $slots: {
543
+ default?(_: {}): any;
544
+ };
545
+ });
546
+
547
+ /** 只读快照,由组件的同一套状态驱动;无需通过事件另建状态。 */
548
+ declare interface MachReportState {
549
+ readonly loading: boolean;
550
+ readonly hasPlan: boolean;
551
+ readonly pageCount: number;
552
+ readonly currentPage: number;
553
+ /** 当前导出显示名称,空闲时为 null。 */
554
+ readonly exporting: string | null;
555
+ readonly printing: boolean;
556
+ readonly canExport: boolean;
557
+ readonly canPrint: boolean;
558
+ readonly error: Readonly<MachReportStateError> | null;
559
+ readonly pdfFont: Readonly<PdfFontCheckResult>;
560
+ }
561
+
562
+ declare interface MachReportStateError {
563
+ message: string;
564
+ code: MachReportErrorCode;
565
+ cause?: unknown;
566
+ }
567
+
568
+ /** 主题变量(组件外壳注入的 --mrp-* CSS 自定义属性) */
569
+ declare interface MachReportTheme {
570
+ shellBg: string;
571
+ shellFg: string;
572
+ toolbarBg: string;
573
+ toolbarBorder: string;
574
+ toolbarFg: string;
575
+ btnFg: string;
576
+ btnBorder: string;
577
+ btnHoverBg: string;
578
+ btnHoverFg: string;
579
+ btnActiveBg: string;
580
+ }
581
+
582
+ declare interface PaginateOptions {
583
+ /** 每行额外占高(mm),压测专用钩子 */
584
+ mmPerRow?: number;
585
+ /** 文本测量器(默认启发式;浏览器端可注入 canvas 测量校准) */
586
+ measurer?: TextMeasurer;
587
+ }
588
+
589
+ /** PDF 导出器:RenderPlan → PDF 字节;第二参数可上报非致命保真告警。 */
590
+ declare interface PdfExporter {
591
+ (plan: RenderPlan, onWarning?: (message: string) => void): Promise<Uint8Array>;
592
+ /** 可选轻量字体检查;旧版自定义导出函数无需实现。取消时拒绝 AbortError。 */
593
+ checkFont?: (signal?: AbortSignal) => Promise<PdfFontCheckResult>;
594
+ }
595
+
596
+ declare interface PdfFontCheckResult {
597
+ status: PdfFontStatus;
598
+ fontUrl: string;
599
+ message?: string;
600
+ cause?: unknown;
601
+ }
602
+
603
+ /** available 仅表示字体资源可达;实际导出仍会校验文字能否编码。 */
604
+ declare type PdfFontStatus = "unchecked" | "checking" | "available" | "disabled" | "unverified" | "error";
605
+
606
+ declare interface PlanComponent {
607
+ kind: ComponentKind;
608
+ leftMm: number;
609
+ topMm: number;
610
+ widthMm: number;
611
+ heightMm: number;
612
+ nid?: string;
613
+ rkey?: string;
614
+ text?: string;
615
+ rawText?: string;
616
+ lines?: string[];
617
+ richParagraphs?: RichParagraph[];
618
+ imageData?: string;
619
+ grid?: PlanGrid;
620
+ style?: ComponentStyle;
621
+ meta?: Record<string, unknown>;
622
+ /** MachReport 扩展字段:未知 kind 的兜底渲染标记 */
623
+ fallbackText?: string;
624
+ }
625
+
626
+ declare interface PlanFetcher {
627
+ (input: ReportFetchInput): Promise<RenderPlan>;
628
+ getParamDefs?: ReportFetcher["getParamDefs"];
629
+ }
630
+
631
+ declare interface PlanGrid {
632
+ /** 行内允许 null 空位;渲染器按空单元格处理 */
633
+ cells: (GridCell | null)[][];
634
+ colWidthsMm?: number[];
635
+ rowHeightsMm?: number[];
636
+ gapMm?: number;
637
+ }
638
+
639
+ declare interface PlanPage {
640
+ pageWidthMm: number;
641
+ pageHeightMm: number;
642
+ marginTopMm?: number;
643
+ marginBottomMm?: number;
644
+ marginLeftMm?: number;
645
+ marginRightMm?: number;
646
+ components: PlanComponent[];
647
+ }
648
+
649
+ /** 预取组件分片(路由 hover / 空闲时调用,正式渲染零等待) */
650
+ export declare function preloadMachReport(): Promise<unknown>;
651
+
652
+ declare interface RenderPlan {
653
+ schemaVersion: string;
654
+ pages: PlanPage[];
655
+ }
656
+
657
+ declare interface ReportDefinition {
658
+ template: ReportTemplate;
659
+ /** 静态数据;load 存在时优先使用 load 的结果。 */
660
+ datasets?: DatasetRows;
661
+ load?: (context: ReportLoadContext) => DatasetRows | Promise<DatasetRows>;
662
+ /** 覆盖模板参数定义,未提供时自动使用 template.params。 */
663
+ params?: ReportParamDef[];
664
+ pagination?: PaginateOptions;
665
+ }
666
+
667
+ /** 保持 Promise<RenderPlan> 契约;元数据为可选,旧业务 fetcher 无需改造。 */
668
+ declare interface ReportFetcher {
669
+ (input: ReportFetchInput): Promise<RenderPlan>;
670
+ getParamDefs?: (reportIds: string[]) => ReportParamDef[];
671
+ }
672
+
673
+ declare interface ReportFetchInput {
674
+ reportIds: string[];
675
+ params: Record<string, string>;
676
+ signal?: AbortSignal;
677
+ /** 本次分页与计划告警;未提供时使用数据源配置的告警通道。 */
678
+ onWarning?: (message: string) => void;
679
+ }
680
+
681
+ /** 取数与排版共同使用的请求上下文;取消只影响本次调用。 */
682
+ declare interface ReportLoadContext {
683
+ reportId: string;
684
+ params: Record<string, string>;
685
+ signal?: AbortSignal;
686
+ }
687
+
688
+ /** 报表参数定义(声明式,模板自描述参数面:渲染组件据此生成查询面板) */
689
+ declare interface ReportParamDef {
690
+ /** 参数名(传入 params,与数据集 SQL #{field} 绑定对应) */
691
+ field: string;
692
+ /** 显示名(缺省用 field) */
693
+ label?: string;
694
+ type?: "text" | "number" | "date" | "select";
695
+ /** select 选项 */
696
+ options?: Array<{ label: string; value: string }>;
697
+ defaultValue?: string;
698
+ required?: boolean;
699
+ placeholder?: string;
700
+ }
701
+
702
+ declare type ReportRegistry = Record<string, ReportDefinition>;
703
+
704
+ declare interface ReportTemplate {
705
+ schemaVersion?: string;
706
+ /** 参数定义(可选;宿主也可经 ReportPreview 的 paramDefs prop 提供,prop 优先) */
707
+ params?: ReportParamDef[];
708
+ pages: TemplatePage[];
709
+ }
710
+
711
+ declare interface RichParagraph {
712
+ segments: RichSegment[];
713
+ align?: ComponentStyle["align"];
714
+ lineHeight?: number;
715
+ spaceBeforeMm?: number;
716
+ spaceAfterMm?: number;
717
+ indentMm?: number;
718
+ }
719
+
720
+ declare interface RichSegment {
721
+ kind?: "text" | "field";
722
+ text?: string;
723
+ field?: string;
724
+ style?: ComponentStyle;
725
+ }
726
+
727
+ /** 条件格式规则求值(声明式,见 ListColumn.rules) */
728
+ declare interface StyleRule {
729
+ when: {
730
+ field: string;
731
+ op: ">" | ">=" | "<" | "<=" | "==" | "!=";
732
+ value: number | string;
733
+ };
734
+ /** 命中时合并进单元格样式(color/bold/backgroundColor 等) */
735
+ style: Record<string, unknown>;
736
+ }
737
+
738
+ declare type TemplateComponent = PlanComponent | ListComponent;
739
+
740
+ declare interface TemplatePage {
741
+ widthMm: number;
742
+ heightMm: number;
743
+ marginTopMm?: number;
744
+ marginBottomMm?: number;
745
+ marginLeftMm?: number;
746
+ marginRightMm?: number;
747
+ components: TemplateComponent[];
748
+ }
749
+
750
+ /**
751
+ * 文本测量与折行(分页/Canvas/PDF 共用的唯一折行真相源)。
752
+ *
753
+ * 测量模型可注入(TextMeasurer):
754
+ * - 默认 createHeuristicMeasurer():CJK/拉丁宽度启发式(零依赖、Node 可用)
755
+ * - 浏览器端可注入 createCanvasMeasurer()(真字体 metrics,消除三端折行差异)
756
+ */
757
+
758
+ declare interface TextMeasureOptions {
759
+ fontSizePt: number;
760
+ bold?: boolean;
761
+ letterSpacingPt?: number;
762
+ }
763
+
764
+ /** 宽度测量接口:返回文本在给定字号下的宽度(mm)。实现必须无副作用、可缓存。 */
765
+ declare interface TextMeasurer {
766
+ measureMm(text: string, options: TextMeasureOptions): number;
767
+ }
768
+
769
+ export { }