@agile-team/mach-report 2.3.2 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/README.md +40 -5
  2. package/dist/ReportPreview-CL9J9MEE.js +1907 -0
  3. package/dist/ReportPreview-DJvv3h8m.cjs +6 -0
  4. package/dist/grid-geometry-BNIvw52m.cjs +1 -0
  5. package/dist/{grid-geometry-Dw7BlENr.js → grid-geometry-C8hGoe9o.js} +10 -10
  6. package/dist/index.cjs +5 -5
  7. package/dist/index.d.cts +74 -0
  8. package/dist/index.d.ts +74 -0
  9. package/dist/index.js +946 -782
  10. package/dist/number-format-BA_KwrZe.js +55 -0
  11. package/dist/number-format-CZ2T_5kF.cjs +1 -0
  12. package/dist/pdf.cjs +1 -1
  13. package/dist/pdf.d.cts +6 -0
  14. package/dist/pdf.d.ts +6 -0
  15. package/dist/pdf.js +2 -2
  16. package/dist/{plugin-2lqgTX26.cjs → plugin-BkK2mm_p.cjs} +1 -1
  17. package/dist/{plugin-5R00MJQs.js → plugin-DRnvIbdP.js} +1 -1
  18. package/dist/render-plan-CCTL4F9v.cjs +1 -0
  19. package/dist/{render-plan-I9AHvQv7.js → render-plan-CXBWRog4.js} +12 -7
  20. package/dist/style.css +1 -1
  21. package/dist/vue/async.d.cts +598 -1
  22. package/dist/vue/async.d.ts +598 -1
  23. package/dist/vue/index.d.cts +820 -10
  24. package/dist/vue/index.d.ts +820 -10
  25. package/dist/vue-async.cjs +1 -1
  26. package/dist/vue-async.js +3 -3
  27. package/dist/vue.cjs +1 -1
  28. package/dist/vue.js +96 -73
  29. package/dist/xlsx.cjs +24 -24
  30. package/dist/xlsx.d.cts +209 -0
  31. package/dist/xlsx.d.ts +209 -0
  32. package/dist/xlsx.js +9805 -9284
  33. package/package.json +1 -1
  34. package/dist/ReportPreview-B-mwUSk9.cjs +0 -6
  35. package/dist/ReportPreview-DKjr4cwO.js +0 -1688
  36. package/dist/defaults-D4o0NCLo.js +0 -9
  37. package/dist/defaults-DOO1yHwx.cjs +0 -1
  38. package/dist/grid-geometry-bkciiZ4Q.cjs +0 -1
  39. package/dist/render-plan-CfJ3wf1l.cjs +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agile-team/mach-report",
3
- "version": "2.3.2",
3
+ "version": "2.4.0",
4
4
  "description": "独立的 TypeScript 报表引擎:模板分页、DOM/Canvas/PDF/Excel 输出与 Vue 3 预览组件",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -1,6 +0,0 @@
1
- "use strict";var Wt=Object.create;var et=Object.defineProperty;var Lt=Object.getOwnPropertyDescriptor;var At=Object.getOwnPropertyNames;var Ht=Object.getPrototypeOf,qt=Object.prototype.hasOwnProperty;var jt=(t,n,a,o)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of At(n))!qt.call(t,r)&&r!==a&&et(t,r,{get:()=>n[r],enumerable:!(o=Lt(n,r))||o.enumerable});return t};var tt=(t,n,a)=>(a=t!=null?Wt(Ht(t)):{},jt(n||!t||!t.__esModule?et(a,"default",{value:t,enumerable:!0}):a,t));const e=require("vue"),se=require("@agile-team/mach-report"),lt=require("./page-window-index-DEjnM6IB.cjs"),st=require("./render-plan-CfJ3wf1l.cjs"),ie=require("./plugin-2lqgTX26.cjs");function He(t){return t==null?[]:Array.isArray(t)?t.map(String).filter(n=>n!==""):String(t).split(",").map(n=>n.trim()).filter(n=>n!=="")}function Ut(t){return He(t).join(",")}class Pe extends Error{constructor(n){super(n),this.name="PlanLoadError"}}function Kt(t={}){const{baseUrl:n="",headers:a,credentials:o,timeoutMs:r=3e4}=t,l=n.replace(/\/+$/,"");return async({url:i,method:u,params:m,signal:v})=>{let f=`${l}${i}`;if(m&&Object.keys(m).length>0){const y=f.indexOf("#"),S=y>=0?f.slice(y):"",E=y>=0?f.slice(0,y):f,B=E.indexOf("?"),$=B>=0?E.slice(0,B):E,P=new URLSearchParams(B>=0?E.slice(B+1):"");for(const[N,W]of Object.entries(m))P.set(N,W);f=`${$}?${P}${S}`}const p=(y,S)=>{const E=new Pe(y);return Object.defineProperty(E,"cause",{value:S,configurable:!0,writable:!0}),E};if(v?.aborted)throw p(`请求已取消: ${i}`,v.reason);const h=new AbortController;let g;const F=()=>{h.signal.aborted||(g="external",h.abort(v?.reason))};v?.addEventListener("abort",F,{once:!0});const M=setTimeout(()=>{h.signal.aborted||(g="timeout",h.abort())},r);try{const y=await fetch(f,{method:u.toUpperCase(),headers:{Accept:"application/json",...a},credentials:o,signal:h.signal});if(!y.ok)throw new Pe(`HTTP ${y.status} ${i}`);return await y.json()}catch(y){throw g==="timeout"?p(`请求超时(${r}ms): ${i}`,y):g==="external"?p(`请求已取消: ${i}`,y):y instanceof Pe?y:p(`请求失败(${i}): ${y instanceof Error?y.message:String(y)}`,y)}finally{clearTimeout(M),v?.removeEventListener("abort",F)}}}function it(t,n,a={}){const o=a.pxPerMm??3.7795275590551185,r=e.computed(()=>Math.max(0,e.unref(a.gapPx)??18)),l=e.ref(0),i=e.ref(800),u=e.computed(()=>{const y=t.value?.pages??[];return lt.createPageWindowIndex(y.map(S=>S.pageHeightMm*o),r.value)}),m=e.computed(()=>{let y=0;for(const S of t.value?.pages??[])y=Math.max(y,S.pageWidthMm*o);return{w:y,h:u.value.totalHeightPx}}),v=e.computed(()=>u.value.window(i.value/n.value,l.value/n.value,e.unref(a.overscan)??1)),f=e.computed(()=>{const y=t.value;if(!y)return[];const{start:S,end:E}=v.value;return y.pages.slice(S,E+1).map((B,$)=>({page:B,index:S+$}))});let p=0,h=!1;function g(y){y&&(l.value=y.scrollTop,i.value=y.clientHeight||800)}function F(y,S){return E=>{p||h||(p=requestAnimationFrame(()=>{if(p=0,h||(g(E),S.value<=0))return;const B=Math.max(0,E.scrollTop+32)/n.value;y.value=Math.min(S.value,u.value.pageAt(B)+1)}))}}function M(){h=!0,p&&cancelAnimationFrame(p),p=0}return e.onScopeDispose(M),{contentSize:m,windowRange:v,visiblePages:f,makeScrollHandler:F,refreshViewport:g,pageOffsetPx:y=>u.value.offsetAt(y),destroy:M}}function ct(t){const n=e.ref(1),a=e.ref("fit");let o=0;function r(){o&&cancelAnimationFrame(o),o=0}function l(){r(),o=requestAnimationFrame(()=>{if(o=0,a.value!=="fit")return;const u=t();!u?.viewport||u.viewport.clientWidth<=48||!Number.isFinite(u.pageWidthPx)||(n.value=Math.min(1,(u.viewport.clientWidth-48)/Math.max(1,u.pageWidthPx)))})}function i(u){if(u==="fit")a.value="fit",l();else{if(!Number.isFinite(u))return;r(),a.value="raw",n.value=Math.min(3,Math.max(.3,u/100))}}return e.getCurrentScope()&&e.onScopeDispose(r),{zoom:n,zoomMode:a,applyFitZoom:l,setZoom:i}}const $e=8;function Se(){return new Promise(t=>setTimeout(t,0))}function ke(t){return`p${t.pageWidthMm}x${t.pageHeightMm}`.replace(/[.+]/g,"_")}function qe(t){const n=new Map;return t.pages.forEach(r=>{n.has(ke(r))||n.set(ke(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 ${ke(r)}{size:${r.pageWidthMm}mm ${r.pageHeightMm}mm;margin:0;}`).join(`
5
- `)}
6
- body{margin:0;background:#fff;}`}</style></head><body>`}function je(t){const n=se.renderPage(t,96,{},document);return n.style.page=ke(t),n.outerHTML}function Ue(t){return{head:qe(t),pageChunks:t.pages.map(je)}}async function Gt(t,n={}){const a={schemaVersion:"mach-report-batch-print",pages:t.flatMap(i=>i.pages)};if(a.pages.length===0)return;const o=qe(a),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 l=!1;try{const i=r.contentDocument;i.open(),i.write(o);for(let u=0;u<a.pages.length;u++)i.write(je(a.pages[u])),u%$e===$e-1&&(n.onProgress?.(u+1,a.pages.length),await Se());i.write("</body></html>"),i.close(),await Se(),n.onProgress?.(a.pages.length,a.pages.length),l=!0,r.contentWindow?.focus(),r.contentWindow?.print()}catch(i){n.onError?.(i instanceof Error?`批量打印失败: ${i.message}`:"批量打印失败")}finally{l?setTimeout(()=>r.remove(),6e4):r.remove()}}function ut(t){const{head:n,pageChunks:a}=Ue(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>/,"")}`}${a.join("")}</body></html>`,filename:"mach-report.doc"}}function dt(t,n){let a=null,o=!1,r=!1,l=0;const i=new Map,u=new Map;let m=null,v=null,f=null,p=null,h=null;function g(s,d){return!r&&t.value===s&&l===d}function F(){if(r)return;const s=[...i.values()].reverse().find(d=>g(d.plan,d.epoch))?.format??null;s!==m&&(m=s,n.onBusy?.(s))}function M(s,d,x){const k={};return i.set(k,{plan:s,epoch:d,format:x}),F(),k}function y(s){i.delete(s),F()}function S(){for(const[s,d]of u)g(d.plan,d.epoch)||(s.close(),u.delete(s))}const E=e.watch(t,()=>{l++,B(),F(),S()},{flush:"sync"});function B(){a?.remove(),a=null}function $(){r=!0,l++,E(),B(),S(),i.clear(),n.onPrinting?.(!1)}function P(s,d){const x=URL.createObjectURL(s);setTimeout(()=>URL.revokeObjectURL(x),1e4);const k=document.createElement("a");k.href=x,k.download=d,k.click()}async function N(){if(o)return;const s=t.value;if(r||!s||s.pages.length===0)return;const d=l;o=!0,n.onPrinting?.(!0),B();const x=qe(s);a=document.createElement("iframe"),a.style.cssText="position:fixed;right:0;bottom:0;width:0;height:0;border:0;visibility:hidden;",document.body.appendChild(a);const k=a;try{const C=k.contentDocument;C.open(),C.write(x);for(let O=0;O<s.pages.length;O++)if(C.write(je(s.pages[O])),O%$e===$e-1&&await Se(),k!==a)return;if(C.write("</body></html>"),C.close(),await Se(),!g(s,d)||k!==a)return;k.contentWindow?.focus(),k.contentWindow?.print()}catch{k===a&&B(),g(s,d)&&n.onError("调用打印失败,请改用导出 PDF","print")}finally{o=!1,r||n.onPrinting?.(!1)}}function W(s,d){if(v?.plan===s&&v.epoch===d)return v.promise;const x=Promise.resolve().then(()=>{if(!g(s,d))throw new Error("报表已切换或卸载");return n.getPdfExporter()(s,k=>{g(s,d)&&n.onWarning?.(k)})}).finally(()=>{v?.promise===x&&(v=null)});return v={plan:s,epoch:d,promise:x},x}async function z(){const s=t.value;if(r||!s||s.pages.length===0)return;const d=l;if(f?.plan===s&&f.epoch===d)return f.promise;const x=M(s,d,"PDF"),k=(async()=>{try{const C=await W(s,d);if(!g(s,d))return;P(new Blob([C],{type:"application/pdf"}),"mach-report.pdf")}catch(C){g(s,d)&&n.onError(C instanceof Error?`PDF 导出失败: ${C.message}`:"PDF 导出失败","pdf")}finally{y(x),f?.token===x&&(f=null)}})();return f={plan:s,epoch:d,promise:k,token:x},k}async function L(){const s=t.value;if(r||!s||s.pages.length===0)return;const d=l;if(p?.plan===s&&p.epoch===d)return p.promise;const x={...n.getXlsxOptions?.()},k=M(s,d,"Excel"),C=(async()=>{try{const{renderPlanToXlsx:O}=await import("@agile-team/mach-report/xlsx");if(!g(s,d))return;const{buffer:H,warnings:q}=await O(s,x);if(!g(s,d)||(q.length>0&&n.onWarning?.(`Excel 导出有 ${q.length} 条提示:${q.slice(0,2).join(";")}`),!g(s,d)))return;P(new Blob([H],{type:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}),"mach-report.xlsx")}catch(O){g(s,d)&&n.onError(O instanceof Error?`Excel 导出失败: ${O.message}`:"Excel 导出失败","export")}finally{y(k),p?.token===k&&(p=null)}})();return p={plan:s,epoch:d,promise:C,token:k},C}async function R(){const s=t.value;if(r||!s||s.pages.length===0)return;const d=l;if(h?.plan===s&&h.epoch===d)return h.promise;const x=M(s,d,"图片"),k=(async()=>{try{const{blobs:C}=await se.renderPlanToImages(s,{dpr:Math.min(2,typeof devicePixelRatio=="number"?devicePixelRatio:1)});if(!g(s,d))return;C.forEach((O,H)=>{P(O,C.length>1?`mach-report-page-${H+1}.png`:"mach-report.png")})}catch(C){g(s,d)&&n.onError(C instanceof Error?`图片导出失败: ${C.message}`:"图片导出失败","export")}finally{y(x),h?.token===x&&(h=null)}})();return h={plan:s,epoch:d,promise:k,token:x},k}function Z(){const s=t.value;if(!(r||!s||s.pages.length===0))try{const{html:d,filename:x}=ut(s);P(new Blob([d],{type:"application/msword;charset=utf-8"}),x)}catch(d){n.onError(d instanceof Error?`Word 导出失败: ${d.message}`:"Word 导出失败","export")}}async function K(s){const d=t.value;if(!(r||!d||d.pages.length===0)){if(s==="pdf"){await z();return}if(s==="xlsx"||s==="excel"){await L();return}if(s==="png"||s==="image"){await R();return}if(s==="word"||s==="doc"){Z();return}if(s!=="html"){n.onError(`不支持的导出格式:${s}`,"export");return}try{const{head:x,pageChunks:k}=Ue(d),C=`${x}${k.join("")}</body></html>`;P(new Blob([C],{type:"text/html;charset=utf-8"}),"mach-report.html")}catch(x){n.onError(x instanceof Error?`HTML 导出失败: ${x.message}`:"HTML 导出失败","export")}}}function oe(){const s=t.value;if(r||!s||s.pages.length===0)return;const d=l,x=window.open("","_blank");if(!x){n.onError("浏览器拦截了弹窗,请允许弹窗后重试","pdf");return}u.set(x,{plan:s,epoch:d});const k=M(s,d,"PDF");W(s,d).then(C=>{if(!g(s,d)||x.closed){u.delete(x)&&x.close();return}const O=URL.createObjectURL(new Blob([C],{type:"application/pdf"}));setTimeout(()=>URL.revokeObjectURL(O),6e4);const H=x.document;H.title="PDF 预览",H.documentElement.style.height="100%",H.body.style.cssText="margin:0;height:100%;";const q=H.createElement("iframe");q.title="PDF 预览",q.style.cssText="display:block;width:100%;height:100%;border:0;",q.src=O,H.body.replaceChildren(q),u.delete(x)}).catch(C=>{x.close(),u.delete(x),g(s,d)&&n.onError(C instanceof Error?`PDF 预览失败: ${C.message}`:"PDF 预览失败","pdf")}).finally(()=>y(k))}return{print:N,exportAs:K,exportImages:R,exportWord:Z,openPdfWindow:oe,releasePrintFrame:B,dispose:$}}const ft="mrp-hit";function Yt(t){t.querySelectorAll(`mark.${ft}`).forEach(a=>{const o=a.parentNode;if(o){for(;a.firstChild;)o.insertBefore(a.firstChild,a);a.remove(),o.normalize()}})}function Zt(t,n){const a=n.trim();if(!a)return 0;const o=a.toLowerCase(),r=document.createTreeWalker(t,NodeFilter.SHOW_TEXT,{acceptNode(u){const m=u.parentElement;return!m||m.closest("mark")||/^(SCRIPT|STYLE)$/.test(m.tagName)?NodeFilter.FILTER_REJECT:(u.nodeValue??"").toLowerCase().includes(o)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),l=[];for(let u=r.nextNode();u;u=r.nextNode())l.push(u);let i=0;for(const u of l){const m=u.nodeValue??"",v=m.toLowerCase(),f=u.parentElement;if(!f)continue;const p=document.createDocumentFragment();let h=0,g=v.indexOf(o);for(;g>=0;){g>h&&p.appendChild(document.createTextNode(m.slice(h,g)));const F=document.createElement("mark");F.className=ft,F.textContent=m.slice(g,g+a.length),p.appendChild(F),i++,h=g+a.length,g=v.indexOf(o,h)}h<m.length&&p.appendChild(document.createTextNode(m.slice(h))),f.replaceChild(p,u)}return i}const Jt=new Set(["line","rect","ellipse","chart"]);function*Xt(t){for(const n of t.cells??[])for(const a of n??[])yield a?.text??"",yield*a?.children??[]}function*Qt(t){if(st.isRichText(t))for(const n of t.richParagraphs)for(const a of n.segments??[])yield(a.kind==="field"?a.field:a.text)??"";else t.lines?.length?yield*t.lines:yield t.text??""}function*_t(t){const n=[t.values()];for(;n.length>0;){const a=n[n.length-1].next();if(a.done){n.pop();continue}const o=a.value;if(typeof o=="string"){yield o;continue}yield"",!st.isImageBackedComponent(o)&&(o.kind==="text"?n.push(Qt(o)):o.grid?n.push(Xt(o.grid)):Jt.has(o.kind)||(yield o.fallbackText??""))}}function*en(t){for(let n=0;n<t.pages.length;n++){for(const a of _t(t.pages[n].components))yield{text:a,pageIndex:n};yield{text:"",pageIndex:n}}}function tn(t,n){const a=t.toLowerCase();let o=0;for(let r=a.indexOf(n);r>=0;r=a.indexOf(n,r+n.length))o++;return o}function nn(t){const{plan:n,gotoPage:a,highlight:o,clearHighlights:r}=t,l=e.ref(!1),i=e.ref(""),u=e.ref(0),m=e.ref(0),v=e.ref(!1);let f=[];const p=e.computed(()=>{if(m.value===0)return null;const $=u.value;let P=0,N=f.length-1;for(;P<N;){const z=P+N>>>1;f[z].cumulative<=$?P=z+1:N=z}const W=f[P];return W?{pageIndex:W.pageIndex,occurrence:$-(f[P-1]?.cumulative??0)}:null});let h=null,g=null,F=0;function M(){F++,h&&clearTimeout(h),g&&clearTimeout(g),h=g=null,v.value=!1}function y($){i.value=$,u.value=0,m.value=0,f=[],v.value=!1;const P=$.trim().toLowerCase(),N=n.value;if(!P||!N)return;v.value=!0;const W=F,z=en(N),L=[];let R=0;function Z(){if(g=null,W!==F||N!==n.value)return;const K=performance.now();let oe=0;for(;oe<5e3&&performance.now()-K<4;){const s=z.next();if(s.done){f=L,m.value=R,v.value=!1,f[0]&&a(f[0].pageIndex+1);return}const d=tn(s.value.text,P);if(d>0){R+=d;const x=L[L.length-1];x?.pageIndex===s.value.pageIndex?x.cumulative=R:L.push({pageIndex:s.value.pageIndex,cumulative:R})}oe++}g=setTimeout(Z,0)}Z()}function S($){if(M(),i.value=$,u.value=m.value=0,f=[],!$.trim()){y("");return}v.value=!0,h=setTimeout(()=>{h=null,y($)},Math.max(0,e.unref(t.debounceMs)??200))}function E($){const P=m.value;if(P===0||v.value)return;u.value=(u.value+$+P)%P;const N=p.value;N&&a(N.pageIndex+1)}function B(){M(),i.value="",u.value=m.value=0,f=[]}return e.watch(n,B,{flush:"sync"}),e.onScopeDispose(B),{visible:l,query:i,matchIndex:u,matchCount:m,activeMatch:p,searching:v,toggle:()=>{l.value=!l.value},onInput:S,onNav:E,apply:$=>{i.value.trim()&&o($,i.value.trim())},clear:$=>{r($)},reset:B}}function rn(t,n){const a=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(()=>!a.value||!n.plan.value?0:Math.round(JSON.stringify(n.plan.value).length/1024)),r=e.computed(()=>!a.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:a,debugStats:r}}function on(t,n){const{thumbsRoot:a,visible:o,renderThumbCanvas:r}=n,l=e.ref(0),i=e.ref(800),u=e.computed(()=>(t.value?.pages??[]).map(E=>Math.round(E.pageHeightMm/E.pageWidthMm*116))),m=e.computed(()=>lt.createPageWindowIndex(u.value.map(E=>E+20),8)),v=e.computed(()=>m.value.window(i.value,l.value,1)),f=e.computed(()=>{if(!o.value)return[];const{start:E,end:B}=v.value;return u.value.slice(E,B+1).map(($,P)=>({index:E+P,height:$}))});let p=0,h=0,g=!1;function F(){const E=a.value;E&&(l.value=E.scrollTop,i.value=E.clientHeight||800)}function M(){g||h||(h=requestAnimationFrame(()=>{h=0,F()}))}function y(){if(f.value,p&&cancelAnimationFrame(p),p=0,g||!o.value||!t.value||!a.value)return;F();const E=f.value,B=t.value,$=a.value;let P=0;function N(){if(p=0,!(g||!o.value||t.value!==B||a.value!==$)){for(let W=0;P<E.length&&W<2;W++,P++){const z=E[P].index,L=$.querySelector(`[data-thumb="${z+1}"]`);if(!L||L.childElementCount>0)continue;const R=r(z);R&&(R.style.width="100%",R.style.height="100%",R.style.display="block",L.appendChild(R))}P<E.length&&(p=requestAnimationFrame(N))}}p=requestAnimationFrame(N)}function S(){g=!0,p&&cancelAnimationFrame(p),h&&cancelAnimationFrame(h),p=h=0}return e.onScopeDispose(S),{schedule:y,destroy:S,onScroll:M,windowRange:v,visibleThumbs:f}}function an(){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 ln={class:"mrp-toolbar"},sn={class:"mrp-title"},cn=["disabled"],un={class:"mrp-pageinfo"},dn=["disabled"],fn={key:1,class:"mrp-search"},pn=["placeholder","value"],mn={key:0,class:"mrp-search-count",role:"status"},vn=["disabled"],gn=["disabled"],hn=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,a=e.ref(null);e.watch(()=>n.search.visible,r=>{r&&e.nextTick(()=>a.value?.focus())});function o(r,l,i){return r.replace("{cur}",String(l)).replace("{total}",String(i))}return(r,l)=>(e.openBlock(),e.createElementBlock("div",ln,[e.createElementVNode("span",sn,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:l[0]||(l[0]=i=>r.$emit("goto",t.currentPage-1))},e.toDisplayString(t.messages.prevPage),9,cn),e.createElementVNode("span",un,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:l[1]||(l[1]=i=>r.$emit("goto",t.currentPage+1))},e.toDisplayString(t.messages.nextPage),9,dn)],64)):e.createCommentVNode("",!0),l[17]||(l[17]=e.createElementVNode("span",{class:"mrp-spacer"},null,-1)),t.search.visible?(e.openBlock(),e.createElementBlock("div",fn,[e.createElementVNode("input",{ref_key:"searchInputRef",ref:a,class:"mrp-search-input",type:"text",placeholder:t.messages.searchPlaceholder,value:t.search.query,onInput:l[2]||(l[2]=i=>r.$emit("search-input",i.target.value))},null,40,pn),t.search.query?(e.openBlock(),e.createElementBlock("span",mn,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:l[3]||(l[3]=i=>r.$emit("search-nav",-1))},e.toDisplayString(t.messages.prevMatch),9,vn),e.createElementVNode("button",{class:"mrp-nav",type:"button",disabled:t.search.matchCount===0,onClick:l[4]||(l[4]=i=>r.$emit("search-nav",1))},e.toDisplayString(t.messages.nextMatch),9,gn)])):e.createCommentVNode("",!0),e.createElementVNode("button",{class:e.normalizeClass(["mrp-nav",{"mrp-active":t.search.visible}]),type:"button",title:"Ctrl+F",onClick:l[5]||(l[5]=i=>r.$emit("search-toggle"))}," 🔍 ",2),e.createElementVNode("button",{class:e.normalizeClass(["mrp-nav",{"mrp-active":t.thumbsVisible}]),type:"button",onClick:l[6]||(l[6]=i=>r.$emit("thumbs-toggle"))}," ▦ "+e.toDisplayString(t.messages.thumbnails),3),e.createElementVNode("button",{class:e.normalizeClass(["mrp-nav",{"mrp-active":t.zoomMode==="fit"}]),type:"button",onClick:l[7]||(l[7]=i=>r.$emit("zoom","fit"))},e.toDisplayString(t.messages.fitWidth),3),e.createElementVNode("button",{class:e.normalizeClass(["mrp-nav",{"mrp-active":t.zoomMode==="raw"&&Math.round(t.zoom*100)===100}]),type:"button",onClick:l[8]||(l[8]=i=>r.$emit("zoom",100))}," 100% ",2),e.createElementVNode("button",{class:e.normalizeClass(["mrp-nav",{"mrp-active":t.zoomMode==="raw"&&Math.round(t.zoom*100)===150}]),type:"button",onClick:l[9]||(l[9]=i=>r.$emit("zoom",150))}," 150% ",2),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:2,class:"mrp-nav",type:"button",onClick:l[10]||(l[10]=i=>r.$emit("export","html"))},e.toDisplayString(t.messages.exportHtml),1)):e.createCommentVNode("",!0),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:3,class:"mrp-nav",type:"button",onClick:l[11]||(l[11]=i=>r.$emit("export","pdf"))},e.toDisplayString(t.messages.exportPdf),1)):e.createCommentVNode("",!0),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:4,class:"mrp-nav",type:"button",onClick:l[12]||(l[12]=i=>r.$emit("export","xlsx"))},e.toDisplayString(t.messages.exportExcel),1)):e.createCommentVNode("",!0),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:5,class:"mrp-nav",type:"button",onClick:l[13]||(l[13]=i=>r.$emit("export","png"))},e.toDisplayString(t.messages.exportImage),1)):e.createCommentVNode("",!0),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:6,class:"mrp-nav",type:"button",onClick:l[14]||(l[14]=i=>r.$emit("export","word"))},e.toDisplayString(t.messages.exportWord),1)):e.createCommentVNode("",!0),t.showPrint?(e.openBlock(),e.createElementBlock("button",{key:7,class:"mrp-nav",type:"button",onClick:l[15]||(l[15]=i=>r.$emit("print"))},e.toDisplayString(t.messages.print),1)):e.createCommentVNode("",!0),t.showPdfWindow?(e.openBlock(),e.createElementBlock("button",{key:8,class:"mrp-nav",type:"button",onClick:l[16]||(l[16]=i=>r.$emit("pdf-window"))},e.toDisplayString(t.messages.pdfWindow),1)):e.createCommentVNode("",!0)]))}}),Ke=(t,n)=>{const a=t.__vccOpts||t;for(const[o,r]of n)a[o]=r;return a},pt=Ke(hn,[["__scopeId","data-v-601f8fa8"]]),wn={class:"mrp-params"},yn={class:"mrp-params-title"},bn={class:"mrp-params-grid"},xn={class:"mrp-param-label"},En={key:0,class:"mrp-param-star"},Pn=["value","onChange"],kn={value:"",disabled:"",hidden:""},Cn=["value"],$n=["type","placeholder","value","onInput"],Sn={class:"mrp-params-actions"},Bn=e.defineComponent({__name:"ReportParamPanel",props:{defs:{},modelValue:{},messages:{},attempted:{type:Boolean}},emits:["update:modelValue","query","reset"],setup(t,{emit:n}){const a=t,o=n,r=e.ref({...a.modelValue});e.watch(()=>a.modelValue,m=>{r.value={...m}});const l=e.computed(()=>a.defs.map(m=>({def:m,label:m.label??m.field,value:r.value[m.field]??""})));function i(m,v){r.value={...r.value,[m]:v},o("update:modelValue",{...r.value})}function u(m){const v=a.defs.find(f=>f.field===m);return a.attempted&&v?.required===!0&&!(r.value[m]??"").trim()}return(m,v)=>(e.openBlock(),e.createElementBlock("div",wn,[e.createElementVNode("span",yn,e.toDisplayString(t.messages.paramsTitle),1),e.createElementVNode("div",bn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value,f=>(e.openBlock(),e.createElementBlock("label",{key:f.def.field,class:e.normalizeClass(["mrp-param",{"mrp-param-missing":u(f.def.field)}])},[e.createElementVNode("span",xn,[e.createTextVNode(e.toDisplayString(f.label),1),f.def.required?(e.openBlock(),e.createElementBlock("i",En,"*")):e.createCommentVNode("",!0)]),(f.def.type??"text")==="select"?(e.openBlock(),e.createElementBlock("select",{key:0,class:"mrp-param-input",value:f.value,onChange:p=>i(f.def.field,p.target.value),onKeydown:v[0]||(v[0]=e.withKeys(p=>m.$emit("query"),["enter"]))},[e.createElementVNode("option",kn,e.toDisplayString(f.def.placeholder??`请选择${f.label}`),1),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(f.def.options??[],p=>(e.openBlock(),e.createElementBlock("option",{key:p.value,value:p.value},e.toDisplayString(p.label),9,Cn))),128))],40,Pn)):(e.openBlock(),e.createElementBlock("input",{key:1,class:"mrp-param-input",type:f.def.type==="number"?"number":f.def.type==="date"?"date":"text",placeholder:f.def.placeholder??`请输入${f.label}`,value:f.value,onInput:p=>i(f.def.field,p.target.value),onKeydown:v[1]||(v[1]=e.withKeys(p=>m.$emit("query"),["enter"]))},null,40,$n))],2))),128))]),e.createElementVNode("div",Sn,[e.createElementVNode("button",{class:"mrp-nav mrp-param-query",type:"button",onClick:v[2]||(v[2]=f=>m.$emit("query"))},e.toDisplayString(t.messages.query),1),e.createElementVNode("button",{class:"mrp-nav",type:"button",onClick:v[3]||(v[3]=f=>m.$emit("reset"))},e.toDisplayString(t.messages.reset),1)])]))}}),mt=Ke(Bn,[["__scopeId","data-v-aafce92d"]]),vt={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:"搜索中…"},gt={shellBg:"#525659",shellFg:"#e8e8e8",toolbarBg:"#323639",toolbarBorder:"#22252a",toolbarFg:"#e8e8e8",btnFg:"#cfcfcf",btnBorder:"#4a4d52",btnHoverBg:"#414549",btnHoverFg:"#ffffff",btnActiveBg:"#2d5fb8"};function ht(t={}){return{...t,defaults:t.defaults??{},presets:t.presets??{}}}function Rn(t){return t}const ne={showExport:!0,showPrint:!0,showPdfWindow:!0,showParams:!0,gapPx:18,pdfFontUrl:"/simhei.ttf",logger:console},Mn={warn:()=>{},info:()=>{}};function Ce(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 wt(t,n){const a=n?t?.presets?.[n]:t?.defaultPreset?t?.presets?.[t.defaultPreset]:void 0,o=Ce(t?.defaults,a);return{showExport:o.showExport??ne.showExport,showPrint:o.showPrint??ne.showPrint,showPdfWindow:o.showPdfWindow??ne.showPdfWindow,showParams:o.showParams??ne.showParams,gapPx:o.gapPx??ne.gapPx,pdfFontUrl:o.pdfFontUrl??ne.pdfFontUrl,theme:{...gt,...o.theme},messages:{...vt,...o.messages},logger:o.logger??ne.logger,preview:{overscanPages:nt(o.preview?.overscanPages,1,10,!0),searchDebounceMs:nt(o.preview?.searchDebounceMs,200,2e3)},xlsx:{...o.xlsx}}}function nt(t,n,a,o=!1){if(t==null||!Number.isFinite(t))return n;const r=Math.max(0,Math.min(a,t));return o?Math.floor(r):r}function yt(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 Fn(t){const n=e.inject(ie.MACH_REPORT_CONFIG_KEY,null),a=e.computed(()=>{const o=n?.value??null,r="defaults"in t||"presets"in t||"defaultPreset"in t?ht(t):{defaults:t,presets:{}};if(!o)return r;const l={...o.presets,...r.presets};for(const i of Object.keys(l))l[i]=Ce(Ce(o.presets[i],r.defaults),r.presets[i]);return{defaults:Ce(o.defaults,r.defaults),presets:l,defaultPreset:r.defaultPreset??o.defaultPreset}});e.provide(ie.MACH_REPORT_CONFIG_KEY,a)}function bt(){return e.inject(ie.MACH_REPORT_CONFIG_KEY,e.computed(()=>null))}const rt=new Map,le=new Map,Tn=15e3;function Ae(t,n){return Object.assign(new Error(t),{cause:n})}function me(t,n){return`PDF 字体 ${JSON.stringify(t)}:${n}。请部署支持报表文字的字体文件,并将 pdfFontUrl 配置为可访问的字体 URL;西文报表可设为空串`}function Be(t){if(t?.reason instanceof Error&&t.reason.name==="AbortError")return t.reason;const n=Ae("PDF 字体检查已取消",t?.reason);return n.name="AbortError",n}async function Dn(t,n){let a=!1;const o=setTimeout(()=>{a=!0,n.abort()},Tn);try{const r=await fetch(t,{method:"HEAD",signal:n.signal});if(n.signal.aborted)throw Be(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 i=new Error(`字体请求返回 HTTP ${r.status}`);return{status:"error",fontUrl:t,message:me(t,i.message),cause:i}}const l=r.headers.get("content-type")??"";if(/text\/html|application\/xhtml\+xml/i.test(l)){const i=new Error("字体 URL 返回 HTML 页面(可能是 SPA 路由回退),不是字体文件");return{status:"error",fontUrl:t,message:me(t,i.message),cause:i}}if(/^text\//i.test(l)||/(?:\/|\+)json(?:\s*;|$)/i.test(l)){const i=new Error(`字体 URL 返回 ${l} 文本响应,不是字体文件`);return{status:"error",fontUrl:t,message:me(t,i.message),cause:i}}return{status:"available",fontUrl:t,message:"PDF 字体资源可达;文字覆盖范围将在实际导出时校验"}}catch(r){if(n.signal.aborted&&!a)throw Be(n.signal);return{status:"error",fontUrl:t,message:me(t,a?"字体检查超时,请检查网络或字体服务":"字体检查失败,请检查网络、字体服务或跨域访问配置"),cause:r}}finally{clearTimeout(o)}}function Nn(t,n){if(n?.aborted)return Promise.reject(Be(n));if(!t)return Promise.resolve({status:"disabled",fontUrl:t,message:"已停用自定义 PDF 字体;内置字体用于西文,其他文字会在导出时校验"});const a=rt.get(t);if(a)return Promise.resolve(a);let o=le.get(t);if(!o){const l=new AbortController;o={controller:l,promise:Dn(t,l),subscribers:0};const i=o;le.set(t,i),i.promise=i.promise.then(u=>(!l.signal.aborted&&u.status==="available"&&rt.set(t,u),u)).finally(()=>{le.get(t)===i&&le.delete(t)})}const r=o;return r.subscribers++,new Promise((l,i)=>{let u=!1;const m=()=>u?!1:(u=!0,r.subscribers--,n?.removeEventListener("abort",v),!0),v=()=>{m()&&(r.subscribers===0&&(le.get(t)===r&&le.delete(t),r.controller.abort()),i(Be(n)))};n?.addEventListener("abort",v,{once:!0}),r.promise.then(f=>{m()&&l(f)},f=>{m()&&i(f)}),n?.aborted&&v()})}function xt(t={fontUrl:"/simhei.ttf"}){let n=null;const a=async(o,r)=>{n||(n=await import("@agile-team/mach-report/pdf"));let l=null;if(t.fontUrl)try{if(l=await n.loadFontWithCache(t.fontUrl,{strict:!0}),!l?.byteLength)throw new Error("字体文件为空或加载失败")}catch(p){const h=p instanceof Error?p.message:String(p);throw Ae(me(t.fontUrl,h),p)}let i;try{i=await n.renderPlanToPdf(o,l?{customFontBytes:l}:{})}catch(p){if(!l)throw p;const h=p instanceof Error?p.message:String(p);throw Ae(`PDF 生成失败:${h}。当前字体 URL 为 ${JSON.stringify(t.fontUrl)};请确认该文件是有效字体,或重新配置 pdfFontUrl`,p)}const{bytes:u,unsupportedTextCount:m,pageErrors:v,fidelityWarnings:f}=i;if(m>0)throw new Error(`PDF 中有 ${m} 行文字无法编码;请部署支持所用文字的字体并配置 pdfFontUrl`);if(v.length>0)throw new Error(`PDF 有 ${v.length} 页渲染失败:${v[0]}`);return f.length>0&&r?.(`PDF 有 ${f.length} 处版式降级:${f.slice(0,2).join(";")}`),u};return a.checkFont=o=>Nn(t.fontUrl,o),a}class re extends Error{constructor(n,a,o){super(a),this.name="MachReportError",this.code=n,this.cause=o}}function Et(t){return t instanceof re?{code:t.code,cause:t.cause}:{code:"render",cause:t}}const Vn={key:2,class:"mrp-export-notice mrp-export-warning",role:"status"},In={class:"mrp-main"},On={key:0,class:"mrp-state"},zn={key:1,class:"mrp-state mrp-error"},Wn={key:2,class:"mrp-state"},Ln=["data-page"],An=["onClick"],Hn=["data-thumb"],qn={class:"mrp-thumb-no"},jn={class:"mrp-overlay"},Un={key:3,class:"mrp-debug","aria-hidden":"true"},Ee=96/25.4,ot="mach-report:ui",at="mach-report:ui:wide",Kn=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:a}){e.useCssVars(c=>({v8eb72344:$.value+"px"}));const o=t,r=a,l=e.shallowRef(null),i=e.ref(!1),u=e.ref(""),m=e.shallowRef(null),v=e.ref(null),f=e.ref(!1),p=e.shallowRef(Object.freeze({status:"unchecked",fontUrl:""})),h=e.ref(null),g=e.ref(1),F=e.ref(null),M=e.ref(null),y=e.ref(null),S=e.ref(!1),E=an(),B=e.computed(()=>!!l.value?.pages.length&&l.value.pages.every(c=>c.layout==="wide")),$=e.computed(()=>Math.max(0,O.value));let P=ot;const N=e.inject(ie.MACH_REPORT_FETCHER_KEY,null),W=e.inject(ie.MACH_REPORT_PDF_EXPORTER_KEY,null),z=e.computed(()=>He(o.reportId)),L=e.computed(()=>o.fetcher??N),R=e.computed(()=>l.value?.pages.length??0),Z=e.computed(()=>Object.freeze({loading:i.value,hasPlan:R.value>0,pageCount:R.value,currentPage:g.value,exporting:v.value,printing:f.value,canExport:!i.value&&R.value>0&&v.value===null,canPrint:!i.value&&R.value>0&&!f.value,error:m.value,pdfFont:p.value}));function K(c,w,b){m.value=Object.freeze({message:c,code:w,cause:b}),r("error",c,{code:w,cause:b})}const oe=bt(),s=e.computed(()=>wt(oe.value,o.preset)),d=e.computed(()=>({...s.value.messages,...o.messages})),x=e.computed(()=>o.showExport??s.value.showExport),k=e.computed(()=>o.showPrint??s.value.showPrint),C=e.computed(()=>o.showPdfWindow??s.value.showPdfWindow),O=e.computed(()=>o.gapPx??(B.value?0:s.value.gapPx)),H=e.computed(()=>o.showParams??s.value.showParams);let q=null,Re=null;function Ge(){if(W)return W;const c=s.value.pdfFontUrl;return(!Re||q!==c)&&(q=c,Re=xt({fontUrl:c})),Re}let ve=0,ce=null,ge=null,J=!1;function Me(){ve++,ce?.abort(),ce=null}async function he(){if(J)throw new re("config","报表预览已卸载");Me();const c=ve,w=new AbortController;ce=w;const b=s.value.pdfFontUrl;p.value=Object.freeze({status:"checking",fontUrl:b});try{const V=Ge(),I=V.checkFont?await V.checkFont(w.signal):{status:"unverified",fontUrl:"",message:"自定义 PDF 导出器未提供字体预检查;字体由宿主确认"};return!J&&c===ve&&!w.signal.aborted&&(p.value=Object.freeze({...I})),I}catch(V){if(w.signal.aborted)throw V;const I={status:"error",fontUrl:b,message:V instanceof Error?V.message:"PDF 字体检查失败",cause:V};return!J&&c===ve&&(p.value=Object.freeze(I)),I}finally{ce===w&&(ce=null)}}function kt(){he().catch(()=>{})}e.watch([l,()=>s.value.pdfFontUrl,x,C],()=>{const c=p.value.fontUrl===s.value.pdfFontUrl;Me(),(!c||p.value.status==="checking")&&(p.value=Object.freeze({status:"unchecked",fontUrl:s.value.pdfFontUrl})),!J&&R.value>0&&(x.value||C.value)&&he().catch(()=>{})},{immediate:!0});const X=e.computed(()=>o.paramDefs??L.value?.getParamDefs?.(z.value)??[]),ee=e.ref({}),Fe=e.ref(!1);function ue(c){const w={};for(const b of c)w[b.field]=o.params[b.field]??b.defaultValue??"";ee.value=w,Fe.value=!1}ue(X.value),e.watch(X,c=>ue(c)),e.watch(z,()=>ue(X.value)),e.watch(()=>JSON.stringify(o.params),()=>ue(X.value));const Ct=e.computed(()=>{const c={...o.params};for(const[w,b]of Object.entries(ee.value))b===""?delete c[w]:c[w]=b;return c});function $t(){return X.value.filter(c=>c.required===!0&&!(ee.value[c.field]??"").trim())}function St(){Fe.value=!0;const c=$t();if(c.length>0){const w=c[0].label??c[0].field,b=d.value.paramRequired.replace("{label}",w);u.value=b,K(b,"param");return}te()}function Bt(){ue(X.value)}const Rt=e.computed(()=>({height:o.height,...yt(s.value.theme)})),{zoom:A,zoomMode:de,applyFitZoom:Ye,setZoom:fe}=ct(()=>({viewport:M.value,pageWidthPx:Te.contentSize.value.w||210*Ee})),Te=it(l,A,{pxPerMm:Ee,gapPx:O,overscan:e.computed(()=>s.value.preview.overscanPages)}),{contentSize:De,windowRange:pe,visiblePages:Ze,makeScrollHandler:Mt,refreshViewport:Ne}=Te,Ft=Mt(g,R);function Ve(c){fe(c*100)}function we(){Tt(),l.value=null,g.value=1,T.reset()}let Q=0,G=null;async function te(){if(J)return;const c=++Q;G?.abort(),G=null;const w=L.value;if(i.value=!1,m.value=null,z.value.length===0){u.value="缺少报表 ID",we(),K(u.value,"param");return}if(!w){u.value="未提供渲染数据源 fetcher",we(),K(u.value,"config");return}i.value=!0,u.value="",h.value=null,we();const b=E.start(),V=new AbortController;G=V;const I=new Set;function be(D){c!==Q||V.signal.aborted||I.has(D)||(I.add(D),s.value.logger.warn("[mach-report] 报表告警:",D),r("warning",D))}try{const D=await w({reportIds:z.value,params:{...Ct.value},signal:V.signal,onWarning:be});if(c!==Q)return;const j=se.validateRenderPlan(D);if(!j.ok){const xe=j.errors.slice(0,3).map(_e=>`${_e.path}: ${_e.message}`).join("; ");throw new re("validate",`渲染计划校验失败(${j.errors.length} 处): ${xe}`)}if(j.warnings.forEach(xe=>be(`${xe.path}: ${xe.message}`)),c!==Q||V.signal.aborted)return;l.value=D,g.value=1,E.end(b),M.value&&(M.value.scrollTop=0,M.value.scrollLeft=0);const _=B.value?at:ot;_!==P&&(P=_,Qe()),de.value==="fit"&&Ye(),r("loaded",D.pages.length)}catch(D){if(c!==Q)return;const j=D instanceof re?D:D instanceof se.ReportSourceError?new re(D.code,D.message,D.cause):new re("fetch",D instanceof Error?D.message:"预览加载失败",D);u.value=j.message;const _=Et(j);K(j.message,_.code,_.cause)}finally{c===Q&&(i.value=!1),G===V&&(G=null)}}function Y(c){if(J||R.value<=0)return;const w=Math.max(1,Math.min(R.value,c));g.value=w;const b=M.value;b&&(b.scrollTop=Te.pageOffsetPx(w-1)*A.value,Ne(b))}const ye=dt(l,{getPdfExporter:Ge,getXlsxOptions:()=>s.value.xlsx,onError:(c,w)=>{h.value={kind:"error",message:c},K(c,w??"print")},onWarning:c=>{h.value={kind:"warning",message:c},r("warning",c)},onBusy:c=>{v.value=c,c?h.value={kind:"progress",message:d.value.exporting.replace("{format}",c)}:h.value?.kind==="progress"&&(h.value=null)},onPrinting:c=>{f.value=c}}),{releasePrintFrame:Tt,dispose:Dt}=ye;async function Ie(){m.value=null,await ye.print()}async function Oe(c){m.value=null,await ye.exportAs(c)}function ze(){m.value=null,ye.openPdfWindow()}async function Je(c,w={}){J||(ee.value={...ee.value,...c},w.reload!==!1&&await te())}const Nt={reload:te,print:Ie,exportAs:Oe,openPdfWindow:ze,gotoPage:Y,setParams:Je,checkPdfFont:he,get state(){return Z.value}};e.provide(ie.MACH_REPORT_CONTROLLER_KEY,Nt);const T=nn({plan:l,gotoPage:Y,debounceMs:e.computed(()=>s.value.preview.searchDebounceMs),highlight:Zt,clearHighlights:Yt});function Vt(c){c.ctrlKey&&(c.preventDefault(),Ve(A.value*(c.deltaY<0?1.1:1/1.1)))}function It(c){if((c.ctrlKey||c.metaKey)&&c.key.toLowerCase()==="f"){c.preventDefault(),T.visible.value||T.toggle();return}switch(c.key){case"PageDown":c.preventDefault(),Y(g.value+1);break;case"PageUp":c.preventDefault(),Y(g.value-1);break;case"Home":c.preventDefault(),Y(1);break;case"End":c.preventDefault(),Y(R.value);break;case"+":case"=":c.preventDefault(),Ve(A.value*1.1);break;case"-":c.preventDefault(),Ve(A.value/1.1);break}}function Ot(){try{localStorage.setItem(P,JSON.stringify({zoomMode:de.value==="fit"?"fit":Math.round(A.value*100)}))}catch{}}e.watch([de,A],Ot);let We="";function Xe(c=!1){const w=T.activeMatch.value;if(!B.value||!w)return;const b=`${T.query.value}:${T.matchIndex.value}:${w.pageIndex}`;if(!c&&b===We)return;const I=F.value?.querySelector(`[data-page="${w.pageIndex+1}"]`)?.querySelectorAll("mark.mrp-hit")[w.occurrence];I&&(I.scrollIntoView?.({block:"nearest",inline:"nearest"}),We=b)}e.watchEffect(()=>{const c=l.value;if(!c)return;const w=T.activeMatch.value;T.matchIndex.value,w||(We=""),Ze.value;const b=F.value;if(!b)return;b.querySelectorAll(".mrp-page-holder").forEach(I=>{const be=Number(I.dataset.page??0)-1,D=c.pages[be];if(!D||I.childElementCount>0){if(I.firstElementChild){const _=I.firstElementChild;T.clear(_),T.apply(_)}return}I.style.width=`${D.pageWidthMm*Ee}px`;const j=se.renderPage(D,96,{},document);T.apply(j),I.appendChild(j)}),Xe()},{flush:"post"}),e.watch(()=>T.query.value,c=>{c||F.value?.querySelectorAll(".mrp-page-holder").forEach(w=>{T.clear(w)})});const U=on(l,{thumbsRoot:y,visible:S,renderThumbCanvas:c=>{try{const w=l.value.pages[c],b=Math.min(.2,116/Math.max(1,w.pageWidthMm*Ee)),{canvases:V}=se.renderPlanToCanvas(l.value,{start:c,end:c,dpr:b});return V[0]??null}catch{return null}}});e.watchEffect(()=>{U.schedule()},{flush:"post"});const zt=e.computed(()=>o.debug),{debugStats:ae}=rn(zt,{plan:l,pageCount:R,windowRange:pe,zoom:A,loadMs:E.loadMs});function Le(){Ne(M.value),U.schedule(),de.value==="fit"&&Ye(),Xe(!0)}function Qe(){fe(P===at?100:"fit");try{const c=JSON.parse(localStorage.getItem(P)??"{}");c.zoomMode==="fit"?fe("fit"):typeof c.zoomMode=="number"&&fe(c.zoomMode)}catch{}}return e.onMounted(()=>{window.addEventListener("resize",Le),typeof ResizeObserver<"u"&&M.value&&(ge=new ResizeObserver(Le),ge.observe(M.value)),Ne(M.value),Qe(),o.autoLoad&&te()}),e.onUnmounted(()=>{J=!0,Me(),Q++,G?.abort(),G=null,window.removeEventListener("resize",Le),ge?.disconnect(),ge=null,U.destroy(),T.reset(),Dt()}),e.watch(()=>[JSON.stringify(z.value),JSON.stringify(o.params),L.value],()=>{if(o.autoLoad){te();return}Q++,G?.abort(),G=null,i.value=!1,u.value="",m.value=null,h.value=null,we()}),n({reload:te,print:Ie,exportAs:Oe,openPdfWindow:ze,gotoPage:Y,setParams:Je,checkPdfFont:he,state:Z}),(c,w)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["mach-report-preview",{"mrp-wide-report":B.value}]),style:e.normalizeStyle(Rt.value)},[H.value&&X.value.length>0?(e.openBlock(),e.createBlock(mt,{key:0,defs:X.value,modelValue:ee.value,"onUpdate:modelValue":w[0]||(w[0]=b=>ee.value=b),messages:d.value,attempted:Fe.value,onQuery:St,onReset:Bt},null,8,["defs","modelValue","messages","attempted"])):e.createCommentVNode("",!0),e.createVNode(pt,{"page-count":R.value,"current-page":g.value,"zoom-mode":e.unref(de),zoom:e.unref(A),"show-export":x.value,"show-print":k.value,"show-pdf-window":C.value,messages:d.value,search:{visible:e.unref(T).visible.value,query:e.unref(T).query.value,matchIndex:e.unref(T).matchIndex.value,matchCount:e.unref(T).matchCount.value,searching:e.unref(T).searching.value},"thumbs-visible":S.value,onGoto:Y,onZoom:e.unref(fe),onExport:w[1]||(w[1]=b=>Oe(b)),onPrint:Ie,onPdfWindow:ze,onSearchInput:e.unref(T).onInput,onSearchNav:e.unref(T).onNav,onSearchToggle:e.unref(T).toggle,onThumbsToggle:w[2]||(w[2]=b=>S.value=!S.value)},null,8,["page-count","current-page","zoom-mode","zoom","show-export","show-print","show-pdf-window","messages","search","thumbs-visible","onZoom","onSearchInput","onSearchNav","onSearchToggle"]),h.value?(e.openBlock(),e.createElementBlock("div",{key:1,class:e.normalizeClass(["mrp-export-notice",`mrp-export-${h.value.kind}`]),role:"alert"},e.toDisplayString(h.value.message),3)):e.createCommentVNode("",!0),p.value.status==="error"&&(x.value||C.value)?(e.openBlock(),e.createElementBlock("div",Vn,[e.createTextVNode(e.toDisplayString(d.value.pdfFontUnavailable)+" ",1),e.createElementVNode("button",{type:"button",onClick:kt},e.toDisplayString(d.value.retry),1)])):e.createCommentVNode("",!0),e.createElementVNode("div",In,[e.createElementVNode("div",{ref_key:"viewportRef",ref:M,class:"mrp-body",tabindex:"0",onWheel:Vt,onKeydown:It,onScrollPassive:w[3]||(w[3]=b=>e.unref(Ft)(b.target))},[i.value?(e.openBlock(),e.createElementBlock("div",On,e.toDisplayString(d.value.loading),1)):u.value?(e.openBlock(),e.createElementBlock("div",zn,[e.createTextVNode(e.toDisplayString(u.value)+" ",1),e.createElementVNode("button",{class:"mrp-retry",type:"button",onClick:te},e.toDisplayString(d.value.retry),1)])):!l.value||R.value===0?(e.openBlock(),e.createElementBlock("div",Wn,e.toDisplayString(d.value.empty),1)):(e.openBlock(),e.createElementBlock("div",{key:3,class:"mrp-scale",style:e.normalizeStyle({width:`${e.unref(De).w*e.unref(A)}px`,height:`${e.unref(De).h*e.unref(A)}px`})},[e.createElementVNode("div",{ref_key:"containerRef",ref:F,class:"mrp-scale-inner",style:e.normalizeStyle({transform:`scale(${e.unref(A)})`,transformOrigin:"top left",width:`${e.unref(De).w}px`})},[e.unref(pe).padTopPx>0?(e.openBlock(),e.createElementBlock("div",{key:0,class:"mrp-spacer-top",style:e.normalizeStyle({height:`${e.unref(pe).padTopPx}px`}),"aria-hidden":"true"},null,4)):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(Ze),b=>(e.openBlock(),e.createElementBlock("div",{key:b.index,class:"mrp-page-holder","data-page":b.index+1},null,8,Ln))),128)),e.unref(pe).padBottomPx>0?(e.openBlock(),e.createElementBlock("div",{key:1,class:"mrp-spacer-bottom",style:e.normalizeStyle({height:`${e.unref(pe).padBottomPx}px`}),"aria-hidden":"true"},null,4)):e.createCommentVNode("",!0)],4)],4))],544),S.value&&R.value>0?(e.openBlock(),e.createElementBlock("aside",{key:0,ref_key:"thumbsRef",ref:y,class:"mrp-thumbs",onScrollPassive:w[4]||(w[4]=(...b)=>e.unref(U).onScroll&&e.unref(U).onScroll(...b))},[e.unref(U).windowRange.value.padTopPx>0?(e.openBlock(),e.createElementBlock("div",{key:0,class:"mrp-thumb-spacer",style:e.normalizeStyle({height:`${e.unref(U).windowRange.value.padTopPx}px`}),"aria-hidden":"true"},null,4)):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(U).visibleThumbs.value,b=>(e.openBlock(),e.createElementBlock("div",{key:b.index,class:e.normalizeClass(["mrp-thumb",{"mrp-thumb-active":b.index+1===g.value}]),style:e.normalizeStyle({height:`${b.height+20}px`}),onClick:V=>Y(b.index+1)},[e.createElementVNode("div",{class:"mrp-thumb-box","data-thumb":b.index+1,style:e.normalizeStyle({height:`${b.height}px`})},null,12,Hn),e.createElementVNode("span",qn,e.toDisplayString(b.index+1),1)],14,An))),128)),e.unref(U).windowRange.value.padBottomPx>0?(e.openBlock(),e.createElementBlock("div",{key:1,class:"mrp-thumb-spacer",style:e.normalizeStyle({height:`${e.unref(U).windowRange.value.padBottomPx}px`}),"aria-hidden":"true"},null,4)):e.createCommentVNode("",!0)],544)):e.createCommentVNode("",!0)]),e.createElementVNode("div",jn,[e.renderSlot(c.$slots,"default",{},void 0,!0)]),e.unref(ae)?(e.openBlock(),e.createElementBlock("div",Un,[w[5]||(w[5]=e.createElementVNode("div",null,"mach-report debug",-1)),e.createElementVNode("div",null,"pages: "+e.toDisplayString(e.unref(ae).pages)+" | window: ["+e.toDisplayString(e.unref(ae).window)+"]",1),e.createElementVNode("div",null,"zoom: "+e.toDisplayString(e.unref(ae).zoom)+" | load: "+e.toDisplayString(e.unref(ae).loadMs),1),e.createElementVNode("div",null,"plan: "+e.toDisplayString(e.unref(ae).planKB)+"KB",1)])):e.createCommentVNode("",!0)],6))}}),Pt=Ke(Kn,[["__scopeId","data-v-48919dc8"]]),Gn=Object.freeze(Object.defineProperty({__proto__:null,default:Pt},Symbol.toStringTag,{value:"Module"}));exports.DEFAULT_MESSAGES=vt;exports.DEFAULT_THEME=gt;exports.MachReportError=re;exports.PlanLoadError=Pe;exports.ReportParamPanel=mt;exports.ReportPreview=Pt;exports.ReportPreview$1=Gn;exports.ReportToolbar=pt;exports.SILENT_LOGGER=Mn;exports.buildPrintDocument=Ue;exports.buildWordHtml=ut;exports.createDefaultPdfExporter=xt;exports.createFetchRequest=Kt;exports.defineMachReportConfig=ht;exports.defineMachReportPreset=Rn;exports.joinReportIds=Ut;exports.normalizeReportIds=He;exports.printPlans=Gt;exports.provideMachReportConfig=Fn;exports.resolveConfig=wt;exports.themeToCssVars=yt;exports.toErrorDetail=Et;exports.useMachReportConfig=bt;exports.usePageWindow=it;exports.usePrintExport=dt;exports.useZoom=ct;