@agile-team/mach-report 2.4.1 → 2.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/README.md +119 -13
  2. package/dist/ReportPreview-Dk-28QAi.js +2946 -0
  3. package/dist/ReportPreview-FSvcBLjH.cjs +6 -0
  4. package/dist/_plugin-vue_export-helper-BHFhmbuH.cjs +1 -0
  5. package/dist/_plugin-vue_export-helper-CHgC5LLL.js +9 -0
  6. package/dist/analytics.cjs +1 -0
  7. package/dist/analytics.d.cts +276 -0
  8. package/dist/analytics.d.ts +276 -0
  9. package/dist/analytics.js +223 -0
  10. package/dist/assets-66UBlhES.cjs +1 -0
  11. package/dist/assets-NVA_sftu.js +163 -0
  12. package/dist/capabilities-CNjIirfo.js +36 -0
  13. package/dist/capabilities-D4xeVYSR.cjs +1 -0
  14. package/dist/designer.cjs +1 -0
  15. package/dist/designer.d.cts +753 -0
  16. package/dist/designer.d.ts +753 -0
  17. package/dist/designer.js +372 -0
  18. package/dist/grid-geometry-BNptEcMm.js +65 -0
  19. package/dist/grid-geometry-CZ_cYB6O.cjs +1 -0
  20. package/dist/index.cjs +8 -5
  21. package/dist/index.d.cts +413 -8
  22. package/dist/index.d.ts +413 -8
  23. package/dist/index.js +1016 -1501
  24. package/dist/param-validation-BWNjLcN0.js +116 -0
  25. package/dist/param-validation-CiTxFeZ8.cjs +1 -0
  26. package/dist/pdf.cjs +48 -48
  27. package/dist/pdf.d.cts +111 -1
  28. package/dist/pdf.d.ts +111 -1
  29. package/dist/pdf.js +3931 -3868
  30. package/dist/{plugin-DwKr8oF6.cjs → plugin-BqBkn_kI.cjs} +1 -1
  31. package/dist/{plugin-CKnSVuVe.js → plugin-Ds10VnQO.js} +2 -2
  32. package/dist/render-plan-CckPEQyf.cjs +1 -0
  33. package/dist/{render-plan-CXBWRog4.js → render-plan-uzZYYSy1.js} +11 -10
  34. package/dist/report-params-B_VCihAh.js +12 -0
  35. package/dist/report-params-CjWrjPl6.cjs +1 -0
  36. package/dist/report-source-B9bENO0F.js +750 -0
  37. package/dist/report-source-BbNkkBDy.cjs +1 -0
  38. package/dist/server/node.d.cts +297 -0
  39. package/dist/server/node.d.ts +297 -0
  40. package/dist/server-node.cjs +1 -0
  41. package/dist/server-node.js +270 -0
  42. package/dist/server.cjs +1 -0
  43. package/dist/server.d.cts +643 -0
  44. package/dist/server.d.ts +643 -0
  45. package/dist/server.js +237 -0
  46. package/dist/style-CpwiOPyB.cjs +1 -0
  47. package/dist/style-Dv5o_x6b.js +67 -0
  48. package/dist/style.css +1 -1
  49. package/dist/template-registry-DWExx0gU.cjs +1 -0
  50. package/dist/template-registry-NpOakidD.js +354 -0
  51. package/dist/textwrap-CnGsEum6.cjs +4 -0
  52. package/dist/textwrap-DOl04hCQ.js +110 -0
  53. package/dist/validate-DfHPD8wX.cjs +1 -0
  54. package/dist/validate-S6CgIm5d.js +148 -0
  55. package/dist/vue/async.d.cts +694 -54
  56. package/dist/vue/async.d.ts +694 -54
  57. package/dist/vue/index.d.cts +1212 -111
  58. package/dist/vue/index.d.ts +1212 -111
  59. package/dist/vue-async.cjs +1 -1
  60. package/dist/vue-async.js +3 -3
  61. package/dist/vue.cjs +1 -1
  62. package/dist/vue.js +167 -80
  63. package/dist/worker.cjs +1 -0
  64. package/dist/worker.d.cts +302 -0
  65. package/dist/worker.d.ts +302 -0
  66. package/dist/worker.js +133 -0
  67. package/dist/xlsx/node.d.cts +47 -0
  68. package/dist/xlsx/node.d.ts +47 -0
  69. package/dist/xlsx-node.cjs +221 -0
  70. package/dist/xlsx-node.js +36409 -0
  71. package/dist/xlsx.cjs +20 -20
  72. package/dist/xlsx.d.cts +78 -1
  73. package/dist/xlsx.d.ts +78 -1
  74. package/dist/xlsx.js +5974 -5831
  75. package/package.json +62 -2
  76. package/dist/ReportPreview-BVTpw9Tb.cjs +0 -6
  77. package/dist/ReportPreview-XF8iSUG1.js +0 -1910
  78. package/dist/grid-geometry-BNIvw52m.cjs +0 -1
  79. package/dist/grid-geometry-C8hGoe9o.js +0 -130
  80. package/dist/render-plan-CCTL4F9v.cjs +0 -1
  81. package/dist/report-params-B3Fia6JO.js +0 -10
  82. package/dist/report-params-D1gZ1DME.cjs +0 -1
  83. package/dist/textwrap-nH0UYU6D.js +0 -108
  84. package/dist/textwrap-oD-t4b4B.cjs +0 -4
@@ -0,0 +1,6 @@
1
+ "use strict";var zn=Object.create;var Ot=Object.defineProperty;var On=Object.getOwnPropertyDescriptor;var An=Object.getOwnPropertyNames;var Ln=Object.getPrototypeOf,qn=Object.prototype.hasOwnProperty;var Wn=(t,n,r,o)=>{if(n&&typeof n=="object"||typeof n=="function")for(let a of An(n))!qn.call(t,a)&&a!==r&&Ot(t,a,{get:()=>n[a],enumerable:!(o=On(n,a))||o.enumerable});return t};var st=(t,n,r)=>(r=t!=null?zn(Ln(t)):{},Wn(n||!t||!t.__esModule?Ot(r,"default",{value:t,enumerable:!0}):r,t));const e=require("vue"),W=require("@agile-team/mach-report"),jt=require("./page-window-index-DEjnM6IB.cjs"),Kt=require("./render-plan-CckPEQyf.cjs"),ue=require("./_plugin-vue_export-helper-BHFhmbuH.cjs"),ve=require("./plugin-BqBkn_kI.cjs"),Hn=require("./grid-geometry-CZ_cYB6O.cjs");function pt(t){return t==null?[]:Array.isArray(t)?t.map(String).filter(n=>n!==""):String(t).split(",").map(n=>n.trim()).filter(n=>n!=="")}function jn(t){return pt(t).join(",")}class Te extends Error{constructor(n){super(n),this.name="PlanLoadError"}}function Kn(t={}){const{baseUrl:n="",headers:r,credentials:o,timeoutMs:a=3e4}=t,s=n.replace(/\/+$/,"");return async({url:i,method:f,params:C,signal:h})=>{let l=`${s}${i}`;if(C&&Object.keys(C).length>0){const k=l.indexOf("#"),A=k>=0?l.slice(k):"",R=k>=0?l.slice(0,k):l,d=R.indexOf("?"),g=d>=0?R.slice(0,d):R,w=new URLSearchParams(d>=0?R.slice(d+1):"");for(const[P,D]of Object.entries(C))w.set(P,D);l=`${g}?${w}${A}`}const u=(k,A)=>{const R=new Te(k);return Object.defineProperty(R,"cause",{value:A,configurable:!0,writable:!0}),R};if(h?.aborted)throw u(`请求已取消: ${i}`,h.reason);const m=new AbortController;let p;const E=()=>{m.signal.aborted||(p="external",m.abort(h?.reason))};h?.addEventListener("abort",E,{once:!0});const v=setTimeout(()=>{m.signal.aborted||(p="timeout",m.abort())},a);try{const k=await fetch(l,{method:f.toUpperCase(),headers:{Accept:"application/json",...r},credentials:o,signal:m.signal});if(!k.ok)throw new Te(`HTTP ${k.status} ${i}`);return await k.json()}catch(k){throw p==="timeout"?u(`请求超时(${a}ms): ${i}`,k):p==="external"?u(`请求已取消: ${i}`,k):k instanceof Te?k:u(`请求失败(${i}): ${k instanceof Error?k.message:String(k)}`,k)}finally{clearTimeout(v),h?.removeEventListener("abort",E)}}}function Ut(t,n,r={}){const o=r.pxPerMm??3.7795275590551185,a=e.computed(()=>Math.max(0,e.unref(r.gapPx)??18)),s=e.ref(0),i=e.ref(800),f=e.computed(()=>{const k=t.value?.pages??[];return jt.createPageWindowIndex(k.map(A=>A.pageHeightMm*o),a.value)}),C=e.computed(()=>{let k=0;for(const A of t.value?.pages??[])k=Math.max(k,A.pageWidthMm*o);return{w:k,h:f.value.totalHeightPx}}),h=e.computed(()=>f.value.window(i.value/n.value,s.value/n.value,e.unref(r.overscan)??1)),l=e.computed(()=>{const k=t.value;if(!k)return[];const{start:A,end:R}=h.value;return k.pages.slice(A,R+1).map((d,g)=>({page:d,index:A+g}))});let u=0,m=!1;function p(k){k&&(s.value=k.scrollTop,i.value=k.clientHeight||800)}function E(k,A){return R=>{u||m||(u=requestAnimationFrame(()=>{if(u=0,m||(p(R),A.value<=0))return;const d=Math.max(0,R.scrollTop+32)/n.value;k.value=Math.min(A.value,f.value.pageAt(d)+1)}))}}function v(){m=!0,u&&cancelAnimationFrame(u),u=0}return e.onScopeDispose(v),{contentSize:C,windowRange:h,visiblePages:l,makeScrollHandler:E,refreshViewport:p,pageOffsetPx:k=>f.value.offsetAt(k),destroy:v}}function Gt(t){const n=e.ref(1),r=e.ref("fit");let o=0;function a(){o&&cancelAnimationFrame(o),o=0}function s(){a(),o=requestAnimationFrame(()=>{if(o=0,r.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 i(f){if(f==="fit")r.value="fit",s();else{if(!Number.isFinite(f))return;a(),r.value="raw",n.value=Math.min(3,Math.max(.3,f/100))}}return e.getCurrentScope()&&e.onScopeDispose(a),{zoom:n,zoomMode:r,applyFitZoom:s,setZoom:i}}const Le=8;function qe(){return new Promise(t=>setTimeout(t,0))}function ze(t){return`p${t.pageWidthMm}x${t.pageHeightMm}`.replace(/[.+]/g,"_")}function gt(t){const n=new Map;return t.pages.forEach(a=>{n.has(ze(a))||n.set(ze(a),a)}),`<!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(a=>`@page ${ze(a)}{size:${a.pageWidthMm}mm ${a.pageHeightMm}mm;margin:0;}`).join(`
5
+ `)}
6
+ body{margin:0;background:#fff;}`}</style></head><body>`}function vt(t){const n=W.renderPage(t,96,{},document);return n.style.page=ze(t),n.outerHTML}function ht(t){return{head:gt(t),pageChunks:t.pages.map(vt)}}async function Un(t,n={}){const r={schemaVersion:"mach-report-batch-print",pages:t.flatMap(i=>i.pages)};if(r.pages.length===0)return;const o=gt(r),a=document.createElement("iframe");a.style.cssText="position:fixed;right:0;bottom:0;width:0;height:0;border:0;visibility:hidden;",document.body.appendChild(a);let s=!1;try{const i=a.contentDocument;i.open(),i.write(o);for(let f=0;f<r.pages.length;f++)i.write(vt(r.pages[f])),f%Le===Le-1&&(n.onProgress?.(f+1,r.pages.length),await qe());i.write("</body></html>"),i.close(),await qe(),n.onProgress?.(r.pages.length,r.pages.length),s=!0,a.contentWindow?.focus(),a.contentWindow?.print()}catch(i){n.onError?.(i instanceof Error?`批量打印失败: ${i.message}`:"批量打印失败")}finally{s?setTimeout(()=>a.remove(),6e4):a.remove()}}function Jt(t){const{head:n,pageChunks:r}=ht(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>/,"")}`}${r.join("")}</body></html>`,filename:"mach-report.doc"}}function Zt(t,n){let r=null,o=!1,a=!1,s=0;const i=new Map,f=new Map;let C=null,h=null,l=null,u=null,m=null;function p(b,y){return!a&&t.value===b&&s===y}function E(){if(a)return;const b=[...i.values()].reverse().find(y=>p(y.plan,y.epoch))?.format??null;b!==C&&(C=b,n.onBusy?.(b))}function v(b,y,F){const T={};return i.set(T,{plan:b,epoch:y,format:F}),E(),T}function k(b){i.delete(b),E()}function A(){for(const[b,y]of f)p(y.plan,y.epoch)||(b.close(),f.delete(b))}function R(){s++,g(),E(),A()}const d=e.watch(t,R,{flush:"sync"});function g(){r?.remove(),r=null}function w(){a=!0,s++,d(),g(),A(),i.clear(),n.onPrinting?.(!1)}function P(b,y){const F=URL.createObjectURL(b);setTimeout(()=>URL.revokeObjectURL(F),1e4);const T=document.createElement("a");T.href=F,T.download=y,T.click()}async function D(){if(o)return;const b=t.value;if(a||!b||b.pages.length===0)return;const y=s;o=!0,n.onPrinting?.(!0),g();const F=gt(b);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);const T=r;try{const q=T.contentDocument;q.open(),q.write(F);for(let z=0;z<b.pages.length;z++)if(q.write(vt(b.pages[z])),z%Le===Le-1&&await qe(),T!==r)return;if(q.write("</body></html>"),q.close(),await qe(),!p(b,y)||T!==r)return;T.contentWindow?.focus(),T.contentWindow?.print()}catch{T===r&&g(),p(b,y)&&n.onError("调用打印失败,请改用导出 PDF","print")}finally{o=!1,a||n.onPrinting?.(!1)}}function N(b,y){if(h?.plan===b&&h.epoch===y)return h.promise;const F=Promise.resolve().then(()=>{if(!p(b,y))throw new Error("报表已切换或卸载");return n.getPdfExporter()(b,T=>{p(b,y)&&n.onWarning?.(T)})}).finally(()=>{h?.promise===F&&(h=null)});return h={plan:b,epoch:y,promise:F},F}async function B(){const b=t.value;if(a||!b||b.pages.length===0)return;const y=s;if(l?.plan===b&&l.epoch===y)return l.promise;const F=v(b,y,"PDF"),T=(async()=>{try{const q=await N(b,y);if(!p(b,y))return;P(new Blob([q],{type:"application/pdf"}),"mach-report.pdf")}catch(q){p(b,y)&&n.onError(q instanceof Error?`PDF 导出失败: ${q.message}`:"PDF 导出失败","pdf")}finally{k(F),l?.token===F&&(l=null)}})();return l={plan:b,epoch:y,promise:T,token:F},T}async function $(){const b=t.value;if(a||!b||b.pages.length===0)return;const y=s;if(u?.plan===b&&u.epoch===y)return u.promise;const F={...n.getXlsxOptions?.()},T=v(b,y,"Excel"),q=(async()=>{try{const{renderPlanToXlsx:z}=await import("@agile-team/mach-report/xlsx");if(!p(b,y))return;const{buffer:M,warnings:ee}=await z(b,F);if(!p(b,y)||(ee.length>0&&n.onWarning?.(`Excel 导出有 ${ee.length} 条提示:${ee.slice(0,2).join(";")}`),!p(b,y)))return;P(new Blob([M],{type:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}),"mach-report.xlsx")}catch(z){p(b,y)&&n.onError(z instanceof Error?`Excel 导出失败: ${z.message}`:"Excel 导出失败","export")}finally{k(T),u?.token===T&&(u=null)}})();return u={plan:b,epoch:y,promise:q,token:T},q}async function I(){const b=t.value;if(a||!b||b.pages.length===0)return;const y=s;if(m?.plan===b&&m.epoch===y)return m.promise;const F=v(b,y,"图片"),T=(async()=>{try{const{blobs:q}=await W.renderPlanToImages(b,{dpr:Math.min(2,typeof devicePixelRatio=="number"?devicePixelRatio:1)});if(!p(b,y))return;q.forEach((z,M)=>{P(z,q.length>1?`mach-report-page-${M+1}.png`:"mach-report.png")})}catch(q){p(b,y)&&n.onError(q instanceof Error?`图片导出失败: ${q.message}`:"图片导出失败","export")}finally{k(F),m?.token===F&&(m=null)}})();return m={plan:b,epoch:y,promise:T,token:F},T}function L(){const b=t.value;if(!(a||!b||b.pages.length===0))try{const{html:y,filename:F}=Jt(b);P(new Blob([y],{type:"application/msword;charset=utf-8"}),F)}catch(y){n.onError(y instanceof Error?`Word 导出失败: ${y.message}`:"Word 导出失败","export")}}async function H(b){const y=t.value;if(!(a||!y||y.pages.length===0)){if(b==="pdf"){await B();return}if(b==="xlsx"||b==="excel"){await $();return}if(b==="png"||b==="image"){await I();return}if(b==="word"||b==="doc"){L();return}if(b!=="html"){n.onError(`不支持的导出格式:${b}`,"export");return}try{const{head:F,pageChunks:T}=ht(y),q=`${F}${T.join("")}</body></html>`;P(new Blob([q],{type:"text/html;charset=utf-8"}),"mach-report.html")}catch(F){n.onError(F instanceof Error?`HTML 导出失败: ${F.message}`:"HTML 导出失败","export")}}}function K(){const b=t.value;if(a||!b||b.pages.length===0)return;const y=s,F=window.open("","_blank");if(!F){n.onError("浏览器拦截了弹窗,请允许弹窗后重试","pdf");return}f.set(F,{plan:b,epoch:y});const T=v(b,y,"PDF");N(b,y).then(q=>{if(!p(b,y)||F.closed){f.delete(F)&&F.close();return}const z=URL.createObjectURL(new Blob([q],{type:"application/pdf"}));setTimeout(()=>URL.revokeObjectURL(z),6e4);const M=F.document;M.title="PDF 预览",M.documentElement.style.height="100%",M.body.style.cssText="margin:0;height:100%;";const ee=M.createElement("iframe");ee.title="PDF 预览",ee.style.cssText="display:block;width:100%;height:100%;border:0;",ee.src=z,M.body.replaceChildren(ee),f.delete(F)}).catch(q=>{F.close(),f.delete(F),p(b,y)&&n.onError(q instanceof Error?`PDF 预览失败: ${q.message}`:"PDF 预览失败","pdf")}).finally(()=>k(T))}return{print:D,exportAs:H,exportImages:I,exportWord:L,openPdfWindow:K,invalidatePending:R,releasePrintFrame:g,dispose:w}}const Yt="mrp-hit";function Gn(t){t.querySelectorAll(`mark.${Yt}`).forEach(r=>{const o=r.parentNode;if(o){for(;r.firstChild;)o.insertBefore(r.firstChild,r);r.remove(),o.normalize()}})}function Jn(t,n){const r=n.trim();if(!r)return 0;const o=r.toLowerCase(),a=document.createTreeWalker(t,NodeFilter.SHOW_TEXT,{acceptNode(f){const C=f.parentElement;return!C||C.closest("mark")||/^(SCRIPT|STYLE)$/.test(C.tagName)?NodeFilter.FILTER_REJECT:(f.nodeValue??"").toLowerCase().includes(o)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),s=[];for(let f=a.nextNode();f;f=a.nextNode())s.push(f);let i=0;for(const f of s){const C=f.nodeValue??"",h=C.toLowerCase(),l=f.parentElement;if(!l)continue;const u=document.createDocumentFragment();let m=0,p=h.indexOf(o);for(;p>=0;){p>m&&u.appendChild(document.createTextNode(C.slice(m,p)));const E=document.createElement("mark");E.className=Yt,E.textContent=C.slice(p,p+r.length),u.appendChild(E),i++,m=p+r.length,p=h.indexOf(o,m)}m<C.length&&u.appendChild(document.createTextNode(C.slice(m))),l.replaceChild(u,f)}return i}const Zn=new Set(["line","rect","ellipse","chart"]);function*Yn(t){for(const n of t.cells??[])for(const r of n??[])yield r?.text??"",yield*r?.children??[]}function*Xn(t){if(Kt.isRichText(t))for(const n of t.richParagraphs)for(const r of n.segments??[])yield(r.kind==="field"?r.field:r.text)??"";else t.lines?.length?yield*t.lines:yield t.text??""}function*Qn(t){const n=[t.values()];for(;n.length>0;){const r=n[n.length-1].next();if(r.done){n.pop();continue}const o=r.value;if(typeof o=="string"){yield o;continue}yield"",!Kt.isImageBackedComponent(o)&&(o.kind==="text"?n.push(Xn(o)):o.grid?n.push(Yn(o.grid)):Zn.has(o.kind)||(yield o.fallbackText??""))}}function*_n(t){for(let n=0;n<t.pages.length;n++){for(const r of Qn(t.pages[n].components))yield{text:r,pageIndex:n};yield{text:"",pageIndex:n}}}function eo(t,n){const r=t.toLowerCase();let o=0;for(let a=r.indexOf(n);a>=0;a=r.indexOf(n,a+n.length))o++;return o}function to(t){const{plan:n,gotoPage:r,highlight:o,clearHighlights:a}=t,s=e.ref(!1),i=e.ref(""),f=e.ref(0),C=e.ref(0),h=e.ref(!1);let l=[];const u=e.computed(()=>{if(C.value===0)return null;const g=f.value;let w=0,P=l.length-1;for(;w<P;){const N=w+P>>>1;l[N].cumulative<=g?w=N+1:P=N}const D=l[w];return D?{pageIndex:D.pageIndex,occurrence:g-(l[w-1]?.cumulative??0)}:null});let m=null,p=null,E=0;function v(){E++,m&&clearTimeout(m),p&&clearTimeout(p),m=p=null,h.value=!1}function k(g){i.value=g,f.value=0,C.value=0,l=[],h.value=!1;const w=g.trim().toLowerCase(),P=n.value;if(!w||!P)return;h.value=!0;const D=E,N=_n(P),B=[];let $=0;function I(){if(p=null,D!==E||P!==n.value)return;const L=performance.now();let H=0;for(;H<5e3&&performance.now()-L<4;){const K=N.next();if(K.done){l=B,C.value=$,h.value=!1,l[0]&&r(l[0].pageIndex+1);return}const b=eo(K.value.text,w);if(b>0){$+=b;const y=B[B.length-1];y?.pageIndex===K.value.pageIndex?y.cumulative=$:B.push({pageIndex:K.value.pageIndex,cumulative:$})}H++}p=setTimeout(I,0)}I()}function A(g){if(v(),i.value=g,f.value=C.value=0,l=[],!g.trim()){k("");return}h.value=!0,m=setTimeout(()=>{m=null,k(g)},Math.max(0,e.unref(t.debounceMs)??200))}function R(g){const w=C.value;if(w===0||h.value)return;f.value=(f.value+g+w)%w;const P=u.value;P&&r(P.pageIndex+1)}function d(){v(),i.value="",f.value=C.value=0,l=[]}return e.watch(n,d,{flush:"sync"}),e.onScopeDispose(d),{visible:s,query:i,matchIndex:f,matchCount:C,activeMatch:u,searching:h,toggle:()=>{s.value=!s.value},onInput:A,onNav:R,apply:g=>{i.value.trim()&&o(g,i.value.trim())},clear:g=>{a(g)},reset:d}}function no(t,n){const r=e.computed(()=>{if(t.value)return!0;if(typeof location>"u")return!1;try{return new URLSearchParams(location.search).get("mrp-debug")==="1"}catch{return!1}}),o=e.computed(()=>!r.value||!n.plan.value?0:Math.round(JSON.stringify(n.plan.value).length/1024)),a=e.computed(()=>!r.value||!n.plan.value?null:{pages:n.pageCount.value,window:`${n.windowRange.value.start}-${n.windowRange.value.end}`,zoom:`${Math.round(n.zoom.value*100)}%`,loadMs:`${n.loadMs.value}ms`,planKB:o.value});return{enabled:r,debugStats:a}}function oo(t,n){const{thumbsRoot:r,visible:o,renderThumbCanvas:a}=n,s=e.ref(0),i=e.ref(800),f=e.computed(()=>(t.value?.pages??[]).map(R=>Math.round(R.pageHeightMm/R.pageWidthMm*116))),C=e.computed(()=>jt.createPageWindowIndex(f.value.map(R=>R+20),8)),h=e.computed(()=>C.value.window(i.value,s.value,1)),l=e.computed(()=>{if(!o.value)return[];const{start:R,end:d}=h.value;return f.value.slice(R,d+1).map((g,w)=>({index:R+w,height:g}))});let u=0,m=0,p=!1;function E(){const R=r.value;R&&(s.value=R.scrollTop,i.value=R.clientHeight||800)}function v(){p||m||(m=requestAnimationFrame(()=>{m=0,E()}))}function k(){if(l.value,u&&cancelAnimationFrame(u),u=0,p||!o.value||!t.value||!r.value)return;E();const R=l.value,d=t.value,g=r.value;let w=0;function P(){if(u=0,!(p||!o.value||t.value!==d||r.value!==g)){for(let D=0;w<R.length&&D<2;D++,w++){const N=R[w].index,B=g.querySelector(`[data-thumb="${N+1}"]`);if(!B||B.childElementCount>0)continue;const $=a(N);$&&($.style.width="100%",$.style.height="100%",$.style.display="block",B.appendChild($))}w<R.length&&(u=requestAnimationFrame(P))}}u=requestAnimationFrame(P)}function A(){p=!0,u&&cancelAnimationFrame(u),m&&cancelAnimationFrame(m),u=m=0}return e.onScopeDispose(A),{schedule:k,destroy:A,onScroll:v,windowRange:h,visibleThumbs:l}}function ro(){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}}}function ao(t){const n=e.ref(null),r=e.ref(null);function o(){n.value?.focus(),n.value?.select()}e.watch(t.visible,i=>{i&&e.nextTick(o)});function a(){t.close(),e.nextTick(()=>r.value?.focus())}function s(i){i.isComposing||i.keyCode===229||i.key!=="Enter"&&i.key!=="Escape"||(i.preventDefault(),i.stopPropagation(),i.key==="Escape"?a():t.navigate(i.shiftKey?-1:1))}return{input:n,toggle:r,focus:o,close:a,onKeydown:s}}const lo=["aria-label"],so={class:"mrp-title"},io=["disabled"],co={class:"mrp-pageinfo"},uo=["disabled"],fo=["disabled"],mo={key:2,class:"mrp-search"},po=["placeholder","aria-label","value"],go={key:0,class:"mrp-search-count",role:"status"},vo=["disabled","aria-label"],ho=["disabled","aria-label"],bo=["aria-label"],yo=["aria-label","aria-pressed"],wo=["aria-pressed"],xo=["disabled"],Eo=["disabled"],ko=["disabled"],Co=["disabled"],Po=["disabled"],So=["disabled"],Bo=["disabled"],$o=["aria-label","aria-expanded"],Ro=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,{expose:n,emit:r}){const o=t,a=r,s=ao({visible:()=>o.search.visible,navigate:h=>a("search-nav",h),close:()=>{o.search.visible&&a("search-toggle")}}),{input:i,toggle:f}=s;n({focusSearch:s.focus});function C(h,l,u){return h.replace("{cur}",String(l)).replace("{total}",String(u))}return(h,l)=>(e.openBlock(),e.createElementBlock("div",{class:"mrp-toolbar",role:"toolbar","aria-label":t.messages.title},[e.createElementVNode("span",so,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]=u=>h.$emit("goto",t.currentPage-1))},e.toDisplayString(t.messages.prevPage),9,io),e.createElementVNode("span",co,e.toDisplayString(C(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]=u=>h.$emit("goto",t.currentPage+1))},e.toDisplayString(t.messages.nextPage),9,uo)],64)):e.createCommentVNode("",!0),l[23]||(l[23]=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]=u=>h.$emit("import-excel"))},e.toDisplayString(t.messages.importExcel??"导入 Excel 模板"),9,fo)):e.createCommentVNode("",!0),t.showSearch!==!1&&t.search.visible?(e.openBlock(),e.createElementBlock("div",mo,[e.createElementVNode("input",{ref_key:"searchInputRef",ref:i,class:"mrp-search-input",type:"text",placeholder:t.messages.searchPlaceholder,"aria-label":t.messages.search??t.messages.searchPlaceholder,value:t.search.query,onInput:l[3]||(l[3]=u=>h.$emit("search-input",u.target.value)),onKeydown:l[4]||(l[4]=(...u)=>e.unref(s).onKeydown&&e.unref(s).onKeydown(...u))},null,40,po),t.search.query?(e.openBlock(),e.createElementBlock("span",go,e.toDisplayString(t.search.searching?t.messages.searching??"搜索中…":C(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,"aria-label":t.messages.prevSearchMatch,onClick:l[5]||(l[5]=u=>h.$emit("search-nav",-1))},e.toDisplayString(t.messages.prevMatch),9,vo),e.createElementVNode("button",{class:"mrp-nav",type:"button",disabled:t.search.matchCount===0,"aria-label":t.messages.nextSearchMatch,onClick:l[6]||(l[6]=u=>h.$emit("search-nav",1))},e.toDisplayString(t.messages.nextMatch),9,ho),e.createElementVNode("button",{class:"mrp-nav mrp-search-close",type:"button","aria-label":t.messages.closeSearch,onClick:l[7]||(l[7]=(...u)=>e.unref(s).close&&e.unref(s).close(...u))},"×",8,bo)])):e.createCommentVNode("",!0),t.showSearch!==!1?(e.openBlock(),e.createElementBlock("button",{key:3,ref_key:"searchToggleRef",ref:f,class:e.normalizeClass(["mrp-nav",{"mrp-active":t.search.visible}]),type:"button",title:"Ctrl+F","aria-label":t.messages.search??t.messages.searchPlaceholder,"aria-pressed":t.search.visible,onClick:l[8]||(l[8]=u=>h.$emit("search-toggle"))},[...l[21]||(l[21]=[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,yo)):e.createCommentVNode("",!0),t.showThumbnails!==!1?(e.openBlock(),e.createElementBlock("button",{key:4,class:e.normalizeClass(["mrp-nav",{"mrp-active":t.thumbsVisible}]),type:"button","aria-pressed":t.thumbsVisible,onClick:l[9]||(l[9]=u=>h.$emit("thumbs-toggle"))}," ▦ "+e.toDisplayString(t.messages.thumbnails),11,wo)):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[10]||(l[10]=u=>h.$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[11]||(l[11]=u=>h.$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[12]||(l[12]=u=>h.$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[13]||(l[13]=u=>h.$emit("export","html"))},e.toDisplayString(t.messages.exportHtml),9,xo)):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[14]||(l[14]=u=>h.$emit("export","pdf"))},e.toDisplayString(t.messages.exportPdf),9,Eo)):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[15]||(l[15]=u=>h.$emit("export","xlsx"))},e.toDisplayString(t.messages.exportExcel),9,ko)):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[16]||(l[16]=u=>h.$emit("export","png"))},e.toDisplayString(t.messages.exportImage),9,Co)):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[17]||(l[17]=u=>h.$emit("export","word"))},e.toDisplayString(t.messages.exportWord),9,Po)):e.createCommentVNode("",!0),t.showPrint?(e.openBlock(),e.createElementBlock("button",{key:13,class:"mrp-nav",type:"button",disabled:t.busy,onClick:l[18]||(l[18]=u=>h.$emit("print"))},e.toDisplayString(t.messages.print),9,So)):e.createCommentVNode("",!0),t.showPdfWindow?(e.openBlock(),e.createElementBlock("button",{key:14,class:"mrp-nav",type:"button",disabled:t.busy,onClick:l[19]||(l[19]=u=>h.$emit("pdf-window"))},e.toDisplayString(t.messages.pdfWindow),9,Bo)):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[20]||(l[20]=u=>h.$emit("settings-toggle"))},[l[22]||(l[22]=e.createStaticVNode('<svg width="14" height="14" viewBox="0 0 20 20" fill="none" aria-hidden="true" data-v-249cf7b0><path d="M3 5h14M3 10h14M3 15h14" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" data-v-249cf7b0></path><circle cx="7" cy="5" r="2" fill="var(--mrp-toolbar-bg)" stroke="currentColor" stroke-width="1.5" data-v-249cf7b0></circle><circle cx="13" cy="10" r="2" fill="var(--mrp-toolbar-bg)" stroke="currentColor" stroke-width="1.5" data-v-249cf7b0></circle><circle cx="8" cy="15" r="2" fill="var(--mrp-toolbar-bg)" stroke="currentColor" stroke-width="1.5" data-v-249cf7b0></circle></svg>',1)),e.createTextVNode(" "+e.toDisplayString(t.messages.settings),1)],8,$o)):e.createCommentVNode("",!0)],8,lo))}}),Xt=ue._export_sfc(Ro,[["__scopeId","data-v-249cf7b0"]]),Io=["aria-label"],Do={class:"mrp-settings-header"},No=["aria-label"],Mo={class:"mrp-settings-content"},Vo={key:0},Fo={class:"mrp-settings-option"},To=["checked","disabled"],zo={class:"mrp-settings-option"},Oo=["value","disabled"],Ao={key:0},Lo=["checked","disabled","onChange"],qo={key:1,class:"mrp-settings-note"},Wo={key:2,class:"mrp-settings-note"},Ho=["disabled"],jo=e.defineComponent({__name:"ReportSettings",props:{available:{},enabled:{},messages:{},persistedEditing:{type:Boolean},busy:{type:Boolean},interaction:{}},emits:["change","reset","close","interaction"],setup(t,{emit:n}){const r=t,o=n,a=e.ref(null),s=e.ref(null);let i=null;const f=e.computed(()=>[{label:r.messages.settingsDisplay,tools:[["search",r.messages.search],["thumbnails",r.messages.thumbnails],["zoom",r.messages.zoom]]},{label:r.messages.settingsExport,tools:[["html",r.messages.exportHtml],["pdf",r.messages.exportPdf],["xlsx",r.messages.exportExcel],["png",r.messages.exportImage],["word",r.messages.exportWord],["print",r.messages.print],["pdfWindow",r.messages.pdfWindow]]},{label:r.messages.settingsData,tools:[["editing",r.messages.editCell],["import",r.messages.importExcel]]}].map(l=>({...l,tools:l.tools.map(([u,m])=>({key:u,label:m}))})));function C(l,u){const m=l.target,p=m.checked;m.checked=r.enabled[u],o("change",u,p)}function h(l){if(l.key==="Escape"){l.preventDefault(),o("close");return}if(l.key!=="Tab")return;const u=a.value?.querySelectorAll("a[href],button:not(:disabled),input:not(:disabled),textarea:not(:disabled),select:not(:disabled),[tabindex='0']"),m=u?.[0],p=u?.[u.length-1];l.shiftKey&&document.activeElement===m&&(l.preventDefault(),p?.focus()),!l.shiftKey&&document.activeElement===p&&(l.preventDefault(),m?.focus())}return e.onMounted(()=>{i=document.activeElement instanceof HTMLElement?document.activeElement:null,s.value?.focus()}),e.onUnmounted(()=>i?.focus()),(l,u)=>(e.openBlock(),e.createElementBlock("div",{class:"mrp-settings-backdrop",onClick:u[4]||(u[4]=e.withModifiers(m=>l.$emit("close"),["self"])),onKeydown:h},[e.createElementVNode("section",{ref_key:"panel",ref:a,class:"mrp-settings-panel",role:"dialog","aria-modal":"true","aria-label":t.messages.settings},[e.createElementVNode("header",Do,[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:s,class:"mrp-settings-close",type:"button","aria-label":t.messages.settingsClose,onClick:u[0]||(u[0]=m=>l.$emit("close"))},"×",8,No)]),e.createElementVNode("div",Mo,[e.renderSlot(l.$slots,"default",{},void 0,!0),t.interaction?(e.openBlock(),e.createElementBlock("fieldset",Vo,[e.createElementVNode("legend",null,e.toDisplayString(t.messages.settingsPanes),1),e.createElementVNode("label",Fo,[e.createElementVNode("span",null,e.toDisplayString(t.messages.freezeHeaders),1),e.createElementVNode("input",{type:"checkbox",checked:t.interaction.freezeHeaders,disabled:t.busy,onChange:u[1]||(u[1]=m=>l.$emit("interaction",{freezeHeaders:m.target.checked}))},null,40,To)]),e.createElementVNode("label",zo,[e.createElementVNode("span",null,e.toDisplayString(t.messages.frozenColumns),1),e.createElementVNode("input",{class:"mrp-frozen-count",type:"number",min:"0",max:"20",value:t.interaction.frozenColumns??0,disabled:t.busy,onChange:u[2]||(u[2]=m=>l.$emit("interaction",{frozenColumns:Math.max(0,Math.min(20,Number(m.target.value)||0))}))},null,40,Oo)])])):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(f.value,m=>(e.openBlock(),e.createElementBlock("fieldset",{key:m.label},[e.createElementVNode("legend",null,e.toDisplayString(m.label),1),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(m.tools,p=>(e.openBlock(),e.createElementBlock("label",{key:p.key,class:e.normalizeClass(["mrp-settings-option",{"mrp-settings-unavailable":!t.available[p.key]}])},[e.createElementVNode("span",null,[e.createTextVNode(e.toDisplayString(p.label),1),t.available[p.key]?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("small",Ao,e.toDisplayString(t.messages.settingsUnavailable),1))]),e.createElementVNode("input",{type:"checkbox",checked:t.enabled[p.key],disabled:t.busy||!t.available[p.key],onChange:E=>C(E,p.key)},null,40,Lo)],2))),128))]))),128)),t.available.editing?(e.openBlock(),e.createElementBlock("p",qo,e.toDisplayString(t.persistedEditing?t.messages.editingSaved:t.messages.editingLocal),1)):e.createCommentVNode("",!0),t.available.import?(e.openBlock(),e.createElementBlock("p",Wo,e.toDisplayString(t.messages.importLocal),1)):e.createCommentVNode("",!0)]),e.createElementVNode("footer",null,[e.createElementVNode("button",{type:"button",disabled:t.busy,onClick:u[3]||(u[3]=m=>l.$emit("reset"))},e.toDisplayString(t.messages.settingsReset),9,Ho)])],8,Io)],32))}}),Ko=ue._export_sfc(jo,[["__scopeId","data-v-b0efd4aa"]]),Uo={class:"mrp-empty",role:"status"},Go={key:0},Jo=e.defineComponent({__name:"ReportEmpty",props:{title:{},description:{}},setup(t){return(n,r)=>(e.openBlock(),e.createElementBlock("div",Uo,[r[0]||(r[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",Go,e.toDisplayString(t.description),1)):e.createCommentVNode("",!0)]))}}),At=ue._export_sfc(Jo,[["__scopeId","data-v-07e9cb82"]]);class oe extends Error{constructor(n,r,o){super(r),this.name="MachReportError",this.code=n,this.cause=o}}function Qt(t){return t instanceof oe?{code:t.code,cause:t.cause}:{code:"render",cause:t}}function _t(t){if(t instanceof oe)return t;if(t instanceof W.ReportParamValidationError)return new oe("param",t.message,t);if(t instanceof W.ReportSourceError)return new oe(t.code,t.message,t.cause);if(t instanceof Error){const n={params:"param",config:"config",validate:"validate",fetch:"fetch"},r=t.code;if(typeof r=="string"&&Object.prototype.hasOwnProperty.call(n,r))return new oe(n[r],t.message,t)}return new oe("fetch",t instanceof Error?t.message:"预览加载失败",t)}let Zo=0;function Yo(){return`mrp-params-${++Zo}`}function en(t,n,r){const o=(Array.isArray(n)?n.find(a=>a?.field===t.field)?.label:void 0)??t.field;return t.code==="required"?r.paramRequired.replace("{label}",o):(r.paramInvalid??"{label}:{message}").replace("{label}",o).replace("{message}",t.message)}function Xo(t){const n=e.ref({}),r=e.ref(!1);function o(){const f={};for(const C of Array.isArray(t.defs.value)?t.defs.value:[])typeof C?.field=="string"&&Object.defineProperty(f,C.field,{value:t.params()[C.field]??C.defaultValue??"",writable:!0,enumerable:!0,configurable:!0});n.value=f,r.value=!1}o(),e.watch(t.defs,o),e.watch(t.reportIds,o),e.watch(()=>JSON.stringify(t.params()),o);const a=e.computed(()=>W.validateReportParams(t.defs.value,{...t.params(),...n.value})),s=e.computed(()=>!r.value&&a.value.issues.length>0&&a.value.issues.every(f=>f.code==="required"));function i(){const f=a.value;if(!f.ok){const l=f.issues[0];return{quiet:s.value,error:new oe(l.code==="definition"?"config":"param",en(l,t.defs.value,t.messages()),{issues:f.issues})}}const C={...f.values},h=new Set(t.defs.value.filter(l=>l.defaultValue!==void 0).map(l=>l.field));for(const[l,u]of Object.entries(C))u===""&&!h.has(l)&&delete C[l];return{params:C,quiet:!1}}return{values:n,attempted:r,validation:a,pendingRequired:s,reset:o,query:i}}const Qo={class:"mrp-params-title"},_o={class:"mrp-params-grid"},er=["id"],tr={key:0,class:"mrp-param-star"},nr=["value","aria-labelledby","aria-invalid","aria-describedby","aria-required","onChange"],or=["disabled","hidden"],rr=["value"],ar=["type","placeholder","value","min","max","step","aria-labelledby","aria-invalid","aria-describedby","aria-required","onInput"],lr=["id"],sr={class:"mrp-params-actions"},ir=e.defineComponent({__name:"ReportParamPanel",props:{defs:{},modelValue:{},messages:{},attempted:{type:Boolean},issues:{}},emits:["update:modelValue","query","reset"],setup(t,{expose:n,emit:r}){const o=t,a=r,s=e.ref({...o.modelValue}),i=e.ref(null),f=Yo();e.watch(()=>o.modelValue,p=>{s.value={...p}});const C=e.computed(()=>o.issues??W.validateReportParams(o.defs,s.value).issues),h=e.computed(()=>(Array.isArray(o.defs)?o.defs:[]).filter(p=>p&&typeof p.field=="string").map((p,E)=>({def:p,id:`${f}-${E}`,label:p.label??p.field,value:s.value[p.field]??"",error:o.attempted?C.value.find(v=>v.field===p.field):void 0})));function l(p,E){s.value={...s.value,[p]:E},a("update:modelValue",{...s.value})}function u(p){p.isComposing||a("query")}function m(){i.value?.querySelector('[aria-invalid="true"]')?.focus()}return n({focusInvalid:m}),(p,E)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"root",ref:i,class:"mrp-params"},[e.createElementVNode("span",Qo,e.toDisplayString(t.messages.paramsTitle),1),e.createElementVNode("div",_o,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(h.value,v=>(e.openBlock(),e.createElementBlock("label",{key:v.id,class:e.normalizeClass(["mrp-param",{"mrp-param-missing":!!v.error}])},[e.createElementVNode("span",{id:`${v.id}-label`,class:"mrp-param-label"},[e.createTextVNode(e.toDisplayString(v.label),1),v.def.required?(e.openBlock(),e.createElementBlock("i",tr,"*")):e.createCommentVNode("",!0)],8,er),(v.def.type??"text")==="select"?(e.openBlock(),e.createElementBlock("select",{key:0,class:"mrp-param-input",value:v.value,"aria-labelledby":`${v.id}-label`,"aria-invalid":v.error?!0:void 0,"aria-describedby":v.error?`${v.id}-error`:void 0,"aria-required":v.def.required||void 0,onChange:k=>l(v.def.field,k.target.value),onKeydown:e.withKeys(u,["enter"])},[e.createElementVNode("option",{value:"",disabled:v.def.required,hidden:v.def.required},e.toDisplayString(v.def.placeholder??(t.messages.paramSelectPlaceholder??"请选择{label}").replace("{label}",v.label)),9,or),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(v.def.options??[],k=>(e.openBlock(),e.createElementBlock("option",{key:k.value,value:k.value},e.toDisplayString(k.label),9,rr))),128))],40,nr)):(e.openBlock(),e.createElementBlock("input",{key:1,class:"mrp-param-input",type:v.def.type==="number"?"number":v.def.type==="date"?"date":"text",placeholder:v.def.placeholder??(t.messages.paramTextPlaceholder??"请输入{label}").replace("{label}",v.label),value:v.value,min:v.def.min,max:v.def.max,step:v.def.type==="number"?"any":void 0,"aria-labelledby":`${v.id}-label`,"aria-invalid":v.error?!0:void 0,"aria-describedby":v.error?`${v.id}-error`:void 0,"aria-required":v.def.required||void 0,onInput:k=>l(v.def.field,k.target.value),onKeydown:e.withKeys(u,["enter"])},null,40,ar)),v.error?(e.openBlock(),e.createElementBlock("small",{key:2,id:`${v.id}-error`,class:"mrp-param-error",role:"status"},e.toDisplayString(e.unref(en)(v.error,t.defs,t.messages)),9,lr)):e.createCommentVNode("",!0)],2))),128))]),e.createElementVNode("div",sr,[e.createElementVNode("button",{class:"mrp-nav mrp-param-query",type:"button",onClick:E[0]||(E[0]=v=>p.$emit("query"))},e.toDisplayString(t.messages.query),1),e.createElementVNode("button",{class:"mrp-nav",type:"button",onClick:E[1]||(E[1]=v=>p.$emit("reset"))},e.toDisplayString(t.messages.reset),1)])],512))}}),tn=ue._export_sfc(ir,[["__scopeId","data-v-156737bc"]]),cr={class:"mrp-edit-bar"},ur=["disabled"],dr=["disabled"],fr={class:"mrp-changes"},mr=["aria-label"],pr={key:0},gr={key:1},vr=["onClick"],hr=["title"],br=["title"],yr=["disabled"],wr={key:0,role:"status"},xr={key:1,role:"status"},Er={key:2,class:"mrp-conflicts",open:""},kr=e.defineComponent({__name:"ReportEditBar",props:{differences:{},conflicts:{},messages:{},saving:{type:Boolean},canUndo:{type:Boolean},canRedo:{type:Boolean},busy:{type:Boolean},persisted:{type:Boolean}},emits:["undo","redo","restore","locate"],setup(t){function n(r){return r.source?`${r.source.rowKey} · ${r.source.field}`:`${r.address.pageIndex+1} / ${r.address.rowIndex+1}:${r.address.columnIndex+1}`}return(r,o)=>(e.openBlock(),e.createElementBlock("div",cr,[e.createElementVNode("button",{type:"button",disabled:t.busy||t.saving||!t.canUndo,onClick:o[0]||(o[0]=a=>r.$emit("undo"))},e.toDisplayString(t.messages.undo),9,ur),e.createElementVNode("button",{type:"button",disabled:t.busy||t.saving||!t.canRedo,onClick:o[1]||(o[1]=a=>r.$emit("redo"))},e.toDisplayString(t.messages.redo),9,dr),e.createElementVNode("details",fr,[e.createElementVNode("summary",null,e.toDisplayString(t.messages.changes)+" · "+e.toDisplayString(t.messages.changesCount?.replace("{count}",String(t.differences.length))),1),e.createElementVNode("section",{"aria-label":t.messages.changes},[t.differences.length?(e.openBlock(),e.createElementBlock("ol",gr,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.differences,(a,s)=>(e.openBlock(),e.createElementBlock("li",{key:s},[e.createElementVNode("button",{type:"button",onClick:i=>r.$emit("locate",a)},e.toDisplayString(n(a)),9,vr),e.createElementVNode("span",null,[e.createElementVNode("s",{title:t.messages.changesBefore},e.toDisplayString(a.previousText||"∅"),9,hr),o[3]||(o[3]=e.createTextVNode(" → ",-1)),e.createElementVNode("strong",{title:t.messages.changesAfter},e.toDisplayString(a.text||"∅"),9,br)])]))),128))])):(e.openBlock(),e.createElementBlock("p",pr,e.toDisplayString(t.messages.changesEmpty),1))],8,mr)]),e.createElementVNode("button",{type:"button",disabled:t.busy||t.saving||!t.differences.length,onClick:o[2]||(o[2]=a=>r.$emit("restore"))},e.toDisplayString(t.messages.restoreChanges),9,yr),t.saving?(e.openBlock(),e.createElementBlock("span",wr,e.toDisplayString(t.messages.saving),1)):t.differences.length&&!t.conflicts.length?(e.openBlock(),e.createElementBlock("span",xr,e.toDisplayString(t.persisted?t.messages.editSaved:t.messages.editingLocal),1)):e.createCommentVNode("",!0),t.conflicts.length?(e.openBlock(),e.createElementBlock("details",Er,[e.createElementVNode("summary",null,e.toDisplayString(t.messages.conflicts)+" · "+e.toDisplayString(t.conflicts.length),1),e.createElementVNode("ul",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.conflicts,(a,s)=>(e.openBlock(),e.createElementBlock("li",{key:s},e.toDisplayString(a.message),1))),128))])])):e.createCommentVNode("",!0)]))}}),Cr=ue._export_sfc(kr,[["__scopeId","data-v-df1c7b86"]]),Pr=["aria-label"],Sr={key:0,class:"mrp-section-tabs"},Br=["disabled","onClick"],$r=["aria-label","placeholder","disabled"],Rr=["disabled"],Ir=e.defineComponent({__name:"ReportNavigation",props:{sections:{},currentPage:{},messages:{},busy:{type:Boolean}},emits:["goto","locate"],setup(t,{emit:n}){const r=n,o=e.ref("");return(a,s)=>(e.openBlock(),e.createElementBlock("nav",{class:"mrp-section-nav","aria-label":t.messages.sections},[t.sections.length>1?(e.openBlock(),e.createElementBlock("div",Sr,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.sections,(i,f)=>(e.openBlock(),e.createElementBlock("button",{key:f,type:"button",class:e.normalizeClass({active:t.currentPage>=i.pageIndex+1&&(!t.sections[f+1]||t.currentPage<=t.sections[f+1].pageIndex)}),disabled:t.busy,onClick:C=>r("goto",i.pageIndex+1)},e.toDisplayString(i.label),11,Br))),128))])):e.createCommentVNode("",!0),e.createElementVNode("form",{onSubmit:s[1]||(s[1]=e.withModifiers(i=>r("locate",o.value.trim()),["prevent"]))},[e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":s[0]||(s[0]=i=>o.value=i),type:"text","aria-label":t.messages.locateField,placeholder:t.messages.locateFieldPlaceholder,disabled:t.busy},null,8,$r),[[e.vModelText,o.value]]),e.createElementVNode("button",{type:"submit",disabled:t.busy||!o.value.trim()},e.toDisplayString(t.messages.locateField),9,Rr)],32)],8,Pr))}}),Dr=ue._export_sfc(Ir,[["__scopeId","data-v-ef8815ec"]]),Nr={class:"mrp-import-summary"},Mr={key:0},Vr={key:0},Fr=e.defineComponent({__name:"ReportImportSummary",props:{result:{},messages:{}},setup(t){return(n,r)=>(e.openBlock(),e.createElementBlock("details",Nr,[e.createElementVNode("summary",null,[e.createTextVNode(e.toDisplayString(t.messages.importSummary)+" · "+e.toDisplayString(t.messages.importPreserved?.replace("{sheets}",String(t.result.sheets.length)))+" ",1),t.result.warnings.length?(e.openBlock(),e.createElementBlock("span",Mr," · "+e.toDisplayString(t.result.warnings.length)+" "+e.toDisplayString(t.messages.importWarnings),1)):e.createCommentVNode("",!0)]),e.createElementVNode("p",null,e.toDisplayString(t.messages.importReadOnly),1),e.createElementVNode("ul",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.result.sheets,o=>(e.openBlock(),e.createElementBlock("li",{key:o.index},e.toDisplayString(o.name)+" · "+e.toDisplayString(o.range)+" · "+e.toDisplayString(o.rowCount)+" × "+e.toDisplayString(o.columnCount),1))),128))]),t.result.warnings.length?(e.openBlock(),e.createElementBlock("ul",Vr,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.result.warnings,(o,a)=>(e.openBlock(),e.createElementBlock("li",{key:a},e.toDisplayString(o),1))),128))])):e.createCommentVNode("",!0)]))}}),Tr=ue._export_sfc(Fr,[["__scopeId","data-v-54f275e8"]]),nn={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}",paramInvalid:"{label}:{message}",paramPrompt:"请先完善查询条件",paramPromptDescription:"填写必填条件后点击查询,即可生成报表。",paramSelectPlaceholder:"请选择{label}",paramTextPlaceholder:"请输入{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:"内容搜索",closeSearch:"关闭搜索",prevSearchMatch:"上一个匹配",nextSearchMatch:"下一个匹配",zoom:"缩放工具",settingsLocal:"按需启用工具,仅作用于当前预览。",editingLocal:"修改为本地草稿;不会自动写入业务数据库。",editingSaved:"修改将通过接入方配置的保存回调提交。",importLocal:"导入仅生成本地预览,不自动替换业务数据。",emptyDescription:"当前查询没有明细,请调整查询条件后重试。",undo:"撤销",redo:"重做",restoreChanges:"恢复来源值",changes:"修改明细",changesCount:"{count} 处修改",changesEmpty:"尚无修改",changesBefore:"来源值",changesAfter:"当前值",editAtomicRequired:"批量保存需要接入方提供原子 saveBatch 回调;本次未写入任何单元格。",clipboardLimit:"单次最多粘贴 10000 个单元格,请分批处理。",preferencesError:"偏好存储不可用,设置仍在当前预览中生效。",freezeHeaders:"冻结表头",frozenColumns:"冻结前列",sections:"工作表与章节",locateField:"定位字段",locateFieldPlaceholder:"输入字段标识,Enter 定位",locateFieldMissing:"未找到该字段,请核对字段标识。",importSummary:"Excel 导入摘要",importPreserved:"已导入 {sheets} 个工作表,保留内容、合并和样式。",importWarnings:"兼容性提示",importReadOnly:"公式、日期及受保护单元格保持只读;公式不重算。",conflicts:"保存冲突",editReadOnly:"选区包含只读或无权限单元格,本次修改未应用。",editMissing:"选区超出报表范围或缺少业务来源,请重新选择。",editDuplicate:"选区包含同一业务字段的重复单元格,请缩小选区。",clipboardInvalid:"剪贴板内容无法识别,请使用矩形表格文本重新粘贴。",editSaved:"修改已通过保存回调确认",settingsPanes:"冻结窗格"},on={shellBg:"#525659",shellFg:"#e8e8e8",toolbarBg:"#323639",toolbarBorder:"#22252a",toolbarFg:"#e8e8e8",btnFg:"#cfcfcf",btnBorder:"#4a4d52",btnHoverBg:"#414549",btnHoverFg:"#ffffff",btnActiveBg:"#2d5fb8"};function rn(t={}){return{...t,defaults:t.defaults??{},presets:t.presets??{}}}function zr(t){return t}const ce={showExport:!0,showPrint:!0,showPdfWindow:!0,showSettings:!0,showParams:!0,gapPx:18,pdfFontUrl:"/simhei.ttf",logger:console},Or={warn:()=>{},info:()=>{}};function Oe(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},interaction:{...t?.interaction,...n?.interaction}}}function Ar(t){return{showExport:t.showExport??ce.showExport,showPrint:t.showPrint??ce.showPrint,showPdfWindow:t.showPdfWindow??ce.showPdfWindow,showSettings:t.showSettings??ce.showSettings,showParams:t.showParams??ce.showParams,gapPx:t.gapPx??ce.gapPx}}function an(t,n){const r=n?t?.presets?.[n]:t?.defaultPreset?t?.presets?.[t.defaultPreset]:void 0,o=Oe(t?.defaults,r);return{...Ar(o),pdfFontUrl:o.pdfFontUrl??ce.pdfFontUrl,theme:{...on,...o.theme},messages:{...nn,...o.messages},logger:o.logger??ce.logger,preview:{overscanPages:Lt(o.preview?.overscanPages,1,10,!0),searchDebounceMs:Lt(o.preview?.searchDebounceMs,200,2e3)},xlsx:{...o.xlsx},editable:o.editable??!1,excelImport:o.excelImport??!1,toolbar:{...o.toolbar},interaction:{...o.interaction},preferences:o.preferences,assets:o.assets}}function Lt(t,n,r,o=!1){if(t==null||!Number.isFinite(t))return n;const a=Math.max(0,Math.min(r,t));return o?Math.floor(a):a}function ln(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 Lr(t){const n=e.inject(ve.MACH_REPORT_CONFIG_KEY,null),r=e.computed(()=>{const o=n?.value??null,a="defaults"in t||"presets"in t||"defaultPreset"in t?rn(t):{defaults:t,presets:{}};if(!o)return a;const s={...o.presets,...a.presets};for(const i of Object.keys(s))s[i]=Oe(Oe(o.presets[i],a.defaults),a.presets[i]);return{defaults:Oe(o.defaults,a.defaults),presets:s,defaultPreset:a.defaultPreset??o.defaultPreset}});e.provide(ve.MACH_REPORT_CONFIG_KEY,r)}function sn(){return e.inject(ve.MACH_REPORT_CONFIG_KEY,e.computed(()=>null))}const qt=new Map,ge=new Map,qr=15e3;function ft(t,n){return Object.assign(new Error(t),{cause:n})}function Se(t,n){return`PDF 字体 ${JSON.stringify(t)}:${n}。请部署支持报表文字的字体文件,并将 pdfFontUrl 配置为可访问的字体 URL;西文报表可设为空串`}function We(t){if(t?.reason instanceof Error&&t.reason.name==="AbortError")return t.reason;const n=ft("PDF 字体检查已取消",t?.reason);return n.name="AbortError",n}async function Wr(t,n){let r=!1;const o=setTimeout(()=>{r=!0,n.abort()},qr);try{const a=await fetch(t,{method:"HEAD",signal:n.signal});if(n.signal.aborted)throw We(n.signal);if(a.status===405||a.status===501||a.type==="opaque")return{status:"unverified",fontUrl:t,message:`PDF 字体 ${JSON.stringify(t)} 无法通过 HEAD 检查验证;仍可尝试导出,届时会加载并校验字体`};if(!a.ok){const i=new Error(`字体请求返回 HTTP ${a.status}`);return{status:"error",fontUrl:t,message:Se(t,i.message),cause:i}}const s=a.headers.get("content-type")??"";if(/text\/html|application\/xhtml\+xml/i.test(s)){const i=new Error("字体 URL 返回 HTML 页面(可能是 SPA 路由回退),不是字体文件");return{status:"error",fontUrl:t,message:Se(t,i.message),cause:i}}if(/^text\//i.test(s)||/(?:\/|\+)json(?:\s*;|$)/i.test(s)){const i=new Error(`字体 URL 返回 ${s} 文本响应,不是字体文件`);return{status:"error",fontUrl:t,message:Se(t,i.message),cause:i}}return{status:"available",fontUrl:t,message:"PDF 字体资源可达;文字覆盖范围将在实际导出时校验"}}catch(a){if(n.signal.aborted&&!r)throw We(n.signal);return{status:"error",fontUrl:t,message:Se(t,r?"字体检查超时,请检查网络或字体服务":"字体检查失败,请检查网络、字体服务或跨域访问配置"),cause:a}}finally{clearTimeout(o)}}function Hr(t,n){if(n?.aborted)return Promise.reject(We(n));if(!t)return Promise.resolve({status:"disabled",fontUrl:t,message:"已停用自定义 PDF 字体;内置字体用于西文,其他文字会在导出时校验"});const r=qt.get(t);if(r)return Promise.resolve(r);let o=ge.get(t);if(!o){const s=new AbortController;o={controller:s,promise:Wr(t,s),subscribers:0};const i=o;ge.set(t,i),i.promise=i.promise.then(f=>(!s.signal.aborted&&f.status==="available"&&qt.set(t,f),f)).finally(()=>{ge.get(t)===i&&ge.delete(t)})}const a=o;return a.subscribers++,new Promise((s,i)=>{let f=!1;const C=()=>f?!1:(f=!0,a.subscribers--,n?.removeEventListener("abort",h),!0),h=()=>{C()&&(a.subscribers===0&&(ge.get(t)===a&&ge.delete(t),a.controller.abort()),i(We(n)))};n?.addEventListener("abort",h,{once:!0}),a.promise.then(l=>{C()&&s(l)},l=>{C()&&i(l)}),n?.aborted&&h()})}function cn(t={fontUrl:"/simhei.ttf"}){let n=null;const r=async(o,a)=>{n||(n=await import("@agile-team/mach-report/pdf"));let s=null;if(t.fontUrl)try{if(s=await n.loadFontWithCache(t.fontUrl,{strict:!0}),!s?.byteLength)throw new Error("字体文件为空或加载失败")}catch(u){const m=u instanceof Error?u.message:String(u);throw ft(Se(t.fontUrl,m),u)}let i;try{i=await n.renderPlanToPdf(o,s?{customFontBytes:s}:{})}catch(u){if(!s)throw u;const m=u instanceof Error?u.message:String(u);throw ft(`PDF 生成失败:${m}。当前字体 URL 为 ${JSON.stringify(t.fontUrl)};请确认该文件是有效字体,或重新配置 pdfFontUrl`,u)}const{bytes:f,unsupportedTextCount:C,pageErrors:h,fidelityWarnings:l}=i;if(C>0)throw new Error(`PDF 中有 ${C} 行文字无法编码;请部署支持所用文字的字体并配置 pdfFontUrl`);if(h.length>0)throw new Error(`PDF 有 ${h.length} 页渲染失败:${h[0]}`);return l.length>0&&a?.(`PDF 有 ${l.length} 处版式降级:${l.slice(0,2).join(";")}`),f};return r.checkFont=o=>Hr(t.fontUrl,o),r}function re(t){return JSON.parse(JSON.stringify(t))}class jr extends Error{constructor(n){super(n.map(r=>r.message).join(";")),this.conflicts=n,this.name="ReportEditConflictError"}}function Kr(){return globalThis.crypto?.randomUUID?.()??`mr-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}function Ur(t){const n=e.shallowRef([]),r=e.shallowRef([]),o=e.shallowRef([]),a=e.shallowRef([]),s=e.shallowRef(!1),i=e.computed(()=>W.summarizeReportCellEdits(n.value)),f=e.computed(()=>!!t.options.value&&!s.value&&!t.blocked()&&r.value.length>0),C=e.computed(()=>!!t.options.value&&!s.value&&!t.blocked()&&o.value.length>0);let h=null,l=null,u=0,m=null;function p(){h?.abort(),h=null,s.value=!1,l=null}function E(){u++,p(),m=null,n.value=[],r.value=[],o.value=[],a.value=[]}function v(){const B=t.options.value;return B?typeof B=="object"?B:{}:null}function k(B,$,I){if(!t.options.value||t.blocked())throw new W.ReportCellEditError("readonly");const L=W.createReportCellResolver(B);for(const H of $.edits){const K=L(H.address);if(!K?.editable||I.canEdit?.(K)===!1)throw new W.ReportCellEditError("readonly");if(I.requireSource&&!K.source)throw new W.ReportCellEditError("missing")}}async function A(B,$,I){if($.saveBatch)return $.saveBatch(re(B),I);if($.save&&B.edits.length>1)throw new W.ReportCellEditError("atomic");if(B.edits[0])return $.save?.(re(B.edits[0]),I)}async function R(B,$,I){for(const L of B.edits){const H=await $.validate?.(re(L),I);if(H)throw new Error(H);if(I.signal.aborted)return}}function d(B,$,I,L){t.plan.value=W.applyReportEditResult(W.applyReportCellEditBatch(B,$),$,I),n.value=[...n.value,...$.edits],L==="edit"&&(r.value=[...r.value,$.edits],o.value=[]),a.value=[],m=null;const H=u;for(const K of $.edits){if(u!==H)break;t.onChange(re(K))}}async function g(B,$){const I=t.plan.value,L=v();if(!I||!L||t.blocked())return!1;const H=new AbortController,K=u;h=H,s.value=!0;const b=()=>h===H&&!H.signal.aborted&&t.plan.value===I&&t.options.value!==!1;try{const y=W.createReportCellEditBatch(I,B,Kr());if(y.edits=y.edits.filter(z=>!Object.is(z.previousValue,z.value)),!y.edits.length)return!0;const F=JSON.stringify([$,y.edits]);m?.plan===I&&m.signature===F?y.requestId=m.requestId:m={plan:I,signature:F,requestId:y.requestId},k(I,y,L);const T={signal:H.signal,requestId:y.requestId,action:$};if(await R(y,L,T),!b())return!1;k(I,y,L);const q=await A(y,L,T);if(!b())return!1;if(q?.conflicts?.length)throw a.value=re(q.conflicts),new jr(q.conflicts);return k(I,y,L),d(I,y,q,$),K===u}catch(y){return b()&&t.onError(t.errorMessage?.(y)??(y instanceof Error?y.message:"Cell edit failed"),y),!1}finally{h===H&&(h=null,s.value=!1)}}async function w(B,$="edit"){if(l)return l;const I=g(B,$);l=I;const L=await I;return l===I&&(l=null),L}async function P(){const B=u,$=r.value[r.value.length-1];return!$||s.value||!await w($.map(I=>({address:I.address,value:I.previousValue})),"undo")||B!==u?!1:(r.value=r.value.slice(0,-1),o.value=[...o.value,$],!0)}async function D(){const B=u,$=o.value[o.value.length-1];return!$||s.value||!await w($.map(I=>({address:I.address,value:I.value})),"redo")||B!==u?!1:(o.value=o.value.slice(0,-1),r.value=[...r.value,$],!0)}async function N(){const B=u;return!i.value.length||s.value||!await w(i.value.map($=>({address:$.address,value:$.previousValue})),"restore")||B!==u?!1:(r.value=[],o.value=[],!0)}return{changes:n,differences:i,conflicts:a,saving:s,canUndo:f,canRedo:C,apply:w,undo:P,redo:D,restore:N,cancel:p,reset:E}}function Ae(t){const n=t.closest(".mrp-page-holder"),r=t.closest("[data-mr-component-index]");if(!n||!r)return null;const o={pageIndex:Number(n.dataset.page)-1,componentIndex:Number(r.dataset.mrComponentIndex),rowIndex:Number(t.dataset.mrRowIndex),columnIndex:Number(t.dataset.mrColumnIndex)};return Object.values(o).every(a=>Number.isInteger(a)&&a>=0)?o:null}function Gr(t,n,r){const o=t.ownerDocument.createElement("textarea");return o.className="mrp-cell-editor",o.setAttribute("aria-label",n),o.value=r==null?"":String(r),o.style.cssText="position:absolute;inset:0;width:100%;height:100%;min-height:20px;box-sizing:border-box;z-index:10;resize:none;margin:0;padding:2px 4px;border:2px solid #2563eb;outline:none;background:#fff;color:#111;font:inherit;line-height:1.25;white-space:pre-wrap;",t.appendChild(o),o}function Jr(t){const n=e.shallowRef(null),r=Ur(t),{saving:o,changes:a}=r;let s=null;function i(){const E=n.value;n.value=null,r.cancel(),s=null,E?.input.remove()}function f(){i(),r.reset()}function C(E){return n.value===E&&t.plan.value===E.plan}async function h(E){return await r.apply([{address:E.address,value:E.input.value}])?(n.value=null,E.input.remove(),!0):(n.value===E&&(E.input.disabled=!1,E.input.setAttribute("aria-invalid","true"),E.input.focus()),!1)}async function l(){if(s)return s;const E=n.value;if(!E)return!0;if(!C(E))return i(),!1;E.input.disabled=!0;const v=h(E);s=v;const k=await v;return s===v&&(s=null),k}function u(E){if(E.stopPropagation(),!E.isComposing&&(E.key==="Escape"&&(E.preventDefault(),i()),E.key==="Enter"&&!E.shiftKey||E.key==="Tab")){E.preventDefault();const v=n.value?.address;l().then(k=>{k&&v&&t.onNavigate?.(v,E.key,E.shiftKey)})}}async function m(E){if(!t.options.value||t.blocked()||!await l()||!E.isConnected)return;const v=t.plan.value,k=Ae(E);if(!v||!k||!t.options.value||t.blocked())return;const A=typeof t.options.value=="object"?t.options.value:{};try{const R=W.getReportCellContext(v,k);if(!R?.editable||A.canEdit?.(R)===!1)return;const d=Gr(E,t.label(),R.value);n.value={plan:v,address:k,input:d},d.addEventListener("keydown",u),d.addEventListener("blur",()=>{o.value||l()}),d.focus(),d.select()}catch(R){t.onError(R instanceof Error?R.message:"无法编辑单元格",R)}}async function p(E){const v=E.target;if(!(v instanceof Element)||v.closest(".mrp-cell-editor"))return;const k=v.closest("td[data-mr-row-index]");k&&await m(k)}return e.watch(t.options,(E,v)=>{(!E||E!==v)&&i()},{flush:"sync"}),e.watch(t.plan,()=>{n.value&&t.plan.value!==n.value.plan&&(n.value.input.remove(),n.value=null)},{flush:"sync"}),e.onScopeDispose(f),{...r,active:n,saving:o,changes:a,cancel:i,reset:f,commit:l,onDoubleClick:p,editCell:m,getChanges:()=>re(a.value)}}const He=["html","pdf","xlsx","png","word"],mt=["search","thumbnails","zoom",...He,"print","pdfWindow","editing","import"];function Zr(t){return{load:n=>JSON.parse(t.getItem(n)??"null"),save:(n,r)=>t.setItem(n,JSON.stringify(r)),remove:n=>t.removeItem(n)}}function Yr(t,n,r,o){const a=e.ref({});let s=0,i=0,f=Promise.resolve();const C=e.computed(()=>Object.fromEntries(mt.map(m=>[m,t.value[m]&&(a.value[m]??n.value[m]??!0)])));function h(m,p){t.value[m]&&(i++,a.value={...a.value,[m]:p},l())}function l(){const m=r?.value;if(!m)return;const p={...a.value};f=f.then(()=>m.adapter.save(m.key,p)).catch(E=>{o?.(E)})}function u(){i++,a.value={},l()}return r&&e.watch(r,async m=>{const p=++s,E=i;if(a.value={},!!m)try{const v=await m.adapter.load(m.key);if(p!==s||E!==i||!v||typeof v!="object")return;a.value=Object.fromEntries(mt.flatMap(k=>typeof v[k]=="boolean"?[[k,v[k]]]:[]))}catch(v){p===s&&o?.(v)}},{immediate:!0}),e.onScopeDispose(()=>{s++}),{enabled:C,setEnabled:h,reset:u}}function un(t){return t.table.role==="header"?-Math.max(1,t.grid?.cells.length??1):t.table.rowIndex}function ae(t,n,r=n){const o=t.pages[n.pageIndex]?.components[n.componentIndex],a=o?.table,s=t.pages[r.pageIndex]?.components[r.componentIndex]?.table;return a&&s&&a.id===s.id?{grid:a.id,row:un(o)+n.rowIndex,column:s.columnKeys.indexOf(a.columnKeys[n.columnIndex]??"")}:{grid:`${n.pageIndex}:${n.componentIndex}`,row:n.rowIndex,column:n.columnIndex}}function Wt(t,n){const r=t.pages[n.pageIndex]?.components[n.componentIndex]?.table;if(!r)return(a,s)=>({...n,rowIndex:a,columnIndex:s});const o=new Map;return t.pages.forEach((a,s)=>a.components.forEach((i,f)=>{i.table?.id!==r.id||!i.grid||i.grid.cells.forEach((C,h)=>{const l=un(i)+h;o.set(l,[...o.get(l)??[],{address:{pageIndex:s,componentIndex:f,rowIndex:h,columnIndex:0},keys:i.table.columnKeys}])})})),(a,s)=>{const i=r.columnKeys[s];if(i===void 0)return null;const f=o.get(a)?.find(C=>C.keys.includes(i));return f?{...f.address,columnIndex:f.keys.indexOf(i)}:null}}function Xr(t,n){return t.pageIndex===n.pageIndex&&t.componentIndex===n.componentIndex}function it(t,n){return Xr(t,n)&&t.rowIndex===n.rowIndex&&t.columnIndex===n.columnIndex}function ct(t){return`[data-page="${t.pageIndex+1}"] [data-mr-component-index="${t.componentIndex}"] td[data-mr-row-index="${t.rowIndex}"][data-mr-column-index="${t.columnIndex}"]`}function Qr(t,n,r){const{anchor:o,focus:a}=r,s=ae(t,o),i=ae(t,a,o),f=ae(t,n,o);return f.grid===s.grid&&f.row>=Math.min(s.row,i.row)&&f.row<=Math.max(s.row,i.row)&&f.column>=Math.min(s.column,i.column)&&f.column<=Math.max(s.column,i.column)}function _r(t){const n=e.shallowRef(null);function r(){const d=n.value,g=t.plan.value,w=new Set(t.differences().map(P=>JSON.stringify(P.address)));t.root.value?.querySelectorAll("td[data-mr-row-index]").forEach(P=>{const D=Ae(P);if(!D)return;const N=!!d&&!!t.plan.value&&Qr(t.plan.value,D,d);P.closest("table")?.setAttribute("role","grid");const B=g?.pages[D.pageIndex]?.components[D.componentIndex]?.table;P.setAttribute("role",B?.role==="header"?"columnheader":"gridcell"),P.classList.toggle("mrp-cell-selected",N),P.classList.toggle("mrp-cell-focus",!!d&&it(D,d.focus)),P.classList.toggle("mrp-cell-modified",w.has(JSON.stringify(D))),P.setAttribute("aria-selected",String(N)),P.tabIndex=d&&it(D,d.focus)?0:-1})}async function o(d,g=!1){if(!t.plan.value||!W.getReportCellContext(t.plan.value,d))return!1;const w=n.value,P=g&&w&&ae(t.plan.value,w.anchor).grid===ae(t.plan.value,d,w.anchor).grid;n.value={anchor:P?w.anchor:{...d},focus:{...d}},t.root.value?.querySelector(ct(d))||t.gotoPage(d.pageIndex+1),await e.nextTick(),r();const D=t.root.value?.querySelector(ct(d));return D?.focus({preventScroll:!0}),D?.scrollIntoView?.({block:"nearest",inline:"nearest"}),!!D}function a(d){const g=d.target;if(!(g instanceof Element)||g.closest("textarea,input,button,select"))return;const w=g.closest("td[data-mr-row-index]"),P=w&&Ae(w);if(!P||t.busy()||!t.plan.value||!W.getReportCellContext(t.plan.value,P))return;const D=n.value,N=d.shiftKey&&D&&ae(t.plan.value,D.anchor).grid===ae(t.plan.value,P,D.anchor).grid;n.value={anchor:N?D.anchor:{...P},focus:{...P}},r(),w.focus({preventScroll:!0})}function s(d){const g=t.plan.value?.pages[d.pageIndex]?.components[d.componentIndex];return g?.grid?Hn.resolveGridLayout(g.grid,g.widthMm,g.heightMm).cells.map(w=>({...d,rowIndex:w.ri,columnIndex:w.ci})):[]}function i(d,g,w){const P=s(d),D=w?-1:1;if(g==="Tab")return P[P.findIndex($=>it($,d))+D];const N=g==="ArrowUp"||g==="ArrowDown"||g==="Enter",B=g==="ArrowUp"||g==="ArrowLeft"?-1:D;return P.filter($=>N?$.columnIndex===d.columnIndex&&($.rowIndex-d.rowIndex)*B>0:$.rowIndex===d.rowIndex&&($.columnIndex-d.columnIndex)*B>0).sort(($,I)=>N?($.rowIndex-I.rowIndex)*B:($.columnIndex-I.columnIndex)*B)[0]}function f(d,g,w){if(g==="ArrowLeft"||g==="ArrowRight")return;const P=t.plan.value;if(!P.pages[d.pageIndex]?.components[d.componentIndex]?.table)return;const N=g==="ArrowUp"||w?-1:1;for(let B=d.pageIndex;B>=0&&B<P.pages.length;B+=N){const $=P.pages[B].components,I=B===d.pageIndex?d.componentIndex+N:N===1?0:$.length-1;for(let L=I;L>=0&&L<$.length;L+=N){const H=C(d,{...d,pageIndex:B,componentIndex:L},g,N);if(H)return H}}}function C(d,g,w,P){const D=t.plan.value,N=D.pages[d.pageIndex].components[d.componentIndex].table,B=D.pages[g.pageIndex].components[g.componentIndex]?.table;if(B?.id!==N.id||B.role==="header"&&N.role!=="header"&&(P>0||N.rowIndex+d.rowIndex>0))return;const $=s(g),I=w==="Tab"?$:$.filter(L=>L.columnIndex===d.columnIndex);return P===1?I[0]:I[I.length-1]}function h(d,g,w=!1,P=!1,D=!1){const N=i(d,g,w)??f(d,g,w);return N?(o(N,P),!0):((g!=="Tab"||!D)&&o(d),!1)}function l(d){const g=n.value;if(t.busy()||d.target instanceof Element&&d.target.closest("textarea,input,select"))return!1;if(!g)return m(d);const w=d.key,P=d.ctrlKey||d.metaKey;if(P&&w.toLowerCase()==="z")return d.preventDefault(),d.shiftKey?t.redo():t.undo(),!0;if(P&&w.toLowerCase()==="y")return d.preventDefault(),t.redo(),!0;if(u(d,g.focus))return!0;if(!["ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Tab","Enter"].includes(w))return!1;const D=h(g.focus,w,w==="Tab"&&d.shiftKey,d.shiftKey&&w!=="Tab",!0);return w==="Tab"&&!D?!1:(d.preventDefault(),!0)}function u(d,g){if(!t.enabled()||!t.plan.value||d.key!=="F2"&&!(d.key==="Enter"&&W.getReportCellContext(t.plan.value,g)?.editable))return!1;const w=t.root.value?.querySelector(ct(g));return w&&(d.preventDefault(),t.edit(w)),!0}function m(d){if(!["ArrowDown","ArrowRight","ArrowUp","ArrowLeft","Enter"].includes(d.key))return!1;const g=t.root.value?.querySelector("td[data-mr-row-index]"),w=g&&Ae(g);return w?(d.preventDefault(),o(w),!0):!1}function p(){const d=n.value,g=t.plan.value;if(!d||!g)return"";const w=[],P=ae(g,d.anchor),D=ae(g,d.focus,d.anchor),N=Wt(g,d.anchor),B=W.createReportCellResolver(g),$=Math.min(P.column,D.column),I=Math.max(P.column,D.column);if((Math.abs(P.row-D.row)+1)*(I-$+1)>1e4)return t.error(new W.ReportCellEditError("limit")),"";for(let L=Math.min(P.row,D.row);L<=Math.max(P.row,D.row);L++){const H=[];for(let K=$;K<=I;K++){const b=N(L,K);H.push(b?B(b)?.cell.text??"":"")}w.push(H)}return W.formatReportClipboard(w)}function E(d){!n.value||d.target instanceof Element&&d.target.closest("textarea,input")||(d.clipboardData?.setData("text/plain",p()),d.preventDefault())}async function v(d){const g=n.value;if(!g||!t.enabled()||t.busy())return!1;try{let w;try{w=W.parseReportClipboard(d)}catch(I){throw new W.ReportCellEditError(I instanceof Error&&I.message.includes("limit")?"limit":"clipboard")}const P=t.plan.value,D=ae(P,g.anchor),N=ae(P,g.focus,g.anchor),B=Wt(P,g.anchor),$=w.flatMap((I,L)=>I.map((H,K)=>{const b=B(Math.min(D.row,N.row)+L,Math.min(D.column,N.column)+K);if(!b)throw new W.ReportCellEditError("missing");return{address:b,value:H}}));return await t.apply($)}catch(w){return t.error(w),!1}}function k(d){if(!n.value||!t.enabled()||d.target instanceof Element&&d.target.closest("textarea,input"))return;const g=d.clipboardData?.getData("text/plain");g!==void 0&&(d.preventDefault(),v(g))}async function A(d){const g=t.plan.value;if(!g)return!1;const w=W.createReportCellResolver(g);for(let P=0;P<g.pages.length;P++){const D=g.pages[P];for(let N=0;N<D.components.length;N++)for(const B of s({pageIndex:P,componentIndex:N,rowIndex:0,columnIndex:0})){const $=w(B),I=$?.source;if((I?.field??$?.table?.columnKey)===d.field&&!(d.datasetId!==void 0&&I?.datasetId!==d.datasetId)&&!(d.rowKey!==void 0&&I?.rowKey!==d.rowKey))return o(B)}}return!1}function R(){n.value=null,r()}return{selection:n,refresh:r,reset:R,focusCell:o,focusField:A,navigate:h,onClick:a,onKeydown:l,onCopy:E,onPaste:k,copySelection:p,pasteSelection:v}}function ea(t){let n=0,r=!1;function o(){const s=t.viewport.value,i=t.root.value,f=t.plan.value;if(!s||!i||!f)return;const C=t.options(),h=Math.max(0,Math.min(20,Math.floor(C.frozenColumns??0)));if(!C.freezeHeaders&&h===0&&!r)return;const l=t.zoom.value||1,u=s.getBoundingClientRect();i.querySelectorAll("[data-mr-component-index]").forEach(m=>{const p=m.closest("[data-page]"),E=Number(p?.dataset.page)-1,v=f.pages[E]?.components[Number(m.dataset.mrComponentIndex)];if(!v?.grid||!p)return;m.style.transform="",m.style.zIndex="";const k=m.getBoundingClientRect(),A=p.getBoundingClientRect().bottom,R=Math.max(0,(u.left-k.left)/l),d=C.freezeHeaders?Math.max(0,Math.min((u.top-k.top)/l,(A-k.bottom)/l)):0;R>0&&h>0&&(m.style.zIndex="1"),v.table?.role==="header"&&d>0&&(m.style.transform=`translateY(${d}px)`,m.style.zIndex="5"),m.querySelectorAll(".mrp-cell-frozen").forEach(w=>{w.style.transform="",w.style.zIndex="",w.classList.remove("mrp-cell-frozen")});const g=Array.from({length:h},(w,P)=>`td[data-mr-column-index="${P}"]`);!v.table&&C.freezeHeaders&&g.push('td[data-mr-row-index="0"]'),g.length&&m.querySelectorAll(g.join(",")).forEach(w=>{const P=Number(w.dataset.mrColumnIndex)<h,D=!v.table&&Number(w.dataset.mrRowIndex)===0&&!!C.freezeHeaders,N=P?R:0,B=D?d:0;w.style.transform=N||B?`translate(${N}px, ${B}px)`:"",w.classList.toggle("mrp-cell-frozen",!!(N||B)),w.style.zIndex=N||B?D?"7":"6":""})}),r=!!C.freezeHeaders||h>0}function a(){n||(n=requestAnimationFrame(()=>{n=0,o()}))}return e.onScopeDispose(()=>{n&&cancelAnimationFrame(n)}),{refresh:o,schedule:a}}async function Ht(t,n,r,o){if(!n?.assetRenderers||!Object.keys(n.assetRenderers).length)return t;try{return(await W.resolvePlanAssets(t,{...n,signal:r,format:"dom",onDiagnostic:s=>{r.aborted||(n.onDiagnostic?.(s),o(s.message))}})).plan}catch(a){throw r.aborted?a:new oe("render",a instanceof Error?a.message:"Report asset preparation failed",a)}}const ta={key:6,class:"mrp-edit-hint",role:"status"},na={key:8,class:"mrp-export-notice mrp-export-warning",role:"status"},oa={class:"mrp-main"},ra={key:0,class:"mrp-state"},aa={key:1,class:"mrp-state mrp-error"},la=["data-page"],sa=["aria-label","aria-current","onClick"],ia=["data-thumb"],ca={class:"mrp-thumb-no"},ua={class:"mrp-overlay"},da={key:9,class:"mrp-debug","aria-hidden":"true"},Fe=96/25.4,ut="mach-report:ui",dt="mach-report:ui:wide",fa=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},interaction:{type:Object,default:void 0},preferences:{type:Object,default:void 0},assets:{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:r}){e.useCssVars(c=>({v02f88d9f:$.value+"px"}));const o=t,a=r,s=e.shallowRef(null),i=e.ref(!1),f=e.ref(""),C=e.shallowRef(null),h=e.ref(null),l=e.ref(!1),u=e.shallowRef(Object.freeze({status:"unchecked",fontUrl:""})),m=e.ref(null),p=e.ref(1),E=e.ref(null),v=e.ref(null),k=e.ref(null),A=e.ref(!1),R=e.ref(!1),d=e.ref(!1),g=e.shallowRef(null),w=e.ref({}),P=e.ref(null),D=e.ref(null),N=ro(),B=e.computed(()=>!!s.value?.pages.length&&s.value.pages.every(c=>c.layout==="wide")),$=e.computed(()=>Math.max(0,yt.value));let I=ut;const L=e.inject(ve.MACH_REPORT_FETCHER_KEY,null),H=e.inject(ve.MACH_REPORT_PDF_EXPORTER_KEY,null),K=e.computed(()=>pt(o.reportId)),b=e.computed(()=>o.fetcher??L),y=e.computed(()=>s.value?.pages.length??0),F=e.computed(()=>Object.freeze({loading:i.value,hasPlan:y.value>0,pageCount:y.value,currentPage:p.value,exporting:h.value,printing:l.value,canExport:!i.value&&!R.value&&!V.saving.value&&y.value>0&&h.value===null,canPrint:!i.value&&!R.value&&!V.saving.value&&y.value>0&&!l.value,error:C.value,pdfFont:u.value,editing:V.active.value!==null,saving:V.saving.value,importing:R.value,dirty:V.differences.value.length>0,canUndo:V.canUndo.value,canRedo:V.canRedo.value,changeCount:V.differences.value.length,selection:U.selection.value?re(U.selection.value):null}));function T(c,x,S){C.value=Object.freeze({message:c,code:x,cause:S}),a("error",c,{code:x,cause:S})}const q=sn(),z=e.computed(()=>an(q.value,o.preset)),M=e.computed(()=>({...z.value.messages,...o.messages})),ee=e.computed(()=>o.showExport??z.value.showExport),fn=e.computed(()=>o.showPrint??z.value.showPrint),Be=e.computed(()=>o.showPdfWindow??z.value.showPdfWindow),je=e.computed(()=>o.showSettings??z.value.showSettings),de=e.computed(()=>({...z.value.toolbar,...o.toolbar})),$e=e.computed(()=>({...z.value.interaction,...o.interaction,...w.value})),mn=e.computed(()=>o.preferences??z.value.preferences),bt=e.computed(()=>o.assets??z.value.assets),yt=e.computed(()=>o.gapPx??(B.value?0:z.value.gapPx)),pn=e.computed(()=>o.showParams??z.value.showParams),he=e.computed(()=>o.editable??z.value.editable),wt=e.computed(()=>o.excelImport??z.value.excelImport),xt=e.computed(()=>({search:de.value.search!==!1,thumbnails:de.value.thumbnails!==!1,zoom:de.value.zoom!==!1,...Object.fromEntries(He.map(c=>[c,ee.value&&(de.value.exportFormats?.includes(c)??!0)])),print:fn.value,pdfWindow:Be.value,editing:!!he.value,import:!!wt.value})),Ke=Yr(xt,e.computed(()=>({editing:de.value.editing,import:de.value.excelImport})),mn,()=>a("warning",M.value.preferencesError??"Preferences storage unavailable")),Y=Ke.enabled,gn=e.computed(()=>He.filter(c=>Y.value[c])),Re=e.computed(()=>Y.value.editing?he.value:!1),Ie=e.computed(()=>Y.value.import?wt.value:!1),Et=e.computed(()=>typeof he.value=="object"&&(typeof he.value.save=="function"||typeof he.value.saveBatch=="function")),Ue=e.computed(()=>typeof o.emptyState=="object"?o.emptyState:{});async function vn(c,x){c==="editing"&&!x&&!await V.commit()||(Ke.setEnabled(c,x),a("preferences-change",Object.freeze({...Y.value})))}async function hn(){await V.commit()&&(Ke.reset(),w.value={},a("preferences-change",Object.freeze({...Y.value})))}async function bn(){if(d.value){d.value=!1;return}!await V.commit()||le||!je.value||(d.value=!0)}function kt(c){return c instanceof W.ReportCellEditError?{number:M.value.editInvalidNumber,boolean:M.value.editInvalidBoolean,conflict:M.value.editConflict,atomic:M.value.editAtomicRequired,limit:M.value.clipboardLimit,readonly:M.value.editReadOnly,missing:M.value.editMissing,duplicate:M.value.editDuplicate,clipboard:M.value.clipboardInvalid}[c.code]??c.message:c instanceof Error?c.message:"单元格保存失败"}const V=Jr({plan:s,options:Re,blocked:()=>i.value||R.value||h.value!==null||l.value,label:()=>M.value.editCell??"编辑单元格",errorMessage:kt,onChange:c=>{C.value=null,m.value=null,a("cell-edit",c)},onError:(c,x)=>{m.value={kind:"error",message:c},T(c,"edit",x)},onNavigate:(c,x,S)=>U.navigate(c,x,S)}),U=_r({plan:s,root:E,enabled:()=>!!Re.value,busy:()=>i.value||R.value||V.saving.value||!!h.value||l.value,differences:()=>V.differences.value,gotoPage:se,edit:V.editCell,apply:V.apply,undo:V.undo,redo:V.redo,error:c=>{const x=kt(c);m.value={kind:"error",message:x},T(x,"edit",c)}}),yn=e.computed(()=>{if(g.value)return g.value.sheets.map(x=>({label:x.name,pageIndex:x.pageStart}));const c=new Set;return s.value?.pages.flatMap((x,S)=>x.components.flatMap(G=>{const O=G.table;return!O?.title||c.has(O.id)?[]:(c.add(O.id),[{label:O.title,pageIndex:S}])}))??[]});async function wn(c){c&&!await U.focusField({field:c})&&(m.value={kind:"warning",message:M.value.locateFieldMissing??"Field not found"})}let Ct=null,Ge=null;function Pt(){if(H)return H;const c=z.value.pdfFontUrl;return(!Ge||Ct!==c)&&(Ct=c,Ge=cn({fontUrl:c})),Ge}let De=0,be=null,Ne=null,le=!1;function Je(){De++,be?.abort(),be=null}async function Ze(){if(le)throw new oe("config","报表预览已卸载");Je();const c=De,x=new AbortController;be=x;const S=z.value.pdfFontUrl;u.value=Object.freeze({status:"checking",fontUrl:S});try{const G=Pt(),O=G.checkFont?await G.checkFont(x.signal):{status:"unverified",fontUrl:"",message:"自定义 PDF 导出器未提供字体预检查;字体由宿主确认"};return!le&&c===De&&!x.signal.aborted&&(u.value=Object.freeze({...O})),O}catch(G){if(x.signal.aborted)throw G;const O={status:"error",fontUrl:S,message:G instanceof Error?G.message:"PDF 字体检查失败",cause:G};return!le&&c===De&&(u.value=Object.freeze(O)),O}finally{be===x&&(be=null)}}function xn(){Ze().catch(()=>{})}e.watch([s,()=>z.value.pdfFontUrl,ee,Be],()=>{const c=u.value.fontUrl===z.value.pdfFontUrl;c&&u.value.status==="available"||(Je(),(!c||u.value.status==="checking")&&(u.value=Object.freeze({status:"unchecked",fontUrl:z.value.pdfFontUrl})),!le&&y.value>0&&(ee.value||Be.value)&&Ze().catch(()=>{}))},{immediate:!0});const Ye=e.computed(()=>{try{return{defs:o.paramDefs??b.value?.getParamDefs?.(K.value)??[],error:null}}catch(c){return{defs:[],error:new oe("config",c instanceof Error?c.message:"查询参数配置无效",c)}}}),Xe=e.computed(()=>Ye.value.defs),ye=Xo({defs:Xe,reportIds:K,params:()=>o.params,messages:()=>M.value}),{values:we,attempted:Me,pendingRequired:St}=ye,Bt=e.ref(null);function En(){Me.value=!0,ye.validation.value.ok||e.nextTick(()=>Bt.value?.focusInvalid()),me()}function kn(){ye.reset(),f.value="",C.value=null}const Cn=e.computed(()=>({height:o.height,...ln(z.value.theme)})),{zoom:te,zoomMode:xe,applyFitZoom:$t,setZoom:Ee}=Gt(()=>({viewport:v.value,pageWidthPx:Qe.contentSize.value.w||210*Fe})),Qe=Ut(s,te,{pxPerMm:Fe,gapPx:yt,overscan:e.computed(()=>z.value.preview.overscanPages)}),{contentSize:_e,windowRange:ke,visiblePages:et,makeScrollHandler:Pn,refreshViewport:tt}=Qe,Sn=Pn(p,y),nt=ea({root:E,viewport:v,plan:s,zoom:te,options:()=>$e.value});e.watch([$e,te],()=>nt.schedule(),{flush:"post"});function ot(c){Ee(c*100)}function fe(){R.value=!1,V.reset(),U.reset(),g.value=null,Rt(),s.value=null,p.value=1,j.reset()}let J=0,ne=null;function Bn(){if(Ye.value.error){const x=Ye.value.error;return fe(),f.value=x.message,T(x.message,x.code,x.cause),null}const c=ye.query();return c.params?c.params:(fe(),f.value=c.quiet?"":c.error.message,c.quiet||(Me.value=!0,T(c.error.message,c.error.code,c.error.cause)),null)}async function me(){if(le)return;const c=++J;R.value=!1,ne?.abort(),ne=null;const x=b.value;if(i.value=!1,C.value=null,K.value.length===0){f.value="缺少报表 ID",fe(),T(f.value,"param");return}if(!x){f.value="未提供渲染数据源 fetcher",fe(),T(f.value,"config");return}const S=Bn();if(!S)return;i.value=!0,f.value="",m.value=null,fe();const G=N.start(),O=new AbortController;ne=O;const X=new Set;function _(Z){c!==J||O.signal.aborted||X.has(Z)||(X.add(Z),z.value.logger.warn("[mach-report] 报表告警:",Z),a("warning",Z))}try{let Z=await x({reportIds:K.value,params:S,signal:O.signal,onWarning:_});if(c!==J)return;const Q=W.validateRenderPlan(Z);if(!Q.ok){const Ve=Q.errors.slice(0,3).map(zt=>`${zt.path}: ${zt.message}`).join("; ");throw new oe("validate",`渲染计划校验失败(${Q.errors.length} 处): ${Ve}`)}if(Q.warnings.forEach(Ve=>_(`${Ve.path}: ${Ve.message}`)),c!==J||O.signal.aborted||(Z=await Ht(Z,bt.value,O.signal,_),c!==J||O.signal.aborted))return;s.value=Z,p.value=1,N.end(G),v.value&&(v.value.scrollTop=0,v.value.scrollLeft=0);const Pe=B.value?dt:ut;Pe!==I&&(I=Pe,lt()),xe.value==="fit"&&$t(),a("loaded",Z.pages.length)}catch(Z){if(c!==J)return;const Q=_t(Z);f.value=Q.message;const Pe=Qt(Q);T(Q.message,Pe.code,Pe.cause)}finally{c===J&&(i.value=!1),ne===O&&(ne=null)}}function se(c){if(le||y.value<=0)return;const x=Math.max(1,Math.min(y.value,c));p.value=x;const S=v.value;S&&(S.scrollTop=Qe.pageOffsetPx(x-1)*te.value,tt(S))}const Ce=Zt(s,{getPdfExporter:Pt,getXlsxOptions:()=>z.value.xlsx,onError:(c,x)=>{m.value={kind:"error",message:c},T(c,x??"print")},onWarning:c=>{m.value={kind:"warning",message:c},a("warning",c)},onBusy:c=>{h.value=c,c?m.value={kind:"progress",message:M.value.exporting.replace("{format}",c)}:m.value?.kind==="progress"&&(m.value=null)},onPrinting:c=>{l.value=c}}),{releasePrintFrame:Rt,dispose:$n}=Ce;async function It(){i.value||R.value||V.active.value&&!await V.commit()||(C.value=null,await Ce.print())}async function Dt(c){i.value||R.value||V.active.value&&!await V.commit()||(C.value=null,await Ce.exportAs(c))}function Nt(){if(i.value||R.value||V.active.value){m.value={kind:"warning",message:M.value.editingHint??"请先确认单元格修改"};return}C.value=null,Ce.openPdfWindow()}async function Rn(c,x={}){le||(we.value={...we.value,...c},x.reload!==!1&&(Me.value=!0,await me()))}const Mt={reload:me,print:It,exportAs:Dt,openPdfWindow:Nt,gotoPage:se,setParams:Rn,checkPdfFont:Ze,importExcel:Vt,getPlan:In,getChanges:V.getChanges,undo:V.undo,redo:V.redo,restoreChanges:V.restore,getDifferences:()=>re(V.differences.value),getSelection:()=>U.selection.value?re(U.selection.value):null,focusCell:U.focusCell,focusField:U.focusField,copySelection:U.copySelection,pasteSelection:U.pasteSelection,get state(){return F.value}};e.provide(ve.MACH_REPORT_CONTROLLER_KEY,Mt);function In(){return s.value?re(s.value):null}function Dn(c){const x=typeof Ie.value=="object"?Ie.value:{};return{...x,...c,limits:{...x.limits,...c?.limits}}}async function Vt(c,x){if(le)throw new oe("config","报表预览已卸载");const S=++J;ne?.abort(),ne=null,i.value=!1,V.cancel(),Ce.invalidatePending(),R.value=!0;const G=new AbortController;ne=G,C.value=null,m.value={kind:"progress",message:M.value.importing??"正在导入 Excel…"};try{const{importExcelTemplate:O}=await import("@agile-team/mach-report/xlsx");if(S!==J)return null;const X=await O(c,Dn(x));if(S!==J)return null;let _=W.paginateTemplate(re(X.template),{}).plan;const Z=W.validateRenderPlan(_);if(!Z.ok)throw new Error(Z.errors.map(Q=>Q.message).slice(0,3).join("; "));_=await Ht(_,bt.value,G.signal,Q=>{S===J&&a("warning",Q)});for(const Q of X.warnings){if(S!==J)return null;a("warning",Q)}return S!==J?null:(V.reset(),U.reset(),Rt(),j.reset(),s.value=_,g.value={sheets:re(X.sheets),warnings:[...X.warnings]},p.value=1,f.value="",m.value=X.warnings.length?{kind:"warning",message:X.warnings.join(";")}:null,v.value&&(v.value.scrollTop=0,v.value.scrollLeft=0),I=B.value?dt:ut,lt(),a("template-import",X),S===J&&a("loaded",_.pages.length),X)}catch(O){if(S!==J)return null;const X=new oe("import",O instanceof Error?O.message:"Excel 模板导入失败",O);throw m.value={kind:"error",message:X.message},T(X.message,"import",O),X}finally{S===J&&(R.value=!1),ne===G&&(ne=null)}}function Nn(c){const x=c.target,S=x.files?.[0];x.value="",S&&Vt(S).catch(()=>{})}const j=to({plan:s,gotoPage:se,debounceMs:e.computed(()=>z.value.preview.searchDebounceMs),highlight:Jn,clearHighlights:Gn});e.watch(()=>Y.value.search,c=>{c||(j.reset(),j.visible.value=!1)});function Mn(c){!c.ctrlKey||!Y.value.zoom||(c.preventDefault(),ot(te.value*(c.deltaY<0?1.1:1/1.1)))}function Vn(c){if(!U.onKeydown(c)&&!(c.target instanceof Element&&c.target.closest("input,textarea,select,[contenteditable='true']"))){if(Y.value.search&&(c.ctrlKey||c.metaKey)&&c.key.toLowerCase()==="f"){c.preventDefault(),j.visible.value||j.toggle(),e.nextTick(()=>D.value?.focusSearch());return}switch(c.key){case"PageDown":c.preventDefault(),se(p.value+1);break;case"PageUp":c.preventDefault(),se(p.value-1);break;case"Home":c.preventDefault(),se(1);break;case"End":c.preventDefault(),se(y.value);break;case"+":case"=":c.preventDefault(),Y.value.zoom&&ot(te.value*1.1);break;case"-":c.preventDefault(),Y.value.zoom&&ot(te.value/1.1);break}}}function Fn(){try{localStorage.setItem(I,JSON.stringify({zoomMode:xe.value==="fit"?"fit":Math.round(te.value*100)}))}catch{}}e.watch([xe,te],Fn);let rt="";const Ft=new WeakMap;function Tt(c=!1){const x=j.activeMatch.value;if(!B.value||!x)return;const S=`${j.query.value}:${j.matchIndex.value}:${x.pageIndex}`;if(!c&&S===rt)return;const O=E.value?.querySelector(`[data-page="${x.pageIndex+1}"]`)?.querySelectorAll("mark.mrp-hit")[x.occurrence];O&&(O.scrollIntoView?.({block:"nearest",inline:"nearest"}),rt=S)}e.watch([s,()=>j.activeMatch.value,()=>j.matchIndex.value,()=>j.query.value,et,E],()=>{const c=s.value;if(!c)return;const x=j.activeMatch.value;j.matchIndex.value,x||(rt=""),et.value;const S=E.value;if(!S)return;S.querySelectorAll(".mrp-page-holder").forEach(O=>{const X=Number(O.dataset.page??0)-1,_=c.pages[X];if(!_||O.childElementCount>0&&Ft.get(O)===_){if(O.firstElementChild){const Q=O.firstElementChild;j.clear(Q),j.apply(Q)}return}O.style.width=`${_.pageWidthMm*Fe}px`;const Z=W.renderPage(_,96,{},document);j.apply(Z),O.replaceChildren(Z),Ft.set(O,_)}),Tt(),U.refresh(),nt.refresh()},{flush:"post",immediate:!0}),e.watch(()=>U.selection.value,()=>{U.refresh()},{flush:"post"}),e.watch(()=>j.query.value,c=>{c||E.value?.querySelectorAll(".mrp-page-holder").forEach(x=>{j.clear(x)})});const ie=oo(s,{thumbsRoot:k,visible:A,renderThumbCanvas:c=>{try{const x=s.value.pages[c],S=Math.min(.2,116/Math.max(1,x.pageWidthMm*Fe)),{canvases:G}=W.renderPlanToCanvas(s.value,{start:c,end:c,dpr:S});return G[0]??null}catch{return null}}});e.watchEffect(()=>{ie.schedule()},{flush:"post"});const Tn=e.computed(()=>o.debug),{debugStats:pe}=no(Tn,{plan:s,pageCount:y,windowRange:ke,zoom:te,loadMs:N.loadMs});function at(){tt(v.value),ie.schedule(),xe.value==="fit"&&$t(),Tt(!0)}function lt(){Ee(I===dt?100:"fit");try{const c=JSON.parse(localStorage.getItem(I)??"{}");c.zoomMode==="fit"?Ee("fit"):typeof c.zoomMode=="number"&&Ee(c.zoomMode)}catch{}}return e.onMounted(()=>{window.addEventListener("resize",at),typeof ResizeObserver<"u"&&v.value&&(Ne=new ResizeObserver(at),Ne.observe(v.value)),tt(v.value),lt(),o.autoLoad&&me()}),e.onUnmounted(()=>{le=!0,V.reset(),R.value=!1,Je(),J++,ne?.abort(),ne=null,window.removeEventListener("resize",at),Ne?.disconnect(),Ne=null,ie.destroy(),j.reset(),$n()}),e.watch(()=>[JSON.stringify(K.value),JSON.stringify(o.params),b.value],()=>{if(o.autoLoad){me();return}J++,ne?.abort(),ne=null,i.value=!1,f.value="",C.value=null,m.value=null,fe()}),n({...Mt,state:F}),(c,x)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["mach-report-preview",{"mrp-wide-report":B.value}]),style:e.normalizeStyle(Cn.value)},[pn.value&&Xe.value.length>0?(e.openBlock(),e.createBlock(tn,{key:0,ref_key:"paramPanelRef",ref:Bt,defs:Xe.value,modelValue:e.unref(we),"onUpdate:modelValue":x[0]||(x[0]=S=>e.isRef(we)?we.value=S:null),messages:M.value,attempted:e.unref(Me),issues:e.unref(ye).validation.value.issues,onQuery:En,onReset:kn},null,8,["defs","modelValue","messages","attempted","issues"])):e.createCommentVNode("",!0),e.createVNode(Xt,{ref_key:"toolbarRef",ref:D,"page-count":y.value,"current-page":p.value,"zoom-mode":e.unref(xe),zoom:e.unref(te),"show-export":ee.value,"show-print":e.unref(Y).print,"show-pdf-window":e.unref(Y).pdfWindow,"show-search":e.unref(Y).search,"show-thumbnails":e.unref(Y).thumbnails,"show-zoom":e.unref(Y).zoom,"export-formats":gn.value,"show-settings":je.value,"settings-open":d.value,messages:M.value,search:{visible:e.unref(j).visible.value,query:e.unref(j).query.value,matchIndex:e.unref(j).matchIndex.value,matchCount:e.unref(j).matchCount.value,searching:e.unref(j).searching.value},"thumbs-visible":A.value,"show-import":!!Ie.value,busy:i.value||R.value||e.unref(V).saving.value,onGoto:se,onZoom:e.unref(Ee),onExport:x[1]||(x[1]=S=>Dt(S)),onPrint:It,onPdfWindow:Nt,onSearchInput:e.unref(j).onInput,onSearchNav:e.unref(j).onNav,onSearchToggle:e.unref(j).toggle,onThumbsToggle:x[2]||(x[2]=S=>A.value=!A.value),onImportExcel:x[3]||(x[3]=S=>P.value?.click()),onSettingsToggle:bn},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"]),d.value&&je.value?(e.openBlock(),e.createBlock(Ko,{key:1,available:xt.value,enabled:e.unref(Y),messages:M.value,"persisted-editing":Et.value,interaction:$e.value,busy:i.value||R.value||e.unref(V).saving.value||!!h.value||l.value,onInteraction:x[4]||(x[4]=S=>w.value={...w.value,...S}),onChange:vn,onReset:hn,onClose:x[5]||(x[5]=S=>d.value=!1)},{default:e.withCtx(()=>[e.renderSlot(c.$slots,"settings",{},void 0,!0)]),_:3},8,["available","enabled","messages","persisted-editing","interaction","busy"])):e.createCommentVNode("",!0),y.value>0&&$e.value.navigation!==!1?(e.openBlock(),e.createBlock(Dr,{key:2,sections:yn.value,"current-page":p.value,messages:M.value,busy:i.value||R.value||e.unref(V).saving.value,onGoto:se,onLocate:wn},null,8,["sections","current-page","messages","busy"])):e.createCommentVNode("",!0),g.value?(e.openBlock(),e.createBlock(Tr,{key:3,result:g.value,messages:M.value},null,8,["result","messages"])):e.createCommentVNode("",!0),Re.value&&y.value>0?(e.openBlock(),e.createBlock(Cr,{key:4,differences:e.unref(V).differences.value,conflicts:e.unref(V).conflicts.value,messages:M.value,saving:e.unref(V).saving.value,"can-undo":e.unref(V).canUndo.value,"can-redo":e.unref(V).canRedo.value,persisted:Et.value,busy:!!h.value||l.value,onUndo:e.unref(V).undo,onRedo:e.unref(V).redo,onRestore:e.unref(V).restore,onLocate:x[6]||(x[6]=S=>e.unref(U).focusCell(S.address))},null,8,["differences","conflicts","messages","saving","can-undo","can-redo","persisted","busy","onUndo","onRedo","onRestore"])):e.createCommentVNode("",!0),Ie.value?(e.openBlock(),e.createElementBlock("input",{key:5,ref_key:"importInputRef",ref:P,class:"mrp-import-input",type:"file",accept:".xlsx,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",hidden:"",onChange:Nn},null,544)):e.createCommentVNode("",!0),Re.value&&y.value>0?(e.openBlock(),e.createElementBlock("div",ta,e.toDisplayString(e.unref(V).saving.value?M.value.saving:M.value.editingHint),1)):e.createCommentVNode("",!0),m.value?(e.openBlock(),e.createElementBlock("div",{key:7,class:e.normalizeClass(["mrp-export-notice",`mrp-export-${m.value.kind}`]),role:"alert"},e.toDisplayString(m.value.message),3)):e.createCommentVNode("",!0),u.value.status==="error"&&(ee.value||Be.value)?(e.openBlock(),e.createElementBlock("div",na,[e.createTextVNode(e.toDisplayString(M.value.pdfFontUnavailable)+" ",1),e.createElementVNode("button",{type:"button",onClick:xn},e.toDisplayString(M.value.retry),1)])):e.createCommentVNode("",!0),e.createElementVNode("div",oa,[e.createElementVNode("div",{ref_key:"viewportRef",ref:v,class:"mrp-body",tabindex:"0",onWheel:Mn,onKeydown:Vn,onDblclick:x[7]||(x[7]=(...S)=>e.unref(V).onDoubleClick&&e.unref(V).onDoubleClick(...S)),onClick:x[8]||(x[8]=(...S)=>e.unref(U).onClick&&e.unref(U).onClick(...S)),onCopy:x[9]||(x[9]=(...S)=>e.unref(U).onCopy&&e.unref(U).onCopy(...S)),onPaste:x[10]||(x[10]=(...S)=>e.unref(U).onPaste&&e.unref(U).onPaste(...S)),onScrollPassive:x[11]||(x[11]=S=>{e.unref(Sn)(S.target),e.unref(nt).schedule()})},[i.value?(e.openBlock(),e.createElementBlock("div",ra,e.toDisplayString(M.value.loading),1)):f.value?(e.openBlock(),e.createElementBlock("div",aa,[e.createTextVNode(e.toDisplayString(f.value)+" ",1),e.createElementVNode("button",{class:"mrp-retry",type:"button",onClick:me},e.toDisplayString(M.value.retry),1)])):!s.value||y.value===0?(e.openBlock(),e.createBlock(At,{key:2,title:e.unref(St)?M.value.paramPrompt??M.value.paramsTitle:M.value.empty,description:e.unref(St)?M.value.paramPromptDescription:Ue.value.description??M.value.emptyDescription},null,8,["title","description"])):(e.openBlock(),e.createElementBlock("div",{key:3,class:"mrp-scale",style:e.normalizeStyle({width:`${e.unref(_e).w*e.unref(te)}px`,height:`${e.unref(_e).h*e.unref(te)}px`})},[e.createElementVNode("div",{ref_key:"containerRef",ref:E,class:"mrp-scale-inner",style:e.normalizeStyle({transform:`scale(${e.unref(te)})`,transformOrigin:"top left",width:`${e.unref(_e).w}px`})},[e.unref(ke).padTopPx>0?(e.openBlock(),e.createElementBlock("div",{key:0,class:"mrp-spacer-top",style:e.normalizeStyle({height:`${e.unref(ke).padTopPx}px`}),"aria-hidden":"true"},null,4)):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(et),S=>(e.openBlock(),e.createElementBlock("div",{key:S.index,class:"mrp-page-holder","data-page":S.index+1},null,8,la))),128)),e.unref(ke).padBottomPx>0?(e.openBlock(),e.createElementBlock("div",{key:1,class:"mrp-spacer-bottom",style:e.normalizeStyle({height:`${e.unref(ke).padBottomPx}px`}),"aria-hidden":"true"},null,4)):e.createCommentVNode("",!0)],4)],4)),!i.value&&!f.value&&s.value&&y.value>0&&t.emptyState?(e.openBlock(),e.createBlock(At,{key:4,title:Ue.value.title??M.value.empty,description:Ue.value.description??M.value.emptyDescription},null,8,["title","description"])):e.createCommentVNode("",!0)],544),e.unref(Y).thumbnails&&A.value&&y.value>0?(e.openBlock(),e.createElementBlock("aside",{key:0,ref_key:"thumbsRef",ref:k,class:"mrp-thumbs",onScrollPassive:x[12]||(x[12]=(...S)=>e.unref(ie).onScroll&&e.unref(ie).onScroll(...S))},[e.unref(ie).windowRange.value.padTopPx>0?(e.openBlock(),e.createElementBlock("div",{key:0,class:"mrp-thumb-spacer",style:e.normalizeStyle({height:`${e.unref(ie).windowRange.value.padTopPx}px`}),"aria-hidden":"true"},null,4)):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(ie).visibleThumbs.value,S=>(e.openBlock(),e.createElementBlock("button",{key:S.index,class:e.normalizeClass(["mrp-thumb",{"mrp-thumb-active":S.index+1===p.value}]),type:"button","aria-label":`${M.value.thumbnails} · ${M.value.pageInfo.replace("{cur}",String(S.index+1)).replace("{total}",String(y.value))}`,"aria-current":S.index+1===p.value?"page":void 0,style:e.normalizeStyle({height:`${S.height+20}px`}),onClick:G=>se(S.index+1)},[e.createElementVNode("span",{class:"mrp-thumb-box","data-thumb":S.index+1,style:e.normalizeStyle({height:`${S.height}px`})},null,12,ia),e.createElementVNode("span",ca,e.toDisplayString(S.index+1),1)],14,sa))),128)),e.unref(ie).windowRange.value.padBottomPx>0?(e.openBlock(),e.createElementBlock("div",{key:1,class:"mrp-thumb-spacer",style:e.normalizeStyle({height:`${e.unref(ie).windowRange.value.padBottomPx}px`}),"aria-hidden":"true"},null,4)):e.createCommentVNode("",!0)],544)):e.createCommentVNode("",!0)]),e.createElementVNode("div",ua,[e.renderSlot(c.$slots,"default",{},void 0,!0)]),e.unref(pe)?(e.openBlock(),e.createElementBlock("div",da,[x[13]||(x[13]=e.createElementVNode("div",null,"mach-report debug",-1)),e.createElementVNode("div",null,"pages: "+e.toDisplayString(e.unref(pe).pages)+" | window: ["+e.toDisplayString(e.unref(pe).window)+"]",1),e.createElementVNode("div",null,"zoom: "+e.toDisplayString(e.unref(pe).zoom)+" | load: "+e.toDisplayString(e.unref(pe).loadMs),1),e.createElementVNode("div",null,"plan: "+e.toDisplayString(e.unref(pe).planKB)+"KB",1)])):e.createCommentVNode("",!0)],6))}}),dn=ue._export_sfc(fa,[["__scopeId","data-v-dfdeb309"]]),ma=Object.freeze(Object.defineProperty({__proto__:null,default:dn},Symbol.toStringTag,{value:"Module"}));exports.DEFAULT_MESSAGES=nn;exports.DEFAULT_THEME=on;exports.MachReportError=oe;exports.PlanLoadError=Te;exports.REPORT_EXPORT_FORMATS=He;exports.REPORT_PREVIEW_TOOLS=mt;exports.ReportParamPanel=tn;exports.ReportPreview=dn;exports.ReportPreview$1=ma;exports.ReportToolbar=Xt;exports.SILENT_LOGGER=Or;exports.buildPrintDocument=ht;exports.buildWordHtml=Jt;exports.cloneReportSnapshot=re;exports.createDefaultPdfExporter=cn;exports.createFetchRequest=Kn;exports.createReportStoragePreferences=Zr;exports.defineMachReportConfig=rn;exports.defineMachReportPreset=zr;exports.joinReportIds=jn;exports.normalizeReportIds=pt;exports.normalizeReportLoadError=_t;exports.printPlans=Un;exports.provideMachReportConfig=Lr;exports.resolveConfig=an;exports.themeToCssVars=ln;exports.toErrorDetail=Qt;exports.useMachReportConfig=sn;exports.usePageWindow=Ut;exports.usePrintExport=Zt;exports.useZoom=Gt;
@@ -0,0 +1 @@
1
+ "use strict";const e=(t,o)=>{const c=t.__vccOpts||t;for(const[r,s]of o)c[r]=s;return c};exports._export_sfc=e;
@@ -0,0 +1,9 @@
1
+ const s = (t, r) => {
2
+ const o = t.__vccOpts || t;
3
+ for (const [c, e] of r)
4
+ o[c] = e;
5
+ return o;
6
+ };
7
+ export {
8
+ s as _
9
+ };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const E=["#2563eb","#0d9488","#d97706","#7c3aed","#dc2626","#0284c7"];function $(e){if(e.type!=="bar"&&e.type!=="line")throw new Error("图表 type 应为 bar 或 line");if(!Array.isArray(e.categories)||!Array.isArray(e.series)||!e.categories.length||e.categories.length>200||!e.series.length||e.series.length>12)throw new Error("图表支持 1–200 个分类、1–12 个系列;大数据应先聚合");if(e.categories.some(r=>typeof r!="string"))throw new Error("图表分类应为字符串");j(e);for(const r of e.series)z(r,e.categories.length)}function j(e){for(const r of["leftMm","topMm","widthMm","heightMm"])if(!Number.isFinite(e[r])||e[r]<0)throw new Error(`${r} 应为有限非负数`);if(e.widthMm<45||e.heightMm<35)throw new Error("图表至少需要 45×35mm");if(!Number.isFinite(e.leftMm+e.widthMm)||!Number.isFinite(e.topMm+e.heightMm))throw new Error("图表几何范围溢出")}function z(e,r){if(!e||typeof e.name!="string"||!Array.isArray(e.values)||e.values.length!==r||e.values.some(t=>t!==null&&!Number.isFinite(t)))throw new Error("图表系列应提供名称及逐分类的有限数字或 null");if(e.color!==void 0&&!/^#[\da-f]{6}$/i.test(e.color))throw new Error("图表颜色应为 #RRGGBB")}function F(e,r,t,n,i,l=.8){return{kind:"line",leftMm:Math.min(e,t),topMm:Math.min(r,n),widthMm:Math.abs(t-e),heightMm:Math.abs(n-r),lineDirection:n<r?"up":"down",style:{lineColor:i,lineWidthPt:l}}}function d(e,r,t,n,i="center"){return{kind:"text",text:e,leftMm:r,topMm:t,widthMm:n,heightMm:5,style:{fontSize:8,color:"#475569",align:i,verticalAlign:"middle"}}}function C(e){return Number(e.toPrecision(5)).toString()}function L(e){let r=0,t=0;for(const s of e.series)for(const a of s.values)a!==null&&(r=Math.min(r,a),t=Math.max(t,a));r===t&&(t=r+1);const n=e.leftMm+13,i=e.topMm+8,l=e.widthMm-17,c=e.heightMm-23,f=Math.max(Math.abs(r),Math.abs(t),1),o=r/f,u=t/f-o;return{left:n,top:i,width:l,height:c,min:r,max:t,y:s=>i+c*(1-(s/f-o)/u)}}function x(e,r){const t=[];e.title&&t.push({...d(e.title,e.leftMm,e.topMm,e.widthMm),style:{fontSize:10,bold:!0,align:"left"}});for(let l=0;l<=4;l++){const c=l/4,f=r.min*(1-c)+r.max*c,o=r.y(f);t.push(F(r.left,o,r.left+r.width,o,"#e2e8f0",.4),d(C(f),e.leftMm,o-2.5,11,"right"))}t.push(F(r.left,r.top,r.left,r.top+r.height,"#94a3b8"));const n=Math.max(1,Math.ceil(e.categories.length/Math.max(1,Math.floor(r.width/14))));e.categories.forEach((l,c)=>{c%n===0&&t.push(d(l,r.left+(c+.5)*r.width/e.categories.length-7,r.top+r.height+1,14))});const i=r.width/e.series.length;return e.series.forEach((l,c)=>{t.push({...d(l.name,r.left+c*i,e.topMm+e.heightMm-5,i),style:{fontSize:8,color:l.color??E[c%E.length],align:"center"}})}),t}function P(e,r,t,n){const i=[],l=t.color??E[n%E.length],c=r.width/e.categories.length,f=c*.75/e.series.length;let o;return t.values.forEach((u,s)=>{if(u===null){o=void 0;return}const a=r.left+(s+.5)*c,m=r.y(u);e.type==="bar"?i.push({kind:"rect",leftMm:r.left+s*c+c*.125+n*f,topMm:Math.min(m,r.y(0)),widthMm:f,heightMm:Math.abs(r.y(0)-m),style:{backgroundColor:l,borderTop:!1,borderRight:!1,borderBottom:!1,borderLeft:!1}}):(o&&i.push(F(o.x,o.y,a,m,l,1.2)),i.push({kind:"ellipse",leftMm:a-.7,topMm:m-.7,widthMm:1.4,heightMm:1.4,style:{backgroundColor:l,borderColor:l}}),o={x:a,y:m}),e.showValues&&i.push({...d(C(u),a-c/2,Math.max(r.top,m-5),c),style:{fontSize:7,color:l,align:"center"}})}),i}function T(e){$(e);const r=L(e);return[...x(e,r),...e.series.flatMap((t,n)=>P(e,r,t,n))]}function b(){return{count:0,sum:0,correction:0,min:1/0,max:-1/0}}function w(e,r){return Object.prototype.hasOwnProperty.call(e,r)?e[r]:void 0}function S(e){if(e==null)return"null";if(typeof e!="string"&&typeof e!="boolean"&&!(typeof e=="number"&&Number.isFinite(e)))throw new Error("交叉表维度应为字符串、布尔、有限数字或空值");return JSON.stringify([typeof e,e])}function A(e){return e==null?"":String(e)}function W(e,r,t){const n=t==="count";if(!n&&r==null)return;if(!n&&(typeof r!="number"||!Number.isFinite(r)))throw new Error("交叉表度量必须是有限数字;编号和小数文本不能隐式转为数字");const i=n?1:r;(t==="sum"||t==="avg")&&_(e,i),e.count++,e.min=Math.min(e.min,i),e.max=Math.max(e.max,i)}function _(e,r){const t=r-e.correction,n=e.sum+t;if(!Number.isFinite(n))throw new Error("交叉表聚合溢出");e.correction=n-e.sum-t,e.sum=n}function y(e,r){return e?.count?r==="count"?e.count:r==="avg"?e.sum/e.count:r==="sum"?e.sum:e[r]:r==="count"?0:null}function M(e,r){const t=e??r;if(!Number.isInteger(t)||t<1)throw new Error("交叉表预算应为正整数");return t}function B(e,r,t,n){const i=t?1:0;if((e+i)*(r+1+i)>n)throw new Error("交叉表输出单元格超出 maxCells 预算,请减少维度或服务端预聚合")}function D(e,r){const t=r.aggregate??"sum";if(!["sum","count","avg","min","max"].includes(t))throw new Error("未知交叉表聚合类型");if(!r.rowField||!r.columnField||t!=="count"&&!r.valueField)throw new Error("交叉表需要明确的行维度、列维度和度量字段");if(e.length>M(r.maxInputRows,1e5))throw new Error("交叉表输入超出预算,请在服务端预聚合");const n=M(r.maxRows,1e3),i=M(r.maxColumns,200),l=M(r.maxCells,2e6),c=new Map,f=new Map,o=new Map,u=b();for(const a of e){const m=S(w(a,r.rowField)),h=S(w(a,r.columnField));if(c.has(h)||c.set(h,A(w(a,r.columnField))),f.has(m)||f.set(m,{label:A(w(a,r.rowField)),cells:new Map,total:b()}),c.size>i||f.size>n)throw new Error("交叉表维度数量超出预算");B(f.size,c.size,r.totals,l);const g=f.get(m);g.cells.has(h)||g.cells.set(h,b()),o.has(h)||o.set(h,b());const k=r.valueField?w(a,r.valueField):void 0;for(const R of[g.cells.get(h),g.total,o.get(h),u])W(R,k,t)}const s={columns:[{header:r.rowHeader??r.rowField,field:"rowLabel",semanticRole:"dimension"},...[...c.values()].map((a,m)=>({header:a,field:`c${m}`,semanticRole:"measure"}))],rows:[...f.values()].map(a=>({rowLabel:a.label,...Object.fromEntries([...c.keys()].map((m,h)=>[`c${h}`,y(a.cells.get(m),t)])),...r.totals?{total:y(a.total,t)}:{}}))};return r.totals&&(s.columns.push({header:"合计",field:"total",semanticRole:"measure"}),e.length&&s.rows.push({rowLabel:"合计",...Object.fromEntries([...c.keys()].map((a,m)=>[`c${m}`,y(o.get(a),t)])),total:y(u,t)})),s}const G=new Set(["__proto__","prototype","constructor"]);function N(e){if(typeof e!="string"||!e.trim()||G.has(e))throw new Error("计算字段应为安全的非空字段名")}function v(e){return e===null||["string","boolean"].includes(typeof e)||typeof e=="number"&&Number.isFinite(e)}function I(e){if(e.some(r=>typeof r!="number"||!Number.isFinite(r)))throw new Error("算术参数必须是有限数字;空值和小数文本不会隐式转换");return e}function J(e,r){const t=I(r);let n;if(e==="add")n=t.reduce((i,l)=>i+l,0);else if(e==="multiply")n=t.reduce((i,l)=>i*l,1);else if(e==="subtract")n=t[0]-t[1];else{if(t[1]===0)throw new Error("不能除以零");n=t[0]/t[1]}if(!Number.isFinite(n))throw new Error("计算结果不是有限数字");return n}function O(e,r,t=0){if(++r.nodes>256||t>16)throw new Error("计算表达式超出深度或节点预算");if(!e||typeof e!="object"||Array.isArray(e))throw new Error("计算表达式应为声明式对象");if("field"in e){N(e.field);const i=e.field;return l=>Object.prototype.hasOwnProperty.call(l,i)?l[i]:void 0}if("value"in e){if(!v(e.value))throw new Error("常量应为有限 JSON 标量");return()=>e.value}if(!["add","subtract","multiply","divide","coalesce"].includes(e.op)||!Array.isArray(e.args))throw new Error("未知计算操作");if(e.args.length<2||["subtract","divide"].includes(e.op)&&e.args.length!==2)throw new Error("运算参数数量不正确");const n=e.args.map(i=>O(i,r,t+1));return e.op==="coalesce"?(i,l)=>H(n,i,l):(i,l)=>J(e.op,n.map(c=>c(i,l)))}function H(e,r,t){for(const n of e){const i=n(r,t);if(i!=null)return i}return null}function U(e){const r=new Set;return e.fields.map(t=>{if(N(t.field),r.has(t.field))throw new Error(`计算字段重复:${t.field}`);r.add(t.field);const n=t.expression;let i;if(typeof n=="string"){if(!e.formula)throw new Error("字符串公式需要显式配置 formula adapter");i=(l,c)=>e.formula.evaluate(n,{row:l,rowIndex:c})}else i=O(n,{nodes:0});return{field:t.field,read:i}})}function V(e,r){const t=r.maxRows??1e5,n=r.maxCells??2e6;if(!Array.isArray(e)||!Number.isSafeInteger(t)||t<1||e.length>t)throw new Error("计算数据行数超出预算或输入不是数组");if(!Array.isArray(r.fields)||r.fields.length>2048)throw new Error("计算字段应为数组且最多2048项");if(!Number.isSafeInteger(n)||n<1||e.length*r.fields.length>n)throw new Error("计算单元格超出 maxCells 预算")}function q(e,r){V(e,r);const t=U(r),n=[];return{rows:e.map((l,c)=>{if(!l||typeof l!="object"||Array.isArray(l))throw new Error(`第 ${c+1} 行应为对象`);if(r.signal?.aborted){const o=new Error("数据计算已取消");throw o.name="AbortError",o}const f={...l};for(const o of t)try{const u=o.read(f,c);if(u!==void 0&&!v(u))throw new Error("计算结果应为有限 JSON 标量,异步公式请先在数据源中求值");f[o.field]=u??null}catch(u){const s=u instanceof Error?u.message:String(u);if(r.onError!=="null")throw Object.assign(new Error(`第 ${c+1} 行 ${o.field}:${s}`),{cause:u});f[o.field]=null,n.push({rowIndex:c,field:o.field,message:s})}return f}),issues:n}}exports.computeDataset=q;exports.createChartComponents=T;exports.createCrossTable=D;
@@ -0,0 +1,276 @@
1
+ /**
2
+ * 列值格式化(声明式、JSON 可序列化)。
3
+ * 在 paginate 的 cellText 出口统一消费:格式化发生在进 RenderPlan 之前,
4
+ * 三后端(DOM/Canvas/PDF)零改动。
5
+ *
6
+ * 语义约定(v0.9 固化):
7
+ * - number.digits 显式给出 → 精确保留(12.5 + digits:2 → "12.50")
8
+ * - number.thousands 默认 false(千分位显式开启)
9
+ * - date 字符串按"本地时区的日历日"解析(YYYY-MM-DD / YYYY/MM/DD 直取年月日,
10
+ * 不经 Date 字符串构造——后者按 UTC 零点,负时区环境会少一天)
11
+ */
12
+ declare type ColumnFormat = {
13
+ kind: "number";
14
+ thousands?: boolean;
15
+ digits?: number;
16
+ } | {
17
+ kind: "percent";
18
+ digits?: number;
19
+ } | {
20
+ kind: "date";
21
+ pattern?: string;
22
+ };
23
+
24
+ declare type ComponentKind = "text" | "image" | "barcode" | "qrcode" | "chart" | "line" | "rect" | "ellipse";
25
+
26
+ declare interface ComponentStyle {
27
+ fontSizePx?: number;
28
+ fontSize?: number;
29
+ fontFamily?: string;
30
+ bold?: boolean;
31
+ italic?: boolean;
32
+ underline?: boolean;
33
+ color?: string;
34
+ backgroundColor?: string;
35
+ align?: "left" | "center" | "right" | "justify";
36
+ verticalAlign?: "top" | "middle" | "bottom";
37
+ lineColor?: string;
38
+ borderColor?: string;
39
+ lineWidthPt?: number;
40
+ borderTop?: boolean;
41
+ borderRight?: boolean;
42
+ borderBottom?: boolean;
43
+ borderLeft?: boolean;
44
+ lineHeight?: number;
45
+ letterSpacing?: number;
46
+ opacity?: number;
47
+ rotateDeg?: number;
48
+ }
49
+
50
+ export declare interface ComputationIssue {
51
+ rowIndex: number;
52
+ field: string;
53
+ message: string;
54
+ }
55
+
56
+ /** 纯数据计算与界面解耦;字段按声明顺序计算,可供后续字段引用,不修改输入数据。 */
57
+ export declare function computeDataset(input: readonly Record<string, unknown>[], options: ComputedDatasetOptions): {
58
+ rows: Record<string, unknown>[];
59
+ issues: ComputationIssue[];
60
+ };
61
+
62
+ export declare interface ComputedDatasetOptions {
63
+ fields: readonly ComputedField[];
64
+ formula?: FormulaAdapter;
65
+ maxRows?: number;
66
+ /** Calculated cells (rows × fields), default 2 million; at most 2048 field definitions. */
67
+ maxCells?: number;
68
+ signal?: AbortSignal;
69
+ onError?: "throw" | "null";
70
+ }
71
+
72
+ export declare interface ComputedField {
73
+ field: string;
74
+ expression: ReportExpression | string;
75
+ }
76
+
77
+ /** 轻量柱/折线图展开为共用基础图元,无外部图表依赖,DOM/Canvas/PDF 使用同一计划。 */
78
+ export declare function createChartComponents(options: ReportChartOptions): PlanComponent[];
79
+
80
+ /** 通用交叉聚合;合计直接累计原始度量,平均值不会错误地平均各分组合计。 */
81
+ export declare function createCrossTable(input: readonly Record<string, unknown>[], options: CrossTableOptions): CrossTableResult;
82
+
83
+ export declare interface CrossTableOptions {
84
+ rowField: string;
85
+ columnField: string;
86
+ valueField?: string;
87
+ aggregate?: "sum" | "count" | "avg" | "min" | "max";
88
+ totals?: boolean;
89
+ rowHeader?: string;
90
+ maxRows?: number;
91
+ maxColumns?: number;
92
+ maxInputRows?: number;
93
+ /** Dense output cells, including the dimension column and optional totals; default 2 million. */
94
+ maxCells?: number;
95
+ }
96
+
97
+ export declare interface CrossTableResult {
98
+ columns: TableTemplateColumn[];
99
+ rows: Record<string, unknown>[];
100
+ }
101
+
102
+ export declare interface FormulaAdapter {
103
+ /** 显式注入受信任的公式引擎;核心不执行 eval、宏或外部工作簿引用。 */
104
+ evaluate(expression: string, context: {
105
+ row: Readonly<Record<string, unknown>>;
106
+ rowIndex: number;
107
+ }): unknown;
108
+ }
109
+
110
+ declare interface GridCell {
111
+ text?: string;
112
+ rawText?: string;
113
+ /** 原始值,仅供 Excel raw 模式消费;不参与预览、分页与 PDF 绘制。 */
114
+ value?: string | number | boolean | null;
115
+ /** Excel 数字格式(例如 #,##0.00 / 0.00%),不改变 text。 */
116
+ numberFormat?: string;
117
+ /** 编辑输入类型;省略时只按原始值推断,数字字符串不会被转换为数值。 */
118
+ valueType?: "text" | "number" | "boolean";
119
+ /** 单元格级编辑控制;预览仍需显式开启 editing。 */
120
+ editable?: boolean;
121
+ source?: ReportCellSource;
122
+ /** Excel 公式保留元数据;当前引擎不计算公式,公式格始终只读。 */
123
+ formula?: string;
124
+ children?: PlanComponent[];
125
+ colSpan?: number;
126
+ rowSpan?: number;
127
+ style?: ComponentStyle;
128
+ }
129
+
130
+ /** auto:真实数字/显式数值格式居右,日期与布尔居中,其他内容居左。 */
131
+ declare type ListAlignment = NonNullable<ComponentStyle["align"]> | "auto";
132
+
133
+ declare interface ListColumn {
134
+ header: string;
135
+ field: string;
136
+ widthMm: number;
137
+ style?: ComponentStyle;
138
+ /** 内容对齐,优先于 style.align;数值字符串不会自动判为数字。 */
139
+ align?: ListAlignment;
140
+ /** 独立的表头对齐,不改变内容对齐。 */
141
+ headerAlign?: ComponentStyle["align"];
142
+ /** 独立的表头样式,优先于列表级表头样式。 */
143
+ headerStyle?: ComponentStyle;
144
+ /** 值格式化(声明式):千分位/小数位、百分比、日期 pattern */
145
+ format?: ColumnFormat;
146
+ /** 条件格式规则(声明式,命中合并进单元格样式;如负数红字) */
147
+ rules?: StyleRule[];
148
+ /** 内容列编辑控制;仍需由预览显式开启 editing,不影响表头/小计只读规则。 */
149
+ editable?: boolean;
150
+ /** 空值列或特殊数据类型可显式声明编辑输入类型。 */
151
+ valueType?: GridCell["valueType"];
152
+ /** 字段语义用于 auto 对齐;明确声明编号,避免把数字编号当成度量。 */
153
+ semanticRole?: "identifier" | "dimension" | "measure" | "date" | "text";
154
+ }
155
+
156
+ declare interface PlanComponent {
157
+ kind: ComponentKind;
158
+ leftMm: number;
159
+ topMm: number;
160
+ widthMm: number;
161
+ heightMm: number;
162
+ nid?: string;
163
+ rkey?: string;
164
+ text?: string;
165
+ rawText?: string;
166
+ lines?: string[];
167
+ richParagraphs?: RichParagraph[];
168
+ imageData?: string;
169
+ /** 明确指定线段方向;省略保持历史水平线行为。 */
170
+ lineDirection?: "down" | "up";
171
+ grid?: PlanGrid;
172
+ table?: PlanTableFragment;
173
+ style?: ComponentStyle;
174
+ meta?: Record<string, unknown>;
175
+ /** MachReport 扩展字段:未知 kind 的兜底渲染标记 */
176
+ fallbackText?: string;
177
+ }
178
+
179
+ declare interface PlanGrid {
180
+ /** 行内允许 null 空位;渲染器按空单元格处理 */
181
+ cells: (GridCell | null)[][];
182
+ colWidthsMm?: number[];
183
+ rowHeightsMm?: number[];
184
+ gapMm?: number;
185
+ /** 单元格四边内距;旧静态网格默认 0.5mm,分页列表使用其真实测量内距。 */
186
+ paddingMm?: number;
187
+ }
188
+
189
+ /** 列表的逻辑行来源;用于连续 Excel 重组,避免按文本猜测重复表头。 */
190
+ declare interface PlanTableFragment {
191
+ /** 在整个计划中唯一的逻辑表身份;同一表的分页片段共享身份。 */
192
+ id: string;
193
+ /** 表头固定 -1;其余行(包括组头/小计/总计)从 0 连续递增。 */
194
+ rowIndex: number;
195
+ role: "header" | "body" | "group-header" | "subtotal" | "grand-total";
196
+ /** 按物理列顺序保存字段身份;不以表头显示文本判断列结构。 */
197
+ columnKeys: string[];
198
+ layout?: "page" | "wide";
199
+ title?: string;
200
+ /** 只有宿主声明稳定 rowKey 时生成,不能用显示顺序替代业务主键。 */
201
+ source?: Omit<ReportCellSource, "field" | "rowKey"> & {
202
+ rowKey?: string | number;
203
+ };
204
+ }
205
+
206
+ /** 可持久化的业务身份与计划坐标独立;权限及并发校验仍由业务服务器执行。 */
207
+ declare interface ReportCellSource {
208
+ datasetId: string;
209
+ rowKey: string | number;
210
+ field: string;
211
+ revision?: string | number;
212
+ sourceToken?: string;
213
+ }
214
+
215
+ export declare interface ReportChartOptions {
216
+ type: "bar" | "line";
217
+ categories: readonly string[];
218
+ series: readonly ReportChartSeries[];
219
+ leftMm: number;
220
+ topMm: number;
221
+ widthMm: number;
222
+ heightMm: number;
223
+ title?: string;
224
+ showValues?: boolean;
225
+ }
226
+
227
+ export declare interface ReportChartSeries {
228
+ name: string;
229
+ values: readonly (number | null)[];
230
+ color?: string;
231
+ }
232
+
233
+ export declare type ReportExpression = {
234
+ field: string;
235
+ } | {
236
+ value: string | number | boolean | null;
237
+ } | {
238
+ op: "add" | "subtract" | "multiply" | "divide" | "coalesce";
239
+ args: readonly ReportExpression[];
240
+ };
241
+
242
+ declare interface RichParagraph {
243
+ segments: RichSegment[];
244
+ align?: ComponentStyle["align"];
245
+ lineHeight?: number;
246
+ spaceBeforeMm?: number;
247
+ spaceAfterMm?: number;
248
+ indentMm?: number;
249
+ }
250
+
251
+ declare interface RichSegment {
252
+ kind?: "text" | "field";
253
+ text?: string;
254
+ field?: string;
255
+ style?: ComponentStyle;
256
+ }
257
+
258
+ /** 条件格式规则求值(声明式,见 ListColumn.rules) */
259
+ declare interface StyleRule {
260
+ when: {
261
+ field: string;
262
+ op: ">" | ">=" | "<" | "<=" | "==" | "!=";
263
+ value: number | string;
264
+ };
265
+ /** 命中时合并进单元格样式(color/bold/backgroundColor 等) */
266
+ style: Record<string, unknown>;
267
+ }
268
+
269
+ /** 明细列:显式 widthMm 优先;纸张模式按 flex 分余量,宽表模式按 flex 放大基准列宽。 */
270
+ declare type TableTemplateColumn = Omit<ListColumn, "widthMm"> & {
271
+ widthMm?: number;
272
+ /** 自动列的宽度权重,默认 1(有 widthMm 时不参与分配)。 */
273
+ flex?: number;
274
+ };
275
+
276
+ export { }