@agile-team/mach-report 0.9.1 → 0.10.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.
@@ -21,6 +21,22 @@ export declare function resolvePaper(paper: PaperName | {
21
21
  export declare class TemplateBuilder {
22
22
  readonly pages: TemplatePage[];
23
23
  private pending;
24
+ private templateParams;
25
+ /**
26
+ * 声明报表参数(链式,可放在 .page() 前后任意位置):
27
+ * 渲染组件据此自动生成查询面板(也可由 paramDefs prop 提供,prop 优先)。
28
+ *
29
+ * ```ts
30
+ * createTemplate()
31
+ * .params([
32
+ * { field: "whCode", label: "仓库", type: "select", options: [...], required: true },
33
+ * { field: "date", label: "日期", type: "date", defaultValue: "2026-09-30" }
34
+ * ])
35
+ * .page("a4").text(...).list(...)
36
+ * .build();
37
+ * ```
38
+ */
39
+ params(defs: NonNullable<ReportTemplate["params"]>): this;
24
40
  /**
25
41
  * 新建页。纸张支持三种写法:
26
42
  * - 预设名:.page("a4", { landscape: true, margins: {...} })
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("./style-Xq08-IsV.cjs"),ce=require("./grid-geometry-BXpOxznT.cjs");function he(e){const t=/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/.exec(e.trim());if(t){const n=new Date(Number(t[1]),Number(t[2])-1,Number(t[3]));return Number.isNaN(n.getTime())?null:n}const r=new Date(e);return Number.isNaN(r.getTime())?null:r}function K(e,t){return e.toLocaleString("en-US",{minimumFractionDigits:t,maximumFractionDigits:t})}function Ce(e,t){const r=n=>String(n).padStart(2,"0");return t.replace(/YYYY/g,String(e.getFullYear())).replace(/MM/g,r(e.getMonth()+1)).replace(/DD/g,r(e.getDate())).replace(/hh/g,r(e.getHours())).replace(/mm/g,r(e.getMinutes())).replace(/ss/g,r(e.getSeconds()))}function ke(e,t,r){return r!=null?t?K(e,r):e.toFixed(r):t?K(e):String(e)}function Y(e){const t=typeof e=="number"?e:Number(String(e).replace(/,/g,""));return Number.isFinite(t)?t:null}function X(e,t){if(e==null||e===""||!t)return String(e??"");switch(t.kind){case"number":{const r=Y(e);return r==null?String(e):ke(r,t.thousands===!0,t.digits)}case"percent":{const r=Y(e);return r==null?String(e):`${K(r*100,t.digits??2)}%`}case"date":{const r=t.pattern??"YYYY-MM-DD",n=e instanceof Date?e:he(String(e));return n?Ce(n,r):String(e)}default:return String(e)}}function me(e,t){const r=e[t.field];if(r==null||r==="")return!1;if(typeof t.value=="number"){const s=Y(r);if(s==null)return!1;switch(t.op){case">":return s>t.value;case">=":return s>=t.value;case"<":return s<t.value;case"<=":return s<=t.value;case"==":return s===t.value;case"!=":return s!==t.value}}const n=String(r),o=String(t.value);switch(t.op){case"==":return n===o;case"!=":return n!==o;case">":return n>o;case">=":return n>=o;case"<":return n<o;case"<=":return n<=o}return!1}const Ae=new Set(["text","image","barcode","qrcode","chart","line","rect","ellipse"]);function W(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Re(e,t,r,n){const o=e[t];o!=null&&(typeof o!="number"||!Number.isFinite(o))&&n.push({path:`${r}.${t}`,message:`应为有限数字,实际 ${JSON.stringify(o)}`})}function Z(e,t,r,n=[]){if(!W(e)){r.push({path:t,message:"组件应为对象"});return}const o=e.kind;typeof o!="string"?r.push({path:`${t}.kind`,message:"组件缺少 kind 字符串"}):Ae.has(o)||n.push({path:`${t}.kind`,message:`未知组件类型 ${JSON.stringify(o)},将以兜底方式渲染`});for(const i of["leftMm","topMm","widthMm","heightMm"])Re(e,i,t,r);e.leftMm!=null&&e.widthMm!=null&&(e.leftMm<-100||e.widthMm<0)&&r.push({path:t,message:"几何数值异常(leftMm<-100 或 widthMm<0)"});const s=e.grid;s!==void 0&&(!W(s)||!Array.isArray(s.cells)?r.push({path:`${t}.grid.cells`,message:"grid.cells 应为二维数组"}):s.cells.forEach((i,c)=>{if(!Array.isArray(i)){r.push({path:`${t}.grid.cells.${c}`,message:"行应为数组"});return}i.forEach((h,m)=>{h!=null&&W(h)&&Array.isArray(h.children)&&h.children.forEach((g,l)=>{Z(g,`${t}.grid.cells.${c}.${m}.children.${l}`,r,n)})})}));const a=e.richParagraphs;a!==void 0&&(Array.isArray(a)?a.forEach((i,c)=>{(!W(i)||!Array.isArray(i.segments))&&r.push({path:`${t}.richParagraphs.${c}`,message:"段落缺少 segments 数组"})}):r.push({path:`${t}.richParagraphs`,message:"richParagraphs 应为数组"}))}function ge(e,t,r,n=[]){if(!W(e)){r.push({path:t,message:"页应为对象"});return}const o=e.pageWidthMm,s=e.pageHeightMm;(typeof o!="number"||!(o>0&&o<3e3))&&r.push({path:`${t}.pageWidthMm`,message:`页宽非法: ${JSON.stringify(o)}`}),(typeof s!="number"||!(s>0&&s<5e3))&&r.push({path:`${t}.pageHeightMm`,message:`页高非法: ${JSON.stringify(s)}`});const a=e.components;a!==void 0&&!Array.isArray(a)?r.push({path:`${t}.components`,message:"components 应为数组"}):Array.isArray(a)&&a.forEach((i,c)=>Z(i,`${t}.components.${c}`,r,n))}function fe(e){const t=[],r=[],n=W(e)?e.pages:void 0;if(!Array.isArray(n))t.push({path:"$.pages",message:e==null?"渲染计划为空":"渲染计划缺少 pages 数组"});else{n.forEach((s,a)=>ge(s,`$.pages.${a}`,t,r)),n.length>2e3&&r.push({path:"$.pages",message:`页数异常大(${n.length} 页),渲染与打印耗时可能显著增加`});const o=n.reduce((s,a)=>s+(W(a)&&Array.isArray(a.components)?a.components.length:0),0);o>5e4&&r.push({path:"$.pages",message:`组件总数异常大(${o} 个),可能触发浏览器性能限制`})}return{ok:t.length===0,errors:t,warnings:r}}function He(e){const t=fe(e);if(!t.ok){const r=t.errors.slice(0,3).map(n=>`${n.path}: ${n.message}`).join("; ");throw new Error(`渲染计划校验失败(${t.errors.length} 处): ${r}`)}return e.pages}function ae(e){return{widthMm:e.widthMm,heightMm:e.heightMm,marginTopMm:e.marginTopMm??0,marginBottomMm:e.marginBottomMm??0,marginLeftMm:e.marginLeftMm??0,marginRightMm:e.marginRightMm??0,components:[]}}function Ne(e,t){return t.heightMm-(e.marginBottomMm??t.marginBottomMm)}function $e(e,t){const n=(e.fontSizePt??d.DEFAULT_FONT_PT)*d.LINE_HEIGHT*25.4/72,o=(e.paddingMm??1)*2;return Math.max(e.rowHeightMm??0,t*n+o)}function ue(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number")return String(e);if(typeof e=="boolean")return e?"是":"否";if(e instanceof Date)return e.toISOString().slice(0,10);try{return JSON.stringify(e)}catch{return String(e)}}function Le(e,t){const r=e.fontSizePt??d.DEFAULT_FONT_PT,n=e.paddingMm??1,o=e.columns.map(l=>l.style?{align:"left",verticalAlign:"middle",...l.style}:{align:"left",verticalAlign:"middle"}),s=e.columns.map(l=>({bold:e.headerBold??!0,align:"center",verticalAlign:"middle",backgroundColor:e.headerBackgroundColor,...l.style||{}})),a=e.columns.map(l=>l.header),i=a.map((l,u)=>d.wrapText(l,e.columns[u].widthMm-n*2,{fontSizePt:r,bold:e.headerBold??!0},t)),c=Math.max(...i.map(l=>l.length),1),h=$e(e,c),m=a.map((l,u)=>({text:l,style:s[u]})),g=e.border===!1?{borderTop:!1,borderRight:!1,borderBottom:!1,borderLeft:!1}:{borderBottom:!0,borderLeft:!0,borderRight:!0,borderTop:!0};return{fontSizePt:r,paddingMm:n,cellStyles:o,borderStyle:g,headerHeightMm:h,headerGrid:{cells:[m],rowHeightsMm:[h]},columns:e.columns}}function le(e,t,r){const n=e.columns,o=new Array(n.length);let s=1;for(let m=0;m<n.length;m++){const g=n[m];o[m]=g.format?X(t[g.field],g.format):ue(t[g.field])}const a=new Array(n.length);for(let m=0;m<n.length;m++){const g=d.wrapText(o[m],n[m].widthMm-e.paddingMm*2,{fontSizePt:e.fontSizePt},r);a[m]=g,g.length>s&&(s=g.length)}const i=e.fontSizePt*d.LINE_HEIGHT*25.4/72,c=Math.max(e.rowHeightFloorMm,s*i+e.paddingMm*2),h=new Array(n.length);for(let m=0;m<n.length;m++){const g=n[m];let l=e.cellStyles[m];if(g.rules){for(const u of g.rules)if(me(t,u.when)){l={...l??{},...u.style};break}}h[m]={text:o[m],style:l}}return{grid:{cells:[h],rowHeightsMm:[c]},heightMm:c}}function _e(e,t,r={}){const n=typeof r=="number"?{mmPerRow:r}:r,o=n.mmPerRow??0,s=n.measurer??d.heuristicMeasurer,a=[],i=[];let c=0;const h=g=>`${g}_${(++c).toString(36)}`,m=[];for(const g of e.pages){const l=ae(g),u=()=>Ne(g,l),f=l.marginTopMm,T=[],R=()=>{if(i.push({pageWidthMm:l.widthMm,pageHeightMm:l.heightMm,marginTopMm:l.marginTopMm,marginBottomMm:l.marginBottomMm,marginLeftMm:l.marginLeftMm,marginRightMm:l.marginRightMm,components:l.components}),T.length>0){const v=i.length;for(const S of T){const C={...S,text:String(S.text??"").replace(/\{page\}/g,String(v))};i[i.length-1].components.push(C),C.text.includes("{totalPages}")&&m.push(C)}}};for(const v of g.components){if(v.kind!=="list"){if(v.kind==="text"&&typeof v.text=="string"){const M=v.text;if(M.includes("{page}")||M.includes("{totalPages}")){T.push(v);continue}}l.components.push(v);continue}const S=v,C=t[S.dataset];Array.isArray(C)||a.push(`数据集 ${S.dataset} 未提供数据,列表 ${S.id??""} 输出为空`);const w=Array.isArray(C)?C:[],V=S.columns.reduce((M,b)=>M+b.widthMm,0),U=V>S.widthMm?S.widthMm/V:1,P=U===1?S:{...S,columns:S.columns.map(M=>({...M,widthMm:M.widthMm*U}))},H={...Le(P,s),rowHeightFloorMm:P.rowHeightMm??0},G={kind:"rect",leftMm:S.leftMm,topMm:0,widthMm:S.widthMm,heightMm:H.headerHeightMm,grid:H.headerGrid,nid:h("listh"),style:H.borderStyle};let p=S.topMm;const N=(M,b)=>{M.components.push({...G,topMm:b})};N(l,p),p+=H.headerHeightMm+o;const F=M=>{if(p+M>u()){R();const b=ae(g);l.components=b.components,l.heightMm=b.heightMm,P.headerEveryPage!==!1?(N(l,S.topMm),p=S.topMm+H.headerHeightMm):p=f}},y=(M,b,x)=>{F(b),l.components.push({kind:"rect",leftMm:S.leftMm,topMm:p,widthMm:S.widthMm,heightMm:b,grid:M,nid:h(x),style:H.borderStyle}),p+=b},$=()=>le(H,{},s).heightMm,k=(M,b,x,E)=>{const I=[],ie=Math.max(1,Math.min(E,P.columns.length));I.push({text:M,colSpan:ie,style:{bold:!0,...x}});for(let q=ie;q<P.columns.length;q++){const Ee=P.columns[q];I.push({text:b.get(Ee.field)??"",style:x})}const Pe=H.fontSizePt*d.LINE_HEIGHT*25.4/72,se=Math.max(H.rowHeightFloorMm,Pe+H.paddingMm*2);return{grid:{cells:[I],rowHeightsMm:[se]},heightMm:se}},D=(M,b)=>{let x=0;for(const E of M){const I=typeof E[b]=="number"?E[b]:Number(E[b]);Number.isFinite(I)&&(x+=I)}return x},J=(M,b)=>{const x=P.columns.find(E=>E.field===b);return X(D(M,b),x?.format??{kind:"number",thousands:!0})},B=P.groupBy,ve=typeof P.grandTotal=="object"&&P.grandTotal.fields||B?.subtotal||[],ne=P.columns.findIndex(M=>ve.includes(M.field)),re=ne>0?ne:1,j=[];if(B){const M=new Map;for(const b of w){const x=ue(b[B.field]),E=M.get(x);E?E.push(b):M.set(x,[b])}for(const[b,x]of M){j.push({kind:"groupHeader",label:(B.headerTemplate??"{value}").replace(/\{value\}/g,b)});for(const E of x)j.push({kind:"row",row:E});B.subtotal&&B.subtotal.length>0&&j.push({kind:"subtotal",label:B.subtotalLabel??"小计",rows:x})}}else for(const M of w)j.push({kind:"row",row:M});const oe=$();for(const M of j)if(M.kind==="row"){const b=le(H,M.row,s);y(b.grid,b.heightMm,"listr")}else if(M.kind==="groupHeader"){const b=k(M.label,new Map,B?.headerStyle??{},P.columns.length);B?.keepWithNext!==!1&&p+b.heightMm+oe>u()&&F(b.heightMm+oe),y(b.grid,b.heightMm,"listg")}else if(M.kind==="subtotal"){const b=new Map;for(const E of B.subtotal??[])b.set(E,J(M.rows,E));const x=k(M.label,b,B?.subtotalStyle??{},re);y(x.grid,x.heightMm,"listst")}if(P.grandTotal){const M=typeof P.grandTotal=="object"?P.grandTotal:void 0,b=M?.fields??B?.subtotal??[];if(b.length>0){const x=new Map;for(const I of b)x.set(I,J(w,I));const E=k(M?.label??"合计",x,M?.style??{},re);y(E.grid,E.heightMm,"listgt")}else a.push(`列表 ${S.id??""} 配置了 grandTotal 但未提供合计字段(groupBy.subtotal 或 grandTotal.fields)`)}}R()}for(const g of m){const l=g.text;typeof l=="string"&&l.includes("{totalPages}")&&(g.text=l.replace(/\{totalPages\}/g,String(i.length)))}return{plan:{schemaVersion:d.RENDER_PLAN_SCHEMA_VERSION,pages:i},warnings:a}}const Fe={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 _(e,t){return t?.classNames?.[e]??Fe[e]}class z{constructor(){this.props=[]}add(t,r){return r==null||r===!1||r===""?this:(this.props.push([t,String(r)]),this)}mm(t,r,n,o=2){return this.add(t,`${d.round(d.mmToPx(r,n),o)}px`)}toString(){let t="";for(const[r,n]of this.props)t+=`${r}:${n};`;return t}applyTo(t){const r=this.toString();r&&(t.style.cssText=r)}}function pe(e,t,r){const n=t.style||{};e.add("color",n.color).add("background-color",n.backgroundColor).add("font-family",n.fontFamily).add("font-weight",n.bold?"700":void 0).add("font-style",n.italic?"italic":void 0).add("text-decoration",n.underline?"underline":void 0).add("letter-spacing",n.letterSpacing!=null?`${n.letterSpacing}pt`:void 0).add("opacity",n.opacity!=null?String(n.opacity):void 0).add("transform",n.rotateDeg?`rotate(${n.rotateDeg}deg)`:void 0);const o=d.resolveFontSize(n,r);e.add("font-size",`${d.round(o.fontSizePx,2)}px`)}function Be(e,t,r,n,o){const s=o.createElement("table");if(s.className=_("grid",n),new z().add("width","100%").add("height","100%").add("border-collapse","collapse").add("table-layout",e.colWidthsMm?"fixed":"auto").applyTo(s),e.colWidthsMm){const h=o.createElement("colgroup");for(const m of e.colWidthsMm){const g=o.createElement("col");new z().mm("width",m,r).applyTo(g),h.appendChild(g)}s.appendChild(h)}const a=d.resolveBoxBorders(t.style),i=d.resolveStroke(t.style),c=a.inner?`${d.round(i.widthPt*r/72,2)}px solid ${i.color}`:"";return e.cells.forEach((h,m)=>{const g=o.createElement("tr");g.className=_("row",n),e.rowHeightsMm?.[m]!=null&&new z().mm("height",e.rowHeightsMm[m],r).applyTo(g),(h||[]).forEach(l=>{const u=o.createElement("td");u.className=_("cell",n),l?.colSpan&&(u.colSpan=l.colSpan),l?.rowSpan&&(u.rowSpan=l.rowSpan);const f=new z;if(c&&f.add("border",c),l?.style){const T=l.style;f.add("text-align",T.align).add("vertical-align",T.verticalAlign).add("background-color",T.backgroundColor).add("color",T.color).add("font-weight",T.bold?"700":void 0),f.add("font-size",`${d.round(d.resolveFontSize(T,r).fontSizePx,2)}px`)}if(f.applyTo(u),l?.text!=null&&(u.textContent=l.text),l?.children?.length)for(const T of l.children)u.appendChild(Q(T,r,n,o));g.appendChild(u)}),s.appendChild(g)}),s}function ze(e,t,r,n){const o=n.createElement("div");o.className=_("text",r);const s=e.style||{},a=new z().add("text-align",s.align).add("display","flex").add("flex-direction","column").add("justify-content",s.verticalAlign==="middle"?"center":s.verticalAlign==="bottom"?"flex-end":"flex-start").add("overflow","hidden");if(pe(a,e,t),a.applyTo(o),d.isRichText(e)){const i=n.createElement("div");i.className=_("rich",r);for(const c of e.richParagraphs){const h=n.createElement("div");h.className=_("paragraph",r),new z().add("text-align",c.align).add("line-height",c.lineHeight!=null?String(c.lineHeight):void 0).mm("margin-top",c.spaceBeforeMm??0,t).mm("margin-bottom",c.spaceAfterMm??0,t).mm("text-indent",c.indentMm??0,t).applyTo(h);for(const g of c.segments||[]){const l=n.createElement("span");if(l.className=_("segment",r),l.textContent=g.kind==="field"?g.field??"":g.text??"",g.style){const u=new z().add("color",g.style.color).add("font-weight",g.style.bold?"700":void 0);u.add("font-size",`${d.round(d.resolveFontSize(g.style,t).fontSizePx,2)}px`),u.applyTo(l)}h.appendChild(l)}i.appendChild(h)}return o.appendChild(i),o}if(Array.isArray(e.lines)&&e.lines.length>0){const i=n.createElement("div");i.className=_("lines",r),s.lineHeight!=null&&new z().add("line-height",String(s.lineHeight)).applyTo(i);for(const c of e.lines){const h=n.createElement("div");h.className=_("line",r),h.textContent=c,i.appendChild(h)}return o.appendChild(i),o}return o.textContent=e.text??"",o}function Ie(e,t,r){const n=r.createElement("img");return n.className=_("image",t),n.src=e.imageData,new z().add("width","100%").add("height","100%").add("object-fit","contain").add("display","block").applyTo(n),n.alt=e.kind,n}function de(e,t,r,n){const o=n.createElement("div");o.className=_("shape",r);const s=e.style||{},a=d.resolveStroke(s),i=d.resolveBoxBorders(s),c=`${d.round(a.widthPt*t/72,2)}px solid ${a.color}`,h=new z;return e.grid||e.kind==="rect"?(i.top&&h.add("border-top",c),i.right&&h.add("border-right",c),i.bottom&&h.add("border-bottom",c),i.left&&h.add("border-left",c)):e.kind==="ellipse"?(i.inner&&h.add("border",c).add("border-radius","50%"),s.backgroundColor&&h.add("background-color",s.backgroundColor)):e.kind==="line"&&h.add("height","0").add("border-top",c),h.add("box-sizing","border-box").add("width","100%").add("height","100%"),h.applyTo(o),o}function Q(e,t,r,n){const o=n.createElement("div");o.className=`${_("comp",r)} mr-kind-${e.kind}`;const s=new z().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(pe(s,e,t),s.applyTo(o),d.isImageBackedComponent(e))return o.appendChild(Ie(e,r,n)),o;if(e.kind==="text")return o.appendChild(ze(e,t,r,n)),o;if(e.grid){const i=de(e,t,r,n);return i.appendChild(Be(e.grid,e,t,r,n)),o.appendChild(i),o}if(e.kind==="line"||e.kind==="rect"||e.kind==="ellipse"||e.kind==="chart")return o.appendChild(de(e,t,r,n)),o;const a=n.createElement("div");return a.className=_("unknown",r),a.textContent=e.fallbackText??"",o.appendChild(a),o}function Me(e,t,r,n){const o=n.createElement("div");o.className=_("page",r),new z().add("position","relative").mm("width",e.pageWidthMm,t).mm("height",e.pageHeightMm,t).add("background-color","#fff").add("overflow","hidden").add("box-sizing","border-box").applyTo(o);for(const s of e.components)o.appendChild(Q(s,t,r,n));return o}function De(e,t,r={}){const n=r.dpi??96,o=t.createElement("div");return o.className=_("root",r),o.dataset.schemaVersion=e.schemaVersion,e.pages.forEach(s=>{o.appendChild(Me(s,n,r,t))}),o}function be(e){const{pageHeightsPx:t,viewportHeightPx:r,scrollTopPx:n,overscan:o=1,gapPx:s=0}=e,a=t.length;if(a===0)return{start:0,end:-1,padTopPx:0,padBottomPx:0};const i=Math.max(0,s),c=new Array(a+1);c[0]=0;for(let w=0;w<a;w++)c[w+1]=c[w]+Math.max(0,t[w]??0)+i;const h=c[a],m=Math.max(0,n);let g=0,l=0,u=a-1;for(;l<=u;){const w=l+u>>1;c[w]<=m?(g=w,l=w+1):u=w-1}const f=Math.max(0,Math.min(a-1,g-o)),T=c[g]+Math.max(0,r);let R=a-1;for(l=0,u=a-1;l<=u;){const w=l+u>>1;c[w+1]<T?l=w+1:(R=w,u=w-1)}const v=Math.min(a-1,R+o),S=c[f],C=Math.max(0,h-c[v+1]);return{start:f,end:v,padTopPx:S,padBottomPx:C}}const ee=96/25.4;function te(e,t=96){const r=t/96*ee;return{widthPx:Math.max(1,Math.round(e.pageWidthMm*r)),heightPx:Math.max(1,Math.round(e.pageHeightMm*r))}}function Oe(e,t,r){const n=document.createElement("canvas"),{widthPx:o,heightPx:s}=te(e,r);n.width=Math.round(o*t),n.height=Math.round(s*t),n.style.width=`${o}px`,n.style.height=`${s}px`;const a=n.getContext("2d");if(!a)throw new Error("当前环境不支持 Canvas 2D(测试需真浏览器,见 e2e/canvas.spec.ts)");return a.scale(t,t),a.fillStyle="#ffffff",a.fillRect(0,0,o,s),{canvas:n,ctx:a}}function We(e,t=96){return d.resolveFontSize(e,t).fontSizePx}function Se(e,t,r,n,o,s,a,i="top"){e.font=`${t.bold?"bold ":""}${t.fontSizePx}px ${a}`,e.fillStyle=t.color,e.textBaseline="alphabetic";const c=t.fontSizePx*t.lineHeight,h=t.text===""?[""]:t.text.split(`
2
- `),m=h.length*c;let g=n;i==="middle"?g=n+(s-m)/2:i==="bottom"&&(g=n+s-m),h.forEach((l,u)=>{e.textAlign=t.align==="center"?"center":t.align==="right"?"right":"left";const f=t.align==="center"?r+o/2:t.align==="right"?r+o:r;e.fillText(l,f,g+u*c+t.fontSizePx*.8,o)}),e.textAlign="left"}function Ge(e,t,r,n,o,s,a,i,c,h,m){const g=ce.resolveGridLayout(t,s/i,a/i),l=d.resolveBoxBorders(r.style),u=d.resolveStroke(r.style);for(const f of g.cells){const T=f.cell.style?.backgroundColor;T&&(e.fillStyle=T,e.fillRect(n+f.xMm*i,o+f.yMm*i,f.widthMm*i,f.heightMm*i))}if(l.inner){e.strokeStyle=u.color,e.lineWidth=d.ptToPx(u.widthPt,c);for(const f of g.edges)e.beginPath(),f.kind==="v"?(e.moveTo(n+f.pos*i,o+f.from*i),e.lineTo(n+f.pos*i,o+f.to*i)):(e.moveTo(n+f.from*i,o+f.pos*i),e.lineTo(n+f.to*i,o+f.pos*i)),e.stroke();e.beginPath(),l.top&&(e.moveTo(n,o),e.lineTo(n+s,o)),l.right&&(e.moveTo(n+s,o),e.lineTo(n+s,o+a)),l.bottom&&(e.moveTo(n+s,o+a),e.lineTo(n,o+a)),l.left&&(e.moveTo(n,o+a),e.lineTo(n,o)),e.stroke()}for(const f of g.cells){const T=typeof f.cell.text=="string"?f.cell.text:"";if(!T)continue;const R=f.cell.style,v=R?.fontSize??d.DEFAULT_FONT_PT,S=d.wrapText(T,f.widthMm-1,{fontSizePt:v},m).join(`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("./style-Xq08-IsV.cjs"),ce=require("./grid-geometry-BXpOxznT.cjs");function he(e){const t=/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/.exec(e.trim());if(t){const n=new Date(Number(t[1]),Number(t[2])-1,Number(t[3]));return Number.isNaN(n.getTime())?null:n}const r=new Date(e);return Number.isNaN(r.getTime())?null:r}function K(e,t){return e.toLocaleString("en-US",{minimumFractionDigits:t,maximumFractionDigits:t})}function Ce(e,t){const r=n=>String(n).padStart(2,"0");return t.replace(/YYYY/g,String(e.getFullYear())).replace(/MM/g,r(e.getMonth()+1)).replace(/DD/g,r(e.getDate())).replace(/hh/g,r(e.getHours())).replace(/mm/g,r(e.getMinutes())).replace(/ss/g,r(e.getSeconds()))}function ke(e,t,r){return r!=null?t?K(e,r):e.toFixed(r):t?K(e):String(e)}function Y(e){const t=typeof e=="number"?e:Number(String(e).replace(/,/g,""));return Number.isFinite(t)?t:null}function X(e,t){if(e==null||e===""||!t)return String(e??"");switch(t.kind){case"number":{const r=Y(e);return r==null?String(e):ke(r,t.thousands===!0,t.digits)}case"percent":{const r=Y(e);return r==null?String(e):`${K(r*100,t.digits??2)}%`}case"date":{const r=t.pattern??"YYYY-MM-DD",n=e instanceof Date?e:he(String(e));return n?Ce(n,r):String(e)}default:return String(e)}}function me(e,t){const r=e[t.field];if(r==null||r==="")return!1;if(typeof t.value=="number"){const s=Y(r);if(s==null)return!1;switch(t.op){case">":return s>t.value;case">=":return s>=t.value;case"<":return s<t.value;case"<=":return s<=t.value;case"==":return s===t.value;case"!=":return s!==t.value}}const n=String(r),o=String(t.value);switch(t.op){case"==":return n===o;case"!=":return n!==o;case">":return n>o;case">=":return n>=o;case"<":return n<o;case"<=":return n<=o}return!1}const Ae=new Set(["text","image","barcode","qrcode","chart","line","rect","ellipse"]);function W(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Re(e,t,r,n){const o=e[t];o!=null&&(typeof o!="number"||!Number.isFinite(o))&&n.push({path:`${r}.${t}`,message:`应为有限数字,实际 ${JSON.stringify(o)}`})}function Z(e,t,r,n=[]){if(!W(e)){r.push({path:t,message:"组件应为对象"});return}const o=e.kind;typeof o!="string"?r.push({path:`${t}.kind`,message:"组件缺少 kind 字符串"}):Ae.has(o)||n.push({path:`${t}.kind`,message:`未知组件类型 ${JSON.stringify(o)},将以兜底方式渲染`});for(const i of["leftMm","topMm","widthMm","heightMm"])Re(e,i,t,r);e.leftMm!=null&&e.widthMm!=null&&(e.leftMm<-100||e.widthMm<0)&&r.push({path:t,message:"几何数值异常(leftMm<-100 或 widthMm<0)"});const s=e.grid;s!==void 0&&(!W(s)||!Array.isArray(s.cells)?r.push({path:`${t}.grid.cells`,message:"grid.cells 应为二维数组"}):s.cells.forEach((i,c)=>{if(!Array.isArray(i)){r.push({path:`${t}.grid.cells.${c}`,message:"行应为数组"});return}i.forEach((h,m)=>{h!=null&&W(h)&&Array.isArray(h.children)&&h.children.forEach((g,l)=>{Z(g,`${t}.grid.cells.${c}.${m}.children.${l}`,r,n)})})}));const a=e.richParagraphs;a!==void 0&&(Array.isArray(a)?a.forEach((i,c)=>{(!W(i)||!Array.isArray(i.segments))&&r.push({path:`${t}.richParagraphs.${c}`,message:"段落缺少 segments 数组"})}):r.push({path:`${t}.richParagraphs`,message:"richParagraphs 应为数组"}))}function ge(e,t,r,n=[]){if(!W(e)){r.push({path:t,message:"页应为对象"});return}const o=e.pageWidthMm,s=e.pageHeightMm;(typeof o!="number"||!(o>0&&o<3e3))&&r.push({path:`${t}.pageWidthMm`,message:`页宽非法: ${JSON.stringify(o)}`}),(typeof s!="number"||!(s>0&&s<5e3))&&r.push({path:`${t}.pageHeightMm`,message:`页高非法: ${JSON.stringify(s)}`});const a=e.components;a!==void 0&&!Array.isArray(a)?r.push({path:`${t}.components`,message:"components 应为数组"}):Array.isArray(a)&&a.forEach((i,c)=>Z(i,`${t}.components.${c}`,r,n))}function fe(e){const t=[],r=[],n=W(e)?e.pages:void 0;if(!Array.isArray(n))t.push({path:"$.pages",message:e==null?"渲染计划为空":"渲染计划缺少 pages 数组"});else{n.forEach((s,a)=>ge(s,`$.pages.${a}`,t,r)),n.length>2e3&&r.push({path:"$.pages",message:`页数异常大(${n.length} 页),渲染与打印耗时可能显著增加`});const o=n.reduce((s,a)=>s+(W(a)&&Array.isArray(a.components)?a.components.length:0),0);o>5e4&&r.push({path:"$.pages",message:`组件总数异常大(${o} 个),可能触发浏览器性能限制`})}return{ok:t.length===0,errors:t,warnings:r}}function He(e){const t=fe(e);if(!t.ok){const r=t.errors.slice(0,3).map(n=>`${n.path}: ${n.message}`).join("; ");throw new Error(`渲染计划校验失败(${t.errors.length} 处): ${r}`)}return e.pages}function ae(e){return{widthMm:e.widthMm,heightMm:e.heightMm,marginTopMm:e.marginTopMm??0,marginBottomMm:e.marginBottomMm??0,marginLeftMm:e.marginLeftMm??0,marginRightMm:e.marginRightMm??0,components:[]}}function Ne(e,t){return t.heightMm-(e.marginBottomMm??t.marginBottomMm)}function $e(e,t){const n=(e.fontSizePt??d.DEFAULT_FONT_PT)*d.LINE_HEIGHT*25.4/72,o=(e.paddingMm??1)*2;return Math.max(e.rowHeightMm??0,t*n+o)}function ue(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number")return String(e);if(typeof e=="boolean")return e?"是":"否";if(e instanceof Date)return e.toISOString().slice(0,10);try{return JSON.stringify(e)}catch{return String(e)}}function Le(e,t){const r=e.fontSizePt??d.DEFAULT_FONT_PT,n=e.paddingMm??1,o=e.columns.map(l=>l.style?{align:"left",verticalAlign:"middle",...l.style}:{align:"left",verticalAlign:"middle"}),s=e.columns.map(l=>({bold:e.headerBold??!0,align:"center",verticalAlign:"middle",backgroundColor:e.headerBackgroundColor,...l.style||{}})),a=e.columns.map(l=>l.header),i=a.map((l,u)=>d.wrapText(l,e.columns[u].widthMm-n*2,{fontSizePt:r,bold:e.headerBold??!0},t)),c=Math.max(...i.map(l=>l.length),1),h=$e(e,c),m=a.map((l,u)=>({text:l,style:s[u]})),g=e.border===!1?{borderTop:!1,borderRight:!1,borderBottom:!1,borderLeft:!1}:{borderBottom:!0,borderLeft:!0,borderRight:!0,borderTop:!0};return{fontSizePt:r,paddingMm:n,cellStyles:o,borderStyle:g,headerHeightMm:h,headerGrid:{cells:[m],rowHeightsMm:[h]},columns:e.columns}}function le(e,t,r){const n=e.columns,o=new Array(n.length);let s=1;for(let m=0;m<n.length;m++){const g=n[m];o[m]=g.format?X(t[g.field],g.format):ue(t[g.field])}const a=new Array(n.length);for(let m=0;m<n.length;m++){const g=d.wrapText(o[m],n[m].widthMm-e.paddingMm*2,{fontSizePt:e.fontSizePt},r);a[m]=g,g.length>s&&(s=g.length)}const i=e.fontSizePt*d.LINE_HEIGHT*25.4/72,c=Math.max(e.rowHeightFloorMm,s*i+e.paddingMm*2),h=new Array(n.length);for(let m=0;m<n.length;m++){const g=n[m];let l=e.cellStyles[m];if(g.rules){for(const u of g.rules)if(me(t,u.when)){l={...l??{},...u.style};break}}h[m]={text:o[m],style:l}}return{grid:{cells:[h],rowHeightsMm:[c]},heightMm:c}}function _e(e,t,r={}){const n=typeof r=="number"?{mmPerRow:r}:r,o=n.mmPerRow??0,s=n.measurer??d.heuristicMeasurer,a=[],i=[];let c=0;const h=g=>`${g}_${(++c).toString(36)}`,m=[];for(const g of e.pages){const l=ae(g),u=()=>Ne(g,l),f=l.marginTopMm,T=[],R=()=>{if(i.push({pageWidthMm:l.widthMm,pageHeightMm:l.heightMm,marginTopMm:l.marginTopMm,marginBottomMm:l.marginBottomMm,marginLeftMm:l.marginLeftMm,marginRightMm:l.marginRightMm,components:l.components}),T.length>0){const P=i.length;for(const S of T){const C={...S,text:String(S.text??"").replace(/\{page\}/g,String(P))};i[i.length-1].components.push(C),C.text.includes("{totalPages}")&&m.push(C)}}};for(const P of g.components){if(P.kind!=="list"){if(P.kind==="text"&&typeof P.text=="string"){const M=P.text;if(M.includes("{page}")||M.includes("{totalPages}")){T.push(P);continue}}l.components.push(P);continue}const S=P,C=t[S.dataset];Array.isArray(C)||a.push(`数据集 ${S.dataset} 未提供数据,列表 ${S.id??""} 输出为空`);const w=Array.isArray(C)?C:[],V=S.columns.reduce((M,b)=>M+b.widthMm,0),U=V>S.widthMm?S.widthMm/V:1,v=U===1?S:{...S,columns:S.columns.map(M=>({...M,widthMm:M.widthMm*U}))},H={...Le(v,s),rowHeightFloorMm:v.rowHeightMm??0},G={kind:"rect",leftMm:S.leftMm,topMm:0,widthMm:S.widthMm,heightMm:H.headerHeightMm,grid:H.headerGrid,nid:h("listh"),style:H.borderStyle};let p=S.topMm;const N=(M,b)=>{M.components.push({...G,topMm:b})};N(l,p),p+=H.headerHeightMm+o;const F=M=>{if(p+M>u()){R();const b=ae(g);l.components=b.components,l.heightMm=b.heightMm,v.headerEveryPage!==!1?(N(l,S.topMm),p=S.topMm+H.headerHeightMm):p=f}},y=(M,b,x)=>{F(b),l.components.push({kind:"rect",leftMm:S.leftMm,topMm:p,widthMm:S.widthMm,heightMm:b,grid:M,nid:h(x),style:H.borderStyle}),p+=b},$=()=>le(H,{},s).heightMm,k=(M,b,x,E)=>{const I=[],ie=Math.max(1,Math.min(E,v.columns.length));I.push({text:M,colSpan:ie,style:{bold:!0,...x}});for(let q=ie;q<v.columns.length;q++){const Ee=v.columns[q];I.push({text:b.get(Ee.field)??"",style:x})}const ve=H.fontSizePt*d.LINE_HEIGHT*25.4/72,se=Math.max(H.rowHeightFloorMm,ve+H.paddingMm*2);return{grid:{cells:[I],rowHeightsMm:[se]},heightMm:se}},D=(M,b)=>{let x=0;for(const E of M){const I=typeof E[b]=="number"?E[b]:Number(E[b]);Number.isFinite(I)&&(x+=I)}return x},J=(M,b)=>{const x=v.columns.find(E=>E.field===b);return X(D(M,b),x?.format??{kind:"number",thousands:!0})},B=v.groupBy,Pe=typeof v.grandTotal=="object"&&v.grandTotal.fields||B?.subtotal||[],ne=v.columns.findIndex(M=>Pe.includes(M.field)),re=ne>0?ne:1,j=[];if(B){const M=new Map;for(const b of w){const x=ue(b[B.field]),E=M.get(x);E?E.push(b):M.set(x,[b])}for(const[b,x]of M){j.push({kind:"groupHeader",label:(B.headerTemplate??"{value}").replace(/\{value\}/g,b)});for(const E of x)j.push({kind:"row",row:E});B.subtotal&&B.subtotal.length>0&&j.push({kind:"subtotal",label:B.subtotalLabel??"小计",rows:x})}}else for(const M of w)j.push({kind:"row",row:M});const oe=$();for(const M of j)if(M.kind==="row"){const b=le(H,M.row,s);y(b.grid,b.heightMm,"listr")}else if(M.kind==="groupHeader"){const b=k(M.label,new Map,B?.headerStyle??{},v.columns.length);B?.keepWithNext!==!1&&p+b.heightMm+oe>u()&&F(b.heightMm+oe),y(b.grid,b.heightMm,"listg")}else if(M.kind==="subtotal"){const b=new Map;for(const E of B.subtotal??[])b.set(E,J(M.rows,E));const x=k(M.label,b,B?.subtotalStyle??{},re);y(x.grid,x.heightMm,"listst")}if(v.grandTotal){const M=typeof v.grandTotal=="object"?v.grandTotal:void 0,b=M?.fields??B?.subtotal??[];if(b.length>0){const x=new Map;for(const I of b)x.set(I,J(w,I));const E=k(M?.label??"合计",x,M?.style??{},re);y(E.grid,E.heightMm,"listgt")}else a.push(`列表 ${S.id??""} 配置了 grandTotal 但未提供合计字段(groupBy.subtotal 或 grandTotal.fields)`)}}R()}for(const g of m){const l=g.text;typeof l=="string"&&l.includes("{totalPages}")&&(g.text=l.replace(/\{totalPages\}/g,String(i.length)))}return{plan:{schemaVersion:d.RENDER_PLAN_SCHEMA_VERSION,pages:i},warnings:a}}const Fe={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 _(e,t){return t?.classNames?.[e]??Fe[e]}class z{constructor(){this.props=[]}add(t,r){return r==null||r===!1||r===""?this:(this.props.push([t,String(r)]),this)}mm(t,r,n,o=2){return this.add(t,`${d.round(d.mmToPx(r,n),o)}px`)}toString(){let t="";for(const[r,n]of this.props)t+=`${r}:${n};`;return t}applyTo(t){const r=this.toString();r&&(t.style.cssText=r)}}function pe(e,t,r){const n=t.style||{};e.add("color",n.color).add("background-color",n.backgroundColor).add("font-family",n.fontFamily).add("font-weight",n.bold?"700":void 0).add("font-style",n.italic?"italic":void 0).add("text-decoration",n.underline?"underline":void 0).add("letter-spacing",n.letterSpacing!=null?`${n.letterSpacing}pt`:void 0).add("opacity",n.opacity!=null?String(n.opacity):void 0).add("transform",n.rotateDeg?`rotate(${n.rotateDeg}deg)`:void 0);const o=d.resolveFontSize(n,r);e.add("font-size",`${d.round(o.fontSizePx,2)}px`)}function Be(e,t,r,n,o){const s=o.createElement("table");if(s.className=_("grid",n),new z().add("width","100%").add("height","100%").add("border-collapse","collapse").add("table-layout",e.colWidthsMm?"fixed":"auto").applyTo(s),e.colWidthsMm){const h=o.createElement("colgroup");for(const m of e.colWidthsMm){const g=o.createElement("col");new z().mm("width",m,r).applyTo(g),h.appendChild(g)}s.appendChild(h)}const a=d.resolveBoxBorders(t.style),i=d.resolveStroke(t.style),c=a.inner?`${d.round(i.widthPt*r/72,2)}px solid ${i.color}`:"";return e.cells.forEach((h,m)=>{const g=o.createElement("tr");g.className=_("row",n),e.rowHeightsMm?.[m]!=null&&new z().mm("height",e.rowHeightsMm[m],r).applyTo(g),(h||[]).forEach(l=>{const u=o.createElement("td");u.className=_("cell",n),l?.colSpan&&(u.colSpan=l.colSpan),l?.rowSpan&&(u.rowSpan=l.rowSpan);const f=new z;if(c&&f.add("border",c),l?.style){const T=l.style;f.add("text-align",T.align).add("vertical-align",T.verticalAlign).add("background-color",T.backgroundColor).add("color",T.color).add("font-weight",T.bold?"700":void 0),f.add("font-size",`${d.round(d.resolveFontSize(T,r).fontSizePx,2)}px`)}if(f.applyTo(u),l?.text!=null&&(u.textContent=l.text),l?.children?.length)for(const T of l.children)u.appendChild(Q(T,r,n,o));g.appendChild(u)}),s.appendChild(g)}),s}function ze(e,t,r,n){const o=n.createElement("div");o.className=_("text",r);const s=e.style||{},a=new z().add("text-align",s.align).add("display","flex").add("flex-direction","column").add("justify-content",s.verticalAlign==="middle"?"center":s.verticalAlign==="bottom"?"flex-end":"flex-start").add("overflow","hidden");if(pe(a,e,t),a.applyTo(o),d.isRichText(e)){const i=n.createElement("div");i.className=_("rich",r);for(const c of e.richParagraphs){const h=n.createElement("div");h.className=_("paragraph",r),new z().add("text-align",c.align).add("line-height",c.lineHeight!=null?String(c.lineHeight):void 0).mm("margin-top",c.spaceBeforeMm??0,t).mm("margin-bottom",c.spaceAfterMm??0,t).mm("text-indent",c.indentMm??0,t).applyTo(h);for(const g of c.segments||[]){const l=n.createElement("span");if(l.className=_("segment",r),l.textContent=g.kind==="field"?g.field??"":g.text??"",g.style){const u=new z().add("color",g.style.color).add("font-weight",g.style.bold?"700":void 0);u.add("font-size",`${d.round(d.resolveFontSize(g.style,t).fontSizePx,2)}px`),u.applyTo(l)}h.appendChild(l)}i.appendChild(h)}return o.appendChild(i),o}if(Array.isArray(e.lines)&&e.lines.length>0){const i=n.createElement("div");i.className=_("lines",r),s.lineHeight!=null&&new z().add("line-height",String(s.lineHeight)).applyTo(i);for(const c of e.lines){const h=n.createElement("div");h.className=_("line",r),h.textContent=c,i.appendChild(h)}return o.appendChild(i),o}return o.textContent=e.text??"",o}function Ie(e,t,r){const n=r.createElement("img");return n.className=_("image",t),n.src=e.imageData,new z().add("width","100%").add("height","100%").add("object-fit","contain").add("display","block").applyTo(n),n.alt=e.kind,n}function de(e,t,r,n){const o=n.createElement("div");o.className=_("shape",r);const s=e.style||{},a=d.resolveStroke(s),i=d.resolveBoxBorders(s),c=`${d.round(a.widthPt*t/72,2)}px solid ${a.color}`,h=new z;return e.grid||e.kind==="rect"?(i.top&&h.add("border-top",c),i.right&&h.add("border-right",c),i.bottom&&h.add("border-bottom",c),i.left&&h.add("border-left",c)):e.kind==="ellipse"?(i.inner&&h.add("border",c).add("border-radius","50%"),s.backgroundColor&&h.add("background-color",s.backgroundColor)):e.kind==="line"&&h.add("height","0").add("border-top",c),h.add("box-sizing","border-box").add("width","100%").add("height","100%"),h.applyTo(o),o}function Q(e,t,r,n){const o=n.createElement("div");o.className=`${_("comp",r)} mr-kind-${e.kind}`;const s=new z().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(pe(s,e,t),s.applyTo(o),d.isImageBackedComponent(e))return o.appendChild(Ie(e,r,n)),o;if(e.kind==="text")return o.appendChild(ze(e,t,r,n)),o;if(e.grid){const i=de(e,t,r,n);return i.appendChild(Be(e.grid,e,t,r,n)),o.appendChild(i),o}if(e.kind==="line"||e.kind==="rect"||e.kind==="ellipse"||e.kind==="chart")return o.appendChild(de(e,t,r,n)),o;const a=n.createElement("div");return a.className=_("unknown",r),a.textContent=e.fallbackText??"",o.appendChild(a),o}function Me(e,t,r,n){const o=n.createElement("div");o.className=_("page",r),new z().add("position","relative").mm("width",e.pageWidthMm,t).mm("height",e.pageHeightMm,t).add("background-color","#fff").add("overflow","hidden").add("box-sizing","border-box").applyTo(o);for(const s of e.components)o.appendChild(Q(s,t,r,n));return o}function De(e,t,r={}){const n=r.dpi??96,o=t.createElement("div");return o.className=_("root",r),o.dataset.schemaVersion=e.schemaVersion,e.pages.forEach(s=>{o.appendChild(Me(s,n,r,t))}),o}function be(e){const{pageHeightsPx:t,viewportHeightPx:r,scrollTopPx:n,overscan:o=1,gapPx:s=0}=e,a=t.length;if(a===0)return{start:0,end:-1,padTopPx:0,padBottomPx:0};const i=Math.max(0,s),c=new Array(a+1);c[0]=0;for(let w=0;w<a;w++)c[w+1]=c[w]+Math.max(0,t[w]??0)+i;const h=c[a],m=Math.max(0,n);let g=0,l=0,u=a-1;for(;l<=u;){const w=l+u>>1;c[w]<=m?(g=w,l=w+1):u=w-1}const f=Math.max(0,Math.min(a-1,g-o)),T=c[g]+Math.max(0,r);let R=a-1;for(l=0,u=a-1;l<=u;){const w=l+u>>1;c[w+1]<T?l=w+1:(R=w,u=w-1)}const P=Math.min(a-1,R+o),S=c[f],C=Math.max(0,h-c[P+1]);return{start:f,end:P,padTopPx:S,padBottomPx:C}}const ee=96/25.4;function te(e,t=96){const r=t/96*ee;return{widthPx:Math.max(1,Math.round(e.pageWidthMm*r)),heightPx:Math.max(1,Math.round(e.pageHeightMm*r))}}function Oe(e,t,r){const n=document.createElement("canvas"),{widthPx:o,heightPx:s}=te(e,r);n.width=Math.round(o*t),n.height=Math.round(s*t),n.style.width=`${o}px`,n.style.height=`${s}px`;const a=n.getContext("2d");if(!a)throw new Error("当前环境不支持 Canvas 2D(测试需真浏览器,见 e2e/canvas.spec.ts)");return a.scale(t,t),a.fillStyle="#ffffff",a.fillRect(0,0,o,s),{canvas:n,ctx:a}}function We(e,t=96){return d.resolveFontSize(e,t).fontSizePx}function Se(e,t,r,n,o,s,a,i="top"){e.font=`${t.bold?"bold ":""}${t.fontSizePx}px ${a}`,e.fillStyle=t.color,e.textBaseline="alphabetic";const c=t.fontSizePx*t.lineHeight,h=t.text===""?[""]:t.text.split(`
2
+ `),m=h.length*c;let g=n;i==="middle"?g=n+(s-m)/2:i==="bottom"&&(g=n+s-m),h.forEach((l,u)=>{e.textAlign=t.align==="center"?"center":t.align==="right"?"right":"left";const f=t.align==="center"?r+o/2:t.align==="right"?r+o:r;e.fillText(l,f,g+u*c+t.fontSizePx*.8,o)}),e.textAlign="left"}function Ge(e,t,r,n,o,s,a,i,c,h,m){const g=ce.resolveGridLayout(t,s/i,a/i),l=d.resolveBoxBorders(r.style),u=d.resolveStroke(r.style);for(const f of g.cells){const T=f.cell.style?.backgroundColor;T&&(e.fillStyle=T,e.fillRect(n+f.xMm*i,o+f.yMm*i,f.widthMm*i,f.heightMm*i))}if(l.inner){e.strokeStyle=u.color,e.lineWidth=d.ptToPx(u.widthPt,c);for(const f of g.edges)e.beginPath(),f.kind==="v"?(e.moveTo(n+f.pos*i,o+f.from*i),e.lineTo(n+f.pos*i,o+f.to*i)):(e.moveTo(n+f.from*i,o+f.pos*i),e.lineTo(n+f.to*i,o+f.pos*i)),e.stroke();e.beginPath(),l.top&&(e.moveTo(n,o),e.lineTo(n+s,o)),l.right&&(e.moveTo(n+s,o),e.lineTo(n+s,o+a)),l.bottom&&(e.moveTo(n+s,o+a),e.lineTo(n,o+a)),l.left&&(e.moveTo(n,o+a),e.lineTo(n,o)),e.stroke()}for(const f of g.cells){const T=typeof f.cell.text=="string"?f.cell.text:"";if(!T)continue;const R=f.cell.style,P=R?.fontSize??d.DEFAULT_FONT_PT,S=d.wrapText(T,f.widthMm-1,{fontSizePt:P},m).join(`
3
3
  `);Se(e,{text:S,fontSizePx:d.resolveFontSize(R,c).fontSizePx,bold:R?.bold??!1,color:R?.color??d.resolveTextColor(r.style,d.DEFAULT_TEXT_COLOR),align:R?.align??"left",lineHeight:d.LINE_HEIGHT},n+(f.xMm+.5)*i,o+f.yMm*i,Math.max(0,(f.widthMm-1)*i),f.heightMm*i,h,R?.verticalAlign??"middle")}}function ye(e,t,r,n,o,s){const a=t.leftMm*r,i=t.topMm*r,c=t.widthMm*r,h=t.heightMm*r,m=t.style??{};if(t.grid){Ge(e,t.grid,t,a,i,c,h,r,n,o,s);return}switch(t.kind){case"text":{const g=m.fontSize??d.DEFAULT_FONT_PT,l=d.isRichText(t)?t.richParagraphs.map(u=>(u.segments??[]).map(f=>f.text??f.field??"").join("")).join(`
4
4
  `):Array.isArray(t.lines)&&t.lines.length>0?t.lines.join(`
5
5
  `):d.wrapText(t.text??"",t.widthMm,{fontSizePt:g},s).join(`
6
- `);Se(e,{text:l,fontSizePx:d.resolveFontSize(m,n).fontSizePx,bold:m.bold??!1,color:d.resolveTextColor(m),align:m.align??"left",lineHeight:d.resolveLineHeight(m)},a,i,c,h,o,m.verticalAlign);break}case"rect":{const g=d.resolveStroke(m),l=d.resolveBoxBorders(m);m.backgroundColor&&(e.fillStyle=m.backgroundColor,e.fillRect(a,i,c,h)),l.inner&&(e.strokeStyle=g.color,e.lineWidth=d.ptToPx(g.widthPt,n),e.beginPath(),l.top&&(e.moveTo(a,i),e.lineTo(a+c,i)),l.right&&(e.moveTo(a+c,i),e.lineTo(a+c,i+h)),l.bottom&&(e.moveTo(a+c,i+h),e.lineTo(a,i+h)),l.left&&(e.moveTo(a,i+h),e.lineTo(a,i)),e.stroke());break}case"line":{const g=d.resolveStroke({...m,borderColor:m.lineColor??m.borderColor});e.strokeStyle=g.color,e.lineWidth=d.ptToPx(g.widthPt,n),e.beginPath(),e.moveTo(a,i+h/2),e.lineTo(a+c,i+h/2),e.stroke();break}case"ellipse":{const g=d.resolveStroke(m);e.strokeStyle=g.color,e.lineWidth=d.ptToPx(g.widthPt,n),m.backgroundColor&&(e.fillStyle=m.backgroundColor,e.beginPath(),e.ellipse(a+c/2,i+h/2,c/2,h/2,0,0,Math.PI*2),e.fill()),e.beginPath(),e.ellipse(a+c/2,i+h/2,c/2,h/2,0,0,Math.PI*2),e.stroke();break}}}function je(e,t={}){if(typeof document>"u")throw new Error("renderPlanToCanvas 需要浏览器环境(SSR 请在客户端钩子中调用)");const r=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),n=t.dpi??96,o=n/96*ee,s=t.fontFamily??'"Microsoft YaHei", sans-serif',a=t.measurer??d.heuristicMeasurer,i=Math.max(0,t.start??0),c=Math.min(e.pages.length-1,t.end??e.pages.length-1),h=[];for(let m=i;m<=c;m++){const g=e.pages[m],{canvas:l,ctx:u}=Oe(g,r,n);for(const f of g.components)ye(u,f,o,n,s,a);h.push(l)}return{canvases:h}}function Ve(e,t={}){const r=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),n=t.dpi??96,o=n/96*ee,s=t.fontFamily??'"Microsoft YaHei", sans-serif',a=t.measurer??d.heuristicMeasurer,i=t.overscan??1,c=t.gapPx??18,h=t.pagesPerFrame??1,m=e.pages.map(p=>p.pageHeightMm*o),g=Math.max(1,...e.pages.map(p=>p.pageWidthMm*o)),l={start:0,end:-1};let u=null,f=null,T=null,R=null,v=[],S=0,C=[];function w(){const p=u;p.innerHTML="",f=document.createElement("div"),f.style.cssText=`width:${g}px;margin:0 auto;`,T=document.createElement("div"),R=document.createElement("div"),f.appendChild(T),v=[];const N=Math.min(e.pages.length,3+i*2);for(let F=0;F<N;F++){const y=document.createElement("div");y.style.cssText=`margin:0 auto ${c}px;box-shadow:0 2px 8px rgba(0,0,0,.35);background:#fff;`,f.appendChild(y),v.push(y)}f.appendChild(R),p.appendChild(f)}function V(p,N){const F=e.pages[N],{widthPx:y,heightPx:$}=te(F,n);let k=p.firstElementChild;(!k||k.tagName!=="CANVAS")&&(k=document.createElement("canvas"),p.innerHTML="",p.appendChild(k)),k.width=Math.round(y*r),k.height=Math.round($*r),k.style.width=`${y}px`,k.style.height=`${$}px`;const D=k.getContext("2d");if(D){D.setTransform(1,0,0,1,0,0),D.scale(r,r),D.fillStyle="#ffffff",D.fillRect(0,0,y,$);for(const J of F.components)ye(D,J,o,n,s,a);k.dataset.canvasPage=String(N),p.style.height=`${$}px`,p.style.width=`${y}px`}}function U(p){l.start=p.start,l.end=p.end,T.style.height=`${p.start*c+m.slice(0,p.start).reduce((y,$)=>y+$,0)}px`;const N=e.pages.length-1-p.end;R.style.height=`${N*c+m.slice(p.end+1).reduce((y,$)=>y+$,0)}px`;const F=p.end-p.start+1;v.forEach((y,$)=>{if($<F){y.style.display="";const k=p.start+$;y.style.height=`${m[k]??0}px`}else y.style.display="none"}),C=[];for(let y=p.start;y<=p.end;y++){const $=v[y-p.start];if(!$)continue;$.firstElementChild?.dataset?.canvasPage!==String(y)&&C.push(y)}P()}function P(){S||C.length===0||(S=requestAnimationFrame(()=>{S=0;let p=Math.max(1,h);for(;C.length>0&&p-- >0;){const N=C.shift(),F=v[N-l.start];F&&V(F,N)}C.length>0&&P()}))}function H(){S||(S=requestAnimationFrame(()=>{S=0;const p=u,N=be({pageHeightsPx:m,viewportHeightPx:p.clientHeight,scrollTopPx:p.scrollTop,overscan:i,gapPx:c});N.start!==l.start||N.end!==l.end?U(N):P()}))}let G=null;return{attach(p){if(typeof document>"u")throw new Error("createCanvasPager 需要浏览器环境(SSR 请在客户端钩子中调用 attach)");u=p,w(),p.addEventListener("scroll",H,{passive:!0}),typeof ResizeObserver<"u"&&(G=new ResizeObserver(()=>H()),G.observe(p)),H()},destroy(){S&&cancelAnimationFrame(S),S=0,G?.disconnect(),G=null,u?.removeEventListener("scroll",H),C=[],f?.remove(),u=null},window(){return{...l}}}}function A(e,t){return typeof e=="number"&&Number.isFinite(e)?e:t}function L(e,t=""){return typeof e=="string"?e:t}function O(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ue(e){return e==="Center"?"center":e==="Right"?"right":"left"}function Je(e){return e==="Center"?"middle":e==="Bottom"?"bottom":"top"}function Ye(e){const t=parseFloat(L(e.FontSize,"10.5"));return{fontSize:Number.isFinite(t)?t:10.5,fontFamily:L(e.FontFamily,"黑体")||void 0,bold:L(e.FontWeight)==="bold"||void 0,italic:L(e.FontStyle)==="italic"||void 0,underline:e.Underline===!0||void 0,color:L(e.FontColor)||void 0,backgroundColor:L(e.BackgroundColor)||void 0,align:Ue(L(e.HorAlignment,"Left")),verticalAlign:Je(L(e.VertAlignment,"Top")),lineHeight:(()=>{const r=parseFloat(L(e.RowSpace,"1"));return Number.isFinite(r)&&r!==1?r:void 0})(),borderColor:L(e.BorderColor)||void 0,borderTop:e.BorderTop!==!1,borderRight:e.BorderRight!==!1,borderBottom:e.BorderBottom!==!1,borderLeft:e.BorderLeft!==!1}}function qe(e,t){const r=L(e.uitype),n={kind:"text",leftMm:A(e.left,0),topMm:A(e.top,0),widthMm:A(e.width,40),heightMm:A(e.height,8),nid:L(e.nid)||void 0,style:Ye(e)};switch(r){case"text":{n.kind="text";const o=e.Text??e.text??e.Value;n.text=o==null?"":String(o);const s=e.Lines??e.lines;return Array.isArray(s)&&(n.lines=s.map(a=>String(a))),n}case"richtext":return n.kind="text",n.text=L(e.Text),t.push(`富文本 ${n.nid??""} 导入为纯文本(版式细节可能损失)`),n;case"image":case"barcode":case"qrcode":case"chart":return n.kind=r==="image"?"image":r,n.fallbackText=`[${r}]`,t.push(`图片类组件 ${n.nid??""} 需运行时数据(imageData),已导入为占位`),n;case"table":{n.kind="rect";const o=e.Cells??e.cells;if(Array.isArray(o)){const s={cells:o.map(a=>Array.isArray(a)?a.map(i=>({text:O(i)?L(i.Text??i.text):"",colSpan:O(i)?A(i.ColSpan,1):1})):[])};n.grid=s}else n.fallbackText="[table]",t.push(`表格 ${n.nid??""} 缺少 Cells,导入为空框`);return n}case"subreport":return t.push(`子报表 ${n.nid??""} 暂不支持导入,已跳过`),null;default:return L(e.ShapeType)==="hline"||r==="hline"||r==="vline"?(n.kind="line",n):r==="rect"||r==="oval"||r==="shape"?(n.kind=r==="oval"?"ellipse":"rect",n):(t.push(`未知组件类型 ${r},已跳过`),null)}}function Ke(e){const t=[];let r=null;if(typeof e=="string")try{const h=JSON.parse(e);O(h)&&(r=h)}catch{return{template:{pages:[]},warnings:["content 不是合法 JSON"]}}else O(e)&&(r=e);if(!r)return{template:{pages:[]},warnings:["content 为空"]};const n=O(r.GlobalConfig)?r.GlobalConfig:{},o=A(n.paperWidthMm,210),s=A(n.paperHeightMm,297),a={top:A(n.marginTop,10),bottom:A(n.marginBottom,10),left:A(n.marginLeft,10),right:A(n.marginRight,10)},i=Array.isArray(r.children)?r.children.filter(h=>O(h)&&L(h.uitype)==="page"):[];i.length===0&&t.push("content 中没有 uitype=page 的页节点");const c=i.map(h=>{const m=h,g=Array.isArray(m.children)?m.children:[],l=[];for(const u of g){if(!O(u))continue;const f=qe(u,t);f&&l.push(f)}return{widthMm:A(m.width,o),heightMm:A(m.DesignHeight,s),marginTopMm:A(m.MarginTop,a.top),marginBottomMm:A(m.MarginBottom,a.bottom),marginLeftMm:A(m.MarginLeft,a.left),marginRightMm:A(m.MarginRight,a.right),components:l}});return c.length===0&&(t.push("转换结果为空页,已回退一张空白页"),c.push({widthMm:o,heightMm:s,...a,components:[]})),{template:{pages:c},warnings:t}}function Te(e,t,r){let n,o;if(typeof e=="string"){const s=d.PAPER_SIZES[e];if(!s)throw new Error(`未知纸张预设 "${e}"(可用:${Object.keys(d.PAPER_SIZES).join("/")})`);n=s.widthMm,o=s.heightMm}else typeof e=="number"?(n=e,o=t??297):(n=e.widthMm,o=e.heightMm);return r?{widthMm:o,heightMm:n}:{widthMm:n,heightMm:o}}class we{constructor(){this.pages=[],this.pending=null}page(t="a4",r={},n){this.collect();const s=n!=null&&!("margins"in n)&&!("landscape"in n)&&("marginTopMm"in n||"marginBottomMm"in n||"marginLeftMm"in n||"marginRightMm"in n)?{margins:n}:n??{},{widthMm:a,heightMm:i}=Te(t,typeof r=="number"?r:void 0,s.landscape),c=s.margins??{};return this.pending=new xe(this,{widthMm:a,heightMm:i,marginTopMm:c.marginTopMm??10,marginBottomMm:c.marginBottomMm??10,marginLeftMm:c.marginLeftMm??10,marginRightMm:c.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{pages:this.pages}}}class xe{constructor(t,r){this.parent=t,this.page=r,this.components=[]}text(t,r={},n={}){return this.components.push({kind:"text",leftMm:r.leftMm??0,topMm:r.topMm??0,widthMm:r.widthMm??60,heightMm:r.heightMm??8,text:t,style:n}),this}list(t,r,n,o={}){return this.components.push({kind:"list",leftMm:r.leftMm??10,topMm:r.topMm??30,widthMm:r.widthMm??180,dataset:t,columns:n,...o}),this}rect(t,r={}){return this.components.push({kind:"rect",...t,style:r}),this}line(t,r,n,o={}){return this.components.push({kind:"line",leftMm:t,topMm:r,widthMm:n,heightMm:.5,style:o}),this}barcode(t,r){return this.components.push({kind:"barcode",leftMm:r.leftMm??0,topMm:r.topMm??0,widthMm:r.widthMm??40,heightMm:r.heightMm??12,fallbackText:t}),this}qrcode(t,r,n,o){return this.components.push({kind:"qrcode",leftMm:n,topMm:o,widthMm:r,heightMm:r,fallbackText:t}),this}buildPage(){return{...this.page,components:this.components}}done(){return this.parent}build(){return this.done().build()}}function Xe(){return new we}exports.CSS_DPI=d.CSS_DPI;exports.DEFAULT_BORDER_PT=d.DEFAULT_BORDER_PT;exports.DEFAULT_FONT_PT=d.DEFAULT_FONT_PT;exports.DEFAULT_STROKE_COLOR=d.DEFAULT_STROKE_COLOR;exports.DEFAULT_TEXT_COLOR=d.DEFAULT_TEXT_COLOR;exports.LINE_HEIGHT=d.LINE_HEIGHT;exports.MM_PER_INCH=d.MM_PER_INCH;exports.PAPER_SIZES=d.PAPER_SIZES;exports.RENDER_PLAN_SCHEMA_VERSION=d.RENDER_PLAN_SCHEMA_VERSION;exports.SCHEMA_VERSION_JH4J=d.SCHEMA_VERSION_JH4J;exports.SCHEMA_VERSION_LOCAL=d.SCHEMA_VERSION_LOCAL;exports.SCHEMA_VERSION_MACH=d.SCHEMA_VERSION_MACH;exports.charWidthEm=d.charWidthEm;exports.createCanvasMeasurer=d.createCanvasMeasurer;exports.createHeuristicMeasurer=d.createHeuristicMeasurer;exports.heuristicMeasurer=d.heuristicMeasurer;exports.isImageBackedComponent=d.isImageBackedComponent;exports.isRichText=d.isRichText;exports.measureTextMm=d.measureTextMm;exports.mmToPx=d.mmToPx;exports.mmToPxFactor=d.mmToPxFactor;exports.ptToPx=d.ptToPx;exports.pxToMm=d.pxToMm;exports.resolveBoxBorders=d.resolveBoxBorders;exports.resolveFontSize=d.resolveFontSize;exports.resolveLineHeight=d.resolveLineHeight;exports.resolveStroke=d.resolveStroke;exports.resolveTextColor=d.resolveTextColor;exports.round=d.round;exports.toRenderPlan=d.toRenderPlan;exports.wrapText=d.wrapText;exports.resolveGridLayout=ce.resolveGridLayout;exports.PageBuilder=xe;exports.TemplateBuilder=we;exports.assertRenderPlan=He;exports.classOf=_;exports.computePageWindow=be;exports.createCanvasPager=Ve;exports.createTemplate=Xe;exports.evalStyleRule=me;exports.formatValue=X;exports.importJh4jTemplateContent=Ke;exports.measurePageSizePx=te;exports.paginateTemplate=_e;exports.parseDateLocal=he;exports.planFontSizePx=We;exports.renderComponent=Q;exports.renderPage=Me;exports.renderPlan=De;exports.renderPlanToCanvas=je;exports.resolvePaper=Te;exports.toNumber=Y;exports.validateComponent=Z;exports.validatePage=ge;exports.validateRenderPlan=fe;
6
+ `);Se(e,{text:l,fontSizePx:d.resolveFontSize(m,n).fontSizePx,bold:m.bold??!1,color:d.resolveTextColor(m),align:m.align??"left",lineHeight:d.resolveLineHeight(m)},a,i,c,h,o,m.verticalAlign);break}case"rect":{const g=d.resolveStroke(m),l=d.resolveBoxBorders(m);m.backgroundColor&&(e.fillStyle=m.backgroundColor,e.fillRect(a,i,c,h)),l.inner&&(e.strokeStyle=g.color,e.lineWidth=d.ptToPx(g.widthPt,n),e.beginPath(),l.top&&(e.moveTo(a,i),e.lineTo(a+c,i)),l.right&&(e.moveTo(a+c,i),e.lineTo(a+c,i+h)),l.bottom&&(e.moveTo(a+c,i+h),e.lineTo(a,i+h)),l.left&&(e.moveTo(a,i+h),e.lineTo(a,i)),e.stroke());break}case"line":{const g=d.resolveStroke({...m,borderColor:m.lineColor??m.borderColor});e.strokeStyle=g.color,e.lineWidth=d.ptToPx(g.widthPt,n),e.beginPath(),e.moveTo(a,i+h/2),e.lineTo(a+c,i+h/2),e.stroke();break}case"ellipse":{const g=d.resolveStroke(m);e.strokeStyle=g.color,e.lineWidth=d.ptToPx(g.widthPt,n),m.backgroundColor&&(e.fillStyle=m.backgroundColor,e.beginPath(),e.ellipse(a+c/2,i+h/2,c/2,h/2,0,0,Math.PI*2),e.fill()),e.beginPath(),e.ellipse(a+c/2,i+h/2,c/2,h/2,0,0,Math.PI*2),e.stroke();break}}}function je(e,t={}){if(typeof document>"u")throw new Error("renderPlanToCanvas 需要浏览器环境(SSR 请在客户端钩子中调用)");const r=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),n=t.dpi??96,o=n/96*ee,s=t.fontFamily??'"Microsoft YaHei", sans-serif',a=t.measurer??d.heuristicMeasurer,i=Math.max(0,t.start??0),c=Math.min(e.pages.length-1,t.end??e.pages.length-1),h=[];for(let m=i;m<=c;m++){const g=e.pages[m],{canvas:l,ctx:u}=Oe(g,r,n);for(const f of g.components)ye(u,f,o,n,s,a);h.push(l)}return{canvases:h}}function Ve(e,t={}){const r=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),n=t.dpi??96,o=n/96*ee,s=t.fontFamily??'"Microsoft YaHei", sans-serif',a=t.measurer??d.heuristicMeasurer,i=t.overscan??1,c=t.gapPx??18,h=t.pagesPerFrame??1,m=e.pages.map(p=>p.pageHeightMm*o),g=Math.max(1,...e.pages.map(p=>p.pageWidthMm*o)),l={start:0,end:-1};let u=null,f=null,T=null,R=null,P=[],S=0,C=[];function w(){const p=u;p.innerHTML="",f=document.createElement("div"),f.style.cssText=`width:${g}px;margin:0 auto;`,T=document.createElement("div"),R=document.createElement("div"),f.appendChild(T),P=[];const N=Math.min(e.pages.length,3+i*2);for(let F=0;F<N;F++){const y=document.createElement("div");y.style.cssText=`margin:0 auto ${c}px;box-shadow:0 2px 8px rgba(0,0,0,.35);background:#fff;`,f.appendChild(y),P.push(y)}f.appendChild(R),p.appendChild(f)}function V(p,N){const F=e.pages[N],{widthPx:y,heightPx:$}=te(F,n);let k=p.firstElementChild;(!k||k.tagName!=="CANVAS")&&(k=document.createElement("canvas"),p.innerHTML="",p.appendChild(k)),k.width=Math.round(y*r),k.height=Math.round($*r),k.style.width=`${y}px`,k.style.height=`${$}px`;const D=k.getContext("2d");if(D){D.setTransform(1,0,0,1,0,0),D.scale(r,r),D.fillStyle="#ffffff",D.fillRect(0,0,y,$);for(const J of F.components)ye(D,J,o,n,s,a);k.dataset.canvasPage=String(N),p.style.height=`${$}px`,p.style.width=`${y}px`}}function U(p){l.start=p.start,l.end=p.end,T.style.height=`${p.start*c+m.slice(0,p.start).reduce((y,$)=>y+$,0)}px`;const N=e.pages.length-1-p.end;R.style.height=`${N*c+m.slice(p.end+1).reduce((y,$)=>y+$,0)}px`;const F=p.end-p.start+1;P.forEach((y,$)=>{if($<F){y.style.display="";const k=p.start+$;y.style.height=`${m[k]??0}px`}else y.style.display="none"}),C=[];for(let y=p.start;y<=p.end;y++){const $=P[y-p.start];if(!$)continue;$.firstElementChild?.dataset?.canvasPage!==String(y)&&C.push(y)}v()}function v(){S||C.length===0||(S=requestAnimationFrame(()=>{S=0;let p=Math.max(1,h);for(;C.length>0&&p-- >0;){const N=C.shift(),F=P[N-l.start];F&&V(F,N)}C.length>0&&v()}))}function H(){S||(S=requestAnimationFrame(()=>{S=0;const p=u,N=be({pageHeightsPx:m,viewportHeightPx:p.clientHeight,scrollTopPx:p.scrollTop,overscan:i,gapPx:c});N.start!==l.start||N.end!==l.end?U(N):v()}))}let G=null;return{attach(p){if(typeof document>"u")throw new Error("createCanvasPager 需要浏览器环境(SSR 请在客户端钩子中调用 attach)");u=p,w(),p.addEventListener("scroll",H,{passive:!0}),typeof ResizeObserver<"u"&&(G=new ResizeObserver(()=>H()),G.observe(p)),H()},destroy(){S&&cancelAnimationFrame(S),S=0,G?.disconnect(),G=null,u?.removeEventListener("scroll",H),C=[],f?.remove(),u=null},window(){return{...l}}}}function A(e,t){return typeof e=="number"&&Number.isFinite(e)?e:t}function L(e,t=""){return typeof e=="string"?e:t}function O(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ue(e){return e==="Center"?"center":e==="Right"?"right":"left"}function Je(e){return e==="Center"?"middle":e==="Bottom"?"bottom":"top"}function Ye(e){const t=parseFloat(L(e.FontSize,"10.5"));return{fontSize:Number.isFinite(t)?t:10.5,fontFamily:L(e.FontFamily,"黑体")||void 0,bold:L(e.FontWeight)==="bold"||void 0,italic:L(e.FontStyle)==="italic"||void 0,underline:e.Underline===!0||void 0,color:L(e.FontColor)||void 0,backgroundColor:L(e.BackgroundColor)||void 0,align:Ue(L(e.HorAlignment,"Left")),verticalAlign:Je(L(e.VertAlignment,"Top")),lineHeight:(()=>{const r=parseFloat(L(e.RowSpace,"1"));return Number.isFinite(r)&&r!==1?r:void 0})(),borderColor:L(e.BorderColor)||void 0,borderTop:e.BorderTop!==!1,borderRight:e.BorderRight!==!1,borderBottom:e.BorderBottom!==!1,borderLeft:e.BorderLeft!==!1}}function qe(e,t){const r=L(e.uitype),n={kind:"text",leftMm:A(e.left,0),topMm:A(e.top,0),widthMm:A(e.width,40),heightMm:A(e.height,8),nid:L(e.nid)||void 0,style:Ye(e)};switch(r){case"text":{n.kind="text";const o=e.Text??e.text??e.Value;n.text=o==null?"":String(o);const s=e.Lines??e.lines;return Array.isArray(s)&&(n.lines=s.map(a=>String(a))),n}case"richtext":return n.kind="text",n.text=L(e.Text),t.push(`富文本 ${n.nid??""} 导入为纯文本(版式细节可能损失)`),n;case"image":case"barcode":case"qrcode":case"chart":return n.kind=r==="image"?"image":r,n.fallbackText=`[${r}]`,t.push(`图片类组件 ${n.nid??""} 需运行时数据(imageData),已导入为占位`),n;case"table":{n.kind="rect";const o=e.Cells??e.cells;if(Array.isArray(o)){const s={cells:o.map(a=>Array.isArray(a)?a.map(i=>({text:O(i)?L(i.Text??i.text):"",colSpan:O(i)?A(i.ColSpan,1):1})):[])};n.grid=s}else n.fallbackText="[table]",t.push(`表格 ${n.nid??""} 缺少 Cells,导入为空框`);return n}case"subreport":return t.push(`子报表 ${n.nid??""} 暂不支持导入,已跳过`),null;default:return L(e.ShapeType)==="hline"||r==="hline"||r==="vline"?(n.kind="line",n):r==="rect"||r==="oval"||r==="shape"?(n.kind=r==="oval"?"ellipse":"rect",n):(t.push(`未知组件类型 ${r},已跳过`),null)}}function Ke(e){const t=[];let r=null;if(typeof e=="string")try{const h=JSON.parse(e);O(h)&&(r=h)}catch{return{template:{pages:[]},warnings:["content 不是合法 JSON"]}}else O(e)&&(r=e);if(!r)return{template:{pages:[]},warnings:["content 为空"]};const n=O(r.GlobalConfig)?r.GlobalConfig:{},o=A(n.paperWidthMm,210),s=A(n.paperHeightMm,297),a={top:A(n.marginTop,10),bottom:A(n.marginBottom,10),left:A(n.marginLeft,10),right:A(n.marginRight,10)},i=Array.isArray(r.children)?r.children.filter(h=>O(h)&&L(h.uitype)==="page"):[];i.length===0&&t.push("content 中没有 uitype=page 的页节点");const c=i.map(h=>{const m=h,g=Array.isArray(m.children)?m.children:[],l=[];for(const u of g){if(!O(u))continue;const f=qe(u,t);f&&l.push(f)}return{widthMm:A(m.width,o),heightMm:A(m.DesignHeight,s),marginTopMm:A(m.MarginTop,a.top),marginBottomMm:A(m.MarginBottom,a.bottom),marginLeftMm:A(m.MarginLeft,a.left),marginRightMm:A(m.MarginRight,a.right),components:l}});return c.length===0&&(t.push("转换结果为空页,已回退一张空白页"),c.push({widthMm:o,heightMm:s,...a,components:[]})),{template:{pages:c},warnings:t}}function Te(e,t,r){let n,o;if(typeof e=="string"){const s=d.PAPER_SIZES[e];if(!s)throw new Error(`未知纸张预设 "${e}"(可用:${Object.keys(d.PAPER_SIZES).join("/")})`);n=s.widthMm,o=s.heightMm}else typeof e=="number"?(n=e,o=t??297):(n=e.widthMm,o=e.heightMm);return r?{widthMm:o,heightMm:n}:{widthMm:n,heightMm:o}}class we{constructor(){this.pages=[],this.pending=null,this.templateParams=void 0}params(t){return this.templateParams=t,this}page(t="a4",r={},n){this.collect();const s=n!=null&&!("margins"in n)&&!("landscape"in n)&&("marginTopMm"in n||"marginBottomMm"in n||"marginLeftMm"in n||"marginRightMm"in n)?{margins:n}:n??{},{widthMm:a,heightMm:i}=Te(t,typeof r=="number"?r:void 0,s.landscape),c=s.margins??{};return this.pending=new xe(this,{widthMm:a,heightMm:i,marginTopMm:c.marginTopMm??10,marginBottomMm:c.marginBottomMm??10,marginLeftMm:c.marginLeftMm??10,marginRightMm:c.marginRightMm??10}),this.pending}collect(){this.pending&&(this.pages.push(this.pending.buildPage()),this.pending=null)}build(){if(this.collect(),this.pages.length===0)throw new Error("模板至少需要一页:先调用 .page() 添加内容");return this.templateParams?{params:this.templateParams,pages:this.pages}:{pages:this.pages}}}class xe{constructor(t,r){this.parent=t,this.page=r,this.components=[]}text(t,r={},n={}){return this.components.push({kind:"text",leftMm:r.leftMm??0,topMm:r.topMm??0,widthMm:r.widthMm??60,heightMm:r.heightMm??8,text:t,style:n}),this}list(t,r,n,o={}){return this.components.push({kind:"list",leftMm:r.leftMm??10,topMm:r.topMm??30,widthMm:r.widthMm??180,dataset:t,columns:n,...o}),this}rect(t,r={}){return this.components.push({kind:"rect",...t,style:r}),this}line(t,r,n,o={}){return this.components.push({kind:"line",leftMm:t,topMm:r,widthMm:n,heightMm:.5,style:o}),this}barcode(t,r){return this.components.push({kind:"barcode",leftMm:r.leftMm??0,topMm:r.topMm??0,widthMm:r.widthMm??40,heightMm:r.heightMm??12,fallbackText:t}),this}qrcode(t,r,n,o){return this.components.push({kind:"qrcode",leftMm:n,topMm:o,widthMm:r,heightMm:r,fallbackText:t}),this}buildPage(){return{...this.page,components:this.components}}done(){return this.parent}build(){return this.done().build()}}function Xe(){return new we}exports.CSS_DPI=d.CSS_DPI;exports.DEFAULT_BORDER_PT=d.DEFAULT_BORDER_PT;exports.DEFAULT_FONT_PT=d.DEFAULT_FONT_PT;exports.DEFAULT_STROKE_COLOR=d.DEFAULT_STROKE_COLOR;exports.DEFAULT_TEXT_COLOR=d.DEFAULT_TEXT_COLOR;exports.LINE_HEIGHT=d.LINE_HEIGHT;exports.MM_PER_INCH=d.MM_PER_INCH;exports.PAPER_SIZES=d.PAPER_SIZES;exports.RENDER_PLAN_SCHEMA_VERSION=d.RENDER_PLAN_SCHEMA_VERSION;exports.SCHEMA_VERSION_JH4J=d.SCHEMA_VERSION_JH4J;exports.SCHEMA_VERSION_LOCAL=d.SCHEMA_VERSION_LOCAL;exports.SCHEMA_VERSION_MACH=d.SCHEMA_VERSION_MACH;exports.charWidthEm=d.charWidthEm;exports.createCanvasMeasurer=d.createCanvasMeasurer;exports.createHeuristicMeasurer=d.createHeuristicMeasurer;exports.heuristicMeasurer=d.heuristicMeasurer;exports.isImageBackedComponent=d.isImageBackedComponent;exports.isRichText=d.isRichText;exports.measureTextMm=d.measureTextMm;exports.mmToPx=d.mmToPx;exports.mmToPxFactor=d.mmToPxFactor;exports.ptToPx=d.ptToPx;exports.pxToMm=d.pxToMm;exports.resolveBoxBorders=d.resolveBoxBorders;exports.resolveFontSize=d.resolveFontSize;exports.resolveLineHeight=d.resolveLineHeight;exports.resolveStroke=d.resolveStroke;exports.resolveTextColor=d.resolveTextColor;exports.round=d.round;exports.toRenderPlan=d.toRenderPlan;exports.wrapText=d.wrapText;exports.resolveGridLayout=ce.resolveGridLayout;exports.PageBuilder=xe;exports.TemplateBuilder=we;exports.assertRenderPlan=He;exports.classOf=_;exports.computePageWindow=be;exports.createCanvasPager=Ve;exports.createTemplate=Xe;exports.evalStyleRule=me;exports.formatValue=X;exports.importJh4jTemplateContent=Ke;exports.measurePageSizePx=te;exports.paginateTemplate=_e;exports.parseDateLocal=he;exports.planFontSizePx=We;exports.renderComponent=Q;exports.renderPage=Me;exports.renderPlan=De;exports.renderPlanToCanvas=je;exports.resolvePaper=Te;exports.toNumber=Y;exports.validateComponent=Z;exports.validatePage=ge;exports.validateRenderPlan=fe;
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { h as ot, R as At, D as X, w as Z, L as Q, i as Et, r as G, m as $t, a as V, b as ut, c as O, d as tt, p as K, e as Ht, f as pt, g as Nt, P as ht } from "./style-6ihHKVCM.js";
2
- import { C as be, j as ye, k as we, M as Se, S as Te, l as xe, n as ke, o as ve, q as Ce, s as Pe, t as Ae, u as Ee, v as $e, x as He } from "./style-6ihHKVCM.js";
2
+ import { C as be, j as ye, k as we, M as Se, S as Te, l as xe, n as ke, o as ve, q as Pe, s as Ce, t as Ae, u as Ee, v as $e, x as He } from "./style-6ihHKVCM.js";
3
3
  import { r as Rt } from "./grid-geometry-Bs8QXz1X.js";
4
4
  function Bt(t) {
5
5
  const e = /^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/.exec(t.trim());
@@ -288,11 +288,11 @@ function de(t, e, r = {}) {
288
288
  }), w.length > 0) {
289
289
  const x = i.length;
290
290
  for (const b of w) {
291
- const C = {
291
+ const P = {
292
292
  ...b,
293
293
  text: String(b.text ?? "").replace(/\{page\}/g, String(x))
294
294
  };
295
- i[i.length - 1].components.push(C), C.text.includes("{totalPages}") && h.push(C);
295
+ i[i.length - 1].components.push(P), P.text.includes("{totalPages}") && h.push(P);
296
296
  }
297
297
  }
298
298
  };
@@ -308,9 +308,9 @@ function de(t, e, r = {}) {
308
308
  l.components.push(x);
309
309
  continue;
310
310
  }
311
- const b = x, C = e[b.dataset];
312
- Array.isArray(C) || a.push(`数据集 ${b.dataset} 未提供数据,列表 ${b.id ?? ""} 输出为空`);
313
- const S = Array.isArray(C) ? C : [], J = b.columns.reduce((p, M) => p + M.widthMm, 0), q = J > b.widthMm ? b.widthMm / J : 1, k = q === 1 ? b : { ...b, columns: b.columns.map((p) => ({ ...p, widthMm: p.widthMm * q })) }, $ = {
311
+ const b = x, P = e[b.dataset];
312
+ Array.isArray(P) || a.push(`数据集 ${b.dataset} 未提供数据,列表 ${b.id ?? ""} 输出为空`);
313
+ const S = Array.isArray(P) ? P : [], J = b.columns.reduce((p, M) => p + M.widthMm, 0), q = J > b.widthMm ? b.widthMm / J : 1, k = q === 1 ? b : { ...b, columns: b.columns.map((p) => ({ ...p, widthMm: p.widthMm * q })) }, $ = {
314
314
  ...Gt(k, s),
315
315
  rowHeightFloorMm: k.rowHeightMm ?? 0
316
316
  }, j = {
@@ -345,14 +345,14 @@ function de(t, e, r = {}) {
345
345
  nid: c(T),
346
346
  style: $.borderStyle
347
347
  }), u += M;
348
- }, N = () => gt($, {}, s).heightMm, P = (p, M, T, v) => {
348
+ }, N = () => gt($, {}, s).heightMm, C = (p, M, T, v) => {
349
349
  const D = [], dt = Math.max(1, Math.min(v, k.columns.length));
350
350
  D.push({ text: p, colSpan: dt, style: { bold: !0, ...T } });
351
351
  for (let et = dt; et < k.columns.length; et++) {
352
- const Pt = k.columns[et];
353
- D.push({ text: M.get(Pt.field) ?? "", style: T });
352
+ const Ct = k.columns[et];
353
+ D.push({ text: M.get(Ct.field) ?? "", style: T });
354
354
  }
355
- const Ct = $.fontSizePt * Q * 25.4 / 72, ct = Math.max($.rowHeightFloorMm, Ct + $.paddingMm * 2);
355
+ const Pt = $.fontSizePt * Q * 25.4 / 72, ct = Math.max($.rowHeightFloorMm, Pt + $.paddingMm * 2);
356
356
  return { grid: { cells: [D], rowHeightsMm: [ct] }, heightMm: ct };
357
357
  }, _ = (p, M) => {
358
358
  let T = 0;
@@ -391,7 +391,7 @@ function de(t, e, r = {}) {
391
391
  const M = gt($, p.row, s);
392
392
  y(M.grid, M.heightMm, "listr");
393
393
  } else if (p.kind === "groupHeader") {
394
- const M = P(
394
+ const M = C(
395
395
  p.label,
396
396
  /* @__PURE__ */ new Map(),
397
397
  F?.headerStyle ?? {},
@@ -401,7 +401,7 @@ function de(t, e, r = {}) {
401
401
  } else if (p.kind === "subtotal") {
402
402
  const M = /* @__PURE__ */ new Map();
403
403
  for (const v of F.subtotal ?? []) M.set(v, U(p.rows, v));
404
- const T = P(
404
+ const T = C(
405
405
  p.label,
406
406
  M,
407
407
  F?.subtotalStyle ?? {},
@@ -414,7 +414,7 @@ function de(t, e, r = {}) {
414
414
  if (M.length > 0) {
415
415
  const T = /* @__PURE__ */ new Map();
416
416
  for (const D of M) T.set(D, U(S, D));
417
- const v = P(
417
+ const v = C(
418
418
  p?.label ?? "合计",
419
419
  T,
420
420
  p?.style ?? {},
@@ -607,8 +607,8 @@ function Kt(t) {
607
607
  const S = l + f >> 1;
608
608
  d[S + 1] < w ? l = S + 1 : (E = S, f = S - 1);
609
609
  }
610
- const x = Math.min(a - 1, E + o), b = d[g], C = Math.max(0, c - d[x + 1]);
611
- return { start: g, end: x, padTopPx: b, padBottomPx: C };
610
+ const x = Math.min(a - 1, E + o), b = d[g], P = Math.max(0, c - d[x + 1]);
611
+ return { start: g, end: x, padTopPx: b, padBottomPx: P };
612
612
  }
613
613
  const it = 96 / 25.4;
614
614
  function Tt(t, e = 96) {
@@ -748,7 +748,7 @@ function me(t, e = {}) {
748
748
  }
749
749
  function ge(t, e = {}) {
750
750
  const r = e.dpr ?? (typeof devicePixelRatio == "number" ? devicePixelRatio : 1), n = e.dpi ?? 96, o = n / 96 * it, s = e.fontFamily ?? '"Microsoft YaHei", sans-serif', a = e.measurer ?? ot, i = e.overscan ?? 1, d = e.gapPx ?? 18, c = e.pagesPerFrame ?? 1, h = t.pages.map((u) => u.pageHeightMm * o), m = Math.max(1, ...t.pages.map((u) => u.pageWidthMm * o)), l = { start: 0, end: -1 };
751
- let f = null, g = null, w = null, E = null, x = [], b = 0, C = [];
751
+ let f = null, g = null, w = null, E = null, x = [], b = 0, P = [];
752
752
  function S() {
753
753
  const u = f;
754
754
  u.innerHTML = "", g = document.createElement("div"), g.style.cssText = `width:${m}px;margin:0 auto;`, w = document.createElement("div"), E = document.createElement("div"), g.appendChild(w), x = [];
@@ -761,14 +761,14 @@ function ge(t, e = {}) {
761
761
  }
762
762
  function J(u, H) {
763
763
  const L = t.pages[H], { widthPx: y, heightPx: N } = Tt(L, n);
764
- let P = u.firstElementChild;
765
- (!P || P.tagName !== "CANVAS") && (P = document.createElement("canvas"), u.innerHTML = "", u.appendChild(P)), P.width = Math.round(y * r), P.height = Math.round(N * r), P.style.width = `${y}px`, P.style.height = `${N}px`;
766
- const _ = P.getContext("2d");
764
+ let C = u.firstElementChild;
765
+ (!C || C.tagName !== "CANVAS") && (C = document.createElement("canvas"), u.innerHTML = "", u.appendChild(C)), C.width = Math.round(y * r), C.height = Math.round(N * r), C.style.width = `${y}px`, C.style.height = `${N}px`;
766
+ const _ = C.getContext("2d");
767
767
  if (_) {
768
768
  _.setTransform(1, 0, 0, 1, 0, 0), _.scale(r, r), _.fillStyle = "#ffffff", _.fillRect(0, 0, y, N);
769
769
  for (const U of L.components)
770
770
  kt(_, U, o, n, s, a);
771
- P.dataset.canvasPage = String(H), u.style.height = `${N}px`, u.style.width = `${y}px`;
771
+ C.dataset.canvasPage = String(H), u.style.height = `${N}px`, u.style.width = `${y}px`;
772
772
  }
773
773
  }
774
774
  function q(u) {
@@ -779,27 +779,27 @@ function ge(t, e = {}) {
779
779
  x.forEach((y, N) => {
780
780
  if (N < L) {
781
781
  y.style.display = "";
782
- const P = u.start + N;
783
- y.style.height = `${h[P] ?? 0}px`;
782
+ const C = u.start + N;
783
+ y.style.height = `${h[C] ?? 0}px`;
784
784
  } else
785
785
  y.style.display = "none";
786
- }), C = [];
786
+ }), P = [];
787
787
  for (let y = u.start; y <= u.end; y++) {
788
788
  const N = x[y - u.start];
789
789
  if (!N) continue;
790
- N.firstElementChild?.dataset?.canvasPage !== String(y) && C.push(y);
790
+ N.firstElementChild?.dataset?.canvasPage !== String(y) && P.push(y);
791
791
  }
792
792
  k();
793
793
  }
794
794
  function k() {
795
- b || C.length === 0 || (b = requestAnimationFrame(() => {
795
+ b || P.length === 0 || (b = requestAnimationFrame(() => {
796
796
  b = 0;
797
797
  let u = Math.max(1, c);
798
- for (; C.length > 0 && u-- > 0; ) {
799
- const H = C.shift(), L = x[H - l.start];
798
+ for (; P.length > 0 && u-- > 0; ) {
799
+ const H = P.shift(), L = x[H - l.start];
800
800
  L && J(L, H);
801
801
  }
802
- C.length > 0 && k();
802
+ P.length > 0 && k();
803
803
  }));
804
804
  }
805
805
  function $() {
@@ -823,7 +823,7 @@ function ge(t, e = {}) {
823
823
  f = u, S(), u.addEventListener("scroll", $, { passive: !0 }), typeof ResizeObserver < "u" && (j = new ResizeObserver(() => $()), j.observe(u)), $();
824
824
  },
825
825
  destroy() {
826
- b && cancelAnimationFrame(b), b = 0, j?.disconnect(), j = null, f?.removeEventListener("scroll", $), C = [], g?.remove(), f = null;
826
+ b && cancelAnimationFrame(b), b = 0, j?.disconnect(), j = null, f?.removeEventListener("scroll", $), P = [], g?.remove(), f = null;
827
827
  },
828
828
  window() {
829
829
  return { ...l };
@@ -974,7 +974,24 @@ function re(t, e, r) {
974
974
  }
975
975
  class oe {
976
976
  constructor() {
977
- this.pages = [], this.pending = null;
977
+ this.pages = [], this.pending = null, this.templateParams = void 0;
978
+ }
979
+ /**
980
+ * 声明报表参数(链式,可放在 .page() 前后任意位置):
981
+ * 渲染组件据此自动生成查询面板(也可由 paramDefs prop 提供,prop 优先)。
982
+ *
983
+ * ```ts
984
+ * createTemplate()
985
+ * .params([
986
+ * { field: "whCode", label: "仓库", type: "select", options: [...], required: true },
987
+ * { field: "date", label: "日期", type: "date", defaultValue: "2026-09-30" }
988
+ * ])
989
+ * .page("a4").text(...).list(...)
990
+ * .build();
991
+ * ```
992
+ */
993
+ params(e) {
994
+ return this.templateParams = e, this;
978
995
  }
979
996
  /**
980
997
  * 新建页。纸张支持三种写法:
@@ -1004,7 +1021,7 @@ class oe {
1004
1021
  build() {
1005
1022
  if (this.collect(), this.pages.length === 0)
1006
1023
  throw new Error("模板至少需要一页:先调用 .page() 添加内容");
1007
- return { pages: this.pages };
1024
+ return this.templateParams ? { params: this.templateParams, pages: this.pages } : { pages: this.pages };
1008
1025
  }
1009
1026
  }
1010
1027
  class ie {
@@ -1098,9 +1115,9 @@ export {
1098
1115
  ve as charWidthEm,
1099
1116
  B as classOf,
1100
1117
  Kt as computePageWindow,
1101
- Ce as createCanvasMeasurer,
1118
+ Pe as createCanvasMeasurer,
1102
1119
  ge as createCanvasPager,
1103
- Pe as createHeuristicMeasurer,
1120
+ Ce as createHeuristicMeasurer,
1104
1121
  ue as createTemplate,
1105
1122
  zt as evalStyleRule,
1106
1123
  Mt as formatValue,
@@ -61,8 +61,26 @@ export interface TemplatePage {
61
61
  marginRightMm?: number;
62
62
  components: TemplateComponent[];
63
63
  }
64
+ /** 报表参数定义(声明式,模板自描述参数面:渲染组件据此生成查询面板) */
65
+ export interface ReportParamDef {
66
+ /** 参数名(传入 params,与数据集 SQL #{field} 绑定对应) */
67
+ field: string;
68
+ /** 显示名(缺省用 field) */
69
+ label?: string;
70
+ type?: "text" | "number" | "date" | "select";
71
+ /** select 选项 */
72
+ options?: Array<{
73
+ label: string;
74
+ value: string;
75
+ }>;
76
+ defaultValue?: string;
77
+ required?: boolean;
78
+ placeholder?: string;
79
+ }
64
80
  export interface ReportTemplate {
65
81
  schemaVersion?: string;
82
+ /** 参数定义(可选;宿主也可经 ReportPreview 的 paramDefs prop 提供,prop 优先) */
83
+ params?: ReportParamDef[];
66
84
  pages: TemplatePage[];
67
85
  }
68
86
  export type DatasetRows = Record<string, Record<string, unknown>[]>;
@@ -62,7 +62,7 @@ function w(r = { fontUrl: "/simhei.ttf" }) {
62
62
  return a;
63
63
  };
64
64
  }
65
- const R = "mach-report/fetcher", b = "mach-report/pdf-exporter", y = "mach-report/config", A = "mach-report/controller", U = d(() => import("./ReportPreview-VCx59rSt.js").then((r) => r.k)), C = {
65
+ const R = "mach-report/fetcher", b = "mach-report/pdf-exporter", y = "mach-report/config", A = "mach-report/controller", U = d(() => import("./ReportPreview-C6b5TOzz.js").then((r) => r.l)), C = {
66
66
  install(r, e = {}) {
67
67
  const o = e.fetcher ?? P({
68
68
  request: e.request ?? E({ baseUrl: e.baseUrl }),
@@ -1 +1 @@
1
- "use strict";var O=Object.create;var E=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var y=Object.getPrototypeOf,F=Object.prototype.hasOwnProperty;var U=(r,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of b(e))!F.call(r,n)&&n!==t&&E(r,n,{get:()=>e[n],enumerable:!(o=A(e,n))||o.enumerable});return r};var M=(r,e,t)=>(t=r!=null?O(y(r)):{},U(e||!r||!r.__esModule?E(t,"default",{value:r,enumerable:!0}):t,r));const R=require("vue");function m(r){return r==null?[]:Array.isArray(r)?r.map(String).filter(e=>e!==""):String(r).split(",").map(e=>e.trim()).filter(e=>e!=="")}function j(r){return m(r).join(",")}class s extends Error{constructor(e){super(e),this.name="PlanLoadError"}}function P(r={}){const{baseUrl:e="",headers:t,credentials:o,timeoutMs:n=3e4}=r;return async({url:c,method:i,params:a})=>{const h=a&&Object.keys(a).length>0?`?${new URLSearchParams(a)}`:"",l=new AbortController,f=setTimeout(()=>l.abort(),n);let d;try{d=await fetch(`${e}${c}${h}`,{method:i.toUpperCase(),headers:{Accept:"application/json",...t},credentials:o,signal:l.signal})}catch(u){throw u instanceof DOMException&&u.name==="AbortError"?new s(`请求超时(${n}ms): ${c}`):new s(`请求失败(${c}): ${u instanceof Error?u.message:String(u)}`)}finally{clearTimeout(f)}if(!d.ok)throw new s(`HTTP ${d.status} ${c}`);return d.json()}}function p(r){const{request:e,baseUrl:t=""}=r;return async({tempIds:o,furnitureTempId:n,params:c})=>{if(o.length===0)throw new s("缺少报表模板 ID");const i={tempId:o.join(",")};n&&(i.furnitureTempId=n);for(const[l,f]of Object.entries(c||{}))l&&f!=null&&f!==""&&(i[l]=String(f));const a=await e({url:`${t}/report/codePrintReport/gridPlan`,method:"get",params:i});if(a&&a.code!=null&&a.code!==200)throw new s(String(a.message||"预览加载失败"));const h=a?.data?.pages;return{schemaVersion:"jh4j-compatible",pages:Array.isArray(h)?h:[]}}}function _(r={fontUrl:"/simhei.ttf"}){let e=null;return async t=>{e||(e=await import("@agile-team/mach-report/pdf"));const o=r.fontUrl?await e.loadFontWithCache(r.fontUrl):null,{bytes:n}=await e.renderPlanToPdf(t,o?{customFontBytes:o}:{});return n}}const T="mach-report/fetcher",g="mach-report/pdf-exporter",w="mach-report/config",$="mach-report/controller",C=R.defineAsyncComponent(()=>Promise.resolve().then(()=>require("./ReportPreview-D-Us9mrX.cjs")).then(r=>r.ReportPreview$1)),H={install(r,e={}){const t=e.fetcher??p({request:e.request??P({baseUrl:e.baseUrl}),baseUrl:e.baseUrl});r.provide(T,t);const o=e.pdfFontUrl??e.config?.defaults?.pdfFontUrl??"/simhei.ttf";r.provide(g,e.pdfExporter??_({fontUrl:o})),r.provide(w,R.computed(()=>e.config??null)),e.globalComponent!==!1&&r.component("MachReportPreview",C)}};exports.MACH_REPORT_CONFIG_KEY=w;exports.MACH_REPORT_CONTROLLER_KEY=$;exports.MACH_REPORT_FETCHER_KEY=T;exports.MACH_REPORT_PDF_EXPORTER_KEY=g;exports.MachReportPreview=C;exports.PlanLoadError=s;exports.createDefaultPdfExporter=_;exports.createFetchRequest=P;exports.createJh4jGridPlanFetcher=p;exports.joinTempIds=j;exports.machReportPlugin=H;exports.normalizeTempIds=m;
1
+ "use strict";var O=Object.create;var E=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var y=Object.getPrototypeOf,F=Object.prototype.hasOwnProperty;var U=(r,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of b(e))!F.call(r,n)&&n!==t&&E(r,n,{get:()=>e[n],enumerable:!(o=A(e,n))||o.enumerable});return r};var M=(r,e,t)=>(t=r!=null?O(y(r)):{},U(e||!r||!r.__esModule?E(t,"default",{value:r,enumerable:!0}):t,r));const R=require("vue");function m(r){return r==null?[]:Array.isArray(r)?r.map(String).filter(e=>e!==""):String(r).split(",").map(e=>e.trim()).filter(e=>e!=="")}function j(r){return m(r).join(",")}class s extends Error{constructor(e){super(e),this.name="PlanLoadError"}}function P(r={}){const{baseUrl:e="",headers:t,credentials:o,timeoutMs:n=3e4}=r;return async({url:c,method:i,params:a})=>{const h=a&&Object.keys(a).length>0?`?${new URLSearchParams(a)}`:"",l=new AbortController,f=setTimeout(()=>l.abort(),n);let d;try{d=await fetch(`${e}${c}${h}`,{method:i.toUpperCase(),headers:{Accept:"application/json",...t},credentials:o,signal:l.signal})}catch(u){throw u instanceof DOMException&&u.name==="AbortError"?new s(`请求超时(${n}ms): ${c}`):new s(`请求失败(${c}): ${u instanceof Error?u.message:String(u)}`)}finally{clearTimeout(f)}if(!d.ok)throw new s(`HTTP ${d.status} ${c}`);return d.json()}}function p(r){const{request:e,baseUrl:t=""}=r;return async({tempIds:o,furnitureTempId:n,params:c})=>{if(o.length===0)throw new s("缺少报表模板 ID");const i={tempId:o.join(",")};n&&(i.furnitureTempId=n);for(const[l,f]of Object.entries(c||{}))l&&f!=null&&f!==""&&(i[l]=String(f));const a=await e({url:`${t}/report/codePrintReport/gridPlan`,method:"get",params:i});if(a&&a.code!=null&&a.code!==200)throw new s(String(a.message||"预览加载失败"));const h=a?.data?.pages;return{schemaVersion:"jh4j-compatible",pages:Array.isArray(h)?h:[]}}}function _(r={fontUrl:"/simhei.ttf"}){let e=null;return async t=>{e||(e=await import("@agile-team/mach-report/pdf"));const o=r.fontUrl?await e.loadFontWithCache(r.fontUrl):null,{bytes:n}=await e.renderPlanToPdf(t,o?{customFontBytes:o}:{});return n}}const T="mach-report/fetcher",g="mach-report/pdf-exporter",w="mach-report/config",$="mach-report/controller",C=R.defineAsyncComponent(()=>Promise.resolve().then(()=>require("./ReportPreview--ElcAKoi.cjs")).then(r=>r.ReportPreview$1)),H={install(r,e={}){const t=e.fetcher??p({request:e.request??P({baseUrl:e.baseUrl}),baseUrl:e.baseUrl});r.provide(T,t);const o=e.pdfFontUrl??e.config?.defaults?.pdfFontUrl??"/simhei.ttf";r.provide(g,e.pdfExporter??_({fontUrl:o})),r.provide(w,R.computed(()=>e.config??null)),e.globalComponent!==!1&&r.component("MachReportPreview",C)}};exports.MACH_REPORT_CONFIG_KEY=w;exports.MACH_REPORT_CONTROLLER_KEY=$;exports.MACH_REPORT_FETCHER_KEY=T;exports.MACH_REPORT_PDF_EXPORTER_KEY=g;exports.MachReportPreview=C;exports.PlanLoadError=s;exports.createDefaultPdfExporter=_;exports.createFetchRequest=P;exports.createJh4jGridPlanFetcher=p;exports.joinTempIds=j;exports.machReportPlugin=H;exports.normalizeTempIds=m;
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .mrp-toolbar[data-v-f50c26e8]{display:flex;align-items:center;gap:8px;padding:6px 12px;background:var(--mrp-toolbar-bg, #323639);border-bottom:1px solid var(--mrp-toolbar-border, #22252a);flex:none;flex-wrap:wrap}.mrp-title[data-v-f50c26e8]{font-size:13px;font-weight:600;margin-right:8px;color:var(--mrp-toolbar-fg, #e8e8e8)}.mrp-nav[data-v-f50c26e8]{background:transparent;color:var(--mrp-btn-fg, #cfcfcf);border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:2px 8px;font-size:12px;cursor:pointer;white-space:nowrap}.mrp-nav[data-v-f50c26e8]:hover:not(:disabled){background:var(--mrp-btn-hover-bg, #414549);color:var(--mrp-btn-hover-fg, #fff)}.mrp-nav[data-v-f50c26e8]:disabled{opacity:.4;cursor:not-allowed}.mrp-active[data-v-f50c26e8]{background:var(--mrp-btn-active-bg, #2d5fb8);border-color:var(--mrp-btn-active-bg, #2d5fb8);color:#fff}.mrp-pageinfo[data-v-f50c26e8]{font-size:12px;min-width:56px;text-align:center;color:var(--mrp-toolbar-fg, #e8e8e8)}.mrp-spacer[data-v-f50c26e8]{flex:1}.mrp-search[data-v-f50c26e8]{display:flex;align-items:center;gap:4px}.mrp-search-input[data-v-f50c26e8]{background:#22252a;color:#e8e8e8;border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:2px 8px;font-size:12px;width:150px;outline:none}.mrp-search-input[data-v-f50c26e8]:focus{border-color:var(--mrp-btn-active-bg, #2d5fb8)}.mrp-search-count[data-v-f50c26e8]{font-size:12px;color:var(--mrp-toolbar-fg, #e8e8e8);min-width:42px;text-align:center}.mach-report-preview[data-v-2e98692a]{--mrp-shell-bg: #525659;--mrp-shell-fg: #e8e8e8;--mrp-toolbar-bg: #323639;--mrp-toolbar-border: #22252a;--mrp-toolbar-fg: #e8e8e8;--mrp-btn-fg: #cfcfcf;--mrp-btn-border: #4a4d52;--mrp-btn-hover-bg: #414549;--mrp-btn-hover-fg: #ffffff;--mrp-btn-active-bg: #2d5fb8;position:relative;display:flex;flex-direction:column;background:var(--mrp-shell-bg);color:var(--mrp-shell-fg);overflow:hidden}.mrp-main[data-v-2e98692a]{display:flex;flex:1;min-height:0}.mrp-body[data-v-2e98692a]{flex:1;overflow:auto;padding:24px;outline:none}.mrp-scale[data-v-2e98692a]{margin:0 auto}.mrp-scale-inner[data-v-2e98692a]{display:flex;flex-direction:column;align-items:center}.mrp-page-holder[data-v-2e98692a]{background:#fff;box-shadow:0 2px 8px #00000059;margin-bottom:var(--v3c509574);flex:none}.mrp-state[data-v-2e98692a]{padding:40px;text-align:center;color:#bfbfbf;font-size:13px}.mrp-error[data-v-2e98692a]{color:#ff9d9d}.mrp-retry[data-v-2e98692a]{margin-left:12px;background:transparent;color:#8fb7ff;border:1px solid #5a7fbf;border-radius:4px;padding:1px 10px;cursor:pointer}.mrp-overlay[data-v-2e98692a]{position:absolute;inset:0;pointer-events:none}.mrp-page-holder[data-v-2e98692a] mark.mrp-hit{background:#ffe066;color:#7a5c00;border-radius:2px;padding:0 1px}.mrp-thumbs[data-v-2e98692a]{width:140px;flex:none;overflow-y:auto;border-left:1px solid var(--mrp-toolbar-border);background:var(--mrp-toolbar-bg);padding:8px;display:flex;flex-direction:column;gap:8px}.mrp-thumb[data-v-2e98692a]{cursor:pointer;text-align:center}.mrp-thumb-box[data-v-2e98692a]{width:116px;background:#fff;box-shadow:0 1px 4px #0006;overflow:hidden;border:2px solid transparent}.mrp-thumb-active .mrp-thumb-box[data-v-2e98692a]{border-color:var(--mrp-btn-active-bg)}.mrp-thumb-no[data-v-2e98692a]{font-size:11px;color:var(--mrp-toolbar-fg)}.mrp-debug[data-v-2e98692a]{position:absolute;right:8px;bottom:8px;background:#000000c7;color:#7ee787;font:11px/1.6 ui-monospace,monospace;padding:6px 10px;border-radius:6px;pointer-events:none;white-space:pre}
1
+ .mrp-toolbar[data-v-f50c26e8]{display:flex;align-items:center;gap:8px;padding:6px 12px;background:var(--mrp-toolbar-bg, #323639);border-bottom:1px solid var(--mrp-toolbar-border, #22252a);flex:none;flex-wrap:wrap}.mrp-title[data-v-f50c26e8]{font-size:13px;font-weight:600;margin-right:8px;color:var(--mrp-toolbar-fg, #e8e8e8)}.mrp-nav[data-v-f50c26e8]{background:transparent;color:var(--mrp-btn-fg, #cfcfcf);border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:2px 8px;font-size:12px;cursor:pointer;white-space:nowrap}.mrp-nav[data-v-f50c26e8]:hover:not(:disabled){background:var(--mrp-btn-hover-bg, #414549);color:var(--mrp-btn-hover-fg, #fff)}.mrp-nav[data-v-f50c26e8]:disabled{opacity:.4;cursor:not-allowed}.mrp-active[data-v-f50c26e8]{background:var(--mrp-btn-active-bg, #2d5fb8);border-color:var(--mrp-btn-active-bg, #2d5fb8);color:#fff}.mrp-pageinfo[data-v-f50c26e8]{font-size:12px;min-width:56px;text-align:center;color:var(--mrp-toolbar-fg, #e8e8e8)}.mrp-spacer[data-v-f50c26e8]{flex:1}.mrp-search[data-v-f50c26e8]{display:flex;align-items:center;gap:4px}.mrp-search-input[data-v-f50c26e8]{background:#22252a;color:#e8e8e8;border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:2px 8px;font-size:12px;width:150px;outline:none}.mrp-search-input[data-v-f50c26e8]:focus{border-color:var(--mrp-btn-active-bg, #2d5fb8)}.mrp-search-count[data-v-f50c26e8]{font-size:12px;color:var(--mrp-toolbar-fg, #e8e8e8);min-width:42px;text-align:center}.mrp-params[data-v-aafce92d]{display:flex;align-items:flex-end;gap:12px;padding:6px 12px;background:var(--mrp-toolbar-bg, #323639);border-bottom:1px solid var(--mrp-toolbar-border, #22252a);flex:none;flex-wrap:wrap}.mrp-params-title[data-v-aafce92d]{font-size:12px;font-weight:600;color:var(--mrp-toolbar-fg, #e8e8e8);padding-bottom:5px;white-space:nowrap}.mrp-params-grid[data-v-aafce92d]{display:flex;flex-wrap:wrap;gap:8px 12px;flex:1}.mrp-param[data-v-aafce92d]{display:flex;flex-direction:column;gap:2px}.mrp-param-label[data-v-aafce92d]{font-size:11px;color:var(--mrp-toolbar-fg, #e8e8e8);opacity:.85}.mrp-param-star[data-v-aafce92d]{color:#ff7b72;font-style:normal;margin-left:2px}.mrp-param-input[data-v-aafce92d]{background:#22252a;color:#e8e8e8;border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:3px 8px;font-size:12px;min-width:130px;outline:none}.mrp-param-input[data-v-aafce92d]:focus{border-color:var(--mrp-btn-active-bg, #2d5fb8)}.mrp-param-missing .mrp-param-input[data-v-aafce92d]{border-color:#ff7b72}select.mrp-param-input option[data-v-aafce92d]{background:#22252a}.mrp-params-actions[data-v-aafce92d]{display:flex;gap:6px;padding-bottom:1px}.mrp-nav[data-v-aafce92d]{background:transparent;color:var(--mrp-btn-fg, #cfcfcf);border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:4px 14px;font-size:12px;cursor:pointer;white-space:nowrap}.mrp-nav[data-v-aafce92d]:hover{background:var(--mrp-btn-hover-bg, #414549);color:var(--mrp-btn-hover-fg, #fff)}.mrp-param-query[data-v-aafce92d]{background:var(--mrp-btn-active-bg, #2d5fb8);border-color:var(--mrp-btn-active-bg, #2d5fb8);color:#fff}.mach-report-preview[data-v-dbf59a36]{--mrp-shell-bg: #525659;--mrp-shell-fg: #e8e8e8;--mrp-toolbar-bg: #323639;--mrp-toolbar-border: #22252a;--mrp-toolbar-fg: #e8e8e8;--mrp-btn-fg: #cfcfcf;--mrp-btn-border: #4a4d52;--mrp-btn-hover-bg: #414549;--mrp-btn-hover-fg: #ffffff;--mrp-btn-active-bg: #2d5fb8;position:relative;display:flex;flex-direction:column;background:var(--mrp-shell-bg);color:var(--mrp-shell-fg);overflow:hidden}.mrp-main[data-v-dbf59a36]{display:flex;flex:1;min-height:0}.mrp-body[data-v-dbf59a36]{flex:1;overflow:auto;padding:24px;outline:none}.mrp-scale[data-v-dbf59a36]{margin:0 auto}.mrp-scale-inner[data-v-dbf59a36]{display:flex;flex-direction:column;align-items:center}.mrp-page-holder[data-v-dbf59a36]{background:#fff;box-shadow:0 2px 8px #00000059;margin-bottom:var(--v06e552ba);flex:none}.mrp-state[data-v-dbf59a36]{padding:40px;text-align:center;color:#bfbfbf;font-size:13px}.mrp-error[data-v-dbf59a36]{color:#ff9d9d}.mrp-retry[data-v-dbf59a36]{margin-left:12px;background:transparent;color:#8fb7ff;border:1px solid #5a7fbf;border-radius:4px;padding:1px 10px;cursor:pointer}.mrp-overlay[data-v-dbf59a36]{position:absolute;inset:0;pointer-events:none}.mrp-page-holder[data-v-dbf59a36] mark.mrp-hit{background:#ffe066;color:#7a5c00;border-radius:2px;padding:0 1px}.mrp-thumbs[data-v-dbf59a36]{width:140px;flex:none;overflow-y:auto;border-left:1px solid var(--mrp-toolbar-border);background:var(--mrp-toolbar-bg);padding:8px;display:flex;flex-direction:column;gap:8px}.mrp-thumb[data-v-dbf59a36]{cursor:pointer;text-align:center}.mrp-thumb-box[data-v-dbf59a36]{width:116px;background:#fff;box-shadow:0 1px 4px #0006;overflow:hidden;border:2px solid transparent}.mrp-thumb-active .mrp-thumb-box[data-v-dbf59a36]{border-color:var(--mrp-btn-active-bg)}.mrp-thumb-no[data-v-dbf59a36]{font-size:11px;color:var(--mrp-toolbar-fg)}.mrp-debug[data-v-dbf59a36]{position:absolute;right:8px;bottom:8px;background:#000000c7;color:#7ee787;font:11px/1.6 ui-monospace,monospace;padding:6px 10px;border-radius:6px;pointer-events:none;white-space:pre}
@@ -0,0 +1,19 @@
1
+ import { ReportParamDef } from '@agile-team/mach-report';
2
+ import { MachReportMessages } from './config';
3
+ type __VLS_Props = {
4
+ defs: ReportParamDef[];
5
+ modelValue: Record<string, string>;
6
+ messages: MachReportMessages;
7
+ /** 触发过查询后才开始必填提示(避免首屏一片红) */
8
+ attempted: boolean;
9
+ };
10
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
11
+ reset: () => any;
12
+ query: () => any;
13
+ "update:modelValue": (value: Record<string, string>) => any;
14
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
15
+ onReset?: (() => any) | undefined;
16
+ onQuery?: (() => any) | undefined;
17
+ "onUpdate:modelValue"?: ((value: Record<string, string>) => any) | undefined;
18
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
19
+ export default _default;
@@ -1,5 +1,6 @@
1
1
  import { PropType } from 'vue';
2
2
  import { PlanFetcher } from './adapters';
3
+ import { ReportParamDef } from '@agile-team/mach-report';
3
4
  import { MachReportMessages } from './config';
4
5
  declare function reload(): Promise<void>;
5
6
  declare function gotoPage(n: number): void;
@@ -70,6 +71,16 @@ declare const __VLS_component: import('vue').DefineComponent<import('vue').Extra
70
71
  type: BooleanConstructor;
71
72
  default: boolean;
72
73
  };
74
+ /** 参数定义(优先级:prop > 模板 params;有定义且未关闭时显示查询面板) */
75
+ paramDefs: {
76
+ type: PropType<ReportParamDef[] | undefined>;
77
+ default: undefined;
78
+ };
79
+ /** 参数面板显隐(不传走配置中心,缺省 true;有参数定义才渲染) */
80
+ showParams: {
81
+ type: BooleanConstructor;
82
+ default: undefined;
83
+ };
73
84
  fetcher: {
74
85
  type: PropType<PlanFetcher | null>;
75
86
  default: null;
@@ -140,6 +151,16 @@ declare const __VLS_component: import('vue').DefineComponent<import('vue').Extra
140
151
  type: BooleanConstructor;
141
152
  default: boolean;
142
153
  };
154
+ /** 参数定义(优先级:prop > 模板 params;有定义且未关闭时显示查询面板) */
155
+ paramDefs: {
156
+ type: PropType<ReportParamDef[] | undefined>;
157
+ default: undefined;
158
+ };
159
+ /** 参数面板显隐(不传走配置中心,缺省 true;有参数定义才渲染) */
160
+ showParams: {
161
+ type: BooleanConstructor;
162
+ default: undefined;
163
+ };
143
164
  fetcher: {
144
165
  type: PropType<PlanFetcher | null>;
145
166
  default: null;
@@ -160,9 +181,11 @@ declare const __VLS_component: import('vue').DefineComponent<import('vue').Extra
160
181
  showExport: boolean;
161
182
  showPrint: boolean;
162
183
  showPdfWindow: boolean;
184
+ showParams: boolean;
163
185
  messages: Partial<MachReportMessages>;
164
186
  autoLoad: boolean;
165
187
  preset: string;
188
+ paramDefs: ReportParamDef[] | undefined;
166
189
  fetcher: PlanFetcher | null;
167
190
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {
168
191
  viewportRef: HTMLDivElement;