@agile-team/mach-report 2.19.1 → 2.21.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.
Files changed (122) hide show
  1. package/README.md +22 -3
  2. package/dist/ExcelBindingWizard-B2xXBOJu.cjs +1 -0
  3. package/dist/{ExcelBindingWizard-xJIYmnZ_.js → ExcelBindingWizard-CixTPQAL.js} +351 -351
  4. package/dist/ParamEditor-DhHlNxai.cjs +1 -0
  5. package/dist/{ParamEditor-D1wWemaf.js → ParamEditor-gKhvEsnr.js} +10 -10
  6. package/dist/{ReportBatchPanel-BkJFqeEW.cjs → ReportBatchPanel-BUdUfTdm.cjs} +1 -1
  7. package/dist/{ReportBatchPanel-B88R-fME.js → ReportBatchPanel-D-lyWKyf.js} +2 -2
  8. package/dist/ReportLabelStudio-BcjQt73a.cjs +1 -0
  9. package/dist/ReportLabelStudio-N2w6DdaZ.js +764 -0
  10. package/dist/ReportParamPanel-CVpK8mFc.cjs +1 -0
  11. package/dist/{ReportParamPanel-mQkeN70Q.js → ReportParamPanel-peB-KEmm.js} +10 -2
  12. package/dist/{ReportPreview-DBbctg6C.js → ReportPreview-BBJNlu2U.js} +2093 -1978
  13. package/dist/ReportPreview-nf4Dk1Jc.cjs +6 -0
  14. package/dist/{ReportTemplateLibrary-BOh2MgjQ.cjs → ReportTemplateLibrary-Cs9WKneQ.cjs} +1 -1
  15. package/dist/{ReportTemplateLibrary-BGELmgd3.js → ReportTemplateLibrary-WZl-AK-2.js} +1 -1
  16. package/dist/{RuleEditor-CoLqgehG.js → RuleEditor-DGpmjCko.js} +178 -174
  17. package/dist/RuleEditor-Dtcq-7LO.cjs +1 -0
  18. package/dist/{TemplateOutlinePanel-DiG8tRRe.cjs → TemplateOutlinePanel-CkCh506f.cjs} +1 -1
  19. package/dist/{TemplateOutlinePanel-DU95loB-.js → TemplateOutlinePanel-cxp95OT9.js} +1 -1
  20. package/dist/{TemplateReusePanel-DE1KSD6c.js → TemplateReusePanel-BZ8VTtrO.js} +2 -2
  21. package/dist/{TemplateReusePanel-G-Y299wc.cjs → TemplateReusePanel-CwttuSta.cjs} +1 -1
  22. package/dist/{TemplateReviewPanel-KQx9ts0D.cjs → TemplateReviewPanel-C2YjiaEC.cjs} +1 -1
  23. package/dist/{TemplateReviewPanel-vqFJ_Y9o.js → TemplateReviewPanel-C9cTvsRs.js} +1 -1
  24. package/dist/artifact-integrity.json +92 -94
  25. package/dist/{assets-2eC3mOcV.js → assets-CxHunY_9.js} +2 -2
  26. package/dist/{assets-B0Hxn4l6.cjs → assets-vbjAGgk8.cjs} +1 -1
  27. package/dist/{auto-BlchZ1b8.js → auto-BkdGiNtr.js} +4 -4
  28. package/dist/{auto-B0EZFIK1.cjs → auto-Tq7ReIC1.cjs} +1 -1
  29. package/dist/{component-tree-CvW4lzpv.js → component-tree-1_QCiQJX.js} +1 -1
  30. package/dist/component-tree-BjZIp6w9.cjs +1 -0
  31. package/dist/{data-bar-PtjXhMgN.js → data-bar-8baGYEZ9.js} +1 -1
  32. package/dist/{data-bar-Ce38juRZ.cjs → data-bar-YltqGTaC.cjs} +1 -1
  33. package/dist/designer-CDqok4S5.cjs +2 -0
  34. package/dist/designer-CIDHt5xz.js +6869 -0
  35. package/dist/designer.cjs +1 -1
  36. package/dist/designer.d.cts +166 -7
  37. package/dist/designer.d.ts +166 -7
  38. package/dist/designer.js +1 -1
  39. package/dist/{encoding-B--eZpp1.cjs → encoding-B79hW4zq.cjs} +1 -1
  40. package/dist/{encoding-mctOLocI.js → encoding-BSeUwrN7.js} +2 -2
  41. package/dist/{font-loader-DBBJ5KE9.cjs → font-loader-BB372_XN.cjs} +1 -1
  42. package/dist/{font-loader-DW8tIaNp.js → font-loader-Di0lQKFf.js} +1 -1
  43. package/dist/grid-geometry-D3SJgWFv.js +136 -0
  44. package/dist/grid-geometry-D8ReblRV.cjs +1 -0
  45. package/dist/index.cjs +6 -6
  46. package/dist/index.js +194 -195
  47. package/dist/json-snapshot-I5VI84Vp.cjs +2 -0
  48. package/dist/{json-snapshot-By4ZVVUt.js → json-snapshot-Kgn459Oj.js} +895 -879
  49. package/dist/{pdf-DqyxJ96U.cjs → pdf-CARdBcuw.cjs} +45 -45
  50. package/dist/{pdf-CKROKygt.js → pdf-DmlnL5eB.js} +13 -14
  51. package/dist/pdf.cjs +1 -1
  52. package/dist/pdf.js +2 -2
  53. package/dist/{plugin-CPyHs4UC.cjs → plugin-BaRUGORD.cjs} +1 -1
  54. package/dist/{plugin-DsXJRR6Q.js → plugin-D4kAxfLG.js} +1 -1
  55. package/dist/{prefill-D7EswyTI.cjs → prefill-Bpyn58AZ.cjs} +1 -1
  56. package/dist/{prefill-B8H9qwE4.js → prefill-CJSazcVY.js} +2 -2
  57. package/dist/{prepared-CGVphji3.cjs → prepared-BiSz_9vN.cjs} +1 -1
  58. package/dist/{prepared-BE-4jfX5.js → prepared-BwjwEzFz.js} +1 -1
  59. package/dist/{protocol-Cr81vFSQ.js → protocol-Bs9-ohHN.js} +3 -3
  60. package/dist/{protocol-ByRVzzQG.cjs → protocol-C8VWF9An.cjs} +1 -1
  61. package/dist/record-bindings-Ct1HkPrc.cjs +1 -0
  62. package/dist/{record-bindings-DEJtmo3p.js → record-bindings-VZGS-Qd8.js} +1 -1
  63. package/dist/{region-binding-workflow-CBg0l_tj.js → region-binding-workflow-Cy4GIOUo.js} +2 -2
  64. package/dist/{region-binding-workflow-D05tOYn3.cjs → region-binding-workflow-JNowHd0A.cjs} +1 -1
  65. package/dist/report-encoding-worker.cjs +1 -1
  66. package/dist/report-encoding-worker.js +1 -1
  67. package/dist/rich-text-layout-K48VHUoW.cjs +3 -0
  68. package/dist/{rich-text-layout-Ct5WrY1g.js → rich-text-layout-wxBhnAS7.js} +1 -1
  69. package/dist/{runtime-CEMvybO7.js → runtime-BDf5x1i1.js} +5 -5
  70. package/dist/runtime-DsJt1PIf.cjs +1 -0
  71. package/dist/sbom.cdx.json +1 -1
  72. package/dist/server-node.cjs +4 -4
  73. package/dist/server-node.js +1272 -1274
  74. package/dist/server.cjs +1 -1
  75. package/dist/server.js +8 -8
  76. package/dist/style.css +1 -1
  77. package/dist/{template-catalog-CmbWOJqy.js → template-catalog-DFwIS9aN.js} +3 -3
  78. package/dist/{template-catalog-Utu4GP09.cjs → template-catalog-D_2jdnkL.cjs} +1 -1
  79. package/dist/template-fragments-DZVUBhuB.cjs +1 -0
  80. package/dist/{template-fragments-DWgo9tlZ.js → template-fragments-Dng-AlHk.js} +11 -11
  81. package/dist/{template-registry-BIhIHOab.js → template-registry-DhBqoD7W.js} +120 -118
  82. package/dist/template-registry-DpLUSLwF.cjs +1 -0
  83. package/dist/{column-visual-BpgQVWwT.js → template-serialization-Cc3h-miv.js} +74 -65
  84. package/dist/{column-visual-CtYxnBCP.cjs → template-serialization-D1R5oAqh.cjs} +1 -1
  85. package/dist/{textwrap-BEIg2w8y.js → textwrap-CkGjRFT3.js} +1 -1
  86. package/dist/textwrap-OTOUMr4f.cjs +4 -0
  87. package/dist/vue/async.d.cts +8 -0
  88. package/dist/vue/async.d.ts +8 -0
  89. package/dist/vue/index.d.cts +10 -2
  90. package/dist/vue/index.d.ts +10 -2
  91. package/dist/vue-async.cjs +1 -1
  92. package/dist/vue-async.js +3 -3
  93. package/dist/vue.cjs +1 -1
  94. package/dist/vue.js +6 -6
  95. package/dist/{workbook-session-B94EwVa_.cjs → workbook-session-NYv01LHe.cjs} +1 -1
  96. package/dist/{workbook-session-BoScoOg-.js → workbook-session-oinxX3qo.js} +2 -2
  97. package/dist/worker.cjs +1 -1
  98. package/dist/worker.js +4 -4
  99. package/dist/xlsx.cjs +4 -4
  100. package/dist/xlsx.js +204 -205
  101. package/package.json +1 -1
  102. package/dist/ExcelBindingWizard-UHSApSG9.cjs +0 -1
  103. package/dist/ParamEditor-BZb-okUd.cjs +0 -1
  104. package/dist/ReportLabelStudio-B4WZ2XNN.js +0 -239
  105. package/dist/ReportLabelStudio-BN-fYNCr.cjs +0 -1
  106. package/dist/ReportParamPanel-sOANVRz-.cjs +0 -1
  107. package/dist/ReportPreview-CuoHl15N.cjs +0 -6
  108. package/dist/RuleEditor-XaLcCdTb.cjs +0 -1
  109. package/dist/component-tree-6TV7W6Yj.cjs +0 -1
  110. package/dist/designer-CyKXBhQg.cjs +0 -2
  111. package/dist/designer-fVvpYg8H.js +0 -5824
  112. package/dist/grid-geometry-BNptEcMm.js +0 -65
  113. package/dist/grid-geometry-CZ_cYB6O.cjs +0 -1
  114. package/dist/json-snapshot-jiXff4lc.cjs +0 -2
  115. package/dist/record-bindings-ehjnCDHt.cjs +0 -1
  116. package/dist/rich-text-layout-ALlMoYOG.cjs +0 -3
  117. package/dist/runtime-CDA6d263.cjs +0 -1
  118. package/dist/style-67OqfNed.js +0 -73
  119. package/dist/style-C22Pbv3T.cjs +0 -1
  120. package/dist/template-fragments-C_zSHJAa.cjs +0 -1
  121. package/dist/template-registry-DzWswQI5.cjs +0 -1
  122. package/dist/textwrap-BI-yJ6Wt.cjs +0 -4
package/dist/designer.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("vue");const E=require("./designer-CyKXBhQg.cjs");exports.COLUMN_VISUAL_MESSAGES=E.COLUMN_VISUAL_MESSAGES;exports.ChartBindingInspector=E.ChartBindingInspector;exports.ColumnVisualEditor=E.ColumnVisualEditor;exports.DESIGNER_GUIDE_MESSAGES=E.DESIGNER_GUIDE_MESSAGES;exports.EXCEL_BINDING_MESSAGES=E.EXCEL_BINDING_MESSAGES;exports.ExcelBindingWizard=E.ExcelBindingWizard;exports.LABEL_STUDIO_MESSAGES=E.LABEL_STUDIO_MESSAGES;exports.PARAM_EDITOR_MESSAGES=E.PARAM_EDITOR_MESSAGES;exports.ParamEditor=E.ParamEditor;exports.REPORT_BATCH_MESSAGES=E.REPORT_BATCH_MESSAGES;exports.RULE_EDITOR_MESSAGES=E.DEFAULT_RULE_EDITOR_MESSAGES;exports.ReportBatchPanel=E.ReportBatchPanel;exports.ReportLabelStudio=E.ReportLabelStudio;exports.ReportTemplateEditor=E.ReportTemplateEditor;exports.ReportTemplateLibrary=E.ReportTemplateLibrary;exports.RuleEditor=E.RuleEditor;exports.TEMPLATE_EDITOR_MESSAGES=E.TEMPLATE_EDITOR_MESSAGES;exports.TEMPLATE_LIBRARY_MESSAGES=E.TEMPLATE_LIBRARY_MESSAGES;exports.TEMPLATE_PRODUCT_MESSAGES=E.TEMPLATE_PRODUCT_MESSAGES;exports.TEMPLATE_RECOVERY_MESSAGES=E.TEMPLATE_RECOVERY_MESSAGES;exports.TEMPLATE_REVIEW_MESSAGES=E.TEMPLATE_REVIEW_MESSAGES;exports.TemplateOutlinePanel=E.TemplateOutlinePanel;exports.TemplateReusePanel=E.TemplateReusePanel;exports.TemplateReviewPanel=E.TemplateReviewPanel;exports.createTemplateDraftStorage=E.createTemplateDraftStorage;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("vue");const E=require("./designer-CDqok4S5.cjs");exports.COLUMN_VISUAL_MESSAGES=E.COLUMN_VISUAL_MESSAGES;exports.ChartBindingInspector=E.ChartBindingInspector;exports.ColumnVisualEditor=E.ColumnVisualEditor;exports.DESIGNER_GUIDE_MESSAGES=E.DESIGNER_GUIDE_MESSAGES;exports.EXCEL_BINDING_MESSAGES=E.EXCEL_BINDING_MESSAGES;exports.ExcelBindingWizard=E.ExcelBindingWizard;exports.LABEL_STUDIO_MESSAGES=E.LABEL_STUDIO_MESSAGES;exports.PARAM_EDITOR_MESSAGES=E.PARAM_EDITOR_MESSAGES;exports.ParamEditor=E.ParamEditor;exports.REPORT_BATCH_MESSAGES=E.REPORT_BATCH_MESSAGES;exports.RULE_EDITOR_MESSAGES=E.DEFAULT_RULE_EDITOR_MESSAGES;exports.ReportBatchPanel=E.ReportBatchPanel;exports.ReportLabelStudio=E.ReportLabelStudio;exports.ReportTemplateEditor=E.ReportTemplateEditor;exports.ReportTemplateLibrary=E.ReportTemplateLibrary;exports.RuleEditor=E.RuleEditor;exports.TEMPLATE_EDITOR_MESSAGES=E.TEMPLATE_EDITOR_MESSAGES;exports.TEMPLATE_LIBRARY_MESSAGES=E.TEMPLATE_LIBRARY_MESSAGES;exports.TEMPLATE_PRODUCT_MESSAGES=E.TEMPLATE_PRODUCT_MESSAGES;exports.TEMPLATE_RECOVERY_MESSAGES=E.TEMPLATE_RECOVERY_MESSAGES;exports.TEMPLATE_REVIEW_MESSAGES=E.TEMPLATE_REVIEW_MESSAGES;exports.TemplateOutlinePanel=E.TemplateOutlinePanel;exports.TemplateReusePanel=E.TemplateReusePanel;exports.TemplateReviewPanel=E.TemplateReviewPanel;exports.createTemplateDraftStorage=E.createTemplateDraftStorage;
@@ -483,9 +483,54 @@ export declare const DESIGNER_GUIDE_MESSAGES: {
483
483
  readonly reviewHint: "校验字段依赖、样例结果与输出限制";
484
484
  readonly result: "预览确认效果后保存模板;高级 JSON 保留给需要时使用。";
485
485
  };
486
+ declare const DESIGNER_INSERT_MESSAGES: {
487
+ readonly add: "添加内容";
488
+ readonly title: "添加到当前版面";
489
+ readonly text: "说明文字";
490
+ readonly textHint: "添加标题、备注或说明";
491
+ readonly field: "业务字段";
492
+ readonly columnField: "添加表格字段";
493
+ readonly fieldHint: "选择字段后立即显示真实内容";
494
+ readonly image: "图片或 Logo";
495
+ readonly imageHint: "使用 PNG 或 JPEG 图片";
496
+ readonly qrcode: "二维码";
497
+ readonly barcode: "条形码";
498
+ readonly codeHint: "绑定记录编号或填写编码内容";
499
+ readonly list: "明细表";
500
+ readonly listHint: "从当前字段契约建立表格";
501
+ readonly chart: "图表";
502
+ readonly recordCount: "记录数";
503
+ readonly chartHint: "选择分类与数值字段";
504
+ readonly rect: "装饰色块";
505
+ readonly rectHint: "辅助分区与突出信息";
506
+ readonly search: "搜索业务字段";
507
+ readonly noFields: "没有匹配的字段";
508
+ readonly close: "关闭添加内容";
509
+ readonly back: "返回内容类型";
510
+ readonly duplicate: "复制组件";
511
+ readonly newPage: "当前版面空间不足或含动态明细,内容已放到新增版面,可撤销恢复。";
512
+ readonly newPageTitle: "需要新增一个版面";
513
+ readonly newPageDescription: "当前版面没有足够空间,将新增同规格的 {width} × {height} mm 版面放置内容。";
514
+ readonly reportPageImpact: "模板版面 {before} → {after}。最终输出页数由明细分页决定。";
515
+ readonly labelPageImpact: "每份标签 {before} → {after} 个版面。每条记录的输出都会增加一个版面。";
516
+ readonly labelCountImpact: "按当前设计样本,标签数 {before} → {after} 张。";
517
+ readonly newPageConfirm: "新增版面并添加";
518
+ readonly newPageCancel: "取消添加";
519
+ readonly newPagePending: "请先确认或取消新增版面,再预览或保存。";
520
+ readonly contentTooLarge: "内容尺寸大于当前纸张的可用区域,请先调整纸张或内容尺寸。内容没有被缩小或添加。";
521
+ readonly addColumn: "添加字段列";
522
+ readonly removeColumn: "删除当前列";
523
+ readonly removeLast: "至少保留一列";
524
+ readonly dependentColumn: "此字段仍被合计、规则或表头引用,请先调整相关配置。";
525
+ readonly assetPending: "请完成图片或编码内容配置,再预览或保存。";
526
+ readonly fieldsUnavailable: "当前模板尚无可绑定的数据字段。";
527
+ };
486
528
  export declare type DesignerGuideMessages = {
487
529
  [K in keyof typeof DESIGNER_GUIDE_MESSAGES]: string;
488
530
  };
531
+ export declare type DesignerInsertMessages = {
532
+ [K in keyof typeof DESIGNER_INSERT_MESSAGES]: string;
533
+ };
489
534
  /** Optional wizard labels remain independent of the general designer configuration. */
490
535
  export declare const EXCEL_BINDING_MESSAGES: {
491
536
  recoveredMapping: string;
@@ -934,30 +979,81 @@ export declare const LABEL_STUDIO_MESSAGES: {
934
979
  readonly faces: "个版面";
935
980
  readonly labels: "张标签";
936
981
  readonly session: "当前会话模板";
937
- readonly flow: "选择记录 → 设计标签 → 预览并打印";
982
+ readonly flow: "成品预览 · 按记录生成";
983
+ readonly designHint: "设计使用前 3 条样本 · 完整记录用于预览和打印";
938
984
  readonly guide: "使用指引";
939
- readonly help: "在画布点选文字或码图,再设置绑定字段;在“模板”中调整纸张与份数。";
985
+ readonly help: "先选成品样式与显示字段即可使用。需要追加内容或自由排版时,进入设计标签。";
940
986
  readonly size: "纸张与份数";
941
987
  readonly bindings: "字段与码图";
942
988
  readonly count: "条记录";
943
989
  readonly invalidCopies: "份数待校验";
944
990
  readonly sheet: "A4 标签拼版";
945
- readonly sheetHint: "2 列 × 4 行,保持原尺寸";
991
+ readonly sheetHint: "{columns} 列 × {rows} 行 · 每页 {capacity} 张,保持原尺寸";
992
+ readonly sheetUnavailable: "当前版面尺寸不适合 A4 拼版,请统一版面尺寸或使用原尺寸打印。";
946
993
  readonly printHint: "先试打一张,使用同规格纸张与 100% 比例核对尺寸和扫码。";
947
994
  readonly empty: "暂无可打印记录";
948
995
  readonly save: "保存标签模板";
996
+ readonly layout: "成品样式";
997
+ readonly materialPreset: "物料卡";
998
+ readonly pairedPreset: "双版标识";
999
+ readonly warehousePreset: "仓储标签";
1000
+ readonly fields: "显示字段";
1001
+ readonly findField: "查找业务字段";
1002
+ readonly noFields: "没有匹配的字段";
1003
+ readonly fieldLimit: "最多显示 5 个字段,取消已选项后可继续选择。";
1004
+ readonly removeField: "取消字段";
1005
+ readonly fieldSearchHint: "每次显示前 30 项,可搜索完整字段目录。";
1006
+ readonly brand: "标题与品牌";
1007
+ readonly brandName: "主标题";
1008
+ readonly brandTagline: "副标题(可选)";
1009
+ readonly applyLayout: "应用新样式";
1010
+ readonly applyContent: "更新内容";
1011
+ readonly contentHint: "标题与字段原位更新,保留手工排版和追加内容。";
1012
+ readonly contentNeedsDesign: "新增内容与现有设计重叠或缺少可识别位置,请还原轻配置后进入设计调整,或确认重建样式。";
1013
+ readonly rebuildCurrent: "重新套用所选样式";
1014
+ readonly applyLayoutFirst: "样式尚未应用,请先确认重建或还原轻配置后继续。";
1015
+ readonly rebuildTitle: "确认重建标签布局";
1016
+ readonly rebuildDescription: "将替换当前全部版面和手工调整,保留打印份数。进入设计后可撤销本次重建。";
1017
+ readonly cancelRebuild: "继续调整";
1018
+ readonly confirmRebuild: "确认重建";
1019
+ readonly invalidSavedTemplate: "保存服务返回的模板标识不一致,请重试。";
1020
+ readonly designLoading: "正在加载标签设计器…";
1021
+ readonly designLoadFailed: "标签设计器加载失败,请重试。";
1022
+ readonly restoreConfiguration: "还原轻配置";
1023
+ readonly choosePreset: "请选择成品样式后更新标签,或还原轻配置继续使用当前模板。";
1024
+ readonly discardTitle: "保留标签修改";
1025
+ readonly discardDescription: "标签设计或轻配置存在未保存的修改,继续将丢弃这些修改。";
1026
+ readonly keepEditing: "继续编辑";
1027
+ readonly discard: "丢弃并继续";
1028
+ readonly reflowHint: "按所选样式重新排版,可在设计中撤销恢复。";
1029
+ readonly customTemplate: "自定义模板";
1030
+ readonly readyTemplate: "成品模板 · 可直接打印";
949
1031
  };
950
1032
  /** Named business row interfaces and readonly arrays need no index signature or conversion. */
951
1033
  declare type LabelReportRows = readonly object[];
1034
+ export declare interface LabelStudioBrand {
1035
+ name?: string;
1036
+ tagline?: string;
1037
+ /** Portable image data shared by preview, PDF and image output. */
1038
+ logoData?: string;
1039
+ }
952
1040
  export declare interface LabelStudioController {
953
1041
  readonly busy?: boolean;
1042
+ readonly pendingLocalChanges?: boolean;
954
1043
  guardChanges(): Promise<boolean>;
955
1044
  prepare(): Promise<ReportTemplateDocument | undefined>;
956
1045
  }
1046
+ export declare interface LabelStudioLayout {
1047
+ preset?: LabelStudioPreset;
1048
+ brand?: LabelStudioBrand;
1049
+ fields?: readonly string[];
1050
+ }
957
1051
  export declare type LabelStudioMessages = {
958
1052
  [K in keyof typeof LABEL_STUDIO_MESSAGES]: string;
959
1053
  };
960
- export declare interface LabelStudioOptions {
1054
+ export declare interface LabelStudioOptions extends LabelStudioLayout {
1055
+ /** A host-owned completion action may replace the inner draft-save button. */
1056
+ showSave?: boolean;
961
1057
  rows: LabelReportRows;
962
1058
  schema: DatasetContract;
963
1059
  title?: string;
@@ -968,6 +1064,7 @@ export declare interface LabelStudioOptions {
968
1064
  beforeDiscard?: TemplateEditorOptions["beforeDiscard"];
969
1065
  messages?: Partial<LabelStudioMessages>;
970
1066
  }
1067
+ export declare type LabelStudioPreset = "material" | "paired" | "warehouse";
971
1068
  /** auto:真实数字/显式数值格式居右,日期与布尔居中,其他内容居左。 */
972
1069
  declare type ListAlignment = NonNullable<ComponentStyle["align"]> | "auto";
973
1070
  /** auto:真实数字/显式数值格式居右,日期与布尔居中,其他内容居左。 */
@@ -2534,6 +2631,14 @@ declare interface ReportCalculationMessages {
2534
2631
  calculationErrorDivision: string;
2535
2632
  calculationErrorOverflow: string;
2536
2633
  calculationErrorPrecision: string;
2634
+ calculationSummary?: string;
2635
+ calculationAdvanced?: string;
2636
+ calculationClose?: string;
2637
+ calculationPending?: string;
2638
+ calculationSummarySum?: string;
2639
+ calculationSummaryAverage?: string;
2640
+ calculationSummaryCount?: string;
2641
+ calculationMixedColumns?: string;
2537
2642
  }
2538
2643
  declare interface ReportCalculationMessages_2 {
2539
2644
  calculationTitle: string;
@@ -2563,6 +2668,14 @@ declare interface ReportCalculationMessages_2 {
2563
2668
  calculationErrorDivision: string;
2564
2669
  calculationErrorOverflow: string;
2565
2670
  calculationErrorPrecision: string;
2671
+ calculationSummary?: string;
2672
+ calculationAdvanced?: string;
2673
+ calculationClose?: string;
2674
+ calculationPending?: string;
2675
+ calculationSummarySum?: string;
2676
+ calculationSummaryAverage?: string;
2677
+ calculationSummaryCount?: string;
2678
+ calculationMixedColumns?: string;
2566
2679
  }
2567
2680
  declare interface ReportCandidateValidationOptions extends Pick<ReportDatasetValidationOptions, "rules" | "maxChecks" | "maxIssues"> {
2568
2681
  /** Warnings are visible and allowed by default; block explicitly when required by business policy. */
@@ -3193,11 +3306,14 @@ export declare const ReportLabelStudio: DefineComponent<LabelStudioOptions, {
3193
3306
  guardChanges: () => Promise<boolean>;
3194
3307
  prepare: () => Promise<ReportTemplateDocument_3 | undefined>;
3195
3308
  busy: boolean;
3309
+ pendingLocalChanges: boolean;
3196
3310
  }, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {} & {
3197
3311
  "update:modelValue": (document: ReportTemplateDocument_3) => any;
3198
3312
  }, string, MachReportVuePublicProps, Readonly<LabelStudioOptions> & Readonly<{
3199
3313
  "onUpdate:modelValue"?: ((document: ReportTemplateDocument_3) => any) | undefined;
3200
- }>, {}>;
3314
+ }>, {
3315
+ showSave: boolean;
3316
+ }>;
3201
3317
  declare interface ReportOutputOptions {
3202
3318
  /** warn preserves supported output and shows diagnostics; strict rejects known fidelity loss. */
3203
3319
  fidelity?: "warn" | "strict";
@@ -3562,25 +3678,33 @@ declare interface ReportTemplateDocument_3 {
3562
3678
  }
3563
3679
  export declare const ReportTemplateEditor: DefineComponent<TemplateEditorOptions, {
3564
3680
  openPanel: typeof openPanel;
3681
+ applyTemplate: (template: ReportTemplate) => boolean;
3682
+ undo: () => void;
3683
+ redo: () => void;
3684
+ canUndo: boolean;
3685
+ canRedo: boolean;
3565
3686
  canApply: boolean;
3566
3687
  saveReason: string;
3567
3688
  pendingLocalChanges: boolean;
3568
3689
  saving: boolean;
3569
3690
  blocked: boolean;
3570
- guardChanges: (reason?: TemplateEditorBeforeDiscardContext["reason"], replacement?: ReportTemplateDocument) => Promise<boolean>;
3691
+ guardChanges: (reason?: "reset" | "replace" | undefined, replacement?: ReportTemplateDocument | undefined) => Promise<boolean>;
3571
3692
  reset: () => Promise<void>;
3572
- save: () => Promise<void>;
3693
+ save: typeof saveDocument;
3573
3694
  insertComponent: (component: TemplateComponent) => boolean;
3574
3695
  }, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {} & {
3575
3696
  "update:modelValue": (document: ReportTemplateDocument) => any;
3576
3697
  saved: (document: ReportTemplateDocument) => any;
3577
3698
  "excel-bound": (result: ExcelBindingWizardApply) => any;
3699
+ "update:mode": (mode: "preview" | "design") => any;
3578
3700
  }, string, MachReportVuePublicProps, Readonly<TemplateEditorOptions> & Readonly<{
3579
3701
  "onUpdate:modelValue"?: ((document: ReportTemplateDocument) => any) | undefined;
3580
3702
  onSaved?: ((document: ReportTemplateDocument) => any) | undefined;
3581
3703
  "onExcel-bound"?: ((result: ExcelBindingWizardApply) => any) | undefined;
3704
+ "onUpdate:mode"?: ((mode: "preview" | "design") => any) | undefined;
3582
3705
  }>, {
3583
3706
  showSave: boolean;
3707
+ showModeSwitch: boolean;
3584
3708
  }>;
3585
3709
  declare interface ReportTemplateFixture {
3586
3710
  name: string;
@@ -3909,6 +4033,7 @@ export declare interface RuleEditorOptions {
3909
4033
  readonly?: boolean;
3910
4034
  messages?: Partial<RuleEditorMessages>;
3911
4035
  }
4036
+ declare function saveDocument(): Promise<void>;
3912
4037
  /** 条件格式规则求值(声明式,见 ListColumn.rules) */
3913
4038
  declare interface StyleRule {
3914
4039
  when: ReportPredicate;
@@ -4445,6 +4570,11 @@ export declare interface TemplateEditorController {
4445
4570
  openPanel?(target: TemplateEditorPanel): void;
4446
4571
  /** Insert a native/registered component through validation, geometry constraints and undo history. */
4447
4572
  insertComponent(component: TemplateComponent): boolean;
4573
+ applyTemplate?(template: ReportTemplate): boolean;
4574
+ undo?(): void;
4575
+ redo?(): void;
4576
+ readonly canUndo?: boolean;
4577
+ readonly canRedo?: boolean;
4448
4578
  readonly canApply?: boolean;
4449
4579
  readonly saveReason?: string;
4450
4580
  readonly pendingLocalChanges: boolean;
@@ -4459,6 +4589,11 @@ export declare type TemplateEditorMessages = typeof BASE_TEMPLATE_EDITOR_MESSAGE
4459
4589
  export declare interface TemplateEditorOptions extends TemplateEditorConflictOptions {
4460
4590
  /** Hide the duplicate save action when the host already provides an apply/save footer. */
4461
4591
  showSave?: boolean;
4592
+ /** Host-controlled view for an editor embedded inside a studio. */
4593
+ mode?: "design" | "preview";
4594
+ showModeSwitch?: boolean;
4595
+ capabilities?: Partial<Record<"params" | "excel" | "rules" | "review" | "advanced" | "outline" | "reuse", boolean>>;
4596
+ insertionMessages?: Partial<DesignerInsertMessages>;
4462
4597
  guideMessages?: Partial<DesignerGuideMessages>;
4463
4598
  /** Opt-in declaration-only recovery. Scope should include project and account identity. */
4464
4599
  draftStorage?: TemplateDraftStorage;
@@ -4604,6 +4739,30 @@ export declare interface TemplateToolDraft {
4604
4739
  baseline: string;
4605
4740
  value: string;
4606
4741
  }
4742
+ export declare type TemplateTotalsMessages = typeof TOTALS_MESSAGES;
4743
+ declare const TOTALS_MESSAGES: {
4744
+ title: string;
4745
+ field: string;
4746
+ operation: string;
4747
+ position: string;
4748
+ tableEnd: string;
4749
+ groupEnd: string;
4750
+ add: string;
4751
+ remove: string;
4752
+ sum: string;
4753
+ avg: string;
4754
+ count: string;
4755
+ noFields: string;
4756
+ scope: string;
4757
+ groupScope: string;
4758
+ saved: string;
4759
+ empty: string;
4760
+ advanced: string;
4761
+ complex: string;
4762
+ unconfigured: string;
4763
+ configured: string;
4764
+ update: string;
4765
+ };
4607
4766
  /** A serialized tree contract. Sibling and root order follow input order. */
4608
4767
  declare interface TreeTableOptions {
4609
4768
  input: "flat" | "nested";
@@ -483,9 +483,54 @@ export declare const DESIGNER_GUIDE_MESSAGES: {
483
483
  readonly reviewHint: "校验字段依赖、样例结果与输出限制";
484
484
  readonly result: "预览确认效果后保存模板;高级 JSON 保留给需要时使用。";
485
485
  };
486
+ declare const DESIGNER_INSERT_MESSAGES: {
487
+ readonly add: "添加内容";
488
+ readonly title: "添加到当前版面";
489
+ readonly text: "说明文字";
490
+ readonly textHint: "添加标题、备注或说明";
491
+ readonly field: "业务字段";
492
+ readonly columnField: "添加表格字段";
493
+ readonly fieldHint: "选择字段后立即显示真实内容";
494
+ readonly image: "图片或 Logo";
495
+ readonly imageHint: "使用 PNG 或 JPEG 图片";
496
+ readonly qrcode: "二维码";
497
+ readonly barcode: "条形码";
498
+ readonly codeHint: "绑定记录编号或填写编码内容";
499
+ readonly list: "明细表";
500
+ readonly listHint: "从当前字段契约建立表格";
501
+ readonly chart: "图表";
502
+ readonly recordCount: "记录数";
503
+ readonly chartHint: "选择分类与数值字段";
504
+ readonly rect: "装饰色块";
505
+ readonly rectHint: "辅助分区与突出信息";
506
+ readonly search: "搜索业务字段";
507
+ readonly noFields: "没有匹配的字段";
508
+ readonly close: "关闭添加内容";
509
+ readonly back: "返回内容类型";
510
+ readonly duplicate: "复制组件";
511
+ readonly newPage: "当前版面空间不足或含动态明细,内容已放到新增版面,可撤销恢复。";
512
+ readonly newPageTitle: "需要新增一个版面";
513
+ readonly newPageDescription: "当前版面没有足够空间,将新增同规格的 {width} × {height} mm 版面放置内容。";
514
+ readonly reportPageImpact: "模板版面 {before} → {after}。最终输出页数由明细分页决定。";
515
+ readonly labelPageImpact: "每份标签 {before} → {after} 个版面。每条记录的输出都会增加一个版面。";
516
+ readonly labelCountImpact: "按当前设计样本,标签数 {before} → {after} 张。";
517
+ readonly newPageConfirm: "新增版面并添加";
518
+ readonly newPageCancel: "取消添加";
519
+ readonly newPagePending: "请先确认或取消新增版面,再预览或保存。";
520
+ readonly contentTooLarge: "内容尺寸大于当前纸张的可用区域,请先调整纸张或内容尺寸。内容没有被缩小或添加。";
521
+ readonly addColumn: "添加字段列";
522
+ readonly removeColumn: "删除当前列";
523
+ readonly removeLast: "至少保留一列";
524
+ readonly dependentColumn: "此字段仍被合计、规则或表头引用,请先调整相关配置。";
525
+ readonly assetPending: "请完成图片或编码内容配置,再预览或保存。";
526
+ readonly fieldsUnavailable: "当前模板尚无可绑定的数据字段。";
527
+ };
486
528
  export declare type DesignerGuideMessages = {
487
529
  [K in keyof typeof DESIGNER_GUIDE_MESSAGES]: string;
488
530
  };
531
+ export declare type DesignerInsertMessages = {
532
+ [K in keyof typeof DESIGNER_INSERT_MESSAGES]: string;
533
+ };
489
534
  /** Optional wizard labels remain independent of the general designer configuration. */
490
535
  export declare const EXCEL_BINDING_MESSAGES: {
491
536
  recoveredMapping: string;
@@ -934,30 +979,81 @@ export declare const LABEL_STUDIO_MESSAGES: {
934
979
  readonly faces: "个版面";
935
980
  readonly labels: "张标签";
936
981
  readonly session: "当前会话模板";
937
- readonly flow: "选择记录 → 设计标签 → 预览并打印";
982
+ readonly flow: "成品预览 · 按记录生成";
983
+ readonly designHint: "设计使用前 3 条样本 · 完整记录用于预览和打印";
938
984
  readonly guide: "使用指引";
939
- readonly help: "在画布点选文字或码图,再设置绑定字段;在“模板”中调整纸张与份数。";
985
+ readonly help: "先选成品样式与显示字段即可使用。需要追加内容或自由排版时,进入设计标签。";
940
986
  readonly size: "纸张与份数";
941
987
  readonly bindings: "字段与码图";
942
988
  readonly count: "条记录";
943
989
  readonly invalidCopies: "份数待校验";
944
990
  readonly sheet: "A4 标签拼版";
945
- readonly sheetHint: "2 列 × 4 行,保持原尺寸";
991
+ readonly sheetHint: "{columns} 列 × {rows} 行 · 每页 {capacity} 张,保持原尺寸";
992
+ readonly sheetUnavailable: "当前版面尺寸不适合 A4 拼版,请统一版面尺寸或使用原尺寸打印。";
946
993
  readonly printHint: "先试打一张,使用同规格纸张与 100% 比例核对尺寸和扫码。";
947
994
  readonly empty: "暂无可打印记录";
948
995
  readonly save: "保存标签模板";
996
+ readonly layout: "成品样式";
997
+ readonly materialPreset: "物料卡";
998
+ readonly pairedPreset: "双版标识";
999
+ readonly warehousePreset: "仓储标签";
1000
+ readonly fields: "显示字段";
1001
+ readonly findField: "查找业务字段";
1002
+ readonly noFields: "没有匹配的字段";
1003
+ readonly fieldLimit: "最多显示 5 个字段,取消已选项后可继续选择。";
1004
+ readonly removeField: "取消字段";
1005
+ readonly fieldSearchHint: "每次显示前 30 项,可搜索完整字段目录。";
1006
+ readonly brand: "标题与品牌";
1007
+ readonly brandName: "主标题";
1008
+ readonly brandTagline: "副标题(可选)";
1009
+ readonly applyLayout: "应用新样式";
1010
+ readonly applyContent: "更新内容";
1011
+ readonly contentHint: "标题与字段原位更新,保留手工排版和追加内容。";
1012
+ readonly contentNeedsDesign: "新增内容与现有设计重叠或缺少可识别位置,请还原轻配置后进入设计调整,或确认重建样式。";
1013
+ readonly rebuildCurrent: "重新套用所选样式";
1014
+ readonly applyLayoutFirst: "样式尚未应用,请先确认重建或还原轻配置后继续。";
1015
+ readonly rebuildTitle: "确认重建标签布局";
1016
+ readonly rebuildDescription: "将替换当前全部版面和手工调整,保留打印份数。进入设计后可撤销本次重建。";
1017
+ readonly cancelRebuild: "继续调整";
1018
+ readonly confirmRebuild: "确认重建";
1019
+ readonly invalidSavedTemplate: "保存服务返回的模板标识不一致,请重试。";
1020
+ readonly designLoading: "正在加载标签设计器…";
1021
+ readonly designLoadFailed: "标签设计器加载失败,请重试。";
1022
+ readonly restoreConfiguration: "还原轻配置";
1023
+ readonly choosePreset: "请选择成品样式后更新标签,或还原轻配置继续使用当前模板。";
1024
+ readonly discardTitle: "保留标签修改";
1025
+ readonly discardDescription: "标签设计或轻配置存在未保存的修改,继续将丢弃这些修改。";
1026
+ readonly keepEditing: "继续编辑";
1027
+ readonly discard: "丢弃并继续";
1028
+ readonly reflowHint: "按所选样式重新排版,可在设计中撤销恢复。";
1029
+ readonly customTemplate: "自定义模板";
1030
+ readonly readyTemplate: "成品模板 · 可直接打印";
949
1031
  };
950
1032
  /** Named business row interfaces and readonly arrays need no index signature or conversion. */
951
1033
  declare type LabelReportRows = readonly object[];
1034
+ export declare interface LabelStudioBrand {
1035
+ name?: string;
1036
+ tagline?: string;
1037
+ /** Portable image data shared by preview, PDF and image output. */
1038
+ logoData?: string;
1039
+ }
952
1040
  export declare interface LabelStudioController {
953
1041
  readonly busy?: boolean;
1042
+ readonly pendingLocalChanges?: boolean;
954
1043
  guardChanges(): Promise<boolean>;
955
1044
  prepare(): Promise<ReportTemplateDocument | undefined>;
956
1045
  }
1046
+ export declare interface LabelStudioLayout {
1047
+ preset?: LabelStudioPreset;
1048
+ brand?: LabelStudioBrand;
1049
+ fields?: readonly string[];
1050
+ }
957
1051
  export declare type LabelStudioMessages = {
958
1052
  [K in keyof typeof LABEL_STUDIO_MESSAGES]: string;
959
1053
  };
960
- export declare interface LabelStudioOptions {
1054
+ export declare interface LabelStudioOptions extends LabelStudioLayout {
1055
+ /** A host-owned completion action may replace the inner draft-save button. */
1056
+ showSave?: boolean;
961
1057
  rows: LabelReportRows;
962
1058
  schema: DatasetContract;
963
1059
  title?: string;
@@ -968,6 +1064,7 @@ export declare interface LabelStudioOptions {
968
1064
  beforeDiscard?: TemplateEditorOptions["beforeDiscard"];
969
1065
  messages?: Partial<LabelStudioMessages>;
970
1066
  }
1067
+ export declare type LabelStudioPreset = "material" | "paired" | "warehouse";
971
1068
  /** auto:真实数字/显式数值格式居右,日期与布尔居中,其他内容居左。 */
972
1069
  declare type ListAlignment = NonNullable<ComponentStyle["align"]> | "auto";
973
1070
  /** auto:真实数字/显式数值格式居右,日期与布尔居中,其他内容居左。 */
@@ -2534,6 +2631,14 @@ declare interface ReportCalculationMessages {
2534
2631
  calculationErrorDivision: string;
2535
2632
  calculationErrorOverflow: string;
2536
2633
  calculationErrorPrecision: string;
2634
+ calculationSummary?: string;
2635
+ calculationAdvanced?: string;
2636
+ calculationClose?: string;
2637
+ calculationPending?: string;
2638
+ calculationSummarySum?: string;
2639
+ calculationSummaryAverage?: string;
2640
+ calculationSummaryCount?: string;
2641
+ calculationMixedColumns?: string;
2537
2642
  }
2538
2643
  declare interface ReportCalculationMessages_2 {
2539
2644
  calculationTitle: string;
@@ -2563,6 +2668,14 @@ declare interface ReportCalculationMessages_2 {
2563
2668
  calculationErrorDivision: string;
2564
2669
  calculationErrorOverflow: string;
2565
2670
  calculationErrorPrecision: string;
2671
+ calculationSummary?: string;
2672
+ calculationAdvanced?: string;
2673
+ calculationClose?: string;
2674
+ calculationPending?: string;
2675
+ calculationSummarySum?: string;
2676
+ calculationSummaryAverage?: string;
2677
+ calculationSummaryCount?: string;
2678
+ calculationMixedColumns?: string;
2566
2679
  }
2567
2680
  declare interface ReportCandidateValidationOptions extends Pick<ReportDatasetValidationOptions, "rules" | "maxChecks" | "maxIssues"> {
2568
2681
  /** Warnings are visible and allowed by default; block explicitly when required by business policy. */
@@ -3193,11 +3306,14 @@ export declare const ReportLabelStudio: DefineComponent<LabelStudioOptions, {
3193
3306
  guardChanges: () => Promise<boolean>;
3194
3307
  prepare: () => Promise<ReportTemplateDocument_3 | undefined>;
3195
3308
  busy: boolean;
3309
+ pendingLocalChanges: boolean;
3196
3310
  }, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {} & {
3197
3311
  "update:modelValue": (document: ReportTemplateDocument_3) => any;
3198
3312
  }, string, MachReportVuePublicProps, Readonly<LabelStudioOptions> & Readonly<{
3199
3313
  "onUpdate:modelValue"?: ((document: ReportTemplateDocument_3) => any) | undefined;
3200
- }>, {}>;
3314
+ }>, {
3315
+ showSave: boolean;
3316
+ }>;
3201
3317
  declare interface ReportOutputOptions {
3202
3318
  /** warn preserves supported output and shows diagnostics; strict rejects known fidelity loss. */
3203
3319
  fidelity?: "warn" | "strict";
@@ -3562,25 +3678,33 @@ declare interface ReportTemplateDocument_3 {
3562
3678
  }
3563
3679
  export declare const ReportTemplateEditor: DefineComponent<TemplateEditorOptions, {
3564
3680
  openPanel: typeof openPanel;
3681
+ applyTemplate: (template: ReportTemplate) => boolean;
3682
+ undo: () => void;
3683
+ redo: () => void;
3684
+ canUndo: boolean;
3685
+ canRedo: boolean;
3565
3686
  canApply: boolean;
3566
3687
  saveReason: string;
3567
3688
  pendingLocalChanges: boolean;
3568
3689
  saving: boolean;
3569
3690
  blocked: boolean;
3570
- guardChanges: (reason?: TemplateEditorBeforeDiscardContext["reason"], replacement?: ReportTemplateDocument) => Promise<boolean>;
3691
+ guardChanges: (reason?: "reset" | "replace" | undefined, replacement?: ReportTemplateDocument | undefined) => Promise<boolean>;
3571
3692
  reset: () => Promise<void>;
3572
- save: () => Promise<void>;
3693
+ save: typeof saveDocument;
3573
3694
  insertComponent: (component: TemplateComponent) => boolean;
3574
3695
  }, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {} & {
3575
3696
  "update:modelValue": (document: ReportTemplateDocument) => any;
3576
3697
  saved: (document: ReportTemplateDocument) => any;
3577
3698
  "excel-bound": (result: ExcelBindingWizardApply) => any;
3699
+ "update:mode": (mode: "preview" | "design") => any;
3578
3700
  }, string, MachReportVuePublicProps, Readonly<TemplateEditorOptions> & Readonly<{
3579
3701
  "onUpdate:modelValue"?: ((document: ReportTemplateDocument) => any) | undefined;
3580
3702
  onSaved?: ((document: ReportTemplateDocument) => any) | undefined;
3581
3703
  "onExcel-bound"?: ((result: ExcelBindingWizardApply) => any) | undefined;
3704
+ "onUpdate:mode"?: ((mode: "preview" | "design") => any) | undefined;
3582
3705
  }>, {
3583
3706
  showSave: boolean;
3707
+ showModeSwitch: boolean;
3584
3708
  }>;
3585
3709
  declare interface ReportTemplateFixture {
3586
3710
  name: string;
@@ -3909,6 +4033,7 @@ export declare interface RuleEditorOptions {
3909
4033
  readonly?: boolean;
3910
4034
  messages?: Partial<RuleEditorMessages>;
3911
4035
  }
4036
+ declare function saveDocument(): Promise<void>;
3912
4037
  /** 条件格式规则求值(声明式,见 ListColumn.rules) */
3913
4038
  declare interface StyleRule {
3914
4039
  when: ReportPredicate;
@@ -4445,6 +4570,11 @@ export declare interface TemplateEditorController {
4445
4570
  openPanel?(target: TemplateEditorPanel): void;
4446
4571
  /** Insert a native/registered component through validation, geometry constraints and undo history. */
4447
4572
  insertComponent(component: TemplateComponent): boolean;
4573
+ applyTemplate?(template: ReportTemplate): boolean;
4574
+ undo?(): void;
4575
+ redo?(): void;
4576
+ readonly canUndo?: boolean;
4577
+ readonly canRedo?: boolean;
4448
4578
  readonly canApply?: boolean;
4449
4579
  readonly saveReason?: string;
4450
4580
  readonly pendingLocalChanges: boolean;
@@ -4459,6 +4589,11 @@ export declare type TemplateEditorMessages = typeof BASE_TEMPLATE_EDITOR_MESSAGE
4459
4589
  export declare interface TemplateEditorOptions extends TemplateEditorConflictOptions {
4460
4590
  /** Hide the duplicate save action when the host already provides an apply/save footer. */
4461
4591
  showSave?: boolean;
4592
+ /** Host-controlled view for an editor embedded inside a studio. */
4593
+ mode?: "design" | "preview";
4594
+ showModeSwitch?: boolean;
4595
+ capabilities?: Partial<Record<"params" | "excel" | "rules" | "review" | "advanced" | "outline" | "reuse", boolean>>;
4596
+ insertionMessages?: Partial<DesignerInsertMessages>;
4462
4597
  guideMessages?: Partial<DesignerGuideMessages>;
4463
4598
  /** Opt-in declaration-only recovery. Scope should include project and account identity. */
4464
4599
  draftStorage?: TemplateDraftStorage;
@@ -4604,6 +4739,30 @@ export declare interface TemplateToolDraft {
4604
4739
  baseline: string;
4605
4740
  value: string;
4606
4741
  }
4742
+ export declare type TemplateTotalsMessages = typeof TOTALS_MESSAGES;
4743
+ declare const TOTALS_MESSAGES: {
4744
+ title: string;
4745
+ field: string;
4746
+ operation: string;
4747
+ position: string;
4748
+ tableEnd: string;
4749
+ groupEnd: string;
4750
+ add: string;
4751
+ remove: string;
4752
+ sum: string;
4753
+ avg: string;
4754
+ count: string;
4755
+ noFields: string;
4756
+ scope: string;
4757
+ groupScope: string;
4758
+ saved: string;
4759
+ empty: string;
4760
+ advanced: string;
4761
+ complex: string;
4762
+ unconfigured: string;
4763
+ configured: string;
4764
+ update: string;
4765
+ };
4607
4766
  /** A serialized tree contract. Sibling and root order follow input order. */
4608
4767
  declare interface TreeTableOptions {
4609
4768
  input: "flat" | "nested";
package/dist/designer.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import "vue";
2
- import { C as e, d as s, e as t, f as T, E as _, g as A, L as R, P as r, h as M, R as l, D as i, i as o, j as G, c as L, k as p, l as P, m as n, a as I, b as m, n as D, T as d, o as O, p as C, q as B, r as u } from "./designer-fVvpYg8H.js";
2
+ import { C as e, d as s, e as t, f as T, E as _, g as A, L as R, P as r, h as M, R as l, D as i, i as o, j as G, k as L, l as p, m as P, n, a as I, b as m, o as D, T as d, p as O, q as C, r as B, s as u } from "./designer-CIDHt5xz.js";
3
3
  export {
4
4
  e as COLUMN_VISUAL_MESSAGES,
5
5
  s as ChartBindingInspector,
@@ -1 +1 @@
1
- "use strict";const s=require("./runtime-CDA6d263.cjs"),e=require("./protocol-ByRVzzQG.cjs");async function a(r,t){try{if(r.operation!=="exportPrepared")throw new TypeError("内置编码 Worker 仅接受 exportPrepared");return await e.runReportWorkerRequest(s.createReportRuntime({reports:{},budget:r.budget}),r,t)}catch(o){return{protocol:e.REPORT_WORKER_PROTOCOL,id:r.id,error:e.serializeError(o)}}}function R(r=globalThis){const t=o=>{if(!e.isReportWorkerRequest(o.data))return;const i=o.data;a(i,n=>r.postMessage({protocol:e.REPORT_WORKER_PROTOCOL,id:i.id,type:"event",event:n})).then(n=>r.postMessage(n,e.reportWorkerTransferList(n)))};return r.addEventListener("message",t),()=>r.removeEventListener("message",t)}exports.serveReportEncodingWorker=R;
1
+ "use strict";const s=require("./runtime-DsJt1PIf.cjs"),e=require("./protocol-C8VWF9An.cjs");async function a(r,t){try{if(r.operation!=="exportPrepared")throw new TypeError("内置编码 Worker 仅接受 exportPrepared");return await e.runReportWorkerRequest(s.createReportRuntime({reports:{},budget:r.budget}),r,t)}catch(o){return{protocol:e.REPORT_WORKER_PROTOCOL,id:r.id,error:e.serializeError(o)}}}function R(r=globalThis){const t=o=>{if(!e.isReportWorkerRequest(o.data))return;const i=o.data;a(i,n=>r.postMessage({protocol:e.REPORT_WORKER_PROTOCOL,id:i.id,type:"event",event:n})).then(n=>r.postMessage(n,e.reportWorkerTransferList(n)))};return r.addEventListener("message",t),()=>r.removeEventListener("message",t)}exports.serveReportEncodingWorker=R;
@@ -1,5 +1,5 @@
1
- import { c as n } from "./runtime-CEMvybO7.js";
2
- import { i, a as p, r as d, R as a, s as R } from "./protocol-Cr81vFSQ.js";
1
+ import { c as n } from "./runtime-BDf5x1i1.js";
2
+ import { i, a as p, r as d, R as a, s as R } from "./protocol-Bs9-ohHN.js";
3
3
  async function u(r, e) {
4
4
  try {
5
5
  if (r.operation !== "exportPrepared") throw new TypeError("内置编码 Worker 仅接受 exportPrepared");
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=new Map;let b=0,d={maxFonts:8,maxBytes:64*1024*1024,maxFontBytes:24*1024*1024};function O(){for(;f.size>d.maxFonts||b>d.maxBytes;){const t=f.keys().next().value;b-=f.get(t).byteLength,f.delete(t)}}function W(t){const e={...d,...t};if(!Object.values(e).every(n=>Number.isSafeInteger(n)&&n>0))throw new Error("字体缓存预算应为正整数字节/数量");d=e;for(const[n,a]of f)a.byteLength>d.maxFontBytes&&B(n);O()}function p(){return{fonts:f.size,bytes:b,...d}}function j(t){const e=f.get(t);return e&&(f.delete(t),f.set(t,e)),e}function B(t){const e=f.get(t);e&&(b-=e.byteLength),f.delete(t)}function q(){f.clear(),b=0}function H(t,e){B(t),!(e.byteLength>d.maxBytes||e.byteLength>d.maxFontBytes)&&(f.set(t,e),b+=e.byteLength,O())}const V="mach-report-fonts",u="fonts";function $(){return new Promise((t,e)=>{const n=indexedDB.open(V,1);n.onupgradeneeded=()=>{n.result.objectStoreNames.contains(u)||n.result.createObjectStore(u)},n.onsuccess=()=>t(n.result),n.onerror=()=>e(n.error)})}function M(t){if(t instanceof Uint8Array)return{bytes:t,accessedAt:0};const e=t;return e?.bytes instanceof Uint8Array&&Number.isFinite(e.accessedAt)?e:void 0}async function C(t,e){if(typeof indexedDB>"u")return t;let n;try{return n=await $(),await e(n)}catch{return t}finally{n?.close()}}function G(t){return C(null,e=>new Promise((n,a)=>{const r=e.transaction(u,"readwrite"),o=r.objectStore(u),i=o.get(t);let c=null;i.onsuccess=()=>{const s=M(i.result);s&&s.bytes.byteLength<=p().maxFontBytes?(c=s.bytes,o.put({bytes:s.bytes,accessedAt:Date.now()},t)):i.result!==void 0&&o.delete(t)},r.oncomplete=()=>n(c),r.onerror=()=>a(r.error),r.onabort=()=>a(r.error)}))}function J(t,e,n,a){const r=p(),o=e.filter(s=>s.key!==n);t.delete(n),a.byteLength<=Math.min(r.maxFontBytes,r.maxBytes)&&o.unshift({key:n,bytes:a.byteLength,accessedAt:Date.now()}),o.sort((s,h)=>h.accessedAt-s.accessedAt);let i=0,c=0;for(const s of o){if(c>=r.maxFonts||i+s.bytes>r.maxBytes||s.bytes>r.maxFontBytes){t.delete(s.key);continue}i+=s.bytes,c++,s.key===n&&t.put({bytes:a,accessedAt:s.accessedAt},n)}}function _(t,e){return C(void 0,n=>new Promise((a,r)=>{const o=n.transaction(u,"readwrite"),i=o.objectStore(u),c=i.openCursor(),s=[];c.onsuccess=()=>{const h=c.result;if(!h){J(i,s,t,e);return}const x=M(h.value);x?s.push({key:h.key,bytes:x.bytes.byteLength,accessedAt:x.accessedAt}):h.delete(),h.continue()},o.oncomplete=()=>a(),o.onerror=()=>r(o.error),o.onabort=()=>r(o.error)}))}function D(t){return C(void 0,e=>new Promise((n,a)=>{const r=e.transaction(u,"readwrite"),o=r.objectStore(u);t===void 0?o.clear():o.delete(t),r.oncomplete=()=>n(),r.onerror=()=>a(r.error),r.onabort=()=>a(r.error)}))}let L=0,S=0,v=Promise.resolve();const g=new Map;async function N(t){l.set(t,(l.get(t)??0)+1),B(t),w.delete(t);const e=g.get(t),n=(async()=>{await v,await e,await y.get(t),await D(t)})();g.set(t,n);try{await n}finally{g.get(t)===n&&g.delete(t)}}async function I(){L++,q(),w.clear(),l.clear();const t=v,e=(async()=>{await t,await Promise.all(y.values()),await D()})();v=e.catch(()=>{}),await e}const l=new Map,y=new Map,w=new Map,E=new Set;function k(){!S&&!E.size&&l.clear()}const T=new WeakMap;function K(t){const e=new TextDecoder().decode(t.subarray(0,256));return/^\s*(?:\uFEFF)?\s*<(?:!doctype\s+html|html|head|body)(?:\s|>)/i.test(e)}function R(t){if(t.byteLength===0)throw new Error("字体文件为空");if(K(t))throw new Error("字体 URL 返回 HTML 页面(可能是 SPA 路由回退),不是字体文件")}function Q(t){const e=T.get(t);if(e)return e;const n=(async()=>{const a=String.fromCharCode(...t.subarray(0,4));if(!["\0\0\0","true","OTTO","wOFF","wOF2","ttcf"].includes(a))throw new Error("文件内容不是支持的 TTF/OTF/WOFF 字体(可能返回了 JSON 或文本)");const{default:r}=await Promise.resolve().then(()=>require("./pdf-DqyxJ96U.cjs")).then(i=>i.fontkit_es),o=r.create(t);if(!Number.isFinite(o.unitsPerEm)||o.unitsPerEm<=0||!o.characterSet?.length||!o.numGlyphs)throw new Error("字体结构无效或不含可嵌入的单字体;请提供有效的 TTF/OTF/WOFF 文件")})();return T.set(t,n),n}function A(t,e,n=!1){const a=n?"字体加载超时,请检查网络或字体服务":e instanceof Error?e.message:String(e);return Object.assign(new Error(`PDF 字体 ${JSON.stringify(t)} 加载失败:${a}`),{cause:e})}function P(t,e){if(t>e)throw new Error(`字体文件超过单字体下载预算(${e}字节)`)}async function X(t,e,n){const a=Number(t.headers?.get("content-length"));try{Number.isFinite(a)&&P(a,e)}catch(r){throw t.body?.cancel(r).catch(()=>{}),r}if(!t.body){const r=new Uint8Array(await F(t.arrayBuffer(),n));return P(r.byteLength,e),r}return U(t.body,e,n)}async function U(t,e,n){const a=t.getReader(),r=[];let o=0;try{for(;;){const s=await F(a.read(),n);if(s.done)break;o+=s.value.byteLength,P(o,e),r.push(s.value)}const i=new Uint8Array(o);let c=0;for(const s of r)i.set(s,c),c+=s.byteLength;return i}catch(i){throw a.cancel(i).catch(()=>{}),i}finally{a.releaseLock()}}async function Y(t,e,n){if(t[0]!==31||t[1]!==139)return t;if(typeof DecompressionStream>"u")throw new Error("当前环境不支持 gzip 字体解压,请使用未压缩的字体 URL 或支持 DecompressionStream 的浏览器 / Node 环境");const r=new ReadableStream({start(o){o.enqueue(t),o.close()}}).pipeThrough(new DecompressionStream("gzip"));return U(r,e,n)}async function Z(t){const e=new AbortController;let n=!1;const a=setTimeout(()=>{n=!0,e.abort()},15e3);try{const r=await fetch(t,{signal:e.signal});if(!r.ok)throw new Error(`字体请求返回 HTTP ${r.status}`);if(/text\/html|application\/xhtml\+xml/i.test(r.headers?.get("content-type")??""))throw new Error("字体 URL 返回 HTML 页面(可能是 SPA 路由回退),不是字体文件");const o=p().maxFontBytes,i=await X(r,o,e.signal),c=await Y(i,o,e.signal);return R(c),{bytes:c,fromCache:!1}}catch(r){throw e.abort(),A(t,r,n)}finally{clearTimeout(a)}}async function tt(t){await v,await g.get(t);const e=await G(t);if(e)try{return R(e),{bytes:e,fromCache:!0}}catch{}return Z(t)}function et(t){const e=w.get(t);if(e)return e;const n=tt(t);w.set(t,n),E.add(n);const a=()=>{w.get(t)===n&&w.delete(t),E.delete(n),k()};return n.then(a,a),n}async function nt(t,e,n,a){if((l.get(t)??0)!==n||L!==a)return;H(t,e);const r=y.get(t);if(r){await r;return}const o=_(t,e);y.set(t,o),await o,y.get(t)===o&&y.delete(t)}function m(t){return t.reason??new DOMException("字体加载已取消","AbortError")}function F(t,e){return e?e.aborted?Promise.reject(m(e)):new Promise((n,a)=>{const r=()=>{e.removeEventListener("abort",r),a(m(e))};e.addEventListener("abort",r,{once:!0}),t.then(o=>{e.removeEventListener("abort",r),n(o)},o=>{e.removeEventListener("abort",r),a(o)})}):t}async function rt(t,e,n,a,r){try{return await F(Q(e.bytes),n.signal),e.bytes}catch(o){if(n.signal?.aborted)throw m(n.signal);if((l.get(t)??0)!==a||L!==r)throw A(t,o);if(await N(t),e.fromCache)return await z(t,n);throw A(t,o)}}async function z(t,e={}){if(e.signal?.aborted)throw m(e.signal);const n=l.get(t)??0,a=L,r=j(t);if(r&&!e.strict)return r;const o=r?void 0:et(t);S++;try{const i=r?{bytes:r,fromCache:!0}:await F(o,e.signal),c=e.strict?await rt(t,i,e,n,a):i.bytes;if(e.signal?.aborted)throw m(e.signal);return r||await F(nt(t,c,n,a),e.signal),c}catch(i){if(e.signal?.aborted)throw m(e.signal);if(e.strict)throw i;return null}finally{S--,k()}}exports.clearFontCache=I;exports.configureFontCache=W;exports.getFontCacheStats=p;exports.invalidateFontCache=N;exports.loadFontWithCache=z;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=new Map;let b=0,d={maxFonts:8,maxBytes:64*1024*1024,maxFontBytes:24*1024*1024};function O(){for(;f.size>d.maxFonts||b>d.maxBytes;){const t=f.keys().next().value;b-=f.get(t).byteLength,f.delete(t)}}function W(t){const e={...d,...t};if(!Object.values(e).every(n=>Number.isSafeInteger(n)&&n>0))throw new Error("字体缓存预算应为正整数字节/数量");d=e;for(const[n,a]of f)a.byteLength>d.maxFontBytes&&B(n);O()}function p(){return{fonts:f.size,bytes:b,...d}}function j(t){const e=f.get(t);return e&&(f.delete(t),f.set(t,e)),e}function B(t){const e=f.get(t);e&&(b-=e.byteLength),f.delete(t)}function q(){f.clear(),b=0}function H(t,e){B(t),!(e.byteLength>d.maxBytes||e.byteLength>d.maxFontBytes)&&(f.set(t,e),b+=e.byteLength,O())}const V="mach-report-fonts",u="fonts";function $(){return new Promise((t,e)=>{const n=indexedDB.open(V,1);n.onupgradeneeded=()=>{n.result.objectStoreNames.contains(u)||n.result.createObjectStore(u)},n.onsuccess=()=>t(n.result),n.onerror=()=>e(n.error)})}function M(t){if(t instanceof Uint8Array)return{bytes:t,accessedAt:0};const e=t;return e?.bytes instanceof Uint8Array&&Number.isFinite(e.accessedAt)?e:void 0}async function C(t,e){if(typeof indexedDB>"u")return t;let n;try{return n=await $(),await e(n)}catch{return t}finally{n?.close()}}function G(t){return C(null,e=>new Promise((n,a)=>{const r=e.transaction(u,"readwrite"),o=r.objectStore(u),i=o.get(t);let c=null;i.onsuccess=()=>{const s=M(i.result);s&&s.bytes.byteLength<=p().maxFontBytes?(c=s.bytes,o.put({bytes:s.bytes,accessedAt:Date.now()},t)):i.result!==void 0&&o.delete(t)},r.oncomplete=()=>n(c),r.onerror=()=>a(r.error),r.onabort=()=>a(r.error)}))}function J(t,e,n,a){const r=p(),o=e.filter(s=>s.key!==n);t.delete(n),a.byteLength<=Math.min(r.maxFontBytes,r.maxBytes)&&o.unshift({key:n,bytes:a.byteLength,accessedAt:Date.now()}),o.sort((s,h)=>h.accessedAt-s.accessedAt);let i=0,c=0;for(const s of o){if(c>=r.maxFonts||i+s.bytes>r.maxBytes||s.bytes>r.maxFontBytes){t.delete(s.key);continue}i+=s.bytes,c++,s.key===n&&t.put({bytes:a,accessedAt:s.accessedAt},n)}}function _(t,e){return C(void 0,n=>new Promise((a,r)=>{const o=n.transaction(u,"readwrite"),i=o.objectStore(u),c=i.openCursor(),s=[];c.onsuccess=()=>{const h=c.result;if(!h){J(i,s,t,e);return}const x=M(h.value);x?s.push({key:h.key,bytes:x.bytes.byteLength,accessedAt:x.accessedAt}):h.delete(),h.continue()},o.oncomplete=()=>a(),o.onerror=()=>r(o.error),o.onabort=()=>r(o.error)}))}function D(t){return C(void 0,e=>new Promise((n,a)=>{const r=e.transaction(u,"readwrite"),o=r.objectStore(u);t===void 0?o.clear():o.delete(t),r.oncomplete=()=>n(),r.onerror=()=>a(r.error),r.onabort=()=>a(r.error)}))}let L=0,S=0,v=Promise.resolve();const g=new Map;async function N(t){l.set(t,(l.get(t)??0)+1),B(t),w.delete(t);const e=g.get(t),n=(async()=>{await v,await e,await y.get(t),await D(t)})();g.set(t,n);try{await n}finally{g.get(t)===n&&g.delete(t)}}async function I(){L++,q(),w.clear(),l.clear();const t=v,e=(async()=>{await t,await Promise.all(y.values()),await D()})();v=e.catch(()=>{}),await e}const l=new Map,y=new Map,w=new Map,E=new Set;function k(){!S&&!E.size&&l.clear()}const T=new WeakMap;function K(t){const e=new TextDecoder().decode(t.subarray(0,256));return/^\s*(?:\uFEFF)?\s*<(?:!doctype\s+html|html|head|body)(?:\s|>)/i.test(e)}function R(t){if(t.byteLength===0)throw new Error("字体文件为空");if(K(t))throw new Error("字体 URL 返回 HTML 页面(可能是 SPA 路由回退),不是字体文件")}function Q(t){const e=T.get(t);if(e)return e;const n=(async()=>{const a=String.fromCharCode(...t.subarray(0,4));if(!["\0\0\0","true","OTTO","wOFF","wOF2","ttcf"].includes(a))throw new Error("文件内容不是支持的 TTF/OTF/WOFF 字体(可能返回了 JSON 或文本)");const{default:r}=await Promise.resolve().then(()=>require("./pdf-CARdBcuw.cjs")).then(i=>i.fontkit_es),o=r.create(t);if(!Number.isFinite(o.unitsPerEm)||o.unitsPerEm<=0||!o.characterSet?.length||!o.numGlyphs)throw new Error("字体结构无效或不含可嵌入的单字体;请提供有效的 TTF/OTF/WOFF 文件")})();return T.set(t,n),n}function A(t,e,n=!1){const a=n?"字体加载超时,请检查网络或字体服务":e instanceof Error?e.message:String(e);return Object.assign(new Error(`PDF 字体 ${JSON.stringify(t)} 加载失败:${a}`),{cause:e})}function P(t,e){if(t>e)throw new Error(`字体文件超过单字体下载预算(${e}字节)`)}async function X(t,e,n){const a=Number(t.headers?.get("content-length"));try{Number.isFinite(a)&&P(a,e)}catch(r){throw t.body?.cancel(r).catch(()=>{}),r}if(!t.body){const r=new Uint8Array(await F(t.arrayBuffer(),n));return P(r.byteLength,e),r}return U(t.body,e,n)}async function U(t,e,n){const a=t.getReader(),r=[];let o=0;try{for(;;){const s=await F(a.read(),n);if(s.done)break;o+=s.value.byteLength,P(o,e),r.push(s.value)}const i=new Uint8Array(o);let c=0;for(const s of r)i.set(s,c),c+=s.byteLength;return i}catch(i){throw a.cancel(i).catch(()=>{}),i}finally{a.releaseLock()}}async function Y(t,e,n){if(t[0]!==31||t[1]!==139)return t;if(typeof DecompressionStream>"u")throw new Error("当前环境不支持 gzip 字体解压,请使用未压缩的字体 URL 或支持 DecompressionStream 的浏览器 / Node 环境");const r=new ReadableStream({start(o){o.enqueue(t),o.close()}}).pipeThrough(new DecompressionStream("gzip"));return U(r,e,n)}async function Z(t){const e=new AbortController;let n=!1;const a=setTimeout(()=>{n=!0,e.abort()},15e3);try{const r=await fetch(t,{signal:e.signal});if(!r.ok)throw new Error(`字体请求返回 HTTP ${r.status}`);if(/text\/html|application\/xhtml\+xml/i.test(r.headers?.get("content-type")??""))throw new Error("字体 URL 返回 HTML 页面(可能是 SPA 路由回退),不是字体文件");const o=p().maxFontBytes,i=await X(r,o,e.signal),c=await Y(i,o,e.signal);return R(c),{bytes:c,fromCache:!1}}catch(r){throw e.abort(),A(t,r,n)}finally{clearTimeout(a)}}async function tt(t){await v,await g.get(t);const e=await G(t);if(e)try{return R(e),{bytes:e,fromCache:!0}}catch{}return Z(t)}function et(t){const e=w.get(t);if(e)return e;const n=tt(t);w.set(t,n),E.add(n);const a=()=>{w.get(t)===n&&w.delete(t),E.delete(n),k()};return n.then(a,a),n}async function nt(t,e,n,a){if((l.get(t)??0)!==n||L!==a)return;H(t,e);const r=y.get(t);if(r){await r;return}const o=_(t,e);y.set(t,o),await o,y.get(t)===o&&y.delete(t)}function m(t){return t.reason??new DOMException("字体加载已取消","AbortError")}function F(t,e){return e?e.aborted?Promise.reject(m(e)):new Promise((n,a)=>{const r=()=>{e.removeEventListener("abort",r),a(m(e))};e.addEventListener("abort",r,{once:!0}),t.then(o=>{e.removeEventListener("abort",r),n(o)},o=>{e.removeEventListener("abort",r),a(o)})}):t}async function rt(t,e,n,a,r){try{return await F(Q(e.bytes),n.signal),e.bytes}catch(o){if(n.signal?.aborted)throw m(n.signal);if((l.get(t)??0)!==a||L!==r)throw A(t,o);if(await N(t),e.fromCache)return await z(t,n);throw A(t,o)}}async function z(t,e={}){if(e.signal?.aborted)throw m(e.signal);const n=l.get(t)??0,a=L,r=j(t);if(r&&!e.strict)return r;const o=r?void 0:et(t);S++;try{const i=r?{bytes:r,fromCache:!0}:await F(o,e.signal),c=e.strict?await rt(t,i,e,n,a):i.bytes;if(e.signal?.aborted)throw m(e.signal);return r||await F(nt(t,c,n,a),e.signal),c}catch(i){if(e.signal?.aborted)throw m(e.signal);if(e.strict)throw i;return null}finally{S--,k()}}exports.clearFontCache=I;exports.configureFontCache=W;exports.getFontCacheStats=p;exports.invalidateFontCache=N;exports.loadFontWithCache=z;