@agile-team/mach-report 1.2.2 → 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.
- package/README.md +62 -70
- package/dist/ReportPreview-Cr0IH1Rz.cjs +6 -0
- package/dist/ReportPreview-DwknBgsJ.js +1266 -0
- package/dist/defaults.d.ts +3 -7
- package/dist/format.d.ts +1 -1
- package/dist/index.cjs +5 -5
- package/dist/index.d.cts +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +621 -758
- package/dist/layout/textwrap.d.ts +1 -1
- package/dist/pdf.cjs +1 -1
- package/dist/pdf.js +1 -1
- package/dist/plugin-Cj3c2wJc.cjs +1 -0
- package/dist/plugin-DJf_6_fl.js +18 -0
- package/dist/schema/render-plan.d.ts +1 -9
- package/dist/sql/expr.d.ts +3 -3
- package/dist/sql.d.cts +1 -1
- package/dist/sql.d.ts +1 -1
- package/dist/style-CFZ-HE2s.cjs +3 -0
- package/dist/{style-6ihHKVCM.js → style-DnmtG7Gl.js} +69 -81
- package/dist/style.css +1 -1
- package/dist/vue/ReportPreview.d.ts +3 -12
- package/dist/vue/adapters.d.ts +6 -12
- package/dist/vue/async.d.cts +7 -22
- package/dist/vue/async.d.ts +7 -22
- package/dist/vue/local-adapter.d.ts +1 -2
- package/dist/vue/plugin.d.ts +12 -34
- package/dist/vue-async.cjs +1 -1
- package/dist/vue-async.js +6 -6
- package/dist/vue.cjs +1 -1
- package/dist/vue.js +48 -48
- package/package.json +2 -12
- package/dist/ReportPreview-CJLvkTVn.cjs +0 -6
- package/dist/ReportPreview-mZiGtf0L.js +0 -1231
- package/dist/compat/jh4j-template.d.ts +0 -12
- package/dist/manager/api.d.ts +0 -45
- package/dist/manager/index.d.ts +0 -2
- package/dist/manager/types.d.ts +0 -50
- package/dist/manager.cjs +0 -1
- package/dist/manager.d.cts +0 -5
- package/dist/manager.d.ts +0 -5
- package/dist/manager.js +0 -104
- package/dist/plugin-C4qpbdMJ.cjs +0 -1
- package/dist/plugin-DcmAPK_K.js +0 -85
- package/dist/style-Xq08-IsV.cjs +0 -3
package/README.md
CHANGED
|
@@ -1,30 +1,29 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
# 📊 MachReport
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**独立的 TypeScript 报表引擎与 Vue 3 预览组件**
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
接入现有 jh4j `gridPlan`,或用本地模板生成报表;共用一份 RenderPlan 输出预览、PDF、Excel 和打印。
|
|
7
|
+
用自己的模板和数据生成报表,或接入项目已有的报表数据接口;统一预览、打印与导出。
|
|
10
8
|
|
|
11
9
|
[](https://www.npmjs.com/package/@agile-team/mach-report)
|
|
12
10
|
[](https://github.com/ChenyCHENYU/MachReport/actions/workflows/ci.yml)
|
|
13
11
|
[](https://www.npmjs.com/package/@agile-team/mach-report)
|
|
14
12
|
|
|
15
|
-
[快速开始](#快速开始) · [
|
|
13
|
+
[快速开始](#快速开始) · [接入项目数据](#接入项目数据) · [能力一览](#能力一览) · [文档](#文档)
|
|
16
14
|
|
|
17
15
|
</div>
|
|
18
16
|
|
|
19
|
-
##
|
|
17
|
+
## MachReport 做什么
|
|
20
18
|
|
|
21
|
-
|
|
|
19
|
+
| 环节 | 能力 |
|
|
22
20
|
| --- | --- |
|
|
23
|
-
|
|
|
24
|
-
|
|
|
25
|
-
|
|
|
21
|
+
| 定义报表 | TypeScript 模板 DSL 或 JSON 模板,支持明细、分组、总计和分页 |
|
|
22
|
+
| 提供数据 | 本地数据集,或由项目实现 `PlanFetcher` 返回 `RenderPlan` |
|
|
23
|
+
| 展示与交互 | Vue 3 预览组件、缩放、搜索、缩略图、参数面板、页级虚拟化 |
|
|
24
|
+
| 输出 | 浏览器打印、PDF、XLSX、逐页图片、Word 兼容文档 |
|
|
26
25
|
|
|
27
|
-
MachReport
|
|
26
|
+
MachReport 不预设网关地址、鉴权方式或报表服务。组件只通过 `fetcher` 获取项目的渲染计划。
|
|
28
27
|
|
|
29
28
|
## 快速开始
|
|
30
29
|
|
|
@@ -34,94 +33,87 @@ MachReport 提供渲染引擎和接入组件;目录、数据源、可视设计
|
|
|
34
33
|
pnpm add @agile-team/mach-report
|
|
35
34
|
```
|
|
36
35
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
**2. 注册插件**(同源部署,浏览器请求已带鉴权)
|
|
36
|
+
**2. 用本地模板注册数据源**
|
|
40
37
|
|
|
41
38
|
```ts
|
|
42
39
|
// main.ts
|
|
43
40
|
import { createApp } from "vue";
|
|
44
41
|
import App from "./App.vue";
|
|
45
|
-
import {
|
|
42
|
+
import { createTemplate } from "@agile-team/mach-report";
|
|
43
|
+
import { createLocalFetcher, machReportPlugin } from "@agile-team/mach-report/vue";
|
|
46
44
|
import "@agile-team/mach-report/vue/style.css";
|
|
47
45
|
|
|
46
|
+
const template = createTemplate()
|
|
47
|
+
.page("a4")
|
|
48
|
+
.text("第一张报表", { leftMm: 20, topMm: 20, widthMm: 100, heightMm: 10 })
|
|
49
|
+
.build();
|
|
50
|
+
|
|
51
|
+
const fetcher = createLocalFetcher({ demo: { template } });
|
|
48
52
|
const app = createApp(App);
|
|
49
|
-
app.use(machReportPlugin);
|
|
53
|
+
app.use(machReportPlugin, { fetcher });
|
|
50
54
|
app.mount("#app");
|
|
51
55
|
```
|
|
52
56
|
|
|
53
|
-
**3.
|
|
57
|
+
**3. 在页面中预览**
|
|
54
58
|
|
|
55
59
|
```vue
|
|
56
60
|
<template>
|
|
57
|
-
<MachReportPreview
|
|
58
|
-
temp-id="CK_TEMPLATE_001"
|
|
59
|
-
:params="{ id: '9' }"
|
|
60
|
-
height="70vh"
|
|
61
|
-
/>
|
|
61
|
+
<MachReportPreview report-id="demo" height="70vh" />
|
|
62
62
|
</template>
|
|
63
63
|
```
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
```ts
|
|
68
|
-
import request from "@/utils/request"; // 宿主项目现有请求客户端
|
|
65
|
+
使用 Vue 组件需要 Vue 3。只使用引擎或 Node.js 导出时,无需导入 `/vue` 子路径。
|
|
69
66
|
|
|
70
|
-
|
|
71
|
-
request,
|
|
72
|
-
baseUrl: "/sub/mach-report",
|
|
73
|
-
pdfFontUrl: "/fonts/NotoSansSC-Regular.ttf"
|
|
74
|
-
});
|
|
75
|
-
```
|
|
67
|
+
## 接入项目数据
|
|
76
68
|
|
|
77
|
-
|
|
69
|
+
项目已有接口时,实现一个 `PlanFetcher`,返回 MachReport 的 `RenderPlan`。接口路径、请求库、鉴权和数据映射都由项目决定:
|
|
78
70
|
|
|
79
|
-
|
|
71
|
+
```ts
|
|
72
|
+
import type { RenderPlan } from "@agile-team/mach-report";
|
|
73
|
+
import type { PlanFetcher } from "@agile-team/mach-report/vue";
|
|
74
|
+
|
|
75
|
+
const fetcher: PlanFetcher = async ({ reportIds, params }) => {
|
|
76
|
+
const response = await fetch("/api/report-plan", {
|
|
77
|
+
method: "POST",
|
|
78
|
+
headers: { "Content-Type": "application/json" },
|
|
79
|
+
body: JSON.stringify({ reportIds, params })
|
|
80
|
+
});
|
|
81
|
+
if (!response.ok) throw new Error(`报表加载失败:HTTP ${response.status}`);
|
|
82
|
+
return (await response.json()) as RenderPlan;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
// 在 main.ts 中替换本地 fetcher 的注册;也可传给单个 ReportPreview。
|
|
86
|
+
app.use(machReportPlugin, { fetcher });
|
|
87
|
+
```
|
|
80
88
|
|
|
81
|
-
|
|
82
|
-
| --- | --- | --- |
|
|
83
|
-
| 同源 jh4j 服务 | 插件默认 fetch | `@agile-team/mach-report/vue` |
|
|
84
|
-
| 宿主网关、鉴权拦截器 | 插件传 `request` / `baseUrl` | `machReportPlugin` |
|
|
85
|
-
| 本地模板与数据 | `createLocalFetcher` | `@agile-team/mach-report/vue` |
|
|
86
|
-
| 自有服务已生成 RenderPlan | 实现 `PlanFetcher` | `@agile-team/mach-report/vue` |
|
|
87
|
-
| 不使用 Vue | 模板、渲染与导出函数 | 主入口及 `/pdf`、`/xlsx` 子路径 |
|
|
89
|
+
`/api/report-plan` 是示例路径,请替换为项目接口。需要从现有业务数据生成 `RenderPlan` 时,可在客户端或服务端调用 `paginateTemplate(template, datasets)`;[API 文档](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/API.md)给出完整类型与示例。
|
|
88
90
|
|
|
89
|
-
|
|
91
|
+
```text
|
|
92
|
+
模板 + 数据 ── paginateTemplate ──┐
|
|
93
|
+
├─ RenderPlan ─┬─ 预览 / 打印
|
|
94
|
+
项目数据接口 ── 自定义 PlanFetcher ┘ ├─ PDF / XLSX
|
|
95
|
+
└─ 图片 / Word 兼容文档
|
|
96
|
+
```
|
|
90
97
|
|
|
91
98
|
## 能力一览
|
|
92
99
|
|
|
93
|
-
|
|
|
100
|
+
| 领域 | 已提供 |
|
|
94
101
|
| --- | --- |
|
|
95
|
-
|
|
|
102
|
+
| 报表语义 | 明细分页、分组小计、总计、页码占位符、列格式化、条件格式 |
|
|
96
103
|
| 预览 | DOM / Canvas、页级虚拟化、缩放、搜索、缩略图、参数面板 |
|
|
97
|
-
|
|
|
98
|
-
|
|
|
99
|
-
|
|
|
100
|
-
|
|
101
|
-
```text
|
|
102
|
-
本地模板 + 数据 ── 分页 ──┐
|
|
103
|
-
├─ RenderPlan ─┬─ 预览 / 打印
|
|
104
|
-
jh4j gridPlan ────────────┘ ├─ PDF / Excel
|
|
105
|
-
└─ 图片 / Word 兼容文档
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
包按子路径拆分:`/vue`、`/pdf`、`/xlsx`、`/sql`、`/manager` 按需导入。主入口只包含框架无关的引擎能力。
|
|
109
|
-
|
|
110
|
-
## 使用边界
|
|
104
|
+
| 导出 | PDF、真正的 `.xlsx`、PNG / JPEG、Word 兼容 HTML `.doc`、逐页打印 |
|
|
105
|
+
| 工程接入 | Vue 插件或局部组件、自定义数据源、结构化错误、导出进度与告警 |
|
|
106
|
+
| 按需入口 | `/vue`、`/pdf`、`/xlsx`、`/sql`;主入口为框架无关的引擎 |
|
|
111
107
|
|
|
112
|
-
|
|
113
|
-
- **导出格式**:XLSX 保留表格数据与结构,不承诺 PDF 式像素排版;`.doc` 是 Word 可打开的 HTML 文档,并非 `.docx`。
|
|
114
|
-
- **性能结论**:仓库里的性能测试是内部回归门槛。与其他报表产品比较,应使用同一模板、数据和环境进行端到端测量。
|
|
115
|
-
- **真实环境验证**:当前仓库缺少已脱敏的真实 `gridPlan` 样本,相关契约测试会跳过;采集和验收步骤见[验收记录](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/comparison-and-acceptance.md)。
|
|
108
|
+
中文 PDF 需配置包含所用汉字的字体 `pdfFontUrl`;缺字时导出会报错。XLSX 保留表格数据与结构,不承诺 PDF 式像素排版;`.doc` 是 Word 可打开的 HTML 文档,并非 `.docx`。
|
|
116
109
|
|
|
117
|
-
##
|
|
110
|
+
## 文档
|
|
118
111
|
|
|
119
|
-
|
|
|
112
|
+
| 入口 | 内容 |
|
|
120
113
|
| --- | --- |
|
|
121
|
-
| [API 速查](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/API.md) |
|
|
122
|
-
| [
|
|
123
|
-
| [
|
|
124
|
-
| [进展记录](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/PROGRESS.md) | 已实现变更与验证记录 |
|
|
114
|
+
| [API 速查](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/API.md) | `RenderPlan`、模板 DSL、Vue 属性与事件、配置、导出 |
|
|
115
|
+
| [最小示例](https://github.com/ChenyCHENYU/MachReport/tree/main/examples/minimal) | 本地报表、多页预览与交互 |
|
|
116
|
+
| [模块联邦示例](https://github.com/ChenyCHENYU/MachReport/tree/main/examples/fed-host) | 远程加载报表组件 |
|
|
125
117
|
|
|
126
118
|
## 本地开发
|
|
127
119
|
|
|
@@ -136,7 +128,7 @@ pnpm build
|
|
|
136
128
|
pnpm exec playwright test
|
|
137
129
|
```
|
|
138
130
|
|
|
139
|
-
|
|
131
|
+
发布与协作约定见 [AGENTS.md](https://github.com/ChenyCHENYU/MachReport/blob/main/AGENTS.md)。
|
|
140
132
|
|
|
141
133
|
## 许可
|
|
142
134
|
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";var at=Object.create;var ke=Object.defineProperty;var lt=Object.getOwnPropertyDescriptor;var st=Object.getOwnPropertyNames;var it=Object.getPrototypeOf,ut=Object.prototype.hasOwnProperty;var ct=(t,n,l,a)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of st(n))!ut.call(t,o)&&o!==l&&ke(t,o,{get:()=>n[o],enumerable:!(a=lt(n,o))||a.enumerable});return t};var Ce=(t,n,l)=>(l=t!=null?at(it(t)):{},ct(n||!t||!t.__esModule?ke(l,"default",{value:t,enumerable:!0}):l,t));const e=require("vue"),H=require("@agile-team/mach-report"),O=require("./plugin-Cj3c2wJc.cjs");function de(t){return t==null?[]:Array.isArray(t)?t.map(String).filter(n=>n!==""):String(t).split(",").map(n=>n.trim()).filter(n=>n!=="")}function dt(t){return de(t).join(",")}class Q extends Error{constructor(n){super(n),this.name="PlanLoadError"}}function mt(t={}){const{baseUrl:n="",headers:l,credentials:a,timeoutMs:o=3e4}=t,r=n.replace(/\/+$/,"");return async({url:i,method:p,params:u})=>{const f=u&&Object.keys(u).length>0?`?${new URLSearchParams(u)}`:"",d=new AbortController,v=setTimeout(()=>d.abort(),o);let b;try{b=await fetch(`${r}${i}${f}`,{method:p.toUpperCase(),headers:{Accept:"application/json",...l},credentials:a,signal:d.signal})}catch(w){throw w instanceof DOMException&&w.name==="AbortError"?new Q(`请求超时(${o}ms): ${i}`):new Q(`请求失败(${i}): ${w instanceof Error?w.message:String(w)}`)}finally{clearTimeout(v)}if(!b.ok)throw new Q(`HTTP ${b.status} ${i}`);return b.json()}}function Re(t,n,l={}){const a=l.pxPerMm??3.7795275590551185,o=e.computed(()=>Math.max(0,e.unref(l.gapPx)??18)),r=e.ref(0),i=e.ref(800),p=e.computed(()=>(t.value?.pages??[]).map(b=>b.pageHeightMm*a)),u=e.computed(()=>{const b=t.value?.pages??[];let w=0,k=0;for(const C of b)w+=C.pageHeightMm*a+o.value,k=Math.max(k,C.pageWidthMm*a);return{w:k,h:w}}),f=e.computed(()=>H.computePageWindow({pageHeightsPx:p.value,viewportHeightPx:i.value/n.value,scrollTopPx:r.value/n.value,overscan:1,gapPx:o.value})),d=e.computed(()=>{const b=t.value;if(!b)return[];const{start:w,end:k}=f.value;return k<w?[]:b.pages.slice(w,k+1).map((C,M)=>({page:C,index:w+M}))});function v(b,w){let k=0;return C=>{k||(k=requestAnimationFrame(()=>{if(k=0,r.value=C.scrollTop,i.value=C.clientHeight||800,w.value<=0)return;const M=C.querySelectorAll(".mrp-page-holder");if(!M.length)return;const c=C.getBoundingClientRect().top+56;let h=1;M.forEach(m=>{m.getBoundingClientRect().top<=c&&(h=Number(m.dataset.page??1))}),b.value=Math.max(1,Math.min(w.value,h))}))}}return{contentSize:u,windowRange:f,visiblePages:d,makeScrollHandler:v,refreshViewport(b){b&&(i.value=b.clientHeight||800)}}}function Se(t){const n=e.ref(1),l=e.ref("fit");function a(){requestAnimationFrame(()=>{const r=t();!r||!r.viewport||(n.value=Math.min(1,Math.max(.3,(r.viewport.clientWidth-48)/Math.max(1,r.pageWidthPx))))})}function o(r){r==="fit"?(l.value="fit",a()):(l.value="raw",n.value=r/100)}return{zoom:n,zoomMode:l,applyFitZoom:a,setZoom:o}}const ee=8;function te(){return new Promise(t=>setTimeout(t,0))}function _(t){return`p${Math.round(t.pageWidthMm)}x${Math.round(t.pageHeightMm)}`}function me(t){const n=new Map;return t.pages.forEach(o=>{n.has(_(o))||n.set(_(o),o)}),`<!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(o=>`@page ${_(o)}{size:${Math.round(o.pageWidthMm)}mm ${Math.round(o.pageHeightMm)}mm;margin:0;}`).join(`
|
|
5
|
+
`)}
|
|
6
|
+
body{margin:0;background:#fff;}`}</style></head><body>`}function pe(t){const n=H.renderPage(t,96,{},document);return n.style.page=_(t),n.outerHTML}function fe(t){return{head:me(t),pageChunks:t.pages.map(pe)}}async function pt(t,n={}){const l={schemaVersion:"mach-report-batch-print",pages:t.flatMap(i=>i.pages)};if(l.pages.length===0)return;const a=me(l),o=document.createElement("iframe");o.style.cssText="position:fixed;right:0;bottom:0;width:0;height:0;border:0;visibility:hidden;",document.body.appendChild(o);let r=!1;try{const i=o.contentDocument;i.open(),i.write(a);for(let p=0;p<l.pages.length;p++)i.write(pe(l.pages[p])),p%ee===ee-1&&(n.onProgress?.(p+1,l.pages.length),await te());i.write("</body></html>"),i.close(),await te(),n.onProgress?.(l.pages.length,l.pages.length),r=!0,o.contentWindow?.focus(),o.contentWindow?.print()}catch(i){n.onError?.(i instanceof Error?`批量打印失败: ${i.message}`:"批量打印失败")}finally{r?setTimeout(()=>o.remove(),6e4):o.remove()}}function Me(t){const{head:n,pageChunks:l}=fe(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 Te(t,n){let l=null,a=!1,o=null,r=null,i=null;function p(){l?.remove(),l=null}function u(c,h){const m=URL.createObjectURL(c),g=document.createElement("a");g.href=m,g.download=h,g.click(),setTimeout(()=>URL.revokeObjectURL(m),1e4)}async function f(){if(a)return;const c=t.value;if(!c||c.pages.length===0)return;a=!0,p();const h=me(c);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 m=l;try{const g=m.contentDocument;g.open(),g.write(h);for(let E=0;E<c.pages.length;E++)if(g.write(pe(c.pages[E])),E%ee===ee-1&&await te(),m!==l)return;g.write("</body></html>"),g.close(),await te(),m.contentWindow?.focus(),m.contentWindow?.print()}catch{n.onError("调用打印失败,请改用导出 PDF")}finally{a=!1}}function d(c){if(o?.plan===c)return o.promise;const h=n.getPdfExporter()(c,n.onWarning).finally(()=>{o?.promise===h&&(o=null)});return o={plan:c,promise:h},h}async function v(){const c=t.value;if(!c||c.pages.length===0)return;if(r?.plan===c)return r.promise;n.onBusy?.("PDF");const h={},m=(async()=>{try{const g=await d(c);if(t.value!==c)return;u(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),r?.token===h&&(r=null)}})();return r={plan:c,promise:m,token:h},m}async function b(){const c=t.value;if(!(!c||c.pages.length===0)){n.onBusy?.("Excel");try{const{renderPlanToXlsx:h}=await import("@agile-team/mach-report/xlsx"),{buffer:m,warnings:g}=await h(c);if(t.value!==c)return;g.length>0&&n.onWarning?.(`Excel 有 ${g.length} 处内容未导出:${g.slice(0,2).join(";")}`),u(new Blob([m],{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 c=t.value;if(!c||c.pages.length===0)return;if(i?.plan===c)return i.promise;n.onBusy?.("图片");const h={},m=(async()=>{try{const{blobs:g}=await H.renderPlanToImages(c,{dpr:Math.min(2,typeof devicePixelRatio=="number"?devicePixelRatio:1)});if(t.value!==c)return;g.forEach((E,$)=>{u(E,g.length>1?`mach-report-page-${$+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:c,promise:m,token:h},m}function k(){const c=t.value;if(!(!c||c.pages.length===0))try{const{html:h,filename:m}=Me(c);u(new Blob([h],{type:"application/msword;charset=utf-8"}),m)}catch(h){n.onError(h instanceof Error?`Word 导出失败: ${h.message}`:"Word 导出失败","export")}}function C(c){const h=t.value;if(!h||h.pages.length===0)return;if(c==="pdf"){v();return}if(c==="xlsx"||c==="excel"){b();return}if(c==="png"||c==="image"){w();return}if(c==="word"||c==="doc"){k();return}if(c!=="html"){n.onError(`不支持的导出格式:${c}`,"export");return}const{head:m,pageChunks:g}=fe(h),E=`${m}${g.join("")}</body></html>`;u(new Blob([E],{type:"text/html;charset=utf-8"}),"mach-report.html")}function M(){const c=t.value;if(!c||c.pages.length===0)return;const h=window.open("","_blank");if(!h){n.onError("浏览器拦截了弹窗,请允许弹窗后重试");return}d(c).then(m=>{if(t.value!==c){h.close();return}const g=URL.createObjectURL(new Blob([m],{type:"application/pdf"})),E=h.document;E.title="PDF 预览",E.documentElement.style.height="100%",E.body.style.cssText="margin:0;height:100%;";const $=E.createElement("iframe");$.title="PDF 预览",$.style.cssText="display:block;width:100%;height:100%;border:0;",$.src=g,E.body.replaceChildren($),setTimeout(()=>URL.revokeObjectURL(g),6e4)}).catch(m=>{h.close(),n.onError(m instanceof Error?`PDF 预览失败: ${m.message}`:"PDF 预览失败","pdf")})}return{print:f,exportAs:C,exportImages:w,exportWord:k,openPdfWindow:M,releasePrintFrame:p}}const Ne="mrp-hit";function ft(t){t.querySelectorAll(`mark.${Ne}`).forEach(l=>{const a=l.parentNode;if(a){for(;l.firstChild;)a.insertBefore(l.firstChild,l);l.remove(),a.normalize()}})}function gt(t,n){const l=n.trim();if(!l)return 0;const a=l.toLowerCase(),o=document.createTreeWalker(t,NodeFilter.SHOW_TEXT,{acceptNode(p){const u=p.parentElement;return!u||u.closest("mark")||/^(SCRIPT|STYLE)$/.test(u.tagName)?NodeFilter.FILTER_REJECT:(p.nodeValue??"").toLowerCase().includes(a)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),r=[];for(let p=o.nextNode();p;p=o.nextNode())r.push(p);let i=0;for(const p of r){const u=p.nodeValue??"",f=u.toLowerCase(),d=p.parentElement;if(!d)continue;const v=document.createDocumentFragment();let b=0,w=f.indexOf(a);for(;w>=0;){w>b&&v.appendChild(document.createTextNode(u.slice(b,w)));const k=document.createElement("mark");k.className=Ne,k.textContent=u.slice(w,w+l.length),v.appendChild(k),i++,b=w+l.length,w=f.indexOf(a,b)}b<u.length&&v.appendChild(document.createTextNode(u.slice(b))),d.replaceChild(v,p)}return i}function $e(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 vt(t){const{plan:n,gotoPage:l,highlight:a,clearHighlights:o}=t,r=t.debounceMs??200,i=e.ref(!1),p=e.ref(""),u=e.ref(""),f=e.ref(0);let d=null;const v=e.computed(()=>{const m=p.value.trim().toLowerCase(),g=n.value;if(!m||!g)return[];const E=[];return g.pages.forEach(($,G)=>{for(const D of $.components)if(D.grid){for(const I of D.grid.cells??[])for(const A of I??[])if(typeof A?.text=="string")for(let Z=0;Z<$e(A.text,m);Z++)E.push(G)}else if(D.kind==="text"&&typeof D.text=="string")for(let I=0;I<$e(D.text,m);I++)E.push(G)}),E}),b=e.computed(()=>v.value.length);function w(m){if(u.value=m,d&&clearTimeout(d),m.trim()===""){d=null,p.value="",f.value=0;return}d=setTimeout(()=>{d=null,p.value=u.value,f.value=0;const g=v.value[0];g!=null&&l(g+1)},r)}function k(m){const g=v.value.length;g!==0&&(f.value=(f.value+m+g)%g,l(v.value[f.value]+1))}function C(){i.value=!i.value}function M(m){const g=p.value.trim();g&&a(m,g)}function c(m){o(m)}function h(){u.value="",p.value="",f.value=0,d&&clearTimeout(d),d=null}return{visible:i,query:p,matchIndex:f,matchCount:b,toggle:C,onInput:w,onNav:k,apply:M,clear:c,reset:h}}function ht(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)),o=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:o}}function yt(t,n){const{thumbsRoot:l,visible:a,renderThumbCanvas:o}=n;let r=null;function i(f,d){if(!t.value||f.childElementCount>0)return;const v=o(d);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"||(r?.disconnect(),r=new IntersectionObserver(f=>{for(const d of f){if(!d.isIntersecting)continue;const v=d.target;i(v,Number(v.dataset.thumb??1)-1),r?.unobserve(v)}},{root:l.value,rootMargin:"200px"}),l.value.querySelectorAll("[data-thumb]").forEach(f=>{r.observe(f)}))},destroy:()=>{r?.disconnect(),r=null}}}function wt(){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 bt={class:"mrp-toolbar"},Et={class:"mrp-title"},Pt=["disabled"],xt={class:"mrp-pageinfo"},kt=["disabled"],Ct={key:1,class:"mrp-search"},$t=["placeholder","value"],Bt={key:0,class:"mrp-search-count"},Rt=["disabled"],St=["disabled"],Mt=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,o=>{o&&e.nextTick(()=>l.value?.focus())});function a(o,r,i){return o.replace("{cur}",String(r)).replace("{total}",String(i))}return(o,r)=>(e.openBlock(),e.createElementBlock("div",bt,[e.createElementVNode("span",Et,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:r[0]||(r[0]=i=>o.$emit("goto",t.currentPage-1))},e.toDisplayString(t.messages.prevPage),9,Pt),e.createElementVNode("span",xt,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:r[1]||(r[1]=i=>o.$emit("goto",t.currentPage+1))},e.toDisplayString(t.messages.nextPage),9,kt)],64)):e.createCommentVNode("",!0),r[17]||(r[17]=e.createElementVNode("span",{class:"mrp-spacer"},null,-1)),t.search.visible?(e.openBlock(),e.createElementBlock("div",Ct,[e.createElementVNode("input",{ref_key:"searchInputRef",ref:l,class:"mrp-search-input",type:"text",placeholder:t.messages.searchPlaceholder,value:t.search.query,onInput:r[2]||(r[2]=i=>o.$emit("search-input",i.target.value))},null,40,$t),t.search.query?(e.openBlock(),e.createElementBlock("span",Bt,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:r[3]||(r[3]=i=>o.$emit("search-nav",-1))},e.toDisplayString(t.messages.prevMatch),9,Rt),e.createElementVNode("button",{class:"mrp-nav",type:"button",disabled:t.search.matchCount===0,onClick:r[4]||(r[4]=i=>o.$emit("search-nav",1))},e.toDisplayString(t.messages.nextMatch),9,St)])):e.createCommentVNode("",!0),e.createElementVNode("button",{class:e.normalizeClass(["mrp-nav",{"mrp-active":t.search.visible}]),type:"button",title:"Ctrl+F",onClick:r[5]||(r[5]=i=>o.$emit("search-toggle"))}," 🔍 ",2),e.createElementVNode("button",{class:e.normalizeClass(["mrp-nav",{"mrp-active":t.thumbsVisible}]),type:"button",onClick:r[6]||(r[6]=i=>o.$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:r[7]||(r[7]=i=>o.$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:r[8]||(r[8]=i=>o.$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:r[9]||(r[9]=i=>o.$emit("zoom",150))}," 150% ",2),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:2,class:"mrp-nav",type:"button",onClick:r[10]||(r[10]=i=>o.$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:r[11]||(r[11]=i=>o.$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:r[12]||(r[12]=i=>o.$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:r[13]||(r[13]=i=>o.$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:r[14]||(r[14]=i=>o.$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:r[15]||(r[15]=i=>o.$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:r[16]||(r[16]=i=>o.$emit("pdf-window"))},e.toDisplayString(t.messages.pdfWindow),1)):e.createCommentVNode("",!0)]))}}),ge=(t,n)=>{const l=t.__vccOpts||t;for(const[a,o]of n)l[a]=o;return l},De=ge(Mt,[["__scopeId","data-v-48cc0980"]]),Tt={class:"mrp-params"},Nt={class:"mrp-params-title"},Dt={class:"mrp-params-grid"},Vt={class:"mrp-param-label"},Ft={key:0,class:"mrp-param-star"},zt=["value","onChange"],It={value:"",disabled:"",hidden:""},Wt=["value"],Lt=["type","placeholder","value","onInput"],Ht={class:"mrp-params-actions"},Ot=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,o=e.ref({...l.modelValue});e.watch(()=>l.modelValue,u=>{o.value={...u}});const r=e.computed(()=>l.defs.map(u=>({def:u,label:u.label??u.field,value:o.value[u.field]??""})));function i(u,f){o.value={...o.value,[u]:f},a("update:modelValue",{...o.value})}function p(u){const f=l.defs.find(d=>d.field===u);return l.attempted&&f?.required===!0&&!(o.value[u]??"").trim()}return(u,f)=>(e.openBlock(),e.createElementBlock("div",Tt,[e.createElementVNode("span",Nt,e.toDisplayString(t.messages.paramsTitle),1),e.createElementVNode("div",Dt,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.value,d=>(e.openBlock(),e.createElementBlock("label",{key:d.def.field,class:e.normalizeClass(["mrp-param",{"mrp-param-missing":p(d.def.field)}])},[e.createElementVNode("span",Vt,[e.createTextVNode(e.toDisplayString(d.label),1),d.def.required?(e.openBlock(),e.createElementBlock("i",Ft,"*")):e.createCommentVNode("",!0)]),(d.def.type??"text")==="select"?(e.openBlock(),e.createElementBlock("select",{key:0,class:"mrp-param-input",value:d.value,onChange:v=>i(d.def.field,v.target.value),onKeydown:f[0]||(f[0]=e.withKeys(v=>u.$emit("query"),["enter"]))},[e.createElementVNode("option",It,e.toDisplayString(d.def.placeholder??`请选择${d.label}`),1),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.def.options??[],v=>(e.openBlock(),e.createElementBlock("option",{key:v.value,value:v.value},e.toDisplayString(v.label),9,Wt))),128))],40,zt)):(e.openBlock(),e.createElementBlock("input",{key:1,class:"mrp-param-input",type:d.def.type==="number"?"number":d.def.type==="date"?"date":"text",placeholder:d.def.placeholder??`请输入${d.label}`,value:d.value,onInput:v=>i(d.def.field,v.target.value),onKeydown:f[1]||(f[1]=e.withKeys(v=>u.$emit("query"),["enter"]))},null,40,Lt))],2))),128))]),e.createElementVNode("div",Ht,[e.createElementVNode("button",{class:"mrp-nav mrp-param-query",type:"button",onClick:f[2]||(f[2]=d=>u.$emit("query"))},e.toDisplayString(t.messages.query),1),e.createElementVNode("button",{class:"mrp-nav",type:"button",onClick:f[3]||(f[3]=d=>u.$emit("reset"))},e.toDisplayString(t.messages.reset),1)])]))}}),Ve=ge(Ot,[["__scopeId","data-v-aafce92d"]]),Fe={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}"},ze={shellBg:"#525659",shellFg:"#e8e8e8",toolbarBg:"#323639",toolbarBorder:"#22252a",toolbarFg:"#e8e8e8",btnFg:"#cfcfcf",btnBorder:"#4a4d52",btnHoverBg:"#414549",btnHoverFg:"#ffffff",btnActiveBg:"#2d5fb8"};function At(t){return t}function qt(t){return t}const z={showExport:!0,showPrint:!0,showPdfWindow:!0,showParams:!0,gapPx:18,pdfFontUrl:"/simhei.ttf",logger:console},Ut={warn:()=>{},info:()=>{}};function Ie(t,n){const l=n?t?.presets?.[n]:t?.defaultPreset?t?.presets?.[t.defaultPreset]:void 0,a={...t?.defaults,...l};return{showExport:a.showExport??z.showExport,showPrint:a.showPrint??z.showPrint,showPdfWindow:a.showPdfWindow??z.showPdfWindow,showParams:a.showParams??z.showParams,gapPx:a.gapPx??z.gapPx,pdfFontUrl:a.pdfFontUrl??z.pdfFontUrl,theme:{...ze,...a.theme},messages:{...Fe,...a.messages},logger:a.logger??z.logger}}function We(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 jt(t){const n=e.inject(O.MACH_REPORT_CONFIG_KEY,null),l=e.computed(()=>{const a=n?.value??null,o="defaults"in t&&"presets"in t?t:{defaults:t,presets:{}};return a?{defaults:{...a.defaults,...o.defaults},presets:{...a.presets,...o.presets},defaultPreset:o.defaultPreset??a.defaultPreset}:o});e.provide(O.MACH_REPORT_CONFIG_KEY,l)}function Le(){return e.inject(O.MACH_REPORT_CONFIG_KEY,e.computed(()=>null))}function He(t={fontUrl:"/simhei.ttf"}){let n=null;return async(l,a)=>{n||(n=await import("@agile-team/mach-report/pdf"));const o=t.fontUrl?await n.loadFontWithCache(t.fontUrl):null,{bytes:r,unsupportedTextCount:i,pageErrors:p,fidelityWarnings:u}=await n.renderPlanToPdf(l,o?{customFontBytes:o}:{});if(i>0)throw new Error(`PDF 中有 ${i} 行文字无法编码;请部署支持所用文字的字体并配置 pdfFontUrl`);if(p.length>0)throw new Error(`PDF 有 ${p.length} 页渲染失败:${p[0]}`);return u.length>0&&a?.(`PDF 有 ${u.length} 处版式降级:${u.slice(0,2).join(";")}`),r}}class K extends Error{constructor(n,l,a){super(l),this.name="MachReportError",this.code=n,this.cause=a}}function Oe(t){return t instanceof K?{code:t.code,cause:t.cause}:{code:"render",cause:t}}const Kt={class:"mrp-main"},Gt={key:0,class:"mrp-state"},Zt={key:1,class:"mrp-state mrp-error"},Yt={key:2,class:"mrp-state"},Jt=["data-page"],Xt=["onClick"],Qt=["data-thumb"],_t={class:"mrp-thumb-no"},en={class:"mrp-overlay"},tn={key:2,class:"mrp-debug","aria-hidden":"true"},X=96/25.4,Be="mach-report:ui",nn=e.defineComponent({__name:"ReportPreview",props:{reportId:{type:[String,Array],default:null},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=>({v0e7a3c30:C.value+"px"}));const a=t,o=l,r=e.shallowRef(null),i=e.ref(!1),p=e.ref(""),u=e.ref(null),f=e.ref(1),d=e.ref(null),v=e.ref(null),b=e.ref(null),w=e.ref(!1),k=wt(),C=e.computed(()=>Math.max(0,A.value)),M=e.inject(O.MACH_REPORT_FETCHER_KEY,null),c=e.inject(O.MACH_REPORT_PDF_EXPORTER_KEY,null),h=e.computed(()=>de(a.reportId)),m=e.computed(()=>r.value?.pages.length??0),g=Le(),E=e.computed(()=>Ie(g.value,a.preset)),$=e.computed(()=>({...E.value.messages,...a.messages})),G=e.computed(()=>a.showExport??E.value.showExport),D=e.computed(()=>a.showPrint??E.value.showPrint),I=e.computed(()=>a.showPdfWindow??E.value.showPdfWindow),A=e.computed(()=>a.gapPx??E.value.gapPx),Z=e.computed(()=>a.showParams??E.value.showParams);let ve=null,ne=null;function qe(){if(c)return c;const s=E.value.pdfFontUrl;return(!ne||ve!==s)&&(ve=s,ne=He({fontUrl:s})),ne}const V=e.computed(()=>a.paramDefs??[]),F=e.ref({}),oe=e.ref(!1);function Y(s){const y={};for(const P of s)y[P.field]=a.params[P.field]??P.defaultValue??"";F.value=y,oe.value=!1}Y(V.value),e.watch(V,s=>Y(s)),e.watch(()=>JSON.stringify(a.params),()=>Y(V.value));const Ue=e.computed(()=>{const s={...a.params};for(const[y,P]of Object.entries(F.value))P===""?delete s[y]:s[y]=P;return s});function je(){return V.value.filter(s=>s.required===!0&&!(F.value[s.field]??"").trim())}function Ke(){oe.value=!0;const s=je();if(s.length>0){const y=s[0].label??s[0].field,P=$.value.paramRequired.replace("{label}",y);p.value=P,o("error",P,{code:"param"});return}N()}function Ge(){Y(V.value)}const Ze=e.computed(()=>({height:a.height,...We(E.value.theme)})),{zoom:S,zoomMode:W,applyFitZoom:he,setZoom:re}=Se(()=>({viewport:v.value,pageWidthPx:(r.value?.pages[0]?.pageWidthMm??210)*X})),Ye=Re(r,S,{pxPerMm:X,gapPx:A}),{contentSize:ae,windowRange:q,visiblePages:Je,makeScrollHandler:Xe,refreshViewport:ye}=Ye,Qe=Xe(f,m);function le(s){W.value="raw",S.value=Math.min(3,Math.max(.3,s))}function se(){we(),r.value=null,f.value=1,B.reset()}let J=0;async function N(){const s=++J,y=a.fetcher??M;if(h.value.length===0){p.value="缺少报表 ID",se(),o("error",p.value,{code:"param"});return}if(!y){p.value="未提供渲染数据源 fetcher",se(),o("error",p.value,{code:"config"});return}i.value=!0,p.value="",u.value=null,se();const P=k.start();try{const x=await y({reportIds:h.value,params:{...Ue.value}});if(s!==J)return;const R=H.validateRenderPlan(x);if(!R.ok){const U=R.errors.slice(0,3).map(j=>`${j.path}: ${j.message}`).join("; ");throw new K("validate",`渲染计划校验失败(${R.errors.length} 处): ${U}`)}R.warnings.length>0&&E.value.logger.warn("[mach-report] 渲染计划告警:",R.warnings),r.value=x,f.value=1,k.end(P),v.value&&(v.value.scrollTop=0),W.value==="fit"&&he(),o("loaded",x.pages.length)}catch(x){if(s!==J)return;const R=x instanceof K?x:new K("fetch",x instanceof Error?x.message:"预览加载失败",x);p.value=R.message,o("error",R.message,Oe(R))}finally{s===J&&(i.value=!1)}}function T(s){if(m.value<=0)return;const y=Math.max(1,Math.min(m.value,s));f.value=y;const P=v.value;if(!P)return;let x=0;for(let R=0;R<y-1;R++)x+=(r.value?.pages[R]?.pageHeightMm??0)*X+C.value;P.scrollTop=x*S.value}const{print:ie,exportAs:ue,openPdfWindow:ce,releasePrintFrame:we}=Te(r,{getPdfExporter:qe,onError:(s,y)=>{u.value={kind:"error",message:s},o("error",s,{code:y??"print"})},onWarning:s=>{u.value={kind:"warning",message:s},o("warning",s)},onBusy:s=>{s?u.value={kind:"progress",message:$.value.exporting.replace("{format}",s)}:u.value?.kind==="progress"&&(u.value=null)}});function be(s,y={}){F.value={...F.value,...s},y.reload!==!1&&N()}const _e={reload:N,print:ie,exportAs:ue,openPdfWindow:ce,gotoPage:T,setParams:be};e.provide(O.MACH_REPORT_CONTROLLER_KEY,_e);const B=vt({plan:r,gotoPage:T,highlight:gt,clearHighlights:ft});function et(s){s.ctrlKey&&(s.preventDefault(),le(S.value*(s.deltaY<0?1.1:1/1.1)))}function tt(s){if((s.ctrlKey||s.metaKey)&&s.key.toLowerCase()==="f"){s.preventDefault(),B.visible.value||B.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(m.value);break;case"+":case"=":s.preventDefault(),le(S.value*1.1);break;case"-":s.preventDefault(),le(S.value/1.1);break}}function nt(){try{localStorage.setItem(Be,JSON.stringify({zoomMode:W.value==="fit"?"fit":Math.round(S.value*100)}))}catch{}}e.watch([W,S],nt),e.watchEffect(()=>{const s=r.value;if(!s)return;const y=d.value;if(!y)return;y.querySelectorAll(".mrp-page-holder").forEach(x=>{const R=Number(x.dataset.page??0)-1,U=s.pages[R];if(!U||x.childElementCount>0){if(x.firstElementChild){const xe=x.firstElementChild;B.clear(xe),B.apply(xe)}return}x.style.width=`${U.pageWidthMm*X}px`;const j=H.renderPage(U,96,{},document);B.apply(j),x.appendChild(j)})},{flush:"post"}),e.watch(()=>B.query.value,s=>{s||d.value?.querySelectorAll(".mrp-page-holder").forEach(y=>{B.clear(y)})});const Ee=yt(r,{thumbsRoot:b,visible:w,renderThumbCanvas:s=>{try{const{canvases:y}=H.renderPlanToCanvas(r.value,{start:s,end:s,dpr:.2});return y[0]??null}catch{return null}}});e.watchEffect(()=>{Ee.schedule()},{flush:"post"});const ot=e.computed(()=>a.debug),{debugStats:L}=ht(ot,{plan:r,pageCount:m,windowRange:q,zoom:S,loadMs:k.loadMs});function Pe(){ye(v.value),W.value==="fit"&&he()}function rt(){try{const s=JSON.parse(localStorage.getItem(Be)??"{}");s.zoomMode==="fit"?re("fit"):typeof s.zoomMode=="number"&&re(s.zoomMode)}catch{}}return e.onMounted(()=>{window.addEventListener("resize",Pe),ye(v.value),rt(),a.autoLoad&&N()}),e.onUnmounted(()=>{window.removeEventListener("resize",Pe),Ee.destroy(),B.reset(),we()}),e.watch(()=>[a.reportId,JSON.stringify(a.params)],()=>{a.autoLoad&&N()}),e.watch(()=>a.fetcher??M,()=>{a.autoLoad&&N()}),n({reload:N,print:ie,exportAs:ue,openPdfWindow:ce,gotoPage:T,setParams:be}),(s,y)=>(e.openBlock(),e.createElementBlock("div",{class:"mach-report-preview",style:e.normalizeStyle(Ze.value)},[Z.value&&V.value.length>0?(e.openBlock(),e.createBlock(Ve,{key:0,defs:V.value,modelValue:F.value,"onUpdate:modelValue":y[0]||(y[0]=P=>F.value=P),messages:$.value,attempted:oe.value,onQuery:Ke,onReset:Ge},null,8,["defs","modelValue","messages","attempted"])):e.createCommentVNode("",!0),e.createVNode(De,{"page-count":m.value,"current-page":f.value,"zoom-mode":e.unref(W),zoom:e.unref(S),"show-export":G.value,"show-print":D.value,"show-pdf-window":I.value,messages:$.value,search:{visible:e.unref(B).visible.value,query:e.unref(B).query.value,matchIndex:e.unref(B).matchIndex.value,matchCount:e.unref(B).matchCount.value},"thumbs-visible":w.value,onGoto:T,onZoom:e.unref(re),onExport:y[1]||(y[1]=P=>e.unref(ue)(P)),onPrint:e.unref(ie),onPdfWindow:e.unref(ce),onSearchInput:e.unref(B).onInput,onSearchNav:e.unref(B).onNav,onSearchToggle:e.unref(B).toggle,onThumbsToggle:y[2]||(y[2]=P=>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"]),u.value?(e.openBlock(),e.createElementBlock("div",{key:1,class:e.normalizeClass(["mrp-export-notice",`mrp-export-${u.value.kind}`]),role:"alert"},e.toDisplayString(u.value.message),3)):e.createCommentVNode("",!0),e.createElementVNode("div",Kt,[e.createElementVNode("div",{ref_key:"viewportRef",ref:v,class:"mrp-body",tabindex:"0",onWheel:et,onKeydown:tt,onScrollPassive:y[3]||(y[3]=P=>e.unref(Qe)(P.target))},[i.value?(e.openBlock(),e.createElementBlock("div",Gt,e.toDisplayString($.value.loading),1)):p.value?(e.openBlock(),e.createElementBlock("div",Zt,[e.createTextVNode(e.toDisplayString(p.value)+" ",1),e.createElementVNode("button",{class:"mrp-retry",type:"button",onClick:N},e.toDisplayString($.value.retry),1)])):!r.value||m.value===0?(e.openBlock(),e.createElementBlock("div",Yt,e.toDisplayString($.value.empty),1)):(e.openBlock(),e.createElementBlock("div",{key:3,class:"mrp-scale",style:e.normalizeStyle({width:`${e.unref(ae).w*e.unref(S)}px`,height:`${e.unref(ae).h*e.unref(S)}px`})},[e.createElementVNode("div",{ref_key:"containerRef",ref:d,class:"mrp-scale-inner",style:e.normalizeStyle({transform:`scale(${e.unref(S)})`,transformOrigin:"top left",width:`${e.unref(ae).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(Je),P=>(e.openBlock(),e.createElementBlock("div",{key:P.index,class:"mrp-page-holder","data-page":P.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&&m.value>0?(e.openBlock(),e.createElementBlock("aside",{key:0,ref_key:"thumbsRef",ref:b,class:"mrp-thumbs"},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.value?.pages??[],(P,x)=>(e.openBlock(),e.createElementBlock("div",{key:x,class:e.normalizeClass(["mrp-thumb",{"mrp-thumb-active":x+1===f.value}]),onClick:R=>T(x+1)},[e.createElementVNode("div",{class:"mrp-thumb-box","data-thumb":x+1,style:e.normalizeStyle({height:`${Math.round(P.pageHeightMm/P.pageWidthMm*116)}px`})},null,12,Qt),e.createElementVNode("span",_t,e.toDisplayString(x+1),1)],10,Xt))),128))],512)):e.createCommentVNode("",!0)]),e.createElementVNode("div",en,[e.renderSlot(s.$slots,"default",{},void 0,!0)]),e.unref(L)?(e.openBlock(),e.createElementBlock("div",tn,[y[4]||(y[4]=e.createElementVNode("div",null,"mach-report debug",-1)),e.createElementVNode("div",null,"pages: "+e.toDisplayString(e.unref(L).pages)+" | window: ["+e.toDisplayString(e.unref(L).window)+"]",1),e.createElementVNode("div",null,"zoom: "+e.toDisplayString(e.unref(L).zoom)+" | load: "+e.toDisplayString(e.unref(L).loadMs),1),e.createElementVNode("div",null,"plan: "+e.toDisplayString(e.unref(L).planKB)+"KB",1)])):e.createCommentVNode("",!0)],4))}}),Ae=ge(nn,[["__scopeId","data-v-249dbb78"]]),on=Object.freeze(Object.defineProperty({__proto__:null,default:Ae},Symbol.toStringTag,{value:"Module"}));exports.DEFAULT_MESSAGES=Fe;exports.DEFAULT_THEME=ze;exports.MachReportError=K;exports.PlanLoadError=Q;exports.ReportParamPanel=Ve;exports.ReportPreview=Ae;exports.ReportPreview$1=on;exports.ReportToolbar=De;exports.SILENT_LOGGER=Ut;exports.buildPrintDocument=fe;exports.buildWordHtml=Me;exports.createDefaultPdfExporter=He;exports.createFetchRequest=mt;exports.defineMachReportConfig=At;exports.defineMachReportPreset=qt;exports.joinReportIds=dt;exports.normalizeReportIds=de;exports.printPlans=pt;exports.provideMachReportConfig=jt;exports.resolveConfig=Ie;exports.themeToCssVars=We;exports.toErrorDetail=Oe;exports.useMachReportConfig=Le;exports.usePageWindow=Re;exports.usePrintExport=Te;exports.useZoom=Se;
|