@agile-team/mach-report 2.4.0 → 2.5.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.
@@ -0,0 +1,6 @@
1
+ "use strict";var fn=Object.create;var Et=Object.defineProperty;var pn=Object.getOwnPropertyDescriptor;var vn=Object.getOwnPropertyNames;var gn=Object.getPrototypeOf,hn=Object.prototype.hasOwnProperty;var bn=(t,n,o,a)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of vn(n))!hn.call(t,r)&&r!==o&&Et(t,r,{get:()=>n[r],enumerable:!(a=pn(n,r))||a.enumerable});return t};var et=(t,n,o)=>(o=t!=null?fn(gn(t)):{},bn(n||!t||!t.__esModule?Et(o,"default",{value:t,enumerable:!0}):o,t));const e=require("vue"),U=require("@agile-team/mach-report"),Bt=require("./page-window-index-DEjnM6IB.cjs"),St=require("./render-plan-CCTL4F9v.cjs"),pe=require("./plugin-DMPLDpBY.cjs");function rt(t){return t==null?[]:Array.isArray(t)?t.map(String).filter(n=>n!==""):String(t).split(",").map(n=>n.trim()).filter(n=>n!=="")}function yn(t){return rt(t).join(",")}class Fe extends Error{constructor(n){super(n),this.name="PlanLoadError"}}function wn(t={}){const{baseUrl:n="",headers:o,credentials:a,timeoutMs:r=3e4}=t,l=n.replace(/\/+$/,"");return async({url:s,method:f,params:g,signal:b})=>{let u=`${l}${s}`;if(g&&Object.keys(g).length>0){const x=u.indexOf("#"),S=x>=0?u.slice(x):"",k=x>=0?u.slice(0,x):u,$=k.indexOf("?"),B=$>=0?k.slice(0,$):k,M=new URLSearchParams($>=0?k.slice($+1):"");for(const[N,K]of Object.entries(g))M.set(N,K);u=`${B}?${M}${S}`}const m=(x,S)=>{const k=new Fe(x);return Object.defineProperty(k,"cause",{value:S,configurable:!0,writable:!0}),k};if(b?.aborted)throw m(`请求已取消: ${s}`,b.reason);const p=new AbortController;let c;const E=()=>{p.signal.aborted||(c="external",p.abort(b?.reason))};b?.addEventListener("abort",E,{once:!0});const C=setTimeout(()=>{p.signal.aborted||(c="timeout",p.abort())},r);try{const x=await fetch(u,{method:f.toUpperCase(),headers:{Accept:"application/json",...o},credentials:a,signal:p.signal});if(!x.ok)throw new Fe(`HTTP ${x.status} ${s}`);return await x.json()}catch(x){throw c==="timeout"?m(`请求超时(${r}ms): ${s}`,x):c==="external"?m(`请求已取消: ${s}`,x):x instanceof Fe?x:m(`请求失败(${s}): ${x instanceof Error?x.message:String(x)}`,x)}finally{clearTimeout(C),b?.removeEventListener("abort",E)}}}function $t(t,n,o={}){const a=o.pxPerMm??3.7795275590551185,r=e.computed(()=>Math.max(0,e.unref(o.gapPx)??18)),l=e.ref(0),s=e.ref(800),f=e.computed(()=>{const x=t.value?.pages??[];return Bt.createPageWindowIndex(x.map(S=>S.pageHeightMm*a),r.value)}),g=e.computed(()=>{let x=0;for(const S of t.value?.pages??[])x=Math.max(x,S.pageWidthMm*a);return{w:x,h:f.value.totalHeightPx}}),b=e.computed(()=>f.value.window(s.value/n.value,l.value/n.value,e.unref(o.overscan)??1)),u=e.computed(()=>{const x=t.value;if(!x)return[];const{start:S,end:k}=b.value;return x.pages.slice(S,k+1).map(($,B)=>({page:$,index:S+B}))});let m=0,p=!1;function c(x){x&&(l.value=x.scrollTop,s.value=x.clientHeight||800)}function E(x,S){return k=>{m||p||(m=requestAnimationFrame(()=>{if(m=0,p||(c(k),S.value<=0))return;const $=Math.max(0,k.scrollTop+32)/n.value;x.value=Math.min(S.value,f.value.pageAt($)+1)}))}}function C(){p=!0,m&&cancelAnimationFrame(m),m=0}return e.onScopeDispose(C),{contentSize:g,windowRange:b,visiblePages:u,makeScrollHandler:E,refreshViewport:c,pageOffsetPx:x=>f.value.offsetAt(x),destroy:C}}function Rt(t){const n=e.ref(1),o=e.ref("fit");let a=0;function r(){a&&cancelAnimationFrame(a),a=0}function l(){r(),a=requestAnimationFrame(()=>{if(a=0,o.value!=="fit")return;const f=t();!f?.viewport||f.viewport.clientWidth<=48||!Number.isFinite(f.pageWidthPx)||(n.value=Math.min(1,(f.viewport.clientWidth-48)/Math.max(1,f.pageWidthPx)))})}function s(f){if(f==="fit")o.value="fit",l();else{if(!Number.isFinite(f))return;r(),o.value="raw",n.value=Math.min(3,Math.max(.3,f/100))}}return e.getCurrentScope()&&e.onScopeDispose(r),{zoom:n,zoomMode:o,applyFitZoom:l,setZoom:s}}const Te=8;function Ve(){return new Promise(t=>setTimeout(t,0))}function Ne(t){return`p${t.pageWidthMm}x${t.pageHeightMm}`.replace(/[.+]/g,"_")}function at(t){const n=new Map;return t.pages.forEach(r=>{n.has(Ne(r))||n.set(Ne(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 ${Ne(r)}{size:${r.pageWidthMm}mm ${r.pageHeightMm}mm;margin:0;}`).join(`
5
+ `)}
6
+ body{margin:0;background:#fff;}`}</style></head><body>`}function lt(t){const n=U.renderPage(t,96,{},document);return n.style.page=Ne(t),n.outerHTML}function st(t){return{head:at(t),pageChunks:t.pages.map(lt)}}async function xn(t,n={}){const o={schemaVersion:"mach-report-batch-print",pages:t.flatMap(s=>s.pages)};if(o.pages.length===0)return;const a=at(o),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 s=r.contentDocument;s.open(),s.write(a);for(let f=0;f<o.pages.length;f++)s.write(lt(o.pages[f])),f%Te===Te-1&&(n.onProgress?.(f+1,o.pages.length),await Ve());s.write("</body></html>"),s.close(),await Ve(),n.onProgress?.(o.pages.length,o.pages.length),l=!0,r.contentWindow?.focus(),r.contentWindow?.print()}catch(s){n.onError?.(s instanceof Error?`批量打印失败: ${s.message}`:"批量打印失败")}finally{l?setTimeout(()=>r.remove(),6e4):r.remove()}}function Mt(t){const{head:n,pageChunks:o}=st(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>/,"")}`}${o.join("")}</body></html>`,filename:"mach-report.doc"}}function Ft(t,n){let o=null,a=!1,r=!1,l=0;const s=new Map,f=new Map;let g=null,b=null,u=null,m=null,p=null;function c(d,y){return!r&&t.value===d&&l===y}function E(){if(r)return;const d=[...s.values()].reverse().find(y=>c(y.plan,y.epoch))?.format??null;d!==g&&(g=d,n.onBusy?.(d))}function C(d,y,w){const P={};return s.set(P,{plan:d,epoch:y,format:w}),E(),P}function x(d){s.delete(d),E()}function S(){for(const[d,y]of f)c(y.plan,y.epoch)||(d.close(),f.delete(d))}function k(){l++,B(),E(),S()}const $=e.watch(t,k,{flush:"sync"});function B(){o?.remove(),o=null}function M(){r=!0,l++,$(),B(),S(),s.clear(),n.onPrinting?.(!1)}function N(d,y){const w=URL.createObjectURL(d);setTimeout(()=>URL.revokeObjectURL(w),1e4);const P=document.createElement("a");P.href=w,P.download=y,P.click()}async function K(){if(a)return;const d=t.value;if(r||!d||d.pages.length===0)return;const y=l;a=!0,n.onPrinting?.(!0),B();const w=at(d);o=document.createElement("iframe"),o.style.cssText="position:fixed;right:0;bottom:0;width:0;height:0;border:0;visibility:hidden;",document.body.appendChild(o);const P=o;try{const R=P.contentDocument;R.open(),R.write(w);for(let W=0;W<d.pages.length;W++)if(R.write(lt(d.pages[W])),W%Te===Te-1&&await Ve(),P!==o)return;if(R.write("</body></html>"),R.close(),await Ve(),!c(d,y)||P!==o)return;P.contentWindow?.focus(),P.contentWindow?.print()}catch{P===o&&B(),c(d,y)&&n.onError("调用打印失败,请改用导出 PDF","print")}finally{a=!1,r||n.onPrinting?.(!1)}}function z(d,y){if(b?.plan===d&&b.epoch===y)return b.promise;const w=Promise.resolve().then(()=>{if(!c(d,y))throw new Error("报表已切换或卸载");return n.getPdfExporter()(d,P=>{c(d,y)&&n.onWarning?.(P)})}).finally(()=>{b?.promise===w&&(b=null)});return b={plan:d,epoch:y,promise:w},w}async function Z(){const d=t.value;if(r||!d||d.pages.length===0)return;const y=l;if(u?.plan===d&&u.epoch===y)return u.promise;const w=C(d,y,"PDF"),P=(async()=>{try{const R=await z(d,y);if(!c(d,y))return;N(new Blob([R],{type:"application/pdf"}),"mach-report.pdf")}catch(R){c(d,y)&&n.onError(R instanceof Error?`PDF 导出失败: ${R.message}`:"PDF 导出失败","pdf")}finally{x(w),u?.token===w&&(u=null)}})();return u={plan:d,epoch:y,promise:P,token:w},P}async function H(){const d=t.value;if(r||!d||d.pages.length===0)return;const y=l;if(m?.plan===d&&m.epoch===y)return m.promise;const w={...n.getXlsxOptions?.()},P=C(d,y,"Excel"),R=(async()=>{try{const{renderPlanToXlsx:W}=await import("@agile-team/mach-report/xlsx");if(!c(d,y))return;const{buffer:j,warnings:X}=await W(d,w);if(!c(d,y)||(X.length>0&&n.onWarning?.(`Excel 导出有 ${X.length} 条提示:${X.slice(0,2).join(";")}`),!c(d,y)))return;N(new Blob([j],{type:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}),"mach-report.xlsx")}catch(W){c(d,y)&&n.onError(W instanceof Error?`Excel 导出失败: ${W.message}`:"Excel 导出失败","export")}finally{x(P),m?.token===P&&(m=null)}})();return m={plan:d,epoch:y,promise:R,token:P},R}async function J(){const d=t.value;if(r||!d||d.pages.length===0)return;const y=l;if(p?.plan===d&&p.epoch===y)return p.promise;const w=C(d,y,"图片"),P=(async()=>{try{const{blobs:R}=await U.renderPlanToImages(d,{dpr:Math.min(2,typeof devicePixelRatio=="number"?devicePixelRatio:1)});if(!c(d,y))return;R.forEach((W,j)=>{N(W,R.length>1?`mach-report-page-${j+1}.png`:"mach-report.png")})}catch(R){c(d,y)&&n.onError(R instanceof Error?`图片导出失败: ${R.message}`:"图片导出失败","export")}finally{x(w),p?.token===w&&(p=null)}})();return p={plan:d,epoch:y,promise:P,token:w},P}function ae(){const d=t.value;if(!(r||!d||d.pages.length===0))try{const{html:y,filename:w}=Mt(d);N(new Blob([y],{type:"application/msword;charset=utf-8"}),w)}catch(y){n.onError(y instanceof Error?`Word 导出失败: ${y.message}`:"Word 导出失败","export")}}async function O(d){const y=t.value;if(!(r||!y||y.pages.length===0)){if(d==="pdf"){await Z();return}if(d==="xlsx"||d==="excel"){await H();return}if(d==="png"||d==="image"){await J();return}if(d==="word"||d==="doc"){ae();return}if(d!=="html"){n.onError(`不支持的导出格式:${d}`,"export");return}try{const{head:w,pageChunks:P}=st(y),R=`${w}${P.join("")}</body></html>`;N(new Blob([R],{type:"text/html;charset=utf-8"}),"mach-report.html")}catch(w){n.onError(w instanceof Error?`HTML 导出失败: ${w.message}`:"HTML 导出失败","export")}}}function te(){const d=t.value;if(r||!d||d.pages.length===0)return;const y=l,w=window.open("","_blank");if(!w){n.onError("浏览器拦截了弹窗,请允许弹窗后重试","pdf");return}f.set(w,{plan:d,epoch:y});const P=C(d,y,"PDF");z(d,y).then(R=>{if(!c(d,y)||w.closed){f.delete(w)&&w.close();return}const W=URL.createObjectURL(new Blob([R],{type:"application/pdf"}));setTimeout(()=>URL.revokeObjectURL(W),6e4);const j=w.document;j.title="PDF 预览",j.documentElement.style.height="100%",j.body.style.cssText="margin:0;height:100%;";const X=j.createElement("iframe");X.title="PDF 预览",X.style.cssText="display:block;width:100%;height:100%;border:0;",X.src=W,j.body.replaceChildren(X),f.delete(w)}).catch(R=>{w.close(),f.delete(w),c(d,y)&&n.onError(R instanceof Error?`PDF 预览失败: ${R.message}`:"PDF 预览失败","pdf")}).finally(()=>x(P))}return{print:K,exportAs:O,exportImages:J,exportWord:ae,openPdfWindow:te,invalidatePending:k,releasePrintFrame:B,dispose:M}}const Nt="mrp-hit";function En(t){t.querySelectorAll(`mark.${Nt}`).forEach(o=>{const a=o.parentNode;if(a){for(;o.firstChild;)a.insertBefore(o.firstChild,o);o.remove(),a.normalize()}})}function kn(t,n){const o=n.trim();if(!o)return 0;const a=o.toLowerCase(),r=document.createTreeWalker(t,NodeFilter.SHOW_TEXT,{acceptNode(f){const g=f.parentElement;return!g||g.closest("mark")||/^(SCRIPT|STYLE)$/.test(g.tagName)?NodeFilter.FILTER_REJECT:(f.nodeValue??"").toLowerCase().includes(a)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),l=[];for(let f=r.nextNode();f;f=r.nextNode())l.push(f);let s=0;for(const f of l){const g=f.nodeValue??"",b=g.toLowerCase(),u=f.parentElement;if(!u)continue;const m=document.createDocumentFragment();let p=0,c=b.indexOf(a);for(;c>=0;){c>p&&m.appendChild(document.createTextNode(g.slice(p,c)));const E=document.createElement("mark");E.className=Nt,E.textContent=g.slice(c,c+o.length),m.appendChild(E),s++,p=c+o.length,c=b.indexOf(a,p)}p<g.length&&m.appendChild(document.createTextNode(g.slice(p))),u.replaceChild(m,f)}return s}const Pn=new Set(["line","rect","ellipse","chart"]);function*Cn(t){for(const n of t.cells??[])for(const o of n??[])yield o?.text??"",yield*o?.children??[]}function*Bn(t){if(St.isRichText(t))for(const n of t.richParagraphs)for(const o of n.segments??[])yield(o.kind==="field"?o.field:o.text)??"";else t.lines?.length?yield*t.lines:yield t.text??""}function*Sn(t){const n=[t.values()];for(;n.length>0;){const o=n[n.length-1].next();if(o.done){n.pop();continue}const a=o.value;if(typeof a=="string"){yield a;continue}yield"",!St.isImageBackedComponent(a)&&(a.kind==="text"?n.push(Bn(a)):a.grid?n.push(Cn(a.grid)):Pn.has(a.kind)||(yield a.fallbackText??""))}}function*$n(t){for(let n=0;n<t.pages.length;n++){for(const o of Sn(t.pages[n].components))yield{text:o,pageIndex:n};yield{text:"",pageIndex:n}}}function Rn(t,n){const o=t.toLowerCase();let a=0;for(let r=o.indexOf(n);r>=0;r=o.indexOf(n,r+n.length))a++;return a}function Mn(t){const{plan:n,gotoPage:o,highlight:a,clearHighlights:r}=t,l=e.ref(!1),s=e.ref(""),f=e.ref(0),g=e.ref(0),b=e.ref(!1);let u=[];const m=e.computed(()=>{if(g.value===0)return null;const B=f.value;let M=0,N=u.length-1;for(;M<N;){const z=M+N>>>1;u[z].cumulative<=B?M=z+1:N=z}const K=u[M];return K?{pageIndex:K.pageIndex,occurrence:B-(u[M-1]?.cumulative??0)}:null});let p=null,c=null,E=0;function C(){E++,p&&clearTimeout(p),c&&clearTimeout(c),p=c=null,b.value=!1}function x(B){s.value=B,f.value=0,g.value=0,u=[],b.value=!1;const M=B.trim().toLowerCase(),N=n.value;if(!M||!N)return;b.value=!0;const K=E,z=$n(N),Z=[];let H=0;function J(){if(c=null,K!==E||N!==n.value)return;const ae=performance.now();let O=0;for(;O<5e3&&performance.now()-ae<4;){const te=z.next();if(te.done){u=Z,g.value=H,b.value=!1,u[0]&&o(u[0].pageIndex+1);return}const d=Rn(te.value.text,M);if(d>0){H+=d;const y=Z[Z.length-1];y?.pageIndex===te.value.pageIndex?y.cumulative=H:Z.push({pageIndex:te.value.pageIndex,cumulative:H})}O++}c=setTimeout(J,0)}J()}function S(B){if(C(),s.value=B,f.value=g.value=0,u=[],!B.trim()){x("");return}b.value=!0,p=setTimeout(()=>{p=null,x(B)},Math.max(0,e.unref(t.debounceMs)??200))}function k(B){const M=g.value;if(M===0||b.value)return;f.value=(f.value+B+M)%M;const N=m.value;N&&o(N.pageIndex+1)}function $(){C(),s.value="",f.value=g.value=0,u=[]}return e.watch(n,$,{flush:"sync"}),e.onScopeDispose($),{visible:l,query:s,matchIndex:f,matchCount:g,activeMatch:m,searching:b,toggle:()=>{l.value=!l.value},onInput:S,onNav:k,apply:B=>{s.value.trim()&&a(B,s.value.trim())},clear:B=>{r(B)},reset:$}}function Fn(t,n){const o=e.computed(()=>{if(t.value)return!0;if(typeof location>"u")return!1;try{return new URLSearchParams(location.search).get("mrp-debug")==="1"}catch{return!1}}),a=e.computed(()=>!o.value||!n.plan.value?0:Math.round(JSON.stringify(n.plan.value).length/1024)),r=e.computed(()=>!o.value||!n.plan.value?null:{pages:n.pageCount.value,window:`${n.windowRange.value.start}-${n.windowRange.value.end}`,zoom:`${Math.round(n.zoom.value*100)}%`,loadMs:`${n.loadMs.value}ms`,planKB:a.value});return{enabled:o,debugStats:r}}function Nn(t,n){const{thumbsRoot:o,visible:a,renderThumbCanvas:r}=n,l=e.ref(0),s=e.ref(800),f=e.computed(()=>(t.value?.pages??[]).map(k=>Math.round(k.pageHeightMm/k.pageWidthMm*116))),g=e.computed(()=>Bt.createPageWindowIndex(f.value.map(k=>k+20),8)),b=e.computed(()=>g.value.window(s.value,l.value,1)),u=e.computed(()=>{if(!a.value)return[];const{start:k,end:$}=b.value;return f.value.slice(k,$+1).map((B,M)=>({index:k+M,height:B}))});let m=0,p=0,c=!1;function E(){const k=o.value;k&&(l.value=k.scrollTop,s.value=k.clientHeight||800)}function C(){c||p||(p=requestAnimationFrame(()=>{p=0,E()}))}function x(){if(u.value,m&&cancelAnimationFrame(m),m=0,c||!a.value||!t.value||!o.value)return;E();const k=u.value,$=t.value,B=o.value;let M=0;function N(){if(m=0,!(c||!a.value||t.value!==$||o.value!==B)){for(let K=0;M<k.length&&K<2;K++,M++){const z=k[M].index,Z=B.querySelector(`[data-thumb="${z+1}"]`);if(!Z||Z.childElementCount>0)continue;const H=r(z);H&&(H.style.width="100%",H.style.height="100%",H.style.display="block",Z.appendChild(H))}M<k.length&&(m=requestAnimationFrame(N))}}m=requestAnimationFrame(N)}function S(){c=!0,m&&cancelAnimationFrame(m),p&&cancelAnimationFrame(p),m=p=0}return e.onScopeDispose(S),{schedule:x,destroy:S,onScroll:C,windowRange:b,visibleThumbs:u}}function Dn(){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 Tn=["aria-label"],Vn={class:"mrp-title"},In=["disabled"],On={class:"mrp-pageinfo"},zn=["disabled"],Ln=["disabled"],Wn={key:2,class:"mrp-search"},An=["placeholder","value"],Hn={key:0,class:"mrp-search-count",role:"status"},jn=["disabled"],qn=["disabled"],Un=["aria-label"],Kn=["disabled"],Zn=["disabled"],Gn=["disabled"],Yn=["disabled"],Jn=["disabled"],Xn=["disabled"],Qn=["disabled"],_n=["aria-label","aria-expanded"],eo=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},showSearch:{type:Boolean},showThumbnails:{type:Boolean},showZoom:{type:Boolean},exportFormats:{},showSettings:{type:Boolean},settingsOpen:{type:Boolean},busy:{type:Boolean}},emits:["goto","zoom","export","print","pdf-window","search-input","search-nav","search-toggle","thumbs-toggle","import-excel","settings-toggle"],setup(t){const n=t,o=e.ref(null);e.watch(()=>n.search.visible,r=>{r&&e.nextTick(()=>o.value?.focus())});function a(r,l,s){return r.replace("{cur}",String(l)).replace("{total}",String(s))}return(r,l)=>(e.openBlock(),e.createElementBlock("div",{class:"mrp-toolbar",role:"toolbar","aria-label":t.messages.title},[e.createElementVNode("span",Vn,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]=s=>r.$emit("goto",t.currentPage-1))},e.toDisplayString(t.messages.prevPage),9,In),e.createElementVNode("span",On,e.toDisplayString(a(t.messages.pageInfo,t.currentPage,t.pageCount)),1),e.createElementVNode("button",{class:"mrp-nav",type:"button",disabled:t.currentPage>=t.pageCount,onClick:l[1]||(l[1]=s=>r.$emit("goto",t.currentPage+1))},e.toDisplayString(t.messages.nextPage),9,zn)],64)):e.createCommentVNode("",!0),l[21]||(l[21]=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:l[2]||(l[2]=s=>r.$emit("import-excel"))},e.toDisplayString(t.messages.importExcel??"导入 Excel 模板"),9,Ln)):e.createCommentVNode("",!0),t.showSearch!==!1&&t.search.visible?(e.openBlock(),e.createElementBlock("div",Wn,[e.createElementVNode("input",{ref_key:"searchInputRef",ref:o,class:"mrp-search-input",type:"text",placeholder:t.messages.searchPlaceholder,value:t.search.query,onInput:l[3]||(l[3]=s=>r.$emit("search-input",s.target.value))},null,40,An),t.search.query?(e.openBlock(),e.createElementBlock("span",Hn,e.toDisplayString(t.search.searching?t.messages.searching??"搜索中…":a(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[4]||(l[4]=s=>r.$emit("search-nav",-1))},e.toDisplayString(t.messages.prevMatch),9,jn),e.createElementVNode("button",{class:"mrp-nav",type:"button",disabled:t.search.matchCount===0,onClick:l[5]||(l[5]=s=>r.$emit("search-nav",1))},e.toDisplayString(t.messages.nextMatch),9,qn)])):e.createCommentVNode("",!0),t.showSearch!==!1?(e.openBlock(),e.createElementBlock("button",{key:3,class:e.normalizeClass(["mrp-nav",{"mrp-active":t.search.visible}]),type:"button",title:"Ctrl+F","aria-label":t.messages.search??t.messages.searchPlaceholder,onClick:l[6]||(l[6]=s=>r.$emit("search-toggle"))},[...l[19]||(l[19]=[e.createElementVNode("svg",{width:"13",height:"13",viewBox:"0 0 20 20",fill:"none","aria-hidden":"true"},[e.createElementVNode("circle",{cx:"8.5",cy:"8.5",r:"5.5",stroke:"currentColor","stroke-width":"1.6"}),e.createElementVNode("path",{d:"m13 13 4 4",stroke:"currentColor","stroke-width":"1.6","stroke-linecap":"round"})],-1)])],10,Un)):e.createCommentVNode("",!0),t.showThumbnails!==!1?(e.openBlock(),e.createElementBlock("button",{key:4,class:e.normalizeClass(["mrp-nav",{"mrp-active":t.thumbsVisible}]),type:"button",onClick:l[7]||(l[7]=s=>r.$emit("thumbs-toggle"))}," ▦ "+e.toDisplayString(t.messages.thumbnails),3)):e.createCommentVNode("",!0),t.showZoom!==!1?(e.openBlock(),e.createElementBlock("button",{key:5,class:e.normalizeClass(["mrp-nav",{"mrp-active":t.zoomMode==="fit"}]),type:"button",onClick:l[8]||(l[8]=s=>r.$emit("zoom","fit"))},e.toDisplayString(t.messages.fitWidth),3)):e.createCommentVNode("",!0),t.showZoom!==!1?(e.openBlock(),e.createElementBlock("button",{key:6,class:e.normalizeClass(["mrp-nav",{"mrp-active":t.zoomMode==="raw"&&Math.round(t.zoom*100)===100}]),type:"button",onClick:l[9]||(l[9]=s=>r.$emit("zoom",100))}," 100% ",2)):e.createCommentVNode("",!0),t.showZoom!==!1?(e.openBlock(),e.createElementBlock("button",{key:7,class:e.normalizeClass(["mrp-nav",{"mrp-active":t.zoomMode==="raw"&&Math.round(t.zoom*100)===150}]),type:"button",onClick:l[10]||(l[10]=s=>r.$emit("zoom",150))}," 150% ",2)):e.createCommentVNode("",!0),t.showExport&&(!t.exportFormats||t.exportFormats.includes("html"))?(e.openBlock(),e.createElementBlock("button",{key:8,class:"mrp-nav",type:"button",disabled:t.busy,onClick:l[11]||(l[11]=s=>r.$emit("export","html"))},e.toDisplayString(t.messages.exportHtml),9,Kn)):e.createCommentVNode("",!0),t.showExport&&(!t.exportFormats||t.exportFormats.includes("pdf"))?(e.openBlock(),e.createElementBlock("button",{key:9,class:"mrp-nav",type:"button",disabled:t.busy,onClick:l[12]||(l[12]=s=>r.$emit("export","pdf"))},e.toDisplayString(t.messages.exportPdf),9,Zn)):e.createCommentVNode("",!0),t.showExport&&(!t.exportFormats||t.exportFormats.includes("xlsx"))?(e.openBlock(),e.createElementBlock("button",{key:10,class:"mrp-nav",type:"button",disabled:t.busy,onClick:l[13]||(l[13]=s=>r.$emit("export","xlsx"))},e.toDisplayString(t.messages.exportExcel),9,Gn)):e.createCommentVNode("",!0),t.showExport&&(!t.exportFormats||t.exportFormats.includes("png"))?(e.openBlock(),e.createElementBlock("button",{key:11,class:"mrp-nav",type:"button",disabled:t.busy,onClick:l[14]||(l[14]=s=>r.$emit("export","png"))},e.toDisplayString(t.messages.exportImage),9,Yn)):e.createCommentVNode("",!0),t.showExport&&(!t.exportFormats||t.exportFormats.includes("word"))?(e.openBlock(),e.createElementBlock("button",{key:12,class:"mrp-nav",type:"button",disabled:t.busy,onClick:l[15]||(l[15]=s=>r.$emit("export","word"))},e.toDisplayString(t.messages.exportWord),9,Jn)):e.createCommentVNode("",!0),t.showPrint?(e.openBlock(),e.createElementBlock("button",{key:13,class:"mrp-nav",type:"button",disabled:t.busy,onClick:l[16]||(l[16]=s=>r.$emit("print"))},e.toDisplayString(t.messages.print),9,Xn)):e.createCommentVNode("",!0),t.showPdfWindow?(e.openBlock(),e.createElementBlock("button",{key:14,class:"mrp-nav",type:"button",disabled:t.busy,onClick:l[17]||(l[17]=s=>r.$emit("pdf-window"))},e.toDisplayString(t.messages.pdfWindow),9,Qn)):e.createCommentVNode("",!0),t.showSettings?(e.openBlock(),e.createElementBlock("button",{key:15,class:"mrp-nav mrp-settings-toggle",type:"button","aria-label":t.messages.settings,"aria-haspopup":"dialog","aria-expanded":!!t.settingsOpen,onClick:l[18]||(l[18]=s=>r.$emit("settings-toggle"))},[l[20]||(l[20]=e.createStaticVNode('<svg width="14" height="14" viewBox="0 0 20 20" fill="none" aria-hidden="true" data-v-4223ad9f><path d="M3 5h14M3 10h14M3 15h14" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" data-v-4223ad9f></path><circle cx="7" cy="5" r="2" fill="var(--mrp-toolbar-bg)" stroke="currentColor" stroke-width="1.5" data-v-4223ad9f></circle><circle cx="13" cy="10" r="2" fill="var(--mrp-toolbar-bg)" stroke="currentColor" stroke-width="1.5" data-v-4223ad9f></circle><circle cx="8" cy="15" r="2" fill="var(--mrp-toolbar-bg)" stroke="currentColor" stroke-width="1.5" data-v-4223ad9f></circle></svg>',1)),e.createTextVNode(" "+e.toDisplayString(t.messages.settings),1)],8,_n)):e.createCommentVNode("",!0)],8,Tn))}}),Ee=(t,n)=>{const o=t.__vccOpts||t;for(const[a,r]of n)o[a]=r;return o},Dt=Ee(eo,[["__scopeId","data-v-4223ad9f"]]),to=["aria-label"],no={class:"mrp-settings-header"},oo=["aria-label"],ro={class:"mrp-settings-content"},ao={key:0},lo=["checked","disabled","onChange"],so={key:0,class:"mrp-settings-note"},io={key:1,class:"mrp-settings-note"},co=["disabled"],uo=e.defineComponent({__name:"ReportSettings",props:{available:{},enabled:{},messages:{},persistedEditing:{type:Boolean},busy:{type:Boolean}},emits:["change","reset","close"],setup(t,{emit:n}){const o=t,a=n,r=e.ref(null),l=e.ref(null);let s=null;const f=e.computed(()=>[{label:o.messages.settingsDisplay,tools:[["search",o.messages.search],["thumbnails",o.messages.thumbnails],["zoom",o.messages.zoom]]},{label:o.messages.settingsExport,tools:[["html",o.messages.exportHtml],["pdf",o.messages.exportPdf],["xlsx",o.messages.exportExcel],["png",o.messages.exportImage],["word",o.messages.exportWord],["print",o.messages.print],["pdfWindow",o.messages.pdfWindow]]},{label:o.messages.settingsData,tools:[["editing",o.messages.editCell],["import",o.messages.importExcel]]}].map(u=>({...u,tools:u.tools.map(([m,p])=>({key:m,label:p}))})));function g(u,m){const p=u.target,c=p.checked;p.checked=o.enabled[m],a("change",m,c)}function b(u){if(u.key==="Escape"){u.preventDefault(),a("close");return}if(u.key!=="Tab")return;const m=r.value?.querySelectorAll("a[href],button:not(:disabled),input:not(:disabled),textarea:not(:disabled),select:not(:disabled),[tabindex='0']"),p=m?.[0],c=m?.[m.length-1];u.shiftKey&&document.activeElement===p&&(u.preventDefault(),c?.focus()),!u.shiftKey&&document.activeElement===c&&(u.preventDefault(),p?.focus())}return e.onMounted(()=>{s=document.activeElement instanceof HTMLElement?document.activeElement:null,l.value?.focus()}),e.onUnmounted(()=>s?.focus()),(u,m)=>(e.openBlock(),e.createElementBlock("div",{class:"mrp-settings-backdrop",onClick:m[2]||(m[2]=e.withModifiers(p=>u.$emit("close"),["self"])),onKeydown:b},[e.createElementVNode("section",{ref_key:"panel",ref:r,class:"mrp-settings-panel",role:"dialog","aria-modal":"true","aria-label":t.messages.settings},[e.createElementVNode("header",no,[e.createElementVNode("div",null,[e.createElementVNode("strong",null,e.toDisplayString(t.messages.settings),1),e.createElementVNode("p",null,e.toDisplayString(t.messages.settingsLocal),1)]),e.createElementVNode("button",{ref_key:"closeButton",ref:l,class:"mrp-settings-close",type:"button","aria-label":t.messages.settingsClose,onClick:m[0]||(m[0]=p=>u.$emit("close"))},"×",8,oo)]),e.createElementVNode("div",ro,[e.renderSlot(u.$slots,"default",{},void 0,!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(f.value,p=>(e.openBlock(),e.createElementBlock("fieldset",{key:p.label},[e.createElementVNode("legend",null,e.toDisplayString(p.label),1),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(p.tools,c=>(e.openBlock(),e.createElementBlock("label",{key:c.key,class:e.normalizeClass(["mrp-settings-option",{"mrp-settings-unavailable":!t.available[c.key]}])},[e.createElementVNode("span",null,[e.createTextVNode(e.toDisplayString(c.label),1),t.available[c.key]?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("small",ao,e.toDisplayString(t.messages.settingsUnavailable),1))]),e.createElementVNode("input",{type:"checkbox",checked:t.enabled[c.key],disabled:t.busy||!t.available[c.key],onChange:E=>g(E,c.key)},null,40,lo)],2))),128))]))),128)),t.available.editing?(e.openBlock(),e.createElementBlock("p",so,e.toDisplayString(t.persistedEditing?t.messages.editingSaved:t.messages.editingLocal),1)):e.createCommentVNode("",!0),t.available.import?(e.openBlock(),e.createElementBlock("p",io,e.toDisplayString(t.messages.importLocal),1)):e.createCommentVNode("",!0)]),e.createElementVNode("footer",null,[e.createElementVNode("button",{type:"button",disabled:t.busy,onClick:m[1]||(m[1]=p=>u.$emit("reset"))},e.toDisplayString(t.messages.settingsReset),9,co)])],8,to)],32))}}),mo=Ee(uo,[["__scopeId","data-v-fe89b48b"]]),fo={class:"mrp-empty",role:"status"},po={key:0},vo=e.defineComponent({__name:"ReportEmpty",props:{title:{},description:{}},setup(t){return(n,o)=>(e.openBlock(),e.createElementBlock("div",fo,[o[0]||(o[0]=e.createStaticVNode('<svg class="mrp-empty-art" viewBox="0 0 160 112" fill="none" aria-hidden="true" data-v-07e9cb82><ellipse cx="80" cy="100" rx="54" ry="7" fill="currentColor" opacity=".05" data-v-07e9cb82></ellipse><rect x="34" y="15" width="92" height="78" rx="9" fill="currentColor" opacity=".04" data-v-07e9cb82></rect><rect x="42" y="9" width="76" height="78" rx="7" fill="var(--mrp-toolbar-bg, #fff)" stroke="currentColor" stroke-opacity=".2" stroke-width="1.5" data-v-07e9cb82></rect><path d="M55 27H105M55 42H105M55 57H85M55 72H76M71 27V72M89 27V57" stroke="currentColor" stroke-opacity=".15" stroke-width="1.5" stroke-linecap="round" data-v-07e9cb82></path><circle cx="112" cy="76" r="16" fill="var(--mrp-toolbar-bg, #fff)" stroke="currentColor" stroke-opacity=".35" stroke-width="2" data-v-07e9cb82></circle><path d="M124 88L137 101M106 76H118" stroke="currentColor" stroke-opacity=".45" stroke-width="3" stroke-linecap="round" data-v-07e9cb82></path><circle cx="27" cy="38" r="3" fill="currentColor" opacity=".12" data-v-07e9cb82></circle><circle cx="132" cy="24" r="2" fill="currentColor" opacity=".2" data-v-07e9cb82></circle></svg>',1)),e.createElementVNode("strong",null,e.toDisplayString(t.title),1),t.description?(e.openBlock(),e.createElementBlock("p",po,e.toDisplayString(t.description),1)):e.createCommentVNode("",!0)]))}}),kt=Ee(vo,[["__scopeId","data-v-07e9cb82"]]),go={class:"mrp-params"},ho={class:"mrp-params-title"},bo={class:"mrp-params-grid"},yo={class:"mrp-param-label"},wo={key:0,class:"mrp-param-star"},xo=["value","onChange"],Eo={value:"",disabled:"",hidden:""},ko=["value"],Po=["type","placeholder","value","onInput"],Co={class:"mrp-params-actions"},Bo=e.defineComponent({__name:"ReportParamPanel",props:{defs:{},modelValue:{},messages:{},attempted:{type:Boolean}},emits:["update:modelValue","query","reset"],setup(t,{emit:n}){const o=t,a=n,r=e.ref({...o.modelValue});e.watch(()=>o.modelValue,g=>{r.value={...g}});const l=e.computed(()=>o.defs.map(g=>({def:g,label:g.label??g.field,value:r.value[g.field]??""})));function s(g,b){r.value={...r.value,[g]:b},a("update:modelValue",{...r.value})}function f(g){const b=o.defs.find(u=>u.field===g);return o.attempted&&b?.required===!0&&!(r.value[g]??"").trim()}return(g,b)=>(e.openBlock(),e.createElementBlock("div",go,[e.createElementVNode("span",ho,e.toDisplayString(t.messages.paramsTitle),1),e.createElementVNode("div",bo,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value,u=>(e.openBlock(),e.createElementBlock("label",{key:u.def.field,class:e.normalizeClass(["mrp-param",{"mrp-param-missing":f(u.def.field)}])},[e.createElementVNode("span",yo,[e.createTextVNode(e.toDisplayString(u.label),1),u.def.required?(e.openBlock(),e.createElementBlock("i",wo,"*")):e.createCommentVNode("",!0)]),(u.def.type??"text")==="select"?(e.openBlock(),e.createElementBlock("select",{key:0,class:"mrp-param-input",value:u.value,onChange:m=>s(u.def.field,m.target.value),onKeydown:b[0]||(b[0]=e.withKeys(m=>g.$emit("query"),["enter"]))},[e.createElementVNode("option",Eo,e.toDisplayString(u.def.placeholder??`请选择${u.label}`),1),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(u.def.options??[],m=>(e.openBlock(),e.createElementBlock("option",{key:m.value,value:m.value},e.toDisplayString(m.label),9,ko))),128))],40,xo)):(e.openBlock(),e.createElementBlock("input",{key:1,class:"mrp-param-input",type:u.def.type==="number"?"number":u.def.type==="date"?"date":"text",placeholder:u.def.placeholder??`请输入${u.label}`,value:u.value,onInput:m=>s(u.def.field,m.target.value),onKeydown:b[1]||(b[1]=e.withKeys(m=>g.$emit("query"),["enter"]))},null,40,Po))],2))),128))]),e.createElementVNode("div",Co,[e.createElementVNode("button",{class:"mrp-nav mrp-param-query",type:"button",onClick:b[2]||(b[2]=u=>g.$emit("query"))},e.toDisplayString(t.messages.query),1),e.createElementVNode("button",{class:"mrp-nav",type:"button",onClick:b[3]||(b[3]=u=>g.$emit("reset"))},e.toDisplayString(t.messages.reset),1)])]))}}),Tt=Ee(Bo,[["__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:"搜索中…",importExcel:"导入 Excel 模板",importing:"正在导入 Excel…",editCell:"编辑单元格",editingHint:"双击单元格编辑 · Enter 确认 · Esc 取消",saving:"正在保存修改…",editInvalidNumber:"请输入有效数字;清空表示无值",editInvalidBoolean:"请输入 true / false、是 / 否或 1 / 0",editConflict:"该单元格已变化,请重新打开编辑",settings:"设置",settingsDisplay:"阅读工具",settingsExport:"导出与打印",settingsData:"数据操作",settingsUnavailable:"需由接入方配置启用",settingsReset:"恢复默认",settingsClose:"关闭设置",search:"内容搜索",zoom:"缩放工具",settingsLocal:"按需启用工具,仅作用于当前预览。",editingLocal:"修改为本地草稿;不会自动写入业务数据库。",editingSaved:"修改将通过接入方配置的保存回调提交。",importLocal:"导入仅生成本地预览,不自动替换业务数据。",emptyDescription:"当前查询没有明细,请调整查询条件后重试。"},It={shellBg:"#525659",shellFg:"#e8e8e8",toolbarBg:"#323639",toolbarBorder:"#22252a",toolbarFg:"#e8e8e8",btnFg:"#cfcfcf",btnBorder:"#4a4d52",btnHoverBg:"#414549",btnHoverFg:"#ffffff",btnActiveBg:"#2d5fb8"};function Ot(t={}){return{...t,defaults:t.defaults??{},presets:t.presets??{}}}function So(t){return t}const se={showExport:!0,showPrint:!0,showPdfWindow:!0,showSettings:!0,showParams:!0,gapPx:18,pdfFontUrl:"/simhei.ttf",logger:console},$o={warn:()=>{},info:()=>{}};function De(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},toolbar:{...t?.toolbar,...n?.toolbar}}}function Ro(t){return{showExport:t.showExport??se.showExport,showPrint:t.showPrint??se.showPrint,showPdfWindow:t.showPdfWindow??se.showPdfWindow,showSettings:t.showSettings??se.showSettings,showParams:t.showParams??se.showParams,gapPx:t.gapPx??se.gapPx}}function zt(t,n){const o=n?t?.presets?.[n]:t?.defaultPreset?t?.presets?.[t.defaultPreset]:void 0,a=De(t?.defaults,o);return{...Ro(a),pdfFontUrl:a.pdfFontUrl??se.pdfFontUrl,theme:{...It,...a.theme},messages:{...Vt,...a.messages},logger:a.logger??se.logger,preview:{overscanPages:Pt(a.preview?.overscanPages,1,10,!0),searchDebounceMs:Pt(a.preview?.searchDebounceMs,200,2e3)},xlsx:{...a.xlsx},editable:a.editable??!1,excelImport:a.excelImport??!1,toolbar:{...a.toolbar}}}function Pt(t,n,o,a=!1){if(t==null||!Number.isFinite(t))return n;const r=Math.max(0,Math.min(o,t));return a?Math.floor(r):r}function Lt(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 Mo(t){const n=e.inject(pe.MACH_REPORT_CONFIG_KEY,null),o=e.computed(()=>{const a=n?.value??null,r="defaults"in t||"presets"in t||"defaultPreset"in t?Ot(t):{defaults:t,presets:{}};if(!a)return r;const l={...a.presets,...r.presets};for(const s of Object.keys(l))l[s]=De(De(a.presets[s],r.defaults),r.presets[s]);return{defaults:De(a.defaults,r.defaults),presets:l,defaultPreset:r.defaultPreset??a.defaultPreset}});e.provide(pe.MACH_REPORT_CONFIG_KEY,o)}function Wt(){return e.inject(pe.MACH_REPORT_CONFIG_KEY,e.computed(()=>null))}const Ct=new Map,me=new Map,Fo=15e3;function ot(t,n){return Object.assign(new Error(t),{cause:n})}function xe(t,n){return`PDF 字体 ${JSON.stringify(t)}:${n}。请部署支持报表文字的字体文件,并将 pdfFontUrl 配置为可访问的字体 URL;西文报表可设为空串`}function Ie(t){if(t?.reason instanceof Error&&t.reason.name==="AbortError")return t.reason;const n=ot("PDF 字体检查已取消",t?.reason);return n.name="AbortError",n}async function No(t,n){let o=!1;const a=setTimeout(()=>{o=!0,n.abort()},Fo);try{const r=await fetch(t,{method:"HEAD",signal:n.signal});if(n.signal.aborted)throw Ie(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:xe(t,s.message),cause:s}}const l=r.headers.get("content-type")??"";if(/text\/html|application\/xhtml\+xml/i.test(l)){const s=new Error("字体 URL 返回 HTML 页面(可能是 SPA 路由回退),不是字体文件");return{status:"error",fontUrl:t,message:xe(t,s.message),cause:s}}if(/^text\//i.test(l)||/(?:\/|\+)json(?:\s*;|$)/i.test(l)){const s=new Error(`字体 URL 返回 ${l} 文本响应,不是字体文件`);return{status:"error",fontUrl:t,message:xe(t,s.message),cause:s}}return{status:"available",fontUrl:t,message:"PDF 字体资源可达;文字覆盖范围将在实际导出时校验"}}catch(r){if(n.signal.aborted&&!o)throw Ie(n.signal);return{status:"error",fontUrl:t,message:xe(t,o?"字体检查超时,请检查网络或字体服务":"字体检查失败,请检查网络、字体服务或跨域访问配置"),cause:r}}finally{clearTimeout(a)}}function Do(t,n){if(n?.aborted)return Promise.reject(Ie(n));if(!t)return Promise.resolve({status:"disabled",fontUrl:t,message:"已停用自定义 PDF 字体;内置字体用于西文,其他文字会在导出时校验"});const o=Ct.get(t);if(o)return Promise.resolve(o);let a=me.get(t);if(!a){const l=new AbortController;a={controller:l,promise:No(t,l),subscribers:0};const s=a;me.set(t,s),s.promise=s.promise.then(f=>(!l.signal.aborted&&f.status==="available"&&Ct.set(t,f),f)).finally(()=>{me.get(t)===s&&me.delete(t)})}const r=a;return r.subscribers++,new Promise((l,s)=>{let f=!1;const g=()=>f?!1:(f=!0,r.subscribers--,n?.removeEventListener("abort",b),!0),b=()=>{g()&&(r.subscribers===0&&(me.get(t)===r&&me.delete(t),r.controller.abort()),s(Ie(n)))};n?.addEventListener("abort",b,{once:!0}),r.promise.then(u=>{g()&&l(u)},u=>{g()&&s(u)}),n?.aborted&&b()})}function At(t={fontUrl:"/simhei.ttf"}){let n=null;const o=async(a,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(m){const p=m instanceof Error?m.message:String(m);throw ot(xe(t.fontUrl,p),m)}let s;try{s=await n.renderPlanToPdf(a,l?{customFontBytes:l}:{})}catch(m){if(!l)throw m;const p=m instanceof Error?m.message:String(m);throw ot(`PDF 生成失败:${p}。当前字体 URL 为 ${JSON.stringify(t.fontUrl)};请确认该文件是有效字体,或重新配置 pdfFontUrl`,m)}const{bytes:f,unsupportedTextCount:g,pageErrors:b,fidelityWarnings:u}=s;if(g>0)throw new Error(`PDF 中有 ${g} 行文字无法编码;请部署支持所用文字的字体并配置 pdfFontUrl`);if(b.length>0)throw new Error(`PDF 有 ${b.length} 页渲染失败:${b[0]}`);return u.length>0&&r?.(`PDF 有 ${u.length} 处版式降级:${u.slice(0,2).join(";")}`),f};return o.checkFont=a=>Do(t.fontUrl,a),o}class re extends Error{constructor(n,o,a){super(o),this.name="MachReportError",this.code=n,this.cause=a}}function Ht(t){return t instanceof re?{code:t.code,cause:t.cause}:{code:"render",cause:t}}function fe(t){return JSON.parse(JSON.stringify(t))}function To(t){const n=t.closest(".mrp-page-holder"),o=t.closest("[data-mr-component-index]");if(!n||!o)return null;const a={pageIndex:Number(n.dataset.page)-1,componentIndex:Number(o.dataset.mrComponentIndex),rowIndex:Number(t.dataset.mrRowIndex),columnIndex:Number(t.dataset.mrColumnIndex)};return Object.values(a).every(r=>Number.isInteger(r)&&r>=0)?a:null}function Vo(t,n,o){const a=t.ownerDocument.createElement("textarea");return a.className="mrp-cell-editor",a.setAttribute("aria-label",n),a.value=o==null?"":String(o),a.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(a),a}function Io(t){const n=e.shallowRef(null),o=e.ref(!1),a=e.shallowRef([]);let r=null;function l(){const c=n.value;n.value=null,o.value=!1,r=null,c?.controller.abort(),c?.input.remove()}function s(){l(),a.value=[]}function f(c){return n.value===c&&!c.controller.signal.aborted&&t.plan.value===c.plan}function g(c){const E=t.options.value,C=U.getReportCellContext(c.plan,c.address);if(!(typeof E=="object"?E===c.options:E===!0)||!C?.editable||c.options.canEdit?.(C)===!1)throw new U.ReportCellEditError("readonly")}async function b(c){try{g(c);const E=U.createReportCellEdit(c.plan,c.address,c.input.value);if(Object.is(E.value,E.previousValue))return l(),!0;const C={signal:c.controller.signal},x=await c.options.validate?.(fe(E),C);if(!f(c))return!1;if(x)throw new Error(x);if(g(c),await c.options.save?.(fe(E),C),!f(c))return!1;g(c);const S=U.applyReportCellEdit(c.plan,E);return l(),a.value=[...a.value,E],t.plan.value=S,t.onChange(fe(E)),!0}catch(E){return f(c)&&(t.onError(t.errorMessage?.(E)??(E instanceof Error?E.message:"单元格保存失败"),E),c.input.disabled=!1,c.input.setAttribute("aria-invalid","true"),c.input.focus()),!1}finally{n.value===c&&(o.value=!1)}}async function u(){if(r)return r;const c=n.value;if(!c)return!0;if(!f(c))return l(),!1;o.value=!0,c.input.disabled=!0;const E=b(c);r=E;const C=await E;return r===E&&(r=null),C}function m(c){c.stopPropagation(),!c.isComposing&&(c.key==="Escape"&&(c.preventDefault(),l()),c.key==="Enter"&&!c.shiftKey&&(c.preventDefault(),u()))}async function p(c){if(!t.options.value||t.blocked())return;const E=c.target;if(!(E instanceof Element)||E.closest(".mrp-cell-editor"))return;const C=E.closest("td[data-mr-row-index]");if(!C||!await u()||!C.isConnected)return;const x=t.plan.value,S=To(C);if(!x||!S||!t.options.value||t.blocked())return;const k=typeof t.options.value=="object"?t.options.value:{};try{const $=U.getReportCellContext(x,S);if(!$?.editable||k.canEdit?.($)===!1)return;const B=Vo(C,t.label(),$.value);n.value={plan:x,address:S,input:B,controller:new AbortController,options:k},B.addEventListener("keydown",m),B.addEventListener("blur",()=>{o.value||u()}),B.focus(),B.select()}catch($){t.onError($ instanceof Error?$.message:"无法编辑单元格",$)}}return e.watch(t.options,(c,E)=>{(!c||c!==E)&&l()},{flush:"sync"}),e.watch(t.plan,()=>{n.value&&t.plan.value!==n.value.plan&&l()},{flush:"sync"}),e.onScopeDispose(s),{active:n,saving:o,changes:a,cancel:l,reset:s,commit:u,onDoubleClick:p,getChanges:()=>fe(a.value)}}const Oe=["html","pdf","xlsx","png","word"],jt=["search","thumbnails","zoom",...Oe,"print","pdfWindow","editing","import"];function Oo(t,n){const o=e.ref({}),a=e.computed(()=>Object.fromEntries(jt.map(s=>[s,t.value[s]&&(o.value[s]??n.value[s]??!0)])));function r(s,f){t.value[s]&&(o.value={...o.value,[s]:f})}function l(){o.value={}}return{enabled:a,setEnabled:r,reset:l}}const zo={key:3,class:"mrp-edit-hint",role:"status"},Lo={key:5,class:"mrp-export-notice mrp-export-warning",role:"status"},Wo={class:"mrp-main"},Ao={key:0,class:"mrp-state"},Ho={key:1,class:"mrp-state mrp-error"},jo=["data-page"],qo=["onClick"],Uo=["data-thumb"],Ko={class:"mrp-thumb-no"},Zo={class:"mrp-overlay"},Go={key:6,class:"mrp-debug","aria-hidden":"true"},Me=96/25.4,tt="mach-report:ui",nt="mach-report:ui:wide",Yo=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},showSettings:{type:Boolean,default:void 0},toolbar:{type:Object,default:void 0},emptyState:{type:[Boolean,Object],default:!1},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","preferences-change"],setup(t,{expose:n,emit:o}){e.useCssVars(i=>({v54e94a63:K.value+"px"}));const a=t,r=o,l=e.shallowRef(null),s=e.ref(!1),f=e.ref(""),g=e.shallowRef(null),b=e.ref(null),u=e.ref(!1),m=e.shallowRef(Object.freeze({status:"unchecked",fontUrl:""})),p=e.ref(null),c=e.ref(1),E=e.ref(null),C=e.ref(null),x=e.ref(null),S=e.ref(!1),k=e.ref(!1),$=e.ref(!1),B=e.ref(null),M=Dn(),N=e.computed(()=>!!l.value?.pages.length&&l.value.pages.every(i=>i.layout==="wide")),K=e.computed(()=>Math.max(0,it.value));let z=tt;const Z=e.inject(pe.MACH_REPORT_FETCHER_KEY,null),H=e.inject(pe.MACH_REPORT_PDF_EXPORTER_KEY,null),J=e.computed(()=>rt(a.reportId)),ae=e.computed(()=>a.fetcher??Z),O=e.computed(()=>l.value?.pages.length??0),te=e.computed(()=>Object.freeze({loading:s.value,hasPlan:O.value>0,pageCount:O.value,currentPage:c.value,exporting:b.value,printing:u.value,canExport:!s.value&&!k.value&&!I.saving.value&&O.value>0&&b.value===null,canPrint:!s.value&&!k.value&&!I.saving.value&&O.value>0&&!u.value,error:g.value,pdfFont:m.value,editing:I.active.value!==null,saving:I.saving.value,importing:k.value,dirty:I.changes.value.length>0}));function d(i,v,h){g.value=Object.freeze({message:i,code:v,cause:h}),r("error",i,{code:v,cause:h})}const y=Wt(),w=e.computed(()=>zt(y.value,a.preset)),P=e.computed(()=>({...w.value.messages,...a.messages})),R=e.computed(()=>a.showExport??w.value.showExport),W=e.computed(()=>a.showPrint??w.value.showPrint),j=e.computed(()=>a.showPdfWindow??w.value.showPdfWindow),X=e.computed(()=>a.showSettings??w.value.showSettings),ue=e.computed(()=>({...w.value.toolbar,...a.toolbar})),it=e.computed(()=>a.gapPx??(N.value?0:w.value.gapPx)),Ut=e.computed(()=>a.showParams??w.value.showParams),ke=e.computed(()=>a.editable??w.value.editable),ct=e.computed(()=>a.excelImport??w.value.excelImport),ut=e.computed(()=>({search:ue.value.search!==!1,thumbnails:ue.value.thumbnails!==!1,zoom:ue.value.zoom!==!1,...Object.fromEntries(Oe.map(i=>[i,R.value&&(ue.value.exportFormats?.includes(i)??!0)])),print:W.value,pdfWindow:j.value,editing:!!ke.value,import:!!ct.value})),ze=Oo(ut,e.computed(()=>({editing:ue.value.editing,import:ue.value.excelImport}))),L=ze.enabled,Kt=e.computed(()=>Oe.filter(i=>L.value[i])),dt=e.computed(()=>L.value.editing?ke.value:!1),Pe=e.computed(()=>L.value.import?ct.value:!1),Zt=e.computed(()=>typeof ke.value=="object"&&typeof ke.value.save=="function"),Le=e.computed(()=>typeof a.emptyState=="object"?a.emptyState:{});async function Gt(i,v){i==="editing"&&!v&&!await I.commit()||(ze.setEnabled(i,v),r("preferences-change",Object.freeze({...L.value})))}async function Yt(){await I.commit()&&(ze.reset(),r("preferences-change",Object.freeze({...L.value})))}function Jt(i){return i instanceof U.ReportCellEditError?{number:P.value.editInvalidNumber,boolean:P.value.editInvalidBoolean,conflict:P.value.editConflict}[i.code]??i.message:i instanceof Error?i.message:"单元格保存失败"}const I=Io({plan:l,options:dt,blocked:()=>s.value||k.value||b.value!==null||u.value,label:()=>P.value.editCell??"编辑单元格",errorMessage:Jt,onChange:i=>{g.value=null,p.value=null,r("cell-edit",i)},onError:(i,v)=>{p.value={kind:"error",message:i},d(i,"edit",v)}});let mt=null,We=null;function ft(){if(H)return H;const i=w.value.pdfFontUrl;return(!We||mt!==i)&&(mt=i,We=At({fontUrl:i})),We}let Ce=0,ve=null,Be=null,ne=!1;function Ae(){Ce++,ve?.abort(),ve=null}async function Se(){if(ne)throw new re("config","报表预览已卸载");Ae();const i=Ce,v=new AbortController;ve=v;const h=w.value.pdfFontUrl;m.value=Object.freeze({status:"checking",fontUrl:h});try{const V=ft(),D=V.checkFont?await V.checkFont(v.signal):{status:"unverified",fontUrl:"",message:"自定义 PDF 导出器未提供字体预检查;字体由宿主确认"};return!ne&&i===Ce&&!v.signal.aborted&&(m.value=Object.freeze({...D})),D}catch(V){if(v.signal.aborted)throw V;const D={status:"error",fontUrl:h,message:V instanceof Error?V.message:"PDF 字体检查失败",cause:V};return!ne&&i===Ce&&(m.value=Object.freeze(D)),D}finally{ve===v&&(ve=null)}}function Xt(){Se().catch(()=>{})}e.watch([l,()=>w.value.pdfFontUrl,R,j],()=>{const i=m.value.fontUrl===w.value.pdfFontUrl;i&&m.value.status==="available"||(Ae(),(!i||m.value.status==="checking")&&(m.value=Object.freeze({status:"unchecked",fontUrl:w.value.pdfFontUrl})),!ne&&O.value>0&&(R.value||j.value)&&Se().catch(()=>{}))},{immediate:!0});const le=e.computed(()=>a.paramDefs??ae.value?.getParamDefs?.(J.value)??[]),ie=e.ref({}),He=e.ref(!1);function ge(i){const v={};for(const h of i)v[h.field]=a.params[h.field]??h.defaultValue??"";ie.value=v,He.value=!1}ge(le.value),e.watch(le,i=>ge(i)),e.watch(J,()=>ge(le.value)),e.watch(()=>JSON.stringify(a.params),()=>ge(le.value));const Qt=e.computed(()=>{const i={...a.params};for(const[v,h]of Object.entries(ie.value))h===""?delete i[v]:i[v]=h;return i});function _t(){return le.value.filter(i=>i.required===!0&&!(ie.value[i.field]??"").trim())}function en(){He.value=!0;const i=_t();if(i.length>0){const v=i[0].label??i[0].field,h=P.value.paramRequired.replace("{label}",v);f.value=h,d(h,"param");return}ce()}function tn(){ge(le.value)}const nn=e.computed(()=>({height:a.height,...Lt(w.value.theme)})),{zoom:G,zoomMode:he,applyFitZoom:pt,setZoom:be}=Rt(()=>({viewport:C.value,pageWidthPx:je.contentSize.value.w||210*Me})),je=$t(l,G,{pxPerMm:Me,gapPx:it,overscan:e.computed(()=>w.value.preview.overscanPages)}),{contentSize:qe,windowRange:ye,visiblePages:vt,makeScrollHandler:on,refreshViewport:Ue}=je,rn=on(c,O);function Ke(i){be(i*100)}function $e(){k.value=!1,I.reset(),gt(),l.value=null,c.value=1,T.reset()}let A=0,Q=null;async function ce(){if(ne)return;const i=++A;k.value=!1,Q?.abort(),Q=null;const v=ae.value;if(s.value=!1,g.value=null,J.value.length===0){f.value="缺少报表 ID",$e(),d(f.value,"param");return}if(!v){f.value="未提供渲染数据源 fetcher",$e(),d(f.value,"config");return}s.value=!0,f.value="",p.value=null,$e();const h=M.start(),V=new AbortController;Q=V;const D=new Set;function _(F){i!==A||V.signal.aborted||D.has(F)||(D.add(F),w.value.logger.warn("[mach-report] 报表告警:",F),r("warning",F))}try{const F=await v({reportIds:J.value,params:{...Qt.value},signal:V.signal,onWarning:_});if(i!==A)return;const q=U.validateRenderPlan(F);if(!q.ok){const Re=q.errors.slice(0,3).map(xt=>`${xt.path}: ${xt.message}`).join("; ");throw new re("validate",`渲染计划校验失败(${q.errors.length} 处): ${Re}`)}if(q.warnings.forEach(Re=>_(`${Re.path}: ${Re.message}`)),i!==A||V.signal.aborted)return;l.value=F,c.value=1,M.end(h),C.value&&(C.value.scrollTop=0,C.value.scrollLeft=0);const Y=N.value?nt:tt;Y!==z&&(z=Y,_e()),he.value==="fit"&&pt(),r("loaded",F.pages.length)}catch(F){if(i!==A)return;const q=F instanceof re?F:F instanceof U.ReportSourceError?new re(F.code,F.message,F.cause):new re("fetch",F instanceof Error?F.message:"预览加载失败",F);f.value=q.message;const Y=Ht(q);d(q.message,Y.code,Y.cause)}finally{i===A&&(s.value=!1),Q===V&&(Q=null)}}function oe(i){if(ne||O.value<=0)return;const v=Math.max(1,Math.min(O.value,i));c.value=v;const h=C.value;h&&(h.scrollTop=je.pageOffsetPx(v-1)*G.value,Ue(h))}const we=Ft(l,{getPdfExporter:ft,getXlsxOptions:()=>w.value.xlsx,onError:(i,v)=>{p.value={kind:"error",message:i},d(i,v??"print")},onWarning:i=>{p.value={kind:"warning",message:i},r("warning",i)},onBusy:i=>{b.value=i,i?p.value={kind:"progress",message:P.value.exporting.replace("{format}",i)}:p.value?.kind==="progress"&&(p.value=null)},onPrinting:i=>{u.value=i}}),{releasePrintFrame:gt,dispose:an}=we;async function Ze(){s.value||k.value||I.active.value&&!await I.commit()||(g.value=null,await we.print())}async function Ge(i){s.value||k.value||I.active.value&&!await I.commit()||(g.value=null,await we.exportAs(i))}function Ye(){if(s.value||k.value||I.active.value){p.value={kind:"warning",message:P.value.editingHint??"请先确认单元格修改"};return}g.value=null,we.openPdfWindow()}async function ht(i,v={}){ne||(ie.value={...ie.value,...i},v.reload!==!1&&await ce())}const ln={reload:ce,print:Ze,exportAs:Ge,openPdfWindow:Ye,gotoPage:oe,setParams:ht,checkPdfFont:Se,importExcel:Je,getPlan:bt,getChanges:I.getChanges,get state(){return te.value}};e.provide(pe.MACH_REPORT_CONTROLLER_KEY,ln);function bt(){return l.value?fe(l.value):null}async function Je(i,v){if(ne)throw new re("config","报表预览已卸载");const h=++A;Q?.abort(),Q=null,s.value=!1,I.cancel(),we.invalidatePending(),k.value=!0,g.value=null,p.value={kind:"progress",message:P.value.importing??"正在导入 Excel…"};try{const{importExcelTemplate:V}=await import("@agile-team/mach-report/xlsx");if(h!==A)return null;const D=typeof Pe.value=="object"?Pe.value:{},_=await V(i,{...D,...v,limits:{...D.limits,...v?.limits}});if(h!==A)return null;const F=U.paginateTemplate(fe(_.template),{}).plan,q=U.validateRenderPlan(F);if(!q.ok)throw new Error(q.errors.map(Y=>Y.message).slice(0,3).join("; "));for(const Y of _.warnings){if(h!==A)return null;r("warning",Y)}return h!==A?null:(I.reset(),gt(),T.reset(),l.value=F,c.value=1,f.value="",p.value=_.warnings.length?{kind:"warning",message:_.warnings.join(";")}:null,C.value&&(C.value.scrollTop=0,C.value.scrollLeft=0),z=N.value?nt:tt,_e(),r("template-import",_),h===A&&r("loaded",F.pages.length),_)}catch(V){if(h!==A)return null;const D=new re("import",V instanceof Error?V.message:"Excel 模板导入失败",V);throw p.value={kind:"error",message:D.message},d(D.message,"import",V),D}finally{h===A&&(k.value=!1)}}function sn(i){const v=i.target,h=v.files?.[0];v.value="",h&&Je(h).catch(()=>{})}const T=Mn({plan:l,gotoPage:oe,debounceMs:e.computed(()=>w.value.preview.searchDebounceMs),highlight:kn,clearHighlights:En});e.watch(()=>L.value.search,i=>{i||(T.reset(),T.visible.value=!1)});function cn(i){!i.ctrlKey||!L.value.zoom||(i.preventDefault(),Ke(G.value*(i.deltaY<0?1.1:1/1.1)))}function un(i){if(!(i.target instanceof Element&&i.target.closest("input,textarea,select,[contenteditable='true']"))){if(L.value.search&&(i.ctrlKey||i.metaKey)&&i.key.toLowerCase()==="f"){i.preventDefault(),T.visible.value||T.toggle();return}switch(i.key){case"PageDown":i.preventDefault(),oe(c.value+1);break;case"PageUp":i.preventDefault(),oe(c.value-1);break;case"Home":i.preventDefault(),oe(1);break;case"End":i.preventDefault(),oe(O.value);break;case"+":case"=":i.preventDefault(),L.value.zoom&&Ke(G.value*1.1);break;case"-":i.preventDefault(),L.value.zoom&&Ke(G.value/1.1);break}}}function dn(){try{localStorage.setItem(z,JSON.stringify({zoomMode:he.value==="fit"?"fit":Math.round(G.value*100)}))}catch{}}e.watch([he,G],dn);let Xe="";const yt=new WeakMap;function wt(i=!1){const v=T.activeMatch.value;if(!N.value||!v)return;const h=`${T.query.value}:${T.matchIndex.value}:${v.pageIndex}`;if(!i&&h===Xe)return;const D=E.value?.querySelector(`[data-page="${v.pageIndex+1}"]`)?.querySelectorAll("mark.mrp-hit")[v.occurrence];D&&(D.scrollIntoView?.({block:"nearest",inline:"nearest"}),Xe=h)}e.watchEffect(()=>{const i=l.value;if(!i)return;const v=T.activeMatch.value;T.matchIndex.value,v||(Xe=""),vt.value;const h=E.value;if(!h)return;h.querySelectorAll(".mrp-page-holder").forEach(D=>{const _=Number(D.dataset.page??0)-1,F=i.pages[_];if(!F||D.childElementCount>0&&yt.get(D)===F){if(D.firstElementChild){const Y=D.firstElementChild;T.clear(Y),T.apply(Y)}return}D.style.width=`${F.pageWidthMm*Me}px`;const q=U.renderPage(F,96,{},document);T.apply(q),D.replaceChildren(q),yt.set(D,F)}),wt()},{flush:"post"}),e.watch(()=>T.query.value,i=>{i||E.value?.querySelectorAll(".mrp-page-holder").forEach(v=>{T.clear(v)})});const ee=Nn(l,{thumbsRoot:x,visible:S,renderThumbCanvas:i=>{try{const v=l.value.pages[i],h=Math.min(.2,116/Math.max(1,v.pageWidthMm*Me)),{canvases:V}=U.renderPlanToCanvas(l.value,{start:i,end:i,dpr:h});return V[0]??null}catch{return null}}});e.watchEffect(()=>{ee.schedule()},{flush:"post"});const mn=e.computed(()=>a.debug),{debugStats:de}=Fn(mn,{plan:l,pageCount:O,windowRange:ye,zoom:G,loadMs:M.loadMs});function Qe(){Ue(C.value),ee.schedule(),he.value==="fit"&&pt(),wt(!0)}function _e(){be(z===nt?100:"fit");try{const i=JSON.parse(localStorage.getItem(z)??"{}");i.zoomMode==="fit"?be("fit"):typeof i.zoomMode=="number"&&be(i.zoomMode)}catch{}}return e.onMounted(()=>{window.addEventListener("resize",Qe),typeof ResizeObserver<"u"&&C.value&&(Be=new ResizeObserver(Qe),Be.observe(C.value)),Ue(C.value),_e(),a.autoLoad&&ce()}),e.onUnmounted(()=>{ne=!0,I.reset(),k.value=!1,Ae(),A++,Q?.abort(),Q=null,window.removeEventListener("resize",Qe),Be?.disconnect(),Be=null,ee.destroy(),T.reset(),an()}),e.watch(()=>[JSON.stringify(J.value),JSON.stringify(a.params),ae.value],()=>{if(a.autoLoad){ce();return}A++,Q?.abort(),Q=null,s.value=!1,f.value="",g.value=null,p.value=null,$e()}),n({reload:ce,print:Ze,exportAs:Ge,openPdfWindow:Ye,gotoPage:oe,setParams:ht,checkPdfFont:Se,importExcel:Je,getPlan:bt,getChanges:I.getChanges,state:te}),(i,v)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["mach-report-preview",{"mrp-wide-report":N.value}]),style:e.normalizeStyle(nn.value)},[Ut.value&&le.value.length>0?(e.openBlock(),e.createBlock(Tt,{key:0,defs:le.value,modelValue:ie.value,"onUpdate:modelValue":v[0]||(v[0]=h=>ie.value=h),messages:P.value,attempted:He.value,onQuery:en,onReset:tn},null,8,["defs","modelValue","messages","attempted"])):e.createCommentVNode("",!0),e.createVNode(Dt,{"page-count":O.value,"current-page":c.value,"zoom-mode":e.unref(he),zoom:e.unref(G),"show-export":R.value,"show-print":e.unref(L).print,"show-pdf-window":e.unref(L).pdfWindow,"show-search":e.unref(L).search,"show-thumbnails":e.unref(L).thumbnails,"show-zoom":e.unref(L).zoom,"export-formats":Kt.value,"show-settings":X.value,"settings-open":$.value,messages:P.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,"show-import":!!Pe.value,busy:s.value||k.value||e.unref(I).saving.value,onGoto:oe,onZoom:e.unref(be),onExport:v[1]||(v[1]=h=>Ge(h)),onPrint:Ze,onPdfWindow:Ye,onSearchInput:e.unref(T).onInput,onSearchNav:e.unref(T).onNav,onSearchToggle:e.unref(T).toggle,onThumbsToggle:v[2]||(v[2]=h=>S.value=!S.value),onImportExcel:v[3]||(v[3]=h=>B.value?.click()),onSettingsToggle:v[4]||(v[4]=h=>$.value=!$.value)},null,8,["page-count","current-page","zoom-mode","zoom","show-export","show-print","show-pdf-window","show-search","show-thumbnails","show-zoom","export-formats","show-settings","settings-open","messages","search","thumbs-visible","show-import","busy","onZoom","onSearchInput","onSearchNav","onSearchToggle"]),$.value&&X.value?(e.openBlock(),e.createBlock(mo,{key:1,available:ut.value,enabled:e.unref(L),messages:P.value,"persisted-editing":Zt.value,busy:s.value||k.value||e.unref(I).saving.value||!!b.value||u.value,onChange:Gt,onReset:Yt,onClose:v[5]||(v[5]=h=>$.value=!1)},{default:e.withCtx(()=>[e.renderSlot(i.$slots,"settings",{},void 0,!0)]),_:3},8,["available","enabled","messages","persisted-editing","busy"])):e.createCommentVNode("",!0),Pe.value?(e.openBlock(),e.createElementBlock("input",{key:2,ref_key:"importInputRef",ref:B,class:"mrp-import-input",type:"file",accept:".xlsx,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",hidden:"",onChange:sn},null,544)):e.createCommentVNode("",!0),dt.value&&O.value>0?(e.openBlock(),e.createElementBlock("div",zo,e.toDisplayString(e.unref(I).saving.value?P.value.saving:P.value.editingHint),1)):e.createCommentVNode("",!0),p.value?(e.openBlock(),e.createElementBlock("div",{key:4,class:e.normalizeClass(["mrp-export-notice",`mrp-export-${p.value.kind}`]),role:"alert"},e.toDisplayString(p.value.message),3)):e.createCommentVNode("",!0),m.value.status==="error"&&(R.value||j.value)?(e.openBlock(),e.createElementBlock("div",Lo,[e.createTextVNode(e.toDisplayString(P.value.pdfFontUnavailable)+" ",1),e.createElementVNode("button",{type:"button",onClick:Xt},e.toDisplayString(P.value.retry),1)])):e.createCommentVNode("",!0),e.createElementVNode("div",Wo,[e.createElementVNode("div",{ref_key:"viewportRef",ref:C,class:"mrp-body",tabindex:"0",onWheel:cn,onKeydown:un,onDblclick:v[6]||(v[6]=(...h)=>e.unref(I).onDoubleClick&&e.unref(I).onDoubleClick(...h)),onScrollPassive:v[7]||(v[7]=h=>e.unref(rn)(h.target))},[s.value?(e.openBlock(),e.createElementBlock("div",Ao,e.toDisplayString(P.value.loading),1)):f.value?(e.openBlock(),e.createElementBlock("div",Ho,[e.createTextVNode(e.toDisplayString(f.value)+" ",1),e.createElementVNode("button",{class:"mrp-retry",type:"button",onClick:ce},e.toDisplayString(P.value.retry),1)])):!l.value||O.value===0?(e.openBlock(),e.createBlock(kt,{key:2,title:P.value.empty,description:Le.value.description??P.value.emptyDescription},null,8,["title","description"])):(e.openBlock(),e.createElementBlock("div",{key:3,class:"mrp-scale",style:e.normalizeStyle({width:`${e.unref(qe).w*e.unref(G)}px`,height:`${e.unref(qe).h*e.unref(G)}px`})},[e.createElementVNode("div",{ref_key:"containerRef",ref:E,class:"mrp-scale-inner",style:e.normalizeStyle({transform:`scale(${e.unref(G)})`,transformOrigin:"top left",width:`${e.unref(qe).w}px`})},[e.unref(ye).padTopPx>0?(e.openBlock(),e.createElementBlock("div",{key:0,class:"mrp-spacer-top",style:e.normalizeStyle({height:`${e.unref(ye).padTopPx}px`}),"aria-hidden":"true"},null,4)):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(vt),h=>(e.openBlock(),e.createElementBlock("div",{key:h.index,class:"mrp-page-holder","data-page":h.index+1},null,8,jo))),128)),e.unref(ye).padBottomPx>0?(e.openBlock(),e.createElementBlock("div",{key:1,class:"mrp-spacer-bottom",style:e.normalizeStyle({height:`${e.unref(ye).padBottomPx}px`}),"aria-hidden":"true"},null,4)):e.createCommentVNode("",!0)],4)],4)),!s.value&&!f.value&&l.value&&O.value>0&&t.emptyState?(e.openBlock(),e.createBlock(kt,{key:4,title:Le.value.title??P.value.empty,description:Le.value.description??P.value.emptyDescription},null,8,["title","description"])):e.createCommentVNode("",!0)],544),e.unref(L).thumbnails&&S.value&&O.value>0?(e.openBlock(),e.createElementBlock("aside",{key:0,ref_key:"thumbsRef",ref:x,class:"mrp-thumbs",onScrollPassive:v[8]||(v[8]=(...h)=>e.unref(ee).onScroll&&e.unref(ee).onScroll(...h))},[e.unref(ee).windowRange.value.padTopPx>0?(e.openBlock(),e.createElementBlock("div",{key:0,class:"mrp-thumb-spacer",style:e.normalizeStyle({height:`${e.unref(ee).windowRange.value.padTopPx}px`}),"aria-hidden":"true"},null,4)):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(ee).visibleThumbs.value,h=>(e.openBlock(),e.createElementBlock("div",{key:h.index,class:e.normalizeClass(["mrp-thumb",{"mrp-thumb-active":h.index+1===c.value}]),style:e.normalizeStyle({height:`${h.height+20}px`}),onClick:V=>oe(h.index+1)},[e.createElementVNode("div",{class:"mrp-thumb-box","data-thumb":h.index+1,style:e.normalizeStyle({height:`${h.height}px`})},null,12,Uo),e.createElementVNode("span",Ko,e.toDisplayString(h.index+1),1)],14,qo))),128)),e.unref(ee).windowRange.value.padBottomPx>0?(e.openBlock(),e.createElementBlock("div",{key:1,class:"mrp-thumb-spacer",style:e.normalizeStyle({height:`${e.unref(ee).windowRange.value.padBottomPx}px`}),"aria-hidden":"true"},null,4)):e.createCommentVNode("",!0)],544)):e.createCommentVNode("",!0)]),e.createElementVNode("div",Zo,[e.renderSlot(i.$slots,"default",{},void 0,!0)]),e.unref(de)?(e.openBlock(),e.createElementBlock("div",Go,[v[9]||(v[9]=e.createElementVNode("div",null,"mach-report debug",-1)),e.createElementVNode("div",null,"pages: "+e.toDisplayString(e.unref(de).pages)+" | window: ["+e.toDisplayString(e.unref(de).window)+"]",1),e.createElementVNode("div",null,"zoom: "+e.toDisplayString(e.unref(de).zoom)+" | load: "+e.toDisplayString(e.unref(de).loadMs),1),e.createElementVNode("div",null,"plan: "+e.toDisplayString(e.unref(de).planKB)+"KB",1)])):e.createCommentVNode("",!0)],6))}}),qt=Ee(Yo,[["__scopeId","data-v-a8ee1f0e"]]),Jo=Object.freeze(Object.defineProperty({__proto__:null,default:qt},Symbol.toStringTag,{value:"Module"}));exports.DEFAULT_MESSAGES=Vt;exports.DEFAULT_THEME=It;exports.MachReportError=re;exports.PlanLoadError=Fe;exports.REPORT_EXPORT_FORMATS=Oe;exports.REPORT_PREVIEW_TOOLS=jt;exports.ReportParamPanel=Tt;exports.ReportPreview=qt;exports.ReportPreview$1=Jo;exports.ReportToolbar=Dt;exports.SILENT_LOGGER=$o;exports.buildPrintDocument=st;exports.buildWordHtml=Mt;exports.createDefaultPdfExporter=At;exports.createFetchRequest=wn;exports.defineMachReportConfig=Ot;exports.defineMachReportPreset=So;exports.joinReportIds=yn;exports.normalizeReportIds=rt;exports.printPlans=xn;exports.provideMachReportConfig=Mo;exports.resolveConfig=zt;exports.themeToCssVars=Lt;exports.toErrorDetail=Ht;exports.useMachReportConfig=Wt;exports.usePageWindow=$t;exports.usePrintExport=Ft;exports.useZoom=Rt;
@@ -1,6 +1,6 @@
1
1
  import { defineAsyncComponent as a, computed as s } from "vue";
2
2
  import { g as m } from "./report-params-B3Fia6JO.js";
3
- const p = "mach-report/fetcher", l = "mach-report/pdf-exporter", R = "mach-report/config", h = "mach-report/controller", d = a(() => import("./ReportPreview-CL9J9MEE.js").then((r) => r.s)), _ = {
3
+ const p = "mach-report/fetcher", l = "mach-report/pdf-exporter", R = "mach-report/config", h = "mach-report/controller", d = a(() => import("./ReportPreview-CBKLI--k.js").then((r) => r.w)), _ = {
4
4
  install(r, e = {}) {
5
5
  let t = e.fetcher;
6
6
  if (!t && e.reports) {
@@ -1 +1 @@
1
- "use strict";var l=Object.create;var n=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var d=Object.getPrototypeOf,h=Object.prototype.hasOwnProperty;var m=(r,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let c of p(e))!h.call(r,c)&&c!==t&&n(r,c,{get:()=>e[c],enumerable:!(o=s(e,c))||o.enumerable});return r};var C=(r,e,t)=>(t=r!=null?l(d(r)):{},m(e||!r||!r.__esModule?n(t,"default",{value:r,enumerable:!0}):t,r));const E=require("vue"),O=require("./report-params-D1gZ1DME.cjs"),_="mach-report/fetcher",f="mach-report/pdf-exporter",P="mach-report/config",u="mach-report/controller",a=E.defineAsyncComponent(()=>Promise.resolve().then(()=>require("./ReportPreview-DJvv3h8m.cjs")).then(r=>r.ReportPreview$1)),T={install(r,e={}){let t=e.fetcher;if(!t&&e.reports){const o=e.reports;let c;t=async R=>(c??=import("@agile-team/mach-report").then(({createReportSource:i})=>i(o)),(await c)(R)),t.getParamDefs=R=>O.getReportParamDefs(o,R)}t&&r.provide(_,t),e.pdfExporter&&r.provide(f,e.pdfExporter),r.provide(P,E.computed(()=>{if(e.pdfFontUrl===void 0)return e.config??null;const o=e.config??{defaults:{},presets:{}};return{...o,defaults:{...o.defaults,pdfFontUrl:e.pdfFontUrl}}})),e.globalComponent!==!1&&!r.component("MachReportPreview")&&r.component("MachReportPreview",a)}};exports.MACH_REPORT_CONFIG_KEY=P;exports.MACH_REPORT_CONTROLLER_KEY=u;exports.MACH_REPORT_FETCHER_KEY=_;exports.MACH_REPORT_PDF_EXPORTER_KEY=f;exports.MachReportPreview=a;exports.machReportPlugin=T;
1
+ "use strict";var l=Object.create;var n=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var d=Object.getPrototypeOf,h=Object.prototype.hasOwnProperty;var m=(r,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let c of p(e))!h.call(r,c)&&c!==t&&n(r,c,{get:()=>e[c],enumerable:!(o=s(e,c))||o.enumerable});return r};var C=(r,e,t)=>(t=r!=null?l(d(r)):{},m(e||!r||!r.__esModule?n(t,"default",{value:r,enumerable:!0}):t,r));const E=require("vue"),O=require("./report-params-D1gZ1DME.cjs"),_="mach-report/fetcher",f="mach-report/pdf-exporter",P="mach-report/config",u="mach-report/controller",a=E.defineAsyncComponent(()=>Promise.resolve().then(()=>require("./ReportPreview-ClM8h0pM.cjs")).then(r=>r.ReportPreview$1)),T={install(r,e={}){let t=e.fetcher;if(!t&&e.reports){const o=e.reports;let c;t=async R=>(c??=import("@agile-team/mach-report").then(({createReportSource:i})=>i(o)),(await c)(R)),t.getParamDefs=R=>O.getReportParamDefs(o,R)}t&&r.provide(_,t),e.pdfExporter&&r.provide(f,e.pdfExporter),r.provide(P,E.computed(()=>{if(e.pdfFontUrl===void 0)return e.config??null;const o=e.config??{defaults:{},presets:{}};return{...o,defaults:{...o.defaults,pdfFontUrl:e.pdfFontUrl}}})),e.globalComponent!==!1&&!r.component("MachReportPreview")&&r.component("MachReportPreview",a)}};exports.MACH_REPORT_CONFIG_KEY=P;exports.MACH_REPORT_CONTROLLER_KEY=u;exports.MACH_REPORT_FETCHER_KEY=_;exports.MACH_REPORT_PDF_EXPORTER_KEY=f;exports.MachReportPreview=a;exports.machReportPlugin=T;
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .mrp-toolbar[data-v-1c2568a7]{display:flex;align-items:center;gap:8px;padding:6px 12px;background:var(--mrp-toolbar-bg, #323639);border-bottom:1px solid var(--mrp-toolbar-border, #22252a);flex:none;flex-wrap:wrap}.mrp-title[data-v-1c2568a7]{font-size:13px;font-weight:600;margin-right:8px;color:var(--mrp-toolbar-fg, #e8e8e8)}.mrp-nav[data-v-1c2568a7]{background:transparent;color:var(--mrp-btn-fg, #cfcfcf);border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:2px 8px;font-size:12px;cursor:pointer;white-space:nowrap}.mrp-nav[data-v-1c2568a7]:hover:not(:disabled){background:var(--mrp-btn-hover-bg, #414549);color:var(--mrp-btn-hover-fg, #fff)}.mrp-nav[data-v-1c2568a7]:disabled{opacity:.4;cursor:not-allowed}.mrp-active[data-v-1c2568a7]{background:var(--mrp-btn-active-bg, #2d5fb8);border-color:var(--mrp-btn-active-bg, #2d5fb8);color:#fff}.mrp-pageinfo[data-v-1c2568a7]{font-size:12px;min-width:56px;text-align:center;color:var(--mrp-toolbar-fg, #e8e8e8)}.mrp-spacer[data-v-1c2568a7]{flex:1}.mrp-search[data-v-1c2568a7]{display:flex;align-items:center;gap:4px}.mrp-search-input[data-v-1c2568a7]{background:#22252a;color:#e8e8e8;border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:2px 8px;font-size:12px;width:150px;outline:none}.mrp-search-input[data-v-1c2568a7]:focus{border-color:var(--mrp-btn-active-bg, #2d5fb8)}.mrp-search-count[data-v-1c2568a7]{font-size:12px;color:var(--mrp-toolbar-fg, #e8e8e8);min-width:42px;text-align:center}.mrp-params[data-v-aafce92d]{display:flex;align-items:flex-end;gap:12px;padding:6px 12px;background:var(--mrp-toolbar-bg, #323639);border-bottom:1px solid var(--mrp-toolbar-border, #22252a);flex:none;flex-wrap:wrap}.mrp-params-title[data-v-aafce92d]{font-size:12px;font-weight:600;color:var(--mrp-toolbar-fg, #e8e8e8);padding-bottom:5px;white-space:nowrap}.mrp-params-grid[data-v-aafce92d]{display:flex;flex-wrap:wrap;gap:8px 12px;flex:1}.mrp-param[data-v-aafce92d]{display:flex;flex-direction:column;gap:2px}.mrp-param-label[data-v-aafce92d]{font-size:11px;color:var(--mrp-toolbar-fg, #e8e8e8);opacity:.85}.mrp-param-star[data-v-aafce92d]{color:#ff7b72;font-style:normal;margin-left:2px}.mrp-param-input[data-v-aafce92d]{background:#22252a;color:#e8e8e8;border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:3px 8px;font-size:12px;min-width:130px;outline:none}.mrp-param-input[data-v-aafce92d]:focus{border-color:var(--mrp-btn-active-bg, #2d5fb8)}.mrp-param-missing .mrp-param-input[data-v-aafce92d]{border-color:#ff7b72}select.mrp-param-input option[data-v-aafce92d]{background:#22252a}.mrp-params-actions[data-v-aafce92d]{display:flex;gap:6px;padding-bottom:1px}.mrp-nav[data-v-aafce92d]{background:transparent;color:var(--mrp-btn-fg, #cfcfcf);border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:4px 14px;font-size:12px;cursor:pointer;white-space:nowrap}.mrp-nav[data-v-aafce92d]:hover{background:var(--mrp-btn-hover-bg, #414549);color:var(--mrp-btn-hover-fg, #fff)}.mrp-param-query[data-v-aafce92d]{background:var(--mrp-btn-active-bg, #2d5fb8);border-color:var(--mrp-btn-active-bg, #2d5fb8);color:#fff}.mach-report-preview[data-v-8dab9187]{--mrp-shell-bg: #525659;--mrp-shell-fg: #e8e8e8;--mrp-toolbar-bg: #323639;--mrp-toolbar-border: #22252a;--mrp-toolbar-fg: #e8e8e8;--mrp-btn-fg: #cfcfcf;--mrp-btn-border: #4a4d52;--mrp-btn-hover-bg: #414549;--mrp-btn-hover-fg: #ffffff;--mrp-btn-active-bg: #2d5fb8;position:relative;display:flex;flex-direction:column;background:var(--mrp-shell-bg);color:var(--mrp-shell-fg);overflow:hidden}.mrp-main[data-v-8dab9187]{display:flex;flex:1;min-height:0}.mrp-body[data-v-8dab9187]{flex:1;min-width:0;overflow:auto;padding:24px;outline:none}.mrp-scale[data-v-8dab9187]{position:relative;margin:0 auto}.mrp-scale-inner[data-v-8dab9187]{position:absolute;left:0;top:0;display:flex;flex-direction:column;align-items:center}.mrp-page-holder[data-v-8dab9187]{background:#fff;box-shadow:0 2px 8px #00000059;margin-bottom:var(--v587d5a34);flex:none}.mrp-wide-report .mrp-page-holder[data-v-8dab9187]{box-shadow:none}.mrp-state[data-v-8dab9187]{padding:40px;text-align:center;color:#bfbfbf;font-size:13px}.mrp-error[data-v-8dab9187]{color:#ff9d9d}.mrp-edit-hint[data-v-8dab9187]{padding:5px 12px;font-size:12px;color:var(--mrp-shell-fg)}.mrp-export-notice[data-v-8dab9187]{padding:7px 12px;font-size:12px;background:#fff0c2;color:#613c00}.mrp-export-error[data-v-8dab9187]{background:#ffe0df;color:#8e1f1f}.mrp-export-progress[data-v-8dab9187]{background:#e7f0ff;color:#1a4d86}.mrp-retry[data-v-8dab9187]{margin-left:12px;background:transparent;color:#8fb7ff;border:1px solid #5a7fbf;border-radius:4px;padding:1px 10px;cursor:pointer}.mrp-overlay[data-v-8dab9187]{position:absolute;inset:0;pointer-events:none}.mrp-page-holder[data-v-8dab9187] mark.mrp-hit{background:#ffe066;color:#7a5c00;border-radius:2px;padding:0 1px;scroll-margin:8px}.mrp-thumbs[data-v-8dab9187]{width:140px;flex:none;overflow-y:auto;border-left:1px solid var(--mrp-toolbar-border);background:var(--mrp-toolbar-bg);padding:8px;display:flex;flex-direction:column}.mrp-thumb[data-v-8dab9187]{cursor:pointer;text-align:center;flex:none;margin-bottom:8px}.mrp-thumb-spacer[data-v-8dab9187]{flex:none}.mrp-thumb-box[data-v-8dab9187]{box-sizing:border-box;width:116px;background:#fff;box-shadow:0 1px 4px #0006;overflow:hidden;border:2px solid transparent}.mrp-thumb-active .mrp-thumb-box[data-v-8dab9187]{border-color:var(--mrp-btn-active-bg)}.mrp-thumb-no[data-v-8dab9187]{display:block;margin-top:4px;line-height:16px;font-size:11px;color:var(--mrp-toolbar-fg)}.mrp-debug[data-v-8dab9187]{position:absolute;right:8px;bottom:8px;background:#000000c7;color:#7ee787;font:11px/1.6 ui-monospace,monospace;padding:6px 10px;border-radius:6px;pointer-events:none;white-space:pre}
1
+ .mrp-toolbar[data-v-4223ad9f]{display:flex;align-items:center;gap:8px;padding:6px 12px;background:var(--mrp-toolbar-bg, #323639);border-bottom:1px solid var(--mrp-toolbar-border, #22252a);flex:none;flex-wrap:wrap}.mrp-title[data-v-4223ad9f]{font-size:13px;font-weight:600;margin-right:8px;color:var(--mrp-toolbar-fg, #e8e8e8)}.mrp-nav[data-v-4223ad9f]{background:transparent;color:var(--mrp-btn-fg, #cfcfcf);border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:2px 8px;font-size:12px;cursor:pointer;white-space:nowrap}.mrp-nav[data-v-4223ad9f]:hover:not(:disabled){background:var(--mrp-btn-hover-bg, #414549);color:var(--mrp-btn-hover-fg, #fff)}.mrp-nav[data-v-4223ad9f]:disabled{opacity:.4;cursor:not-allowed}.mrp-active[data-v-4223ad9f]{background:var(--mrp-btn-active-bg, #2d5fb8);border-color:var(--mrp-btn-active-bg, #2d5fb8);color:#fff}.mrp-settings-toggle[data-v-4223ad9f]{display:inline-flex;align-items:center;gap:5px}.mrp-pageinfo[data-v-4223ad9f]{font-size:12px;min-width:56px;text-align:center;color:var(--mrp-toolbar-fg, #e8e8e8)}.mrp-spacer[data-v-4223ad9f]{flex:1}.mrp-search[data-v-4223ad9f]{display:flex;align-items:center;gap:4px}.mrp-search-input[data-v-4223ad9f]{background:#22252a;color:#e8e8e8;border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:2px 8px;font-size:12px;width:150px;outline:none}.mrp-search-input[data-v-4223ad9f]:focus{border-color:var(--mrp-btn-active-bg, #2d5fb8)}.mrp-search-count[data-v-4223ad9f]{font-size:12px;color:var(--mrp-toolbar-fg, #e8e8e8);min-width:42px;text-align:center}.mrp-settings-backdrop[data-v-fe89b48b]{position:absolute;inset:0;z-index:30;background:#0f172a1f;display:flex;justify-content:flex-end;padding:10px}.mrp-settings-panel[data-v-fe89b48b]{box-sizing:border-box;width:min(340px,100%);display:flex;flex-direction:column;min-height:0;border:1px solid var(--mrp-toolbar-border);border-radius:10px;background:var(--mrp-toolbar-bg);color:var(--mrp-toolbar-fg);box-shadow:0 12px 40px #00000038;font-size:13px}.mrp-settings-header[data-v-fe89b48b]{display:flex;align-items:flex-start;justify-content:space-between;padding:16px 16px 10px}.mrp-settings-header strong[data-v-fe89b48b]{font-size:15px}.mrp-settings-header p[data-v-fe89b48b]{font-size:12px;opacity:.7;margin:7px 0 0;line-height:1.5}.mrp-settings-panel button[data-v-fe89b48b]{cursor:pointer;color:inherit;border:1px solid var(--mrp-btn-border);background:transparent;border-radius:5px;padding:5px 10px}.mrp-settings-panel button[data-v-fe89b48b]:hover{background:var(--mrp-btn-hover-bg)}.mrp-settings-close[data-v-fe89b48b]{font-size:20px;line-height:18px}.mrp-settings-content[data-v-fe89b48b]{overflow:auto;padding:0 16px 10px}.mrp-settings-content fieldset[data-v-fe89b48b]{border:0;border-top:1px solid var(--mrp-toolbar-border);margin:12px 0 0;padding:7px 0 0;min-width:0}.mrp-settings-content legend[data-v-fe89b48b]{font-weight:600;padding-right:10px}.mrp-settings-option[data-v-fe89b48b]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:7px 0;cursor:pointer}.mrp-settings-option input[data-v-fe89b48b]{accent-color:var(--mrp-btn-active-bg);width:15px;height:15px;margin:0;flex:none}.mrp-settings-option small[data-v-fe89b48b]{display:block;font-size:11px;margin-top:3px;opacity:.75}.mrp-settings-unavailable[data-v-fe89b48b]{opacity:.5;cursor:default}.mrp-settings-note[data-v-fe89b48b]{font-size:11px;line-height:1.6;opacity:.75}.mrp-settings-panel footer[data-v-fe89b48b]{border-top:1px solid var(--mrp-toolbar-border);padding:10px 16px}.mrp-empty[data-v-07e9cb82]{box-sizing:border-box;position:sticky;left:max(0px,calc((100% - 560px)/2));width:min(560px,100%);margin:22px auto;padding:20px 24px 26px;text-align:center;color:var(--mrp-toolbar-fg, #526078);border:1px dashed var(--mrp-toolbar-border, #dfe5ed);border-radius:12px;background:var(--mrp-toolbar-bg, #fff)}.mrp-empty-art[data-v-07e9cb82]{display:block;width:144px;height:101px;margin:0 auto 10px}.mrp-empty strong[data-v-07e9cb82]{display:block;font-size:14px;font-weight:600}.mrp-empty p[data-v-07e9cb82]{font-size:12px;line-height:1.7;opacity:.7;margin:8px 0 0;overflow-wrap:anywhere}.mrp-params[data-v-aafce92d]{display:flex;align-items:flex-end;gap:12px;padding:6px 12px;background:var(--mrp-toolbar-bg, #323639);border-bottom:1px solid var(--mrp-toolbar-border, #22252a);flex:none;flex-wrap:wrap}.mrp-params-title[data-v-aafce92d]{font-size:12px;font-weight:600;color:var(--mrp-toolbar-fg, #e8e8e8);padding-bottom:5px;white-space:nowrap}.mrp-params-grid[data-v-aafce92d]{display:flex;flex-wrap:wrap;gap:8px 12px;flex:1}.mrp-param[data-v-aafce92d]{display:flex;flex-direction:column;gap:2px}.mrp-param-label[data-v-aafce92d]{font-size:11px;color:var(--mrp-toolbar-fg, #e8e8e8);opacity:.85}.mrp-param-star[data-v-aafce92d]{color:#ff7b72;font-style:normal;margin-left:2px}.mrp-param-input[data-v-aafce92d]{background:#22252a;color:#e8e8e8;border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:3px 8px;font-size:12px;min-width:130px;outline:none}.mrp-param-input[data-v-aafce92d]:focus{border-color:var(--mrp-btn-active-bg, #2d5fb8)}.mrp-param-missing .mrp-param-input[data-v-aafce92d]{border-color:#ff7b72}select.mrp-param-input option[data-v-aafce92d]{background:#22252a}.mrp-params-actions[data-v-aafce92d]{display:flex;gap:6px;padding-bottom:1px}.mrp-nav[data-v-aafce92d]{background:transparent;color:var(--mrp-btn-fg, #cfcfcf);border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:4px 14px;font-size:12px;cursor:pointer;white-space:nowrap}.mrp-nav[data-v-aafce92d]:hover{background:var(--mrp-btn-hover-bg, #414549);color:var(--mrp-btn-hover-fg, #fff)}.mrp-param-query[data-v-aafce92d]{background:var(--mrp-btn-active-bg, #2d5fb8);border-color:var(--mrp-btn-active-bg, #2d5fb8);color:#fff}.mach-report-preview[data-v-a8ee1f0e]{--mrp-shell-bg: #525659;--mrp-shell-fg: #e8e8e8;--mrp-toolbar-bg: #323639;--mrp-toolbar-border: #22252a;--mrp-toolbar-fg: #e8e8e8;--mrp-btn-fg: #cfcfcf;--mrp-btn-border: #4a4d52;--mrp-btn-hover-bg: #414549;--mrp-btn-hover-fg: #ffffff;--mrp-btn-active-bg: #2d5fb8;position:relative;display:flex;flex-direction:column;background:var(--mrp-shell-bg);color:var(--mrp-shell-fg);overflow:hidden}.mrp-main[data-v-a8ee1f0e]{display:flex;flex:1;min-height:0}.mrp-body[data-v-a8ee1f0e]{flex:1;min-width:0;overflow:auto;padding:24px;outline:none}.mrp-scale[data-v-a8ee1f0e]{position:relative;margin:0 auto}.mrp-scale-inner[data-v-a8ee1f0e]{position:absolute;left:0;top:0;display:flex;flex-direction:column;align-items:center}.mrp-page-holder[data-v-a8ee1f0e]{background:#fff;box-shadow:0 2px 8px #00000059;margin-bottom:var(--v54e94a63);flex:none}.mrp-wide-report .mrp-page-holder[data-v-a8ee1f0e]{box-shadow:none}.mrp-state[data-v-a8ee1f0e]{padding:40px;text-align:center;color:#bfbfbf;font-size:13px}.mrp-error[data-v-a8ee1f0e]{color:#ff9d9d}.mrp-edit-hint[data-v-a8ee1f0e]{padding:5px 12px;font-size:12px;color:var(--mrp-shell-fg)}.mrp-export-notice[data-v-a8ee1f0e]{padding:7px 12px;font-size:12px;background:#fff0c2;color:#613c00}.mrp-export-error[data-v-a8ee1f0e]{background:#ffe0df;color:#8e1f1f}.mrp-export-progress[data-v-a8ee1f0e]{background:#e7f0ff;color:#1a4d86}.mrp-retry[data-v-a8ee1f0e]{margin-left:12px;background:transparent;color:#8fb7ff;border:1px solid #5a7fbf;border-radius:4px;padding:1px 10px;cursor:pointer}.mrp-overlay[data-v-a8ee1f0e]{position:absolute;inset:0;pointer-events:none}.mrp-page-holder[data-v-a8ee1f0e] mark.mrp-hit{background:#ffe066;color:#7a5c00;border-radius:2px;padding:0 1px;scroll-margin:8px}.mrp-thumbs[data-v-a8ee1f0e]{width:140px;flex:none;overflow-y:auto;border-left:1px solid var(--mrp-toolbar-border);background:var(--mrp-toolbar-bg);padding:8px;display:flex;flex-direction:column}.mrp-thumb[data-v-a8ee1f0e]{cursor:pointer;text-align:center;flex:none;margin-bottom:8px}.mrp-thumb-spacer[data-v-a8ee1f0e]{flex:none}.mrp-thumb-box[data-v-a8ee1f0e]{box-sizing:border-box;width:116px;background:#fff;box-shadow:0 1px 4px #0006;overflow:hidden;border:2px solid transparent}.mrp-thumb-active .mrp-thumb-box[data-v-a8ee1f0e]{border-color:var(--mrp-btn-active-bg)}.mrp-thumb-no[data-v-a8ee1f0e]{display:block;margin-top:4px;line-height:16px;font-size:11px;color:var(--mrp-toolbar-fg)}.mrp-debug[data-v-a8ee1f0e]{position:absolute;right:8px;bottom:8px;background:#000000c7;color:#7ee787;font:11px/1.6 ui-monospace,monospace;padding:6px 10px;border-radius:6px;pointer-events:none;white-space:pre}
@@ -450,6 +450,9 @@ declare interface MachReportDefaults {
450
450
  showExport?: boolean;
451
451
  showPrint?: boolean;
452
452
  showPdfWindow?: boolean;
453
+ /** 设置入口默认显示;可在其中按需启用阅读及输出工具。 */
454
+ showSettings?: boolean;
455
+ toolbar?: MachReportToolbarOptions;
453
456
  /** 参数面板显隐(有参数定义且未显式关闭时显示;缺省 true) */
454
457
  showParams?: boolean;
455
458
  /** 页间距 px */
@@ -533,6 +536,20 @@ declare interface MachReportMessages {
533
536
  editInvalidNumber?: string;
534
537
  editInvalidBoolean?: string;
535
538
  editConflict?: string;
539
+ settings?: string;
540
+ settingsDisplay?: string;
541
+ settingsExport?: string;
542
+ settingsData?: string;
543
+ settingsUnavailable?: string;
544
+ settingsReset?: string;
545
+ settingsClose?: string;
546
+ search?: string;
547
+ zoom?: string;
548
+ settingsLocal?: string;
549
+ editingLocal?: string;
550
+ editingSaved?: string;
551
+ importLocal?: string;
552
+ emptyDescription?: string;
536
553
  }
537
554
 
538
555
  declare interface MachReportPluginOptions {
@@ -586,6 +603,18 @@ export declare const MachReportPreview: {
586
603
  type: BooleanConstructor;
587
604
  default: undefined;
588
605
  };
606
+ showSettings: {
607
+ type: BooleanConstructor;
608
+ default: undefined;
609
+ };
610
+ toolbar: {
611
+ type: PropType<MachReportToolbarOptions>;
612
+ default: undefined;
613
+ };
614
+ emptyState: {
615
+ type: PropType<boolean | ReportEmptyState>;
616
+ default: boolean;
617
+ };
589
618
  gapPx: {
590
619
  type: NumberConstructor;
591
620
  default: undefined;
@@ -631,6 +660,7 @@ export declare const MachReportPreview: {
631
660
  onWarning?: ((message: string) => any) | undefined;
632
661
  "onCell-edit"?: ((edit: ReportCellEdit_2) => any) | undefined;
633
662
  "onTemplate-import"?: ((result: ExcelImportResult) => any) | undefined;
663
+ "onPreferences-change"?: ((preferences: Readonly<ReportPreviewPreferences>) => any) | undefined;
634
664
  }>, {
635
665
  reload: () => Promise<void>;
636
666
  print: () => Promise<void>;
@@ -654,6 +684,7 @@ export declare const MachReportPreview: {
654
684
  warning: (message: string) => any;
655
685
  "cell-edit": (edit: ReportCellEdit_2) => any;
656
686
  "template-import": (result: ExcelImportResult) => any;
687
+ "preferences-change": (preferences: Readonly<ReportPreviewPreferences>) => any;
657
688
  }, PublicProps, {
658
689
  editable: boolean | ReportEditingOptions;
659
690
  height: string;
@@ -664,10 +695,13 @@ export declare const MachReportPreview: {
664
695
  showExport: boolean;
665
696
  showPrint: boolean;
666
697
  showPdfWindow: boolean;
698
+ showSettings: boolean;
667
699
  showParams: boolean;
700
+ toolbar: MachReportToolbarOptions;
668
701
  messages: Partial<MachReportMessages>;
669
702
  excelImport: boolean | ExcelImportOptions_2;
670
703
  autoLoad: boolean;
704
+ emptyState: boolean | ReportEmptyState;
671
705
  preset: string;
672
706
  paramDefs: ReportParamDef[] | undefined;
673
707
  fetcher: PlanFetcher | null;
@@ -712,6 +746,18 @@ export declare const MachReportPreview: {
712
746
  type: BooleanConstructor;
713
747
  default: undefined;
714
748
  };
749
+ showSettings: {
750
+ type: BooleanConstructor;
751
+ default: undefined;
752
+ };
753
+ toolbar: {
754
+ type: PropType<MachReportToolbarOptions>;
755
+ default: undefined;
756
+ };
757
+ emptyState: {
758
+ type: PropType<boolean | ReportEmptyState>;
759
+ default: boolean;
760
+ };
715
761
  gapPx: {
716
762
  type: NumberConstructor;
717
763
  default: undefined;
@@ -757,6 +803,7 @@ export declare const MachReportPreview: {
757
803
  onWarning?: ((message: string) => any) | undefined;
758
804
  "onCell-edit"?: ((edit: ReportCellEdit_2) => any) | undefined;
759
805
  "onTemplate-import"?: ((result: ExcelImportResult) => any) | undefined;
806
+ "onPreferences-change"?: ((preferences: Readonly<ReportPreviewPreferences>) => any) | undefined;
760
807
  }>, {
761
808
  reload: () => Promise<void>;
762
809
  print: () => Promise<void>;
@@ -781,10 +828,13 @@ export declare const MachReportPreview: {
781
828
  showExport: boolean;
782
829
  showPrint: boolean;
783
830
  showPdfWindow: boolean;
831
+ showSettings: boolean;
784
832
  showParams: boolean;
833
+ toolbar: MachReportToolbarOptions;
785
834
  messages: Partial<MachReportMessages>;
786
835
  excelImport: boolean | ExcelImportOptions_2;
787
836
  autoLoad: boolean;
837
+ emptyState: boolean | ReportEmptyState;
788
838
  preset: string;
789
839
  paramDefs: ReportParamDef[] | undefined;
790
840
  fetcher: PlanFetcher | null;
@@ -821,6 +871,18 @@ showPdfWindow: {
821
871
  type: BooleanConstructor;
822
872
  default: undefined;
823
873
  };
874
+ showSettings: {
875
+ type: BooleanConstructor;
876
+ default: undefined;
877
+ };
878
+ toolbar: {
879
+ type: PropType<MachReportToolbarOptions>;
880
+ default: undefined;
881
+ };
882
+ emptyState: {
883
+ type: PropType<boolean | ReportEmptyState>;
884
+ default: boolean;
885
+ };
824
886
  gapPx: {
825
887
  type: NumberConstructor;
826
888
  default: undefined;
@@ -866,6 +928,7 @@ onLoaded?: ((pageCount: number) => any) | undefined;
866
928
  onWarning?: ((message: string) => any) | undefined;
867
929
  "onCell-edit"?: ((edit: ReportCellEdit_2) => any) | undefined;
868
930
  "onTemplate-import"?: ((result: ExcelImportResult) => any) | undefined;
931
+ "onPreferences-change"?: ((preferences: Readonly<ReportPreviewPreferences>) => any) | undefined;
869
932
  }>, {
870
933
  reload: () => Promise<void>;
871
934
  print: () => Promise<void>;
@@ -889,6 +952,7 @@ loaded: (pageCount: number) => any;
889
952
  warning: (message: string) => any;
890
953
  "cell-edit": (edit: ReportCellEdit_2) => any;
891
954
  "template-import": (result: ExcelImportResult) => any;
955
+ "preferences-change": (preferences: Readonly<ReportPreviewPreferences>) => any;
892
956
  }, string, {
893
957
  editable: boolean | ReportEditingOptions;
894
958
  height: string;
@@ -899,15 +963,19 @@ debug: boolean;
899
963
  showExport: boolean;
900
964
  showPrint: boolean;
901
965
  showPdfWindow: boolean;
966
+ showSettings: boolean;
902
967
  showParams: boolean;
968
+ toolbar: MachReportToolbarOptions;
903
969
  messages: Partial<MachReportMessages>;
904
970
  excelImport: boolean | ExcelImportOptions_2;
905
971
  autoLoad: boolean;
972
+ emptyState: boolean | ReportEmptyState;
906
973
  preset: string;
907
974
  paramDefs: ReportParamDef[] | undefined;
908
975
  fetcher: PlanFetcher | null;
909
976
  }, {}, string, {}, { [K in keyof GlobalComponents]: GlobalComponents[K] }, { [K in keyof GlobalDirectives]: GlobalDirectives[K] }, string, ComponentProvideOptions> & VNodeProps & AllowedComponentProps & ComponentCustomProps & (new () => {
910
977
  $slots: {
978
+ settings?(_: {}): any;
911
979
  default?(_: {}): any;
912
980
  };
913
981
  });
@@ -959,6 +1027,18 @@ declare interface MachReportTheme {
959
1027
  btnActiveBg: string;
960
1028
  }
961
1029
 
1030
+ declare interface MachReportToolbarOptions {
1031
+ search?: boolean;
1032
+ thumbnails?: boolean;
1033
+ zoom?: boolean;
1034
+ /** 编辑能力由 editable 授权;此项仅设置初始交互偏好,默认 true(兼容旧行为)。 */
1035
+ editing?: boolean;
1036
+ /** 导入能力由 excelImport 授权;此项仅设置初始交互偏好,默认 true。 */
1037
+ excelImport?: boolean;
1038
+ /** 未传时显示全部已有出口;空数组表示不提供导出工具。 */
1039
+ exportFormats?: ReportExportFormat[];
1040
+ }
1041
+
962
1042
  declare interface PaginateOptions {
963
1043
  /** 每行额外占高(mm),压测专用钩子 */
964
1044
  mmPerRow?: number;
@@ -1140,6 +1220,8 @@ declare interface RenderPlan {
1140
1220
  pages: PlanPage[];
1141
1221
  }
1142
1222
 
1223
+ declare const REPORT_PREVIEW_TOOLS: readonly ["search", "thumbnails", "zoom", ...ReportExportFormat[], "print", "pdfWindow", "editing", "import"];
1224
+
1143
1225
  /** 预览中的物理坐标;合并单元格使用左上角坐标。 */
1144
1226
  declare interface ReportCellAddress {
1145
1227
  pageIndex: number;
@@ -1234,6 +1316,15 @@ declare interface ReportEditOperation {
1234
1316
  signal: AbortSignal;
1235
1317
  }
1236
1318
 
1319
+ /** 报表含表头但业务行为空时,由接入方明确声明;组件不推测业务数据。 */
1320
+ declare interface ReportEmptyState {
1321
+ title?: string;
1322
+ description?: string;
1323
+ }
1324
+
1325
+ /** 输出能力仍由宿主授权;工具偏好只决定当前预览实例的可见与启用状态。 */
1326
+ declare type ReportExportFormat = "html" | "pdf" | "xlsx" | "png" | "word";
1327
+
1237
1328
  /** 保持 Promise<RenderPlan> 契约;元数据为可选,旧业务 fetcher 无需改造。 */
1238
1329
  declare interface ReportFetcher {
1239
1330
  (input: ReportFetchInput): Promise<RenderPlan>;
@@ -1286,6 +1377,10 @@ declare interface ReportParamDef_2 {
1286
1377
  placeholder?: string;
1287
1378
  }
1288
1379
 
1380
+ declare type ReportPreviewPreferences = Record<ReportPreviewTool, boolean>;
1381
+
1382
+ declare type ReportPreviewTool = typeof REPORT_PREVIEW_TOOLS[number];
1383
+
1289
1384
  declare type ReportRegistry = Record<string, ReportDefinition>;
1290
1385
 
1291
1386
  declare interface ReportTemplate {