@agile-team/mach-report 2.10.0 → 2.11.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.
- package/README.md +6 -2
- package/dist/ExcelBindingWizard-LWX6G1A2.js +1465 -0
- package/dist/ExcelBindingWizard-a4kslPHF.cjs +1 -0
- package/dist/ParamEditor-BLaE5q5W.js +522 -0
- package/dist/ParamEditor-MBBC7lUE.cjs +1 -0
- package/dist/ReportBatchPanel-B5ClP9tm.js +350 -0
- package/dist/ReportBatchPanel-Dc-SDkYA.cjs +1 -0
- package/dist/ReportPreview-DWXROHBP.cjs +6 -0
- package/dist/ReportPreview-DiNXhQI0.js +4138 -0
- package/dist/ReportTemplateLibrary-5fk5CQBO.cjs +1 -0
- package/dist/ReportTemplateLibrary-BZB-XWjj.js +311 -0
- package/dist/RuleEditor-C2QsOHOs.cjs +1 -0
- package/dist/RuleEditor-D9wQHrkf.js +2024 -0
- package/dist/TemplateReviewPanel-BKofGrV9.js +222 -0
- package/dist/TemplateReviewPanel-DwtOcLue.cjs +1 -0
- package/dist/analytics.cjs +1 -1
- package/dist/analytics.d.cts +2 -0
- package/dist/analytics.d.ts +2 -0
- package/dist/analytics.js +29 -29
- package/dist/batch-Bt3Fd27Z.cjs +1 -0
- package/dist/batch-mRqhhhjt.js +364 -0
- package/dist/computed-Bvk0W15F.js +521 -0
- package/dist/computed-CGV2a809.cjs +1 -0
- package/dist/config-B612mw0x.js +525 -0
- package/dist/config-BRoLo2oj.cjs +1 -0
- package/dist/designer.cjs +2 -2
- package/dist/designer.d.cts +730 -9
- package/dist/designer.d.ts +730 -9
- package/dist/designer.js +2093 -1785
- package/dist/index.cjs +8 -8
- package/dist/index.d.cts +161 -3
- package/dist/index.d.ts +161 -3
- package/dist/index.js +486 -431
- package/dist/injection-keys-Db_DyLkm.cjs +1 -0
- package/dist/injection-keys-e85udZCp.js +7 -0
- package/dist/list-cell-BuYn4tGF.cjs +1 -0
- package/dist/{list-cell-Dxyi7DOw.js → list-cell-ClFra1zS.js} +54 -40
- package/dist/matrix-DVyWiYsd.cjs +1 -0
- package/dist/matrix-yZsGnldA.js +227 -0
- package/dist/param-validation-BlHHXs6u.js +153 -0
- package/dist/param-validation-DCK039V1.cjs +1 -0
- package/dist/pdf.cjs +25 -25
- package/dist/pdf.d.cts +3 -0
- package/dist/pdf.d.ts +3 -0
- package/dist/pdf.js +677 -677
- package/dist/plugin-BDTU4D94.cjs +1 -0
- package/dist/plugin-Cd5G2QQn.js +22 -0
- package/dist/region-binding-workflow-CXDmt9Bs.js +977 -0
- package/dist/region-binding-workflow-DhQvu1co.cjs +3 -0
- package/dist/{report-params-B_VCihAh.js → report-params-B44imUd4.js} +1 -1
- package/dist/{report-params-CjWrjPl6.cjs → report-params-SJfhKgaX.cjs} +1 -1
- package/dist/server/node.d.cts +5 -2
- package/dist/server/node.d.ts +5 -2
- package/dist/server-node.cjs +1 -1
- package/dist/server-node.js +87 -87
- package/dist/server.cjs +1 -1
- package/dist/server.d.cts +201 -2
- package/dist/server.d.ts +201 -2
- package/dist/server.js +557 -658
- package/dist/style.css +1 -1
- package/dist/template-registry-WNXdkiET.js +506 -0
- package/dist/template-registry-ukBGlm8N.cjs +1 -0
- package/dist/template-review-BXp2oyqg.cjs +1 -0
- package/dist/template-review-BdcXSYbx.js +1616 -0
- package/dist/tree-BX380Rr7.cjs +1 -0
- package/dist/tree-CqcQ99NM.js +172 -0
- package/dist/{validate-UUy9yP4K.js → validate-7s0yn6ii.js} +44 -44
- package/dist/validate-DsRiNw8h.cjs +1 -0
- package/dist/vue/async.d.cts +93 -4
- package/dist/vue/async.d.ts +93 -4
- package/dist/vue/index.d.cts +145 -7
- package/dist/vue/index.d.ts +145 -7
- package/dist/vue-async.cjs +1 -1
- package/dist/vue-async.js +5 -5
- package/dist/vue.cjs +1 -1
- package/dist/vue.js +116 -113
- package/dist/{workbook-session-B-bW5_yR.js → workbook-session-BKOTwcoq.js} +1 -1
- package/dist/{workbook-session-D7RtdNo0.cjs → workbook-session-CLYLhZWu.cjs} +1 -1
- package/dist/worker.cjs +1 -1
- package/dist/worker.d.cts +5 -2
- package/dist/worker.d.ts +5 -2
- package/dist/worker.js +1 -1
- package/dist/xlsx.cjs +3 -3
- package/dist/xlsx.d.cts +129 -2
- package/dist/xlsx.d.ts +129 -2
- package/dist/xlsx.js +336 -242
- package/package.json +1 -1
- package/dist/ExcelBindingWizard-CF7RplWm.cjs +0 -1
- package/dist/ExcelBindingWizard-qhwEderR.js +0 -842
- package/dist/ReportPreview-BE1tCHqE.js +0 -4604
- package/dist/ReportPreview-QKRKQOe3.cjs +0 -6
- package/dist/RuleEditor-BA36yIV6.js +0 -1723
- package/dist/RuleEditor-CczJ6mJm.cjs +0 -1
- package/dist/TemplateReviewPanel-CHi4Alqa.cjs +0 -1
- package/dist/TemplateReviewPanel-Dz0G5o83.js +0 -217
- package/dist/binding-preview-BWsdf_z2.cjs +0 -2
- package/dist/binding-preview-DILq0-0f.js +0 -649
- package/dist/decimal-CI1OAczk.js +0 -87
- package/dist/decimal-CQA0xJex.cjs +0 -1
- package/dist/list-cell-CyM1ZlRN.cjs +0 -1
- package/dist/matrix-BbXarwyk.js +0 -661
- package/dist/matrix-Cm65WLLP.cjs +0 -1
- package/dist/param-validation-BWNjLcN0.js +0 -116
- package/dist/param-validation-CiTxFeZ8.cjs +0 -1
- package/dist/plugin-CThk42vJ.cjs +0 -1
- package/dist/plugin-tGn7-5oF.js +0 -25
- package/dist/template-registry-CGWTLtIA.cjs +0 -1
- package/dist/template-registry-DzlQs3OF.js +0 -434
- package/dist/template-review-D1RoNCPw.cjs +0 -1
- package/dist/template-review-fnteXRng.js +0 -1473
- package/dist/validate-Bf6ccFr2.cjs +0 -1
package/dist/index.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const I=require("./defaults-xhmcLLrf.cjs"),Y=require("./list-cell-CyM1ZlRN.cjs"),u=require("./style-UgIJSA1F.cjs"),B=require("./render-plan-7xpGrCEl.cjs"),te=require("./validate-Bf6ccFr2.cjs"),ae=require("./dataset-BkRmwgeJ.cjs"),$=require("./textwrap-CWHyzkBH.cjs"),p=require("./template-review-D1RoNCPw.cjs"),se=require("./grid-geometry-CZ_cYB6O.cjs"),W=require("./assets-Bu6UohJx.cjs"),D=require("./capabilities-CsZ-pNHR.cjs"),He=require("./progress-BnLiS5eH.cjs"),ze=require("./page-window-index-DEjnM6IB.cjs"),A=require("./template-registry-CGWTLtIA.cjs"),U=require("./param-validation-CiTxFeZ8.cjs"),Be={root:"mr-root",page:"mr-page",comp:"mr-comp",text:"mr-text",lines:"mr-lines",line:"mr-line",rich:"mr-rich",paragraph:"mr-paragraph",segment:"mr-segment",image:"mr-image",shape:"mr-shape",grid:"mr-grid",row:"mr-row",cell:"mr-cell",unknown:"mr-unknown"};function S(e,t){return t?.classNames?.[e]??Be[e]}class We{constructor(){this.props=[]}add(t,n){return n==null||n===!1||n===""?this:(this.props.push([t,String(n)]),this)}mm(t,n,r,i=2){return this.add(t,`${u.round(u.mmToPx(n,r),i)}px`)}toString(){let t="";for(const[n,r]of this.props)t+=`${n}:${r};`;return t}applyTo(t){const n=this.toString();n&&(t.style.cssText=n)}}function E(e,t="unset"){return new We().add("all",t).add("display",e).add("box-sizing","border-box")}function Me(e,t,n){e.add("color",t.color).add("font-family",t.fontFamily).add("font-weight",t.bold!=null?t.bold?"700":"400":void 0).add("font-style",t.italic!=null?t.italic?"italic":"normal":void 0).add("text-decoration",t.underline!=null?t.underline?"underline":"none":void 0).add("letter-spacing",t.letterSpacing!=null?`${t.letterSpacing}pt`:void 0).add("line-height",String(u.resolveLineHeight(t))).add("text-align",t.align);const r=u.resolveFontSize(t,n);e.add("font-size",`${u.round(r.fontSizePx,2)}px`)}function qe(e,t,n){const r=t.style??{};Me(e,r,n),e.add("background-color",r.backgroundColor).add("opacity",r.opacity!=null?String(r.opacity):void 0).add("transform",r.rotateDeg?`rotate(${r.rotateDeg}deg)`:void 0)}function je(e,t,n,r,i,a){const s=e.cell,o=a.createElement("td");o.className=S("cell",i),o.dataset.mrRowIndex=String(e.ri),o.dataset.mrColumnIndex=String(e.ci),o.setAttribute("role",t.table?.role==="header"?"columnheader":"cell"),s.colSpan&&(o.colSpan=s.colSpan),s.rowSpan&&(o.rowSpan=s.rowSpan);const l=u.mergeComponentStyles(t.style,s.style),c=E("block").add("position","absolute").mm("left",e.xMm,r).mm("top",e.yMm,r).mm("width",e.widthMm,r).mm("height",e.heightMm,r).add("background-color",l.backgroundColor).add("vertical-align",l.verticalAlign??"middle");Me(c,l,r),c.applyTo(o);const d=a.createElement("div");d.className="mr-cell-content",E("flex").add("position","absolute").mm("left",n,r).mm("right",n,r).mm("top",n,r).mm("bottom",n,r).add("flex-direction","column").add("justify-content",l.verticalAlign==="top"?"flex-start":l.verticalAlign==="bottom"?"flex-end":"center").add("overflow-wrap","anywhere").add("overflow","hidden").applyTo(d),s.text!=null&&d.append(s.text);for(const m of s.children??[])d.appendChild(le(m,r,i,a));return o.appendChild(d),o}function Ue(e,t,n,r){return W.resolveGridStrokes(e,t).map(i=>{const a=`${u.round(i.widthPt*n/72,2)}px solid ${i.color}`,s=r.createElement("div");s.className="mr-grid-edge",s.setAttribute("aria-hidden","true");const o=i.kind==="h";return E("block").add("position","absolute").add("pointer-events","none").mm("left",o?i.from:i.pos,n).mm("top",o?i.pos:i.from,n).mm("width",o?i.to-i.from:0,n).mm("height",o?0:i.to-i.from,n).add(o?"border-top":"border-left",a).applyTo(s),s})}function Ge(e,t,n,r,i){const a=i.createElement("table");a.className=S("grid",r),a.setAttribute("role","table"),E("block").add("position","relative").add("width","100%").add("height","100%").applyTo(a);const s=se.resolveGridLayout(e,t.widthMm,t.heightMm),o=i.createElement("tbody");E("contents").applyTo(o),a.appendChild(o);const l=e.cells.map(()=>{const d=i.createElement("tr");return d.className=S("row",r),d.setAttribute("role","row"),E("contents").applyTo(d),o.appendChild(d),d});for(const d of s.cells)l[d.ri].appendChild(je(d,t,e.paddingMm??.5,n,r,i));const c=i.createElement("div");return E("block").add("position","relative").add("width","100%").add("height","100%").applyTo(c),c.append(a,...Ue(s,t,n,i)),c}function Ve(e,t,n,r){const i=r.createElement("div");i.className=S("paragraph",n),E("block").add("text-align",e.align).add("line-height",e.lineHeight!=null?String(e.lineHeight):void 0).mm("margin-top",e.spaceBeforeMm??0,t).mm("margin-bottom",e.spaceAfterMm??0,t).mm("text-indent",e.indentMm??0,t).applyTo(i);for(const a of e.segments||[]){const s=r.createElement("span");s.className=S("segment",n),s.textContent=a.kind==="field"?a.field??"":a.text??"";const o=E("inline");if(a.style){const l=a.style;o.add("color",l.color).add("font-family",l.fontFamily).add("font-weight",l.bold!=null?l.bold?"700":"400":void 0).add("font-style",l.italic!=null?l.italic?"italic":"normal":void 0).add("text-decoration",l.underline!=null?l.underline?"underline":"none":void 0),(l.fontSize!=null||l.fontSizePx!=null)&&o.add("font-size",`${u.round(u.resolveFontSize(l,t).fontSizePx,2)}px`)}o.applyTo(s),i.appendChild(s)}return i}function Ye(e,t,n,r){if(B.isRichText(e)){const i=r.createElement("div");i.className=S("rich",n),E("block").applyTo(i);for(const a of e.richParagraphs)i.appendChild(Ve(a,t,n,r));return i}if(Array.isArray(e.lines)&&e.lines.length>0){const i=r.createElement("div");i.className=S("lines",n),E("block").applyTo(i);for(const a of e.lines){const s=r.createElement("div");s.className=S("line",n),s.textContent=a,E("block").add("white-space","pre").add("min-height","1lh").applyTo(s),i.appendChild(s)}return i}return e.text??""}function Xe(e,t,n,r){const i=r.createElement("div");i.className=S("text",n);const a=e.style||{};return E("flex").add("width","100%").add("height","100%").add("flex-direction","column").add("justify-content",a.verticalAlign==="middle"?"center":a.verticalAlign==="bottom"?"flex-end":"flex-start").add("overflow-wrap","anywhere").add("overflow","hidden").applyTo(i),i.append(Ye(e,t,n,r)),i}function Ke(e,t,n){const r=n.createElement("img");return r.className=S("image",t),r.src=e.imageData,E("block").add("width","100%").add("height","100%").add("object-fit","contain").applyTo(r),r.alt=e.kind,r}function pe(e,t,n,r){const i=r.createElement("div");i.className=S("shape",n);const a=e.style||{},s=u.resolveStroke(a),o=u.resolveBoxBorders(a),l=`${u.round(s.widthPt*t/72,2)}px solid ${s.color}`,c=E("block");return e.grid?c.add("position","relative"):e.kind==="rect"?(o.top&&c.add("border-top",l),o.right&&c.add("border-right",l),o.bottom&&c.add("border-bottom",l),o.left&&c.add("border-left",l)):e.kind==="ellipse"?(o.inner&&c.add("border",l).add("border-radius","50%"),a.backgroundColor&&c.add("background-color",a.backgroundColor)):e.kind==="line"&&c.add("height","0").add("border-top",l),c.add("box-sizing","border-box").add("width","100%").add("height","100%"),c.applyTo(i),i}function Ze(e,t,n){const r=n.createElementNS("http://www.w3.org/2000/svg","svg"),i=u.mmToPx(e.widthMm,t),a=u.mmToPx(e.heightMm,t);r.setAttribute("width",String(Math.max(1,i))),r.setAttribute("height",String(Math.max(1,a))),r.setAttribute("aria-hidden","true"),r.style.overflow="visible",r.style.display="block";const s=n.createElementNS("http://www.w3.org/2000/svg","line");s.setAttribute("x1","0"),s.setAttribute("x2",String(i)),s.setAttribute("y1",e.lineDirection==="up"?String(a):"0"),s.setAttribute("y2",e.lineDirection==="up"?"0":String(a));const o=u.resolveStroke({...e.style,borderColor:e.style?.lineColor??e.style?.borderColor});return s.setAttribute("stroke",o.color),s.setAttribute("stroke-width",String(o.widthPt*t/72)),r.appendChild(s),r}function le(e,t,n,r){const i=r.createElement("div");i.className=`${S("comp",n)} mr-kind-${e.kind}`;const a=E("block").add("position","absolute").mm("left",e.leftMm,t).mm("top",e.topMm,t).mm("width",e.widthMm,t).mm("height",e.heightMm,t).add("box-sizing","border-box");if(qe(a,e,t),a.applyTo(i),B.isImageBackedComponent(e))return i.appendChild(Ke(e,n,r)),i;if(e.kind==="text")return i.appendChild(Xe(e,t,n,r)),i;if(e.grid){const o=pe(e,t,n,r);return o.appendChild(Ge(e.grid,e,t,n,r)),i.appendChild(o),i}if(e.kind==="line"&&e.lineDirection)return i.appendChild(Ze(e,t,r)),i;if(e.kind==="line"||e.kind==="rect"||e.kind==="ellipse")return i.appendChild(pe(e,t,n,r)),i;const s=r.createElement("div");return s.className=S("unknown",n),E("block").applyTo(s),s.textContent=e.fallbackText??`[${e.kind}]`,s.dataset.mrUnsupported=e.kind,s.setAttribute("role","note"),i.appendChild(s),i}function Ee(e,t,n,r){const i=r.createElement("div");return i.className=S("page",n),E("block","initial").add("position","relative").add("font-family",I.DEFAULT_FONT_FAMILY).add("font-size",`${u.round(u.resolveFontSize(void 0,t).fontSizePx,2)}px`).add("line-height",String(u.resolveLineHeight(void 0))).add("white-space","pre-wrap").add("direction","ltr").mm("width",e.pageWidthMm,t).mm("height",e.pageHeightMm,t).add("background-color","#fff").add("color",I.DEFAULT_TEXT_COLOR).add("overflow","hidden").add("box-sizing","border-box").applyTo(i),e.components.forEach((a,s)=>{const o=le(a,t,n,r);o.dataset.mrComponentIndex=String(s),i.appendChild(o)}),i}function Je(e,t,n={}){const r=n.dpi??96;D.reportOutputDiagnostics(e,"dom",n);const i=t.createElement("div");return i.className=S("root",n),E("block").applyTo(i),i.dataset.schemaVersion=e.schemaVersion,e.pages.forEach(a=>{i.appendChild(Ee(a,r,n,t))}),i}function k(e){if(e?.aborted)throw e.reason??new DOMException("The operation was aborted.","AbortError")}const Qe=(e,t)=>(k(t),/^data:image\/(?:png|jpe?g|webp|gif|svg\+xml)[;,]/i.test(e)?new Promise((n,r)=>{const i=new Image,a=()=>{i.onload=null,i.onerror=null,t?.removeEventListener("abort",s)},s=()=>{a(),i.src="",r(t?.reason??new DOMException("The operation was aborted.","AbortError"))};i.onload=()=>{a(),n(i)},i.onerror=()=>{a(),r(new Error("Image could not be decoded for Canvas output."))},t?.addEventListener("abort",s,{once:!0}),i.src=e}):Promise.reject(new TypeError("Canvas imageData must be an image data URL; provide imageLoader for other sources.")));function et(e,t,n){return k(n),n?new Promise((r,i)=>{const a=()=>i(n.reason??new DOMException("The operation was aborted.","AbortError"));n.addEventListener("abort",a,{once:!0}),Promise.resolve().then(()=>e(t,n)).then(r,i).finally(()=>n.removeEventListener("abort",a))}):e(t)}async function tt(e,t,n){const r=new Map;for(const i of e.components)!B.isImageBackedComponent(i)||r.has(i.imageData)||r.set(i.imageData,await et(t,i.imageData,n));return k(n),r}function nt(e,t,n,r,i,a){const s=t,o=s.naturalWidth??s.width??i,l=s.naturalHeight??s.height??a;if(o<=0||l<=0)throw new RangeError("Decoded Canvas image dimensions must be positive.");const c=Math.min(i/o,a/l),d=o*c,m=l*c;e.drawImage(t,n+(i-d)/2,r+(a-m)/2,d,m)}function xe(e){return ze.createPageWindowIndex(e.pageHeightsPx,e.gapPx).window(e.viewportHeightPx,e.scrollTopPx,e.overscan)}const ce=96/25.4;function ne(e,t=96){const n=t/96*ce;return{widthPx:Math.max(1,Math.round(e.pageWidthMm*n)),heightPx:Math.max(1,Math.round(e.pageHeightMm*n))}}function Te(e,t,n,r=64e6){if(!Number.isFinite(t)||t<=0||!Number.isFinite(n)||n<=0)throw new RangeError("Canvas dpr and dpi must be positive finite numbers.");if(!Number.isFinite(r)||r<=0)throw new RangeError("maxCanvasPixels must be positive and finite.");const i=ne(e,n),a=Math.round(i.widthPx*t),s=Math.round(i.heightPx*t);if(!Number.isSafeInteger(a)||!Number.isSafeInteger(s)||a*s>r)throw new RangeError("Canvas page exceeds maxCanvasPixels; reduce resolution or split the report.");return{width:a,height:s}}function Se(e,t,n,r){const i=document.createElement("canvas"),{widthPx:a,heightPx:s}=ne(e,n),o=Te(e,t,n,r);i.width=o.width,i.height=o.height,i.style.width=`${a}px`,i.style.height=`${s}px`;const l=i.getContext("2d");if(!l)throw new Error("当前环境不支持 Canvas 2D(测试需真浏览器,见 e2e/canvas.spec.ts)");return l.scale(t,t),l.fillStyle="#ffffff",l.fillRect(0,0,a,s),{canvas:i,ctx:l}}function rt(e,t=96){return u.resolveFontSize(e,t).fontSizePx}function Ce(e,t,n,r,i,a,s,o="top"){e.font=`${t.italic?"italic ":""}${t.bold?"bold ":""}${t.fontSizePx}px ${s}`,"letterSpacing"in e&&(e.letterSpacing="0px"),e.fillStyle=t.color,e.textBaseline="alphabetic";const l=t.fontSizePx*t.lineHeight,c=t.text===""?[""]:t.text.split(`
|
|
2
|
-
`),d=c.length*l;let m=r;
|
|
3
|
-
`);
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const I=require("./defaults-xhmcLLrf.cjs"),Y=require("./list-cell-BuYn4tGF.cjs"),u=require("./style-UgIJSA1F.cjs"),W=require("./render-plan-7xpGrCEl.cjs"),te=require("./validate-DsRiNw8h.cjs"),ae=require("./dataset-BkRmwgeJ.cjs"),$=require("./textwrap-CWHyzkBH.cjs"),f=require("./template-review-BXp2oyqg.cjs"),se=require("./grid-geometry-CZ_cYB6O.cjs"),j=require("./assets-Bu6UohJx.cjs"),O=require("./capabilities-CsZ-pNHR.cjs"),Be=require("./progress-BnLiS5eH.cjs"),We=require("./page-window-index-DEjnM6IB.cjs"),E=require("./template-registry-ukBGlm8N.cjs"),z=require("./param-validation-DCK039V1.cjs"),le=require("./tree-BX380Rr7.cjs"),je={root:"mr-root",page:"mr-page",comp:"mr-comp",text:"mr-text",lines:"mr-lines",line:"mr-line",rich:"mr-rich",paragraph:"mr-paragraph",segment:"mr-segment",image:"mr-image",shape:"mr-shape",grid:"mr-grid",row:"mr-row",cell:"mr-cell",unknown:"mr-unknown"};function S(e,t){return t?.classNames?.[e]??je[e]}class Ue{constructor(){this.props=[]}add(t,n){return n==null||n===!1||n===""?this:(this.props.push([t,String(n)]),this)}mm(t,n,r,i=2){return this.add(t,`${u.round(u.mmToPx(n,r),i)}px`)}toString(){let t="";for(const[n,r]of this.props)t+=`${n}:${r};`;return t}applyTo(t){const n=this.toString();n&&(t.style.cssText=n)}}function T(e,t="unset"){return new Ue().add("all",t).add("display",e).add("box-sizing","border-box")}function Te(e,t,n){e.add("color",t.color).add("font-family",t.fontFamily).add("font-weight",t.bold!=null?t.bold?"700":"400":void 0).add("font-style",t.italic!=null?t.italic?"italic":"normal":void 0).add("text-decoration",t.underline!=null?t.underline?"underline":"none":void 0).add("letter-spacing",t.letterSpacing!=null?`${t.letterSpacing}pt`:void 0).add("line-height",String(u.resolveLineHeight(t))).add("text-align",t.align);const r=u.resolveFontSize(t,n);e.add("font-size",`${u.round(r.fontSizePx,2)}px`)}function qe(e,t,n){const r=t.style??{};Te(e,r,n),e.add("background-color",r.backgroundColor).add("opacity",r.opacity!=null?String(r.opacity):void 0).add("transform",r.rotateDeg?`rotate(${r.rotateDeg}deg)`:void 0)}function Ge(e,t,n,r,i,o){const s=e.cell,a=o.createElement("td");a.className=S("cell",i),a.dataset.mrRowIndex=String(e.ri),a.dataset.mrColumnIndex=String(e.ci),a.setAttribute("role",t.table?.role==="header"?"columnheader":"cell"),s.colSpan&&(a.colSpan=s.colSpan),s.rowSpan&&(a.rowSpan=s.rowSpan);const l=u.mergeComponentStyles(t.style,s.style),c=T("block").add("position","absolute").mm("left",e.xMm,r).mm("top",e.yMm,r).mm("width",e.widthMm,r).mm("height",e.heightMm,r).add("background-color",l.backgroundColor).add("vertical-align",l.verticalAlign??"middle");Te(c,l,r),c.applyTo(a);const d=o.createElement("div");d.className="mr-cell-content",T("flex").add("position","absolute").mm("left",n+(s.indentMm??0),r).mm("right",n,r).mm("top",n,r).mm("bottom",n,r).add("flex-direction","column").add("justify-content",l.verticalAlign==="top"?"flex-start":l.verticalAlign==="bottom"?"flex-end":"center").add("overflow-wrap","anywhere").add("overflow","hidden").applyTo(d),s.text!=null&&d.append(s.text);for(const m of s.children??[])d.appendChild(ce(m,r,i,o));return a.appendChild(d),a}function Ve(e,t,n,r){return j.resolveGridStrokes(e,t).map(i=>{const o=`${u.round(i.widthPt*n/72,2)}px solid ${i.color}`,s=r.createElement("div");s.className="mr-grid-edge",s.setAttribute("aria-hidden","true");const a=i.kind==="h";return T("block").add("position","absolute").add("pointer-events","none").mm("left",a?i.from:i.pos,n).mm("top",a?i.pos:i.from,n).mm("width",a?i.to-i.from:0,n).mm("height",a?0:i.to-i.from,n).add(a?"border-top":"border-left",o).applyTo(s),s})}function Ye(e,t,n,r,i){const o=i.createElement("table");o.className=S("grid",r),o.setAttribute("role","table"),T("block").add("position","relative").add("width","100%").add("height","100%").applyTo(o);const s=se.resolveGridLayout(e,t.widthMm,t.heightMm),a=i.createElement("tbody");T("contents").applyTo(a),o.appendChild(a);const l=e.cells.map(()=>{const d=i.createElement("tr");return d.className=S("row",r),d.setAttribute("role","row"),T("contents").applyTo(d),a.appendChild(d),d});for(const d of s.cells)l[d.ri].appendChild(Ge(d,t,e.paddingMm??.5,n,r,i));const c=i.createElement("div");return T("block").add("position","relative").add("width","100%").add("height","100%").applyTo(c),c.append(o,...Ve(s,t,n,i)),c}function Xe(e,t,n,r){const i=r.createElement("div");i.className=S("paragraph",n),T("block").add("text-align",e.align).add("line-height",e.lineHeight!=null?String(e.lineHeight):void 0).mm("margin-top",e.spaceBeforeMm??0,t).mm("margin-bottom",e.spaceAfterMm??0,t).mm("text-indent",e.indentMm??0,t).applyTo(i);for(const o of e.segments||[]){const s=r.createElement("span");s.className=S("segment",n),s.textContent=o.kind==="field"?o.field??"":o.text??"";const a=T("inline");if(o.style){const l=o.style;a.add("color",l.color).add("font-family",l.fontFamily).add("font-weight",l.bold!=null?l.bold?"700":"400":void 0).add("font-style",l.italic!=null?l.italic?"italic":"normal":void 0).add("text-decoration",l.underline!=null?l.underline?"underline":"none":void 0),(l.fontSize!=null||l.fontSizePx!=null)&&a.add("font-size",`${u.round(u.resolveFontSize(l,t).fontSizePx,2)}px`)}a.applyTo(s),i.appendChild(s)}return i}function Ke(e,t,n,r){if(W.isRichText(e)){const i=r.createElement("div");i.className=S("rich",n),T("block").applyTo(i);for(const o of e.richParagraphs)i.appendChild(Xe(o,t,n,r));return i}if(Array.isArray(e.lines)&&e.lines.length>0){const i=r.createElement("div");i.className=S("lines",n),T("block").applyTo(i);for(const o of e.lines){const s=r.createElement("div");s.className=S("line",n),s.textContent=o,T("block").add("white-space","pre").add("min-height","1lh").applyTo(s),i.appendChild(s)}return i}return e.text??""}function Je(e,t,n,r){const i=r.createElement("div");i.className=S("text",n);const o=e.style||{};return T("flex").add("width","100%").add("height","100%").add("flex-direction","column").add("justify-content",o.verticalAlign==="middle"?"center":o.verticalAlign==="bottom"?"flex-end":"flex-start").add("overflow-wrap","anywhere").add("overflow","hidden").applyTo(i),i.append(Ke(e,t,n,r)),i}function Ze(e,t,n){const r=n.createElement("img");return r.className=S("image",t),r.src=e.imageData,T("block").add("width","100%").add("height","100%").add("object-fit","contain").applyTo(r),r.alt=e.kind,r}function we(e,t,n,r){const i=r.createElement("div");i.className=S("shape",n);const o=e.style||{},s=u.resolveStroke(o),a=u.resolveBoxBorders(o),l=`${u.round(s.widthPt*t/72,2)}px solid ${s.color}`,c=T("block");return e.grid?c.add("position","relative"):e.kind==="rect"?(a.top&&c.add("border-top",l),a.right&&c.add("border-right",l),a.bottom&&c.add("border-bottom",l),a.left&&c.add("border-left",l)):e.kind==="ellipse"?(a.inner&&c.add("border",l).add("border-radius","50%"),o.backgroundColor&&c.add("background-color",o.backgroundColor)):e.kind==="line"&&c.add("height","0").add("border-top",l),c.add("box-sizing","border-box").add("width","100%").add("height","100%"),c.applyTo(i),i}function Qe(e,t,n){const r=n.createElementNS("http://www.w3.org/2000/svg","svg"),i=u.mmToPx(e.widthMm,t),o=u.mmToPx(e.heightMm,t);r.setAttribute("width",String(Math.max(1,i))),r.setAttribute("height",String(Math.max(1,o))),r.setAttribute("aria-hidden","true"),r.style.overflow="visible",r.style.display="block";const s=n.createElementNS("http://www.w3.org/2000/svg","line");s.setAttribute("x1","0"),s.setAttribute("x2",String(i)),s.setAttribute("y1",e.lineDirection==="up"?String(o):"0"),s.setAttribute("y2",e.lineDirection==="up"?"0":String(o));const a=u.resolveStroke({...e.style,borderColor:e.style?.lineColor??e.style?.borderColor});return s.setAttribute("stroke",a.color),s.setAttribute("stroke-width",String(a.widthPt*t/72)),r.appendChild(s),r}function ce(e,t,n,r){const i=r.createElement("div");i.className=`${S("comp",n)} mr-kind-${e.kind}`;const o=T("block").add("position","absolute").mm("left",e.leftMm,t).mm("top",e.topMm,t).mm("width",e.widthMm,t).mm("height",e.heightMm,t).add("box-sizing","border-box");if(qe(o,e,t),o.applyTo(i),W.isImageBackedComponent(e))return i.appendChild(Ze(e,n,r)),i;if(e.kind==="text")return i.appendChild(Je(e,t,n,r)),i;if(e.grid){const a=we(e,t,n,r);return a.appendChild(Ye(e.grid,e,t,n,r)),i.appendChild(a),i}if(e.kind==="line"&&e.lineDirection)return i.appendChild(Qe(e,t,r)),i;if(e.kind==="line"||e.kind==="rect"||e.kind==="ellipse")return i.appendChild(we(e,t,n,r)),i;const s=r.createElement("div");return s.className=S("unknown",n),T("block").applyTo(s),s.textContent=e.fallbackText??`[${e.kind}]`,s.dataset.mrUnsupported=e.kind,s.setAttribute("role","note"),i.appendChild(s),i}function xe(e,t,n,r){const i=r.createElement("div");return i.className=S("page",n),T("block","initial").add("position","relative").add("font-family",I.DEFAULT_FONT_FAMILY).add("font-size",`${u.round(u.resolveFontSize(void 0,t).fontSizePx,2)}px`).add("line-height",String(u.resolveLineHeight(void 0))).add("white-space","pre-wrap").add("direction","ltr").mm("width",e.pageWidthMm,t).mm("height",e.pageHeightMm,t).add("background-color","#fff").add("color",I.DEFAULT_TEXT_COLOR).add("overflow","hidden").add("box-sizing","border-box").applyTo(i),e.components.forEach((o,s)=>{const a=ce(o,t,n,r);a.dataset.mrComponentIndex=String(s),i.appendChild(a)}),i}function et(e,t,n={}){const r=n.dpi??96;O.reportOutputDiagnostics(e,"dom",n);const i=t.createElement("div");return i.className=S("root",n),T("block").applyTo(i),i.dataset.schemaVersion=e.schemaVersion,e.pages.forEach(o=>{i.appendChild(xe(o,r,n,t))}),i}function L(e){if(e?.aborted)throw e.reason??new DOMException("The operation was aborted.","AbortError")}const tt=(e,t)=>(L(t),/^data:image\/(?:png|jpe?g|webp|gif|svg\+xml)[;,]/i.test(e)?new Promise((n,r)=>{const i=new Image,o=()=>{i.onload=null,i.onerror=null,t?.removeEventListener("abort",s)},s=()=>{o(),i.src="",r(t?.reason??new DOMException("The operation was aborted.","AbortError"))};i.onload=()=>{o(),n(i)},i.onerror=()=>{o(),r(new Error("Image could not be decoded for Canvas output."))},t?.addEventListener("abort",s,{once:!0}),i.src=e}):Promise.reject(new TypeError("Canvas imageData must be an image data URL; provide imageLoader for other sources.")));function nt(e,t,n){return L(n),n?new Promise((r,i)=>{const o=()=>i(n.reason??new DOMException("The operation was aborted.","AbortError"));n.addEventListener("abort",o,{once:!0}),Promise.resolve().then(()=>e(t,n)).then(r,i).finally(()=>n.removeEventListener("abort",o))}):e(t)}async function rt(e,t,n){const r=new Map;for(const i of e.components)!W.isImageBackedComponent(i)||r.has(i.imageData)||r.set(i.imageData,await nt(t,i.imageData,n));return L(n),r}function it(e,t,n,r,i,o){const s=t,a=s.naturalWidth??s.width??i,l=s.naturalHeight??s.height??o;if(a<=0||l<=0)throw new RangeError("Decoded Canvas image dimensions must be positive.");const c=Math.min(i/a,o/l),d=a*c,m=l*c;e.drawImage(t,n+(i-d)/2,r+(o-m)/2,d,m)}function Re(e){return We.createPageWindowIndex(e.pageHeightsPx,e.gapPx).window(e.viewportHeightPx,e.scrollTopPx,e.overscan)}const de=96/25.4;function ne(e,t=96){const n=t/96*de;return{widthPx:Math.max(1,Math.round(e.pageWidthMm*n)),heightPx:Math.max(1,Math.round(e.pageHeightMm*n))}}function Se(e,t,n,r=64e6){if(!Number.isFinite(t)||t<=0||!Number.isFinite(n)||n<=0)throw new RangeError("Canvas dpr and dpi must be positive finite numbers.");if(!Number.isFinite(r)||r<=0)throw new RangeError("maxCanvasPixels must be positive and finite.");const i=ne(e,n),o=Math.round(i.widthPx*t),s=Math.round(i.heightPx*t);if(!Number.isSafeInteger(o)||!Number.isSafeInteger(s)||o*s>r)throw new RangeError("Canvas page exceeds maxCanvasPixels; reduce resolution or split the report.");return{width:o,height:s}}function Ce(e,t,n,r){const i=document.createElement("canvas"),{widthPx:o,heightPx:s}=ne(e,n),a=Se(e,t,n,r);i.width=a.width,i.height=a.height,i.style.width=`${o}px`,i.style.height=`${s}px`;const l=i.getContext("2d");if(!l)throw new Error("当前环境不支持 Canvas 2D(测试需真浏览器,见 e2e/canvas.spec.ts)");return l.scale(t,t),l.fillStyle="#ffffff",l.fillRect(0,0,o,s),{canvas:i,ctx:l}}function ot(e,t=96){return u.resolveFontSize(e,t).fontSizePx}function Pe(e,t,n,r,i,o,s,a="top"){e.font=`${t.italic?"italic ":""}${t.bold?"bold ":""}${t.fontSizePx}px ${s}`,"letterSpacing"in e&&(e.letterSpacing="0px"),e.fillStyle=t.color,e.textBaseline="alphabetic";const l=t.fontSizePx*t.lineHeight,c=t.text===""?[""]:t.text.split(`
|
|
2
|
+
`),d=c.length*l;let m=r;a==="middle"?m=r+(o-d)/2:a==="bottom"&&(m=r+o-d),c.forEach((h,g)=>{at(e,h,t,n,m+g*l+t.fontSizePx*.8,i)}),e.textAlign="left"}function at(e,t,n,r,i,o){const s=Array.from(t),a=n.letterSpacingPx??0;if(!a){e.textAlign=n.align==="center"?"center":n.align==="right"?"right":"left";const m=n.align==="center"?r+o/2:n.align==="right"?r+o:r;e.fillText(t,m,i);return}const l=e.measureText(t).width+Math.max(0,s.length-1)*a,c=n.align==="center"?r+(o-l)/2:n.align==="right"?r+o-l:r;e.textAlign="left";let d="";s.forEach((m,h)=>{e.fillText(m,c+e.measureText(d).width+h*a,i),d+=m})}function st(e,t,n,r,i,o,s){for(const a of j.resolveGridStrokes(t,n))e.strokeStyle=a.color,e.lineWidth=u.ptToPx(a.widthPt,s),e.beginPath(),a.kind==="v"?(e.moveTo(r+a.pos*o,i+a.from*o),e.lineTo(r+a.pos*o,i+a.to*o)):(e.moveTo(r+a.from*o,i+a.pos*o),e.lineTo(r+a.to*o,i+a.pos*o)),e.stroke()}function lt(e,t,n,r,i,o){e.beginPath(),t.top&&(e.moveTo(n,r),e.lineTo(n+i,r)),t.right&&(e.moveTo(n+i,r),e.lineTo(n+i,r+o)),t.bottom&&(e.moveTo(n+i,r+o),e.lineTo(n,r+o)),t.left&&(e.moveTo(n,r+o),e.lineTo(n,r)),e.stroke()}function ct(e,t,n,r,i,o,s,a,l,c,d){const m=se.resolveGridLayout(t,o/a,s/a);for(const g of m.cells){const w=g.cell.style?.backgroundColor??n.style?.backgroundColor;w&&(e.fillStyle=w,e.fillRect(r+g.xMm*a,i+g.yMm*a,g.widthMm*a,g.heightMm*a))}st(e,m,n,r,i,a,l);const h=t.paddingMm??.5;for(const g of m.cells){const w=g.cell.text??"";if(!w)continue;const b=u.mergeComponentStyles(n.style,g.cell.style),_=u.resolveFontSize(b,l),A=g.cell.indentMm??0,C=Math.max(0,g.widthMm-2*h-A),D=$.wrapText(w,C,{fontSizePt:_.fontSizePt,bold:b.bold,italic:b.italic,fontFamily:b.fontFamily??c,letterSpacingPt:b.letterSpacing},d).join(`
|
|
3
|
+
`);Pe(e,{text:D,fontSizePx:_.fontSizePx,bold:b.bold??!1,italic:b.italic,color:u.resolveTextColor(b,I.DEFAULT_TEXT_COLOR),align:b.align??"left",lineHeight:u.resolveLineHeight(b),letterSpacingPx:u.ptToPx(b.letterSpacing??0,l)},r+(g.xMm+h+A)*a,i+(g.yMm+h)*a,C*a,Math.max(0,g.heightMm-2*h)*a,b.fontFamily??c,b.verticalAlign??"middle")}}function dt(e,t,n,r,i,o,s,a,l){const c=t.style??{},d=u.resolveFontSize(c,s),m=W.isRichText(t)?t.richParagraphs.map(h=>h.segments.map(g=>g.text??g.field??"").join("")).join(`
|
|
4
4
|
`):t.lines?.length?t.lines.join(`
|
|
5
|
-
`):$.wrapText(t.text??"",t.widthMm,{fontSizePt:d.fontSizePt,bold:c.bold,italic:c.italic,fontFamily:c.fontFamily??
|
|
6
|
-
`);Ce(e,{text:m,fontSizePx:d.fontSizePx,bold:c.bold??!1,italic:c.italic,color:u.resolveTextColor(c),align:c.align??"left",lineHeight:u.resolveLineHeight(c),letterSpacingPx:u.ptToPx(c.letterSpacing??0,s)},n,r,i,a,c.fontFamily??o,c.verticalAlign)}function de(e,t,n,r,i,a,s){const o=t.leftMm*n,l=t.topMm*n,c=t.widthMm*n,d=t.heightMm*n,m=t.style??{};if(B.isImageBackedComponent(t)){const h=s?.get(t.imageData);h?nt(e,h,o,l,c,d):we(e,t,o,l,c,d);return}if(t.grid){st(e,t.grid,t,o,l,c,d,n,r,i,a);return}switch(t.kind){case"text":{lt(e,t,o,l,c,d,r,i,a);break}case"rect":{const h=u.resolveStroke(m),g=u.resolveBoxBorders(m);m.backgroundColor&&(e.fillStyle=m.backgroundColor,e.fillRect(o,l,c,d)),g.inner&&(e.strokeStyle=h.color,e.lineWidth=u.ptToPx(h.widthPt,r),at(e,g,o,l,c,d));break}case"line":{const h=u.resolveStroke({...m,borderColor:m.lineColor??m.borderColor});e.strokeStyle=h.color,e.lineWidth=u.ptToPx(h.widthPt,r),e.beginPath();const g=t.lineDirection==="up"?l+d:t.lineDirection==="down"?l:l+d/2,w=t.lineDirection==="up"?l:t.lineDirection==="down"?l+d:l+d/2;e.moveTo(o,g),e.lineTo(o+c,w),e.stroke();break}case"ellipse":{const h=u.resolveStroke(m);e.strokeStyle=h.color,e.lineWidth=u.ptToPx(h.widthPt,r),m.backgroundColor&&(e.fillStyle=m.backgroundColor,e.beginPath(),e.ellipse(o+c/2,l+d/2,c/2,d/2,0,0,Math.PI*2),e.fill()),e.beginPath(),e.ellipse(o+c/2,l+d/2,c/2,d/2,0,0,Math.PI*2),e.stroke();break}default:we(e,t,o,l,c,d);break}}function we(e,t,n,r,i,a){e.save(),e.strokeStyle="#94a3b8",e.strokeRect(n,r,i,a),e.fillStyle="#64748b",e.font="12px sans-serif",e.fillText(t.fallbackText??`[${t.kind}]`,n+3,r+14),e.restore()}async function ct(e,t={}){if(typeof document>"u")throw new Error("renderPlanToImages 需要浏览器环境(SSR/Node 请在客户端钩子中调用)");const{format:n="png",quality:r=.92,...i}=t;if(n!=="png"&&n!=="jpeg")throw new TypeError("Image format must be png or jpeg.");if(!Number.isFinite(r)||r<0||r>1)throw new RangeError("Image quality must be between 0 and 1.");k(t.signal);const a=await W.resolvePlanAssets(e,{...t,format:"canvas"});e=a.plan;const s=[...a.diagnostics,...D.reportOutputDiagnostics(e,"canvas",t)],o=n==="jpeg"?"image/jpeg":"image/png",l=[],c=Math.min(e.pages.length-1,t.end??e.pages.length-1);for(let d=Math.max(0,t.start??0);d<=c;d++){k(t.signal);const m=await Re(e.pages[d],d,i,s);try{l.push(await dt(m,o,r,t.signal))}finally{m.width=0,m.height=0}await He.outputCheckpoint(t,l.length,c-Math.max(0,t.start??0)+1)}return k(t.signal),{blobs:l,diagnostics:s}}function dt(e,t,n,r){return k(r),new Promise((i,a)=>{const s=()=>a(r?.reason??new DOMException("The operation was aborted.","AbortError"));r?.addEventListener("abort",s,{once:!0});try{e.toBlob(o=>{r?.removeEventListener("abort",s),o?i(o):a(new Error("Canvas encoding failed; no empty image was emitted."))},t,n)}catch(o){r?.removeEventListener("abort",s),a(o)}})}function mt(e,t={}){if(k(t.signal),typeof document>"u")throw new Error("renderPlanToCanvas 需要浏览器环境(SSR 请在客户端钩子中调用)");const n=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),r=t.dpi??96,i=r/96*ce,a=t.fontFamily??I.DEFAULT_FONT_FAMILY,s=t.measurer??$.heuristicMeasurer,o=Math.max(0,t.start??0),l=Math.min(e.pages.length-1,t.end??e.pages.length-1),c=[],d=D.reportOutputDiagnostics(e,"canvas",t),m=ut(e,o,l);for(const h of m)D.notifyOutputDiagnostic(h,t),d.push(h);if(t.fidelity==="strict"&&m.length)throw new D.OutputFidelityError(d);for(let h=o;h<=l;h++){k(t.signal);const g=e.pages[h],{canvas:w,ctx:y}=Se(g,n,r,t.maxCanvasPixels);for(const O of g.components)de(y,O,i,r,a,s);c.push(w)}return{canvases:c,diagnostics:d}}function ut(e,t,n){return n<t?[]:e.pages.slice(t,n+1).flatMap((r,i)=>r.components.flatMap((a,s)=>B.isImageBackedComponent(a)?[{code:"async-image-required",severity:"warning",format:"canvas",pageIndex:t+i,componentIndex:s,kind:a.kind,nid:a.nid,message:"Use renderPlanToCanvasAsync or renderPlanToImages to decode and include images."}]:[]))}async function ht(e,t={}){if(typeof document>"u")throw new Error("renderPlanToCanvasAsync 需要浏览器环境(Node 请使用 PDF 或 XLSX 输出)");k(t.signal);const n=await W.resolvePlanAssets(e,{...t,format:"canvas"});e=n.plan;const r=[...n.diagnostics,...D.reportOutputDiagnostics(e,"canvas",t)],i=[],a=Math.min(e.pages.length-1,t.end??e.pages.length-1);for(let s=Math.max(0,t.start??0);s<=a;s++)i.push(await Re(e.pages[s],s,t,r));return{canvases:i,diagnostics:r}}async function Re(e,t,n,r){const i=n.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),a=n.dpi??96,s=n.fontFamily??I.DEFAULT_FONT_FAMILY,o=await Pe(e,t,n,r);k(n.signal);const{canvas:l,ctx:c}=Se(e,i,a,n.maxCanvasPixels);for(const d of e.components)de(c,d,a/25.4,a,s,n.measurer??$.heuristicMeasurer,o);return l}async function Pe(e,t,n,r){const i=n.imageLoader??Qe;return tt(e,async(a,s)=>{try{return await i(a,s)}catch(o){if(s?.aborted)throw o;const l=e.components.findIndex(m=>m.imageData===a),c=e.components[l],d={code:"image-decode-failed",severity:"warning",format:"canvas",pageIndex:t,componentIndex:l,kind:c.kind,nid:c.nid,message:"Image decoding failed; raster output was cancelled instead of omitting the image."};throw r.push(d),D.notifyOutputDiagnostic(d,n),o}},n.signal)}function gt(e,t={}){const n=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),r=t.dpi??96,i=r/96*ce,a=t.fontFamily??I.DEFAULT_FONT_FAMILY,s=t.measurer??$.heuristicMeasurer,o=t.overscan??1,l=t.gapPx??18,c=t.pagesPerFrame??1,d=e.pages.map(f=>f.pageHeightMm*i),m=Math.max(1,...e.pages.map(f=>f.pageWidthMm*i)),h={start:0,end:-1};let g=null,w=null,y=null,O=null,R=[],P=0,H=[],X=0,G=new AbortController;const he=[];function De(){const f=g;f.innerHTML="",w=document.createElement("div"),w.style.cssText=`width:${m}px;margin:0 auto;`,y=document.createElement("div"),O=document.createElement("div"),w.appendChild(y),R=[];const x=Math.min(e.pages.length,3+o*2);for(let z=0;z<x;z++){const M=document.createElement("div");M.style.cssText=`margin:0 auto ${l}px;box-shadow:0 2px 8px rgba(0,0,0,.35);background:#fff;`,w.appendChild(M),R.push(M)}w.appendChild(O),f.appendChild(w)}async function $e(f,x){const z=X,M=await W.resolvePlanAssets(e,{...t,signal:G.signal,format:"canvas",start:x,end:x});he.push(...M.diagnostics);const C=M.plan.pages[x],J=await Pe(C,x,{...t,signal:G.signal},he);if(z!==X||!g)return;const{widthPx:ie,heightPx:oe}=ne(C,r);let _=f.firstElementChild;(!_||_.tagName!=="CANVAS")&&(_=document.createElement("canvas"),f.innerHTML="",f.appendChild(_));const fe=Te(C,n,r,t.maxCanvasPixels);_.width=fe.width,_.height=fe.height,_.style.width=`${ie}px`,_.style.height=`${oe}px`;const q=_.getContext("2d");if(q){q.setTransform(1,0,0,1,0,0),q.scale(n,n),q.fillStyle="#ffffff",q.fillRect(0,0,ie,oe);for(const _e of C.components)de(q,_e,i,r,a,s,J);_.dataset.canvasPage=String(x),f.style.height=`${oe}px`,f.style.width=`${ie}px`}}function Oe(f){X++,h.start=f.start,h.end=f.end,y.style.height=`${f.start*l+d.slice(0,f.start).reduce((M,C)=>M+C,0)}px`;const x=e.pages.length-1-f.end;O.style.height=`${x*l+d.slice(f.end+1).reduce((M,C)=>M+C,0)}px`;const z=f.end-f.start+1;R.forEach((M,C)=>{if(C<z){M.style.display="";const J=f.start+C;M.style.height=`${d[J]??0}px`}else M.style.display="none"}),H=[];for(let M=f.start;M<=f.end;M++){const C=R[M-f.start];if(!C)continue;C.firstElementChild?.dataset?.canvasPage!==String(M)&&H.push(M)}re()}function re(){P||H.length===0||(P=requestAnimationFrame(()=>{P=0;let f=Math.max(1,c);for(;H.length>0&&f-- >0;){const x=H.shift(),z=R[x-h.start];z&&$e(z,x).catch(()=>{})}H.length>0&&re()}))}function K(){P||(P=requestAnimationFrame(()=>{P=0;const f=g,x=xe({pageHeightsPx:d,viewportHeightPx:f.clientHeight,scrollTopPx:f.scrollTop,overscan:o,gapPx:l});x.start!==h.start||x.end!==h.end?Oe(x):re()}))}let Z=null;return{attach(f){if(typeof document>"u")throw new Error("createCanvasPager 需要浏览器环境(SSR 请在客户端钩子中调用 attach)");k(t.signal),G=new AbortController,t.signal?.addEventListener("abort",ge,{once:!0}),D.reportOutputDiagnostics(e,"canvas",t),g=f,De(),f.addEventListener("scroll",K,{passive:!0}),typeof ResizeObserver<"u"&&(Z=new ResizeObserver(()=>K()),Z.observe(f)),K()},destroy(){X++,G.abort(),t.signal?.removeEventListener("abort",ge),P&&cancelAnimationFrame(P),P=0,Z?.disconnect(),Z=null,g?.removeEventListener("scroll",K),H=[],w?.remove(),g=null},window(){return{...h}}};function ge(){G.abort(t.signal?.reason)}}function me(e,t,n){let r,i;if(typeof e=="string"){const a=u.PAPER_SIZES[e];if(!a)throw new Error(`未知纸张预设 "${e}"(可用:${Object.keys(u.PAPER_SIZES).join("/")})`);r=a.widthMm,i=a.heightMm}else typeof e=="number"?(r=e,i=t??297):(r=e.widthMm,i=e.heightMm);return n?{widthMm:i,heightMm:r}:{widthMm:r,heightMm:i}}class Ae{constructor(){this.pages=[],this.pending=null,this.templateParams=void 0}params(t){return this.templateParams=t,this}page(t="a4",n={},r){this.collect();const a=r!=null&&!("margins"in r)&&!("landscape"in r)&&("marginTopMm"in r||"marginBottomMm"in r||"marginLeftMm"in r||"marginRightMm"in r)?{margins:r}:typeof n=="number"?r??{}:n,{widthMm:s,heightMm:o}=me(t,typeof n=="number"?n:void 0,a.landscape),l=a.margins??{};return this.pending=new Ie(this,{widthMm:s,heightMm:o,marginTopMm:l.marginTopMm??10,marginBottomMm:l.marginBottomMm??10,marginLeftMm:l.marginLeftMm??10,marginRightMm:l.marginRightMm??10}),this.pending}collect(){this.pending&&(this.pages.push(this.pending.buildPage()),this.pending=null)}build(){if(this.collect(),this.pages.length===0)throw new Error("模板至少需要一页:先调用 .page() 添加内容");return this.templateParams?{params:this.templateParams,pages:this.pages}:{pages:this.pages}}}class Ie{constructor(t,n){this.parent=t,this.page=n,this.components=[]}text(t,n={},r={}){return this.components.push({kind:"text",leftMm:n.leftMm??0,topMm:n.topMm??0,widthMm:n.widthMm??60,heightMm:n.heightMm??8,text:t,style:r}),this}list(t,n,r,i={}){return this.components.push({kind:"list",leftMm:n.leftMm??10,topMm:n.topMm??30,widthMm:n.widthMm??180,dataset:t,columns:r,...i}),this}rect(t,n={}){return this.components.push({kind:"rect",...t,style:n}),this}line(t,n,r,i={}){return this.components.push({kind:"line",leftMm:t,topMm:n,widthMm:r,heightMm:.5,style:i}),this}barcode(t,n){return this.components.push({kind:"barcode",leftMm:n.leftMm??0,topMm:n.topMm??0,widthMm:n.widthMm??40,heightMm:n.heightMm??12,fallbackText:t}),this}qrcode(t,n,r,i){return this.components.push({kind:"qrcode",leftMm:r,topMm:i,widthMm:n,heightMm:n,fallbackText:t}),this}buildPage(){return{...this.page,components:this.components}}done(){return this.parent}build(){return this.done().build()}}function ft(){return new Ae}function pt(e,t={}){return ae.validateDatasetRows([],e),e.fields.map(n=>({field:n.field,header:`${n.label??n.field}${n.unit?` (${n.unit})`:""}`,semanticRole:n.semanticRole??(n.type==="number"||n.type==="decimal"?"measure":n.type==="date"?"date":n.enum?"dimension":"text"),...t[n.field]}))}function L(e,t,n=!1){if(!Number.isFinite(e)||(n?e<0:e<=0))throw new Error(`${t} 必须是有限${n?"非负":"正"}数`)}function Q(e,t,n){if(e!==void 0&&!["left","center","right","justify",...n?["auto"]:[]].includes(e))throw new Error(`${t} 必须是 left/center/right/justify${n?"/auto":""}`)}function wt(e){const t=e.layout??"page";if(t!=="page"&&t!=="wide")throw new Error("layout 必须是 page 或 wide");if(t==="wide"&&(e.paper!==void 0||e.landscape!==void 0))throw new Error('宽表布局不能同时指定 paper 或 landscape;标准纸型请使用 layout: "page"');if(t!=="wide"&&e.columnWidthMm!==void 0)throw new Error('columnWidthMm 仅适用于 layout: "wide"');const n=e.columnWidthMm??30;return L(n,"columnWidthMm"),{layout:t,columnWidthMm:n}}function vt(e){const t=e.paper===void 0?"a4":e.paper;if(typeof t!="string"&&(typeof t!="object"||t===null)||e.landscape!==void 0&&typeof e.landscape!="boolean")throw new Error("paper 必须是纸张预设名或 { widthMm, heightMm } 对象,landscape 必须是布尔值");if(typeof t=="string"&&!Object.prototype.hasOwnProperty.call(u.PAPER_SIZES,t))throw new Error(`未知纸张预设 "${t}"(可用:${Object.keys(u.PAPER_SIZES).join("/")})`);const n=me(t,void 0,e.landscape),r=n.widthMm,i=n.heightMm;return L(r,"纸张 widthMm"),L(i,"纸张 heightMm"),{widthMm:r,heightMm:i}}function bt(e){if(e.margins!==void 0&&(!e.margins||typeof e.margins!="object"||Array.isArray(e.margins)))throw new Error("margins 必须是页边距对象");const t=e.margins??{},n={marginTopMm:t.marginTopMm===void 0?10:t.marginTopMm,marginBottomMm:t.marginBottomMm===void 0?10:t.marginBottomMm,marginLeftMm:t.marginLeftMm===void 0?10:t.marginLeftMm,marginRightMm:t.marginRightMm===void 0?10:t.marginRightMm};for(const[r,i]of Object.entries(n))L(i,r,!0);return n}function yt(e,t){const n=e.dataset===void 0?"detail":e.dataset;if(typeof n!="string"||!n.trim())throw new Error("dataset 必须是非空字符串");if(e.title!==void 0&&typeof e.title!="string")throw new Error("title 必须是字符串");const r=e.titleHeightMm===void 0?10:e.titleHeightMm,i=e.titleGapMm===void 0?4:e.titleGapMm;L(r,"titleHeightMm"),L(i,"titleGapMm",!0);const a=e.title!==void 0&&e.title.length>0,s=a?r+i:0;if(s>=t)throw new Error("标题高度与间距占满页面,必须为表格保留可用高度");return{dataset:n,titleHeightMm:r,hasTitle:a,titleSpaceMm:s}}function Mt(e){if(e.listOptions!==void 0&&(!e.listOptions||typeof e.listOptions!="object"||Array.isArray(e.listOptions)))throw new Error("listOptions 必须是列表配置对象");const t=e.listOptions??{};Q(t.align,"listOptions.align",!0),Q(t.headerAlign,"listOptions.headerAlign",!1);for(const n of["fontSizePt","rowHeightMm","paddingMm"]){const r=t[n];r!==void 0&&L(r,`listOptions.${n}`,n==="paddingMm")}return t}function Et(e){let t=0,n=0;for(const[r,i]of e.entries()){if(!i||typeof i.header!="string"||typeof i.field!="string"||!i.field.trim())throw new Error(`columns[${r}] 需要字符串 header 与非空 field`);Q(i.align,`columns[${r}].align`,!0),Q(i.headerAlign,`columns[${r}].headerAlign`,!1),i.flex!==void 0&&L(i.flex,`columns[${r}].flex`),i.widthMm!==void 0?(L(i.widthMm,`columns[${r}].widthMm`),t+=i.widthMm):n=Math.max(n,i.flex??1)}return{fixedWidthMm:t,maxFlex:n}}function xt(e,t,n,r){const{fixedWidthMm:i,maxFlex:a}=Et(e.columns);if(t==="page"&&i>r)throw new Error(`固定列宽 ${i}mm 超出页面可用宽度 ${r}mm`);const s=r-i;if(t==="page"&&a>0&&s<=0)throw new Error("固定列占满页面可用宽度,自动列需要正的剩余宽度");const o=a>0?e.columns.reduce((c,d)=>c+(d.widthMm===void 0?(d.flex??1)/a:0),0):0;return{columns:e.columns.map(({widthMm:c,flex:d,...m},h)=>{const g=c??(t==="wide"?n*(d??1):s*((d??1)/a)/o);return L(g,`columns[${h}] 分配后的 widthMm`),{...m,widthMm:g}}),fixedWidthMm:i,maxFlex:a}}function Tt(e){if(!e||typeof e!="object")throw new Error("标准明细模板需要 options 对象");if(!Array.isArray(e.columns)||e.columns.length===0)throw new Error("columns 至少需要一列");const{layout:t,columnWidthMm:n}=wt(e),r=vt(e);let i=r.widthMm;const a=r.heightMm,s=bt(e);let o=i-s.marginLeftMm-s.marginRightMm;const l=a-s.marginTopMm-s.marginBottomMm;if(t==="page"&&o<=0||l<=0)throw new Error("页边距占满纸张,必须保留正的可用宽度和高度");const{dataset:c,titleHeightMm:d,hasTitle:m,titleSpaceMm:h}=yt(e,l),g=Mt(e),{columns:w,fixedWidthMm:y,maxFlex:O}=xt(e,t,n,o);t==="wide"&&(o=w.reduce((P,H)=>P+H.widthMm,0),L(o,"宽表总列宽"),i=o+s.marginLeftMm+s.marginRightMm,L(i,"宽表总宽度"));const R={widthMm:i,heightMm:a,...s,components:[],...t==="wide"?{layout:t}:{}};return m&&R.components.push({kind:"text",text:e.title,leftMm:s.marginLeftMm,topMm:s.marginTopMm,widthMm:o,heightMm:d,style:{fontSize:16,bold:!0,align:"center",verticalAlign:"middle",...e.titleStyle}}),R.components.push({align:"auto",headerAlign:"center",...g,kind:"list",...t==="wide"?{layout:t}:{},...m?{title:e.title}:{},dataset:c,columns:w,leftMm:s.marginLeftMm,topMm:s.marginTopMm+h,widthMm:t==="wide"||O>0?o:y}),e.params===void 0?{pages:[R]}:{params:e.params,pages:[R]}}function St(e){return e}class F extends Error{constructor(t,n){super(n),this.code=t,this.name="ReportTemplateStoreError"}}function N(e){return JSON.parse(JSON.stringify(e))}function T(e){if(!e?.aborted)return;const t=new Error("模板操作已取消");throw t.name="AbortError",t}function ve(e){const t=e?Number(e.revision):0;if(!Number.isSafeInteger(t)||t<0||t>=Number.MAX_SAFE_INTEGER)throw new F("history","修订号无效或已达上限");return String(t+1)}function Ct(e,t={}){const n=async(s,o)=>{T(o);const l=await e.read(s,o);return T(o),l?N(l):void 0},r=async(s,o)=>{const l=await n(s,o.signal);if((l?.revision??null)!==o.expectedRevision)throw new F("conflict","模板已变化,请重新读取后提交");return l},i=async(s,o,l)=>{if(T(o.signal),!await e.compareAndSwap(s.id,o.expectedRevision,N(s),{signal:o.signal,...l?{publication:N(l)}:{}}))throw new F("conflict","模板已被其他请求更新");return N(s)},a=async(s,o,l,c)=>{if(t.beforePublish){T(l.signal);const g=await t.beforePublish({document:A.parseReportTemplate(o),previous:s.published?A.parseReportTemplate(s.published):void 0,signal:l.signal});if(!g||g.ok!==!0)throw new F("review",g?.issues?.find(w=>w.severity==="error")?.message??"模板发布检查未通过");T(l.signal)}const d=ve(s),m=A.parseReportTemplate({...o,revision:d}),h={revision:d,document:m,publishedAt:(t.now?.()??new Date).toISOString()};return c!==void 0&&(h.restoredFrom=c),i({id:s.id,revision:d,publishedRevision:d,published:m},l,h)};return{list:async s=>{T(s);const o=await e.list(s);return T(s),N(o)},get:async(s,o={})=>{const l=await n(s,o.signal),c=o.draft?l?.draft:l?.published;return c?A.parseReportTemplate(c):void 0},history:async(s,o)=>{T(o);const l=await e.history(s,o);return T(o),N(l)},saveDraft:async(s,o)=>{o={...o},T(o.signal);const l=A.parseReportTemplate(t.migrate?await t.migrate(s):s),c=await r(l.id,o),d=ve(c);return i({id:l.id,revision:d,draft:{...l,revision:d},...c?.publishedRevision?{publishedRevision:c.publishedRevision,published:c.published}:{}},o)},publish:async(s,o)=>{o={...o};const l=await r(s,o);if(!l)throw new F("missing","模板不存在");if(!l.draft)throw new F("draft","没有可发布的草稿");return a(l,l.draft,o)},rollback:async(s,o,l)=>{l={...l};const c=await r(s,l);if(!c)throw new F("missing","模板不存在");T(l.signal);const d=await e.getVersion(s,o,l.signal);if(!d)throw new F("history","历史修订不存在");return a(c,d.document,l,o)}}}function Rt(){const e=new Map,t=new Map;return{read:async(n,r)=>{T(r);const i=e.get(n);return i?N(i):void 0},list:async n=>(T(n),Array.from(e.values(),({id:r,revision:i,publishedRevision:a})=>({id:r,revision:i,...a?{publishedRevision:a}:{}}))),history:async(n,r)=>(T(r),Array.from(t.get(n)?.values()??[],i=>N(i))),getVersion:async(n,r,i)=>{T(i);const a=t.get(n)?.get(r);return a?N(a):void 0},compareAndSwap:async(n,r,i,a)=>{if(T(a.signal),(e.get(n)?.revision??null)!==r)return!1;if(i.id!==n)throw new F("history","状态 ID 与存储 ID 不一致");const s=N(i),o=a.publication;if(o){const l=t.get(n)??new Map;if(l.has(o.revision)||o.revision!==i.revision||o.document.id!==n)throw new F("history","发布修订不可覆盖,且必须与状态修订和模板 ID 一致");l.set(o.revision,N(o)),t.set(n,l)}return e.set(n,s),!0}}}function Pt(e){return e.map(t=>t.map(n=>/[\t\r\n"]/.test(n)?`"${n.replace(/"/g,'""')}"`:n).join(" ")).join(`\r
|
|
7
|
-
`)}function
|
|
8
|
-
`){
|
|
9
|
-
`&&l++;continue}if(a)throw new Error("Invalid quoted clipboard value");r+=c}if(i)throw new Error("Unclosed clipboard quote");return o(),At(n,e),n}class ke extends Error{constructor(t,n,r){const i=typeof n.label=="string"?n.label:"单元格",a={definition:`${i}的编辑器配置无效`,type:`${i}的编辑器与数据类型不一致`,required:`${i}不能为空`,min:`${i}不能小于 ${r}`,max:`${i}不能大于 ${r}`,precision:`${i}最多保留 ${r} 位小数`,length:`${i}最多允许 ${r} 个字符`,choice:`${i}请选择有效选项`,date:`${i}请输入有效日期(YYYY-MM-DD)`};super(a[t]),this.code=t,this.field=n,this.expected=r,this.name="ReportCellFieldError"}}function v(e,t,n){throw new ke(t,e,n)}function Le(e){if(typeof e!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(e)||e.startsWith("0000-"))return!1;const t=new Date(`${e}T00:00:00.000Z`);return Number.isFinite(t.getTime())&&t.toISOString().slice(0,10)===e}function kt(e){const[t="",n="0"]=String(e).toLowerCase().split("e");return Math.max(0,(t.split(".")[1]?.length??0)-Number(n))}function Lt(e,t){e.min!==void 0&&t<e.min&&v(e,"min",e.min),e.max!==void 0&&t>e.max&&v(e,"max",e.max),e.precision!==void 0&&kt(t)>e.precision&&v(e,"precision",e.precision)}function Ft(e,t){Le(t)||v(e,"date"),e.min!==void 0&&t<e.min&&v(e,"min",e.min),e.max!==void 0&&t>e.max&&v(e,"max",e.max)}function Nt(e){[e.min,e.max].some(t=>t!==void 0&&!Number.isFinite(t))&&v(e,"definition"),e.min!==void 0&&e.max!==void 0&&e.min>e.max&&v(e,"definition"),e.precision!==void 0&&(!Number.isInteger(e.precision)||e.precision<0||e.precision>15)&&v(e,"definition")}function Dt(e){[e.min,e.max].some(t=>t!==void 0&&!Le(t))&&v(e,"definition"),e.min!==void 0&&e.max!==void 0&&e.min>e.max&&v(e,"definition")}function $t(e,t){(!Array.isArray(t.options)||!t.options.length)&&v(t,"definition");const n=e.valueType==="text"?"string":e.valueType,r=new Set;for(const i of t.options)(!i||typeof i.value!==n||typeof i.value=="number"&&!Number.isFinite(i.value))&&v(t,"definition"),i.label!==void 0&&typeof i.label!="string"&&v(t,"definition"),r.has(i.value)&&v(t,"definition"),r.add(i.value)}function Ot(e){e.required!==void 0&&typeof e.required!="boolean"&&v(e,"definition"),[e.label,e.hint,e.unit].some(t=>t!==void 0&&typeof t!="string")&&v(e,"definition"),e.type==="boolean"&&[e.trueLabel,e.falseLabel].some(t=>t!==void 0&&typeof t!="string")&&v(e,"definition")}function Fe(e,t){(!t||typeof t!="object"||Array.isArray(t)||!["text","number","boolean","enum","date"].includes(t.type))&&v(t??{type:"text"},"definition"),Ot(t),(t.type==="number"||t.type==="boolean")&&e.valueType!==t.type&&v(t,"type"),(t.type==="text"||t.type==="date")&&e.valueType!=="text"&&v(t,"type"),t.type==="number"&&Nt(t),t.type==="text"&&t.maxLength!==void 0&&(!Number.isInteger(t.maxLength)||t.maxLength<0)&&v(t,"definition"),t.type==="date"&&Dt(t),t.type==="enum"&&$t(e,t)}function _t(e,t,n){if(!e.editable)throw new p.ReportCellEditError("readonly");n&&Fe(e,n);const r=p.parseReportCellInput(e,t);return n?(n.required&&typeof r=="string"&&!r.trim()&&v(n,"required"),r===null||r===""?(n.required&&v(n,"required"),r):(n.type==="number"&&Lt(n,r),n.type==="date"&&Ft(n,r),n.type==="text"&&n.maxLength!==void 0&&[...String(r)].length>n.maxLength&&v(n,"length",n.maxLength),n.type==="enum"&&!n.options.some(i=>Object.is(i.value,r))&&v(n,"choice"),r)):r}class b extends Error{constructor(t){super(`Report calculation: ${t}`),this.code=t,this.name="ReportCalculationError"}}function j(e){if(!e?.aborted)return;const t=new Error("Calculation cancelled");throw t.name="AbortError",t}async function ee(e,t=1){const n=Math.floor(e.scanned/2048);if(e.scanned+=t,e.scanned>e.maxScanned)throw new b("limit");j(e.signal),Math.floor(e.scanned/2048)>n&&(await e.yieldToHost(),j(e.signal))}function ue(e){return e.table?.role==="header"?-Math.max(1,e.grid?.cells.length??1):e.table?.rowIndex??0}function be(e,t,n){if(![t.pageIndex,t.componentIndex,t.rowIndex,t.columnIndex].every(o=>Number.isSafeInteger(o)&&o>=0))throw new b("selection");const r=e.pages[t.pageIndex]?.components[t.componentIndex];if(!r?.grid||t.rowIndex>=r.grid.cells.length)throw new b("selection");const i=r.grid.colWidthsMm?.length??r.grid.cells.reduce((o,l)=>Math.max(o,l.length),1);if(t.columnIndex>=i)throw new b("selection");const a=r.table,s=e.pages[n.pageIndex]?.components[n.componentIndex]?.table;if(a&&s&&a.id===s.id){const o=s.columnKeys.indexOf(a.columnKeys[t.columnIndex]??"");if(o<0)throw new b("selection");return{grid:a.id,row:ue(r)+t.rowIndex,column:o}}return{grid:`${t.pageIndex}:${t.componentIndex}`,row:t.rowIndex,column:t.columnIndex}}function Ht(e,t,n){const r=be(e,t.anchor,t.anchor),i=be(e,t.focus,t.anchor);if(r.grid!==i.grid)throw new b("selection");const a=(Math.abs(r.row-i.row)+1)*(Math.abs(r.column-i.column)+1);if(!Number.isSafeInteger(a)||a>n)throw new b("limit");return{grid:r.grid,rowStart:Math.min(r.row,i.row),rowEnd:Math.max(r.row,i.row),columnStart:Math.min(r.column,i.column),columnEnd:Math.max(r.column,i.column),origin:e.pages[t.anchor.pageIndex].components[t.anchor.componentIndex].table}}function zt(e){if(!e)return!1;const t=e.replace(/"[^"]*"|\\.|\[(?![hms]+\])[^\]]*\]/gi,"");return/[ymdhs]/i.test(t)}function Bt(e){if(e.valueType==="text"||e.valueType==="boolean"||zt(e.numberFormat))return null;const t=e.value;if(typeof t!="number"||!Number.isFinite(t))return null;if(Number.isInteger(t)&&!Number.isSafeInteger(t))throw new b("precision");return t}function Wt(e,t,n){if(e.seen.has(n))return;e.seen.add(n),e.selected++;const r=t?Bt(t):null;r===null?e.excluded++:e.values.push(r)}function qt(e,t,n,r){return r.origin?e.table?.id===r.origin.id:`${t}:${n}`===r.grid}function jt(e,t,n){return n.origin?n.origin.columnKeys.indexOf(e.table.columnKeys[t]??""):t}function Ut(e,t,n,r){const i=r.origin?ue(e)+t:t,a=jt(e,n,r);return i<r.rowStart||i>r.rowEnd||a<r.columnStart||a>r.columnEnd?null:`${r.grid}:${i}:${a}`}function Gt(e,t){const n=t.origin?ue(e):0,r=Math.max(0,t.rowStart-n),i=Math.min(e.grid.cells.length,t.rowEnd-n+1);return i>r?i:0}async function Vt(e,t,n,r,i){const a=e.grid;if(t>r.maxScanned)throw new b("limit");const s=a.colWidthsMm?.length??a.cells.reduce((l,c)=>Math.max(l,c.length),1);if(s>r.maxScanned)throw new b("limit");const o=new Map;for(let l=0;l<t;l++){l>0&&l%2048===0&&(await r.yieldToHost(),j(r.signal));let c=0;for(const d of a.cells[l]){for(await ee(r);c<s&&(o.get(c)??0)>l;)c++;if(c>=s)break;const m=Math.max(1,Math.min(d?.colSpan??1,s-c)),h=Math.min(a.cells.length,l+Math.max(1,d?.rowSpan??1));m>1&&await ee(r,m-1);for(let w=c;w<c+m;w++)o.set(w,h);const g=Ut(e,l,c,n);g&&Wt(i,d,g),c+=m}}}async function Yt(e,t,n){const r={values:[],seen:new Set,excluded:0,selected:0};for(let i=0;i<e.pages.length;i++){await ee(n);const a=e.pages[i];for(let s=0;s<a.components.length;s++){await ee(n);const o=a.components[s];if(!o.grid||!qt(o,i,s,t)||o.table&&o.table.role!=="body")continue;const l=Gt(o,t);l&&await Vt(o,l,t,n,r)}}return r}function V(e){if(!Number.isFinite(e))throw new b("overflow");return e}function Xt(e){let t=0,n=0;for(const r of e){const i=r-n,a=V(t+i);n=a-t-i,t=a}return t}async function ye(e,t){let n=[...e],r=new Array(e.length);for(let a=1;a<e.length;a*=2){for(let s=0;s<e.length;s+=a*2){const o=Math.min(s+a,e.length),l=Math.min(s+a*2,e.length);let c=s,d=o;for(let m=s;m<l;m++)r[m]=d>=l||c<o&&n[c]<=n[d]?n[c++]:n[d++],m%2048===0&&(await t.yieldToHost(),j(t.signal))}[n,r]=[r,n]}const i=Math.floor(n.length/2);return n.length%2?n[i]:V(n[i-1]/2+n[i]/2)}function Kt(e){const t=Xt(e);let n=1/0,r=-1/0;for(const i of e)n=Math.min(n,i),r=Math.max(r,i);return{SUM:t,AVERAGE:t/e.length,AVG:t/e.length,MIN:n,MAX:r,COUNT:e.length}}function Ne(e,t){if(typeof e!="string"||e.length>256)throw new b("expression");const n=e.toUpperCase().match(/(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?|[A-Z_]+|[()+\-*/]|\S/g)??[];if(!n.length||n.length>64)throw new b("expression");let r=0;function i(o){if(o>16)throw new b("expression");const l=n[r++];if(l==="+"||l==="-")return(l==="-"?-1:1)*i(o+1);if(l==="("){const c=a(0,o+1);if(n[r++]!==")")throw new b("expression");return c}if(l&&/^(?:SUM|AVERAGE|AVG|MIN|MAX|COUNT|MEDIAN)$/.test(l)&&Object.prototype.hasOwnProperty.call(t,l))return V(t[l]);if(l&&/^(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?$/.test(l))return V(Number(l));throw new b("expression")}function a(o,l){let c=i(l);for(;r<n.length;){const d=n[r],m=d==="+"||d==="-"?1:d==="*"||d==="/"?2:0;if(!m||m<o)break;r++;const h=a(m+1,l+1);if(d==="/"&&h===0)throw new b("division");c=V(d==="+"?c+h:d==="-"?c-h:d==="*"?c*h:c/h)}return c}const s=a(1,0);if(r!==n.length)throw new b("expression");return s}function Zt(e){const t=e.maxCells??1e5,n=e.maxScannedCells??2e5,r=e.precision??2;if(![t,n].every(i=>Number.isSafeInteger(i)&&i>=1&&i<=2e6))throw new b("limit");if(!Number.isInteger(r)||r<0||r>12)throw new b("precision");return{maxCells:t,maxScanned:n,precision:r}}async function Jt(e,t,n={}){const r=Zt(n),i={scanned:0,maxScanned:r.maxScanned,signal:n.signal,yieldToHost:n.yieldToHost??(()=>new Promise(l=>setTimeout(l,0)))};j(i.signal);const a=await Yt(e,Ht(e,t,r.maxCells),i),s=n.operation??"sum";if(!["sum","average","min","max","count","median","expression"].includes(s))throw new b("expression");let o=null;if(s==="count")o=a.values.length;else if(a.values.length)if(s==="median")o=await ye(a.values,i);else{const l=Kt(a.values);s==="expression"?(/\bMEDIAN\b/i.test(n.expression??"")&&(l.MEDIAN=await ye(a.values,i)),o=Ne(n.expression??"",l)):o=l[s.toUpperCase()]}if(j(i.signal),o!==null&&Number.isInteger(o)&&!Number.isSafeInteger(o))throw new b("precision");return{value:o,formatted:o===null?"—":o.toFixed(r.precision),numericCells:a.values.length,excludedCells:a.excluded,selectedCells:a.selected,precision:r.precision}}exports.DEFAULT_BORDER_PT=I.DEFAULT_BORDER_PT;exports.DEFAULT_FONT_FAMILY=I.DEFAULT_FONT_FAMILY;exports.DEFAULT_FONT_PT=I.DEFAULT_FONT_PT;exports.DEFAULT_STROKE_COLOR=I.DEFAULT_STROKE_COLOR;exports.DEFAULT_TEXT_COLOR=I.DEFAULT_TEXT_COLOR;exports.LINE_HEIGHT=I.LINE_HEIGHT;exports.SCHEMA_VERSION_MACH=I.SCHEMA_VERSION_MACH;exports.evalStyleRule=Y.evalStyleRule;exports.formatValue=Y.formatValue;exports.parseDateLocal=Y.parseDateLocal;exports.toExcelNumberFormat=Y.toExcelNumberFormat;exports.toNumber=Y.toNumber;exports.CSS_DPI=u.CSS_DPI;exports.MM_PER_INCH=u.MM_PER_INCH;exports.PAPER_SIZES=u.PAPER_SIZES;exports.mergeComponentStyles=u.mergeComponentStyles;exports.mmToPx=u.mmToPx;exports.mmToPxFactor=u.mmToPxFactor;exports.ptToPx=u.ptToPx;exports.pxToMm=u.pxToMm;exports.resolveBoxBorders=u.resolveBoxBorders;exports.resolveFontSize=u.resolveFontSize;exports.resolveLineHeight=u.resolveLineHeight;exports.resolveStroke=u.resolveStroke;exports.resolveTextColor=u.resolveTextColor;exports.round=u.round;exports.RENDER_PLAN_SCHEMA_VERSION=B.RENDER_PLAN_SCHEMA_VERSION;exports.isImageBackedComponent=B.isImageBackedComponent;exports.isRichText=B.isRichText;exports.assertRenderPlan=te.assertRenderPlan;exports.validateComponent=te.validateComponent;exports.validatePage=te.validatePage;exports.validateRenderPlan=te.validateRenderPlan;exports.datasetJsonSchema=ae.datasetJsonSchema;exports.validateDatasetRows=ae.validateDatasetRows;exports.charWidthEm=$.charWidthEm;exports.createCanvasMeasurer=$.createCanvasMeasurer;exports.createHeuristicMeasurer=$.createHeuristicMeasurer;exports.heuristicMeasurer=$.heuristicMeasurer;exports.measureTextMm=$.measureTextMm;exports.wrapText=$.wrapText;exports.PaginateCellLimitError=p.PaginateCellLimitError;exports.PaginatePageLimitError=p.PaginatePageLimitError;exports.ReportCellEditError=p.ReportCellEditError;exports.ReportSourceError=p.ReportSourceError;exports.applyReportCellEdit=p.applyReportCellEdit;exports.applyReportCellEditBatch=p.applyReportCellEditBatch;exports.applyReportEditResult=p.applyReportEditResult;exports.countTemplatePages=p.countTemplatePages;exports.createReportCellEdit=p.createReportCellEdit;exports.createReportCellEditBatch=p.createReportCellEditBatch;exports.createReportCellResolver=p.createReportCellResolver;exports.createReportEditSession=p.createReportEditSession;exports.createReportSource=p.createReportSource;exports.defineReport=p.defineReport;exports.diffReportTemplates=p.diffReportTemplates;exports.estimateListLayoutCells=p.estimateListLayoutCells;exports.formatReportCellEdit=p.formatReportCellEdit;exports.getReportCellContext=p.getReportCellContext;exports.getReportEditSession=p.getReportEditSession;exports.paginateTemplate=p.paginateTemplate;exports.paginateTemplatePages=p.paginateTemplatePages;exports.parseReportCellInput=p.parseReportCellInput;exports.projectListColumns=p.projectListColumns;exports.registerReportEditSession=p.registerReportEditSession;exports.relocateReportCellEdits=p.relocateReportCellEdits;exports.reportCellEditKey=p.reportCellEditKey;exports.reviewReportTemplate=p.reviewReportTemplate;exports.summarizeReportCellEdits=p.summarizeReportCellEdits;exports.resolveGridLayout=se.resolveGridLayout;exports.OutputAssetError=W.OutputAssetError;exports.resolvePlanAssets=W.resolvePlanAssets;exports.OutputFidelityError=D.OutputFidelityError;exports.inspectOutputCapabilities=D.inspectOutputCapabilities;exports.reportOutputDiagnostics=D.reportOutputDiagnostics;exports.REPORT_TEMPLATE_DOCUMENT_VERSION=A.REPORT_TEMPLATE_DOCUMENT_VERSION;exports.ReportTemplateError=A.ReportTemplateError;exports.createTemplateRegistry=A.createTemplateRegistry;exports.defineReportTemplate=A.defineReportTemplate;exports.parseReportTemplate=A.parseReportTemplate;exports.serializeReportTemplate=A.serializeReportTemplate;exports.validateReportTemplate=A.validateReportTemplate;exports.validateReportTemplateDocument=A.validateReportTemplateDocument;exports.ReportParamValidationError=U.ReportParamValidationError;exports.assertReportParams=U.assertReportParams;exports.isReportDate=U.isReportDate;exports.reportParamsJsonSchema=U.reportParamsJsonSchema;exports.validateReportParamDefinitions=U.validateReportParamDefinitions;exports.validateReportParams=U.validateReportParams;exports.PageBuilder=Ie;exports.ReportCalculationError=b;exports.ReportCellFieldError=ke;exports.ReportTemplateStoreError=F;exports.TemplateBuilder=Ae;exports.calculateReportSelection=Jt;exports.classOf=S;exports.columnsFromContract=pt;exports.computePageWindow=xe;exports.createCanvasPager=gt;exports.createMemoryTemplateStore=Rt;exports.createProviderReport=St;exports.createTableTemplate=Tt;exports.createTemplate=ft;exports.createTemplateManager=Ct;exports.evaluateReportAggregateExpression=Ne;exports.formatReportClipboard=Pt;exports.measurePageSizePx=ne;exports.parseReportCellFieldInput=_t;exports.parseReportClipboard=It;exports.planFontSizePx=rt;exports.renderComponent=le;exports.renderPage=Ee;exports.renderPlan=Je;exports.renderPlanToCanvas=mt;exports.renderPlanToCanvasAsync=ht;exports.renderPlanToImages=ct;exports.resolvePaper=me;exports.validateReportCellFieldDefinition=Fe;
|
|
5
|
+
`):$.wrapText(t.text??"",t.widthMm,{fontSizePt:d.fontSizePt,bold:c.bold,italic:c.italic,fontFamily:c.fontFamily??a,letterSpacingPt:c.letterSpacing},l).join(`
|
|
6
|
+
`);Pe(e,{text:m,fontSizePx:d.fontSizePx,bold:c.bold??!1,italic:c.italic,color:u.resolveTextColor(c),align:c.align??"left",lineHeight:u.resolveLineHeight(c),letterSpacingPx:u.ptToPx(c.letterSpacing??0,s)},n,r,i,o,c.fontFamily??a,c.verticalAlign)}function me(e,t,n,r,i,o,s){const a=t.leftMm*n,l=t.topMm*n,c=t.widthMm*n,d=t.heightMm*n,m=t.style??{};if(W.isImageBackedComponent(t)){const h=s?.get(t.imageData);h?it(e,h,a,l,c,d):ve(e,t,a,l,c,d);return}if(t.grid){ct(e,t.grid,t,a,l,c,d,n,r,i,o);return}switch(t.kind){case"text":{dt(e,t,a,l,c,d,r,i,o);break}case"rect":{const h=u.resolveStroke(m),g=u.resolveBoxBorders(m);m.backgroundColor&&(e.fillStyle=m.backgroundColor,e.fillRect(a,l,c,d)),g.inner&&(e.strokeStyle=h.color,e.lineWidth=u.ptToPx(h.widthPt,r),lt(e,g,a,l,c,d));break}case"line":{const h=u.resolveStroke({...m,borderColor:m.lineColor??m.borderColor});e.strokeStyle=h.color,e.lineWidth=u.ptToPx(h.widthPt,r),e.beginPath();const g=t.lineDirection==="up"?l+d:t.lineDirection==="down"?l:l+d/2,w=t.lineDirection==="up"?l:t.lineDirection==="down"?l+d:l+d/2;e.moveTo(a,g),e.lineTo(a+c,w),e.stroke();break}case"ellipse":{const h=u.resolveStroke(m);e.strokeStyle=h.color,e.lineWidth=u.ptToPx(h.widthPt,r),m.backgroundColor&&(e.fillStyle=m.backgroundColor,e.beginPath(),e.ellipse(a+c/2,l+d/2,c/2,d/2,0,0,Math.PI*2),e.fill()),e.beginPath(),e.ellipse(a+c/2,l+d/2,c/2,d/2,0,0,Math.PI*2),e.stroke();break}default:ve(e,t,a,l,c,d);break}}function ve(e,t,n,r,i,o){e.save(),e.strokeStyle="#94a3b8",e.strokeRect(n,r,i,o),e.fillStyle="#64748b",e.font="12px sans-serif",e.fillText(t.fallbackText??`[${t.kind}]`,n+3,r+14),e.restore()}async function mt(e,t={}){if(typeof document>"u")throw new Error("renderPlanToImages 需要浏览器环境(SSR/Node 请在客户端钩子中调用)");const{format:n="png",quality:r=.92,...i}=t;if(n!=="png"&&n!=="jpeg")throw new TypeError("Image format must be png or jpeg.");if(!Number.isFinite(r)||r<0||r>1)throw new RangeError("Image quality must be between 0 and 1.");L(t.signal);const o=await j.resolvePlanAssets(e,{...t,format:"canvas"});e=o.plan;const s=[...o.diagnostics,...O.reportOutputDiagnostics(e,"canvas",t)],a=n==="jpeg"?"image/jpeg":"image/png",l=[],c=Math.min(e.pages.length-1,t.end??e.pages.length-1);for(let d=Math.max(0,t.start??0);d<=c;d++){L(t.signal);const m=await Ae(e.pages[d],d,i,s);try{l.push(await ut(m,a,r,t.signal))}finally{m.width=0,m.height=0}await Be.outputCheckpoint(t,l.length,c-Math.max(0,t.start??0)+1)}return L(t.signal),{blobs:l,diagnostics:s}}function ut(e,t,n,r){return L(r),new Promise((i,o)=>{const s=()=>o(r?.reason??new DOMException("The operation was aborted.","AbortError"));r?.addEventListener("abort",s,{once:!0});try{e.toBlob(a=>{r?.removeEventListener("abort",s),a?i(a):o(new Error("Canvas encoding failed; no empty image was emitted."))},t,n)}catch(a){r?.removeEventListener("abort",s),o(a)}})}function ht(e,t={}){if(L(t.signal),typeof document>"u")throw new Error("renderPlanToCanvas 需要浏览器环境(SSR 请在客户端钩子中调用)");const n=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),r=t.dpi??96,i=r/96*de,o=t.fontFamily??I.DEFAULT_FONT_FAMILY,s=t.measurer??$.heuristicMeasurer,a=Math.max(0,t.start??0),l=Math.min(e.pages.length-1,t.end??e.pages.length-1),c=[],d=O.reportOutputDiagnostics(e,"canvas",t),m=gt(e,a,l);for(const h of m)O.notifyOutputDiagnostic(h,t),d.push(h);if(t.fidelity==="strict"&&m.length)throw new O.OutputFidelityError(d);for(let h=a;h<=l;h++){L(t.signal);const g=e.pages[h],{canvas:w,ctx:b}=Ce(g,n,r,t.maxCanvasPixels);for(const _ of g.components)me(b,_,i,r,o,s);c.push(w)}return{canvases:c,diagnostics:d}}function gt(e,t,n){return n<t?[]:e.pages.slice(t,n+1).flatMap((r,i)=>r.components.flatMap((o,s)=>W.isImageBackedComponent(o)?[{code:"async-image-required",severity:"warning",format:"canvas",pageIndex:t+i,componentIndex:s,kind:o.kind,nid:o.nid,message:"Use renderPlanToCanvasAsync or renderPlanToImages to decode and include images."}]:[]))}async function pt(e,t={}){if(typeof document>"u")throw new Error("renderPlanToCanvasAsync 需要浏览器环境(Node 请使用 PDF 或 XLSX 输出)");L(t.signal);const n=await j.resolvePlanAssets(e,{...t,format:"canvas"});e=n.plan;const r=[...n.diagnostics,...O.reportOutputDiagnostics(e,"canvas",t)],i=[],o=Math.min(e.pages.length-1,t.end??e.pages.length-1);for(let s=Math.max(0,t.start??0);s<=o;s++)i.push(await Ae(e.pages[s],s,t,r));return{canvases:i,diagnostics:r}}async function Ae(e,t,n,r){const i=n.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),o=n.dpi??96,s=n.fontFamily??I.DEFAULT_FONT_FAMILY,a=await Ie(e,t,n,r);L(n.signal);const{canvas:l,ctx:c}=Ce(e,i,o,n.maxCanvasPixels);for(const d of e.components)me(c,d,o/25.4,o,s,n.measurer??$.heuristicMeasurer,a);return l}async function Ie(e,t,n,r){const i=n.imageLoader??tt;return rt(e,async(o,s)=>{try{return await i(o,s)}catch(a){if(s?.aborted)throw a;const l=e.components.findIndex(m=>m.imageData===o),c=e.components[l],d={code:"image-decode-failed",severity:"warning",format:"canvas",pageIndex:t,componentIndex:l,kind:c.kind,nid:c.nid,message:"Image decoding failed; raster output was cancelled instead of omitting the image."};throw r.push(d),O.notifyOutputDiagnostic(d,n),a}},n.signal)}function ft(e,t={}){const n=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),r=t.dpi??96,i=r/96*de,o=t.fontFamily??I.DEFAULT_FONT_FAMILY,s=t.measurer??$.heuristicMeasurer,a=t.overscan??1,l=t.gapPx??18,c=t.pagesPerFrame??1,d=e.pages.map(p=>p.pageHeightMm*i),m=Math.max(1,...e.pages.map(p=>p.pageWidthMm*i)),h={start:0,end:-1};let g=null,w=null,b=null,_=null,A=[],C=0,D=[],X=0,G=new AbortController;const ge=[];function $e(){const p=g;p.innerHTML="",w=document.createElement("div"),w.style.cssText=`width:${m}px;margin:0 auto;`,b=document.createElement("div"),_=document.createElement("div"),w.appendChild(b),A=[];const x=Math.min(e.pages.length,3+a*2);for(let B=0;B<x;B++){const M=document.createElement("div");M.style.cssText=`margin:0 auto ${l}px;box-shadow:0 2px 8px rgba(0,0,0,.35);background:#fff;`,w.appendChild(M),A.push(M)}w.appendChild(_),p.appendChild(w)}async function _e(p,x){const B=X,M=await j.resolvePlanAssets(e,{...t,signal:G.signal,format:"canvas",start:x,end:x});ge.push(...M.diagnostics);const P=M.plan.pages[x],Z=await Ie(P,x,{...t,signal:G.signal},ge);if(B!==X||!g)return;const{widthPx:ie,heightPx:oe}=ne(P,r);let H=p.firstElementChild;(!H||H.tagName!=="CANVAS")&&(H=document.createElement("canvas"),p.innerHTML="",p.appendChild(H));const fe=Se(P,n,r,t.maxCanvasPixels);H.width=fe.width,H.height=fe.height,H.style.width=`${ie}px`,H.style.height=`${oe}px`;const U=H.getContext("2d");if(U){U.setTransform(1,0,0,1,0,0),U.scale(n,n),U.fillStyle="#ffffff",U.fillRect(0,0,ie,oe);for(const ze of P.components)me(U,ze,i,r,o,s,Z);H.dataset.canvasPage=String(x),p.style.height=`${oe}px`,p.style.width=`${ie}px`}}function He(p){X++,h.start=p.start,h.end=p.end,b.style.height=`${p.start*l+d.slice(0,p.start).reduce((M,P)=>M+P,0)}px`;const x=e.pages.length-1-p.end;_.style.height=`${x*l+d.slice(p.end+1).reduce((M,P)=>M+P,0)}px`;const B=p.end-p.start+1;A.forEach((M,P)=>{if(P<B){M.style.display="";const Z=p.start+P;M.style.height=`${d[Z]??0}px`}else M.style.display="none"}),D=[];for(let M=p.start;M<=p.end;M++){const P=A[M-p.start];if(!P)continue;P.firstElementChild?.dataset?.canvasPage!==String(M)&&D.push(M)}re()}function re(){C||D.length===0||(C=requestAnimationFrame(()=>{C=0;let p=Math.max(1,c);for(;D.length>0&&p-- >0;){const x=D.shift(),B=A[x-h.start];B&&_e(B,x).catch(()=>{})}D.length>0&&re()}))}function K(){C||(C=requestAnimationFrame(()=>{C=0;const p=g,x=Re({pageHeightsPx:d,viewportHeightPx:p.clientHeight,scrollTopPx:p.scrollTop,overscan:a,gapPx:l});x.start!==h.start||x.end!==h.end?He(x):re()}))}let J=null;return{attach(p){if(typeof document>"u")throw new Error("createCanvasPager 需要浏览器环境(SSR 请在客户端钩子中调用 attach)");L(t.signal),G=new AbortController,t.signal?.addEventListener("abort",pe,{once:!0}),O.reportOutputDiagnostics(e,"canvas",t),g=p,$e(),p.addEventListener("scroll",K,{passive:!0}),typeof ResizeObserver<"u"&&(J=new ResizeObserver(()=>K()),J.observe(p)),K()},destroy(){X++,G.abort(),t.signal?.removeEventListener("abort",pe),C&&cancelAnimationFrame(C),C=0,J?.disconnect(),J=null,g?.removeEventListener("scroll",K),D=[],w?.remove(),g=null},window(){return{...h}}};function pe(){G.abort(t.signal?.reason)}}function ue(e,t,n){let r,i;if(typeof e=="string"){const o=u.PAPER_SIZES[e];if(!o)throw new Error(`未知纸张预设 "${e}"(可用:${Object.keys(u.PAPER_SIZES).join("/")})`);r=o.widthMm,i=o.heightMm}else typeof e=="number"?(r=e,i=t??297):(r=e.widthMm,i=e.heightMm);return n?{widthMm:i,heightMm:r}:{widthMm:r,heightMm:i}}class Le{constructor(){this.pages=[],this.pending=null,this.templateParams=void 0}params(t){return this.templateParams=t,this}page(t="a4",n={},r){this.collect();const o=r!=null&&!("margins"in r)&&!("landscape"in r)&&("marginTopMm"in r||"marginBottomMm"in r||"marginLeftMm"in r||"marginRightMm"in r)?{margins:r}:typeof n=="number"?r??{}:n,{widthMm:s,heightMm:a}=ue(t,typeof n=="number"?n:void 0,o.landscape),l=o.margins??{};return this.pending=new ke(this,{widthMm:s,heightMm:a,marginTopMm:l.marginTopMm??10,marginBottomMm:l.marginBottomMm??10,marginLeftMm:l.marginLeftMm??10,marginRightMm:l.marginRightMm??10}),this.pending}collect(){this.pending&&(this.pages.push(this.pending.buildPage()),this.pending=null)}build(){if(this.collect(),this.pages.length===0)throw new Error("模板至少需要一页:先调用 .page() 添加内容");return this.templateParams?{params:this.templateParams,pages:this.pages}:{pages:this.pages}}}class ke{constructor(t,n){this.parent=t,this.page=n,this.components=[]}text(t,n={},r={}){return this.components.push({kind:"text",leftMm:n.leftMm??0,topMm:n.topMm??0,widthMm:n.widthMm??60,heightMm:n.heightMm??8,text:t,style:r}),this}list(t,n,r,i={}){return this.components.push({kind:"list",leftMm:n.leftMm??10,topMm:n.topMm??30,widthMm:n.widthMm??180,dataset:t,columns:r,...i}),this}rect(t,n={}){return this.components.push({kind:"rect",...t,style:n}),this}line(t,n,r,i={}){return this.components.push({kind:"line",leftMm:t,topMm:n,widthMm:r,heightMm:.5,style:i}),this}barcode(t,n){return this.components.push({kind:"barcode",leftMm:n.leftMm??0,topMm:n.topMm??0,widthMm:n.widthMm??40,heightMm:n.heightMm??12,fallbackText:t}),this}qrcode(t,n,r,i){return this.components.push({kind:"qrcode",leftMm:r,topMm:i,widthMm:n,heightMm:n,fallbackText:t}),this}buildPage(){return{...this.page,components:this.components}}done(){return this.parent}build(){return this.done().build()}}function wt(){return new Le}function vt(e,t={}){return ae.validateDatasetRows([],e),e.fields.map(n=>({field:n.field,header:`${n.label??n.field}${n.unit?` (${n.unit})`:""}`,semanticRole:n.semanticRole??(n.type==="number"||n.type==="decimal"?"measure":n.type==="date"?"date":n.enum?"dimension":"text"),...t[n.field]}))}function k(e,t,n=!1){if(!Number.isFinite(e)||(n?e<0:e<=0))throw new Error(`${t} 必须是有限${n?"非负":"正"}数`)}function Q(e,t,n){if(e!==void 0&&!["left","center","right","justify",...n?["auto"]:[]].includes(e))throw new Error(`${t} 必须是 left/center/right/justify${n?"/auto":""}`)}function yt(e){const t=e.layout??"page";if(t!=="page"&&t!=="wide")throw new Error("layout 必须是 page 或 wide");if(t==="wide"&&(e.paper!==void 0||e.landscape!==void 0))throw new Error('宽表布局不能同时指定 paper 或 landscape;标准纸型请使用 layout: "page"');if(t!=="wide"&&e.columnWidthMm!==void 0)throw new Error('columnWidthMm 仅适用于 layout: "wide"');const n=e.columnWidthMm??30;return k(n,"columnWidthMm"),{layout:t,columnWidthMm:n}}function bt(e){const t=e.paper===void 0?"a4":e.paper;if(typeof t!="string"&&(typeof t!="object"||t===null)||e.landscape!==void 0&&typeof e.landscape!="boolean")throw new Error("paper 必须是纸张预设名或 { widthMm, heightMm } 对象,landscape 必须是布尔值");if(typeof t=="string"&&!Object.prototype.hasOwnProperty.call(u.PAPER_SIZES,t))throw new Error(`未知纸张预设 "${t}"(可用:${Object.keys(u.PAPER_SIZES).join("/")})`);const n=ue(t,void 0,e.landscape),r=n.widthMm,i=n.heightMm;return k(r,"纸张 widthMm"),k(i,"纸张 heightMm"),{widthMm:r,heightMm:i}}function Mt(e){if(e.margins!==void 0&&(!e.margins||typeof e.margins!="object"||Array.isArray(e.margins)))throw new Error("margins 必须是页边距对象");const t=e.margins??{},n={marginTopMm:t.marginTopMm===void 0?10:t.marginTopMm,marginBottomMm:t.marginBottomMm===void 0?10:t.marginBottomMm,marginLeftMm:t.marginLeftMm===void 0?10:t.marginLeftMm,marginRightMm:t.marginRightMm===void 0?10:t.marginRightMm};for(const[r,i]of Object.entries(n))k(i,r,!0);return n}function Et(e,t){const n=e.dataset===void 0?"detail":e.dataset;if(typeof n!="string"||!n.trim())throw new Error("dataset 必须是非空字符串");if(e.title!==void 0&&typeof e.title!="string")throw new Error("title 必须是字符串");const r=e.titleHeightMm===void 0?10:e.titleHeightMm,i=e.titleGapMm===void 0?4:e.titleGapMm;k(r,"titleHeightMm"),k(i,"titleGapMm",!0);const o=e.title!==void 0&&e.title.length>0,s=o?r+i:0;if(s>=t)throw new Error("标题高度与间距占满页面,必须为表格保留可用高度");return{dataset:n,titleHeightMm:r,hasTitle:o,titleSpaceMm:s}}function Tt(e){if(e.listOptions!==void 0&&(!e.listOptions||typeof e.listOptions!="object"||Array.isArray(e.listOptions)))throw new Error("listOptions 必须是列表配置对象");const t=e.listOptions??{};Q(t.align,"listOptions.align",!0),Q(t.headerAlign,"listOptions.headerAlign",!1);for(const n of["fontSizePt","rowHeightMm","paddingMm"]){const r=t[n];r!==void 0&&k(r,`listOptions.${n}`,n==="paddingMm")}return t}function xt(e){let t=0,n=0;for(const[r,i]of e.entries()){if(!i||typeof i.header!="string"||typeof i.field!="string"||!i.field.trim())throw new Error(`columns[${r}] 需要字符串 header 与非空 field`);Q(i.align,`columns[${r}].align`,!0),Q(i.headerAlign,`columns[${r}].headerAlign`,!1),i.flex!==void 0&&k(i.flex,`columns[${r}].flex`),i.widthMm!==void 0?(k(i.widthMm,`columns[${r}].widthMm`),t+=i.widthMm):n=Math.max(n,i.flex??1)}return{fixedWidthMm:t,maxFlex:n}}function Rt(e,t,n,r){const{fixedWidthMm:i,maxFlex:o}=xt(e.columns);if(t==="page"&&i>r)throw new Error(`固定列宽 ${i}mm 超出页面可用宽度 ${r}mm`);const s=r-i;if(t==="page"&&o>0&&s<=0)throw new Error("固定列占满页面可用宽度,自动列需要正的剩余宽度");const a=o>0?e.columns.reduce((c,d)=>c+(d.widthMm===void 0?(d.flex??1)/o:0),0):0;return{columns:e.columns.map(({widthMm:c,flex:d,...m},h)=>{const g=c??(t==="wide"?n*(d??1):s*((d??1)/o)/a);return k(g,`columns[${h}] 分配后的 widthMm`),{...m,widthMm:g}}),fixedWidthMm:i,maxFlex:o}}function St(e){if(!e||typeof e!="object")throw new Error("标准明细模板需要 options 对象");if(!Array.isArray(e.columns)||e.columns.length===0)throw new Error("columns 至少需要一列");const{layout:t,columnWidthMm:n}=yt(e),r=bt(e);let i=r.widthMm;const o=r.heightMm,s=Mt(e);let a=i-s.marginLeftMm-s.marginRightMm;const l=o-s.marginTopMm-s.marginBottomMm;if(t==="page"&&a<=0||l<=0)throw new Error("页边距占满纸张,必须保留正的可用宽度和高度");const{dataset:c,titleHeightMm:d,hasTitle:m,titleSpaceMm:h}=Et(e,l),g=Tt(e),{columns:w,fixedWidthMm:b,maxFlex:_}=Rt(e,t,n,a);t==="wide"&&(a=w.reduce((C,D)=>C+D.widthMm,0),k(a,"宽表总列宽"),i=a+s.marginLeftMm+s.marginRightMm,k(i,"宽表总宽度"));const A={widthMm:i,heightMm:o,...s,components:[],...t==="wide"?{layout:t}:{}};return m&&A.components.push({kind:"text",text:e.title,leftMm:s.marginLeftMm,topMm:s.marginTopMm,widthMm:a,heightMm:d,style:{fontSize:16,bold:!0,align:"center",verticalAlign:"middle",...e.titleStyle}}),A.components.push({align:"auto",headerAlign:"center",...g,kind:"list",...t==="wide"?{layout:t}:{},...m?{title:e.title}:{},dataset:c,columns:w,leftMm:s.marginLeftMm,topMm:s.marginTopMm+h,widthMm:t==="wide"||_>0?a:b}),e.params===void 0?{pages:[A]}:{params:e.params,pages:[A]}}function Ct(e){return e}class F extends Error{constructor(t,n){super(n),this.code=t,this.name="ReportTemplateStoreError"}}function N(e){return JSON.parse(JSON.stringify(e))}function R(e){if(!e?.aborted)return;const t=new Error("模板操作已取消");throw t.name="AbortError",t}function ye(e){const t=e?Number(e.revision):0;if(!Number.isSafeInteger(t)||t<0||t>=Number.MAX_SAFE_INTEGER)throw new F("history","修订号无效或已达上限");return String(t+1)}function Pt(e,t={}){const n=async(s,a)=>{R(a);const l=await e.read(s,a);return R(a),l?N(l):void 0},r=async(s,a)=>{const l=await n(s,a.signal);if((l?.revision??null)!==a.expectedRevision)throw new F("conflict","模板已变化,请重新读取后提交");return l},i=async(s,a,l)=>{if(R(a.signal),!await e.compareAndSwap(s.id,a.expectedRevision,N(s),{signal:a.signal,...l?{publication:N(l)}:{}}))throw new F("conflict","模板已被其他请求更新");return N(s)},o=async(s,a,l,c)=>{if(t.beforePublish){R(l.signal);const g=await t.beforePublish({document:E.parseReportTemplate(a),previous:s.published?E.parseReportTemplate(s.published):void 0,signal:l.signal});if(!g||g.ok!==!0)throw new F("review",g?.issues?.find(w=>w.severity==="error")?.message??"模板发布检查未通过");R(l.signal)}const d=ye(s),m=E.parseReportTemplate({...a,revision:d}),h={revision:d,document:m,publishedAt:(t.now?.()??new Date).toISOString()};return c!==void 0&&(h.restoredFrom=c),i({id:s.id,revision:d,publishedRevision:d,published:m},l,h)};return{list:async s=>{R(s);const a=await e.list(s);return R(s),N(a)},get:async(s,a={})=>{const l=await n(s,a.signal),c=a.draft?l?.draft:l?.published;return c?E.parseReportTemplate(c):void 0},history:async(s,a)=>{R(a);const l=await e.history(s,a);return R(a),N(l)},saveDraft:async(s,a)=>{a={...a},R(a.signal);const l=E.parseReportTemplate(t.migrate?await t.migrate(s):s),c=await r(l.id,a),d=ye(c);return i({id:l.id,revision:d,draft:{...l,revision:d},...c?.publishedRevision?{publishedRevision:c.publishedRevision,published:c.published}:{}},a)},publish:async(s,a)=>{a={...a};const l=await r(s,a);if(!l)throw new F("missing","模板不存在");if(!l.draft)throw new F("draft","没有可发布的草稿");return o(l,l.draft,a)},rollback:async(s,a,l)=>{l={...l};const c=await r(s,l);if(!c)throw new F("missing","模板不存在");R(l.signal);const d=await e.getVersion(s,a,l.signal);if(!d)throw new F("history","历史修订不存在");return o(c,d.document,l,a)}}}function At(){const e=new Map,t=new Map;return{read:async(n,r)=>{R(r);const i=e.get(n);return i?N(i):void 0},list:async n=>(R(n),Array.from(e.values(),({id:r,revision:i,publishedRevision:o})=>({id:r,revision:i,...o?{publishedRevision:o}:{}}))),history:async(n,r)=>(R(r),Array.from(t.get(n)?.values()??[],i=>N(i))),getVersion:async(n,r,i)=>{R(i);const o=t.get(n)?.get(r);return o?N(o):void 0},compareAndSwap:async(n,r,i,o)=>{if(R(o.signal),(e.get(n)?.revision??null)!==r)return!1;if(i.id!==n)throw new F("history","状态 ID 与存储 ID 不一致");const s=N(i),a=o.publication;if(a){const l=t.get(n)??new Map;if(l.has(a.revision)||a.revision!==i.revision||a.document.id!==n)throw new F("history","发布修订不可覆盖,且必须与状态修订和模板 ID 一致");l.set(a.revision,N(a)),t.set(n,l)}return e.set(n,s),!0}}}function It(e,t){const n=e.publishedRevision??e.published?.revision;for(const r of[e.draftRevision,n])if(r!==void 0&&(typeof r!="string"||!r.trim()))throw new TypeError("模板生命周期修订应为非空字符串");if(e.draftRevision!==void 0&&e.draftRevision!==t.revision)throw new TypeError("可编辑文档应与草稿修订一致");if(e.published&&(e.published.id!==t.id||e.published.revision!==n))throw new TypeError("发布文档身份或修订不一致");if(!e.published&&n!==void 0&&n!==t.revision)throw new TypeError("发布修订需要对应的独立文档");return{...e.draftRevision===void 0?{}:{draftRevision:e.draftRevision},...n===void 0?{}:{publishedRevision:n}}}function Lt(e,t){const n=E.parseReportTemplate(e);if(t.id===n.id)throw new Error("复制模板应使用新的 ID");const{revision:r,...i}=n;return E.parseReportTemplate({...i,id:t.id,name:t.name})}function kt(e){if(!Array.isArray(e)||e.length>1e3)throw new RangeError("本地模板目录最多 1000 项");const t=new Map,n=new Map,r=[];for(const i of e){const o=E.parseReportTemplate(i.document);if(t.has(o.id))throw new Error(`模板 ID 重复:${o.id}`);if(i.category!==void 0&&(typeof i.category!="string"||i.category.length>128)||i.tags!==void 0&&(!Array.isArray(i.tags)||i.tags.length>20||i.tags.some(c=>typeof c!="string"||c.length>128)))throw new TypeError("模板分类和标签无效");const s=It(i,o),{template:a,...l}=o;t.set(o.id,o),i.published?n.set(o.id,E.parseReportTemplate(i.published)):s.publishedRevision&&n.set(o.id,E.parseReportTemplate(o)),r.push({...l,...s,...i.category?{category:i.category}:{},...i.tags?{tags:[...i.tags]}:{}})}return r.sort((i,o)=>i.id<o.id?-1:1),{search:async i=>{be(i.signal);const o=i.limit??30;if(!Number.isSafeInteger(o)||o<1||o>100)throw new RangeError("模板每页数量应为 1–100");const s=i.query?.trim().toLocaleLowerCase()??"",a=r.filter(c=>(!i.category||c.category===i.category)&&(!i.cursor||c.id>i.cursor)&&(!s||[c.id,c.name,c.description,...c.tags??[]].some(d=>d?.toLocaleLowerCase().includes(s)))),l=new Map;for(const c of r)c.category&&l.set(c.category,(l.get(c.category)??0)+1);return JSON.parse(JSON.stringify({items:a.slice(0,o),...a.length>o?{next:a[o-1].id}:{},categories:Array.from(l,([c,d])=>({id:c,label:c,count:d}))}))},get:async(i,o)=>{be(o.signal);const s=o.mode==="published"?n.get(i):t.get(i);return s?E.parseReportTemplate(s):void 0}}}function be(e){if(!e?.aborted)return;const t=new Error("模板目录操作已取消");throw t.name="AbortError",t}function Dt(e){return e.map(t=>t.map(n=>/[\t\r\n"]/.test(n)?`"${n.replace(/"/g,'""')}"`:n).join(" ")).join(`\r
|
|
7
|
+
`)}function Ft(e,t){const n=e[e.length-1];e.length>1&&n?.length===1&&n[0]===""&&/[\r\n]$/.test(t)&&e.pop()}function Nt(e,t=1e4){if(e.length>4*1024*1024)throw new Error("Clipboard text limit exceeded");const n=[[]];let r="",i=!1,o=!1,s=0;function a(){if(++s>t)throw new Error("Clipboard cell limit exceeded");n[n.length-1].push(r),r="",o=!1}for(let l=0;l<e.length;l++){const c=e[l];if(i){if(c!=='"'){r+=c;continue}if(e[l+1]==='"'){r+='"',l++;continue}i=!1,o=!0;continue}if(c==='"'&&!r&&!o){i=!0;continue}if(c===" "){a();continue}if(c==="\r"||c===`
|
|
8
|
+
`){a(),n.push([]),c==="\r"&&e[l+1]===`
|
|
9
|
+
`&&l++;continue}if(o)throw new Error("Invalid quoted clipboard value");r+=c}if(i)throw new Error("Unclosed clipboard quote");return a(),Ft(n,e),n}class De extends Error{constructor(t,n,r){const i=typeof n.label=="string"?n.label:"单元格",o={definition:`${i}的编辑器配置无效`,type:`${i}的编辑器与数据类型不一致`,required:`${i}不能为空`,min:`${i}不能小于 ${r}`,max:`${i}不能大于 ${r}`,precision:`${i}最多保留 ${r} 位小数`,length:`${i}最多允许 ${r} 个字符`,choice:`${i}请选择有效选项`,date:`${i}请输入有效日期(YYYY-MM-DD)`};super(o[t]),this.code=t,this.field=n,this.expected=r,this.name="ReportCellFieldError"}}function v(e,t,n){throw new De(t,e,n)}function Fe(e){if(typeof e!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(e)||e.startsWith("0000-"))return!1;const t=new Date(`${e}T00:00:00.000Z`);return Number.isFinite(t.getTime())&&t.toISOString().slice(0,10)===e}function Ot(e){const[t="",n="0"]=String(e).toLowerCase().split("e");return Math.max(0,(t.split(".")[1]?.length??0)-Number(n))}function $t(e,t){e.min!==void 0&&t<e.min&&v(e,"min",e.min),e.max!==void 0&&t>e.max&&v(e,"max",e.max),e.precision!==void 0&&Ot(t)>e.precision&&v(e,"precision",e.precision)}function _t(e,t){Fe(t)||v(e,"date"),e.min!==void 0&&t<e.min&&v(e,"min",e.min),e.max!==void 0&&t>e.max&&v(e,"max",e.max)}function Ht(e){[e.min,e.max].some(t=>t!==void 0&&!Number.isFinite(t))&&v(e,"definition"),e.min!==void 0&&e.max!==void 0&&e.min>e.max&&v(e,"definition"),e.precision!==void 0&&(!Number.isInteger(e.precision)||e.precision<0||e.precision>15)&&v(e,"definition")}function zt(e){[e.min,e.max].some(t=>t!==void 0&&!Fe(t))&&v(e,"definition"),e.min!==void 0&&e.max!==void 0&&e.min>e.max&&v(e,"definition")}function Bt(e,t){(!Array.isArray(t.options)||!t.options.length)&&v(t,"definition");const n=e.valueType==="text"?"string":e.valueType,r=new Set;for(const i of t.options)(!i||typeof i.value!==n||typeof i.value=="number"&&!Number.isFinite(i.value))&&v(t,"definition"),i.label!==void 0&&typeof i.label!="string"&&v(t,"definition"),r.has(i.value)&&v(t,"definition"),r.add(i.value)}function Wt(e){e.required!==void 0&&typeof e.required!="boolean"&&v(e,"definition"),[e.label,e.hint,e.unit].some(t=>t!==void 0&&typeof t!="string")&&v(e,"definition"),e.type==="boolean"&&[e.trueLabel,e.falseLabel].some(t=>t!==void 0&&typeof t!="string")&&v(e,"definition")}function Ne(e,t){(!t||typeof t!="object"||Array.isArray(t)||!["text","number","boolean","enum","date"].includes(t.type))&&v(t??{type:"text"},"definition"),Wt(t),(t.type==="number"||t.type==="boolean")&&e.valueType!==t.type&&v(t,"type"),(t.type==="text"||t.type==="date")&&e.valueType!=="text"&&v(t,"type"),t.type==="number"&&Ht(t),t.type==="text"&&t.maxLength!==void 0&&(!Number.isInteger(t.maxLength)||t.maxLength<0)&&v(t,"definition"),t.type==="date"&&zt(t),t.type==="enum"&&Bt(e,t)}function jt(e,t,n){if(!e.editable)throw new f.ReportCellEditError("readonly");n&&Ne(e,n);const r=f.parseReportCellInput(e,t);return n?(n.required&&typeof r=="string"&&!r.trim()&&v(n,"required"),r===null||r===""?(n.required&&v(n,"required"),r):(n.type==="number"&&$t(n,r),n.type==="date"&&_t(n,r),n.type==="text"&&n.maxLength!==void 0&&[...String(r)].length>n.maxLength&&v(n,"length",n.maxLength),n.type==="enum"&&!n.options.some(i=>Object.is(i.value,r))&&v(n,"choice"),r)):r}class y extends Error{constructor(t){super(`Report calculation: ${t}`),this.code=t,this.name="ReportCalculationError"}}function q(e){if(!e?.aborted)return;const t=new Error("Calculation cancelled");throw t.name="AbortError",t}async function ee(e,t=1){const n=Math.floor(e.scanned/2048);if(e.scanned+=t,e.scanned>e.maxScanned)throw new y("limit");q(e.signal),Math.floor(e.scanned/2048)>n&&(await e.yieldToHost(),q(e.signal))}function he(e){return e.table?.role==="header"?-Math.max(1,e.grid?.cells.length??1):e.table?.rowIndex??0}function Me(e,t,n){if(![t.pageIndex,t.componentIndex,t.rowIndex,t.columnIndex].every(a=>Number.isSafeInteger(a)&&a>=0))throw new y("selection");const r=e.pages[t.pageIndex]?.components[t.componentIndex];if(!r?.grid||t.rowIndex>=r.grid.cells.length)throw new y("selection");const i=r.grid.colWidthsMm?.length??r.grid.cells.reduce((a,l)=>Math.max(a,l.length),1);if(t.columnIndex>=i)throw new y("selection");const o=r.table,s=e.pages[n.pageIndex]?.components[n.componentIndex]?.table;if(o&&s&&o.id===s.id){const a=s.columnKeys.indexOf(o.columnKeys[t.columnIndex]??"");if(a<0)throw new y("selection");return{grid:o.id,row:he(r)+t.rowIndex,column:a}}return{grid:`${t.pageIndex}:${t.componentIndex}`,row:t.rowIndex,column:t.columnIndex}}function Ut(e,t,n){const r=Me(e,t.anchor,t.anchor),i=Me(e,t.focus,t.anchor);if(r.grid!==i.grid)throw new y("selection");const o=(Math.abs(r.row-i.row)+1)*(Math.abs(r.column-i.column)+1);if(!Number.isSafeInteger(o)||o>n)throw new y("limit");return{grid:r.grid,rowStart:Math.min(r.row,i.row),rowEnd:Math.max(r.row,i.row),columnStart:Math.min(r.column,i.column),columnEnd:Math.max(r.column,i.column),origin:e.pages[t.anchor.pageIndex].components[t.anchor.componentIndex].table}}function qt(e){if(!e)return!1;const t=e.replace(/"[^"]*"|\\.|\[(?![hms]+\])[^\]]*\]/gi,"");return/[ymdhs]/i.test(t)}function Gt(e){if(e.valueType==="text"||e.valueType==="boolean"||qt(e.numberFormat))return null;const t=e.value;if(typeof t!="number"||!Number.isFinite(t))return null;if(Number.isInteger(t)&&!Number.isSafeInteger(t))throw new y("precision");return t}function Vt(e,t,n){if(e.seen.has(n))return;e.seen.add(n),e.selected++;const r=t?Gt(t):null;r===null?e.excluded++:e.values.push(r)}function Yt(e,t,n,r){return r.origin?e.table?.id===r.origin.id:`${t}:${n}`===r.grid}function Xt(e,t,n){return n.origin?n.origin.columnKeys.indexOf(e.table.columnKeys[t]??""):t}function Kt(e,t,n,r){const i=r.origin?he(e)+t:t,o=Xt(e,n,r);return i<r.rowStart||i>r.rowEnd||o<r.columnStart||o>r.columnEnd?null:`${r.grid}:${i}:${o}`}function Jt(e,t){const n=t.origin?he(e):0,r=Math.max(0,t.rowStart-n),i=Math.min(e.grid.cells.length,t.rowEnd-n+1);return i>r?i:0}async function Zt(e,t,n,r,i){const o=e.grid;if(t>r.maxScanned)throw new y("limit");const s=o.colWidthsMm?.length??o.cells.reduce((l,c)=>Math.max(l,c.length),1);if(s>r.maxScanned)throw new y("limit");const a=new Map;for(let l=0;l<t;l++){l>0&&l%2048===0&&(await r.yieldToHost(),q(r.signal));let c=0;for(const d of o.cells[l]){for(await ee(r);c<s&&(a.get(c)??0)>l;)c++;if(c>=s)break;const m=Math.max(1,Math.min(d?.colSpan??1,s-c)),h=Math.min(o.cells.length,l+Math.max(1,d?.rowSpan??1));m>1&&await ee(r,m-1);for(let w=c;w<c+m;w++)a.set(w,h);const g=Kt(e,l,c,n);g&&Vt(i,d,g),c+=m}}}async function Qt(e,t,n){const r={values:[],seen:new Set,excluded:0,selected:0};for(let i=0;i<e.pages.length;i++){await ee(n);const o=e.pages[i];for(let s=0;s<o.components.length;s++){await ee(n);const a=o.components[s];if(!a.grid||!Yt(a,i,s,t)||a.table&&a.table.role!=="body")continue;const l=Jt(a,t);l&&await Zt(a,l,t,n,r)}}return r}function V(e){if(!Number.isFinite(e))throw new y("overflow");return e}function en(e){let t=0,n=0;for(const r of e){const i=r-n,o=V(t+i);n=o-t-i,t=o}return t}async function Ee(e,t){let n=[...e],r=new Array(e.length);for(let o=1;o<e.length;o*=2){for(let s=0;s<e.length;s+=o*2){const a=Math.min(s+o,e.length),l=Math.min(s+o*2,e.length);let c=s,d=a;for(let m=s;m<l;m++)r[m]=d>=l||c<a&&n[c]<=n[d]?n[c++]:n[d++],m%2048===0&&(await t.yieldToHost(),q(t.signal))}[n,r]=[r,n]}const i=Math.floor(n.length/2);return n.length%2?n[i]:V(n[i-1]/2+n[i]/2)}function tn(e){const t=en(e);let n=1/0,r=-1/0;for(const i of e)n=Math.min(n,i),r=Math.max(r,i);return{SUM:t,AVERAGE:t/e.length,AVG:t/e.length,MIN:n,MAX:r,COUNT:e.length}}function Oe(e,t){if(typeof e!="string"||e.length>256)throw new y("expression");const n=e.toUpperCase().match(/(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?|[A-Z_]+|[()+\-*/]|\S/g)??[];if(!n.length||n.length>64)throw new y("expression");let r=0;function i(a){if(a>16)throw new y("expression");const l=n[r++];if(l==="+"||l==="-")return(l==="-"?-1:1)*i(a+1);if(l==="("){const c=o(0,a+1);if(n[r++]!==")")throw new y("expression");return c}if(l&&/^(?:SUM|AVERAGE|AVG|MIN|MAX|COUNT|MEDIAN)$/.test(l)&&Object.prototype.hasOwnProperty.call(t,l))return V(t[l]);if(l&&/^(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?$/.test(l))return V(Number(l));throw new y("expression")}function o(a,l){let c=i(l);for(;r<n.length;){const d=n[r],m=d==="+"||d==="-"?1:d==="*"||d==="/"?2:0;if(!m||m<a)break;r++;const h=o(m+1,l+1);if(d==="/"&&h===0)throw new y("division");c=V(d==="+"?c+h:d==="-"?c-h:d==="*"?c*h:c/h)}return c}const s=o(1,0);if(r!==n.length)throw new y("expression");return s}function nn(e){const t=e.maxCells??1e5,n=e.maxScannedCells??2e5,r=e.precision??2;if(![t,n].every(i=>Number.isSafeInteger(i)&&i>=1&&i<=2e6))throw new y("limit");if(!Number.isInteger(r)||r<0||r>12)throw new y("precision");return{maxCells:t,maxScanned:n,precision:r}}async function rn(e,t,n={}){const r=nn(n),i={scanned:0,maxScanned:r.maxScanned,signal:n.signal,yieldToHost:n.yieldToHost??(()=>new Promise(l=>setTimeout(l,0)))};q(i.signal);const o=await Qt(e,Ut(e,t,r.maxCells),i),s=n.operation??"sum";if(!["sum","average","min","max","count","median","expression"].includes(s))throw new y("expression");let a=null;if(s==="count")a=o.values.length;else if(o.values.length)if(s==="median")a=await Ee(o.values,i);else{const l=tn(o.values);s==="expression"?(/\bMEDIAN\b/i.test(n.expression??"")&&(l.MEDIAN=await Ee(o.values,i)),a=Oe(n.expression??"",l)):a=l[s.toUpperCase()]}if(q(i.signal),a!==null&&Number.isInteger(a)&&!Number.isSafeInteger(a))throw new y("precision");return{value:a,formatted:a===null?"—":a.toFixed(r.precision),numericCells:o.values.length,excludedCells:o.excluded,selectedCells:o.selected,precision:r.precision}}exports.DEFAULT_BORDER_PT=I.DEFAULT_BORDER_PT;exports.DEFAULT_FONT_FAMILY=I.DEFAULT_FONT_FAMILY;exports.DEFAULT_FONT_PT=I.DEFAULT_FONT_PT;exports.DEFAULT_STROKE_COLOR=I.DEFAULT_STROKE_COLOR;exports.DEFAULT_TEXT_COLOR=I.DEFAULT_TEXT_COLOR;exports.LINE_HEIGHT=I.LINE_HEIGHT;exports.SCHEMA_VERSION_MACH=I.SCHEMA_VERSION_MACH;exports.evalStyleRule=Y.evalStyleRule;exports.formatValue=Y.formatValue;exports.parseDateLocal=Y.parseDateLocal;exports.toExcelNumberFormat=Y.toExcelNumberFormat;exports.toNumber=Y.toNumber;exports.CSS_DPI=u.CSS_DPI;exports.MM_PER_INCH=u.MM_PER_INCH;exports.PAPER_SIZES=u.PAPER_SIZES;exports.mergeComponentStyles=u.mergeComponentStyles;exports.mmToPx=u.mmToPx;exports.mmToPxFactor=u.mmToPxFactor;exports.ptToPx=u.ptToPx;exports.pxToMm=u.pxToMm;exports.resolveBoxBorders=u.resolveBoxBorders;exports.resolveFontSize=u.resolveFontSize;exports.resolveLineHeight=u.resolveLineHeight;exports.resolveStroke=u.resolveStroke;exports.resolveTextColor=u.resolveTextColor;exports.round=u.round;exports.RENDER_PLAN_SCHEMA_VERSION=W.RENDER_PLAN_SCHEMA_VERSION;exports.isImageBackedComponent=W.isImageBackedComponent;exports.isRichText=W.isRichText;exports.assertRenderPlan=te.assertRenderPlan;exports.validateComponent=te.validateComponent;exports.validatePage=te.validatePage;exports.validateRenderPlan=te.validateRenderPlan;exports.datasetJsonSchema=ae.datasetJsonSchema;exports.validateDatasetRows=ae.validateDatasetRows;exports.charWidthEm=$.charWidthEm;exports.createCanvasMeasurer=$.createCanvasMeasurer;exports.createHeuristicMeasurer=$.createHeuristicMeasurer;exports.heuristicMeasurer=$.heuristicMeasurer;exports.measureTextMm=$.measureTextMm;exports.wrapText=$.wrapText;exports.PaginateCellLimitError=f.PaginateCellLimitError;exports.PaginatePageLimitError=f.PaginatePageLimitError;exports.ReportCellEditError=f.ReportCellEditError;exports.ReportSourceError=f.ReportSourceError;exports.applyReportCellEdit=f.applyReportCellEdit;exports.applyReportCellEditBatch=f.applyReportCellEditBatch;exports.applyReportEditResult=f.applyReportEditResult;exports.countTemplatePages=f.countTemplatePages;exports.createReportCellEdit=f.createReportCellEdit;exports.createReportCellEditBatch=f.createReportCellEditBatch;exports.createReportCellResolver=f.createReportCellResolver;exports.createReportEditSession=f.createReportEditSession;exports.createReportSource=f.createReportSource;exports.defineReport=f.defineReport;exports.diffReportTemplates=f.diffReportTemplates;exports.estimateListLayoutCells=f.estimateListLayoutCells;exports.formatReportCellEdit=f.formatReportCellEdit;exports.getReportCellContext=f.getReportCellContext;exports.getReportEditSession=f.getReportEditSession;exports.paginateTemplate=f.paginateTemplate;exports.paginateTemplatePages=f.paginateTemplatePages;exports.parseReportCellInput=f.parseReportCellInput;exports.projectListColumns=f.projectListColumns;exports.registerReportEditSession=f.registerReportEditSession;exports.relocateReportCellEdits=f.relocateReportCellEdits;exports.reportCellEditKey=f.reportCellEditKey;exports.reviewReportTemplate=f.reviewReportTemplate;exports.summarizeReportCellEdits=f.summarizeReportCellEdits;exports.resolveGridLayout=se.resolveGridLayout;exports.OutputAssetError=j.OutputAssetError;exports.resolvePlanAssets=j.resolvePlanAssets;exports.OutputFidelityError=O.OutputFidelityError;exports.inspectOutputCapabilities=O.inspectOutputCapabilities;exports.reportOutputDiagnostics=O.reportOutputDiagnostics;exports.REPORT_TEMPLATE_DOCUMENT_VERSION=E.REPORT_TEMPLATE_DOCUMENT_VERSION;exports.ReportTemplateError=E.ReportTemplateError;exports.createTemplateRegistry=E.createTemplateRegistry;exports.defineReportTemplate=E.defineReportTemplate;exports.parseReportTemplate=E.parseReportTemplate;exports.serializeReportTemplate=E.serializeReportTemplate;exports.validateReportTemplate=E.validateReportTemplate;exports.validateReportTemplateDocument=E.validateReportTemplateDocument;exports.ReportParamValidationError=z.ReportParamValidationError;exports.assertReportParams=z.assertReportParams;exports.formatReportDateRange=z.formatReportDateRange;exports.isReportDate=z.isReportDate;exports.isReportMonth=z.isReportMonth;exports.isReportYear=z.isReportYear;exports.parseReportDateRange=z.parseReportDateRange;exports.reportParamsJsonSchema=z.reportParamsJsonSchema;exports.validateReportParamDefinitions=z.validateReportParamDefinitions;exports.validateReportParams=z.validateReportParams;exports.TreeRowLimitError=le.TreeRowLimitError;exports.createTreeTable=le.createTreeTable;exports.validateTreeOptions=le.validateTreeOptions;exports.PageBuilder=ke;exports.ReportCalculationError=y;exports.ReportCellFieldError=De;exports.ReportTemplateStoreError=F;exports.TemplateBuilder=Le;exports.calculateReportSelection=rn;exports.classOf=S;exports.cloneReportTemplate=Lt;exports.columnsFromContract=vt;exports.computePageWindow=Re;exports.createCanvasPager=ft;exports.createLocalTemplateCatalog=kt;exports.createMemoryTemplateStore=At;exports.createProviderReport=Ct;exports.createTableTemplate=St;exports.createTemplate=wt;exports.createTemplateManager=Pt;exports.evaluateReportAggregateExpression=Oe;exports.formatReportClipboard=Dt;exports.measurePageSizePx=ne;exports.parseReportCellFieldInput=jt;exports.parseReportClipboard=Nt;exports.planFontSizePx=ot;exports.renderComponent=ce;exports.renderPage=xe;exports.renderPlan=et;exports.renderPlanToCanvas=ht;exports.renderPlanToCanvasAsync=pt;exports.renderPlanToImages=mt;exports.resolvePaper=ue;exports.validateReportCellFieldDefinition=Ne;
|
package/dist/index.d.cts
CHANGED
|
@@ -108,6 +108,11 @@ export declare type ClassKey = "root" | "page" | "comp" | "text" | "lines" | "li
|
|
|
108
108
|
|
|
109
109
|
export declare function classOf(key: ClassKey, options?: RenderOptions): string;
|
|
110
110
|
|
|
111
|
+
export declare function cloneReportTemplate(document: ReportTemplateDocument, identity: {
|
|
112
|
+
id: string;
|
|
113
|
+
name: string;
|
|
114
|
+
}): ReportTemplateDocument;
|
|
115
|
+
|
|
111
116
|
/**
|
|
112
117
|
* 列值格式化(声明式、JSON 可序列化)。
|
|
113
118
|
* 在 paginate 的 cellText 出口统一消费:格式化发生在进 RenderPlan 之前,
|
|
@@ -170,6 +175,15 @@ export declare interface ComponentStyle {
|
|
|
170
175
|
rotateDeg?: number;
|
|
171
176
|
}
|
|
172
177
|
|
|
178
|
+
declare interface ComputedDatasetOptions {
|
|
179
|
+
fields: readonly ComputedField[];
|
|
180
|
+
formula?: FormulaAdapter;
|
|
181
|
+
maxRows?: number;
|
|
182
|
+
maxCells?: number;
|
|
183
|
+
signal?: AbortSignal;
|
|
184
|
+
onError?: "throw" | "null";
|
|
185
|
+
}
|
|
186
|
+
|
|
173
187
|
declare interface ComputedField extends ExpressionOptions {
|
|
174
188
|
field: string;
|
|
175
189
|
expression: ReportExpression | string;
|
|
@@ -205,6 +219,9 @@ export declare function createCanvasPager(plan: RenderPlan, options?: CanvasPage
|
|
|
205
219
|
/** 兼容旧 API:默认启发式测量 */
|
|
206
220
|
export declare function createHeuristicMeasurer(): TextMeasurer;
|
|
207
221
|
|
|
222
|
+
/** Local catalog reference; an enterprise host supplies the same search/get contract with server filtering. */
|
|
223
|
+
export declare function createLocalTemplateCatalog(input: LocalTemplateCatalogItem[]): ReportTemplateCatalogProvider;
|
|
224
|
+
|
|
208
225
|
/** 单进程参考适配器;多实例服务请实现具备数据库事务/CAS 的持久化适配器。 */
|
|
209
226
|
export declare function createMemoryTemplateStore(): ReportTemplateStore;
|
|
210
227
|
|
|
@@ -262,8 +279,16 @@ export declare function createTemplateManager(store: ReportTemplateStore, option
|
|
|
262
279
|
/** 存储无关的模板目录;后台 CRUD、权限、发布审批与持久化由宿主接入。 */
|
|
263
280
|
export declare function createTemplateRegistry(documents?: readonly ReportTemplateDocument[]): ReportTemplateRegistry;
|
|
264
281
|
|
|
282
|
+
/** O(n) identity index, iterative bounded traversal, no input mutation or recursive stack. */
|
|
283
|
+
export declare function createTreeTable(input: readonly DataRow[], options: TreeTableOptions, execution?: {
|
|
284
|
+
signal?: AbortSignal;
|
|
285
|
+
computed?: ComputedDatasetOptions;
|
|
286
|
+
}): TreeTable;
|
|
287
|
+
|
|
265
288
|
export declare const CSS_DPI = 96;
|
|
266
289
|
|
|
290
|
+
declare type DataRow = Record<string, unknown>;
|
|
291
|
+
|
|
267
292
|
export declare interface DatasetContract {
|
|
268
293
|
fields: readonly ReportFieldContract[];
|
|
269
294
|
rowKey?: string;
|
|
@@ -319,7 +344,6 @@ export declare function diffReportTemplates(previous: ReportTemplateDocument, ne
|
|
|
319
344
|
maxChanges?: number;
|
|
320
345
|
}): ReportTemplateDiff;
|
|
321
346
|
|
|
322
|
-
/** Conservative cell allocation estimate; relation validation rejects duplicate master keys before rendering. */
|
|
323
347
|
export declare function estimateListLayoutCells(list: ListComponent, datasets: DatasetRows, options?: Pick<PaginateOptions, "formula" | "signal">): number;
|
|
324
348
|
|
|
325
349
|
/**
|
|
@@ -345,6 +369,8 @@ export declare function formatReportCellEdit(context: ReportCellContext, value:
|
|
|
345
369
|
/** TSV with Excel-compatible quoting; quoted line breaks remain inside their cells. */
|
|
346
370
|
export declare function formatReportClipboard(rows: readonly (readonly string[])[]): string;
|
|
347
371
|
|
|
372
|
+
export declare function formatReportDateRange(range: ReportDateRange): string;
|
|
373
|
+
|
|
348
374
|
/**
|
|
349
375
|
* 应用格式化。非数值/无法解析时原样返回基础文本(降级不报错):
|
|
350
376
|
* - number:digits 小数位 + 可选千分位(12,345.60;thousands 默认 false)
|
|
@@ -375,6 +401,8 @@ export declare interface GridCell {
|
|
|
375
401
|
value?: string | number | boolean | null;
|
|
376
402
|
/** Excel 数字格式(例如 #,##0.00 / 0.00%),不改变 text。 */
|
|
377
403
|
numberFormat?: string;
|
|
404
|
+
/** Physical left inset for hierarchical labels; raw value stays unchanged. */
|
|
405
|
+
indentMm?: number;
|
|
378
406
|
/** 编辑输入类型;省略时只按原始值推断,数字字符串不会被转换为数值。 */
|
|
379
407
|
valueType?: "text" | "number" | "boolean";
|
|
380
408
|
/** 单元格级编辑控制;预览仍需显式开启 editing。 */
|
|
@@ -446,6 +474,10 @@ export declare function isImageBackedComponent(comp: PlanComponent): boolean;
|
|
|
446
474
|
|
|
447
475
|
export declare function isReportDate(value: string): boolean;
|
|
448
476
|
|
|
477
|
+
export declare function isReportMonth(value: string): boolean;
|
|
478
|
+
|
|
479
|
+
export declare function isReportYear(value: string): boolean;
|
|
480
|
+
|
|
449
481
|
export declare function isRichText(comp: PlanComponent): boolean;
|
|
450
482
|
|
|
451
483
|
/** 默认行高倍数(基线距 = 字号 × 该系数) */
|
|
@@ -482,6 +514,8 @@ export declare interface ListColumn {
|
|
|
482
514
|
|
|
483
515
|
export declare interface ListComponent {
|
|
484
516
|
kind: "list";
|
|
517
|
+
/** Opaque serializable layout annotations; interpreted only by explicit optional adapters. */
|
|
518
|
+
meta?: Record<string, unknown>;
|
|
485
519
|
id?: string;
|
|
486
520
|
/** 宽表标记用于连续 Excel;不改变低层列表的列宽和分页算法。 */
|
|
487
521
|
layout?: "page" | "wide";
|
|
@@ -491,6 +525,10 @@ export declare interface ListComponent {
|
|
|
491
525
|
topMm: number;
|
|
492
526
|
widthMm: number;
|
|
493
527
|
dataset: string;
|
|
528
|
+
/** Headerless record/region bindings do not allocate a synthetic list header. */
|
|
529
|
+
header?: boolean;
|
|
530
|
+
/** A fixed record region rejects multiple rows instead of dropping source data. */
|
|
531
|
+
cardinality?: "record";
|
|
494
532
|
/** 数据集中稳定业务主键的字段名;省略时编辑仅有计划内坐标。 */
|
|
495
533
|
rowKey?: string;
|
|
496
534
|
revisionField?: string;
|
|
@@ -517,6 +555,8 @@ export declare interface ListComponent {
|
|
|
517
555
|
computed?: ComputedField[];
|
|
518
556
|
/** Dynamic pivot of the current source dataset, with read-only derived identities. */
|
|
519
557
|
matrix?: MatrixTableOptions;
|
|
558
|
+
/** Full ordered hierarchy; source parent values and descendant-leaf rollups are explicit. */
|
|
559
|
+
tree?: TreeTableOptions;
|
|
520
560
|
/** Explicit row visibility; hidden rows do not participate in summaries. */
|
|
521
561
|
rowVisibleWhen?: StyleRule["when"];
|
|
522
562
|
/** Master/detail relation is keyed by business identity, never by display row index. */
|
|
@@ -567,6 +607,16 @@ export declare interface ListGroupBy {
|
|
|
567
607
|
repeatHeader?: boolean;
|
|
568
608
|
}
|
|
569
609
|
|
|
610
|
+
export declare interface LocalTemplateCatalogItem {
|
|
611
|
+
/** Editable document: prefer the latest draft; otherwise use the published document. */
|
|
612
|
+
document: ReportTemplateDocument;
|
|
613
|
+
published?: ReportTemplateDocument;
|
|
614
|
+
draftRevision?: string;
|
|
615
|
+
publishedRevision?: string;
|
|
616
|
+
category?: string;
|
|
617
|
+
tags?: string[];
|
|
618
|
+
}
|
|
619
|
+
|
|
570
620
|
declare interface MatrixTableOptions {
|
|
571
621
|
rowFields: readonly string[];
|
|
572
622
|
columnFields: readonly string[];
|
|
@@ -741,6 +791,9 @@ export declare function parseReportCellInput(context: ReportCellContext, input:
|
|
|
741
791
|
/** Bounded parser for clipboard data; invalid quotes are rejected before edits are built. */
|
|
742
792
|
export declare function parseReportClipboard(text: string, maxCells?: number): string[][];
|
|
743
793
|
|
|
794
|
+
/** Only complete, ordered, real calendar dates are accepted; there is no timezone conversion. */
|
|
795
|
+
export declare function parseReportDateRange(value: string): ReportDateRange | undefined;
|
|
796
|
+
|
|
744
797
|
/** 校验文件 JSON 文本或接口返回的未知对象,返回独立模板快照。 */
|
|
745
798
|
export declare function parseReportTemplate(input: unknown): ReportTemplateDocument;
|
|
746
799
|
|
|
@@ -786,6 +839,7 @@ export declare interface PlanGrid {
|
|
|
786
839
|
}
|
|
787
840
|
|
|
788
841
|
export declare interface PlanPage {
|
|
842
|
+
meta?: Record<string, unknown>;
|
|
789
843
|
/** wide 表示完整自然列宽;页面仅为预览的垂直窗口分段。 */
|
|
790
844
|
layout?: "page" | "wide";
|
|
791
845
|
pageWidthMm: number;
|
|
@@ -995,6 +1049,12 @@ export declare type ReportCellValue = string | number | boolean | null;
|
|
|
995
1049
|
|
|
996
1050
|
export declare type ReportCellValueType = NonNullable<GridCell["valueType"]>;
|
|
997
1051
|
|
|
1052
|
+
/** Wire values deliberately remain strings in browsers, Workers and backend runtimes. */
|
|
1053
|
+
export declare interface ReportDateRange {
|
|
1054
|
+
start: string;
|
|
1055
|
+
end: string;
|
|
1056
|
+
}
|
|
1057
|
+
|
|
998
1058
|
export declare interface ReportDefinition {
|
|
999
1059
|
/** 静态模板或宿主提供的异步模板加载器;动态模板默认每次重新读取,不缓存版本。 */
|
|
1000
1060
|
template: ReportTemplate | ReportTemplateLoader;
|
|
@@ -1108,6 +1168,14 @@ export declare interface ReportFieldContract {
|
|
|
1108
1168
|
unit?: string;
|
|
1109
1169
|
}
|
|
1110
1170
|
|
|
1171
|
+
export declare interface ReportFlowBand {
|
|
1172
|
+
/** Exact stable component IDs. Static components use nid, lists use id. */
|
|
1173
|
+
componentIds: string[];
|
|
1174
|
+
/** Source-template coordinates; following bands keep their original gap. */
|
|
1175
|
+
topMm: number;
|
|
1176
|
+
heightMm: number;
|
|
1177
|
+
}
|
|
1178
|
+
|
|
1111
1179
|
export declare interface ReportHistoryPreparation {
|
|
1112
1180
|
batch: ReportEditBatch;
|
|
1113
1181
|
prepared: ReportPreparedEdit;
|
|
@@ -1123,13 +1191,17 @@ export declare interface ReportLoadContext {
|
|
|
1123
1191
|
|
|
1124
1192
|
export declare function reportOutputDiagnostics(plan: RenderPlan, format: OutputFormat, options: OutputDiagnosticOptions): OutputDiagnostic[];
|
|
1125
1193
|
|
|
1194
|
+
export declare interface ReportPageFlow {
|
|
1195
|
+
bands: ReportFlowBand[];
|
|
1196
|
+
}
|
|
1197
|
+
|
|
1126
1198
|
/** 报表参数定义(声明式,模板自描述参数面:渲染组件据此生成查询面板) */
|
|
1127
1199
|
export declare interface ReportParamDef {
|
|
1128
1200
|
/** 参数名(传入 params,与数据集 SQL #{field} 绑定对应) */
|
|
1129
1201
|
field: string;
|
|
1130
1202
|
/** 显示名(缺省用 field) */
|
|
1131
1203
|
label?: string;
|
|
1132
|
-
type?: "text" | "number" | "date" | "select";
|
|
1204
|
+
type?: "text" | "number" | "date" | "month" | "year" | "dateRange" | "select";
|
|
1133
1205
|
/** select 选项 */
|
|
1134
1206
|
options?: Array<{
|
|
1135
1207
|
label: string;
|
|
@@ -1138,7 +1210,7 @@ export declare interface ReportParamDef {
|
|
|
1138
1210
|
defaultValue?: string;
|
|
1139
1211
|
required?: boolean;
|
|
1140
1212
|
placeholder?: string;
|
|
1141
|
-
/**
|
|
1213
|
+
/** 数字上下界;日期/月/年使用对应规范字符串;dateRange 对两端使用 YYYY-MM-DD 边界(含边界)。 */
|
|
1142
1214
|
min?: number | string;
|
|
1143
1215
|
max?: number | string;
|
|
1144
1216
|
minLength?: number;
|
|
@@ -1284,6 +1356,46 @@ export declare interface ReportTemplate {
|
|
|
1284
1356
|
pages: TemplatePage[];
|
|
1285
1357
|
}
|
|
1286
1358
|
|
|
1359
|
+
export declare interface ReportTemplateCatalogEntry extends ReportTemplateSummary {
|
|
1360
|
+
category?: string;
|
|
1361
|
+
tags?: string[];
|
|
1362
|
+
updatedAt?: string;
|
|
1363
|
+
/** Optional lifecycle metadata. revision continues to identify the editable document. */
|
|
1364
|
+
draftRevision?: string;
|
|
1365
|
+
publishedRevision?: string;
|
|
1366
|
+
}
|
|
1367
|
+
|
|
1368
|
+
export declare interface ReportTemplateCatalogOpenContext {
|
|
1369
|
+
mode: "edit" | "published";
|
|
1370
|
+
}
|
|
1371
|
+
|
|
1372
|
+
export declare interface ReportTemplateCatalogPage {
|
|
1373
|
+
items: ReportTemplateCatalogEntry[];
|
|
1374
|
+
next?: string;
|
|
1375
|
+
categories?: Array<{
|
|
1376
|
+
id: string;
|
|
1377
|
+
label: string;
|
|
1378
|
+
count?: number;
|
|
1379
|
+
}>;
|
|
1380
|
+
}
|
|
1381
|
+
|
|
1382
|
+
/** Discovery metadata is separate from executable templates and from enterprise account authorization. */
|
|
1383
|
+
export declare interface ReportTemplateCatalogProvider {
|
|
1384
|
+
search(request: ReportTemplateCatalogQuery): Promise<ReportTemplateCatalogPage>;
|
|
1385
|
+
get(id: string, context: {
|
|
1386
|
+
signal?: AbortSignal;
|
|
1387
|
+
mode?: ReportTemplateCatalogOpenContext["mode"];
|
|
1388
|
+
}): Promise<ReportTemplateDocument | undefined>;
|
|
1389
|
+
}
|
|
1390
|
+
|
|
1391
|
+
export declare interface ReportTemplateCatalogQuery {
|
|
1392
|
+
query?: string;
|
|
1393
|
+
category?: string;
|
|
1394
|
+
cursor?: string;
|
|
1395
|
+
limit?: number;
|
|
1396
|
+
signal?: AbortSignal;
|
|
1397
|
+
}
|
|
1398
|
+
|
|
1287
1399
|
export declare interface ReportTemplateChange {
|
|
1288
1400
|
kind: "added" | "removed" | "modified" | "moved";
|
|
1289
1401
|
category: "metadata" | "structure" | "binding" | "calculation" | "format";
|
|
@@ -1614,6 +1726,9 @@ export declare interface TemplatePage {
|
|
|
1614
1726
|
marginLeftMm?: number;
|
|
1615
1727
|
marginRightMm?: number;
|
|
1616
1728
|
components: TemplateComponent[];
|
|
1729
|
+
/** Explicit vertical bands preserve source gaps as dynamic regions expand. */
|
|
1730
|
+
flow?: ReportPageFlow;
|
|
1731
|
+
meta?: Record<string, unknown>;
|
|
1617
1732
|
}
|
|
1618
1733
|
|
|
1619
1734
|
export declare interface TemplateStoreWriteOptions {
|
|
@@ -1646,6 +1761,46 @@ export declare function toExcelNumberFormat(format?: ColumnFormat): string | und
|
|
|
1646
1761
|
|
|
1647
1762
|
export declare function toNumber(value: unknown): number | null;
|
|
1648
1763
|
|
|
1764
|
+
export declare interface TreeRow {
|
|
1765
|
+
row: DataRow;
|
|
1766
|
+
original: DataRow;
|
|
1767
|
+
key: string | number;
|
|
1768
|
+
depth: number;
|
|
1769
|
+
hasChildren: boolean;
|
|
1770
|
+
}
|
|
1771
|
+
|
|
1772
|
+
export declare class TreeRowLimitError extends Error {
|
|
1773
|
+
readonly limit: number;
|
|
1774
|
+
readonly code = "tree-row-limit";
|
|
1775
|
+
constructor(limit: number);
|
|
1776
|
+
}
|
|
1777
|
+
|
|
1778
|
+
export declare interface TreeTable {
|
|
1779
|
+
rows: DataRow[];
|
|
1780
|
+
entries: TreeRow[];
|
|
1781
|
+
leaves: DataRow[];
|
|
1782
|
+
}
|
|
1783
|
+
|
|
1784
|
+
/** A serialized tree contract. Sibling and root order follow input order. */
|
|
1785
|
+
export declare interface TreeTableOptions {
|
|
1786
|
+
input: "flat" | "nested";
|
|
1787
|
+
idField: string;
|
|
1788
|
+
/** Flat roots have null/undefined parent values. */
|
|
1789
|
+
parentField?: string;
|
|
1790
|
+
/** Nested child arrays, defaults to children. Every node still needs an ID. */
|
|
1791
|
+
childrenField?: string;
|
|
1792
|
+
labelField: string;
|
|
1793
|
+
indentMm?: number;
|
|
1794
|
+
orphan?: "error" | "root";
|
|
1795
|
+
/** Source preserves parent values; leaf-aggregate derives only parents from descendant leaves. */
|
|
1796
|
+
parentValues?: "source" | "leaf-aggregate";
|
|
1797
|
+
aggregates?: AggregateDefinition[];
|
|
1798
|
+
maxRows?: number;
|
|
1799
|
+
maxDepth?: number;
|
|
1800
|
+
/** Bounded leaf-to-ancestor aggregate work; default one million. */
|
|
1801
|
+
maxAggregationVisits?: number;
|
|
1802
|
+
}
|
|
1803
|
+
|
|
1649
1804
|
export declare function validateComponent(comp: unknown, path: string, errors: ValidationError[], warnings?: ValidationError[]): void;
|
|
1650
1805
|
|
|
1651
1806
|
/** 浏览器/Node共用的只读值校验;返回精确路径,不以0或空数组掩盖接口结构错误。 */
|
|
@@ -1672,6 +1827,9 @@ export declare function validateReportTemplate(input: unknown): ValidationResult
|
|
|
1672
1827
|
|
|
1673
1828
|
export declare function validateReportTemplateDocument(input: unknown): ValidationResult;
|
|
1674
1829
|
|
|
1830
|
+
/** Validates runtime inputs too, so direct core calls cannot bypass template checks. */
|
|
1831
|
+
export declare function validateTreeOptions(options: TreeTableOptions): void;
|
|
1832
|
+
|
|
1675
1833
|
export declare interface ValidationError {
|
|
1676
1834
|
path: string;
|
|
1677
1835
|
message: string;
|