@agile-team/mach-report 2.3.2 → 2.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/README.md +40 -5
  2. package/dist/ReportPreview-BVTpw9Tb.cjs +6 -0
  3. package/dist/ReportPreview-XF8iSUG1.js +1910 -0
  4. package/dist/grid-geometry-BNIvw52m.cjs +1 -0
  5. package/dist/{grid-geometry-Dw7BlENr.js → grid-geometry-C8hGoe9o.js} +10 -10
  6. package/dist/index.cjs +5 -5
  7. package/dist/index.d.cts +74 -0
  8. package/dist/index.d.ts +74 -0
  9. package/dist/index.js +946 -782
  10. package/dist/number-format-BA_KwrZe.js +55 -0
  11. package/dist/number-format-CZ2T_5kF.cjs +1 -0
  12. package/dist/pdf.cjs +1 -1
  13. package/dist/pdf.d.cts +6 -0
  14. package/dist/pdf.d.ts +6 -0
  15. package/dist/pdf.js +2 -2
  16. package/dist/{plugin-5R00MJQs.js → plugin-CKnSVuVe.js} +1 -1
  17. package/dist/{plugin-2lqgTX26.cjs → plugin-DwKr8oF6.cjs} +1 -1
  18. package/dist/render-plan-CCTL4F9v.cjs +1 -0
  19. package/dist/{render-plan-I9AHvQv7.js → render-plan-CXBWRog4.js} +12 -7
  20. package/dist/style.css +1 -1
  21. package/dist/vue/async.d.cts +598 -1
  22. package/dist/vue/async.d.ts +598 -1
  23. package/dist/vue/index.d.cts +820 -10
  24. package/dist/vue/index.d.ts +820 -10
  25. package/dist/vue-async.cjs +1 -1
  26. package/dist/vue-async.js +3 -3
  27. package/dist/vue.cjs +1 -1
  28. package/dist/vue.js +96 -73
  29. package/dist/xlsx.cjs +24 -24
  30. package/dist/xlsx.d.cts +209 -0
  31. package/dist/xlsx.d.ts +209 -0
  32. package/dist/xlsx.js +9805 -9284
  33. package/package.json +1 -1
  34. package/dist/ReportPreview-B-mwUSk9.cjs +0 -6
  35. package/dist/ReportPreview-DKjr4cwO.js +0 -1688
  36. package/dist/defaults-D4o0NCLo.js +0 -9
  37. package/dist/defaults-DOO1yHwx.cjs +0 -1
  38. package/dist/grid-geometry-bkciiZ4Q.cjs +0 -1
  39. package/dist/render-plan-CfJ3wf1l.cjs +0 -1
package/README.md CHANGED
@@ -4,11 +4,11 @@
4
4
 
5
5
  <p align="center">
6
6
  <strong>面向业务宽表、明细台账与标准打印的 TypeScript 报表引擎</strong><br />
7
- 完整列宽预览 · 连续 Excel · A3 / A4 选配 · 框架无关内核
7
+ 完整列宽预览 · Excel 模板导入 · 可选单元格编辑 · A3 / A4 选配
8
8
  </p>
9
9
 
10
10
  <p align="center">
11
- <img src="https://img.shields.io/badge/source-2.3.2-2563eb" alt="Source version 2.3.2" />
11
+ <img src="https://img.shields.io/badge/source-2.4.1-2563eb" alt="Source version 2.4.1" />
12
12
  <a href="https://www.npmjs.com/package/@agile-team/mach-report"><img src="https://img.shields.io/npm/v/@agile-team/mach-report?label=npm&color=3178c6" alt="npm version" /></a>
13
13
  <a href="https://github.com/ChenyCHENYU/MachReport/actions/workflows/ci.yml"><img src="https://github.com/ChenyCHENYU/MachReport/actions/workflows/ci.yml/badge.svg" alt="CI" /></a>
14
14
  <a href="https://github.com/ChenyCHENYU/MachReport/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-authorization%20required-dc2626" alt="Authorization required" /></a>
@@ -20,6 +20,7 @@
20
20
  <a href="#60-秒开始"><strong>快速开始</strong></a> ·
21
21
  <a href="#完整宽表与标准纸张"><strong>完整宽表</strong></a> ·
22
22
  <a href="#excel-报表能力与边界"><strong>Excel 能力</strong></a> ·
23
+ <a href="#单元格编辑">单元格编辑</a> ·
23
24
  <a href="#对齐与可读性">对齐配置</a> ·
24
25
  <a href="#模板配置与管理扩展">模板管理</a> ·
25
26
  <a href="#接入项目数据">数据接入</a> ·
@@ -42,6 +43,8 @@ MachReport 把模板、数据和输出分开:用 TypeScript DSL 或 JSON 定
42
43
  | 明细与汇总 | 自动折行与分页、重复表头、连续分组小计、末尾总计、页码占位符 |
43
44
  | 数据呈现 | 表头与内容独立对齐、类型自动对齐、数值 / 百分比 / 日期格式化、条件格式 |
44
45
  | 预览交互 | 正文与缩略图双窗口渲染、缩放与适宽、可取消分片搜索、参数面板 |
46
+ | 内容编辑 | 默认只读,按需开启双击编辑;类型校验、异步保存、失败保留原值与输出同步 |
47
+ | Excel 导入 | 多 Sheet、完整宽表、合并单元格、基础样式与缓存公式值转换为可复用模板 |
45
48
  | 模板配置 | 版本化 JSON 文档、导入导出校验、模板目录、异步加载与取消 |
46
49
  | 输出 | 浏览器打印、HTML、PDF、真正的 `.xlsx`、逐页 PNG、Word 兼容 HTML `.doc` |
47
50
  | 工程接入 | 局部组件、全局插件、异步入口、分层配置、结构化错误与导出告警 |
@@ -186,12 +189,43 @@ await writeFile("report.xlsx", new Uint8Array(buffer));
186
189
  | 数字格式 | `raw` 模式沿用小数位、千分位和百分比格式,不猜测文本编号的类型 |
187
190
  | 非表格内容 | 图片、条码、二维码、图表、嵌套组件和无文本回退的富文本等暂不导出,跳过时返回 `warnings` |
188
191
  | 版式与打印 | 普通页面自动识别 A3 / A4 / A5;宽表默认不强制纸型,可选 paperSize,工作表列宽保持完整 |
189
- | Excel 编辑工作流 | 尚无 `.xlsx` 模板导入、交互式工作簿编辑、公式计算或透视表 API |
192
+ | Excel 模板导入 | `.xlsx` 转普通模板,多 Sheet、合并、尺寸、基础样式与原始值;默认完整宽表 |
193
+ | 内容修改 | 预览按需双击编辑;公式格只读且不重算,工作簿编辑器与透视表交互不在当前范围 |
190
194
 
191
195
  列表自动保留原始值,Vue 可在配置中一次启用 `xlsx: { valueMode: "raw" }`;旧计划没有原始值时继续导出显示文本。连续导出使用包内记录的逻辑行与列身份,不按文字猜测重复表头;多报表保持独立 Sheet。显式 continuous 要求可识别的列表结构,不支持的布局会报错。日期对象、公式和自由布局仍需业务明确处理。Excel 不做 PDF 坐标复刻;可使用返回的 ExcelJS `workbook` 继续处理并重新序列化。
192
196
 
193
197
  完整示例、类型保留策略和注意事项见 [Excel 导出指南](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/EXCEL.md)。
194
198
 
199
+ ### 导入 Excel,直接生成报表
200
+
201
+ Vue 组件默认关闭导入入口,增加一个配置即可选择本机文件:
202
+
203
+ ```vue
204
+ <MachReportPreview report-id="production" excel-import />
205
+ ```
206
+
207
+ 独立引擎或 Node.js 使用同一转换 API:
208
+
209
+ ```ts
210
+ import { importExcelTemplate } from "@agile-team/mach-report/xlsx";
211
+ import { paginateTemplate } from "@agile-team/mach-report";
212
+
213
+ const { template, warnings } = await importExcelTemplate(file);
214
+ const { plan } = paginateTemplate(template, {});
215
+ ```
216
+
217
+ 默认导入全部可见 Sheet,以自然列宽生成 wide 报表,也支持 `layout: "a3" / "a4"`、选择 Sheet 和范围。保留已有内容,公式使用 Excel 保存的缓存结果并保持只读;不会执行公式或推断后端字段。未支持内容通过告警报告。资源预算和接入细节见 [Excel 模板导入](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/EXCEL_IMPORT.md)。
218
+
219
+ ## 单元格编辑
220
+
221
+ 报表默认只读。需要修改时开启 `editable`,双击单元格输入,Enter 提交,Esc 取消;打印与导出使用同一份更新后的计划。
222
+
223
+ ```vue
224
+ <MachReportPreview report-id="production" editable />
225
+ ```
226
+
227
+ 本地修改不会写入后台。需要校验、持久化和封月权限时,将 `editable` 改为 `{ canEdit, validate, save }`;包内等待保存成功后再更新,失败保留原值,过期保存不会覆盖新报表。文本编号保持字符串、数值 0 保持数字;表头、汇总和公式默认只读。详细配置与框架无关 API 见 [单元格编辑](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/CELL_EDITING.md)。
228
+
195
229
  ## 对齐与可读性
196
230
 
197
231
  `createTableTemplate()` 提供适合业务报表的默认值,常规列无需逐个配置。表头和内容独立设置,整表配置可被单列覆盖。
@@ -399,7 +433,8 @@ CI 使用同一套校验命令,并在构建后检查实际发布产物。协
399
433
  | 目标 | 入口 |
400
434
  | --- | --- |
401
435
  | 接入与 API | [API 速查](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/API.md):数据模型、模板、Vue 属性 / 事件、配置与导出 |
402
- | Excel | [导出指南](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/EXCEL.md):能力边界、Node 示例与原始数据类型 |
436
+ | Excel | [导出指南](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/EXCEL.md)与[模板导入](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/EXCEL_IMPORT.md):原始类型、宽表与工作簿转换 |
437
+ | 单元格编辑 | [编辑指南](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/CELL_EDITING.md):开关、类型、权限校验、异步保存与输出同步 |
403
438
  | 模板管理 | [扩展指南](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/TEMPLATE_MANAGEMENT.md):JSON 文档、目录、动态版本与后台接入 |
404
439
  | PDF | [字体与导出指南](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/PDF.md):首次诊断、字库部署、缺字与缓存 |
405
440
  | 本地报表 | [最小示例](https://github.com/ChenyCHENYU/MachReport/tree/main/examples/minimal):出库单、工艺卡、多页与多模板预览 |
@@ -413,7 +448,7 @@ CI 使用同一套校验命令,并在构建后检查实际发布产物。协
413
448
 
414
449
  ## 版本与授权
415
450
 
416
- 当前源码版本为 `2.3.2`,以 [`packages/mach-report/package.json`](https://github.com/ChenyCHENYU/MachReport/blob/main/packages/mach-report/package.json) 为准;npm 已发布版本由顶部 npm 标识展示。
451
+ 当前源码版本为 `2.4.1`,以 [`packages/mach-report/package.json`](https://github.com/ChenyCHENYU/MachReport/blob/main/packages/mach-report/package.json) 为准;npm 已发布版本由顶部 npm 标识展示。
417
452
 
418
453
  Copyright © 2026 ChenyCHENYU (Agile Team). All rights reserved.
419
454
 
@@ -0,0 +1,6 @@
1
+ "use strict";var Zt=Object.create;var pt=Object.defineProperty;var Xt=Object.getOwnPropertyDescriptor;var Qt=Object.getOwnPropertyNames;var _t=Object.getPrototypeOf,en=Object.prototype.hasOwnProperty;var tn=(t,n,l,o)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of Qt(n))!en.call(t,r)&&r!==l&&pt(t,r,{get:()=>n[r],enumerable:!(o=Xt(n,r))||o.enumerable});return t};var Ge=(t,n,l)=>(l=t!=null?Zt(_t(t)):{},tn(n||!t||!t.__esModule?pt(l,"default",{value:t,enumerable:!0}):l,t));const e=require("vue"),j=require("@agile-team/mach-report"),gt=require("./page-window-index-DEjnM6IB.cjs"),ht=require("./render-plan-CCTL4F9v.cjs"),fe=require("./plugin-DwKr8oF6.cjs");function Xe(t){return t==null?[]:Array.isArray(t)?t.map(String).filter(n=>n!==""):String(t).split(",").map(n=>n.trim()).filter(n=>n!=="")}function nn(t){return Xe(t).join(",")}class Be extends Error{constructor(n){super(n),this.name="PlanLoadError"}}function rn(t={}){const{baseUrl:n="",headers:l,credentials:o,timeoutMs:r=3e4}=t,a=n.replace(/\/+$/,"");return async({url:s,method:d,params:v,signal:y})=>{let p=`${a}${s}`;if(v&&Object.keys(v).length>0){const w=p.indexOf("#"),B=w>=0?p.slice(w):"",P=w>=0?p.slice(0,w):p,R=P.indexOf("?"),C=R>=0?P.slice(0,R):P,S=new URLSearchParams(R>=0?P.slice(R+1):"");for(const[N,L]of Object.entries(v))S.set(N,L);p=`${C}?${S}${B}`}const m=(w,B)=>{const P=new Be(w);return Object.defineProperty(P,"cause",{value:B,configurable:!0,writable:!0}),P};if(y?.aborted)throw m(`请求已取消: ${s}`,y.reason);const b=new AbortController;let u;const E=()=>{b.signal.aborted||(u="external",b.abort(y?.reason))};y?.addEventListener("abort",E,{once:!0});const k=setTimeout(()=>{b.signal.aborted||(u="timeout",b.abort())},r);try{const w=await fetch(p,{method:d.toUpperCase(),headers:{Accept:"application/json",...l},credentials:o,signal:b.signal});if(!w.ok)throw new Be(`HTTP ${w.status} ${s}`);return await w.json()}catch(w){throw u==="timeout"?m(`请求超时(${r}ms): ${s}`,w):u==="external"?m(`请求已取消: ${s}`,w):w instanceof Be?w:m(`请求失败(${s}): ${w instanceof Error?w.message:String(w)}`,w)}finally{clearTimeout(k),y?.removeEventListener("abort",E)}}}function bt(t,n,l={}){const o=l.pxPerMm??3.7795275590551185,r=e.computed(()=>Math.max(0,e.unref(l.gapPx)??18)),a=e.ref(0),s=e.ref(800),d=e.computed(()=>{const w=t.value?.pages??[];return gt.createPageWindowIndex(w.map(B=>B.pageHeightMm*o),r.value)}),v=e.computed(()=>{let w=0;for(const B of t.value?.pages??[])w=Math.max(w,B.pageWidthMm*o);return{w,h:d.value.totalHeightPx}}),y=e.computed(()=>d.value.window(s.value/n.value,a.value/n.value,e.unref(l.overscan)??1)),p=e.computed(()=>{const w=t.value;if(!w)return[];const{start:B,end:P}=y.value;return w.pages.slice(B,P+1).map((R,C)=>({page:R,index:B+C}))});let m=0,b=!1;function u(w){w&&(a.value=w.scrollTop,s.value=w.clientHeight||800)}function E(w,B){return P=>{m||b||(m=requestAnimationFrame(()=>{if(m=0,b||(u(P),B.value<=0))return;const R=Math.max(0,P.scrollTop+32)/n.value;w.value=Math.min(B.value,d.value.pageAt(R)+1)}))}}function k(){b=!0,m&&cancelAnimationFrame(m),m=0}return e.onScopeDispose(k),{contentSize:v,windowRange:y,visiblePages:p,makeScrollHandler:E,refreshViewport:u,pageOffsetPx:w=>d.value.offsetAt(w),destroy:k}}function yt(t){const n=e.ref(1),l=e.ref("fit");let o=0;function r(){o&&cancelAnimationFrame(o),o=0}function a(){r(),o=requestAnimationFrame(()=>{if(o=0,l.value!=="fit")return;const d=t();!d?.viewport||d.viewport.clientWidth<=48||!Number.isFinite(d.pageWidthPx)||(n.value=Math.min(1,(d.viewport.clientWidth-48)/Math.max(1,d.pageWidthPx)))})}function s(d){if(d==="fit")l.value="fit",a();else{if(!Number.isFinite(d))return;r(),l.value="raw",n.value=Math.min(3,Math.max(.3,d/100))}}return e.getCurrentScope()&&e.onScopeDispose(r),{zoom:n,zoomMode:l,applyFitZoom:a,setZoom:s}}const Me=8;function Fe(){return new Promise(t=>setTimeout(t,0))}function Se(t){return`p${t.pageWidthMm}x${t.pageHeightMm}`.replace(/[.+]/g,"_")}function Qe(t){const n=new Map;return t.pages.forEach(r=>{n.has(Se(r))||n.set(Se(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 ${Se(r)}{size:${r.pageWidthMm}mm ${r.pageHeightMm}mm;margin:0;}`).join(`
5
+ `)}
6
+ body{margin:0;background:#fff;}`}</style></head><body>`}function _e(t){const n=j.renderPage(t,96,{},document);return n.style.page=Se(t),n.outerHTML}function et(t){return{head:Qe(t),pageChunks:t.pages.map(_e)}}async function on(t,n={}){const l={schemaVersion:"mach-report-batch-print",pages:t.flatMap(s=>s.pages)};if(l.pages.length===0)return;const o=Qe(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 a=!1;try{const s=r.contentDocument;s.open(),s.write(o);for(let d=0;d<l.pages.length;d++)s.write(_e(l.pages[d])),d%Me===Me-1&&(n.onProgress?.(d+1,l.pages.length),await Fe());s.write("</body></html>"),s.close(),await Fe(),n.onProgress?.(l.pages.length,l.pages.length),a=!0,r.contentWindow?.focus(),r.contentWindow?.print()}catch(s){n.onError?.(s instanceof Error?`批量打印失败: ${s.message}`:"批量打印失败")}finally{a?setTimeout(()=>r.remove(),6e4):r.remove()}}function wt(t){const{head:n,pageChunks:l}=et(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 xt(t,n){let l=null,o=!1,r=!1,a=0;const s=new Map,d=new Map;let v=null,y=null,p=null,m=null,b=null;function u(c,f){return!r&&t.value===c&&a===f}function E(){if(r)return;const c=[...s.values()].reverse().find(f=>u(f.plan,f.epoch))?.format??null;c!==v&&(v=c,n.onBusy?.(c))}function k(c,f,x){const $={};return s.set($,{plan:c,epoch:f,format:x}),E(),$}function w(c){s.delete(c),E()}function B(){for(const[c,f]of d)u(f.plan,f.epoch)||(c.close(),d.delete(c))}function P(){a++,C(),E(),B()}const R=e.watch(t,P,{flush:"sync"});function C(){l?.remove(),l=null}function S(){r=!0,a++,R(),C(),B(),s.clear(),n.onPrinting?.(!1)}function N(c,f){const x=URL.createObjectURL(c);setTimeout(()=>URL.revokeObjectURL(x),1e4);const $=document.createElement("a");$.href=x,$.download=f,$.click()}async function L(){if(o)return;const c=t.value;if(r||!c||c.pages.length===0)return;const f=a;o=!0,n.onPrinting?.(!0),C();const x=Qe(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 $=l;try{const M=$.contentDocument;M.open(),M.write(x);for(let z=0;z<c.pages.length;z++)if(M.write(_e(c.pages[z])),z%Me===Me-1&&await Fe(),$!==l)return;if(M.write("</body></html>"),M.close(),await Fe(),!u(c,f)||$!==l)return;$.contentWindow?.focus(),$.contentWindow?.print()}catch{$===l&&C(),u(c,f)&&n.onError("调用打印失败,请改用导出 PDF","print")}finally{o=!1,r||n.onPrinting?.(!1)}}function U(c,f){if(y?.plan===c&&y.epoch===f)return y.promise;const x=Promise.resolve().then(()=>{if(!u(c,f))throw new Error("报表已切换或卸载");return n.getPdfExporter()(c,$=>{u(c,f)&&n.onWarning?.($)})}).finally(()=>{y?.promise===x&&(y=null)});return y={plan:c,epoch:f,promise:x},x}async function K(){const c=t.value;if(r||!c||c.pages.length===0)return;const f=a;if(p?.plan===c&&p.epoch===f)return p.promise;const x=k(c,f,"PDF"),$=(async()=>{try{const M=await U(c,f);if(!u(c,f))return;N(new Blob([M],{type:"application/pdf"}),"mach-report.pdf")}catch(M){u(c,f)&&n.onError(M instanceof Error?`PDF 导出失败: ${M.message}`:"PDF 导出失败","pdf")}finally{w(x),p?.token===x&&(p=null)}})();return p={plan:c,epoch:f,promise:$,token:x},$}async function W(){const c=t.value;if(r||!c||c.pages.length===0)return;const f=a;if(m?.plan===c&&m.epoch===f)return m.promise;const x={...n.getXlsxOptions?.()},$=k(c,f,"Excel"),M=(async()=>{try{const{renderPlanToXlsx:z}=await import("@agile-team/mach-report/xlsx");if(!u(c,f))return;const{buffer:G,warnings:Q}=await z(c,x);if(!u(c,f)||(Q.length>0&&n.onWarning?.(`Excel 导出有 ${Q.length} 条提示:${Q.slice(0,2).join(";")}`),!u(c,f)))return;N(new Blob([G],{type:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}),"mach-report.xlsx")}catch(z){u(c,f)&&n.onError(z instanceof Error?`Excel 导出失败: ${z.message}`:"Excel 导出失败","export")}finally{w($),m?.token===$&&(m=null)}})();return m={plan:c,epoch:f,promise:M,token:$},M}async function ee(){const c=t.value;if(r||!c||c.pages.length===0)return;const f=a;if(b?.plan===c&&b.epoch===f)return b.promise;const x=k(c,f,"图片"),$=(async()=>{try{const{blobs:M}=await j.renderPlanToImages(c,{dpr:Math.min(2,typeof devicePixelRatio=="number"?devicePixelRatio:1)});if(!u(c,f))return;M.forEach((z,G)=>{N(z,M.length>1?`mach-report-page-${G+1}.png`:"mach-report.png")})}catch(M){u(c,f)&&n.onError(M instanceof Error?`图片导出失败: ${M.message}`:"图片导出失败","export")}finally{w(x),b?.token===x&&(b=null)}})();return b={plan:c,epoch:f,promise:$,token:x},$}function O(){const c=t.value;if(!(r||!c||c.pages.length===0))try{const{html:f,filename:x}=wt(c);N(new Blob([f],{type:"application/msword;charset=utf-8"}),x)}catch(f){n.onError(f instanceof Error?`Word 导出失败: ${f.message}`:"Word 导出失败","export")}}async function ae(c){const f=t.value;if(!(r||!f||f.pages.length===0)){if(c==="pdf"){await K();return}if(c==="xlsx"||c==="excel"){await W();return}if(c==="png"||c==="image"){await ee();return}if(c==="word"||c==="doc"){O();return}if(c!=="html"){n.onError(`不支持的导出格式:${c}`,"export");return}try{const{head:x,pageChunks:$}=et(f),M=`${x}${$.join("")}</body></html>`;N(new Blob([M],{type:"text/html;charset=utf-8"}),"mach-report.html")}catch(x){n.onError(x instanceof Error?`HTML 导出失败: ${x.message}`:"HTML 导出失败","export")}}}function H(){const c=t.value;if(r||!c||c.pages.length===0)return;const f=a,x=window.open("","_blank");if(!x){n.onError("浏览器拦截了弹窗,请允许弹窗后重试","pdf");return}d.set(x,{plan:c,epoch:f});const $=k(c,f,"PDF");U(c,f).then(M=>{if(!u(c,f)||x.closed){d.delete(x)&&x.close();return}const z=URL.createObjectURL(new Blob([M],{type:"application/pdf"}));setTimeout(()=>URL.revokeObjectURL(z),6e4);const G=x.document;G.title="PDF 预览",G.documentElement.style.height="100%",G.body.style.cssText="margin:0;height:100%;";const Q=G.createElement("iframe");Q.title="PDF 预览",Q.style.cssText="display:block;width:100%;height:100%;border:0;",Q.src=z,G.body.replaceChildren(Q),d.delete(x)}).catch(M=>{x.close(),d.delete(x),u(c,f)&&n.onError(M instanceof Error?`PDF 预览失败: ${M.message}`:"PDF 预览失败","pdf")}).finally(()=>w($))}return{print:L,exportAs:ae,exportImages:ee,exportWord:O,openPdfWindow:H,invalidatePending:P,releasePrintFrame:C,dispose:S}}const Et="mrp-hit";function an(t){t.querySelectorAll(`mark.${Et}`).forEach(l=>{const o=l.parentNode;if(o){for(;l.firstChild;)o.insertBefore(l.firstChild,l);l.remove(),o.normalize()}})}function ln(t,n){const l=n.trim();if(!l)return 0;const o=l.toLowerCase(),r=document.createTreeWalker(t,NodeFilter.SHOW_TEXT,{acceptNode(d){const v=d.parentElement;return!v||v.closest("mark")||/^(SCRIPT|STYLE)$/.test(v.tagName)?NodeFilter.FILTER_REJECT:(d.nodeValue??"").toLowerCase().includes(o)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),a=[];for(let d=r.nextNode();d;d=r.nextNode())a.push(d);let s=0;for(const d of a){const v=d.nodeValue??"",y=v.toLowerCase(),p=d.parentElement;if(!p)continue;const m=document.createDocumentFragment();let b=0,u=y.indexOf(o);for(;u>=0;){u>b&&m.appendChild(document.createTextNode(v.slice(b,u)));const E=document.createElement("mark");E.className=Et,E.textContent=v.slice(u,u+l.length),m.appendChild(E),s++,b=u+l.length,u=y.indexOf(o,b)}b<v.length&&m.appendChild(document.createTextNode(v.slice(b))),p.replaceChild(m,d)}return s}const sn=new Set(["line","rect","ellipse","chart"]);function*un(t){for(const n of t.cells??[])for(const l of n??[])yield l?.text??"",yield*l?.children??[]}function*cn(t){if(ht.isRichText(t))for(const n of t.richParagraphs)for(const l of n.segments??[])yield(l.kind==="field"?l.field:l.text)??"";else t.lines?.length?yield*t.lines:yield t.text??""}function*dn(t){const n=[t.values()];for(;n.length>0;){const l=n[n.length-1].next();if(l.done){n.pop();continue}const o=l.value;if(typeof o=="string"){yield o;continue}yield"",!ht.isImageBackedComponent(o)&&(o.kind==="text"?n.push(cn(o)):o.grid?n.push(un(o.grid)):sn.has(o.kind)||(yield o.fallbackText??""))}}function*fn(t){for(let n=0;n<t.pages.length;n++){for(const l of dn(t.pages[n].components))yield{text:l,pageIndex:n};yield{text:"",pageIndex:n}}}function pn(t,n){const l=t.toLowerCase();let o=0;for(let r=l.indexOf(n);r>=0;r=l.indexOf(n,r+n.length))o++;return o}function mn(t){const{plan:n,gotoPage:l,highlight:o,clearHighlights:r}=t,a=e.ref(!1),s=e.ref(""),d=e.ref(0),v=e.ref(0),y=e.ref(!1);let p=[];const m=e.computed(()=>{if(v.value===0)return null;const C=d.value;let S=0,N=p.length-1;for(;S<N;){const U=S+N>>>1;p[U].cumulative<=C?S=U+1:N=U}const L=p[S];return L?{pageIndex:L.pageIndex,occurrence:C-(p[S-1]?.cumulative??0)}:null});let b=null,u=null,E=0;function k(){E++,b&&clearTimeout(b),u&&clearTimeout(u),b=u=null,y.value=!1}function w(C){s.value=C,d.value=0,v.value=0,p=[],y.value=!1;const S=C.trim().toLowerCase(),N=n.value;if(!S||!N)return;y.value=!0;const L=E,U=fn(N),K=[];let W=0;function ee(){if(u=null,L!==E||N!==n.value)return;const O=performance.now();let ae=0;for(;ae<5e3&&performance.now()-O<4;){const H=U.next();if(H.done){p=K,v.value=W,y.value=!1,p[0]&&l(p[0].pageIndex+1);return}const c=pn(H.value.text,S);if(c>0){W+=c;const f=K[K.length-1];f?.pageIndex===H.value.pageIndex?f.cumulative=W:K.push({pageIndex:H.value.pageIndex,cumulative:W})}ae++}u=setTimeout(ee,0)}ee()}function B(C){if(k(),s.value=C,d.value=v.value=0,p=[],!C.trim()){w("");return}y.value=!0,b=setTimeout(()=>{b=null,w(C)},Math.max(0,e.unref(t.debounceMs)??200))}function P(C){const S=v.value;if(S===0||y.value)return;d.value=(d.value+C+S)%S;const N=m.value;N&&l(N.pageIndex+1)}function R(){k(),s.value="",d.value=v.value=0,p=[]}return e.watch(n,R,{flush:"sync"}),e.onScopeDispose(R),{visible:a,query:s,matchIndex:d,matchCount:v,activeMatch:m,searching:y,toggle:()=>{a.value=!a.value},onInput:B,onNav:P,apply:C=>{s.value.trim()&&o(C,s.value.trim())},clear:C=>{r(C)},reset:R}}function vn(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}}),o=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:o.value});return{enabled:l,debugStats:r}}function gn(t,n){const{thumbsRoot:l,visible:o,renderThumbCanvas:r}=n,a=e.ref(0),s=e.ref(800),d=e.computed(()=>(t.value?.pages??[]).map(P=>Math.round(P.pageHeightMm/P.pageWidthMm*116))),v=e.computed(()=>gt.createPageWindowIndex(d.value.map(P=>P+20),8)),y=e.computed(()=>v.value.window(s.value,a.value,1)),p=e.computed(()=>{if(!o.value)return[];const{start:P,end:R}=y.value;return d.value.slice(P,R+1).map((C,S)=>({index:P+S,height:C}))});let m=0,b=0,u=!1;function E(){const P=l.value;P&&(a.value=P.scrollTop,s.value=P.clientHeight||800)}function k(){u||b||(b=requestAnimationFrame(()=>{b=0,E()}))}function w(){if(p.value,m&&cancelAnimationFrame(m),m=0,u||!o.value||!t.value||!l.value)return;E();const P=p.value,R=t.value,C=l.value;let S=0;function N(){if(m=0,!(u||!o.value||t.value!==R||l.value!==C)){for(let L=0;S<P.length&&L<2;L++,S++){const U=P[S].index,K=C.querySelector(`[data-thumb="${U+1}"]`);if(!K||K.childElementCount>0)continue;const W=r(U);W&&(W.style.width="100%",W.style.height="100%",W.style.display="block",K.appendChild(W))}S<P.length&&(m=requestAnimationFrame(N))}}m=requestAnimationFrame(N)}function B(){u=!0,m&&cancelAnimationFrame(m),b&&cancelAnimationFrame(b),m=b=0}return e.onScopeDispose(B),{schedule:w,destroy:B,onScroll:k,windowRange:y,visibleThumbs:p}}function hn(){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 bn={class:"mrp-toolbar"},yn={class:"mrp-title"},wn=["disabled"],xn={class:"mrp-pageinfo"},En=["disabled"],Pn=["disabled"],kn={key:2,class:"mrp-search"},Cn=["placeholder","value"],$n={key:0,class:"mrp-search-count",role:"status"},Bn=["disabled"],Sn=["disabled"],Rn=["disabled"],Mn=["disabled"],Fn=["disabled"],Dn=["disabled"],Tn=["disabled"],Nn=["disabled"],In=["disabled"],Vn=e.defineComponent({__name:"ReportToolbar",props:{pageCount:{},currentPage:{},zoomMode:{},zoom:{},showExport:{type:Boolean},showPrint:{type:Boolean},showPdfWindow:{type:Boolean},messages:{},search:{},thumbsVisible:{type:Boolean},showImport:{type:Boolean},busy:{type:Boolean}},emits:["goto","zoom","export","print","pdf-window","search-input","search-nav","search-toggle","thumbs-toggle","import-excel"],setup(t){const n=t,l=e.ref(null);e.watch(()=>n.search.visible,r=>{r&&e.nextTick(()=>l.value?.focus())});function o(r,a,s){return r.replace("{cur}",String(a)).replace("{total}",String(s))}return(r,a)=>(e.openBlock(),e.createElementBlock("div",bn,[e.createElementVNode("span",yn,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:a[0]||(a[0]=s=>r.$emit("goto",t.currentPage-1))},e.toDisplayString(t.messages.prevPage),9,wn),e.createElementVNode("span",xn,e.toDisplayString(o(t.messages.pageInfo,t.currentPage,t.pageCount)),1),e.createElementVNode("button",{class:"mrp-nav",type:"button",disabled:t.currentPage>=t.pageCount,onClick:a[1]||(a[1]=s=>r.$emit("goto",t.currentPage+1))},e.toDisplayString(t.messages.nextPage),9,En)],64)):e.createCommentVNode("",!0),a[18]||(a[18]=e.createElementVNode("span",{class:"mrp-spacer"},null,-1)),t.showImport?(e.openBlock(),e.createElementBlock("button",{key:1,class:"mrp-nav mrp-import-excel",type:"button",disabled:t.busy,onClick:a[2]||(a[2]=s=>r.$emit("import-excel"))},e.toDisplayString(t.messages.importExcel??"导入 Excel 模板"),9,Pn)):e.createCommentVNode("",!0),t.search.visible?(e.openBlock(),e.createElementBlock("div",kn,[e.createElementVNode("input",{ref_key:"searchInputRef",ref:l,class:"mrp-search-input",type:"text",placeholder:t.messages.searchPlaceholder,value:t.search.query,onInput:a[3]||(a[3]=s=>r.$emit("search-input",s.target.value))},null,40,Cn),t.search.query?(e.openBlock(),e.createElementBlock("span",$n,e.toDisplayString(t.search.searching?t.messages.searching??"搜索中…":o(t.messages.matchInfo,t.search.matchCount>0?t.search.matchIndex+1:0,t.search.matchCount)),1)):e.createCommentVNode("",!0),e.createElementVNode("button",{class:"mrp-nav",type:"button",disabled:t.search.matchCount===0,onClick:a[4]||(a[4]=s=>r.$emit("search-nav",-1))},e.toDisplayString(t.messages.prevMatch),9,Bn),e.createElementVNode("button",{class:"mrp-nav",type:"button",disabled:t.search.matchCount===0,onClick:a[5]||(a[5]=s=>r.$emit("search-nav",1))},e.toDisplayString(t.messages.nextMatch),9,Sn)])):e.createCommentVNode("",!0),e.createElementVNode("button",{class:e.normalizeClass(["mrp-nav",{"mrp-active":t.search.visible}]),type:"button",title:"Ctrl+F",onClick:a[6]||(a[6]=s=>r.$emit("search-toggle"))}," 🔍 ",2),e.createElementVNode("button",{class:e.normalizeClass(["mrp-nav",{"mrp-active":t.thumbsVisible}]),type:"button",onClick:a[7]||(a[7]=s=>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:a[8]||(a[8]=s=>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:a[9]||(a[9]=s=>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:a[10]||(a[10]=s=>r.$emit("zoom",150))}," 150% ",2),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:3,class:"mrp-nav",type:"button",disabled:t.busy,onClick:a[11]||(a[11]=s=>r.$emit("export","html"))},e.toDisplayString(t.messages.exportHtml),9,Rn)):e.createCommentVNode("",!0),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:4,class:"mrp-nav",type:"button",disabled:t.busy,onClick:a[12]||(a[12]=s=>r.$emit("export","pdf"))},e.toDisplayString(t.messages.exportPdf),9,Mn)):e.createCommentVNode("",!0),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:5,class:"mrp-nav",type:"button",disabled:t.busy,onClick:a[13]||(a[13]=s=>r.$emit("export","xlsx"))},e.toDisplayString(t.messages.exportExcel),9,Fn)):e.createCommentVNode("",!0),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:6,class:"mrp-nav",type:"button",disabled:t.busy,onClick:a[14]||(a[14]=s=>r.$emit("export","png"))},e.toDisplayString(t.messages.exportImage),9,Dn)):e.createCommentVNode("",!0),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:7,class:"mrp-nav",type:"button",disabled:t.busy,onClick:a[15]||(a[15]=s=>r.$emit("export","word"))},e.toDisplayString(t.messages.exportWord),9,Tn)):e.createCommentVNode("",!0),t.showPrint?(e.openBlock(),e.createElementBlock("button",{key:8,class:"mrp-nav",type:"button",disabled:t.busy,onClick:a[16]||(a[16]=s=>r.$emit("print"))},e.toDisplayString(t.messages.print),9,Nn)):e.createCommentVNode("",!0),t.showPdfWindow?(e.openBlock(),e.createElementBlock("button",{key:9,class:"mrp-nav",type:"button",disabled:t.busy,onClick:a[17]||(a[17]=s=>r.$emit("pdf-window"))},e.toDisplayString(t.messages.pdfWindow),9,In)):e.createCommentVNode("",!0)]))}}),tt=(t,n)=>{const l=t.__vccOpts||t;for(const[o,r]of n)l[o]=r;return l},Pt=tt(Vn,[["__scopeId","data-v-1c2568a7"]]),On={class:"mrp-params"},zn={class:"mrp-params-title"},Ln={class:"mrp-params-grid"},Wn={class:"mrp-param-label"},An={key:0,class:"mrp-param-star"},Hn=["value","onChange"],qn={value:"",disabled:"",hidden:""},jn=["value"],Un=["type","placeholder","value","onInput"],Kn={class:"mrp-params-actions"},Gn=e.defineComponent({__name:"ReportParamPanel",props:{defs:{},modelValue:{},messages:{},attempted:{type:Boolean}},emits:["update:modelValue","query","reset"],setup(t,{emit:n}){const l=t,o=n,r=e.ref({...l.modelValue});e.watch(()=>l.modelValue,v=>{r.value={...v}});const a=e.computed(()=>l.defs.map(v=>({def:v,label:v.label??v.field,value:r.value[v.field]??""})));function s(v,y){r.value={...r.value,[v]:y},o("update:modelValue",{...r.value})}function d(v){const y=l.defs.find(p=>p.field===v);return l.attempted&&y?.required===!0&&!(r.value[v]??"").trim()}return(v,y)=>(e.openBlock(),e.createElementBlock("div",On,[e.createElementVNode("span",zn,e.toDisplayString(t.messages.paramsTitle),1),e.createElementVNode("div",Ln,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(a.value,p=>(e.openBlock(),e.createElementBlock("label",{key:p.def.field,class:e.normalizeClass(["mrp-param",{"mrp-param-missing":d(p.def.field)}])},[e.createElementVNode("span",Wn,[e.createTextVNode(e.toDisplayString(p.label),1),p.def.required?(e.openBlock(),e.createElementBlock("i",An,"*")):e.createCommentVNode("",!0)]),(p.def.type??"text")==="select"?(e.openBlock(),e.createElementBlock("select",{key:0,class:"mrp-param-input",value:p.value,onChange:m=>s(p.def.field,m.target.value),onKeydown:y[0]||(y[0]=e.withKeys(m=>v.$emit("query"),["enter"]))},[e.createElementVNode("option",qn,e.toDisplayString(p.def.placeholder??`请选择${p.label}`),1),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(p.def.options??[],m=>(e.openBlock(),e.createElementBlock("option",{key:m.value,value:m.value},e.toDisplayString(m.label),9,jn))),128))],40,Hn)):(e.openBlock(),e.createElementBlock("input",{key:1,class:"mrp-param-input",type:p.def.type==="number"?"number":p.def.type==="date"?"date":"text",placeholder:p.def.placeholder??`请输入${p.label}`,value:p.value,onInput:m=>s(p.def.field,m.target.value),onKeydown:y[1]||(y[1]=e.withKeys(m=>v.$emit("query"),["enter"]))},null,40,Un))],2))),128))]),e.createElementVNode("div",Kn,[e.createElementVNode("button",{class:"mrp-nav mrp-param-query",type:"button",onClick:y[2]||(y[2]=p=>v.$emit("query"))},e.toDisplayString(t.messages.query),1),e.createElementVNode("button",{class:"mrp-nav",type:"button",onClick:y[3]||(y[3]=p=>v.$emit("reset"))},e.toDisplayString(t.messages.reset),1)])]))}}),kt=tt(Gn,[["__scopeId","data-v-aafce92d"]]),Ct={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:"重试",pdfFontUnavailable:"PDF 字体尚未就绪,请联系管理员检查字体配置;预览及其它导出仍可使用。",searchPlaceholder:"搜索报表内容",matchInfo:"{cur}/{total}",prevMatch:"‹",nextMatch:"›",thumbnails:"缩略图",paramsTitle:"查询条件",query:"查 询",reset:"重 置",paramRequired:"请填写{label}",searching:"搜索中…",importExcel:"导入 Excel 模板",importing:"正在导入 Excel…",editCell:"编辑单元格",editingHint:"双击单元格编辑 · Enter 确认 · Esc 取消",saving:"正在保存修改…",editInvalidNumber:"请输入有效数字;清空表示无值",editInvalidBoolean:"请输入 true / false、是 / 否或 1 / 0",editConflict:"该单元格已变化,请重新打开编辑"},$t={shellBg:"#525659",shellFg:"#e8e8e8",toolbarBg:"#323639",toolbarBorder:"#22252a",toolbarFg:"#e8e8e8",btnFg:"#cfcfcf",btnBorder:"#4a4d52",btnHoverBg:"#414549",btnHoverFg:"#ffffff",btnActiveBg:"#2d5fb8"};function Bt(t={}){return{...t,defaults:t.defaults??{},presets:t.presets??{}}}function Yn(t){return t}const ie={showExport:!0,showPrint:!0,showPdfWindow:!0,showParams:!0,gapPx:18,pdfFontUrl:"/simhei.ttf",logger:console},Jn={warn:()=>{},info:()=>{}};function Re(t,n){return{...t,...n,theme:{...t?.theme,...n?.theme},messages:{...t?.messages,...n?.messages},preview:{...t?.preview,...n?.preview},xlsx:{...t?.xlsx,...n?.xlsx}}}function St(t,n){const l=n?t?.presets?.[n]:t?.defaultPreset?t?.presets?.[t.defaultPreset]:void 0,o=Re(t?.defaults,l);return{showExport:o.showExport??ie.showExport,showPrint:o.showPrint??ie.showPrint,showPdfWindow:o.showPdfWindow??ie.showPdfWindow,showParams:o.showParams??ie.showParams,gapPx:o.gapPx??ie.gapPx,pdfFontUrl:o.pdfFontUrl??ie.pdfFontUrl,theme:{...$t,...o.theme},messages:{...Ct,...o.messages},logger:o.logger??ie.logger,preview:{overscanPages:mt(o.preview?.overscanPages,1,10,!0),searchDebounceMs:mt(o.preview?.searchDebounceMs,200,2e3)},xlsx:{...o.xlsx},editable:o.editable??!1,excelImport:o.excelImport??!1}}function mt(t,n,l,o=!1){if(t==null||!Number.isFinite(t))return n;const r=Math.max(0,Math.min(l,t));return o?Math.floor(r):r}function Rt(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 Zn(t){const n=e.inject(fe.MACH_REPORT_CONFIG_KEY,null),l=e.computed(()=>{const o=n?.value??null,r="defaults"in t||"presets"in t||"defaultPreset"in t?Bt(t):{defaults:t,presets:{}};if(!o)return r;const a={...o.presets,...r.presets};for(const s of Object.keys(a))a[s]=Re(Re(o.presets[s],r.defaults),r.presets[s]);return{defaults:Re(o.defaults,r.defaults),presets:a,defaultPreset:r.defaultPreset??o.defaultPreset}});e.provide(fe.MACH_REPORT_CONFIG_KEY,l)}function Mt(){return e.inject(fe.MACH_REPORT_CONFIG_KEY,e.computed(()=>null))}const vt=new Map,ce=new Map,Xn=15e3;function Ze(t,n){return Object.assign(new Error(t),{cause:n})}function ye(t,n){return`PDF 字体 ${JSON.stringify(t)}:${n}。请部署支持报表文字的字体文件,并将 pdfFontUrl 配置为可访问的字体 URL;西文报表可设为空串`}function De(t){if(t?.reason instanceof Error&&t.reason.name==="AbortError")return t.reason;const n=Ze("PDF 字体检查已取消",t?.reason);return n.name="AbortError",n}async function Qn(t,n){let l=!1;const o=setTimeout(()=>{l=!0,n.abort()},Xn);try{const r=await fetch(t,{method:"HEAD",signal:n.signal});if(n.signal.aborted)throw De(n.signal);if(r.status===405||r.status===501||r.type==="opaque")return{status:"unverified",fontUrl:t,message:`PDF 字体 ${JSON.stringify(t)} 无法通过 HEAD 检查验证;仍可尝试导出,届时会加载并校验字体`};if(!r.ok){const s=new Error(`字体请求返回 HTTP ${r.status}`);return{status:"error",fontUrl:t,message:ye(t,s.message),cause:s}}const a=r.headers.get("content-type")??"";if(/text\/html|application\/xhtml\+xml/i.test(a)){const s=new Error("字体 URL 返回 HTML 页面(可能是 SPA 路由回退),不是字体文件");return{status:"error",fontUrl:t,message:ye(t,s.message),cause:s}}if(/^text\//i.test(a)||/(?:\/|\+)json(?:\s*;|$)/i.test(a)){const s=new Error(`字体 URL 返回 ${a} 文本响应,不是字体文件`);return{status:"error",fontUrl:t,message:ye(t,s.message),cause:s}}return{status:"available",fontUrl:t,message:"PDF 字体资源可达;文字覆盖范围将在实际导出时校验"}}catch(r){if(n.signal.aborted&&!l)throw De(n.signal);return{status:"error",fontUrl:t,message:ye(t,l?"字体检查超时,请检查网络或字体服务":"字体检查失败,请检查网络、字体服务或跨域访问配置"),cause:r}}finally{clearTimeout(o)}}function _n(t,n){if(n?.aborted)return Promise.reject(De(n));if(!t)return Promise.resolve({status:"disabled",fontUrl:t,message:"已停用自定义 PDF 字体;内置字体用于西文,其他文字会在导出时校验"});const l=vt.get(t);if(l)return Promise.resolve(l);let o=ce.get(t);if(!o){const a=new AbortController;o={controller:a,promise:Qn(t,a),subscribers:0};const s=o;ce.set(t,s),s.promise=s.promise.then(d=>(!a.signal.aborted&&d.status==="available"&&vt.set(t,d),d)).finally(()=>{ce.get(t)===s&&ce.delete(t)})}const r=o;return r.subscribers++,new Promise((a,s)=>{let d=!1;const v=()=>d?!1:(d=!0,r.subscribers--,n?.removeEventListener("abort",y),!0),y=()=>{v()&&(r.subscribers===0&&(ce.get(t)===r&&ce.delete(t),r.controller.abort()),s(De(n)))};n?.addEventListener("abort",y,{once:!0}),r.promise.then(p=>{v()&&a(p)},p=>{v()&&s(p)}),n?.aborted&&y()})}function Ft(t={fontUrl:"/simhei.ttf"}){let n=null;const l=async(o,r)=>{n||(n=await import("@agile-team/mach-report/pdf"));let a=null;if(t.fontUrl)try{if(a=await n.loadFontWithCache(t.fontUrl,{strict:!0}),!a?.byteLength)throw new Error("字体文件为空或加载失败")}catch(m){const b=m instanceof Error?m.message:String(m);throw Ze(ye(t.fontUrl,b),m)}let s;try{s=await n.renderPlanToPdf(o,a?{customFontBytes:a}:{})}catch(m){if(!a)throw m;const b=m instanceof Error?m.message:String(m);throw Ze(`PDF 生成失败:${b}。当前字体 URL 为 ${JSON.stringify(t.fontUrl)};请确认该文件是有效字体,或重新配置 pdfFontUrl`,m)}const{bytes:d,unsupportedTextCount:v,pageErrors:y,fidelityWarnings:p}=s;if(v>0)throw new Error(`PDF 中有 ${v} 行文字无法编码;请部署支持所用文字的字体并配置 pdfFontUrl`);if(y.length>0)throw new Error(`PDF 有 ${y.length} 页渲染失败:${y[0]}`);return p.length>0&&r?.(`PDF 有 ${p.length} 处版式降级:${p.slice(0,2).join(";")}`),d};return l.checkFont=o=>_n(t.fontUrl,o),l}class re extends Error{constructor(n,l,o){super(l),this.name="MachReportError",this.code=n,this.cause=o}}function Dt(t){return t instanceof re?{code:t.code,cause:t.cause}:{code:"render",cause:t}}function de(t){return JSON.parse(JSON.stringify(t))}function er(t){const n=t.closest(".mrp-page-holder"),l=t.closest("[data-mr-component-index]");if(!n||!l)return null;const o={pageIndex:Number(n.dataset.page)-1,componentIndex:Number(l.dataset.mrComponentIndex),rowIndex:Number(t.dataset.mrRowIndex),columnIndex:Number(t.dataset.mrColumnIndex)};return Object.values(o).every(r=>Number.isInteger(r)&&r>=0)?o:null}function tr(t,n,l){const o=t.ownerDocument.createElement("textarea");return o.className="mrp-cell-editor",o.setAttribute("aria-label",n),o.value=l==null?"":String(l),o.style.cssText="position:absolute;inset:0;width:100%;height:100%;min-height:20px;box-sizing:border-box;z-index:10;resize:none;margin:0;padding:2px 4px;border:2px solid #2563eb;outline:none;background:#fff;color:#111;font:inherit;line-height:1.25;white-space:pre-wrap;",t.appendChild(o),o}function nr(t){const n=e.shallowRef(null),l=e.ref(!1),o=e.shallowRef([]);let r=null;function a(){const u=n.value;n.value=null,l.value=!1,r=null,u?.controller.abort(),u?.input.remove()}function s(){a(),o.value=[]}function d(u){return n.value===u&&!u.controller.signal.aborted&&t.plan.value===u.plan}function v(u){const E=t.options.value,k=j.getReportCellContext(u.plan,u.address);if(!(typeof E=="object"?E===u.options:E===!0)||!k?.editable||u.options.canEdit?.(k)===!1)throw new j.ReportCellEditError("readonly")}async function y(u){try{v(u);const E=j.createReportCellEdit(u.plan,u.address,u.input.value);if(Object.is(E.value,E.previousValue))return a(),!0;const k={signal:u.controller.signal},w=await u.options.validate?.(de(E),k);if(!d(u))return!1;if(w)throw new Error(w);if(v(u),await u.options.save?.(de(E),k),!d(u))return!1;v(u);const B=j.applyReportCellEdit(u.plan,E);return a(),o.value=[...o.value,E],t.plan.value=B,t.onChange(de(E)),!0}catch(E){return d(u)&&(t.onError(t.errorMessage?.(E)??(E instanceof Error?E.message:"单元格保存失败"),E),u.input.disabled=!1,u.input.setAttribute("aria-invalid","true"),u.input.focus()),!1}finally{n.value===u&&(l.value=!1)}}async function p(){if(r)return r;const u=n.value;if(!u)return!0;if(!d(u))return a(),!1;l.value=!0,u.input.disabled=!0;const E=y(u);r=E;const k=await E;return r===E&&(r=null),k}function m(u){u.stopPropagation(),!u.isComposing&&(u.key==="Escape"&&(u.preventDefault(),a()),u.key==="Enter"&&!u.shiftKey&&(u.preventDefault(),p()))}async function b(u){if(!t.options.value||t.blocked())return;const E=u.target;if(!(E instanceof Element)||E.closest(".mrp-cell-editor"))return;const k=E.closest("td[data-mr-row-index]");if(!k||!await p()||!k.isConnected)return;const w=t.plan.value,B=er(k);if(!w||!B||!t.options.value||t.blocked())return;const P=typeof t.options.value=="object"?t.options.value:{};try{const R=j.getReportCellContext(w,B);if(!R?.editable||P.canEdit?.(R)===!1)return;const C=tr(k,t.label(),R.value);n.value={plan:w,address:B,input:C,controller:new AbortController,options:P},C.addEventListener("keydown",m),C.addEventListener("blur",()=>{l.value||p()}),C.focus(),C.select()}catch(R){t.onError(R instanceof Error?R.message:"无法编辑单元格",R)}}return e.watch(t.options,(u,E)=>{(!u||u!==E)&&a()},{flush:"sync"}),e.watch(t.plan,()=>{n.value&&t.plan.value!==n.value.plan&&a()},{flush:"sync"}),e.onScopeDispose(s),{active:n,saving:l,changes:o,cancel:a,reset:s,commit:p,onDoubleClick:b,getChanges:()=>de(o.value)}}const rr={key:2,class:"mrp-edit-hint",role:"status"},or={key:4,class:"mrp-export-notice mrp-export-warning",role:"status"},ar={class:"mrp-main"},lr={key:0,class:"mrp-state"},sr={key:1,class:"mrp-state mrp-error"},ir={key:2,class:"mrp-state"},ur=["data-page"],cr=["onClick"],dr=["data-thumb"],fr={class:"mrp-thumb-no"},pr={class:"mrp-overlay"},mr={key:5,class:"mrp-debug","aria-hidden":"true"},$e=96/25.4,Ye="mach-report:ui",Je="mach-report:ui:wide",vr=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},editable:{type:[Boolean,Object],default:void 0},excelImport:{type:[Boolean,Object],default:void 0},fetcher:{type:Function,default:null}},emits:["loaded","error","warning","cell-edit","template-import"],setup(t,{expose:n,emit:l}){e.useCssVars(i=>({a2d6c888:N.value+"px"}));const o=t,r=l,a=e.shallowRef(null),s=e.ref(!1),d=e.ref(""),v=e.shallowRef(null),y=e.ref(null),p=e.ref(!1),m=e.shallowRef(Object.freeze({status:"unchecked",fontUrl:""})),b=e.ref(null),u=e.ref(1),E=e.ref(null),k=e.ref(null),w=e.ref(null),B=e.ref(!1),P=e.ref(!1),R=e.ref(null),C=hn(),S=e.computed(()=>!!a.value?.pages.length&&a.value.pages.every(i=>i.layout==="wide")),N=e.computed(()=>Math.max(0,G.value));let L=Ye;const U=e.inject(fe.MACH_REPORT_FETCHER_KEY,null),K=e.inject(fe.MACH_REPORT_PDF_EXPORTER_KEY,null),W=e.computed(()=>Xe(o.reportId)),ee=e.computed(()=>o.fetcher??U),O=e.computed(()=>a.value?.pages.length??0),ae=e.computed(()=>Object.freeze({loading:s.value,hasPlan:O.value>0,pageCount:O.value,currentPage:u.value,exporting:y.value,printing:p.value,canExport:!s.value&&!P.value&&!V.saving.value&&O.value>0&&y.value===null,canPrint:!s.value&&!P.value&&!V.saving.value&&O.value>0&&!p.value,error:v.value,pdfFont:m.value,editing:V.active.value!==null,saving:V.saving.value,importing:P.value,dirty:V.changes.value.length>0}));function H(i,g,h){v.value=Object.freeze({message:i,code:g,cause:h}),r("error",i,{code:g,cause:h})}const c=Mt(),f=e.computed(()=>St(c.value,o.preset)),x=e.computed(()=>({...f.value.messages,...o.messages})),$=e.computed(()=>o.showExport??f.value.showExport),M=e.computed(()=>o.showPrint??f.value.showPrint),z=e.computed(()=>o.showPdfWindow??f.value.showPdfWindow),G=e.computed(()=>o.gapPx??(S.value?0:f.value.gapPx)),Q=e.computed(()=>o.showParams??f.value.showParams),nt=e.computed(()=>o.editable??f.value.editable),we=e.computed(()=>o.excelImport??f.value.excelImport);function Nt(i){return i instanceof j.ReportCellEditError?{number:x.value.editInvalidNumber,boolean:x.value.editInvalidBoolean,conflict:x.value.editConflict}[i.code]??i.message:i instanceof Error?i.message:"单元格保存失败"}const V=nr({plan:a,options:nt,blocked:()=>s.value||P.value||y.value!==null||p.value,label:()=>x.value.editCell??"编辑单元格",errorMessage:Nt,onChange:i=>{v.value=null,b.value=null,r("cell-edit",i)},onError:(i,g)=>{b.value={kind:"error",message:i},H(i,"edit",g)}});let rt=null,Te=null;function ot(){if(K)return K;const i=f.value.pdfFontUrl;return(!Te||rt!==i)&&(rt=i,Te=Ft({fontUrl:i})),Te}let xe=0,pe=null,Ee=null,te=!1;function Ne(){xe++,pe?.abort(),pe=null}async function Pe(){if(te)throw new re("config","报表预览已卸载");Ne();const i=xe,g=new AbortController;pe=g;const h=f.value.pdfFontUrl;m.value=Object.freeze({status:"checking",fontUrl:h});try{const T=ot(),D=T.checkFont?await T.checkFont(g.signal):{status:"unverified",fontUrl:"",message:"自定义 PDF 导出器未提供字体预检查;字体由宿主确认"};return!te&&i===xe&&!g.signal.aborted&&(m.value=Object.freeze({...D})),D}catch(T){if(g.signal.aborted)throw T;const D={status:"error",fontUrl:h,message:T instanceof Error?T.message:"PDF 字体检查失败",cause:T};return!te&&i===xe&&(m.value=Object.freeze(D)),D}finally{pe===g&&(pe=null)}}function It(){Pe().catch(()=>{})}e.watch([a,()=>f.value.pdfFontUrl,$,z],()=>{const i=m.value.fontUrl===f.value.pdfFontUrl;i&&m.value.status==="available"||(Ne(),(!i||m.value.status==="checking")&&(m.value=Object.freeze({status:"unchecked",fontUrl:f.value.pdfFontUrl})),!te&&O.value>0&&($.value||z.value)&&Pe().catch(()=>{}))},{immediate:!0});const oe=e.computed(()=>o.paramDefs??ee.value?.getParamDefs?.(W.value)??[]),le=e.ref({}),Ie=e.ref(!1);function me(i){const g={};for(const h of i)g[h.field]=o.params[h.field]??h.defaultValue??"";le.value=g,Ie.value=!1}me(oe.value),e.watch(oe,i=>me(i)),e.watch(W,()=>me(oe.value)),e.watch(()=>JSON.stringify(o.params),()=>me(oe.value));const Vt=e.computed(()=>{const i={...o.params};for(const[g,h]of Object.entries(le.value))h===""?delete i[g]:i[g]=h;return i});function Ot(){return oe.value.filter(i=>i.required===!0&&!(le.value[i.field]??"").trim())}function zt(){Ie.value=!0;const i=Ot();if(i.length>0){const g=i[0].label??i[0].field,h=x.value.paramRequired.replace("{label}",g);d.value=h,H(h,"param");return}se()}function Lt(){me(oe.value)}const Wt=e.computed(()=>({height:o.height,...Rt(f.value.theme)})),{zoom:Y,zoomMode:ve,applyFitZoom:at,setZoom:ge}=yt(()=>({viewport:k.value,pageWidthPx:Ve.contentSize.value.w||210*$e})),Ve=bt(a,Y,{pxPerMm:$e,gapPx:G,overscan:e.computed(()=>f.value.preview.overscanPages)}),{contentSize:Oe,windowRange:he,visiblePages:lt,makeScrollHandler:At,refreshViewport:ze}=Ve,Ht=At(u,O);function Le(i){ge(i*100)}function ke(){P.value=!1,V.reset(),st(),a.value=null,u.value=1,I.reset()}let A=0,Z=null;async function se(){if(te)return;const i=++A;P.value=!1,Z?.abort(),Z=null;const g=ee.value;if(s.value=!1,v.value=null,W.value.length===0){d.value="缺少报表 ID",ke(),H(d.value,"param");return}if(!g){d.value="未提供渲染数据源 fetcher",ke(),H(d.value,"config");return}s.value=!0,d.value="",b.value=null,ke();const h=C.start(),T=new AbortController;Z=T;const D=new Set;function X(F){i!==A||T.signal.aborted||D.has(F)||(D.add(F),f.value.logger.warn("[mach-report] 报表告警:",F),r("warning",F))}try{const F=await g({reportIds:W.value,params:{...Vt.value},signal:T.signal,onWarning:X});if(i!==A)return;const q=j.validateRenderPlan(F);if(!q.ok){const Ce=q.errors.slice(0,3).map(ft=>`${ft.path}: ${ft.message}`).join("; ");throw new re("validate",`渲染计划校验失败(${q.errors.length} 处): ${Ce}`)}if(q.warnings.forEach(Ce=>X(`${Ce.path}: ${Ce.message}`)),i!==A||T.signal.aborted)return;a.value=F,u.value=1,C.end(h),k.value&&(k.value.scrollTop=0,k.value.scrollLeft=0);const J=S.value?Je:Ye;J!==L&&(L=J,Ke()),ve.value==="fit"&&at(),r("loaded",F.pages.length)}catch(F){if(i!==A)return;const q=F instanceof re?F:F instanceof j.ReportSourceError?new re(F.code,F.message,F.cause):new re("fetch",F instanceof Error?F.message:"预览加载失败",F);d.value=q.message;const J=Dt(q);H(q.message,J.code,J.cause)}finally{i===A&&(s.value=!1),Z===T&&(Z=null)}}function ne(i){if(te||O.value<=0)return;const g=Math.max(1,Math.min(O.value,i));u.value=g;const h=k.value;h&&(h.scrollTop=Ve.pageOffsetPx(g-1)*Y.value,ze(h))}const be=xt(a,{getPdfExporter:ot,getXlsxOptions:()=>f.value.xlsx,onError:(i,g)=>{b.value={kind:"error",message:i},H(i,g??"print")},onWarning:i=>{b.value={kind:"warning",message:i},r("warning",i)},onBusy:i=>{y.value=i,i?b.value={kind:"progress",message:x.value.exporting.replace("{format}",i)}:b.value?.kind==="progress"&&(b.value=null)},onPrinting:i=>{p.value=i}}),{releasePrintFrame:st,dispose:qt}=be;async function We(){s.value||P.value||V.active.value&&!await V.commit()||(v.value=null,await be.print())}async function Ae(i){s.value||P.value||V.active.value&&!await V.commit()||(v.value=null,await be.exportAs(i))}function He(){if(s.value||P.value||V.active.value){b.value={kind:"warning",message:x.value.editingHint??"请先确认单元格修改"};return}v.value=null,be.openPdfWindow()}async function it(i,g={}){te||(le.value={...le.value,...i},g.reload!==!1&&await se())}const jt={reload:se,print:We,exportAs:Ae,openPdfWindow:He,gotoPage:ne,setParams:it,checkPdfFont:Pe,importExcel:qe,getPlan:ut,getChanges:V.getChanges,get state(){return ae.value}};e.provide(fe.MACH_REPORT_CONTROLLER_KEY,jt);function ut(){return a.value?de(a.value):null}async function qe(i,g){if(te)throw new re("config","报表预览已卸载");const h=++A;Z?.abort(),Z=null,s.value=!1,V.cancel(),be.invalidatePending(),P.value=!0,v.value=null,b.value={kind:"progress",message:x.value.importing??"正在导入 Excel…"};try{const{importExcelTemplate:T}=await import("@agile-team/mach-report/xlsx");if(h!==A)return null;const D=typeof we.value=="object"?we.value:{},X=await T(i,{...D,...g,limits:{...D.limits,...g?.limits}});if(h!==A)return null;const F=j.paginateTemplate(de(X.template),{}).plan,q=j.validateRenderPlan(F);if(!q.ok)throw new Error(q.errors.map(J=>J.message).slice(0,3).join("; "));for(const J of X.warnings){if(h!==A)return null;r("warning",J)}return h!==A?null:(V.reset(),st(),I.reset(),a.value=F,u.value=1,d.value="",b.value=X.warnings.length?{kind:"warning",message:X.warnings.join(";")}:null,k.value&&(k.value.scrollTop=0,k.value.scrollLeft=0),L=S.value?Je:Ye,Ke(),r("template-import",X),h===A&&r("loaded",F.pages.length),X)}catch(T){if(h!==A)return null;const D=new re("import",T instanceof Error?T.message:"Excel 模板导入失败",T);throw b.value={kind:"error",message:D.message},H(D.message,"import",T),D}finally{h===A&&(P.value=!1)}}function Ut(i){const g=i.target,h=g.files?.[0];g.value="",h&&qe(h).catch(()=>{})}const I=mn({plan:a,gotoPage:ne,debounceMs:e.computed(()=>f.value.preview.searchDebounceMs),highlight:ln,clearHighlights:an});function Kt(i){i.ctrlKey&&(i.preventDefault(),Le(Y.value*(i.deltaY<0?1.1:1/1.1)))}function Gt(i){if(!(i.target instanceof Element&&i.target.closest("input,textarea,select,[contenteditable='true']"))){if((i.ctrlKey||i.metaKey)&&i.key.toLowerCase()==="f"){i.preventDefault(),I.visible.value||I.toggle();return}switch(i.key){case"PageDown":i.preventDefault(),ne(u.value+1);break;case"PageUp":i.preventDefault(),ne(u.value-1);break;case"Home":i.preventDefault(),ne(1);break;case"End":i.preventDefault(),ne(O.value);break;case"+":case"=":i.preventDefault(),Le(Y.value*1.1);break;case"-":i.preventDefault(),Le(Y.value/1.1);break}}}function Yt(){try{localStorage.setItem(L,JSON.stringify({zoomMode:ve.value==="fit"?"fit":Math.round(Y.value*100)}))}catch{}}e.watch([ve,Y],Yt);let je="";const ct=new WeakMap;function dt(i=!1){const g=I.activeMatch.value;if(!S.value||!g)return;const h=`${I.query.value}:${I.matchIndex.value}:${g.pageIndex}`;if(!i&&h===je)return;const D=E.value?.querySelector(`[data-page="${g.pageIndex+1}"]`)?.querySelectorAll("mark.mrp-hit")[g.occurrence];D&&(D.scrollIntoView?.({block:"nearest",inline:"nearest"}),je=h)}e.watchEffect(()=>{const i=a.value;if(!i)return;const g=I.activeMatch.value;I.matchIndex.value,g||(je=""),lt.value;const h=E.value;if(!h)return;h.querySelectorAll(".mrp-page-holder").forEach(D=>{const X=Number(D.dataset.page??0)-1,F=i.pages[X];if(!F||D.childElementCount>0&&ct.get(D)===F){if(D.firstElementChild){const J=D.firstElementChild;I.clear(J),I.apply(J)}return}D.style.width=`${F.pageWidthMm*$e}px`;const q=j.renderPage(F,96,{},document);I.apply(q),D.replaceChildren(q),ct.set(D,F)}),dt()},{flush:"post"}),e.watch(()=>I.query.value,i=>{i||E.value?.querySelectorAll(".mrp-page-holder").forEach(g=>{I.clear(g)})});const _=gn(a,{thumbsRoot:w,visible:B,renderThumbCanvas:i=>{try{const g=a.value.pages[i],h=Math.min(.2,116/Math.max(1,g.pageWidthMm*$e)),{canvases:T}=j.renderPlanToCanvas(a.value,{start:i,end:i,dpr:h});return T[0]??null}catch{return null}}});e.watchEffect(()=>{_.schedule()},{flush:"post"});const Jt=e.computed(()=>o.debug),{debugStats:ue}=vn(Jt,{plan:a,pageCount:O,windowRange:he,zoom:Y,loadMs:C.loadMs});function Ue(){ze(k.value),_.schedule(),ve.value==="fit"&&at(),dt(!0)}function Ke(){ge(L===Je?100:"fit");try{const i=JSON.parse(localStorage.getItem(L)??"{}");i.zoomMode==="fit"?ge("fit"):typeof i.zoomMode=="number"&&ge(i.zoomMode)}catch{}}return e.onMounted(()=>{window.addEventListener("resize",Ue),typeof ResizeObserver<"u"&&k.value&&(Ee=new ResizeObserver(Ue),Ee.observe(k.value)),ze(k.value),Ke(),o.autoLoad&&se()}),e.onUnmounted(()=>{te=!0,V.reset(),P.value=!1,Ne(),A++,Z?.abort(),Z=null,window.removeEventListener("resize",Ue),Ee?.disconnect(),Ee=null,_.destroy(),I.reset(),qt()}),e.watch(()=>[JSON.stringify(W.value),JSON.stringify(o.params),ee.value],()=>{if(o.autoLoad){se();return}A++,Z?.abort(),Z=null,s.value=!1,d.value="",v.value=null,b.value=null,ke()}),n({reload:se,print:We,exportAs:Ae,openPdfWindow:He,gotoPage:ne,setParams:it,checkPdfFont:Pe,importExcel:qe,getPlan:ut,getChanges:V.getChanges,state:ae}),(i,g)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["mach-report-preview",{"mrp-wide-report":S.value}]),style:e.normalizeStyle(Wt.value)},[Q.value&&oe.value.length>0?(e.openBlock(),e.createBlock(kt,{key:0,defs:oe.value,modelValue:le.value,"onUpdate:modelValue":g[0]||(g[0]=h=>le.value=h),messages:x.value,attempted:Ie.value,onQuery:zt,onReset:Lt},null,8,["defs","modelValue","messages","attempted"])):e.createCommentVNode("",!0),e.createVNode(Pt,{"page-count":O.value,"current-page":u.value,"zoom-mode":e.unref(ve),zoom:e.unref(Y),"show-export":$.value,"show-print":M.value,"show-pdf-window":z.value,messages:x.value,search:{visible:e.unref(I).visible.value,query:e.unref(I).query.value,matchIndex:e.unref(I).matchIndex.value,matchCount:e.unref(I).matchCount.value,searching:e.unref(I).searching.value},"thumbs-visible":B.value,"show-import":!!we.value,busy:s.value||P.value||e.unref(V).saving.value,onGoto:ne,onZoom:e.unref(ge),onExport:g[1]||(g[1]=h=>Ae(h)),onPrint:We,onPdfWindow:He,onSearchInput:e.unref(I).onInput,onSearchNav:e.unref(I).onNav,onSearchToggle:e.unref(I).toggle,onThumbsToggle:g[2]||(g[2]=h=>B.value=!B.value),onImportExcel:g[3]||(g[3]=h=>R.value?.click())},null,8,["page-count","current-page","zoom-mode","zoom","show-export","show-print","show-pdf-window","messages","search","thumbs-visible","show-import","busy","onZoom","onSearchInput","onSearchNav","onSearchToggle"]),we.value?(e.openBlock(),e.createElementBlock("input",{key:1,ref_key:"importInputRef",ref:R,class:"mrp-import-input",type:"file",accept:".xlsx,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",hidden:"",onChange:Ut},null,544)):e.createCommentVNode("",!0),nt.value&&O.value>0?(e.openBlock(),e.createElementBlock("div",rr,e.toDisplayString(e.unref(V).saving.value?x.value.saving:x.value.editingHint),1)):e.createCommentVNode("",!0),b.value?(e.openBlock(),e.createElementBlock("div",{key:3,class:e.normalizeClass(["mrp-export-notice",`mrp-export-${b.value.kind}`]),role:"alert"},e.toDisplayString(b.value.message),3)):e.createCommentVNode("",!0),m.value.status==="error"&&($.value||z.value)?(e.openBlock(),e.createElementBlock("div",or,[e.createTextVNode(e.toDisplayString(x.value.pdfFontUnavailable)+" ",1),e.createElementVNode("button",{type:"button",onClick:It},e.toDisplayString(x.value.retry),1)])):e.createCommentVNode("",!0),e.createElementVNode("div",ar,[e.createElementVNode("div",{ref_key:"viewportRef",ref:k,class:"mrp-body",tabindex:"0",onWheel:Kt,onKeydown:Gt,onDblclick:g[4]||(g[4]=(...h)=>e.unref(V).onDoubleClick&&e.unref(V).onDoubleClick(...h)),onScrollPassive:g[5]||(g[5]=h=>e.unref(Ht)(h.target))},[s.value?(e.openBlock(),e.createElementBlock("div",lr,e.toDisplayString(x.value.loading),1)):d.value?(e.openBlock(),e.createElementBlock("div",sr,[e.createTextVNode(e.toDisplayString(d.value)+" ",1),e.createElementVNode("button",{class:"mrp-retry",type:"button",onClick:se},e.toDisplayString(x.value.retry),1)])):!a.value||O.value===0?(e.openBlock(),e.createElementBlock("div",ir,e.toDisplayString(x.value.empty),1)):(e.openBlock(),e.createElementBlock("div",{key:3,class:"mrp-scale",style:e.normalizeStyle({width:`${e.unref(Oe).w*e.unref(Y)}px`,height:`${e.unref(Oe).h*e.unref(Y)}px`})},[e.createElementVNode("div",{ref_key:"containerRef",ref:E,class:"mrp-scale-inner",style:e.normalizeStyle({transform:`scale(${e.unref(Y)})`,transformOrigin:"top left",width:`${e.unref(Oe).w}px`})},[e.unref(he).padTopPx>0?(e.openBlock(),e.createElementBlock("div",{key:0,class:"mrp-spacer-top",style:e.normalizeStyle({height:`${e.unref(he).padTopPx}px`}),"aria-hidden":"true"},null,4)):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(lt),h=>(e.openBlock(),e.createElementBlock("div",{key:h.index,class:"mrp-page-holder","data-page":h.index+1},null,8,ur))),128)),e.unref(he).padBottomPx>0?(e.openBlock(),e.createElementBlock("div",{key:1,class:"mrp-spacer-bottom",style:e.normalizeStyle({height:`${e.unref(he).padBottomPx}px`}),"aria-hidden":"true"},null,4)):e.createCommentVNode("",!0)],4)],4))],544),B.value&&O.value>0?(e.openBlock(),e.createElementBlock("aside",{key:0,ref_key:"thumbsRef",ref:w,class:"mrp-thumbs",onScrollPassive:g[6]||(g[6]=(...h)=>e.unref(_).onScroll&&e.unref(_).onScroll(...h))},[e.unref(_).windowRange.value.padTopPx>0?(e.openBlock(),e.createElementBlock("div",{key:0,class:"mrp-thumb-spacer",style:e.normalizeStyle({height:`${e.unref(_).windowRange.value.padTopPx}px`}),"aria-hidden":"true"},null,4)):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(_).visibleThumbs.value,h=>(e.openBlock(),e.createElementBlock("div",{key:h.index,class:e.normalizeClass(["mrp-thumb",{"mrp-thumb-active":h.index+1===u.value}]),style:e.normalizeStyle({height:`${h.height+20}px`}),onClick:T=>ne(h.index+1)},[e.createElementVNode("div",{class:"mrp-thumb-box","data-thumb":h.index+1,style:e.normalizeStyle({height:`${h.height}px`})},null,12,dr),e.createElementVNode("span",fr,e.toDisplayString(h.index+1),1)],14,cr))),128)),e.unref(_).windowRange.value.padBottomPx>0?(e.openBlock(),e.createElementBlock("div",{key:1,class:"mrp-thumb-spacer",style:e.normalizeStyle({height:`${e.unref(_).windowRange.value.padBottomPx}px`}),"aria-hidden":"true"},null,4)):e.createCommentVNode("",!0)],544)):e.createCommentVNode("",!0)]),e.createElementVNode("div",pr,[e.renderSlot(i.$slots,"default",{},void 0,!0)]),e.unref(ue)?(e.openBlock(),e.createElementBlock("div",mr,[g[7]||(g[7]=e.createElementVNode("div",null,"mach-report debug",-1)),e.createElementVNode("div",null,"pages: "+e.toDisplayString(e.unref(ue).pages)+" | window: ["+e.toDisplayString(e.unref(ue).window)+"]",1),e.createElementVNode("div",null,"zoom: "+e.toDisplayString(e.unref(ue).zoom)+" | load: "+e.toDisplayString(e.unref(ue).loadMs),1),e.createElementVNode("div",null,"plan: "+e.toDisplayString(e.unref(ue).planKB)+"KB",1)])):e.createCommentVNode("",!0)],6))}}),Tt=tt(vr,[["__scopeId","data-v-fa6fd3bb"]]),gr=Object.freeze(Object.defineProperty({__proto__:null,default:Tt},Symbol.toStringTag,{value:"Module"}));exports.DEFAULT_MESSAGES=Ct;exports.DEFAULT_THEME=$t;exports.MachReportError=re;exports.PlanLoadError=Be;exports.ReportParamPanel=kt;exports.ReportPreview=Tt;exports.ReportPreview$1=gr;exports.ReportToolbar=Pt;exports.SILENT_LOGGER=Jn;exports.buildPrintDocument=et;exports.buildWordHtml=wt;exports.createDefaultPdfExporter=Ft;exports.createFetchRequest=rn;exports.defineMachReportConfig=Bt;exports.defineMachReportPreset=Yn;exports.joinReportIds=nn;exports.normalizeReportIds=Xe;exports.printPlans=on;exports.provideMachReportConfig=Zn;exports.resolveConfig=St;exports.themeToCssVars=Rt;exports.toErrorDetail=Dt;exports.useMachReportConfig=Mt;exports.usePageWindow=bt;exports.usePrintExport=xt;exports.useZoom=yt;