@agile-team/mach-report 2.12.0 → 2.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -3
- package/dist/{ReportBatchPanel-B5ClP9tm.js → ReportBatchPanel-CW2HV9I8.js} +1 -1
- package/dist/{ReportBatchPanel-Dc-SDkYA.cjs → ReportBatchPanel-Fp1ePFag.cjs} +1 -1
- package/dist/ReportPreview-BN6fk7Wz.cjs +6 -0
- package/dist/ReportPreview-D2Jkyh1U.js +4243 -0
- package/dist/config-Bb7RiIO5.cjs +1 -0
- package/dist/{config-B612mw0x.js → config-XVwG87IA.js} +4 -0
- package/dist/designer.cjs +2 -2
- package/dist/designer.d.cts +16 -0
- package/dist/designer.d.ts +16 -0
- package/dist/designer.js +2014 -1968
- package/dist/index.cjs +6 -6
- package/dist/index.d.cts +25 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.js +386 -367
- package/dist/{plugin-Cd5G2QQn.js → plugin-D4wizDXB.js} +1 -1
- package/dist/{plugin-BDTU4D94.cjs → plugin-DzS6pxTA.cjs} +1 -1
- package/dist/server.cjs +1 -1
- package/dist/server.js +22 -22
- package/dist/style.css +1 -1
- package/dist/template-review-DGwWOoCv.cjs +2 -0
- package/dist/{template-review-BzpcI-tR.js → template-review-PgEe_Wr9.js} +447 -427
- package/dist/vue/async.d.cts +4 -0
- package/dist/vue/async.d.ts +4 -0
- package/dist/vue/index.d.cts +7 -2
- package/dist/vue/index.d.ts +7 -2
- package/dist/vue-async.cjs +1 -1
- package/dist/vue-async.js +3 -3
- package/dist/vue.cjs +1 -1
- package/dist/vue.js +5 -5
- package/package.json +1 -1
- package/dist/ReportPreview-DWXROHBP.cjs +0 -6
- package/dist/ReportPreview-DiNXhQI0.js +0 -4138
- package/dist/config-BRoLo2oj.cjs +0 -1
- package/dist/template-review-BfCC8Ng9.cjs +0 -2
package/dist/index.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const L=require("./defaults-xhmcLLrf.cjs"),U=require("./record-bindings-By_UKZ2g.cjs"),u=require("./style-UgIJSA1F.cjs"),W=require("./render-plan-7xpGrCEl.cjs"),ee=require("./validate-BJ5HIWY8.cjs"),oe=require("./dataset-BkRmwgeJ.cjs"),C=require("./assets-C2U-e-Sz.cjs"),f=require("./template-review-BfCC8Ng9.cjs"),ae=require("./grid-geometry-CZ_cYB6O.cjs"),Ee=require("./grid-strokes-Cr7DwUux.cjs"),$=require("./capabilities-CsZ-pNHR.cjs"),ze=require("./progress-BnLiS5eH.cjs"),We=require("./page-window-index-DEjnM6IB.cjs"),M=require("./template-registry-D3SjENi6.cjs"),H=require("./param-validation-DCK039V1.cjs"),se=require("./tree-BX380Rr7.cjs"),Ue={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]??Ue[e]}class je{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 je().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(le(m,r,i,o));return a.appendChild(d),a}function Ve(e,t,n,r){return Ee.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=ae.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 Je(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(Je(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 Xe(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 fe(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 le(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(Xe(e,t,n,r)),i;if(e.grid){const a=fe(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(fe(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 Re(e,t,n,r){const i=r.createElement("div");return i.className=S("page",n),T("block","initial").add("position","relative").add("font-family",L.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",L.DEFAULT_TEXT_COLOR).add("overflow","hidden").add("box-sizing","border-box").applyTo(i),e.components.forEach((o,s)=>{const a=le(o,t,n,r);a.dataset.mrComponentIndex=String(s),i.appendChild(a)}),i}function et(e,t,n={}){const r=n.dpi??96;$.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(Re(o,r,n,t))}),i}function k(e){if(e?.aborted)throw e.reason??new DOMException("The operation was aborted.","AbortError")}const tt=(e,t)=>(k(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 k(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 k(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 xe(e){return We.createPageWindowIndex(e.pageHeightsPx,e.gapPx).window(e.viewportHeightPx,e.scrollTopPx,e.overscan)}const ce=96/25.4;function te(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 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=te(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}=te(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)=>{
|
|
3
|
-
`);
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const I=require("./defaults-xhmcLLrf.cjs"),j=require("./record-bindings-By_UKZ2g.cjs"),u=require("./style-UgIJSA1F.cjs"),W=require("./render-plan-7xpGrCEl.cjs"),ee=require("./validate-BJ5HIWY8.cjs"),oe=require("./dataset-BkRmwgeJ.cjs"),C=require("./assets-C2U-e-Sz.cjs"),p=require("./template-review-DGwWOoCv.cjs"),ae=require("./grid-geometry-CZ_cYB6O.cjs"),Te=require("./grid-strokes-Cr7DwUux.cjs"),$=require("./capabilities-CsZ-pNHR.cjs"),We=require("./progress-BnLiS5eH.cjs"),je=require("./page-window-index-DEjnM6IB.cjs"),b=require("./template-registry-D3SjENi6.cjs"),H=require("./param-validation-DCK039V1.cjs"),se=require("./tree-BX380Rr7.cjs"),Ue={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]??Ue[e]}class qe{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 qe().add("all",t).add("display",e).add("box-sizing","border-box")}function Re(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 Ge(e,t,n){const r=t.style??{};Re(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 Ve(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");Re(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(le(m,r,i,o));return a.appendChild(d),a}function Ye(e,t,n,r){return Te.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 Je(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=ae.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(Ve(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,...Ye(s,t,n,i)),c}function Ke(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 Xe(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(Ke(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 Ze(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(Xe(e,t,n,r)),i}function Qe(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 fe(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 et(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 le(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(Ge(o,e,t),o.applyTo(i),W.isImageBackedComponent(e))return i.appendChild(Qe(e,n,r)),i;if(e.kind==="text")return i.appendChild(Ze(e,t,n,r)),i;if(e.grid){const a=fe(e,t,n,r);return a.appendChild(Je(e.grid,e,t,n,r)),i.appendChild(a),i}if(e.kind==="line"&&e.lineDirection)return i.appendChild(et(e,t,r)),i;if(e.kind==="line"||e.kind==="rect"||e.kind==="ellipse")return i.appendChild(fe(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=le(o,t,n,r);a.dataset.mrComponentIndex=String(s),i.appendChild(a)}),i}function tt(e,t,n={}){const r=n.dpi??96;$.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 k(e){if(e?.aborted)throw e.reason??new DOMException("The operation was aborted.","AbortError")}const nt=(e,t)=>(k(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 rt(e,t,n){return k(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 it(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 rt(t,i.imageData,n));return k(n),r}function ot(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 Se(e){return je.createPageWindowIndex(e.pageHeightsPx,e.gapPx).window(e.viewportHeightPx,e.scrollTopPx,e.overscan)}const ce=96/25.4;function te(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 Ce(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=te(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 Pe(e,t,n,r){const i=document.createElement("canvas"),{widthPx:o,heightPx:s}=te(e,n),a=Ce(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 at(e,t=96){return u.resolveFontSize(e,t).fontSizePx}function Ae(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)=>{st(e,h,t,n,m+g*l+t.fontSizePx*.8,i)}),e.textAlign="left"}function st(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 lt(e,t,n,r,i,o,s){for(const a of Te.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 ct(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 dt(e,t,n,r,i,o,s,a,l,c,d){const m=ae.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))}lt(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 M=u.mergeComponentStyles(n.style,g.cell.style),_=u.resolveFontSize(M,l),L=g.cell.indentMm??0,P=Math.max(0,g.widthMm-2*h-L),F=C.wrapText(w,P,{fontSizePt:_.fontSizePt,bold:M.bold,italic:M.italic,fontFamily:M.fontFamily??c,letterSpacingPt:M.letterSpacing},d).join(`
|
|
3
|
+
`);Ae(e,{text:F,fontSizePx:_.fontSizePx,bold:M.bold??!1,italic:M.italic,color:u.resolveTextColor(M,I.DEFAULT_TEXT_COLOR),align:M.align??"left",lineHeight:u.resolveLineHeight(M),letterSpacingPx:u.ptToPx(M.letterSpacing??0,l)},r+(g.xMm+h+L)*a,i+(g.yMm+h)*a,P*a,Math.max(0,g.heightMm-2*h)*a,M.fontFamily??c,M.verticalAlign??"middle")}}function mt(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
5
|
`):C.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 de(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):we(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:we(e,t,a,l,c,d);break}}function we(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.");k(t.signal);const o=await C.resolvePlanAssets(e,{...t,format:"canvas"});e=o.plan;const s=[...o.diagnostics,...$.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++){k(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 ze.outputCheckpoint(t,l.length,c-Math.max(0,t.start??0)+1)}return k(t.signal),{blobs:l,diagnostics:s}}function ut(e,t,n,r){return k(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(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,o=t.fontFamily??L.DEFAULT_FONT_FAMILY,s=t.measurer??C.heuristicMeasurer,a=Math.max(0,t.start??0),l=Math.min(e.pages.length-1,t.end??e.pages.length-1),c=[],d=$.reportOutputDiagnostics(e,"canvas",t),m=gt(e,a,l);for(const h of m)$.notifyOutputDiagnostic(h,t),d.push(h);if(t.fidelity==="strict"&&m.length)throw new $.OutputFidelityError(d);for(let h=a;h<=l;h++){k(t.signal);const g=e.pages[h],{canvas:w,ctx:b}=Ce(g,n,r,t.maxCanvasPixels);for(const _ of g.components)de(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 输出)");k(t.signal);const n=await C.resolvePlanAssets(e,{...t,format:"canvas"});e=n.plan;const r=[...n.diagnostics,...$.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??L.DEFAULT_FONT_FAMILY,a=await Ie(e,t,n,r);k(n.signal);const{canvas:l,ctx:c}=Ce(e,i,o,n.maxCanvasPixels);for(const d of e.components)de(c,d,o/25.4,o,s,n.measurer??C.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),$.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*ce,o=t.fontFamily??L.DEFAULT_FONT_FAMILY,s=t.measurer??C.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,I=[],P=0,F=[],Y=0,G=new AbortController;const he=[];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),I=[];const R=Math.min(e.pages.length,3+a*2);for(let z=0;z<R;z++){const E=document.createElement("div");E.style.cssText=`margin:0 auto ${l}px;box-shadow:0 2px 8px rgba(0,0,0,.35);background:#fff;`,w.appendChild(E),I.push(E)}w.appendChild(_),p.appendChild(w)}async function _e(p,R){const z=Y,E=await C.resolvePlanAssets(e,{...t,signal:G.signal,format:"canvas",start:R,end:R});he.push(...E.diagnostics);const A=E.plan.pages[R],X=await Ie(A,R,{...t,signal:G.signal},he);if(z!==Y||!g)return;const{widthPx:re,heightPx:ie}=te(A,r);let B=p.firstElementChild;(!B||B.tagName!=="CANVAS")&&(B=document.createElement("canvas"),p.innerHTML="",p.appendChild(B));const pe=Se(A,n,r,t.maxCanvasPixels);B.width=pe.width,B.height=pe.height,B.style.width=`${re}px`,B.style.height=`${ie}px`;const j=B.getContext("2d");if(j){j.setTransform(1,0,0,1,0,0),j.scale(n,n),j.fillStyle="#ffffff",j.fillRect(0,0,re,ie);for(const He of A.components)de(j,He,i,r,o,s,X);B.dataset.canvasPage=String(R),p.style.height=`${ie}px`,p.style.width=`${re}px`}}function Be(p){Y++,h.start=p.start,h.end=p.end,b.style.height=`${p.start*l+d.slice(0,p.start).reduce((E,A)=>E+A,0)}px`;const R=e.pages.length-1-p.end;_.style.height=`${R*l+d.slice(p.end+1).reduce((E,A)=>E+A,0)}px`;const z=p.end-p.start+1;I.forEach((E,A)=>{if(A<z){E.style.display="";const X=p.start+A;E.style.height=`${d[X]??0}px`}else E.style.display="none"}),F=[];for(let E=p.start;E<=p.end;E++){const A=I[E-p.start];if(!A)continue;A.firstElementChild?.dataset?.canvasPage!==String(E)&&F.push(E)}ne()}function ne(){P||F.length===0||(P=requestAnimationFrame(()=>{P=0;let p=Math.max(1,c);for(;F.length>0&&p-- >0;){const R=F.shift(),z=I[R-h.start];z&&_e(z,R).catch(()=>{})}F.length>0&&ne()}))}function J(){P||(P=requestAnimationFrame(()=>{P=0;const p=g,R=xe({pageHeightsPx:d,viewportHeightPx:p.clientHeight,scrollTopPx:p.scrollTop,overscan:a,gapPx:l});R.start!==h.start||R.end!==h.end?Be(R):ne()}))}let K=null;return{attach(p){if(typeof document>"u")throw new Error("createCanvasPager 需要浏览器环境(SSR 请在客户端钩子中调用 attach)");k(t.signal),G=new AbortController,t.signal?.addEventListener("abort",ge,{once:!0}),$.reportOutputDiagnostics(e,"canvas",t),g=p,$e(),p.addEventListener("scroll",J,{passive:!0}),typeof ResizeObserver<"u"&&(K=new ResizeObserver(()=>J()),K.observe(p)),J()},destroy(){Y++,G.abort(),t.signal?.removeEventListener("abort",ge),P&&cancelAnimationFrame(P),P=0,K?.disconnect(),K=null,g?.removeEventListener("scroll",J),F=[],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 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}repeat(t){return this.templateRepeat=t,this}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}=me(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}:{},...this.templateRepeat?{repeat:this.templateRepeat}:{},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 oe.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 D(e,t,n=!1){if(!Number.isFinite(e)||(n?e<0:e<=0))throw new Error(`${t} 必须是有限${n?"非负":"正"}数`)}function Z(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 D(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=me(t,void 0,e.landscape),r=n.widthMm,i=n.heightMm;return D(r,"纸张 widthMm"),D(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))D(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;D(r,"titleHeightMm"),D(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??{};Z(t.align,"listOptions.align",!0),Z(t.headerAlign,"listOptions.headerAlign",!1);for(const n of["fontSizePt","rowHeightMm","paddingMm"]){const r=t[n];r!==void 0&&D(r,`listOptions.${n}`,n==="paddingMm")}return t}function Rt(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`);Z(i.align,`columns[${r}].align`,!0),Z(i.headerAlign,`columns[${r}].headerAlign`,!1),i.flex!==void 0&&D(i.flex,`columns[${r}].flex`),i.widthMm!==void 0?(D(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:o}=Rt(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 D(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:_}=xt(e,t,n,a);t==="wide"&&(a=w.reduce((P,F)=>P+F.widthMm,0),D(a,"宽表总列宽"),i=a+s.marginLeftMm+s.marginRightMm,D(i,"宽表总宽度"));const I={widthMm:i,heightMm:o,...s,components:[],...t==="wide"?{layout:t}:{}};return m&&I.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}}),I.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:[I]}:{params:e.params,pages:[I]}}function Ct(e){if(e.components!==void 0&&e.pages!==void 0)throw new TypeError("标签 components 与 pages 只能选择一种");const{dataset:t,rowKey:n,copies:r,params:i}=e,o=e.pages??[{components:e.components??[]}],s={repeat:{dataset:t,...n===void 0?{}:{rowKey:n},...r===void 0?{}:{copies:r}},...i===void 0?{}:{params:i},pages:o.map(l=>({widthMm:l.widthMm??e.widthMm??80,heightMm:l.heightMm??e.heightMm??55,marginTopMm:0,marginRightMm:0,marginBottomMm:0,marginLeftMm:0,components:l.components,...l.meta===void 0?{}:{meta:l.meta}}))},a=M.validateReportTemplate(s);if(!a.ok)throw new M.ReportTemplateError(a.errors);return JSON.parse(JSON.stringify(s))}function Pt(e){return e}class N extends Error{constructor(t,n){super(n),this.code=t,this.name="ReportTemplateStoreError"}}function O(e){return JSON.parse(JSON.stringify(e))}function x(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 N("history","修订号无效或已达上限");return String(t+1)}function At(e,t={}){const n=async(s,a)=>{x(a);const l=await e.read(s,a);return x(a),l?O(l):void 0},r=async(s,a)=>{const l=await n(s,a.signal);if((l?.revision??null)!==a.expectedRevision)throw new N("conflict","模板已变化,请重新读取后提交");return l},i=async(s,a,l)=>{if(x(a.signal),!await e.compareAndSwap(s.id,a.expectedRevision,O(s),{signal:a.signal,...l?{publication:O(l)}:{}}))throw new N("conflict","模板已被其他请求更新");return O(s)},o=async(s,a,l,c)=>{if(t.beforePublish){x(l.signal);const g=await t.beforePublish({document:M.parseReportTemplate(a),previous:s.published?M.parseReportTemplate(s.published):void 0,signal:l.signal});if(!g||g.ok!==!0)throw new N("review",g?.issues?.find(w=>w.severity==="error")?.message??"模板发布检查未通过");x(l.signal)}const d=ve(s),m=M.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=>{x(s);const a=await e.list(s);return x(s),O(a)},get:async(s,a={})=>{const l=await n(s,a.signal),c=a.draft?l?.draft:l?.published;return c?M.parseReportTemplate(c):void 0},history:async(s,a)=>{x(a);const l=await e.history(s,a);return x(a),O(l)},saveDraft:async(s,a)=>{a={...a},x(a.signal);const l=M.parseReportTemplate(t.migrate?await t.migrate(s):s),c=await r(l.id,a),d=ve(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 N("missing","模板不存在");if(!l.draft)throw new N("draft","没有可发布的草稿");return o(l,l.draft,a)},rollback:async(s,a,l)=>{l={...l};const c=await r(s,l);if(!c)throw new N("missing","模板不存在");x(l.signal);const d=await e.getVersion(s,a,l.signal);if(!d)throw new N("history","历史修订不存在");return o(c,d.document,l,a)}}}function It(){const e=new Map,t=new Map;return{read:async(n,r)=>{x(r);const i=e.get(n);return i?O(i):void 0},list:async n=>(x(n),Array.from(e.values(),({id:r,revision:i,publishedRevision:o})=>({id:r,revision:i,...o?{publishedRevision:o}:{}}))),history:async(n,r)=>(x(r),Array.from(t.get(n)?.values()??[],i=>O(i))),getVersion:async(n,r,i)=>{x(i);const o=t.get(n)?.get(r);return o?O(o):void 0},compareAndSwap:async(n,r,i,o)=>{if(x(o.signal),(e.get(n)?.revision??null)!==r)return!1;if(i.id!==n)throw new N("history","状态 ID 与存储 ID 不一致");const s=O(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 N("history","发布修订不可覆盖,且必须与状态修订和模板 ID 一致");l.set(a.revision,O(a)),t.set(n,l)}return e.set(n,s),!0}}}function Lt(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 kt(e,t){const n=M.parseReportTemplate(e);if(t.id===n.id)throw new Error("复制模板应使用新的 ID");const{revision:r,...i}=n;return M.parseReportTemplate({...i,id:t.id,name:t.name})}function Dt(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=M.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=Lt(i,o),{template:a,...l}=o;t.set(o.id,o),i.published?n.set(o.id,M.parseReportTemplate(i.published)):s.publishedRevision&&n.set(o.id,M.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=>{ye(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)=>{ye(o.signal);const s=o.mode==="published"?n.get(i):t.get(i);return s?M.parseReportTemplate(s):void 0}}}function ye(e){if(!e?.aborted)return;const t=new Error("模板目录操作已取消");throw t.name="AbortError",t}function Ft(e){return e.map(t=>t.map(n=>/[\t\r\n"]/.test(n)?`"${n.replace(/"/g,'""')}"`:n).join(" ")).join(`\r
|
|
7
|
-
`)}function
|
|
6
|
+
`);Ae(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 de(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?ot(e,h,a,l,c,d):we(e,t,a,l,c,d);return}if(t.grid){dt(e,t.grid,t,a,l,c,d,n,r,i,o);return}switch(t.kind){case"text":{mt(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),ct(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:we(e,t,a,l,c,d);break}}function we(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 ut(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 o=await C.resolvePlanAssets(e,{...t,format:"canvas"});e=o.plan;const s=[...o.diagnostics,...$.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++){k(t.signal);const m=await Le(e.pages[d],d,i,s);try{l.push(await ht(m,a,r,t.signal))}finally{m.width=0,m.height=0}await We.outputCheckpoint(t,l.length,c-Math.max(0,t.start??0)+1)}return k(t.signal),{blobs:l,diagnostics:s}}function ht(e,t,n,r){return k(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 gt(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,o=t.fontFamily??I.DEFAULT_FONT_FAMILY,s=t.measurer??C.heuristicMeasurer,a=Math.max(0,t.start??0),l=Math.min(e.pages.length-1,t.end??e.pages.length-1),c=[],d=$.reportOutputDiagnostics(e,"canvas",t),m=pt(e,a,l);for(const h of m)$.notifyOutputDiagnostic(h,t),d.push(h);if(t.fidelity==="strict"&&m.length)throw new $.OutputFidelityError(d);for(let h=a;h<=l;h++){k(t.signal);const g=e.pages[h],{canvas:w,ctx:M}=Pe(g,n,r,t.maxCanvasPixels);for(const _ of g.components)de(M,_,i,r,o,s);c.push(w)}return{canvases:c,diagnostics:d}}function pt(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 ft(e,t={}){if(typeof document>"u")throw new Error("renderPlanToCanvasAsync 需要浏览器环境(Node 请使用 PDF 或 XLSX 输出)");k(t.signal);const n=await C.resolvePlanAssets(e,{...t,format:"canvas"});e=n.plan;const r=[...n.diagnostics,...$.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 Le(e.pages[s],s,t,r));return{canvases:i,diagnostics:r}}async function Le(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);k(n.signal);const{canvas:l,ctx:c}=Pe(e,i,o,n.maxCanvasPixels);for(const d of e.components)de(c,d,o/25.4,o,s,n.measurer??C.heuristicMeasurer,a);return l}async function Ie(e,t,n,r){const i=n.imageLoader??nt;return it(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),$.notifyOutputDiagnostic(d,n),a}},n.signal)}function wt(e,t={}){const n=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),r=t.dpi??96,i=r/96*ce,o=t.fontFamily??I.DEFAULT_FONT_FAMILY,s=t.measurer??C.heuristicMeasurer,a=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,M=null,_=null,L=[],P=0,F=[],Y=0,G=new AbortController;const he=[];function _e(){const f=g;f.innerHTML="",w=document.createElement("div"),w.style.cssText=`width:${m}px;margin:0 auto;`,M=document.createElement("div"),_=document.createElement("div"),w.appendChild(M),L=[];const R=Math.min(e.pages.length,3+a*2);for(let z=0;z<R;z++){const E=document.createElement("div");E.style.cssText=`margin:0 auto ${l}px;box-shadow:0 2px 8px rgba(0,0,0,.35);background:#fff;`,w.appendChild(E),L.push(E)}w.appendChild(_),f.appendChild(w)}async function Be(f,R){const z=Y,E=await C.resolvePlanAssets(e,{...t,signal:G.signal,format:"canvas",start:R,end:R});he.push(...E.diagnostics);const A=E.plan.pages[R],X=await Ie(A,R,{...t,signal:G.signal},he);if(z!==Y||!g)return;const{widthPx:re,heightPx:ie}=te(A,r);let B=f.firstElementChild;(!B||B.tagName!=="CANVAS")&&(B=document.createElement("canvas"),f.innerHTML="",f.appendChild(B));const pe=Ce(A,n,r,t.maxCanvasPixels);B.width=pe.width,B.height=pe.height,B.style.width=`${re}px`,B.style.height=`${ie}px`;const U=B.getContext("2d");if(U){U.setTransform(1,0,0,1,0,0),U.scale(n,n),U.fillStyle="#ffffff",U.fillRect(0,0,re,ie);for(const ze of A.components)de(U,ze,i,r,o,s,X);B.dataset.canvasPage=String(R),f.style.height=`${ie}px`,f.style.width=`${re}px`}}function He(f){Y++,h.start=f.start,h.end=f.end,M.style.height=`${f.start*l+d.slice(0,f.start).reduce((E,A)=>E+A,0)}px`;const R=e.pages.length-1-f.end;_.style.height=`${R*l+d.slice(f.end+1).reduce((E,A)=>E+A,0)}px`;const z=f.end-f.start+1;L.forEach((E,A)=>{if(A<z){E.style.display="";const X=f.start+A;E.style.height=`${d[X]??0}px`}else E.style.display="none"}),F=[];for(let E=f.start;E<=f.end;E++){const A=L[E-f.start];if(!A)continue;A.firstElementChild?.dataset?.canvasPage!==String(E)&&F.push(E)}ne()}function ne(){P||F.length===0||(P=requestAnimationFrame(()=>{P=0;let f=Math.max(1,c);for(;F.length>0&&f-- >0;){const R=F.shift(),z=L[R-h.start];z&&Be(z,R).catch(()=>{})}F.length>0&&ne()}))}function J(){P||(P=requestAnimationFrame(()=>{P=0;const f=g,R=Se({pageHeightsPx:d,viewportHeightPx:f.clientHeight,scrollTopPx:f.scrollTop,overscan:a,gapPx:l});R.start!==h.start||R.end!==h.end?He(R):ne()}))}let K=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}),$.reportOutputDiagnostics(e,"canvas",t),g=f,_e(),f.addEventListener("scroll",J,{passive:!0}),typeof ResizeObserver<"u"&&(K=new ResizeObserver(()=>J()),K.observe(f)),J()},destroy(){Y++,G.abort(),t.signal?.removeEventListener("abort",ge),P&&cancelAnimationFrame(P),P=0,K?.disconnect(),K=null,g?.removeEventListener("scroll",J),F=[],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 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 ke{constructor(){this.pages=[],this.pending=null,this.templateParams=void 0}repeat(t){return this.templateRepeat=t,this}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}=me(t,typeof n=="number"?n:void 0,o.landscape),l=o.margins??{};return this.pending=new De(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}:{},...this.templateRepeat?{repeat:this.templateRepeat}:{},pages:this.pages}}}class De{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 vt(){return new ke}function yt(e,t={}){return oe.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 D(e,t,n=!1){if(!Number.isFinite(e)||(n?e<0:e<=0))throw new Error(`${t} 必须是有限${n?"非负":"正"}数`)}function Z(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 bt(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 D(n,"columnWidthMm"),{layout:t,columnWidthMm:n}}function Mt(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 D(r,"纸张 widthMm"),D(i,"纸张 heightMm"),{widthMm:r,heightMm:i}}function Et(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))D(i,r,!0);return n}function Tt(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;D(r,"titleHeightMm"),D(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 Rt(e){if(e.listOptions!==void 0&&(!e.listOptions||typeof e.listOptions!="object"||Array.isArray(e.listOptions)))throw new Error("listOptions 必须是列表配置对象");const t=e.listOptions??{};Z(t.align,"listOptions.align",!0),Z(t.headerAlign,"listOptions.headerAlign",!1);for(const n of["fontSizePt","rowHeightMm","paddingMm"]){const r=t[n];r!==void 0&&D(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`);Z(i.align,`columns[${r}].align`,!0),Z(i.headerAlign,`columns[${r}].headerAlign`,!1),i.flex!==void 0&&D(i.flex,`columns[${r}].flex`),i.widthMm!==void 0?(D(i.widthMm,`columns[${r}].widthMm`),t+=i.widthMm):n=Math.max(n,i.flex??1)}return{fixedWidthMm:t,maxFlex:n}}function St(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 D(g,`columns[${h}] 分配后的 widthMm`),{...m,widthMm:g}}),fixedWidthMm:i,maxFlex:o}}function Ct(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}=bt(e),r=Mt(e);let i=r.widthMm;const o=r.heightMm,s=Et(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}=Tt(e,l),g=Rt(e),{columns:w,fixedWidthMm:M,maxFlex:_}=St(e,t,n,a);t==="wide"&&(a=w.reduce((P,F)=>P+F.widthMm,0),D(a,"宽表总列宽"),i=a+s.marginLeftMm+s.marginRightMm,D(i,"宽表总宽度"));const L={widthMm:i,heightMm:o,...s,components:[],...t==="wide"?{layout:t}:{}};return m&&L.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}}),L.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:M}),e.params===void 0?{pages:[L]}:{params:e.params,pages:[L]}}function Pt(e){if(e.components!==void 0&&e.pages!==void 0)throw new TypeError("标签 components 与 pages 只能选择一种");const{dataset:t,rowKey:n,copies:r,params:i}=e,o=e.pages??[{components:e.components??[]}],s={repeat:{dataset:t,...n===void 0?{}:{rowKey:n},...r===void 0?{}:{copies:r}},...i===void 0?{}:{params:i},pages:o.map(l=>({widthMm:l.widthMm??e.widthMm??80,heightMm:l.heightMm??e.heightMm??55,marginTopMm:0,marginRightMm:0,marginBottomMm:0,marginLeftMm:0,components:l.components,...l.meta===void 0?{}:{meta:l.meta}}))},a=b.validateReportTemplate(s);if(!a.ok)throw new b.ReportTemplateError(a.errors);return JSON.parse(JSON.stringify(s))}function At(e){if(!e||typeof e!="object"||!e.repeat)throw new p.ReportSourceError("config","defineLabelReport 需要带 repeat 的固定标签模板");const t=b.validateReportTemplate(e);if(!t.ok)throw new b.ReportTemplateError(t.errors);return e.repeat.dataset}function ve(e,t){if(!Array.isArray(e))throw new p.ReportSourceError("validate","标签数据应为对象数组;请从业务响应中提取行数组");return{[t]:e}}function Lt(e){const{template:t,rows:n,load:r,dataSchema:i,params:o,pagination:s,dataValidation:a}=e,l=At(t);if(n!==void 0==(r!==void 0)||r!==void 0&&typeof r!="function")throw new p.ReportSourceError("config","标签报表应且只能配置 rows 或 load 其中一种数据来源");const c={template:t,params:o,pagination:s,dataValidation:a,...i===void 0?{}:{dataSchema:{[l]:i}}};return r?p.defineReport({...c,load:r,mapData:d=>ve(d,l)}):{...c,datasets:ve(n,l)}}function It(e){return e}class N extends Error{constructor(t,n){super(n),this.code=t,this.name="ReportTemplateStoreError"}}function O(e){return JSON.parse(JSON.stringify(e))}function x(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 N("history","修订号无效或已达上限");return String(t+1)}function kt(e,t={}){const n=async(s,a)=>{x(a);const l=await e.read(s,a);return x(a),l?O(l):void 0},r=async(s,a)=>{const l=await n(s,a.signal);if((l?.revision??null)!==a.expectedRevision)throw new N("conflict","模板已变化,请重新读取后提交");return l},i=async(s,a,l)=>{if(x(a.signal),!await e.compareAndSwap(s.id,a.expectedRevision,O(s),{signal:a.signal,...l?{publication:O(l)}:{}}))throw new N("conflict","模板已被其他请求更新");return O(s)},o=async(s,a,l,c)=>{if(t.beforePublish){x(l.signal);const g=await t.beforePublish({document:b.parseReportTemplate(a),previous:s.published?b.parseReportTemplate(s.published):void 0,signal:l.signal});if(!g||g.ok!==!0)throw new N("review",g?.issues?.find(w=>w.severity==="error")?.message??"模板发布检查未通过");x(l.signal)}const d=ye(s),m=b.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=>{x(s);const a=await e.list(s);return x(s),O(a)},get:async(s,a={})=>{const l=await n(s,a.signal),c=a.draft?l?.draft:l?.published;return c?b.parseReportTemplate(c):void 0},history:async(s,a)=>{x(a);const l=await e.history(s,a);return x(a),O(l)},saveDraft:async(s,a)=>{a={...a},x(a.signal);const l=b.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 N("missing","模板不存在");if(!l.draft)throw new N("draft","没有可发布的草稿");return o(l,l.draft,a)},rollback:async(s,a,l)=>{l={...l};const c=await r(s,l);if(!c)throw new N("missing","模板不存在");x(l.signal);const d=await e.getVersion(s,a,l.signal);if(!d)throw new N("history","历史修订不存在");return o(c,d.document,l,a)}}}function Dt(){const e=new Map,t=new Map;return{read:async(n,r)=>{x(r);const i=e.get(n);return i?O(i):void 0},list:async n=>(x(n),Array.from(e.values(),({id:r,revision:i,publishedRevision:o})=>({id:r,revision:i,...o?{publishedRevision:o}:{}}))),history:async(n,r)=>(x(r),Array.from(t.get(n)?.values()??[],i=>O(i))),getVersion:async(n,r,i)=>{x(i);const o=t.get(n)?.get(r);return o?O(o):void 0},compareAndSwap:async(n,r,i,o)=>{if(x(o.signal),(e.get(n)?.revision??null)!==r)return!1;if(i.id!==n)throw new N("history","状态 ID 与存储 ID 不一致");const s=O(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 N("history","发布修订不可覆盖,且必须与状态修订和模板 ID 一致");l.set(a.revision,O(a)),t.set(n,l)}return e.set(n,s),!0}}}function Ft(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 Nt(e,t){const n=b.parseReportTemplate(e);if(t.id===n.id)throw new Error("复制模板应使用新的 ID");const{revision:r,...i}=n;return b.parseReportTemplate({...i,id:t.id,name:t.name})}function Ot(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=b.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=Ft(i,o),{template:a,...l}=o;t.set(o.id,o),i.published?n.set(o.id,b.parseReportTemplate(i.published)):s.publishedRevision&&n.set(o.id,b.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?b.parseReportTemplate(s):void 0}}}function be(e){if(!e?.aborted)return;const t=new Error("模板目录操作已取消");throw t.name="AbortError",t}function $t(e){return e.map(t=>t.map(n=>/[\t\r\n"]/.test(n)?`"${n.replace(/"/g,'""')}"`:n).join(" ")).join(`\r
|
|
7
|
+
`)}function _t(e,t){const n=e[e.length-1];e.length>1&&n?.length===1&&n[0]===""&&/[\r\n]$/.test(t)&&e.pop()}function Bt(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
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(),Nt(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 $t(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&&$t(t)>e.precision&&v(e,"precision",e.precision)}function Bt(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 Wt(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 Ut(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"),Ut(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"&&Wt(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"&&Bt(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 Q(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 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(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:ue(r)+t.rowIndex,column:a}}return{grid:`${t.pageIndex}:${t.componentIndex}`,row:t.rowIndex,column:t.columnIndex}}function qt(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 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 Gt(e){if(!e)return!1;const t=e.replace(/"[^"]*"|\\.|\[(?![hms]+\])[^\]]*\]/gi,"");return/[ymdhs]/i.test(t)}function Vt(e){if(e.valueType==="text"||e.valueType==="boolean"||Gt(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 Yt(e,t,n){if(e.seen.has(n))return;e.seen.add(n),e.selected++;const r=t?Vt(t):null;r===null?e.excluded++:e.values.push(r)}function Jt(e,t,n,r){return r.origin?e.table?.id===r.origin.id:`${t}:${n}`===r.grid}function Kt(e,t,n){return n.origin?n.origin.columnKeys.indexOf(e.table.columnKeys[t]??""):t}function Xt(e,t,n,r){const i=r.origin?ue(e)+t:t,o=Kt(e,n,r);return i<r.rowStart||i>r.rowEnd||o<r.columnStart||o>r.columnEnd?null:`${r.grid}:${i}:${o}`}function Zt(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 Qt(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 Q(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 Q(r,m-1);for(let w=c;w<c+m;w++)a.set(w,h);const g=Xt(e,l,c,n);g&&Yt(i,d,g),c+=m}}}async function en(e,t,n){const r={values:[],seen:new Set,excluded:0,selected:0};for(let i=0;i<e.pages.length;i++){await Q(n);const o=e.pages[i];for(let s=0;s<o.components.length;s++){await Q(n);const a=o.components[s];if(!a.grid||!Jt(a,i,s,t)||a.table&&a.table.role!=="body")continue;const l=Zt(a,t);l&&await Qt(a,l,t,n,r)}}return r}function V(e){if(!Number.isFinite(e))throw new y("overflow");return e}function tn(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 Me(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 nn(e){const t=tn(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 rn(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 on(e,t,n={}){const r=rn(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 en(e,qt(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 Me(o.values,i);else{const l=nn(o.values);s==="expression"?(/\bMEDIAN\b/i.test(n.expression??"")&&(l.MEDIAN=await Me(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=L.DEFAULT_BORDER_PT;exports.DEFAULT_FONT_FAMILY=L.DEFAULT_FONT_FAMILY;exports.DEFAULT_FONT_PT=L.DEFAULT_FONT_PT;exports.DEFAULT_STROKE_COLOR=L.DEFAULT_STROKE_COLOR;exports.DEFAULT_TEXT_COLOR=L.DEFAULT_TEXT_COLOR;exports.LINE_HEIGHT=L.LINE_HEIGHT;exports.SCHEMA_VERSION_MACH=L.SCHEMA_VERSION_MACH;exports.ReportBindingError=U.ReportBindingError;exports.evalStyleRule=U.evalStyleRule;exports.formatValue=U.formatValue;exports.parseDateLocal=U.parseDateLocal;exports.resolveComponentBinding=U.resolveComponentBinding;exports.toExcelNumberFormat=U.toExcelNumberFormat;exports.toNumber=U.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=ee.assertRenderPlan;exports.validateComponent=ee.validateComponent;exports.validatePage=ee.validatePage;exports.validateRenderPlan=ee.validateRenderPlan;exports.datasetJsonSchema=oe.datasetJsonSchema;exports.validateDatasetRows=oe.validateDatasetRows;exports.OutputAssetError=C.OutputAssetError;exports.charWidthEm=C.charWidthEm;exports.createCanvasMeasurer=C.createCanvasMeasurer;exports.createHeuristicMeasurer=C.createHeuristicMeasurer;exports.heuristicMeasurer=C.heuristicMeasurer;exports.measureTextMm=C.measureTextMm;exports.resolvePlanAssets=C.resolvePlanAssets;exports.wrapText=C.wrapText;exports.DEFAULT_LABEL_PAGE_LIMIT=f.DEFAULT_LABEL_PAGE_LIMIT;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=ae.resolveGridLayout;exports.OutputFidelityError=$.OutputFidelityError;exports.inspectOutputCapabilities=$.inspectOutputCapabilities;exports.reportOutputDiagnostics=$.reportOutputDiagnostics;exports.REPORT_TEMPLATE_DOCUMENT_VERSION=M.REPORT_TEMPLATE_DOCUMENT_VERSION;exports.ReportTemplateError=M.ReportTemplateError;exports.createTemplateRegistry=M.createTemplateRegistry;exports.defineReportTemplate=M.defineReportTemplate;exports.parseReportTemplate=M.parseReportTemplate;exports.serializeReportTemplate=M.serializeReportTemplate;exports.validateReportTemplate=M.validateReportTemplate;exports.validateReportTemplateDocument=M.validateReportTemplateDocument;exports.ReportParamValidationError=H.ReportParamValidationError;exports.assertReportParams=H.assertReportParams;exports.formatReportDateRange=H.formatReportDateRange;exports.isReportDate=H.isReportDate;exports.isReportMonth=H.isReportMonth;exports.isReportYear=H.isReportYear;exports.parseReportDateRange=H.parseReportDateRange;exports.reportParamsJsonSchema=H.reportParamsJsonSchema;exports.validateReportParamDefinitions=H.validateReportParamDefinitions;exports.validateReportParams=H.validateReportParams;exports.TreeRowLimitError=se.TreeRowLimitError;exports.createTreeTable=se.createTreeTable;exports.validateTreeOptions=se.validateTreeOptions;exports.PageBuilder=ke;exports.ReportCalculationError=y;exports.ReportCellFieldError=De;exports.ReportTemplateStoreError=N;exports.TemplateBuilder=Le;exports.calculateReportSelection=on;exports.classOf=S;exports.cloneReportTemplate=kt;exports.columnsFromContract=vt;exports.computePageWindow=xe;exports.createCanvasPager=ft;exports.createLabelTemplate=Ct;exports.createLocalTemplateCatalog=Dt;exports.createMemoryTemplateStore=It;exports.createProviderReport=Pt;exports.createTableTemplate=St;exports.createTemplate=wt;exports.createTemplateManager=At;exports.evaluateReportAggregateExpression=Oe;exports.formatReportClipboard=Ft;exports.measurePageSizePx=te;exports.parseReportCellFieldInput=jt;exports.parseReportClipboard=Ot;exports.planFontSizePx=ot;exports.renderComponent=le;exports.renderPage=Re;exports.renderPlan=et;exports.renderPlanToCanvas=ht;exports.renderPlanToCanvasAsync=pt;exports.renderPlanToImages=mt;exports.resolvePaper=me;exports.validateReportCellFieldDefinition=Ne;
|
|
9
|
+
`&&l++;continue}if(o)throw new Error("Invalid quoted clipboard value");r+=c}if(i)throw new Error("Unclosed clipboard quote");return a(),_t(n,e),n}class Fe 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 Fe(t,e,n)}function Ne(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 Ht(e){const[t="",n="0"]=String(e).toLowerCase().split("e");return Math.max(0,(t.split(".")[1]?.length??0)-Number(n))}function zt(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&&Ht(t)>e.precision&&v(e,"precision",e.precision)}function Wt(e,t){Ne(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 jt(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 Ut(e){[e.min,e.max].some(t=>t!==void 0&&!Ne(t))&&v(e,"definition"),e.min!==void 0&&e.max!==void 0&&e.min>e.max&&v(e,"definition")}function qt(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 Gt(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 Oe(e,t){(!t||typeof t!="object"||Array.isArray(t)||!["text","number","boolean","enum","date"].includes(t.type))&&v(t??{type:"text"},"definition"),Gt(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"&&jt(t),t.type==="text"&&t.maxLength!==void 0&&(!Number.isInteger(t.maxLength)||t.maxLength<0)&&v(t,"definition"),t.type==="date"&&Ut(t),t.type==="enum"&&qt(e,t)}function Vt(e,t,n){if(!e.editable)throw new p.ReportCellEditError("readonly");n&&Oe(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"&&zt(n,r),n.type==="date"&&Wt(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 Q(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 ue(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:ue(r)+t.rowIndex,column:a}}return{grid:`${t.pageIndex}:${t.componentIndex}`,row:t.rowIndex,column:t.columnIndex}}function Yt(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 Jt(e){if(!e)return!1;const t=e.replace(/"[^"]*"|\\.|\[(?![hms]+\])[^\]]*\]/gi,"");return/[ymdhs]/i.test(t)}function Kt(e){if(e.valueType==="text"||e.valueType==="boolean"||Jt(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 Xt(e,t,n){if(e.seen.has(n))return;e.seen.add(n),e.selected++;const r=t?Kt(t):null;r===null?e.excluded++:e.values.push(r)}function Zt(e,t,n,r){return r.origin?e.table?.id===r.origin.id:`${t}:${n}`===r.grid}function Qt(e,t,n){return n.origin?n.origin.columnKeys.indexOf(e.table.columnKeys[t]??""):t}function en(e,t,n,r){const i=r.origin?ue(e)+t:t,o=Qt(e,n,r);return i<r.rowStart||i>r.rowEnd||o<r.columnStart||o>r.columnEnd?null:`${r.grid}:${i}:${o}`}function tn(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 nn(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 Q(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 Q(r,m-1);for(let w=c;w<c+m;w++)a.set(w,h);const g=en(e,l,c,n);g&&Xt(i,d,g),c+=m}}}async function rn(e,t,n){const r={values:[],seen:new Set,excluded:0,selected:0};for(let i=0;i<e.pages.length;i++){await Q(n);const o=e.pages[i];for(let s=0;s<o.components.length;s++){await Q(n);const a=o.components[s];if(!a.grid||!Zt(a,i,s,t)||a.table&&a.table.role!=="body")continue;const l=tn(a,t);l&&await nn(a,l,t,n,r)}}return r}function V(e){if(!Number.isFinite(e))throw new y("overflow");return e}function on(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 an(e){const t=on(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 $e(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 sn(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 ln(e,t,n={}){const r=sn(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 rn(e,Yt(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=an(o.values);s==="expression"?(/\bMEDIAN\b/i.test(n.expression??"")&&(l.MEDIAN=await Ee(o.values,i)),a=$e(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.ReportBindingError=j.ReportBindingError;exports.evalStyleRule=j.evalStyleRule;exports.formatValue=j.formatValue;exports.parseDateLocal=j.parseDateLocal;exports.resolveComponentBinding=j.resolveComponentBinding;exports.toExcelNumberFormat=j.toExcelNumberFormat;exports.toNumber=j.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=ee.assertRenderPlan;exports.validateComponent=ee.validateComponent;exports.validatePage=ee.validatePage;exports.validateRenderPlan=ee.validateRenderPlan;exports.datasetJsonSchema=oe.datasetJsonSchema;exports.validateDatasetRows=oe.validateDatasetRows;exports.OutputAssetError=C.OutputAssetError;exports.charWidthEm=C.charWidthEm;exports.createCanvasMeasurer=C.createCanvasMeasurer;exports.createHeuristicMeasurer=C.createHeuristicMeasurer;exports.heuristicMeasurer=C.heuristicMeasurer;exports.measureTextMm=C.measureTextMm;exports.resolvePlanAssets=C.resolvePlanAssets;exports.wrapText=C.wrapText;exports.DEFAULT_LABEL_PAGE_LIMIT=p.DEFAULT_LABEL_PAGE_LIMIT;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=ae.resolveGridLayout;exports.OutputFidelityError=$.OutputFidelityError;exports.inspectOutputCapabilities=$.inspectOutputCapabilities;exports.reportOutputDiagnostics=$.reportOutputDiagnostics;exports.REPORT_TEMPLATE_DOCUMENT_VERSION=b.REPORT_TEMPLATE_DOCUMENT_VERSION;exports.ReportTemplateError=b.ReportTemplateError;exports.createTemplateRegistry=b.createTemplateRegistry;exports.defineReportTemplate=b.defineReportTemplate;exports.parseReportTemplate=b.parseReportTemplate;exports.serializeReportTemplate=b.serializeReportTemplate;exports.validateReportTemplate=b.validateReportTemplate;exports.validateReportTemplateDocument=b.validateReportTemplateDocument;exports.ReportParamValidationError=H.ReportParamValidationError;exports.assertReportParams=H.assertReportParams;exports.formatReportDateRange=H.formatReportDateRange;exports.isReportDate=H.isReportDate;exports.isReportMonth=H.isReportMonth;exports.isReportYear=H.isReportYear;exports.parseReportDateRange=H.parseReportDateRange;exports.reportParamsJsonSchema=H.reportParamsJsonSchema;exports.validateReportParamDefinitions=H.validateReportParamDefinitions;exports.validateReportParams=H.validateReportParams;exports.TreeRowLimitError=se.TreeRowLimitError;exports.createTreeTable=se.createTreeTable;exports.validateTreeOptions=se.validateTreeOptions;exports.PageBuilder=De;exports.ReportCalculationError=y;exports.ReportCellFieldError=Fe;exports.ReportTemplateStoreError=N;exports.TemplateBuilder=ke;exports.calculateReportSelection=ln;exports.classOf=S;exports.cloneReportTemplate=Nt;exports.columnsFromContract=yt;exports.computePageWindow=Se;exports.createCanvasPager=wt;exports.createLabelTemplate=Pt;exports.createLocalTemplateCatalog=Ot;exports.createMemoryTemplateStore=Dt;exports.createProviderReport=It;exports.createTableTemplate=Ct;exports.createTemplate=vt;exports.createTemplateManager=kt;exports.defineLabelReport=Lt;exports.evaluateReportAggregateExpression=$e;exports.formatReportClipboard=$t;exports.measurePageSizePx=te;exports.parseReportCellFieldInput=Vt;exports.parseReportClipboard=Bt;exports.planFontSizePx=at;exports.renderComponent=le;exports.renderPage=xe;exports.renderPlan=tt;exports.renderPlanToCanvas=gt;exports.renderPlanToCanvasAsync=ft;exports.renderPlanToImages=ut;exports.resolvePaper=me;exports.validateReportCellFieldDefinition=Oe;
|
package/dist/index.d.cts
CHANGED
|
@@ -361,6 +361,13 @@ export declare const DEFAULT_STROKE_COLOR = "#333333";
|
|
|
361
361
|
/** 默认文本色 */
|
|
362
362
|
export declare const DEFAULT_TEXT_COLOR = "#000000";
|
|
363
363
|
|
|
364
|
+
/**
|
|
365
|
+
* Flat label integration for the same Vue/Node source pipeline: template + rows/load.
|
|
366
|
+
* It maps the one dataset and optional contract without caching or converting business values.
|
|
367
|
+
* Dynamic templates and multiple datasets continue to use defineReport.
|
|
368
|
+
*/
|
|
369
|
+
export declare function defineLabelReport(options: LabelReportDefinitionOptions): ReportDefinition;
|
|
370
|
+
|
|
364
371
|
/** 类型推导业务接口的响应,包内完成字段映射后交给同一分页流程。 */
|
|
365
372
|
export declare function defineReport<TData>(definition: ReportDefinitionOptions<TData>): ReportDefinition;
|
|
366
373
|
|
|
@@ -512,6 +519,24 @@ export declare function isReportYear(value: string): boolean;
|
|
|
512
519
|
|
|
513
520
|
export declare function isRichText(comp: PlanComponent): boolean;
|
|
514
521
|
|
|
522
|
+
declare interface LabelReportDefinitionBase extends Pick<ReportDefinition, "params" | "pagination" | "dataValidation"> {
|
|
523
|
+
/** An existing fixed label template. Its repeat.dataset supplies the dataset name. */
|
|
524
|
+
template: ReportTemplate;
|
|
525
|
+
/** The single label dataset's contract; no dataset-name wrapper is needed. */
|
|
526
|
+
dataSchema?: DatasetContract;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
export declare type LabelReportDefinitionOptions = LabelReportDefinitionBase & ({
|
|
530
|
+
rows: LabelReportRows;
|
|
531
|
+
load?: never;
|
|
532
|
+
} | {
|
|
533
|
+
rows?: never;
|
|
534
|
+
load: (context: ReportLoadContext) => LabelReportRows | Promise<LabelReportRows>;
|
|
535
|
+
});
|
|
536
|
+
|
|
537
|
+
/** Named business row interfaces and readonly arrays need no index signature or conversion. */
|
|
538
|
+
export declare type LabelReportRows = readonly object[];
|
|
539
|
+
|
|
515
540
|
export declare interface LabelTemplateOptions extends ReportTemplateRepeat {
|
|
516
541
|
widthMm?: number;
|
|
517
542
|
heightMm?: number;
|
package/dist/index.d.ts
CHANGED
|
@@ -361,6 +361,13 @@ export declare const DEFAULT_STROKE_COLOR = "#333333";
|
|
|
361
361
|
/** 默认文本色 */
|
|
362
362
|
export declare const DEFAULT_TEXT_COLOR = "#000000";
|
|
363
363
|
|
|
364
|
+
/**
|
|
365
|
+
* Flat label integration for the same Vue/Node source pipeline: template + rows/load.
|
|
366
|
+
* It maps the one dataset and optional contract without caching or converting business values.
|
|
367
|
+
* Dynamic templates and multiple datasets continue to use defineReport.
|
|
368
|
+
*/
|
|
369
|
+
export declare function defineLabelReport(options: LabelReportDefinitionOptions): ReportDefinition;
|
|
370
|
+
|
|
364
371
|
/** 类型推导业务接口的响应,包内完成字段映射后交给同一分页流程。 */
|
|
365
372
|
export declare function defineReport<TData>(definition: ReportDefinitionOptions<TData>): ReportDefinition;
|
|
366
373
|
|
|
@@ -512,6 +519,24 @@ export declare function isReportYear(value: string): boolean;
|
|
|
512
519
|
|
|
513
520
|
export declare function isRichText(comp: PlanComponent): boolean;
|
|
514
521
|
|
|
522
|
+
declare interface LabelReportDefinitionBase extends Pick<ReportDefinition, "params" | "pagination" | "dataValidation"> {
|
|
523
|
+
/** An existing fixed label template. Its repeat.dataset supplies the dataset name. */
|
|
524
|
+
template: ReportTemplate;
|
|
525
|
+
/** The single label dataset's contract; no dataset-name wrapper is needed. */
|
|
526
|
+
dataSchema?: DatasetContract;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
export declare type LabelReportDefinitionOptions = LabelReportDefinitionBase & ({
|
|
530
|
+
rows: LabelReportRows;
|
|
531
|
+
load?: never;
|
|
532
|
+
} | {
|
|
533
|
+
rows?: never;
|
|
534
|
+
load: (context: ReportLoadContext) => LabelReportRows | Promise<LabelReportRows>;
|
|
535
|
+
});
|
|
536
|
+
|
|
537
|
+
/** Named business row interfaces and readonly arrays need no index signature or conversion. */
|
|
538
|
+
export declare type LabelReportRows = readonly object[];
|
|
539
|
+
|
|
515
540
|
export declare interface LabelTemplateOptions extends ReportTemplateRepeat {
|
|
516
541
|
widthMm?: number;
|
|
517
542
|
heightMm?: number;
|