@agile-team/mach-report 1.2.1 → 2.0.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/README.md +86 -255
  2. package/dist/ReportPreview-Cr0IH1Rz.cjs +6 -0
  3. package/dist/ReportPreview-DwknBgsJ.js +1266 -0
  4. package/dist/defaults.d.ts +3 -7
  5. package/dist/format.d.ts +1 -1
  6. package/dist/index.cjs +5 -5
  7. package/dist/index.d.cts +0 -1
  8. package/dist/index.d.ts +0 -1
  9. package/dist/index.js +621 -758
  10. package/dist/layout/textwrap.d.ts +1 -1
  11. package/dist/pdf.cjs +1 -1
  12. package/dist/pdf.js +1 -1
  13. package/dist/plugin-Cj3c2wJc.cjs +1 -0
  14. package/dist/plugin-DJf_6_fl.js +18 -0
  15. package/dist/schema/render-plan.d.ts +1 -9
  16. package/dist/sql/expr.d.ts +3 -3
  17. package/dist/sql.d.cts +1 -1
  18. package/dist/sql.d.ts +1 -1
  19. package/dist/style-CFZ-HE2s.cjs +3 -0
  20. package/dist/{style-6ihHKVCM.js → style-DnmtG7Gl.js} +69 -81
  21. package/dist/style.css +1 -1
  22. package/dist/vue/ReportPreview.d.ts +3 -12
  23. package/dist/vue/adapters.d.ts +6 -12
  24. package/dist/vue/async.d.cts +7 -22
  25. package/dist/vue/async.d.ts +7 -22
  26. package/dist/vue/local-adapter.d.ts +1 -2
  27. package/dist/vue/plugin.d.ts +12 -34
  28. package/dist/vue-async.cjs +1 -1
  29. package/dist/vue-async.js +6 -6
  30. package/dist/vue.cjs +1 -1
  31. package/dist/vue.js +48 -48
  32. package/package.json +2 -12
  33. package/dist/ReportPreview-CJLvkTVn.cjs +0 -6
  34. package/dist/ReportPreview-mZiGtf0L.js +0 -1231
  35. package/dist/compat/jh4j-template.d.ts +0 -12
  36. package/dist/manager/api.d.ts +0 -45
  37. package/dist/manager/index.d.ts +0 -2
  38. package/dist/manager/types.d.ts +0 -50
  39. package/dist/manager.cjs +0 -1
  40. package/dist/manager.d.cts +0 -5
  41. package/dist/manager.d.ts +0 -5
  42. package/dist/manager.js +0 -104
  43. package/dist/plugin-C4qpbdMJ.cjs +0 -1
  44. package/dist/plugin-DcmAPK_K.js +0 -85
  45. package/dist/style-Xq08-IsV.cjs +0 -3
@@ -1,5 +1,5 @@
1
1
  import { App } from 'vue';
2
- import { PlanFetcher, HostRequest } from './adapters';
2
+ import { PlanFetcher } from './adapters';
3
3
  import { PdfExporter } from './pdf-exporter';
4
4
  import { MachReportConfig } from './config';
5
5
  /**
@@ -8,14 +8,10 @@ import { MachReportConfig } from './config';
8
8
  */
9
9
  export declare const MachReportPreview: {
10
10
  new (...args: any[]): import('vue').CreateComponentPublicInstanceWithMixins<Readonly<import('vue').ExtractPropTypes<{
11
- tempId: {
11
+ reportId: {
12
12
  type: import('vue').PropType<string | string[] | null>;
13
13
  default: null;
14
14
  };
15
- furnitureTempId: {
16
- type: StringConstructor;
17
- default: string;
18
- };
19
15
  params: {
20
16
  type: import('vue').PropType<Record<string, string>>;
21
17
  default: () => {};
@@ -95,14 +91,13 @@ export declare const MachReportPreview: {
95
91
  height: string;
96
92
  gapPx: number;
97
93
  params: Record<string, string>;
98
- furnitureTempId: string;
99
- tempId: string | string[] | null;
100
94
  debug: boolean;
101
95
  showExport: boolean;
102
96
  showPrint: boolean;
103
97
  showPdfWindow: boolean;
104
98
  showParams: boolean;
105
99
  messages: Partial<import('./config').MachReportMessages>;
100
+ reportId: string | string[] | null;
106
101
  autoLoad: boolean;
107
102
  preset: string;
108
103
  paramDefs: import('..').ReportParamDef[] | undefined;
@@ -119,14 +114,10 @@ export declare const MachReportPreview: {
119
114
  M: {};
120
115
  Defaults: {};
121
116
  }, Readonly<import('vue').ExtractPropTypes<{
122
- tempId: {
117
+ reportId: {
123
118
  type: import('vue').PropType<string | string[] | null>;
124
119
  default: null;
125
120
  };
126
- furnitureTempId: {
127
- type: StringConstructor;
128
- default: string;
129
- };
130
121
  params: {
131
122
  type: import('vue').PropType<Record<string, string>>;
132
123
  default: () => {};
@@ -199,14 +190,13 @@ export declare const MachReportPreview: {
199
190
  height: string;
200
191
  gapPx: number;
201
192
  params: Record<string, string>;
202
- furnitureTempId: string;
203
- tempId: string | string[] | null;
204
193
  debug: boolean;
205
194
  showExport: boolean;
206
195
  showPrint: boolean;
207
196
  showPdfWindow: boolean;
208
197
  showParams: boolean;
209
198
  messages: Partial<import('./config').MachReportMessages>;
199
+ reportId: string | string[] | null;
210
200
  autoLoad: boolean;
211
201
  preset: string;
212
202
  paramDefs: import('..').ReportParamDef[] | undefined;
@@ -216,14 +206,10 @@ export declare const MachReportPreview: {
216
206
  __isTeleport?: never;
217
207
  __isSuspense?: never;
218
208
  } & import('vue').ComponentOptionsBase<Readonly<import('vue').ExtractPropTypes<{
219
- tempId: {
209
+ reportId: {
220
210
  type: import('vue').PropType<string | string[] | null>;
221
211
  default: null;
222
212
  };
223
- furnitureTempId: {
224
- type: StringConstructor;
225
- default: string;
226
- };
227
213
  params: {
228
214
  type: import('vue').PropType<Record<string, string>>;
229
215
  default: () => {};
@@ -303,14 +289,13 @@ export declare const MachReportPreview: {
303
289
  height: string;
304
290
  gapPx: number;
305
291
  params: Record<string, string>;
306
- furnitureTempId: string;
307
- tempId: string | string[] | null;
308
292
  debug: boolean;
309
293
  showExport: boolean;
310
294
  showPrint: boolean;
311
295
  showPdfWindow: boolean;
312
296
  showParams: boolean;
313
297
  messages: Partial<import('./config').MachReportMessages>;
298
+ reportId: string | string[] | null;
314
299
  autoLoad: boolean;
315
300
  preset: string;
316
301
  paramDefs: import('..').ReportParamDef[] | undefined;
@@ -321,13 +306,7 @@ export declare const MachReportPreview: {
321
306
  };
322
307
  });
323
308
  export interface MachReportPluginOptions {
324
- /**
325
- * 数据面(全部可选——零配置时用全局 fetch 同源直连):
326
- * - request:宿主 http 客户端(axios 风格签名)
327
- * - fetcher:完整 PlanFetcher(自定义数据面/本地模板,优先级最高)
328
- */
329
- request?: HostRequest;
330
- baseUrl?: string;
309
+ /** 报表数据源;也可直接传给 ReportPreview 的 fetcher prop */
331
310
  fetcher?: PlanFetcher;
332
311
  /** 应用级配置中心(defaults/presets/文案/主题),见 defineMachReportConfig */
333
312
  config?: MachReportConfig;
@@ -339,15 +318,14 @@ export interface MachReportPluginOptions {
339
318
  globalComponent?: boolean;
340
319
  }
341
320
  /**
342
- * Vue 插件(零配置可用,对齐 mach-table 的快速集成体验):
321
+ * Vue 插件:注册组件、配置和可选的数据源,不绑定任何后端接口。
343
322
  *
344
323
  * ```ts
345
- * app.use(machReportPlugin) // 同源 jh4j 部署,零胶水
346
- * app.use(machReportPlugin, { baseUrl: "/sub/mach-report" })
347
- * app.use(machReportPlugin, { request: axios, config: defineMachReportConfig({...}) })
324
+ * app.use(machReportPlugin, { fetcher })
325
+ * app.use(machReportPlugin, { config: defineMachReportConfig({...}) })
348
326
  * ```
349
327
  *
350
- * 之后业务模板直接写 `<MachReportPreview temp-id="X" />`。
328
+ * 之后业务模板直接写 `<MachReportPreview report-id="X" />`。
351
329
  */
352
330
  export declare const machReportPlugin: {
353
331
  install(app: App, options?: MachReportPluginOptions): void;
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const n=require("vue"),i=require("./plugin-C4qpbdMJ.cjs"),r=n.defineAsyncComponent(()=>Promise.resolve().then(()=>require("./ReportPreview-CJLvkTVn.cjs")).then(e=>e.ReportPreview$1));function c(){return Promise.resolve().then(()=>require("./ReportPreview-CJLvkTVn.cjs")).then(e=>e.ReportPreview$1)}const t={install(e,o={}){i.machReportPlugin.install(e,o),e.component("MachReportPreview",r)}};exports.MachReportPreview=r;exports.default=t;exports.machReportAsyncPlugin=t;exports.preloadMachReport=c;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const n=require("vue"),i=require("./plugin-Cj3c2wJc.cjs"),r=n.defineAsyncComponent(()=>Promise.resolve().then(()=>require("./ReportPreview-Cr0IH1Rz.cjs")).then(e=>e.ReportPreview$1));function c(){return Promise.resolve().then(()=>require("./ReportPreview-Cr0IH1Rz.cjs")).then(e=>e.ReportPreview$1)}const t={install(e,o={}){i.machReportPlugin.install(e,o),e.component("MachReportPreview",r)}};exports.MachReportPreview=r;exports.default=t;exports.machReportAsyncPlugin=t;exports.preloadMachReport=c;
package/dist/vue-async.js CHANGED
@@ -1,12 +1,12 @@
1
- import { defineAsyncComponent as o } from "vue";
2
- import { m as e } from "./plugin-DcmAPK_K.js";
3
- const r = o(() => import("./ReportPreview-mZiGtf0L.js").then((t) => t.n));
1
+ import { defineAsyncComponent as e } from "vue";
2
+ import { m as n } from "./plugin-DJf_6_fl.js";
3
+ const r = e(() => import("./ReportPreview-DwknBgsJ.js").then((t) => t.s));
4
4
  function m() {
5
- return import("./ReportPreview-mZiGtf0L.js").then((t) => t.n);
5
+ return import("./ReportPreview-DwknBgsJ.js").then((t) => t.s);
6
6
  }
7
7
  const p = {
8
- install(t, n = {}) {
9
- e.install(t, n), t.component("MachReportPreview", r);
8
+ install(t, o = {}) {
9
+ n.install(t, o), t.component("MachReportPreview", r);
10
10
  }
11
11
  };
12
12
  export {
package/dist/vue.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./ReportPreview-CJLvkTVn.cjs"),r=require("./plugin-C4qpbdMJ.cjs"),c=require("@agile-team/mach-report"),s=require("vue");function l(R){return async({tempIds:t})=>{if(t.length===0)throw new r.PlanLoadError("缺少报表模板 ID");const a=[];for(const n of t){const o=R[n];if(!o)throw new r.PlanLoadError(`本地模板 ${n} 不存在`);const{plan:E,warnings:i}=c.paginateTemplate(o.template,o.datasets??{});i.length>0&&console.warn("[mach-report] 分页告警:",i),a.push(...E.pages)}return{schemaVersion:"mach-local",pages:a}}}function P(){return s.inject(r.MACH_REPORT_CONTROLLER_KEY,null)}exports.DEFAULT_MESSAGES=e.DEFAULT_MESSAGES;exports.DEFAULT_THEME=e.DEFAULT_THEME;exports.MachReportError=e.MachReportError;exports.ReportParamPanel=e.ReportParamPanel;exports.ReportPreview=e.ReportPreview;exports.ReportToolbar=e.ReportToolbar;exports.SILENT_LOGGER=e.SILENT_LOGGER;exports.buildPrintDocument=e.buildPrintDocument;exports.buildWordHtml=e.buildWordHtml;exports.createDefaultPdfExporter=e.createDefaultPdfExporter;exports.defineMachReportConfig=e.defineMachReportConfig;exports.defineMachReportPreset=e.defineMachReportPreset;exports.printPlans=e.printPlans;exports.provideMachReportConfig=e.provideMachReportConfig;exports.resolveConfig=e.resolveConfig;exports.themeToCssVars=e.themeToCssVars;exports.toErrorDetail=e.toErrorDetail;exports.useMachReportConfig=e.useMachReportConfig;exports.usePageWindow=e.usePageWindow;exports.usePrintExport=e.usePrintExport;exports.useZoom=e.useZoom;exports.MACH_REPORT_CONFIG_KEY=r.MACH_REPORT_CONFIG_KEY;exports.MACH_REPORT_CONTROLLER_KEY=r.MACH_REPORT_CONTROLLER_KEY;exports.MACH_REPORT_FETCHER_KEY=r.MACH_REPORT_FETCHER_KEY;exports.MACH_REPORT_PDF_EXPORTER_KEY=r.MACH_REPORT_PDF_EXPORTER_KEY;exports.MachReportPreview=r.MachReportPreview;exports.PlanLoadError=r.PlanLoadError;exports.createFetchRequest=r.createFetchRequest;exports.createJh4jGridPlanFetcher=r.createJh4jGridPlanFetcher;exports.joinTempIds=r.joinTempIds;exports.machReportPlugin=r.machReportPlugin;exports.normalizeTempIds=r.normalizeTempIds;exports.createLocalFetcher=l;exports.useReportPreview=P;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./ReportPreview-Cr0IH1Rz.cjs"),E=require("@agile-team/mach-report"),r=require("./plugin-Cj3c2wJc.cjs"),c=require("vue");function p(i){return async({reportIds:t})=>{if(t.length===0)throw new e.PlanLoadError("缺少报表 ID");const a=[];for(const n of t){const o=i[n];if(!o)throw new e.PlanLoadError(`本地模板 ${n} 不存在`);const{plan:s,warnings:R}=E.paginateTemplate(o.template,o.datasets??{});R.length>0&&console.warn("[mach-report] 分页告警:",R),a.push(...s.pages)}return{schemaVersion:E.RENDER_PLAN_SCHEMA_VERSION,pages:a}}}function P(){return c.inject(r.MACH_REPORT_CONTROLLER_KEY,null)}exports.DEFAULT_MESSAGES=e.DEFAULT_MESSAGES;exports.DEFAULT_THEME=e.DEFAULT_THEME;exports.MachReportError=e.MachReportError;exports.PlanLoadError=e.PlanLoadError;exports.ReportParamPanel=e.ReportParamPanel;exports.ReportPreview=e.ReportPreview;exports.ReportToolbar=e.ReportToolbar;exports.SILENT_LOGGER=e.SILENT_LOGGER;exports.buildPrintDocument=e.buildPrintDocument;exports.buildWordHtml=e.buildWordHtml;exports.createDefaultPdfExporter=e.createDefaultPdfExporter;exports.createFetchRequest=e.createFetchRequest;exports.defineMachReportConfig=e.defineMachReportConfig;exports.defineMachReportPreset=e.defineMachReportPreset;exports.joinReportIds=e.joinReportIds;exports.normalizeReportIds=e.normalizeReportIds;exports.printPlans=e.printPlans;exports.provideMachReportConfig=e.provideMachReportConfig;exports.resolveConfig=e.resolveConfig;exports.themeToCssVars=e.themeToCssVars;exports.toErrorDetail=e.toErrorDetail;exports.useMachReportConfig=e.useMachReportConfig;exports.usePageWindow=e.usePageWindow;exports.usePrintExport=e.usePrintExport;exports.useZoom=e.useZoom;exports.MACH_REPORT_CONFIG_KEY=r.MACH_REPORT_CONFIG_KEY;exports.MACH_REPORT_CONTROLLER_KEY=r.MACH_REPORT_CONTROLLER_KEY;exports.MACH_REPORT_FETCHER_KEY=r.MACH_REPORT_FETCHER_KEY;exports.MACH_REPORT_PDF_EXPORTER_KEY=r.MACH_REPORT_PDF_EXPORTER_KEY;exports.MachReportPreview=r.MachReportPreview;exports.machReportPlugin=r.machReportPlugin;exports.createLocalFetcher=p;exports.useReportPreview=P;
package/dist/vue.js CHANGED
@@ -1,57 +1,57 @@
1
- import { D as T, a as _, M as d, R as g, b as M, c as C, S as w, d as O, e as D, f as F, g as L, h as A, p as H, i as b, r as j, t as v, j as x, u as G, k as S, l as I, m as K } from "./ReportPreview-mZiGtf0L.js";
2
- import { P as t, M as c } from "./plugin-DcmAPK_K.js";
3
- import { a as N, b as y, c as U, d as V, e as W, f as k, j as q, m as z, n as J } from "./plugin-DcmAPK_K.js";
4
- import { paginateTemplate as p } from "@agile-team/mach-report";
5
- import { inject as l } from "vue";
6
- function f(n) {
7
- return async ({ tempIds: a }) => {
8
- if (a.length === 0) throw new t("缺少报表模板 ID");
1
+ import { P as s } from "./ReportPreview-DwknBgsJ.js";
2
+ import { D as d, a as g, M as T, R as C, b as w, c as O, S as A, d as D, e as L, f as H, g as F, h as S, i as N, j as b, n as v, p as x, k as I, r as G, t as K, l as Y, u as j, m as V, o as q, q as y } from "./ReportPreview-DwknBgsJ.js";
3
+ import { paginateTemplate as p, RENDER_PLAN_SCHEMA_VERSION as R } from "@agile-team/mach-report";
4
+ import { M as E } from "./plugin-DJf_6_fl.js";
5
+ import { a as W, b as k, c as z, d as X, m as Z } from "./plugin-DJf_6_fl.js";
6
+ import { inject as c } from "vue";
7
+ function u(n) {
8
+ return async ({ reportIds: a }) => {
9
+ if (a.length === 0) throw new s("缺少报表 ID");
9
10
  const r = [];
10
11
  for (const o of a) {
11
12
  const e = n[o];
12
- if (!e) throw new t(`本地模板 ${o} 不存在`);
13
- const { plan: i, warnings: s } = p(e.template, e.datasets ?? {});
14
- s.length > 0 && console.warn("[mach-report] 分页告警:", s), r.push(...i.pages);
13
+ if (!e) throw new s(`本地模板 ${o} 不存在`);
14
+ const { plan: i, warnings: t } = p(e.template, e.datasets ?? {});
15
+ t.length > 0 && console.warn("[mach-report] 分页告警:", t), r.push(...i.pages);
15
16
  }
16
- return { schemaVersion: "mach-local", pages: r };
17
+ return { schemaVersion: R, pages: r };
17
18
  };
18
19
  }
19
- function P() {
20
- return l(c, null);
20
+ function _() {
21
+ return c(E, null);
21
22
  }
22
23
  export {
23
- T as DEFAULT_MESSAGES,
24
- _ as DEFAULT_THEME,
25
- N as MACH_REPORT_CONFIG_KEY,
26
- c as MACH_REPORT_CONTROLLER_KEY,
27
- y as MACH_REPORT_FETCHER_KEY,
28
- U as MACH_REPORT_PDF_EXPORTER_KEY,
29
- d as MachReportError,
30
- V as MachReportPreview,
31
- t as PlanLoadError,
32
- g as ReportParamPanel,
33
- M as ReportPreview,
34
- C as ReportToolbar,
35
- w as SILENT_LOGGER,
36
- O as buildPrintDocument,
37
- D as buildWordHtml,
38
- F as createDefaultPdfExporter,
39
- W as createFetchRequest,
40
- k as createJh4jGridPlanFetcher,
41
- f as createLocalFetcher,
42
- L as defineMachReportConfig,
43
- A as defineMachReportPreset,
44
- q as joinTempIds,
45
- z as machReportPlugin,
46
- J as normalizeTempIds,
47
- H as printPlans,
48
- b as provideMachReportConfig,
49
- j as resolveConfig,
50
- v as themeToCssVars,
51
- x as toErrorDetail,
52
- G as useMachReportConfig,
53
- S as usePageWindow,
54
- I as usePrintExport,
55
- P as useReportPreview,
56
- K as useZoom
24
+ d as DEFAULT_MESSAGES,
25
+ g as DEFAULT_THEME,
26
+ W as MACH_REPORT_CONFIG_KEY,
27
+ E as MACH_REPORT_CONTROLLER_KEY,
28
+ k as MACH_REPORT_FETCHER_KEY,
29
+ z as MACH_REPORT_PDF_EXPORTER_KEY,
30
+ T as MachReportError,
31
+ X as MachReportPreview,
32
+ s as PlanLoadError,
33
+ C as ReportParamPanel,
34
+ w as ReportPreview,
35
+ O as ReportToolbar,
36
+ A as SILENT_LOGGER,
37
+ D as buildPrintDocument,
38
+ L as buildWordHtml,
39
+ H as createDefaultPdfExporter,
40
+ F as createFetchRequest,
41
+ u as createLocalFetcher,
42
+ S as defineMachReportConfig,
43
+ N as defineMachReportPreset,
44
+ b as joinReportIds,
45
+ Z as machReportPlugin,
46
+ v as normalizeReportIds,
47
+ x as printPlans,
48
+ I as provideMachReportConfig,
49
+ G as resolveConfig,
50
+ K as themeToCssVars,
51
+ Y as toErrorDetail,
52
+ j as useMachReportConfig,
53
+ V as usePageWindow,
54
+ q as usePrintExport,
55
+ _ as useReportPreview,
56
+ y as useZoom
57
57
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@agile-team/mach-report",
3
- "version": "1.2.1",
4
- "description": "MachReport 报表引擎单包:RenderPlan 模型 + 分页 + DOM/Canvas/PDF 渲染 + 动态 SQL + 管理端 API + Vue 3 契约组件(零运行时依赖;./vue 为框架子路径,vue 为可选 peer)",
3
+ "version": "2.0.0",
4
+ "description": "独立的 TypeScript 报表引擎:模板分页、DOM/Canvas/PDF/Excel 输出与 Vue 3 预览组件",
5
5
  "type": "module",
6
6
  "sideEffects": [
7
7
  "**/*.css",
@@ -40,16 +40,6 @@
40
40
  "default": "./dist/sql.cjs"
41
41
  }
42
42
  },
43
- "./manager": {
44
- "import": {
45
- "types": "./dist/manager.d.ts",
46
- "default": "./dist/manager.js"
47
- },
48
- "require": {
49
- "types": "./dist/manager.d.cts",
50
- "default": "./dist/manager.cjs"
51
- }
52
- },
53
43
  "./vue": {
54
44
  "import": {
55
45
  "types": "./dist/vue/index.d.ts",
@@ -1,6 +0,0 @@
1
- "use strict";var ot=Object.create;var Pe=Object.defineProperty;var rt=Object.getOwnPropertyDescriptor;var at=Object.getOwnPropertyNames;var lt=Object.getPrototypeOf,st=Object.prototype.hasOwnProperty;var it=(t,n,l,a)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of at(n))!st.call(t,r)&&r!==l&&Pe(t,r,{get:()=>n[r],enumerable:!(a=rt(n,r))||a.enumerable});return t};var xe=(t,n,l)=>(l=t!=null?ot(lt(t)):{},it(n||!t||!t.__esModule?Pe(l,"default",{value:t,enumerable:!0}):l,t));const e=require("vue"),O=require("@agile-team/mach-report"),W=require("./plugin-C4qpbdMJ.cjs");function Be(t,n,l={}){const a=l.pxPerMm??3.7795275590551185,r=e.computed(()=>Math.max(0,e.unref(l.gapPx)??18)),o=e.ref(0),i=e.ref(800),p=e.computed(()=>(t.value?.pages??[]).map(P=>P.pageHeightMm*a)),c=e.computed(()=>{const P=t.value?.pages??[];let w=0,k=0;for(const C of P)w+=C.pageHeightMm*a+r.value,k=Math.max(k,C.pageWidthMm*a);return{w:k,h:w}}),f=e.computed(()=>O.computePageWindow({pageHeightsPx:p.value,viewportHeightPx:i.value/n.value,scrollTopPx:o.value/n.value,overscan:1,gapPx:r.value})),m=e.computed(()=>{const P=t.value;if(!P)return[];const{start:w,end:k}=f.value;return k<w?[]:P.pages.slice(w,k+1).map((C,R)=>({page:C,index:w+R}))});function v(P,w){let k=0;return C=>{k||(k=requestAnimationFrame(()=>{if(k=0,o.value=C.scrollTop,i.value=C.clientHeight||800,w.value<=0)return;const R=C.querySelectorAll(".mrp-page-holder");if(!R.length)return;const u=C.getBoundingClientRect().top+56;let h=1;R.forEach(d=>{d.getBoundingClientRect().top<=u&&(h=Number(d.dataset.page??1))}),P.value=Math.max(1,Math.min(w.value,h))}))}}return{contentSize:c,windowRange:f,visiblePages:m,makeScrollHandler:v,refreshViewport(P){P&&(i.value=P.clientHeight||800)}}}function $e(t){const n=e.ref(1),l=e.ref("fit");function a(){requestAnimationFrame(()=>{const o=t();!o||!o.viewport||(n.value=Math.min(1,Math.max(.3,(o.viewport.clientWidth-48)/Math.max(1,o.pageWidthPx))))})}function r(o){o==="fit"?(l.value="fit",a()):(l.value="raw",n.value=o/100)}return{zoom:n,zoomMode:l,applyFitZoom:a,setZoom:r}}const _=8;function ee(){return new Promise(t=>setTimeout(t,0))}function Q(t){return`p${Math.round(t.pageWidthMm)}x${Math.round(t.pageHeightMm)}`}function ce(t){const n=new Map;return t.pages.forEach(r=>{n.has(Q(r))||n.set(Q(r),r)}),`<!doctype html><html><head><meta charset="utf-8"><style>${`.mr-page{margin:0 auto;page-break-after:always;}
2
- .mr-page tr{break-inside:avoid;page-break-inside:avoid;}
3
- .mr-comp{break-inside:avoid;page-break-inside:avoid;}
4
- ${[...n.values()].map(r=>`@page ${Q(r)}{size:${Math.round(r.pageWidthMm)}mm ${Math.round(r.pageHeightMm)}mm;margin:0;}`).join(`
5
- `)}
6
- body{margin:0;background:#fff;}`}</style></head><body>`}function de(t){const n=O.renderPage(t,96,{},document);return n.style.page=Q(t),n.outerHTML}function me(t){return{head:ce(t),pageChunks:t.pages.map(de)}}async function ut(t,n={}){const l={schemaVersion:"mach-report-batch-print",pages:t.flatMap(i=>i.pages)};if(l.pages.length===0)return;const a=ce(l),r=document.createElement("iframe");r.style.cssText="position:fixed;right:0;bottom:0;width:0;height:0;border:0;visibility:hidden;",document.body.appendChild(r);let o=!1;try{const i=r.contentDocument;i.open(),i.write(a);for(let p=0;p<l.pages.length;p++)i.write(de(l.pages[p])),p%_===_-1&&(n.onProgress?.(p+1,l.pages.length),await ee());i.write("</body></html>"),i.close(),await ee(),n.onProgress?.(l.pages.length,l.pages.length),o=!0,r.contentWindow?.focus(),r.contentWindow?.print()}catch(i){n.onError?.(i instanceof Error?`批量打印失败: ${i.message}`:"批量打印失败")}finally{o?setTimeout(()=>r.remove(),6e4):r.remove()}}function Me(t){const{head:n,pageChunks:l}=me(t);return{html:`${`<!doctype html><html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40"><head><meta charset="utf-8"><!--[if gte mso 9]><xml><w:WordDocument><w:View>Print</w:View><w:Zoom>100</w:Zoom></w:WordDocument></xml><![endif]-->${n.replace(/^<!doctype html><html><head>/,"")}`}${l.join("")}</body></html>`,filename:"mach-report.doc"}}function Se(t,n){let l=null,a=!1,r=null,o=null,i=null;function p(){l?.remove(),l=null}function c(u,h){const d=URL.createObjectURL(u),g=document.createElement("a");g.href=d,g.download=h,g.click(),setTimeout(()=>URL.revokeObjectURL(d),1e4)}async function f(){if(a)return;const u=t.value;if(!u||u.pages.length===0)return;a=!0,p();const h=ce(u);l=document.createElement("iframe"),l.style.cssText="position:fixed;right:0;bottom:0;width:0;height:0;border:0;visibility:hidden;",document.body.appendChild(l);const d=l;try{const g=d.contentDocument;g.open(),g.write(h);for(let b=0;b<u.pages.length;b++)if(g.write(de(u.pages[b])),b%_===_-1&&await ee(),d!==l)return;g.write("</body></html>"),g.close(),await ee(),d.contentWindow?.focus(),d.contentWindow?.print()}catch{n.onError("调用打印失败,请改用导出 PDF")}finally{a=!1}}function m(u){if(r?.plan===u)return r.promise;const h=n.getPdfExporter()(u,n.onWarning).finally(()=>{r?.promise===h&&(r=null)});return r={plan:u,promise:h},h}async function v(){const u=t.value;if(!u||u.pages.length===0)return;if(o?.plan===u)return o.promise;n.onBusy?.("PDF");const h={},d=(async()=>{try{const g=await m(u);if(t.value!==u)return;c(new Blob([g],{type:"application/pdf"}),"mach-report.pdf")}catch(g){n.onError(g instanceof Error?`PDF 导出失败: ${g.message}`:"PDF 导出失败","pdf")}finally{n.onBusy?.(null),o?.token===h&&(o=null)}})();return o={plan:u,promise:d,token:h},d}async function P(){const u=t.value;if(!(!u||u.pages.length===0)){n.onBusy?.("Excel");try{const{renderPlanToXlsx:h}=await import("@agile-team/mach-report/xlsx"),{buffer:d,warnings:g}=await h(u);if(t.value!==u)return;g.length>0&&n.onWarning?.(`Excel 有 ${g.length} 处内容未导出:${g.slice(0,2).join(";")}`),c(new Blob([d],{type:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}),"mach-report.xlsx")}catch(h){n.onError(h instanceof Error?`Excel 导出失败: ${h.message}`:"Excel 导出失败","export")}finally{n.onBusy?.(null)}}}async function w(){const u=t.value;if(!u||u.pages.length===0)return;if(i?.plan===u)return i.promise;n.onBusy?.("图片");const h={},d=(async()=>{try{const{blobs:g}=await O.renderPlanToImages(u,{dpr:Math.min(2,typeof devicePixelRatio=="number"?devicePixelRatio:1)});if(t.value!==u)return;g.forEach((b,B)=>{c(b,g.length>1?`mach-report-page-${B+1}.png`:"mach-report.png")})}catch(g){n.onError(g instanceof Error?`图片导出失败: ${g.message}`:"图片导出失败","export")}finally{n.onBusy?.(null),i?.token===h&&(i=null)}})();return i={plan:u,promise:d,token:h},d}function k(){const u=t.value;if(!(!u||u.pages.length===0))try{const{html:h,filename:d}=Me(u);c(new Blob([h],{type:"application/msword;charset=utf-8"}),d)}catch(h){n.onError(h instanceof Error?`Word 导出失败: ${h.message}`:"Word 导出失败","export")}}function C(u){const h=t.value;if(!h||h.pages.length===0)return;if(u==="pdf"){v();return}if(u==="xlsx"||u==="excel"){P();return}if(u==="png"||u==="image"){w();return}if(u==="word"||u==="doc"){k();return}if(u!=="html"){n.onError(`不支持的导出格式:${u}`,"export");return}const{head:d,pageChunks:g}=me(h),b=`${d}${g.join("")}</body></html>`;c(new Blob([b],{type:"text/html;charset=utf-8"}),"mach-report.html")}function R(){const u=t.value;if(!u||u.pages.length===0)return;const h=window.open("","_blank");if(!h){n.onError("浏览器拦截了弹窗,请允许弹窗后重试");return}m(u).then(d=>{if(t.value!==u){h.close();return}const g=URL.createObjectURL(new Blob([d],{type:"application/pdf"})),b=h.document;b.title="PDF 预览",b.documentElement.style.height="100%",b.body.style.cssText="margin:0;height:100%;";const B=b.createElement("iframe");B.title="PDF 预览",B.style.cssText="display:block;width:100%;height:100%;border:0;",B.src=g,b.body.replaceChildren(B),setTimeout(()=>URL.revokeObjectURL(g),6e4)}).catch(d=>{h.close(),n.onError(d instanceof Error?`PDF 预览失败: ${d.message}`:"PDF 预览失败","pdf")})}return{print:f,exportAs:C,exportImages:w,exportWord:k,openPdfWindow:R,releasePrintFrame:p}}const Re="mrp-hit";function ct(t){t.querySelectorAll(`mark.${Re}`).forEach(l=>{const a=l.parentNode;if(a){for(;l.firstChild;)a.insertBefore(l.firstChild,l);l.remove(),a.normalize()}})}function dt(t,n){const l=n.trim();if(!l)return 0;const a=l.toLowerCase(),r=document.createTreeWalker(t,NodeFilter.SHOW_TEXT,{acceptNode(p){const c=p.parentElement;return!c||c.closest("mark")||/^(SCRIPT|STYLE)$/.test(c.tagName)?NodeFilter.FILTER_REJECT:(p.nodeValue??"").toLowerCase().includes(a)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),o=[];for(let p=r.nextNode();p;p=r.nextNode())o.push(p);let i=0;for(const p of o){const c=p.nodeValue??"",f=c.toLowerCase(),m=p.parentElement;if(!m)continue;const v=document.createDocumentFragment();let P=0,w=f.indexOf(a);for(;w>=0;){w>P&&v.appendChild(document.createTextNode(c.slice(P,w)));const k=document.createElement("mark");k.className=Re,k.textContent=c.slice(w,w+l.length),v.appendChild(k),i++,P=w+l.length,w=f.indexOf(a,P)}P<c.length&&v.appendChild(document.createTextNode(c.slice(P))),m.replaceChild(v,p)}return i}function ke(t,n){let l=0,a=t.toLowerCase().indexOf(n);for(;a>=0;)l++,a=t.toLowerCase().indexOf(n,a+n.length);return l}function mt(t){const{plan:n,gotoPage:l,highlight:a,clearHighlights:r}=t,o=t.debounceMs??200,i=e.ref(!1),p=e.ref(""),c=e.ref(""),f=e.ref(0);let m=null;const v=e.computed(()=>{const d=p.value.trim().toLowerCase(),g=n.value;if(!d||!g)return[];const b=[];return g.pages.forEach((B,G)=>{for(const D of B.components)if(D.grid){for(const z of D.grid.cells??[])for(const A of z??[])if(typeof A?.text=="string")for(let Z=0;Z<ke(A.text,d);Z++)b.push(G)}else if(D.kind==="text"&&typeof D.text=="string")for(let z=0;z<ke(D.text,d);z++)b.push(G)}),b}),P=e.computed(()=>v.value.length);function w(d){if(c.value=d,m&&clearTimeout(m),d.trim()===""){m=null,p.value="",f.value=0;return}m=setTimeout(()=>{m=null,p.value=c.value,f.value=0;const g=v.value[0];g!=null&&l(g+1)},o)}function k(d){const g=v.value.length;g!==0&&(f.value=(f.value+d+g)%g,l(v.value[f.value]+1))}function C(){i.value=!i.value}function R(d){const g=p.value.trim();g&&a(d,g)}function u(d){r(d)}function h(){c.value="",p.value="",f.value=0,m&&clearTimeout(m),m=null}return{visible:i,query:p,matchIndex:f,matchCount:P,toggle:C,onInput:w,onNav:k,apply:R,clear:u,reset:h}}function pt(t,n){const l=e.computed(()=>{if(t.value)return!0;if(typeof location>"u")return!1;try{return new URLSearchParams(location.search).get("mrp-debug")==="1"}catch{return!1}}),a=e.computed(()=>!l.value||!n.plan.value?0:Math.round(JSON.stringify(n.plan.value).length/1024)),r=e.computed(()=>!l.value||!n.plan.value?null:{pages:n.pageCount.value,window:`${n.windowRange.value.start}-${n.windowRange.value.end}`,zoom:`${Math.round(n.zoom.value*100)}%`,loadMs:`${n.loadMs.value}ms`,planKB:a.value});return{enabled:l,debugStats:r}}function ft(t,n){const{thumbsRoot:l,visible:a,renderThumbCanvas:r}=n;let o=null;function i(f,m){if(!t.value||f.childElementCount>0)return;const v=r(m);v&&(v.style.width="100%",v.style.height="100%",v.style.display="block",f.appendChild(v))}return{schedule:()=>{!a.value||!t.value||!l.value||typeof IntersectionObserver>"u"||(o?.disconnect(),o=new IntersectionObserver(f=>{for(const m of f){if(!m.isIntersecting)continue;const v=m.target;i(v,Number(v.dataset.thumb??1)-1),o?.unobserve(v)}},{root:l.value,rootMargin:"200px"}),l.value.querySelectorAll("[data-thumb]").forEach(f=>{o.observe(f)}))},destroy:()=>{o?.disconnect(),o=null}}}function gt(){const t=e.shallowRef(0);return{loadMs:t,start(){return typeof performance<"u"?performance.now():0},end(n){t.value=n?Math.round(performance.now()-n):0}}}const vt={class:"mrp-toolbar"},ht={class:"mrp-title"},yt=["disabled"],wt={class:"mrp-pageinfo"},bt=["disabled"],Et={key:1,class:"mrp-search"},Pt=["placeholder","value"],xt={key:0,class:"mrp-search-count"},kt=["disabled"],Ct=["disabled"],Bt=e.defineComponent({__name:"ReportToolbar",props:{pageCount:{},currentPage:{},zoomMode:{},zoom:{},showExport:{type:Boolean},showPrint:{type:Boolean},showPdfWindow:{type:Boolean},messages:{},search:{},thumbsVisible:{type:Boolean}},emits:["goto","zoom","export","print","pdf-window","search-input","search-nav","search-toggle","thumbs-toggle"],setup(t){const n=t,l=e.ref(null);e.watch(()=>n.search.visible,r=>{r&&e.nextTick(()=>l.value?.focus())});function a(r,o,i){return r.replace("{cur}",String(o)).replace("{total}",String(i))}return(r,o)=>(e.openBlock(),e.createElementBlock("div",vt,[e.createElementVNode("span",ht,e.toDisplayString(t.messages.title),1),t.pageCount>0?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createElementVNode("button",{class:"mrp-nav",type:"button",disabled:t.currentPage<=1,onClick:o[0]||(o[0]=i=>r.$emit("goto",t.currentPage-1))},e.toDisplayString(t.messages.prevPage),9,yt),e.createElementVNode("span",wt,e.toDisplayString(a(t.messages.pageInfo,t.currentPage,t.pageCount)),1),e.createElementVNode("button",{class:"mrp-nav",type:"button",disabled:t.currentPage>=t.pageCount,onClick:o[1]||(o[1]=i=>r.$emit("goto",t.currentPage+1))},e.toDisplayString(t.messages.nextPage),9,bt)],64)):e.createCommentVNode("",!0),o[17]||(o[17]=e.createElementVNode("span",{class:"mrp-spacer"},null,-1)),t.search.visible?(e.openBlock(),e.createElementBlock("div",Et,[e.createElementVNode("input",{ref_key:"searchInputRef",ref:l,class:"mrp-search-input",type:"text",placeholder:t.messages.searchPlaceholder,value:t.search.query,onInput:o[2]||(o[2]=i=>r.$emit("search-input",i.target.value))},null,40,Pt),t.search.query?(e.openBlock(),e.createElementBlock("span",xt,e.toDisplayString(a(t.messages.matchInfo,t.search.matchIndex+1,t.search.matchCount)),1)):e.createCommentVNode("",!0),e.createElementVNode("button",{class:"mrp-nav",type:"button",disabled:t.search.matchCount===0,onClick:o[3]||(o[3]=i=>r.$emit("search-nav",-1))},e.toDisplayString(t.messages.prevMatch),9,kt),e.createElementVNode("button",{class:"mrp-nav",type:"button",disabled:t.search.matchCount===0,onClick:o[4]||(o[4]=i=>r.$emit("search-nav",1))},e.toDisplayString(t.messages.nextMatch),9,Ct)])):e.createCommentVNode("",!0),e.createElementVNode("button",{class:e.normalizeClass(["mrp-nav",{"mrp-active":t.search.visible}]),type:"button",title:"Ctrl+F",onClick:o[5]||(o[5]=i=>r.$emit("search-toggle"))}," 🔍 ",2),e.createElementVNode("button",{class:e.normalizeClass(["mrp-nav",{"mrp-active":t.thumbsVisible}]),type:"button",onClick:o[6]||(o[6]=i=>r.$emit("thumbs-toggle"))}," ▦ "+e.toDisplayString(t.messages.thumbnails),3),e.createElementVNode("button",{class:e.normalizeClass(["mrp-nav",{"mrp-active":t.zoomMode==="fit"}]),type:"button",onClick:o[7]||(o[7]=i=>r.$emit("zoom","fit"))},e.toDisplayString(t.messages.fitWidth),3),e.createElementVNode("button",{class:e.normalizeClass(["mrp-nav",{"mrp-active":t.zoomMode==="raw"&&Math.round(t.zoom*100)===100}]),type:"button",onClick:o[8]||(o[8]=i=>r.$emit("zoom",100))}," 100% ",2),e.createElementVNode("button",{class:e.normalizeClass(["mrp-nav",{"mrp-active":t.zoomMode==="raw"&&Math.round(t.zoom*100)===150}]),type:"button",onClick:o[9]||(o[9]=i=>r.$emit("zoom",150))}," 150% ",2),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:2,class:"mrp-nav",type:"button",onClick:o[10]||(o[10]=i=>r.$emit("export","html"))},e.toDisplayString(t.messages.exportHtml),1)):e.createCommentVNode("",!0),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:3,class:"mrp-nav",type:"button",onClick:o[11]||(o[11]=i=>r.$emit("export","pdf"))},e.toDisplayString(t.messages.exportPdf),1)):e.createCommentVNode("",!0),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:4,class:"mrp-nav",type:"button",onClick:o[12]||(o[12]=i=>r.$emit("export","xlsx"))},e.toDisplayString(t.messages.exportExcel),1)):e.createCommentVNode("",!0),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:5,class:"mrp-nav",type:"button",onClick:o[13]||(o[13]=i=>r.$emit("export","png"))},e.toDisplayString(t.messages.exportImage),1)):e.createCommentVNode("",!0),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:6,class:"mrp-nav",type:"button",onClick:o[14]||(o[14]=i=>r.$emit("export","word"))},e.toDisplayString(t.messages.exportWord),1)):e.createCommentVNode("",!0),t.showPrint?(e.openBlock(),e.createElementBlock("button",{key:7,class:"mrp-nav",type:"button",onClick:o[15]||(o[15]=i=>r.$emit("print"))},e.toDisplayString(t.messages.print),1)):e.createCommentVNode("",!0),t.showPdfWindow?(e.openBlock(),e.createElementBlock("button",{key:8,class:"mrp-nav",type:"button",onClick:o[16]||(o[16]=i=>r.$emit("pdf-window"))},e.toDisplayString(t.messages.pdfWindow),1)):e.createCommentVNode("",!0)]))}}),pe=(t,n)=>{const l=t.__vccOpts||t;for(const[a,r]of n)l[a]=r;return l},Te=pe(Bt,[["__scopeId","data-v-48cc0980"]]),$t={class:"mrp-params"},Mt={class:"mrp-params-title"},St={class:"mrp-params-grid"},Rt={class:"mrp-param-label"},Tt={key:0,class:"mrp-param-star"},Nt=["value","onChange"],Dt={value:"",disabled:"",hidden:""},Vt=["value"],Ft=["type","placeholder","value","onInput"],It={class:"mrp-params-actions"},Wt=e.defineComponent({__name:"ReportParamPanel",props:{defs:{},modelValue:{},messages:{},attempted:{type:Boolean}},emits:["update:modelValue","query","reset"],setup(t,{emit:n}){const l=t,a=n,r=e.ref({...l.modelValue});e.watch(()=>l.modelValue,c=>{r.value={...c}});const o=e.computed(()=>l.defs.map(c=>({def:c,label:c.label??c.field,value:r.value[c.field]??""})));function i(c,f){r.value={...r.value,[c]:f},a("update:modelValue",{...r.value})}function p(c){const f=l.defs.find(m=>m.field===c);return l.attempted&&f?.required===!0&&!(r.value[c]??"").trim()}return(c,f)=>(e.openBlock(),e.createElementBlock("div",$t,[e.createElementVNode("span",Mt,e.toDisplayString(t.messages.paramsTitle),1),e.createElementVNode("div",St,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.value,m=>(e.openBlock(),e.createElementBlock("label",{key:m.def.field,class:e.normalizeClass(["mrp-param",{"mrp-param-missing":p(m.def.field)}])},[e.createElementVNode("span",Rt,[e.createTextVNode(e.toDisplayString(m.label),1),m.def.required?(e.openBlock(),e.createElementBlock("i",Tt,"*")):e.createCommentVNode("",!0)]),(m.def.type??"text")==="select"?(e.openBlock(),e.createElementBlock("select",{key:0,class:"mrp-param-input",value:m.value,onChange:v=>i(m.def.field,v.target.value),onKeydown:f[0]||(f[0]=e.withKeys(v=>c.$emit("query"),["enter"]))},[e.createElementVNode("option",Dt,e.toDisplayString(m.def.placeholder??`请选择${m.label}`),1),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(m.def.options??[],v=>(e.openBlock(),e.createElementBlock("option",{key:v.value,value:v.value},e.toDisplayString(v.label),9,Vt))),128))],40,Nt)):(e.openBlock(),e.createElementBlock("input",{key:1,class:"mrp-param-input",type:m.def.type==="number"?"number":m.def.type==="date"?"date":"text",placeholder:m.def.placeholder??`请输入${m.label}`,value:m.value,onInput:v=>i(m.def.field,v.target.value),onKeydown:f[1]||(f[1]=e.withKeys(v=>c.$emit("query"),["enter"]))},null,40,Ft))],2))),128))]),e.createElementVNode("div",It,[e.createElementVNode("button",{class:"mrp-nav mrp-param-query",type:"button",onClick:f[2]||(f[2]=m=>c.$emit("query"))},e.toDisplayString(t.messages.query),1),e.createElementVNode("button",{class:"mrp-nav",type:"button",onClick:f[3]||(f[3]=m=>c.$emit("reset"))},e.toDisplayString(t.messages.reset),1)])]))}}),Ne=pe(Wt,[["__scopeId","data-v-aafce92d"]]),De={title:"报表预览",prevPage:"‹ 上一页",nextPage:"下一页 ›",pageInfo:"{cur} / {total}",fitWidth:"适宽",exportHtml:"导出 HTML",exportPdf:"导出 PDF",exportExcel:"导出 Excel",exportImage:"导出图片",exportWord:"导出 Word",exporting:"正在生成 {format}…",print:"打印",pdfWindow:"PDF 窗口",loading:"报表渲染中…",empty:"暂无预览数据",errorPrefix:"",retry:"重试",searchPlaceholder:"搜索报表内容",matchInfo:"{cur}/{total}",prevMatch:"‹",nextMatch:"›",thumbnails:"缩略图",paramsTitle:"查询条件",query:"查 询",reset:"重 置",paramRequired:"请填写{label}"},Ve={shellBg:"#525659",shellFg:"#e8e8e8",toolbarBg:"#323639",toolbarBorder:"#22252a",toolbarFg:"#e8e8e8",btnFg:"#cfcfcf",btnBorder:"#4a4d52",btnHoverBg:"#414549",btnHoverFg:"#ffffff",btnActiveBg:"#2d5fb8"};function zt(t){return t}function Lt(t){return t}const I={showExport:!0,showPrint:!0,showPdfWindow:!0,showParams:!0,gapPx:18,pdfFontUrl:"/simhei.ttf",logger:console},Ht={warn:()=>{},info:()=>{}};function Fe(t,n){const l=n?t?.presets?.[n]:t?.defaultPreset?t?.presets?.[t.defaultPreset]:void 0,a={...t?.defaults,...l};return{showExport:a.showExport??I.showExport,showPrint:a.showPrint??I.showPrint,showPdfWindow:a.showPdfWindow??I.showPdfWindow,showParams:a.showParams??I.showParams,gapPx:a.gapPx??I.gapPx,pdfFontUrl:a.pdfFontUrl??I.pdfFontUrl,theme:{...Ve,...a.theme},messages:{...De,...a.messages},logger:a.logger??I.logger}}function Ie(t){const n={};return t.shellBg!=null&&(n["--mrp-shell-bg"]=t.shellBg),t.shellFg!=null&&(n["--mrp-shell-fg"]=t.shellFg),t.toolbarBg!=null&&(n["--mrp-toolbar-bg"]=t.toolbarBg),t.toolbarBorder!=null&&(n["--mrp-toolbar-border"]=t.toolbarBorder),t.toolbarFg!=null&&(n["--mrp-toolbar-fg"]=t.toolbarFg),t.btnFg!=null&&(n["--mrp-btn-fg"]=t.btnFg),t.btnBorder!=null&&(n["--mrp-btn-border"]=t.btnBorder),t.btnHoverBg!=null&&(n["--mrp-btn-hover-bg"]=t.btnHoverBg),t.btnHoverFg!=null&&(n["--mrp-btn-hover-fg"]=t.btnHoverFg),t.btnActiveBg!=null&&(n["--mrp-btn-active-bg"]=t.btnActiveBg),n}function Ot(t){const n=e.inject(W.MACH_REPORT_CONFIG_KEY,null),l=e.computed(()=>{const a=n?.value??null,r="defaults"in t&&"presets"in t?t:{defaults:t,presets:{}};return a?{defaults:{...a.defaults,...r.defaults},presets:{...a.presets,...r.presets},defaultPreset:r.defaultPreset??a.defaultPreset}:r});e.provide(W.MACH_REPORT_CONFIG_KEY,l)}function We(){return e.inject(W.MACH_REPORT_CONFIG_KEY,e.computed(()=>null))}function ze(t={fontUrl:"/simhei.ttf"}){let n=null;return async(l,a)=>{n||(n=await import("@agile-team/mach-report/pdf"));const r=t.fontUrl?await n.loadFontWithCache(t.fontUrl):null,{bytes:o,unsupportedTextCount:i,pageErrors:p,fidelityWarnings:c}=await n.renderPlanToPdf(l,r?{customFontBytes:r}:{});if(i>0)throw new Error(`PDF 中有 ${i} 行文字无法编码;请部署支持所用文字的字体并配置 pdfFontUrl`);if(p.length>0)throw new Error(`PDF 有 ${p.length} 页渲染失败:${p[0]}`);return c.length>0&&a?.(`PDF 有 ${c.length} 处版式降级:${c.slice(0,2).join(";")}`),o}}class j extends Error{constructor(n,l,a){super(l),this.name="MachReportError",this.code=n,this.cause=a}}function Le(t){return t instanceof j?{code:t.code,cause:t.cause}:{code:"render",cause:t}}const At={class:"mrp-main"},qt={key:0,class:"mrp-state"},Ut={key:1,class:"mrp-state mrp-error"},Kt={key:2,class:"mrp-state"},jt=["data-page"],Gt=["onClick"],Zt=["data-thumb"],Yt={class:"mrp-thumb-no"},Jt={class:"mrp-overlay"},Xt={key:2,class:"mrp-debug","aria-hidden":"true"},X=96/25.4,Ce="mach-report:ui",Qt=e.defineComponent({__name:"ReportPreview",props:{tempId:{type:[String,Array],default:null},furnitureTempId:{type:String,default:""},params:{type:Object,default:()=>({})},height:{type:String,default:"100vh"},autoLoad:{type:Boolean,default:!0},showExport:{type:Boolean,default:void 0},showPrint:{type:Boolean,default:void 0},showPdfWindow:{type:Boolean,default:void 0},gapPx:{type:Number,default:void 0},messages:{type:Object,default:void 0},preset:{type:String,default:void 0},debug:{type:Boolean,default:!1},paramDefs:{type:Array,default:void 0},showParams:{type:Boolean,default:void 0},fetcher:{type:Function,default:null}},emits:["loaded","error","warning"],setup(t,{expose:n,emit:l}){e.useCssVars(s=>({a2716f8c:C.value+"px"}));const a=t,r=l,o=e.shallowRef(null),i=e.ref(!1),p=e.ref(""),c=e.ref(null),f=e.ref(1),m=e.ref(null),v=e.ref(null),P=e.ref(null),w=e.ref(!1),k=gt(),C=e.computed(()=>Math.max(0,A.value)),R=e.inject(W.MACH_REPORT_FETCHER_KEY,null),u=e.inject(W.MACH_REPORT_PDF_EXPORTER_KEY,null),h=e.computed(()=>W.normalizeTempIds(a.tempId)),d=e.computed(()=>o.value?.pages.length??0),g=We(),b=e.computed(()=>Fe(g.value,a.preset)),B=e.computed(()=>({...b.value.messages,...a.messages})),G=e.computed(()=>a.showExport??b.value.showExport),D=e.computed(()=>a.showPrint??b.value.showPrint),z=e.computed(()=>a.showPdfWindow??b.value.showPdfWindow),A=e.computed(()=>a.gapPx??b.value.gapPx),Z=e.computed(()=>a.showParams??b.value.showParams);let fe=null,te=null;function Oe(){if(u)return u;const s=b.value.pdfFontUrl;return(!te||fe!==s)&&(fe=s,te=ze({fontUrl:s})),te}const V=e.computed(()=>a.paramDefs??[]),F=e.ref({}),ne=e.ref(!1);function Y(s){const y={};for(const E of s)y[E.field]=a.params[E.field]??E.defaultValue??"";F.value=y,ne.value=!1}Y(V.value),e.watch(V,s=>Y(s)),e.watch(()=>JSON.stringify(a.params),()=>Y(V.value));const Ae=e.computed(()=>{const s={...a.params};for(const[y,E]of Object.entries(F.value))E===""?delete s[y]:s[y]=E;return s});function qe(){return V.value.filter(s=>s.required===!0&&!(F.value[s.field]??"").trim())}function Ue(){ne.value=!0;const s=qe();if(s.length>0){const y=s[0].label??s[0].field,E=B.value.paramRequired.replace("{label}",y);p.value=E,r("error",E,{code:"param"});return}N()}function Ke(){Y(V.value)}const je=e.computed(()=>({height:a.height,...Ie(b.value.theme)})),{zoom:S,zoomMode:L,applyFitZoom:ge,setZoom:oe}=$e(()=>({viewport:v.value,pageWidthPx:(o.value?.pages[0]?.pageWidthMm??210)*X})),Ge=Be(o,S,{pxPerMm:X,gapPx:A}),{contentSize:re,windowRange:q,visiblePages:Ze,makeScrollHandler:Ye,refreshViewport:ve}=Ge,Je=Ye(f,d);function ae(s){L.value="raw",S.value=Math.min(3,Math.max(.3,s))}function le(){he(),o.value=null,f.value=1,$.reset()}let J=0;async function N(){const s=++J,y=a.fetcher??R;if(h.value.length===0){p.value="缺少报表模板 ID",le(),r("error",p.value,{code:"param"});return}if(!y){p.value="未提供渲染数据源 fetcher",le(),r("error",p.value,{code:"config"});return}i.value=!0,p.value="",c.value=null,le();const E=k.start();try{const x=await y({tempIds:h.value,furnitureTempId:a.furnitureTempId||void 0,params:{...Ae.value}});if(s!==J)return;const M=O.validateRenderPlan(x);if(!M.ok){const U=M.errors.slice(0,3).map(K=>`${K.path}: ${K.message}`).join("; ");throw new j("validate",`渲染计划校验失败(${M.errors.length} 处): ${U}`)}M.warnings.length>0&&b.value.logger.warn("[mach-report] 渲染计划告警:",M.warnings),o.value=x,f.value=1,k.end(E),v.value&&(v.value.scrollTop=0),L.value==="fit"&&ge(),r("loaded",x.pages.length)}catch(x){if(s!==J)return;const M=x instanceof j?x:new j("fetch",x instanceof Error?x.message:"预览加载失败",x);p.value=M.message,r("error",M.message,Le(M))}finally{s===J&&(i.value=!1)}}function T(s){if(d.value<=0)return;const y=Math.max(1,Math.min(d.value,s));f.value=y;const E=v.value;if(!E)return;let x=0;for(let M=0;M<y-1;M++)x+=(o.value?.pages[M]?.pageHeightMm??0)*X+C.value;E.scrollTop=x*S.value}const{print:se,exportAs:ie,openPdfWindow:ue,releasePrintFrame:he}=Se(o,{getPdfExporter:Oe,onError:(s,y)=>{c.value={kind:"error",message:s},r("error",s,{code:y??"print"})},onWarning:s=>{c.value={kind:"warning",message:s},r("warning",s)},onBusy:s=>{s?c.value={kind:"progress",message:B.value.exporting.replace("{format}",s)}:c.value?.kind==="progress"&&(c.value=null)}});function ye(s,y={}){F.value={...F.value,...s},y.reload!==!1&&N()}const Xe={reload:N,print:se,exportAs:ie,openPdfWindow:ue,gotoPage:T,setParams:ye};e.provide(W.MACH_REPORT_CONTROLLER_KEY,Xe);const $=mt({plan:o,gotoPage:T,highlight:dt,clearHighlights:ct});function Qe(s){s.ctrlKey&&(s.preventDefault(),ae(S.value*(s.deltaY<0?1.1:1/1.1)))}function _e(s){if((s.ctrlKey||s.metaKey)&&s.key.toLowerCase()==="f"){s.preventDefault(),$.visible.value||$.toggle();return}switch(s.key){case"PageDown":s.preventDefault(),T(f.value+1);break;case"PageUp":s.preventDefault(),T(f.value-1);break;case"Home":s.preventDefault(),T(1);break;case"End":s.preventDefault(),T(d.value);break;case"+":case"=":s.preventDefault(),ae(S.value*1.1);break;case"-":s.preventDefault(),ae(S.value/1.1);break}}function et(){try{localStorage.setItem(Ce,JSON.stringify({zoomMode:L.value==="fit"?"fit":Math.round(S.value*100)}))}catch{}}e.watch([L,S],et),e.watchEffect(()=>{const s=o.value;if(!s)return;const y=m.value;if(!y)return;y.querySelectorAll(".mrp-page-holder").forEach(x=>{const M=Number(x.dataset.page??0)-1,U=s.pages[M];if(!U||x.childElementCount>0){if(x.firstElementChild){const Ee=x.firstElementChild;$.clear(Ee),$.apply(Ee)}return}x.style.width=`${U.pageWidthMm*X}px`;const K=O.renderPage(U,96,{},document);$.apply(K),x.appendChild(K)})},{flush:"post"}),e.watch(()=>$.query.value,s=>{s||m.value?.querySelectorAll(".mrp-page-holder").forEach(y=>{$.clear(y)})});const we=ft(o,{thumbsRoot:P,visible:w,renderThumbCanvas:s=>{try{const{canvases:y}=O.renderPlanToCanvas(o.value,{start:s,end:s,dpr:.2});return y[0]??null}catch{return null}}});e.watchEffect(()=>{we.schedule()},{flush:"post"});const tt=e.computed(()=>a.debug),{debugStats:H}=pt(tt,{plan:o,pageCount:d,windowRange:q,zoom:S,loadMs:k.loadMs});function be(){ve(v.value),L.value==="fit"&&ge()}function nt(){try{const s=JSON.parse(localStorage.getItem(Ce)??"{}");s.zoomMode==="fit"?oe("fit"):typeof s.zoomMode=="number"&&oe(s.zoomMode)}catch{}}return e.onMounted(()=>{window.addEventListener("resize",be),ve(v.value),nt(),a.autoLoad&&N()}),e.onUnmounted(()=>{window.removeEventListener("resize",be),we.destroy(),$.reset(),he()}),e.watch(()=>[a.tempId,a.furnitureTempId,JSON.stringify(a.params)],()=>{a.autoLoad&&N()}),e.watch(()=>a.fetcher??R,()=>{a.autoLoad&&N()}),n({reload:N,print:se,exportAs:ie,openPdfWindow:ue,gotoPage:T,setParams:ye}),(s,y)=>(e.openBlock(),e.createElementBlock("div",{class:"mach-report-preview",style:e.normalizeStyle(je.value)},[Z.value&&V.value.length>0?(e.openBlock(),e.createBlock(Ne,{key:0,defs:V.value,modelValue:F.value,"onUpdate:modelValue":y[0]||(y[0]=E=>F.value=E),messages:B.value,attempted:ne.value,onQuery:Ue,onReset:Ke},null,8,["defs","modelValue","messages","attempted"])):e.createCommentVNode("",!0),e.createVNode(Te,{"page-count":d.value,"current-page":f.value,"zoom-mode":e.unref(L),zoom:e.unref(S),"show-export":G.value,"show-print":D.value,"show-pdf-window":z.value,messages:B.value,search:{visible:e.unref($).visible.value,query:e.unref($).query.value,matchIndex:e.unref($).matchIndex.value,matchCount:e.unref($).matchCount.value},"thumbs-visible":w.value,onGoto:T,onZoom:e.unref(oe),onExport:y[1]||(y[1]=E=>e.unref(ie)(E)),onPrint:e.unref(se),onPdfWindow:e.unref(ue),onSearchInput:e.unref($).onInput,onSearchNav:e.unref($).onNav,onSearchToggle:e.unref($).toggle,onThumbsToggle:y[2]||(y[2]=E=>w.value=!w.value)},null,8,["page-count","current-page","zoom-mode","zoom","show-export","show-print","show-pdf-window","messages","search","thumbs-visible","onZoom","onPrint","onPdfWindow","onSearchInput","onSearchNav","onSearchToggle"]),c.value?(e.openBlock(),e.createElementBlock("div",{key:1,class:e.normalizeClass(["mrp-export-notice",`mrp-export-${c.value.kind}`]),role:"alert"},e.toDisplayString(c.value.message),3)):e.createCommentVNode("",!0),e.createElementVNode("div",At,[e.createElementVNode("div",{ref_key:"viewportRef",ref:v,class:"mrp-body",tabindex:"0",onWheel:Qe,onKeydown:_e,onScrollPassive:y[3]||(y[3]=E=>e.unref(Je)(E.target))},[i.value?(e.openBlock(),e.createElementBlock("div",qt,e.toDisplayString(B.value.loading),1)):p.value?(e.openBlock(),e.createElementBlock("div",Ut,[e.createTextVNode(e.toDisplayString(p.value)+" ",1),e.createElementVNode("button",{class:"mrp-retry",type:"button",onClick:N},e.toDisplayString(B.value.retry),1)])):!o.value||d.value===0?(e.openBlock(),e.createElementBlock("div",Kt,e.toDisplayString(B.value.empty),1)):(e.openBlock(),e.createElementBlock("div",{key:3,class:"mrp-scale",style:e.normalizeStyle({width:`${e.unref(re).w*e.unref(S)}px`,height:`${e.unref(re).h*e.unref(S)}px`})},[e.createElementVNode("div",{ref_key:"containerRef",ref:m,class:"mrp-scale-inner",style:e.normalizeStyle({transform:`scale(${e.unref(S)})`,transformOrigin:"top left",width:`${e.unref(re).w}px`})},[e.unref(q).padTopPx>0?(e.openBlock(),e.createElementBlock("div",{key:0,class:"mrp-spacer-top",style:e.normalizeStyle({height:`${e.unref(q).padTopPx}px`}),"aria-hidden":"true"},null,4)):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(Ze),E=>(e.openBlock(),e.createElementBlock("div",{key:E.index,class:"mrp-page-holder","data-page":E.index+1},null,8,jt))),128)),e.unref(q).padBottomPx>0?(e.openBlock(),e.createElementBlock("div",{key:1,class:"mrp-spacer-bottom",style:e.normalizeStyle({height:`${e.unref(q).padBottomPx}px`}),"aria-hidden":"true"},null,4)):e.createCommentVNode("",!0)],4)],4))],544),w.value&&d.value>0?(e.openBlock(),e.createElementBlock("aside",{key:0,ref_key:"thumbsRef",ref:P,class:"mrp-thumbs"},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.value?.pages??[],(E,x)=>(e.openBlock(),e.createElementBlock("div",{key:x,class:e.normalizeClass(["mrp-thumb",{"mrp-thumb-active":x+1===f.value}]),onClick:M=>T(x+1)},[e.createElementVNode("div",{class:"mrp-thumb-box","data-thumb":x+1,style:e.normalizeStyle({height:`${Math.round(E.pageHeightMm/E.pageWidthMm*116)}px`})},null,12,Zt),e.createElementVNode("span",Yt,e.toDisplayString(x+1),1)],10,Gt))),128))],512)):e.createCommentVNode("",!0)]),e.createElementVNode("div",Jt,[e.renderSlot(s.$slots,"default",{},void 0,!0)]),e.unref(H)?(e.openBlock(),e.createElementBlock("div",Xt,[y[4]||(y[4]=e.createElementVNode("div",null,"mach-report debug",-1)),e.createElementVNode("div",null,"pages: "+e.toDisplayString(e.unref(H).pages)+" | window: ["+e.toDisplayString(e.unref(H).window)+"]",1),e.createElementVNode("div",null,"zoom: "+e.toDisplayString(e.unref(H).zoom)+" | load: "+e.toDisplayString(e.unref(H).loadMs),1),e.createElementVNode("div",null,"plan: "+e.toDisplayString(e.unref(H).planKB)+"KB",1)])):e.createCommentVNode("",!0)],4))}}),He=pe(Qt,[["__scopeId","data-v-a0054844"]]),_t=Object.freeze(Object.defineProperty({__proto__:null,default:He},Symbol.toStringTag,{value:"Module"}));exports.DEFAULT_MESSAGES=De;exports.DEFAULT_THEME=Ve;exports.MachReportError=j;exports.ReportParamPanel=Ne;exports.ReportPreview=He;exports.ReportPreview$1=_t;exports.ReportToolbar=Te;exports.SILENT_LOGGER=Ht;exports.buildPrintDocument=me;exports.buildWordHtml=Me;exports.createDefaultPdfExporter=ze;exports.defineMachReportConfig=zt;exports.defineMachReportPreset=Lt;exports.printPlans=ut;exports.provideMachReportConfig=Ot;exports.resolveConfig=Fe;exports.themeToCssVars=Ie;exports.toErrorDetail=Le;exports.useMachReportConfig=We;exports.usePageWindow=Be;exports.usePrintExport=Se;exports.useZoom=$e;