@agile-team/mach-report 1.1.2 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ "use strict";const E=require("vue");function p(r){return r==null?[]:Array.isArray(r)?r.map(String).filter(e=>e!==""):String(r).split(",").map(e=>e.trim()).filter(e=>e!=="")}function O(r){return p(r).join(",")}class o extends Error{constructor(e){super(e),this.name="PlanLoadError"}}function m(r={}){const{baseUrl:e="",headers:i,credentials:c,timeoutMs:l=3e4}=r,h=e.replace(/\/+$/,"");return async({url:a,method:s,params:t})=>{const d=t&&Object.keys(t).length>0?`?${new URLSearchParams(t)}`:"",n=new AbortController,f=setTimeout(()=>n.abort(),l);let R;try{R=await fetch(`${h}${a}${d}`,{method:s.toUpperCase(),headers:{Accept:"application/json",...i},credentials:c,signal:n.signal})}catch(u){throw u instanceof DOMException&&u.name==="AbortError"?new o(`请求超时(${l}ms): ${a}`):new o(`请求失败(${a}): ${u instanceof Error?u.message:String(u)}`)}finally{clearTimeout(f)}if(!R.ok)throw new o(`HTTP ${R.status} ${a}`);return R.json()}}function P(r){const{request:e,baseUrl:i=""}=r,c=i.replace(/\/+$/,"");return async({tempIds:l,furnitureTempId:h,params:a})=>{if(l.length===0)throw new o("缺少报表模板 ID");const s={};for(const[n,f]of Object.entries(a||{}))n&&n!=="tempId"&&n!=="furnitureTempId"&&f!=null&&f!==""&&(s[n]=String(f));s.tempId=l.join(","),h&&(s.furnitureTempId=h);const t=await e({url:`${c}/report/codePrintReport/gridPlan`,method:"get",params:s});if(t&&t.code!=null&&t.code!==200)throw new o(String(t.message||"预览加载失败"));const d=t?.data?.pages;if(!Array.isArray(d))throw new o("预览响应缺少 pages 数组,请检查 gridPlan 接口契约");return{schemaVersion:"jh4j-compatible",pages:d}}}const _="mach-report/fetcher",g="mach-report/pdf-exporter",T="mach-report/config",C="mach-report/controller",w=E.defineAsyncComponent(()=>Promise.resolve().then(()=>require("./ReportPreview-CJLvkTVn.cjs")).then(r=>r.ReportPreview$1)),A={install(r,e={}){const i=e.fetcher??P({request:e.request??m(),baseUrl:e.baseUrl});r.provide(_,i),e.pdfExporter&&r.provide(g,e.pdfExporter),r.provide(T,E.computed(()=>{if(e.pdfFontUrl===void 0)return e.config??null;const c=e.config??{defaults:{},presets:{}};return{...c,defaults:{...c.defaults,pdfFontUrl:e.pdfFontUrl}}})),e.globalComponent!==!1&&r.component("MachReportPreview",w)}};exports.MACH_REPORT_CONFIG_KEY=T;exports.MACH_REPORT_CONTROLLER_KEY=C;exports.MACH_REPORT_FETCHER_KEY=_;exports.MACH_REPORT_PDF_EXPORTER_KEY=g;exports.MachReportPreview=w;exports.PlanLoadError=o;exports.createFetchRequest=m;exports.createJh4jGridPlanFetcher=P;exports.joinTempIds=O;exports.machReportPlugin=A;exports.normalizeTempIds=p;
@@ -0,0 +1,85 @@
1
+ import { defineAsyncComponent as m, computed as g } from "vue";
2
+ function E(r) {
3
+ return r == null ? [] : Array.isArray(r) ? r.map(String).filter((e) => e !== "") : String(r).split(",").map((e) => e.trim()).filter((e) => e !== "");
4
+ }
5
+ function y(r) {
6
+ return E(r).join(",");
7
+ }
8
+ class c extends Error {
9
+ constructor(e) {
10
+ super(e), this.name = "PlanLoadError";
11
+ }
12
+ }
13
+ function R(r = {}) {
14
+ const { baseUrl: e = "", headers: i, credentials: o, timeoutMs: l = 3e4 } = r, d = e.replace(/\/+$/, "");
15
+ return async ({ url: a, method: s, params: t }) => {
16
+ const h = t && Object.keys(t).length > 0 ? `?${new URLSearchParams(t)}` : "", n = new AbortController(), f = setTimeout(() => n.abort(), l);
17
+ let p;
18
+ try {
19
+ p = await fetch(`${d}${a}${h}`, {
20
+ method: s.toUpperCase(),
21
+ headers: { Accept: "application/json", ...i },
22
+ credentials: o,
23
+ signal: n.signal
24
+ });
25
+ } catch (u) {
26
+ throw u instanceof DOMException && u.name === "AbortError" ? new c(`请求超时(${l}ms): ${a}`) : new c(`请求失败(${a}): ${u instanceof Error ? u.message : String(u)}`);
27
+ } finally {
28
+ clearTimeout(f);
29
+ }
30
+ if (!p.ok)
31
+ throw new c(`HTTP ${p.status} ${a}`);
32
+ return p.json();
33
+ };
34
+ }
35
+ function w(r) {
36
+ const { request: e, baseUrl: i = "" } = r, o = i.replace(/\/+$/, "");
37
+ return async ({ tempIds: l, furnitureTempId: d, params: a }) => {
38
+ if (l.length === 0) throw new c("缺少报表模板 ID");
39
+ const s = {};
40
+ for (const [n, f] of Object.entries(a || {}))
41
+ n && n !== "tempId" && n !== "furnitureTempId" && f != null && f !== "" && (s[n] = String(f));
42
+ s.tempId = l.join(","), d && (s.furnitureTempId = d);
43
+ const t = await e({
44
+ url: `${o}/report/codePrintReport/gridPlan`,
45
+ method: "get",
46
+ params: s
47
+ });
48
+ if (t && t.code != null && t.code !== 200)
49
+ throw new c(String(t.message || "预览加载失败"));
50
+ const h = t?.data?.pages;
51
+ if (!Array.isArray(h))
52
+ throw new c("预览响应缺少 pages 数组,请检查 gridPlan 接口契约");
53
+ return {
54
+ schemaVersion: "jh4j-compatible",
55
+ pages: h
56
+ };
57
+ };
58
+ }
59
+ const P = "mach-report/fetcher", T = "mach-report/pdf-exporter", b = "mach-report/config", A = "mach-report/controller", _ = m(() => import("./ReportPreview-mZiGtf0L.js").then((r) => r.n)), j = {
60
+ install(r, e = {}) {
61
+ const i = e.fetcher ?? w({
62
+ // 网关前缀由 jh4j adapter 统一添加;内置 fetch 不再重复拼接。
63
+ request: e.request ?? R(),
64
+ baseUrl: e.baseUrl
65
+ });
66
+ r.provide(P, i), e.pdfExporter && r.provide(T, e.pdfExporter), r.provide(b, g(() => {
67
+ if (e.pdfFontUrl === void 0) return e.config ?? null;
68
+ const o = e.config ?? { defaults: {}, presets: {} };
69
+ return { ...o, defaults: { ...o.defaults, pdfFontUrl: e.pdfFontUrl } };
70
+ })), e.globalComponent !== !1 && r.component("MachReportPreview", _);
71
+ }
72
+ };
73
+ export {
74
+ A as M,
75
+ c as P,
76
+ b as a,
77
+ P as b,
78
+ T as c,
79
+ _ as d,
80
+ R as e,
81
+ w as f,
82
+ y as j,
83
+ j as m,
84
+ E as n
85
+ };
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .mrp-toolbar[data-v-f3aa8dfd]{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-f3aa8dfd]{font-size:13px;font-weight:600;margin-right:8px;color:var(--mrp-toolbar-fg, #e8e8e8)}.mrp-nav[data-v-f3aa8dfd]{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-f3aa8dfd]:hover:not(:disabled){background:var(--mrp-btn-hover-bg, #414549);color:var(--mrp-btn-hover-fg, #fff)}.mrp-nav[data-v-f3aa8dfd]:disabled{opacity:.4;cursor:not-allowed}.mrp-active[data-v-f3aa8dfd]{background:var(--mrp-btn-active-bg, #2d5fb8);border-color:var(--mrp-btn-active-bg, #2d5fb8);color:#fff}.mrp-pageinfo[data-v-f3aa8dfd]{font-size:12px;min-width:56px;text-align:center;color:var(--mrp-toolbar-fg, #e8e8e8)}.mrp-spacer[data-v-f3aa8dfd]{flex:1}.mrp-search[data-v-f3aa8dfd]{display:flex;align-items:center;gap:4px}.mrp-search-input[data-v-f3aa8dfd]{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-f3aa8dfd]:focus{border-color:var(--mrp-btn-active-bg, #2d5fb8)}.mrp-search-count[data-v-f3aa8dfd]{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-4648d204]{--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-4648d204]{display:flex;flex:1;min-height:0}.mrp-body[data-v-4648d204]{flex:1;overflow:auto;padding:24px;outline:none}.mrp-scale[data-v-4648d204]{margin:0 auto}.mrp-scale-inner[data-v-4648d204]{display:flex;flex-direction:column;align-items:center}.mrp-page-holder[data-v-4648d204]{background:#fff;box-shadow:0 2px 8px #00000059;margin-bottom:var(--db73374c);flex:none}.mrp-state[data-v-4648d204]{padding:40px;text-align:center;color:#bfbfbf;font-size:13px}.mrp-error[data-v-4648d204]{color:#ff9d9d}.mrp-retry[data-v-4648d204]{margin-left:12px;background:transparent;color:#8fb7ff;border:1px solid #5a7fbf;border-radius:4px;padding:1px 10px;cursor:pointer}.mrp-overlay[data-v-4648d204]{position:absolute;inset:0;pointer-events:none}.mrp-page-holder[data-v-4648d204] mark.mrp-hit{background:#ffe066;color:#7a5c00;border-radius:2px;padding:0 1px}.mrp-thumbs[data-v-4648d204]{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-4648d204]{cursor:pointer;text-align:center}.mrp-thumb-box[data-v-4648d204]{width:116px;background:#fff;box-shadow:0 1px 4px #0006;overflow:hidden;border:2px solid transparent}.mrp-thumb-active .mrp-thumb-box[data-v-4648d204]{border-color:var(--mrp-btn-active-bg)}.mrp-thumb-no[data-v-4648d204]{font-size:11px;color:var(--mrp-toolbar-fg)}.mrp-debug[data-v-4648d204]{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-48cc0980]{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-48cc0980]{font-size:13px;font-weight:600;margin-right:8px;color:var(--mrp-toolbar-fg, #e8e8e8)}.mrp-nav[data-v-48cc0980]{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-48cc0980]:hover:not(:disabled){background:var(--mrp-btn-hover-bg, #414549);color:var(--mrp-btn-hover-fg, #fff)}.mrp-nav[data-v-48cc0980]:disabled{opacity:.4;cursor:not-allowed}.mrp-active[data-v-48cc0980]{background:var(--mrp-btn-active-bg, #2d5fb8);border-color:var(--mrp-btn-active-bg, #2d5fb8);color:#fff}.mrp-pageinfo[data-v-48cc0980]{font-size:12px;min-width:56px;text-align:center;color:var(--mrp-toolbar-fg, #e8e8e8)}.mrp-spacer[data-v-48cc0980]{flex:1}.mrp-search[data-v-48cc0980]{display:flex;align-items:center;gap:4px}.mrp-search-input[data-v-48cc0980]{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-48cc0980]:focus{border-color:var(--mrp-btn-active-bg, #2d5fb8)}.mrp-search-count[data-v-48cc0980]{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-a0054844]{--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-a0054844]{display:flex;flex:1;min-height:0}.mrp-body[data-v-a0054844]{flex:1;overflow:auto;padding:24px;outline:none}.mrp-scale[data-v-a0054844]{margin:0 auto}.mrp-scale-inner[data-v-a0054844]{display:flex;flex-direction:column;align-items:center}.mrp-page-holder[data-v-a0054844]{background:#fff;box-shadow:0 2px 8px #00000059;margin-bottom:var(--a2716f8c);flex:none}.mrp-state[data-v-a0054844]{padding:40px;text-align:center;color:#bfbfbf;font-size:13px}.mrp-error[data-v-a0054844]{color:#ff9d9d}.mrp-export-notice[data-v-a0054844]{padding:7px 12px;font-size:12px;background:#fff0c2;color:#613c00}.mrp-export-error[data-v-a0054844]{background:#ffe0df;color:#8e1f1f}.mrp-export-progress[data-v-a0054844]{background:#e7f0ff;color:#1a4d86}.mrp-retry[data-v-a0054844]{margin-left:12px;background:transparent;color:#8fb7ff;border:1px solid #5a7fbf;border-radius:4px;padding:1px 10px;cursor:pointer}.mrp-overlay[data-v-a0054844]{position:absolute;inset:0;pointer-events:none}.mrp-page-holder[data-v-a0054844] mark.mrp-hit{background:#ffe066;color:#7a5c00;border-radius:2px;padding:0 1px}.mrp-thumbs[data-v-a0054844]{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-a0054844]{cursor:pointer;text-align:center}.mrp-thumb-box[data-v-a0054844]{width:116px;background:#fff;box-shadow:0 1px 4px #0006;overflow:hidden;border:2px solid transparent}.mrp-thumb-active .mrp-thumb-box[data-v-a0054844]{border-color:var(--mrp-btn-active-bg)}.mrp-thumb-no[data-v-a0054844]{font-size:11px;color:var(--mrp-toolbar-fg)}.mrp-debug[data-v-a0054844]{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}
@@ -103,6 +103,7 @@ declare const __VLS_component: import('vue').DefineComponent<import('vue').Extra
103
103
  cause?: unknown;
104
104
  } | undefined) => any;
105
105
  loaded: (pageCount: number) => any;
106
+ warning: (message: string) => any;
106
107
  }, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<{
107
108
  tempId: {
108
109
  type: PropType<string | string[] | null>;
@@ -177,6 +178,7 @@ declare const __VLS_component: import('vue').DefineComponent<import('vue').Extra
177
178
  cause?: unknown;
178
179
  } | undefined) => any) | undefined;
179
180
  onLoaded?: ((pageCount: number) => any) | undefined;
181
+ onWarning?: ((message: string) => any) | undefined;
180
182
  }>, {
181
183
  height: string;
182
184
  gapPx: number;
@@ -17,7 +17,7 @@ type __VLS_Props = {
17
17
  thumbsVisible: boolean;
18
18
  };
19
19
  declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
20
- export: (format: "html" | "png" | "pdf" | "word") => any;
20
+ export: (format: "html" | "png" | "pdf" | "xlsx" | "word") => any;
21
21
  zoom: (mode: number | "fit") => any;
22
22
  print: () => any;
23
23
  goto: (page: number) => any;
@@ -27,7 +27,7 @@ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {
27
27
  "search-toggle": () => any;
28
28
  "thumbs-toggle": () => any;
29
29
  }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
30
- onExport?: ((format: "html" | "png" | "pdf" | "word") => any) | undefined;
30
+ onExport?: ((format: "html" | "png" | "pdf" | "xlsx" | "word") => any) | undefined;
31
31
  onZoom?: ((mode: number | "fit") => any) | undefined;
32
32
  onPrint?: (() => any) | undefined;
33
33
  onGoto?: ((page: number) => any) | undefined;
@@ -81,6 +81,7 @@ export declare const MachReportPreview: {
81
81
  cause?: unknown;
82
82
  } | undefined) => any) | undefined;
83
83
  onLoaded?: ((pageCount: number) => any) | undefined;
84
+ onWarning?: ((message: string) => any) | undefined;
84
85
  }>, {
85
86
  reload: () => Promise<void>;
86
87
  print: () => Promise<void>;
@@ -96,6 +97,7 @@ export declare const MachReportPreview: {
96
97
  cause?: unknown;
97
98
  } | undefined) => any;
98
99
  loaded: (pageCount: number) => any;
100
+ warning: (message: string) => any;
99
101
  }, import('vue').PublicProps, {
100
102
  height: string;
101
103
  gapPx: number;
@@ -190,6 +192,7 @@ export declare const MachReportPreview: {
190
192
  cause?: unknown;
191
193
  } | undefined) => any) | undefined;
192
194
  onLoaded?: ((pageCount: number) => any) | undefined;
195
+ onWarning?: ((message: string) => any) | undefined;
193
196
  }>, {
194
197
  reload: () => Promise<void>;
195
198
  print: () => Promise<void>;
@@ -286,6 +289,7 @@ export declare const MachReportPreview: {
286
289
  cause?: unknown;
287
290
  } | undefined) => any) | undefined;
288
291
  onLoaded?: ((pageCount: number) => any) | undefined;
292
+ onWarning?: ((message: string) => any) | undefined;
289
293
  }>, {
290
294
  reload: () => Promise<void>;
291
295
  print: () => Promise<void>;
@@ -301,6 +305,7 @@ export declare const MachReportPreview: {
301
305
  cause?: unknown;
302
306
  } | undefined) => any;
303
307
  loaded: (pageCount: number) => any;
308
+ warning: (message: string) => any;
304
309
  }, string, {
305
310
  height: string;
306
311
  gapPx: number;
@@ -81,6 +81,7 @@ export declare const MachReportPreview: {
81
81
  cause?: unknown;
82
82
  } | undefined) => any) | undefined;
83
83
  onLoaded?: ((pageCount: number) => any) | undefined;
84
+ onWarning?: ((message: string) => any) | undefined;
84
85
  }>, {
85
86
  reload: () => Promise<void>;
86
87
  print: () => Promise<void>;
@@ -96,6 +97,7 @@ export declare const MachReportPreview: {
96
97
  cause?: unknown;
97
98
  } | undefined) => any;
98
99
  loaded: (pageCount: number) => any;
100
+ warning: (message: string) => any;
99
101
  }, import('vue').PublicProps, {
100
102
  height: string;
101
103
  gapPx: number;
@@ -190,6 +192,7 @@ export declare const MachReportPreview: {
190
192
  cause?: unknown;
191
193
  } | undefined) => any) | undefined;
192
194
  onLoaded?: ((pageCount: number) => any) | undefined;
195
+ onWarning?: ((message: string) => any) | undefined;
193
196
  }>, {
194
197
  reload: () => Promise<void>;
195
198
  print: () => Promise<void>;
@@ -286,6 +289,7 @@ export declare const MachReportPreview: {
286
289
  cause?: unknown;
287
290
  } | undefined) => any) | undefined;
288
291
  onLoaded?: ((pageCount: number) => any) | undefined;
292
+ onWarning?: ((message: string) => any) | undefined;
289
293
  }>, {
290
294
  reload: () => Promise<void>;
291
295
  print: () => Promise<void>;
@@ -301,6 +305,7 @@ export declare const MachReportPreview: {
301
305
  cause?: unknown;
302
306
  } | undefined) => any;
303
307
  loaded: (pageCount: number) => any;
308
+ warning: (message: string) => any;
304
309
  }, string, {
305
310
  height: string;
306
311
  gapPx: number;
@@ -9,7 +9,7 @@ import { PlanPage, RenderPlan } from '@agile-team/mach-report';
9
9
  */
10
10
  export declare function usePageWindow(plan: Ref<RenderPlan | null>, zoom: Ref<number>, options?: {
11
11
  pxPerMm?: number;
12
- gapPx?: number;
12
+ gapPx?: number | Ref<number>;
13
13
  }): {
14
14
  contentSize: import('vue').ComputedRef<{
15
15
  w: number;
@@ -5,7 +5,7 @@ interface PrintHtmlResult {
5
5
  head: string;
6
6
  pageChunks: string[];
7
7
  }
8
- /** 构建打印文档:head(含按尺寸分组的 @page 规则)+ 每页一段 HTML(供流式写入) */
8
+ /** 供 HTML/Word 导出的完整文档;打印路径逐页渲染,避免预先生成所有页。 */
9
9
  export declare function buildPrintDocument(p: RenderPlan): PrintHtmlResult;
10
10
  /**
11
11
  * 批量打印(多单连打):把多份计划合并为一个打印文档——
@@ -27,6 +27,8 @@ export declare function buildWordHtml(p: RenderPlan): {
27
27
  export declare function usePrintExport(plan: Ref<RenderPlan | null>, hooks: {
28
28
  getPdfExporter: () => PdfExporter;
29
29
  onError: (message: string, code?: string) => void;
30
+ onWarning?: (message: string) => void;
31
+ onBusy?: (format: string | null) => void;
30
32
  }): {
31
33
  print: () => Promise<void>;
32
34
  exportAs: (format: string) => void;
@@ -15,8 +15,11 @@ export interface MachReportMessages {
15
15
  fitWidth: string;
16
16
  exportHtml: string;
17
17
  exportPdf: string;
18
+ exportExcel: string;
18
19
  exportImage: string;
19
20
  exportWord: string;
21
+ /** 导出进行中提示,{format} 占位 */
22
+ exporting: string;
20
23
  print: string;
21
24
  pdfWindow: string;
22
25
  loading: string;
@@ -5,7 +5,8 @@
5
5
  export interface MachReportController {
6
6
  reload(): Promise<void>;
7
7
  print(): Promise<void>;
8
- exportAs(format: "html" | "pdf" | string): void;
8
+ /** 支持 html/pdf/xlsx/png/word(excel/image/doc 为兼容别名);未知格式报 export 错误。 */
9
+ exportAs(format: string): void;
9
10
  openPdfWindow(): void;
10
11
  gotoPage(page: number): void;
11
12
  /** 编程式设置参数并查询(合并进面板值;opts.reload=false 仅设值不重载) */
@@ -1,6 +1,6 @@
1
1
  import { RenderPlan } from '@agile-team/mach-report';
2
- /** PDF 导出器:RenderPlan → PDF 字节。宿主可注入自定义实现(自研后端/Worker 化等)。 */
3
- export type PdfExporter = (plan: RenderPlan) => Promise<Uint8Array>;
2
+ /** PDF 导出器:RenderPlan → PDF 字节;第二参数可上报非致命保真告警。 */
3
+ export type PdfExporter = (plan: RenderPlan, onWarning?: (message: string) => void) => Promise<Uint8Array>;
4
4
  export interface DefaultPdfExporterOptions {
5
5
  /** 中文字体 URL(浏览器 fetch);空串跳过字体加载(西文报表) */
6
6
  fontUrl: string;
@@ -74,6 +74,7 @@ export declare const MachReportPreview: {
74
74
  cause?: unknown;
75
75
  } | undefined) => any) | undefined;
76
76
  onLoaded?: ((pageCount: number) => any) | undefined;
77
+ onWarning?: ((message: string) => any) | undefined;
77
78
  }>, {
78
79
  reload: () => Promise<void>;
79
80
  print: () => Promise<void>;
@@ -89,6 +90,7 @@ export declare const MachReportPreview: {
89
90
  cause?: unknown;
90
91
  } | undefined) => any;
91
92
  loaded: (pageCount: number) => any;
93
+ warning: (message: string) => any;
92
94
  }, import('vue').PublicProps, {
93
95
  height: string;
94
96
  gapPx: number;
@@ -183,6 +185,7 @@ export declare const MachReportPreview: {
183
185
  cause?: unknown;
184
186
  } | undefined) => any) | undefined;
185
187
  onLoaded?: ((pageCount: number) => any) | undefined;
188
+ onWarning?: ((message: string) => any) | undefined;
186
189
  }>, {
187
190
  reload: () => Promise<void>;
188
191
  print: () => Promise<void>;
@@ -279,6 +282,7 @@ export declare const MachReportPreview: {
279
282
  cause?: unknown;
280
283
  } | undefined) => any) | undefined;
281
284
  onLoaded?: ((pageCount: number) => any) | undefined;
285
+ onWarning?: ((message: string) => any) | undefined;
282
286
  }>, {
283
287
  reload: () => Promise<void>;
284
288
  print: () => Promise<void>;
@@ -294,6 +298,7 @@ export declare const MachReportPreview: {
294
298
  cause?: unknown;
295
299
  } | undefined) => any;
296
300
  loaded: (pageCount: number) => any;
301
+ warning: (message: string) => any;
297
302
  }, string, {
298
303
  height: string;
299
304
  gapPx: number;
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const n=require("vue"),i=require("./plugin-DxneRya8.cjs"),r=n.defineAsyncComponent(()=>Promise.resolve().then(()=>require("./ReportPreview-kNbuSmbL.cjs")).then(e=>e.ReportPreview$1));function c(){return Promise.resolve().then(()=>require("./ReportPreview-kNbuSmbL.cjs")).then(e=>e.ReportPreview$1)}const t={install(e,o={}){i.machReportPlugin.install(e,o),e.component("MachReportPreview",r)}};exports.MachReportPreview=r;exports.default=t;exports.machReportAsyncPlugin=t;exports.preloadMachReport=c;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const n=require("vue"),i=require("./plugin-C4qpbdMJ.cjs"),r=n.defineAsyncComponent(()=>Promise.resolve().then(()=>require("./ReportPreview-CJLvkTVn.cjs")).then(e=>e.ReportPreview$1));function c(){return Promise.resolve().then(()=>require("./ReportPreview-CJLvkTVn.cjs")).then(e=>e.ReportPreview$1)}const t={install(e,o={}){i.machReportPlugin.install(e,o),e.component("MachReportPreview",r)}};exports.MachReportPreview=r;exports.default=t;exports.machReportAsyncPlugin=t;exports.preloadMachReport=c;
package/dist/vue-async.js CHANGED
@@ -1,17 +1,17 @@
1
- import { defineAsyncComponent as e } from "vue";
2
- import { m as n } from "./plugin-CVYs7wAj.js";
3
- const r = e(() => import("./ReportPreview-Do-x4E3Z.js").then((t) => t.m));
4
- function c() {
5
- return import("./ReportPreview-Do-x4E3Z.js").then((t) => t.m);
1
+ import { defineAsyncComponent as o } from "vue";
2
+ import { m as e } from "./plugin-DcmAPK_K.js";
3
+ const r = o(() => import("./ReportPreview-mZiGtf0L.js").then((t) => t.n));
4
+ function m() {
5
+ return import("./ReportPreview-mZiGtf0L.js").then((t) => t.n);
6
6
  }
7
7
  const p = {
8
- install(t, o = {}) {
9
- n.install(t, o), t.component("MachReportPreview", r);
8
+ install(t, n = {}) {
9
+ e.install(t, n), t.component("MachReportPreview", r);
10
10
  }
11
11
  };
12
12
  export {
13
13
  r as MachReportPreview,
14
14
  p as default,
15
15
  p as machReportAsyncPlugin,
16
- c as preloadMachReport
16
+ m as preloadMachReport
17
17
  };
package/dist/vue.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./ReportPreview-kNbuSmbL.cjs"),r=require("./plugin-DxneRya8.cjs"),c=require("@agile-team/mach-report"),s=require("vue");function l(R){return async({tempIds:t})=>{if(t.length===0)throw new r.PlanLoadError("缺少报表模板 ID");const a=[];for(const n of t){const o=R[n];if(!o)throw new r.PlanLoadError(`本地模板 ${n} 不存在`);const{plan:E,warnings:i}=c.paginateTemplate(o.template,o.datasets??{});i.length>0&&console.warn("[mach-report] 分页告警:",i),a.push(...E.pages)}return{schemaVersion:"mach-local",pages:a}}}function P(){return s.inject(r.MACH_REPORT_CONTROLLER_KEY,null)}exports.DEFAULT_MESSAGES=e.DEFAULT_MESSAGES;exports.DEFAULT_THEME=e.DEFAULT_THEME;exports.MachReportError=e.MachReportError;exports.ReportParamPanel=e.ReportParamPanel;exports.ReportPreview=e.ReportPreview;exports.ReportToolbar=e.ReportToolbar;exports.SILENT_LOGGER=e.SILENT_LOGGER;exports.buildPrintDocument=e.buildPrintDocument;exports.buildWordHtml=e.buildWordHtml;exports.defineMachReportConfig=e.defineMachReportConfig;exports.defineMachReportPreset=e.defineMachReportPreset;exports.printPlans=e.printPlans;exports.provideMachReportConfig=e.provideMachReportConfig;exports.resolveConfig=e.resolveConfig;exports.themeToCssVars=e.themeToCssVars;exports.toErrorDetail=e.toErrorDetail;exports.useMachReportConfig=e.useMachReportConfig;exports.usePageWindow=e.usePageWindow;exports.usePrintExport=e.usePrintExport;exports.useZoom=e.useZoom;exports.MACH_REPORT_CONFIG_KEY=r.MACH_REPORT_CONFIG_KEY;exports.MACH_REPORT_CONTROLLER_KEY=r.MACH_REPORT_CONTROLLER_KEY;exports.MACH_REPORT_FETCHER_KEY=r.MACH_REPORT_FETCHER_KEY;exports.MACH_REPORT_PDF_EXPORTER_KEY=r.MACH_REPORT_PDF_EXPORTER_KEY;exports.MachReportPreview=r.MachReportPreview;exports.PlanLoadError=r.PlanLoadError;exports.createDefaultPdfExporter=r.createDefaultPdfExporter;exports.createFetchRequest=r.createFetchRequest;exports.createJh4jGridPlanFetcher=r.createJh4jGridPlanFetcher;exports.joinTempIds=r.joinTempIds;exports.machReportPlugin=r.machReportPlugin;exports.normalizeTempIds=r.normalizeTempIds;exports.createLocalFetcher=l;exports.useReportPreview=P;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./ReportPreview-CJLvkTVn.cjs"),r=require("./plugin-C4qpbdMJ.cjs"),c=require("@agile-team/mach-report"),s=require("vue");function l(R){return async({tempIds:t})=>{if(t.length===0)throw new r.PlanLoadError("缺少报表模板 ID");const a=[];for(const n of t){const o=R[n];if(!o)throw new r.PlanLoadError(`本地模板 ${n} 不存在`);const{plan:E,warnings:i}=c.paginateTemplate(o.template,o.datasets??{});i.length>0&&console.warn("[mach-report] 分页告警:",i),a.push(...E.pages)}return{schemaVersion:"mach-local",pages:a}}}function P(){return s.inject(r.MACH_REPORT_CONTROLLER_KEY,null)}exports.DEFAULT_MESSAGES=e.DEFAULT_MESSAGES;exports.DEFAULT_THEME=e.DEFAULT_THEME;exports.MachReportError=e.MachReportError;exports.ReportParamPanel=e.ReportParamPanel;exports.ReportPreview=e.ReportPreview;exports.ReportToolbar=e.ReportToolbar;exports.SILENT_LOGGER=e.SILENT_LOGGER;exports.buildPrintDocument=e.buildPrintDocument;exports.buildWordHtml=e.buildWordHtml;exports.createDefaultPdfExporter=e.createDefaultPdfExporter;exports.defineMachReportConfig=e.defineMachReportConfig;exports.defineMachReportPreset=e.defineMachReportPreset;exports.printPlans=e.printPlans;exports.provideMachReportConfig=e.provideMachReportConfig;exports.resolveConfig=e.resolveConfig;exports.themeToCssVars=e.themeToCssVars;exports.toErrorDetail=e.toErrorDetail;exports.useMachReportConfig=e.useMachReportConfig;exports.usePageWindow=e.usePageWindow;exports.usePrintExport=e.usePrintExport;exports.useZoom=e.useZoom;exports.MACH_REPORT_CONFIG_KEY=r.MACH_REPORT_CONFIG_KEY;exports.MACH_REPORT_CONTROLLER_KEY=r.MACH_REPORT_CONTROLLER_KEY;exports.MACH_REPORT_FETCHER_KEY=r.MACH_REPORT_FETCHER_KEY;exports.MACH_REPORT_PDF_EXPORTER_KEY=r.MACH_REPORT_PDF_EXPORTER_KEY;exports.MachReportPreview=r.MachReportPreview;exports.PlanLoadError=r.PlanLoadError;exports.createFetchRequest=r.createFetchRequest;exports.createJh4jGridPlanFetcher=r.createJh4jGridPlanFetcher;exports.joinTempIds=r.joinTempIds;exports.machReportPlugin=r.machReportPlugin;exports.normalizeTempIds=r.normalizeTempIds;exports.createLocalFetcher=l;exports.useReportPreview=P;
package/dist/vue.js CHANGED
@@ -1,9 +1,9 @@
1
- import { D as T, a as _, M as d, R as g, b as M, c as C, S as w, d as O, e as D, f as F, g as L, p as A, h as H, r as b, t as j, i as v, u as x, j as G, k as S, l as I } from "./ReportPreview-Do-x4E3Z.js";
2
- import { P as t, M as c } from "./plugin-CVYs7wAj.js";
3
- import { a as Y, b as N, c as y, d as U, e as V, f as W, g as k, j as q, m as z, n as J } from "./plugin-CVYs7wAj.js";
1
+ import { D as T, a as _, M as d, R as g, b as M, c as C, S as w, d as O, e as D, f as F, g as L, h as A, p as H, i as b, r as j, t as v, j as x, u as G, k as S, l as I, m as K } from "./ReportPreview-mZiGtf0L.js";
2
+ import { P as t, M as c } from "./plugin-DcmAPK_K.js";
3
+ import { a as N, b as y, c as U, d as V, e as W, f as k, j as q, m as z, n as J } from "./plugin-DcmAPK_K.js";
4
4
  import { paginateTemplate as p } from "@agile-team/mach-report";
5
5
  import { inject as l } from "vue";
6
- function m(n) {
6
+ function f(n) {
7
7
  return async ({ tempIds: a }) => {
8
8
  if (a.length === 0) throw new t("缺少报表模板 ID");
9
9
  const r = [];
@@ -22,12 +22,12 @@ function P() {
22
22
  export {
23
23
  T as DEFAULT_MESSAGES,
24
24
  _ as DEFAULT_THEME,
25
- Y as MACH_REPORT_CONFIG_KEY,
25
+ N as MACH_REPORT_CONFIG_KEY,
26
26
  c as MACH_REPORT_CONTROLLER_KEY,
27
- N as MACH_REPORT_FETCHER_KEY,
28
- y as MACH_REPORT_PDF_EXPORTER_KEY,
27
+ y as MACH_REPORT_FETCHER_KEY,
28
+ U as MACH_REPORT_PDF_EXPORTER_KEY,
29
29
  d as MachReportError,
30
- U as MachReportPreview,
30
+ V as MachReportPreview,
31
31
  t as PlanLoadError,
32
32
  g as ReportParamPanel,
33
33
  M as ReportPreview,
@@ -35,23 +35,23 @@ export {
35
35
  w as SILENT_LOGGER,
36
36
  O as buildPrintDocument,
37
37
  D as buildWordHtml,
38
- V as createDefaultPdfExporter,
38
+ F as createDefaultPdfExporter,
39
39
  W as createFetchRequest,
40
40
  k as createJh4jGridPlanFetcher,
41
- m as createLocalFetcher,
42
- F as defineMachReportConfig,
43
- L as defineMachReportPreset,
41
+ f as createLocalFetcher,
42
+ L as defineMachReportConfig,
43
+ A as defineMachReportPreset,
44
44
  q as joinTempIds,
45
45
  z as machReportPlugin,
46
46
  J as normalizeTempIds,
47
- A as printPlans,
48
- H as provideMachReportConfig,
49
- b as resolveConfig,
50
- j as themeToCssVars,
51
- v as toErrorDetail,
52
- x as useMachReportConfig,
53
- G as usePageWindow,
54
- S as usePrintExport,
47
+ H as printPlans,
48
+ b as provideMachReportConfig,
49
+ j as resolveConfig,
50
+ v as themeToCssVars,
51
+ x as toErrorDetail,
52
+ G as useMachReportConfig,
53
+ S as usePageWindow,
54
+ I as usePrintExport,
55
55
  P as useReportPreview,
56
- I as useZoom
56
+ K as useZoom
57
57
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agile-team/mach-report",
3
- "version": "1.1.2",
3
+ "version": "1.2.1",
4
4
  "description": "MachReport 报表引擎单包:RenderPlan 模型 + 分页 + DOM/Canvas/PDF 渲染 + 动态 SQL + 管理端 API + Vue 3 契约组件(零运行时依赖;./vue 为框架子路径,vue 为可选 peer)",
5
5
  "type": "module",
6
6
  "sideEffects": [