@agile-team/mach-report 2.8.3 → 2.9.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 (95) hide show
  1. package/README.md +28 -10
  2. package/dist/ExcelBindingWizard-DiaxvWpQ.cjs +1 -0
  3. package/dist/ExcelBindingWizard-RLJIXKKG.js +816 -0
  4. package/dist/{ReportPreview-DRBAUkxj.js → ReportPreview-B5ZNEasW.js} +23 -22
  5. package/dist/ReportPreview-DRtVPUYo.cjs +6 -0
  6. package/dist/RuleEditor-N4qnMZ-Z.cjs +1 -0
  7. package/dist/RuleEditor-ynnUEK0s.js +1575 -0
  8. package/dist/TemplateReviewPanel-C_Lmzis6.cjs +1 -0
  9. package/dist/TemplateReviewPanel-Cn32OY4_.js +173 -0
  10. package/dist/{_plugin-vue_export-helper-DPbiz14D.js → _plugin-vue_export-helper-8SL1F89S.js} +2 -2
  11. package/dist/analytics.cjs +1 -1
  12. package/dist/analytics.d.cts +188 -5
  13. package/dist/analytics.d.ts +188 -5
  14. package/dist/analytics.js +68 -202
  15. package/dist/{assets-B9qJku3V.js → assets-DDsfEi8R.js} +3 -3
  16. package/dist/{assets-RZan7EyL.cjs → assets-ahTRUXRk.cjs} +1 -1
  17. package/dist/binding-preview-B5834rml.cjs +2 -0
  18. package/dist/binding-preview-ChXjN5L5.js +649 -0
  19. package/dist/{capabilities-joSutDF8.js → capabilities-Cm9hZ3uV.js} +5 -5
  20. package/dist/{capabilities-xGTpnPjJ.cjs → capabilities-DYzWL7KS.cjs} +1 -1
  21. package/dist/dataset-BkRmwgeJ.cjs +1 -0
  22. package/dist/dataset-H5pFuQGU.js +121 -0
  23. package/dist/defaults-DXhiM1ZD.js +10 -0
  24. package/dist/defaults-xhmcLLrf.cjs +1 -0
  25. package/dist/designer.cjs +2 -1
  26. package/dist/designer.d.cts +1391 -6
  27. package/dist/designer.d.ts +1391 -6
  28. package/dist/designer.js +2636 -673
  29. package/dist/grid-geometry-BNptEcMm.js +65 -0
  30. package/dist/grid-geometry-CZ_cYB6O.cjs +1 -0
  31. package/dist/import-template-CNMLJSQw.js +23030 -0
  32. package/dist/import-template-CpxunKVp.cjs +29 -0
  33. package/dist/index.cjs +7 -7
  34. package/dist/index.d.cts +202 -3
  35. package/dist/index.d.ts +202 -3
  36. package/dist/index.js +554 -535
  37. package/dist/matrix-CNPDJxED.js +745 -0
  38. package/dist/matrix-Div9Ilh3.cjs +1 -0
  39. package/dist/pdf.cjs +46 -46
  40. package/dist/pdf.d.cts +2 -0
  41. package/dist/pdf.d.ts +2 -0
  42. package/dist/pdf.js +17 -16
  43. package/dist/{plugin-BurDDMcd.js → plugin-BWwIgZXV.js} +1 -1
  44. package/dist/{plugin-DSFu51Ua.cjs → plugin-Dg-J1Rbm.cjs} +1 -1
  45. package/dist/progress-7OSZbFok.js +39 -0
  46. package/dist/progress-BnLiS5eH.cjs +1 -0
  47. package/dist/render-plan-7xpGrCEl.cjs +1 -0
  48. package/dist/render-plan-Ck6koX9L.js +13 -0
  49. package/dist/server/node.d.cts +62 -0
  50. package/dist/server/node.d.ts +62 -0
  51. package/dist/server-node.cjs +1 -1
  52. package/dist/server-node.js +373 -145
  53. package/dist/server.cjs +1 -1
  54. package/dist/server.d.cts +311 -0
  55. package/dist/server.d.ts +311 -0
  56. package/dist/server.js +590 -186
  57. package/dist/{style-Dv5o_x6b.js → style-CQ1PK8ZB.js} +5 -5
  58. package/dist/style-UgIJSA1F.cjs +1 -0
  59. package/dist/style.css +1 -1
  60. package/dist/template-registry-CHMYZ7SD.cjs +1 -0
  61. package/dist/template-registry-R61AMCr0.js +433 -0
  62. package/dist/template-review-hvWWQFsi.js +1027 -0
  63. package/dist/template-review-jEcOfmGr.cjs +1 -0
  64. package/dist/textwrap-CWHyzkBH.cjs +4 -0
  65. package/dist/{textwrap-DOl04hCQ.js → textwrap-DE1kgcJB.js} +1 -1
  66. package/dist/{validate-DfHPD8wX.cjs → validate-BDiMqkJC.cjs} +1 -1
  67. package/dist/{validate-S6CgIm5d.js → validate-DWPF7icl.js} +13 -13
  68. package/dist/vue/async.d.cts +186 -0
  69. package/dist/vue/async.d.ts +186 -0
  70. package/dist/vue/index.d.cts +271 -3
  71. package/dist/vue/index.d.ts +271 -3
  72. package/dist/vue-async.cjs +1 -1
  73. package/dist/vue-async.js +3 -3
  74. package/dist/vue.cjs +1 -1
  75. package/dist/vue.js +4 -4
  76. package/dist/worker.cjs +1 -1
  77. package/dist/worker.d.cts +2 -0
  78. package/dist/worker.d.ts +2 -0
  79. package/dist/worker.js +1 -1
  80. package/dist/xlsx.cjs +2 -30
  81. package/dist/xlsx.d.cts +268 -0
  82. package/dist/xlsx.d.ts +268 -0
  83. package/dist/xlsx.js +220 -23440
  84. package/package.json +1 -1
  85. package/dist/ReportPreview-DjGeWHY-.cjs +0 -6
  86. package/dist/progress-DD964VAB.js +0 -102
  87. package/dist/progress-KvhwXZ1Q.cjs +0 -1
  88. package/dist/render-plan-CckPEQyf.cjs +0 -1
  89. package/dist/render-plan-uzZYYSy1.js +0 -19
  90. package/dist/report-source-BXHNy_AD.js +0 -755
  91. package/dist/report-source-CCAvFE3t.cjs +0 -1
  92. package/dist/style-CpwiOPyB.cjs +0 -1
  93. package/dist/template-registry-DWExx0gU.cjs +0 -1
  94. package/dist/template-registry-NpOakidD.js +0 -354
  95. package/dist/textwrap-CnGsEum6.cjs +0 -4
package/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
  </p>
9
9
 
10
10
  <p align="center">
11
- <img src="https://img.shields.io/badge/source-2.8.3-2563eb" alt="Source version 2.8.3" />
11
+ <img src="https://img.shields.io/badge/source-2.9.0-2563eb" alt="Source version 2.9.0" />
12
12
  <a href="https://www.npmjs.com/package/@agile-team/mach-report"><img src="https://img.shields.io/npm/v/@agile-team/mach-report?label=npm&color=3178c6" alt="npm version" /></a>
13
13
  <a href="https://github.com/ChenyCHENYU/MachReport/actions/workflows/ci.yml"><img src="https://github.com/ChenyCHENYU/MachReport/actions/workflows/ci.yml/badge.svg" alt="CI" /></a>
14
14
  <a href="https://github.com/ChenyCHENYU/MachReport/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-authorization%20required-dc2626" alt="Authorization required" /></a>
@@ -41,18 +41,32 @@ MachReport 把模板、数据和输出分开:用 TypeScript DSL 或 JSON 定
41
41
  | --- | --- |
42
42
  | 页面模型 | 毫米单位、纸张预设与自定义尺寸、页边距、横纵向、文本与表格几何 |
43
43
  | 完整宽表 | 自然列宽、横向滚动、默认 100% 预览;纵向分段窗口化,Excel 自动合并连续 Sheet |
44
- | 明细与汇总 | 自动折行与分页、重复表头、连续分组小计、末尾总计、页码占位符 |
44
+ | 明细与汇总 | 自动分页、多级分组与加权小计、业务键主从明细、动态矩阵、重复页眉页脚 |
45
45
  | 数据呈现 | 表头与内容独立对齐、类型自动对齐、数值 / 百分比 / 日期格式化、条件格式 |
46
46
  | 预览交互 | 右下分页、分组导出菜单、内容搜索与字段目录、跨页选区、冻结窗格、Sheet 导航 |
47
47
  | 内容编辑 | 默认只读;双击与批量粘贴、原子保存、撤销 / 重做、恢复与变更清单 |
48
48
  | Excel 导入 | 多 Sheet、完整宽表、合并单元格、基础样式与缓存公式值转换为可复用模板 |
49
- | 模板配置 | 轻量属性编辑器、草稿 / 发布 / 历史 / 回滚、CAS 存储适配器、Excel 区域绑定 |
49
+ | 模板配置 | 可视化画布、Excel 业务绑定向导、计算与规则、变更对比与发布验收、CAS 历史 / 回滚 |
50
50
  | 输出 | 浏览器打印、HTML、PDF、真正的 `.xlsx`、逐页 PNG、Word 兼容 HTML `.doc` |
51
51
  | 工程接入 | 局部组件、全局插件、异步入口、分层配置、结构化错误与导出告警 |
52
- | 引擎复用 | 数据 / 参数 JSON Schema、统一 Provider、Node Runtime、浏览器 / Node Worker、流式 Excel |
52
+ | 引擎复用 | 共用契约与计算、逐页排版、Node Runtime / Worker、流式 Excel、可恢复持久任务 |
53
53
  | 分析扩展 | 可选只读选区计算、交叉汇总、声明式计算、柱图 / 折线图基础图元与资源适配 |
54
54
 
55
- 数据接口、鉴权与业务规则由宿主应用决定。包内统一校验、分页、编辑事务和版本流程;宿主提供请求与存储适配器。轻量属性编辑器可直接使用;拖拽画布、审批与数据库部署仍由项目按需建设。
55
+ 数据接口、鉴权与业务规则由宿主应用决定。包内统一校验、分页、编辑事务、设计器和版本流程;宿主提供请求与存储适配器。审批和业务数据库部署按项目现有治理执行。
56
+
57
+ ### 设计、验收与执行共用一套模板
58
+
59
+ | 工作 | 包内提供 | 宿主只需提供 |
60
+ | --- | --- | --- |
61
+ | 可视化设计 | 毫米画布、拖动 / 缩放 / 吸附、组件层级、列宽 / 顺序、多层表头 | 模板文档与保存回调 |
62
+ | Excel 业务化 | 选Sheet → 标题 / 表头 / 明细 / 页尾区域 → 字段映射 → 预览,支持重开会话 | 工作簿、数据集与字段契约 |
63
+ | 计算与复杂单据 | 声明式表达式、精确十进制、多级分组、主从关系与动态矩阵 | 业务数据与口径 |
64
+ | 发布验收 | 变更分类、字段依赖检查、显式样例、服务端真实PDF/XLSX编码 | 验收样例、字体、原子CAS存储 |
65
+ | 大任务 | 逐页生成、增量编辑历史、租约 / 幂等 / 取消 / 失败重试 | 调度、文件归档;多实例数据库CAS适配 |
66
+
67
+ 常规预览页面的接入保持不变。设计工具只在打开时加载;画布拖动在松手时提交一次模板事务,样例计算与验收按按钮执行。逐页生成不保留全部输出页,输入数据和分组索引仍受预算管理。
68
+
69
+ 操作与边界见[设计器](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/DESIGNER.md)、[Excel绑定](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/EXCEL_BINDING.md)、[复杂报表](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/COMPLEX_REPORTS.md)、[发布验收](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/PUBLICATION_REVIEW.md)、[持久任务](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/DURABLE_JOBS.md)。
56
70
 
57
71
  ## 安装:一个包,按需入口
58
72
 
@@ -464,7 +478,7 @@ Ctrl/Cmd+F 打开或聚焦内容搜索,输入时显示检索状态与命中数
464
478
 
465
479
  查询、校验、排版、资源准备、文件生成提供阶段反馈和取消;PDF / Excel / 图片及 HTML / Word 输出报告真实完成单位,无法估算的编码过程不显示虚假百分比。`report.cancelTask()` 与 `state.task` 复用同一状态;忽略取消的自定义接口或导出器也不能用迟到结果覆盖当前报表。
466
480
 
467
- 宽表字段目录直接读取模板中的中文列名、多层表头与数据集,支持搜索和跨表精确定位。可选设计器增加列搜索、批量对齐及撤销重做,无需使用方再维护一份列目录。
481
+ 宽表字段目录直接读取模板中的中文列名、多层表头与数据集,支持搜索和跨表精确定位。可选设计器把当前字段的内容、格式与编辑开关集中在首屏,字段目录按需展开并支持搜索、批量对齐与键盘导航;模板信息与高级 JSON 各有独立分区,保留撤销重做和草稿保护,无需使用方再维护一份列目录。
468
482
 
469
483
  大宽表适宽时优先挂载当前页和定位目标,其余页面按帧补齐并显示加载占位;切换或卸载取消旧调度。选区只更新变化的属性,减少大量单元格的属性读写。导出仍使用完整计划,使用方无需维护渲染调度。
470
484
 
@@ -538,11 +552,11 @@ const fetcher: PlanFetcher = async ({ reportIds, params, signal }) => {
538
552
  | `@agile-team/mach-report/pdf` | `renderPlanToPdf`、字体加载与缓存 |
539
553
  | `@agile-team/mach-report/xlsx` | `renderPlanToXlsx`、工作簿与导出告警 |
540
554
  | `@agile-team/mach-report/sql` | 动态 SQL 编译与单 SELECT 校验工具 |
541
- | `@agile-team/mach-report/server` | Runtime、预算、有界任务队列、元数据与共用导出 |
555
+ | `@agile-team/mach-report/server` | Runtime、预算、持久任务协议、真实输出发布验收与共用导出 |
542
556
  | `@agile-team/mach-report/worker` | 浏览器 Worker 执行与消息桥接 |
543
- | `@agile-team/mach-report/server/node` | Node worker_threads 执行与硬取消 |
557
+ | `@agile-team/mach-report/server/node` | Node worker_threads、单进程持久任务文件适配、文件摘要 |
544
558
  | `@agile-team/mach-report/xlsx/node` | AsyncIterable 行数据流式输出,仅 Node |
545
- | `@agile-team/mach-report/designer` | 可选 Vue 模板属性编辑器 |
559
+ | `@agile-team/mach-report/designer` | 可选 Vue 画布、属性、Excel绑定向导、规则与验收面板 |
546
560
  | `@agile-team/mach-report/analytics` | 交叉表、受控计算、柱图 / 折线图基础图元 |
547
561
 
548
562
  内核保持零运行时依赖;ExcelJS、pdf-lib / fontkit、SQL parser 分别内联于对应构建入口。导入 `/xlsx` 才使用 Excel 能力,导入 `/pdf` 才使用 PDF 能力;Vue 不进入引擎主入口。npm 构建提供 ESM、CommonJS 与类型声明。
@@ -589,6 +603,10 @@ CI 使用同一套校验命令,并在构建后检查实际发布产物。协
589
603
  | 交互配置 | [交互指南](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/INTERACTION.md):选区、键盘、冻结、导航、偏好与导入摘要 |
590
604
  | 模板管理 | [扩展指南](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/TEMPLATE_MANAGEMENT.md):JSON 文档、目录、动态版本与后台接入 |
591
605
  | 模板属性 | [编辑器指南](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/DESIGNER.md):实时预览、版本保存与属性面板 |
606
+ | Excel业务绑定 | [绑定向导](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/EXCEL_BINDING.md):区域识别、契约映射与可重开会话 |
607
+ | 复杂报表 | [计算与布局](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/COMPLEX_REPORTS.md):精确数值、多级分组、主从、动态矩阵与逐页生成 |
608
+ | 发布验收 | [变更与输出](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/PUBLICATION_REVIEW.md):兼容检查、样例和真实文件验收 |
609
+ | 持久任务 | [任务恢复](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/DURABLE_JOBS.md):幂等、租约、取消与存储适配 |
592
610
  | 服务端 | [Runtime / Worker](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/SERVER.md):统一契约、受控执行、流式输出 |
593
611
  | 分析扩展 | [分析与资源](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/ANALYTICS.md):交叉表、计算、基础图表与资源适配 |
594
612
  | PDF | [字体与导出指南](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/PDF.md):首次诊断、字库部署、缺字与缓存 |
@@ -605,7 +623,7 @@ CI 使用同一套校验命令,并在构建后检查实际发布产物。协
605
623
 
606
624
  ## 版本与授权
607
625
 
608
- 当前源码版本为 `2.8.3`,以 [`packages/mach-report/package.json`](https://github.com/ChenyCHENYU/MachReport/blob/main/packages/mach-report/package.json) 为准;npm 已发布版本由顶部 npm 标识展示。
626
+ 当前源码版本为 `2.9.0`,以 [`packages/mach-report/package.json`](https://github.com/ChenyCHENYU/MachReport/blob/main/packages/mach-report/package.json) 为准;npm 已发布版本由顶部 npm 标识展示。
609
627
 
610
628
  Copyright © 2026 ChenyCHENYU (Agile Team). All rights reserved.
611
629
 
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),w=require("./_plugin-vue_export-helper-BLmdZLlg.cjs"),S=require("./binding-preview-B5834rml.cjs"),oe=require("./designer.cjs");function H(a="",A=0){return{version:"1.0",sheet:a,dataset:"",regions:{header:"",detail:""},fields:Array.from({length:A},()=>""),rowKey:""}}function G(a){return a instanceof Error?a.message:String(a)}function le(a,A){const m=e.shallowRef(),c=e.ref(H()),L=e.ref({id:a.identity?.id??"excel-template",name:a.identity?.name??"Excel 业务模板"}),s=e.ref(""),B=e.ref([]);let h;const d=e.ref(""),D=e.ref(!1),E=e.ref(!1),N=e.ref(!1),x=e.ref(1),I=e.ref(1),M=e.ref(),T=e.ref(),C=e.ref(0),$=e.computed(()=>({...oe.EXCEL_BINDING_MESSAGES,...a.messages})),o=e.computed(()=>!!a.readonly||D.value),V=e.computed(()=>m.value?.sheets.find(l=>l.name===c.value.sheet)),v=e.computed(()=>V.value?S.parseImportRange(V.value.range):void 0),F=e.computed(()=>a.datasets.find(l=>l.id===c.value.dataset)),K=e.computed(()=>m.value&&V.value?S.getExcelSheetWindow(m.value,V.value.name,{row:x.value,column:I.value}):void 0),f=e.computed(()=>m.value?S.validateExcelBindingRegions(m.value,c.value):[]),y=e.computed(()=>{if(!m.value)return{ok:!1,issues:[],mapped:0,total:0};const l=S.validateExcelBindingFields(m.value,c.value,a.datasets),r=[...f.value,...l.issues];return{...l,ok:r.length===0,issues:r}}),X=e.computed(()=>c.value.fields.slice(C.value*12,(C.value+1)*12).map((l,r)=>({index:C.value*12+r,field:l,physical:S.columnName((v.value?.left??1)+C.value*12+r)}))),J=e.computed(()=>F.value?.fields.filter(l=>l.type!=="boolean")??[]),b=e.computed(()=>M.value!==void 0&&T.value!==void 0?{top:Math.min(M.value,T.value),bottom:Math.max(M.value,T.value)}:void 0);let k,p=0;function R(){p++,k?.abort(),k=void 0,D.value=!1}function z(){x.value=v.value?.top??1,I.value=v.value?.left??1,M.value=void 0,T.value=void 0,C.value=0,E.value=!1,N.value=!1}function q(l){R();try{const r=S.parseExcelBindingSession(l);R(),h=void 0,B.value=r.source.sheets.map(g=>({name:g.name,index:g.index})),m.value=r.source,c.value=r.recipe,L.value={...r.identity,...a.lockId&&a.identity?{id:a.identity.id}:{}},s.value=r.recipe.sheet,d.value="",z()}catch(r){d.value=G(r)}}e.watch(()=>a.session,l=>{l&&q(l)},{immediate:!0}),e.watch(()=>a.readonly,l=>{l&&R()}),e.watch([c,L],()=>{E.value=!1,N.value=!1},{deep:!0,flush:"sync"}),e.watch(()=>a.datasets,()=>{E.value=!1,N.value=!1}),e.onBeforeUnmount(R);async function P(l){if(a.readonly)return;if(R(),!/\.xlsx$/i.test(l.name)){d.value=$.value.invalidFile;return}const r=++p;k=new AbortController,D.value=!0,d.value="";try{const{inspectExcelWorkbook:g,importExcelTemplate:_}=await Promise.resolve().then(()=>require("./import-template-CpxunKVp.cjs")).then(W=>W.importTemplate);if(r!==p||a.readonly)return;const U=await g(l,{...a.importOptions,signal:k.signal});if(r!==p||a.readonly)return;const O=U.sheets.filter(W=>W.visible);if(!O.length)throw new Error("Excel 中没有可导入的可见工作表");const te=await _(l,{...a.importOptions,sheets:[O[0].name],signal:k.signal});if(r!==p||a.readonly)return;m.value=te,s.value=l.name,h=l,B.value=O.map(W=>({name:W.name,index:W.index})),c.value=H(te.sheets[0].name,te.sheets[0].columnCount),z()}catch(g){r===p&&(d.value=G(g))}finally{r===p&&(D.value=!1,k=void 0)}}async function Q(l){if(o.value||!B.value.some(_=>_.name===l))return;const r=m.value?.sheets.find(_=>_.name===l);if(r){c.value=H(l,r.columnCount),d.value="",z();return}if(!h)return;R();const g=++p;k=new AbortController,D.value=!0,d.value="";try{const{importExcelTemplate:_}=await Promise.resolve().then(()=>require("./import-template-CpxunKVp.cjs")).then(O=>O.importTemplate);if(g!==p||a.readonly)return;const U=await _(h,{...a.importOptions,sheets:[l],signal:k.signal});if(g!==p||a.readonly)return;m.value=U,c.value=H(l,U.sheets[0].columnCount),z()}catch(_){g===p&&(d.value=G(_))}finally{g===p&&(D.value=!1,k=void 0)}}function Y(l){o.value||(c.value.dataset=l,c.value.rowKey="",c.value.fields.fill(""),E.value=!1,N.value=!1)}function Z(l,r){o.value||!v.value||l<v.value.top||l>v.value.bottom||((!r||M.value===void 0)&&(M.value=l),T.value=l)}function ee(l){if(o.value||!m.value||!b.value){o.value||(d.value=$.value.emptySelection);return}c.value.regions[l]=S.excelBindingRowRange(m.value,c.value.sheet,b.value.top,b.value.bottom),E.value=!1,N.value=!1,d.value=""}function j(l){o.value||(delete c.value.regions[l],E.value=!1,N.value=!1)}function u(l,r){!o.value&&l>=0&&l<c.value.fields.length&&(c.value.fields[l]=r,E.value=!1,N.value=!1)}function n(l){for(const r of["title","header","detail","footer"]){const g=c.value.regions[r];if(!g)continue;const _=S.parseImportRange(g);if(l>=_.top&&l<=_.bottom)return r}}function t(l,r){v.value&&(l==="row"?x.value=Math.max(v.value.top,Math.min(v.value.bottom,x.value+r)):I.value=Math.max(v.value.left,Math.min(v.value.right,I.value+r)))}function i(){E.value=!0,d.value=""}function ne(){if(!(o.value||!m.value)&&(E.value=!0,d.value="",!!y.value.ok))try{const l={...L.value,...a.lockId&&a.identity?{id:a.identity.id}:{}},r=S.createExcelBindingDocument(m.value,c.value,a.datasets,l),g=S.createExcelBindingSession(m.value,c.value,l);A({...r,session:g}),N.value=!0}catch(l){d.value=G(l)}}return{imported:m,recipe:c,identity:L,sourceName:s,sheetChoices:B,error:d,loading:D,checked:E,applied:N,row:x,column:I,mappingPage:C,m:$,disabled:o,sheet:V,sourceRange:v,dataset:F,window:K,validation:y,mappings:X,rowKeys:J,selection:b,cancel:R,importFile:P,chooseSheet:Q,chooseDataset:Y,chooseRow:Z,markRegion:ee,clearRegion:j,setMapping:u,regionAt:n,moveWindow:t,check:i,apply:ne}}const ae=["aria-label","aria-busy"],re={class:"mr-binding-bar"},ie={class:"mr-binding-heading"},se=["aria-label","disabled"],ue=["disabled"],ce={key:0,class:"mr-binding-error",role:"alert"},de={key:1,class:"mr-binding-placeholder",role:"status"},me={key:2,class:"mr-binding-placeholder"},fe=["disabled"],pe={class:"mr-binding-sourcebar"},ve=["value","aria-label","disabled"],ge=["value"],ye={class:"mr-binding-range"},be={class:"mr-binding-sample-note"},he={class:"mr-binding-layout"},ke={class:"mr-binding-source"},Ee={class:"mr-binding-grid-heading"},Ne=["aria-label"],Ve={class:"mr-binding-grid"},_e=["data-region"],we={scope:"row"},Be=["data-source-row","aria-label","aria-pressed","disabled","onPointerdown","onPointerenter","onKeydown"],Se=["rowspan","colspan","title"],De={key:1,class:"mr-binding-grid-footer"},xe={class:"mr-binding-window"},Ce=["aria-label","disabled"],$e=["min","max","value"],Re=["aria-label","disabled"],Me={class:"mr-binding-window"},Te=["aria-label","disabled"],Fe=["min","max","value"],ze=["aria-label","disabled"],Ie={class:"mr-binding-inspector"},Ke=["disabled"],Le={class:"mr-binding-group"},Pe=["data-role"],We={key:0},Ae=["aria-label","disabled","onClick"],qe=["aria-label","onClick"],Oe={key:0,class:"mr-binding-note"},je={class:"mr-binding-group"},Ue={class:"mr-binding-label"},He=["value","aria-label"],Ge={value:""},Xe=["value"],Je={key:0,class:"mr-binding-note"},Qe={key:1,class:"mr-binding-label"},Ye=["aria-label"],Ze={value:""},et=["value"],tt={key:2,class:"mr-binding-mappings"},nt=["aria-label","value","onChange"],ot={value:""},lt=["value"],at={key:0},rt={key:3,class:"mr-binding-map-pages"},it=["disabled","aria-label"],st=["disabled","aria-label"],ut={class:"mr-binding-group"},ct={class:"mr-binding-label"},dt=["value","readonly"],mt={class:"mr-binding-label"},ft={key:0,class:"mr-binding-issues",role:"alert"},pt={key:0},vt={key:1,class:"mr-binding-warnings"},gt={class:"mr-binding-actions"},yt=["disabled"],bt=["disabled"],ht=e.defineComponent({__name:"ExcelBindingWizard",props:{datasets:{},session:{},identity:{},lockId:{type:Boolean},readonly:{type:Boolean},importOptions:{},messages:{}},emits:["apply"],setup(a,{expose:A,emit:m}){const c=a,L=m,s=le(c,u=>L("apply",u)),{imported:B,recipe:h,identity:d,sourceName:D,sheetChoices:E,error:N,loading:x,checked:I,applied:M,row:T,column:C,mappingPage:$,m:o,disabled:V,sheet:v,sourceRange:F,dataset:K,window:f,validation:y,mappings:X,rowKeys:J,selection:b}=s,k=e.ref(),p=e.ref(!1),R=["title","header","detail","footer"],z=e.computed(()=>({title:o.value.titleRegion,header:o.value.headerRegion,detail:o.value.detailRegion,footer:o.value.footerRegion})),q=e.computed(()=>Math.max(1,Math.ceil(h.value.fields.length/12)));function P(u){return u.target.value}function Q(u){const n=u.target,t=n.files?.[0];t&&s.importFile(t),n.value=""}function Y(u,n){u.button!==0||V.value||(u.preventDefault(),p.value=!0,s.chooseRow(n,u.shiftKey),u.currentTarget.focus())}function Z(u,n){if((u.key===" "||u.key==="Enter")&&(u.preventDefault(),s.chooseRow(n,u.shiftKey)),u.key==="ArrowDown"||u.key==="ArrowUp"){u.preventDefault();const t=n+(u.key==="ArrowDown"?1:-1);u.shiftKey&&s.chooseRow(t,!0),u.currentTarget.closest("table")?.querySelector(`button[data-source-row="${t}"]`)?.focus()}}function ee(u){const n=K.value?.fields.find(t=>t.field===u);return n?[n.type,n.unit,n.digits===void 0?void 0:`${n.digits}${o.value.precision}`,n.sample===void 0?void 0:`${o.value.sample}: ${String(n.sample)}`].filter(t=>t!==void 0&&t!=="").join(" · "):""}function j(u,n){const t=Number(P(u));!Number.isInteger(t)||!F.value||(n==="row"?T.value=Math.max(F.value.top,Math.min(F.value.bottom,t)):C.value=Math.max(F.value.left,Math.min(F.value.right,t)))}return A({importFile:s.importFile,apply:s.apply,cancel:s.cancel}),(u,n)=>(e.openBlock(),e.createElementBlock("section",{class:"mr-binding","aria-label":e.unref(o).title,"aria-busy":e.unref(x),onPointerup:n[18]||(n[18]=t=>p.value=!1),onPointercancel:n[19]||(n[19]=t=>p.value=!1),onPointerleave:n[20]||(n[20]=t=>p.value=!1)},[e.createElementVNode("header",re,[e.createElementVNode("div",ie,[e.createVNode(w._sfc_main,{name:"file",size:17}),e.createElementVNode("strong",null,e.toDisplayString(e.unref(o).title),1),e.createElementVNode("span",null,e.toDisplayString(e.unref(D)||e.unref(o).intro),1)]),e.createElementVNode("input",{ref_key:"input",ref:k,type:"file",accept:".xlsx,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","aria-label":e.unref(o).upload,class:"mr-binding-file",disabled:a.readonly,onChange:Q},null,40,se),e.unref(x)?(e.openBlock(),e.createElementBlock("button",{key:0,type:"button",onClick:n[0]||(n[0]=(...t)=>e.unref(s).cancel&&e.unref(s).cancel(...t))},e.toDisplayString(e.unref(o).cancel),1)):(e.openBlock(),e.createElementBlock("button",{key:1,type:"button",disabled:a.readonly,onClick:n[1]||(n[1]=t=>k.value?.click())},[e.createVNode(w._sfc_main,{name:"upload",size:14}),e.createTextVNode(e.toDisplayString(e.unref(B)?e.unref(o).replace:e.unref(o).upload),1)],8,ue))]),e.unref(N)?(e.openBlock(),e.createElementBlock("div",ce,e.toDisplayString(e.unref(N)),1)):e.createCommentVNode("",!0),e.unref(x)?(e.openBlock(),e.createElementBlock("div",de,[n[21]||(n[21]=e.createElementVNode("span",{class:"mr-binding-loader"},null,-1)),e.createTextVNode(e.toDisplayString(e.unref(o).loading),1)])):e.unref(B)?(e.openBlock(),e.createElementBlock(e.Fragment,{key:3},[e.createElementVNode("div",pe,[e.createElementVNode("label",null,[e.createTextVNode(e.toDisplayString(e.unref(o).sheet),1),e.createElementVNode("select",{value:e.unref(h).sheet,"aria-label":e.unref(o).sheet,disabled:e.unref(V),onChange:n[3]||(n[3]=t=>e.unref(s).chooseSheet(P(t)))},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(E),t=>(e.openBlock(),e.createElementBlock("option",{key:t.name,value:t.name},e.toDisplayString(t.name),9,ge))),128))],40,ve)]),e.createElementVNode("span",ye,e.toDisplayString(e.unref(v)?.range)+" · "+e.toDisplayString(e.unref(v)?.rowCount)+" × "+e.toDisplayString(e.unref(v)?.columnCount),1),e.createElementVNode("span",be,e.toDisplayString(e.unref(o).sourceOnly),1)]),e.createElementVNode("div",he,[e.createElementVNode("div",ke,[e.createElementVNode("div",Ee,[e.createElementVNode("strong",null,e.toDisplayString(e.unref(o).source),1),e.createElementVNode("span",null,e.toDisplayString(e.unref(o).sourceHint),1)]),e.unref(f)?(e.openBlock(),e.createElementBlock("div",{key:0,class:"mr-binding-grid-scroll","aria-label":e.unref(o).source},[e.createElementVNode("table",Ve,[e.createElementVNode("thead",null,[e.createElementVNode("tr",null,[n[23]||(n[23]=e.createElementVNode("th",{class:"mr-binding-corner","aria-label":"#"},"#",-1)),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(f).columns,t=>(e.openBlock(),e.createElementBlock("th",{key:t.column,scope:"col"},e.toDisplayString(t.name),1))),128))])]),e.createElementVNode("tbody",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(f).rows,t=>(e.openBlock(),e.createElementBlock("tr",{key:t.row,"data-region":e.unref(s).regionAt(t.row),class:e.normalizeClass({"is-selected":e.unref(b)&&t.row>=e.unref(b).top&&t.row<=e.unref(b).bottom})},[e.createElementVNode("th",we,[e.createElementVNode("button",{type:"button","data-source-row":t.row,"aria-label":`${e.unref(o).selectionLabel} ${t.row}`,"aria-pressed":!!e.unref(b)&&t.row>=e.unref(b).top&&t.row<=e.unref(b).bottom,disabled:e.unref(V),onPointerdown:i=>Y(i,t.row),onPointerenter:i=>p.value&&e.unref(s).chooseRow(t.row,!0),onKeydown:i=>Z(i,t.row)},e.toDisplayString(t.row),41,Be)]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.cells,i=>(e.openBlock(),e.createElementBlock("td",{key:i.column,rowspan:i.rowSpan,colspan:i.colSpan,title:`${i.address} · ${i.text}`,class:e.normalizeClass({"is-continued":i.continued}),style:e.normalizeStyle({textAlign:i.style?.align,fontWeight:i.style?.bold?"600":void 0})},[e.createElementVNode("span",null,e.toDisplayString(i.text),1)],14,Se))),128))],10,_e))),128))])])],8,Ne)):e.createCommentVNode("",!0),e.unref(f)?(e.openBlock(),e.createElementBlock("footer",De,[e.createElementVNode("span",null,[e.createTextVNode(e.toDisplayString(e.unref(o).selected)+" ",1),e.createElementVNode("strong",null,e.toDisplayString(e.unref(b)?`${e.unref(b).top}–${e.unref(b).bottom}`:"—"),1)]),e.createElementVNode("div",xe,[e.createElementVNode("button",{type:"button","aria-label":e.unref(o).previousRows,disabled:e.unref(f).top<=e.unref(f).source.top,onClick:n[4]||(n[4]=t=>e.unref(s).moveWindow("row",-24))},[e.createVNode(w._sfc_main,{name:"chevron-left",size:13})],8,Ce),e.createElementVNode("label",null,[e.createTextVNode(e.toDisplayString(e.unref(o).rowStart),1),e.createElementVNode("input",{type:"number",min:e.unref(f).source.top,max:e.unref(f).source.bottom,value:e.unref(T),onChange:n[5]||(n[5]=t=>j(t,"row"))},null,40,$e)]),e.createElementVNode("button",{type:"button","aria-label":e.unref(o).nextRows,disabled:e.unref(f).bottom>=e.unref(f).source.bottom,onClick:n[6]||(n[6]=t=>e.unref(s).moveWindow("row",24))},[e.createVNode(w._sfc_main,{name:"chevron-right",size:13})],8,Re)]),e.createElementVNode("div",Me,[e.createElementVNode("button",{type:"button","aria-label":e.unref(o).previousColumns,disabled:e.unref(f).left<=e.unref(f).source.left,onClick:n[7]||(n[7]=t=>e.unref(s).moveWindow("column",-12))},[e.createVNode(w._sfc_main,{name:"chevron-left",size:13})],8,Te),e.createElementVNode("label",null,[e.createTextVNode(e.toDisplayString(e.unref(o).columnStart),1),e.createElementVNode("input",{type:"number",min:e.unref(f).source.left,max:e.unref(f).source.right,value:e.unref(C),onChange:n[8]||(n[8]=t=>j(t,"column"))},null,40,Fe)]),e.createElementVNode("button",{type:"button","aria-label":e.unref(o).nextColumns,disabled:e.unref(f).right>=e.unref(f).source.right,onClick:n[9]||(n[9]=t=>e.unref(s).moveWindow("column",12))},[e.createVNode(w._sfc_main,{name:"chevron-right",size:13})],8,ze)])])):e.createCommentVNode("",!0)]),e.createElementVNode("div",Ie,[e.createElementVNode("fieldset",{disabled:e.unref(V)},[e.createElementVNode("section",Le,[e.createElementVNode("h3",null,[n[24]||(n[24]=e.createElementVNode("b",null,"1",-1)),e.createTextVNode(e.toDisplayString(e.unref(o).regionLegend),1)]),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(R,t=>e.createElementVNode("div",{key:t,class:"mr-binding-region","data-role":t},[e.createElementVNode("div",null,[e.createElementVNode("strong",null,[e.createTextVNode(e.toDisplayString(z.value[t]),1),t==="title"||t==="footer"?(e.openBlock(),e.createElementBlock("small",We,e.toDisplayString(e.unref(o).optional),1)):e.createCommentVNode("",!0)]),e.createElementVNode("code",null,e.toDisplayString(e.unref(h).regions[t]||e.unref(o).unnamed),1)]),e.createElementVNode("button",{type:"button","aria-label":`${e.unref(o).selectRegion} · ${z.value[t]}`,disabled:!e.unref(b),onClick:i=>e.unref(s).markRegion(t)},[e.createVNode(w._sfc_main,{name:"arrow-right",size:13})],8,Ae),(t==="title"||t==="footer")&&e.unref(h).regions[t]?(e.openBlock(),e.createElementBlock("button",{key:0,type:"button","aria-label":`${e.unref(o).clear} · ${z.value[t]}`,onClick:i=>e.unref(s).clearRegion(t)},[e.createVNode(w._sfc_main,{name:"close",size:13})],8,qe)):e.createCommentVNode("",!0)],8,Pe)),64)),e.unref(h).regions.footer?(e.openBlock(),e.createElementBlock("p",Oe,e.toDisplayString(e.unref(o).footerHint),1)):e.createCommentVNode("",!0)]),e.createElementVNode("section",je,[e.createElementVNode("h3",null,[n[25]||(n[25]=e.createElementVNode("b",null,"2",-1)),e.createTextVNode(e.toDisplayString(e.unref(o).mapping),1),e.createElementVNode("span",null,e.toDisplayString(e.unref(y).mapped)+"/"+e.toDisplayString(e.unref(y).total),1)]),e.createElementVNode("label",Ue,[e.createTextVNode(e.toDisplayString(e.unref(o).dataset),1),e.createElementVNode("select",{value:e.unref(h).dataset,"aria-label":e.unref(o).dataset,onChange:n[10]||(n[10]=t=>e.unref(s).chooseDataset(P(t)))},[e.createElementVNode("option",Ge,e.toDisplayString(e.unref(o).chooseDataset),1),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(a.datasets,t=>(e.openBlock(),e.createElementBlock("option",{key:t.id,value:t.id},e.toDisplayString(t.label||t.id),9,Xe))),128))],40,He)]),a.datasets.length?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("p",Je,e.toDisplayString(e.unref(o).noContract),1)),e.unref(K)?(e.openBlock(),e.createElementBlock("label",Qe,[e.createTextVNode(e.toDisplayString(e.unref(o).rowKey),1),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":n[11]||(n[11]=t=>e.unref(h).rowKey=t),"aria-label":e.unref(o).rowKey},[e.createElementVNode("option",Ze,e.toDisplayString(e.unref(o).chooseRowKey),1),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(J),t=>(e.openBlock(),e.createElementBlock("option",{key:t.field,value:t.field},e.toDisplayString(t.label||t.field)+" · "+e.toDisplayString(t.field),9,et))),128))],8,Ye),[[e.vModelSelect,e.unref(h).rowKey]])])):e.createCommentVNode("",!0),e.unref(K)?(e.openBlock(),e.createElementBlock("div",tt,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(X),t=>(e.openBlock(),e.createElementBlock("label",{key:t.index,class:"mr-binding-map"},[e.createElementVNode("span",null,e.toDisplayString(t.physical),1),e.createElementVNode("div",null,[e.createElementVNode("select",{"aria-label":`${e.unref(o).physical} ${t.physical} · ${e.unref(o).business}`,value:t.field,onChange:i=>e.unref(s).setMapping(t.index,P(i))},[e.createElementVNode("option",ot,e.toDisplayString(e.unref(o).chooseField),1),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(K).fields,i=>(e.openBlock(),e.createElementBlock("option",{key:i.field,value:i.field},e.toDisplayString(i.label||i.field)+" · "+e.toDisplayString(i.field),9,lt))),128))],40,nt),t.field?(e.openBlock(),e.createElementBlock("small",at,e.toDisplayString(ee(t.field)),1)):e.createCommentVNode("",!0)])]))),128))])):e.createCommentVNode("",!0),e.unref(K)&&q.value>1?(e.openBlock(),e.createElementBlock("div",rt,[e.createElementVNode("button",{type:"button",disabled:e.unref($)<=0,"aria-label":e.unref(o).previousColumns,onClick:n[12]||(n[12]=t=>$.value--)},[e.createVNode(w._sfc_main,{name:"chevron-left",size:13})],8,it),e.createElementVNode("span",null,e.toDisplayString(e.unref($)+1)+" / "+e.toDisplayString(q.value),1),e.createElementVNode("button",{type:"button",disabled:e.unref($)+1>=q.value,"aria-label":e.unref(o).nextColumns,onClick:n[13]||(n[13]=t=>$.value++)},[e.createVNode(w._sfc_main,{name:"chevron-right",size:13})],8,st)])):e.createCommentVNode("",!0)]),e.createElementVNode("section",ut,[e.createElementVNode("h3",null,[n[26]||(n[26]=e.createElementVNode("b",null,"3",-1)),e.createTextVNode(e.toDisplayString(e.unref(o).identity),1)]),e.createElementVNode("label",ct,[e.createTextVNode(e.toDisplayString(e.unref(o).templateId),1),e.createElementVNode("input",{value:a.lockId?c.identity?.id??e.unref(d).id:e.unref(d).id,autocomplete:"off",readonly:a.lockId,onInput:n[14]||(n[14]=t=>e.unref(d).id=t.target.value)},null,40,dt)]),e.createElementVNode("label",mt,[e.createTextVNode(e.toDisplayString(e.unref(o).templateName),1),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":n[15]||(n[15]=t=>e.unref(d).name=t),autocomplete:"off"},null,512),[[e.vModelText,e.unref(d).name]])])])],8,Ke)])]),e.unref(I)&&e.unref(y).issues.length?(e.openBlock(),e.createElementBlock("div",ft,[e.createElementVNode("strong",null,e.toDisplayString(e.unref(o).issues)+" · "+e.toDisplayString(e.unref(y).issues.length)+" "+e.toDisplayString(e.unref(o).errors),1),e.createElementVNode("ul",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(y).issues.slice(0,12),(t,i)=>(e.openBlock(),e.createElementBlock("li",{key:i},[e.createElementVNode("code",null,e.toDisplayString(t.path),1),e.createTextVNode(e.toDisplayString(t.message),1)]))),128))]),e.unref(y).issues.length>12?(e.openBlock(),e.createElementBlock("span",pt,"+ "+e.toDisplayString(e.unref(y).issues.length-12),1)):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0),e.unref(B).warnings.length?(e.openBlock(),e.createElementBlock("details",vt,[e.createElementVNode("summary",null,e.toDisplayString(e.unref(o).inspectWarning)+" · "+e.toDisplayString(e.unref(B).warnings.length),1),e.createElementVNode("ul",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(B).warnings,(t,i)=>(e.openBlock(),e.createElementBlock("li",{key:i},e.toDisplayString(t),1))),128))])])):e.createCommentVNode("",!0),e.createElementVNode("footer",gt,[e.createElementVNode("span",{class:e.normalizeClass({"is-ready":e.unref(y).ok}),role:"status"},e.toDisplayString(a.readonly?e.unref(o).readonly:e.unref(M)?e.unref(o).applied:e.unref(y).ok?e.unref(o).ready:`${e.unref(o).coverage} ${e.unref(y).mapped}/${e.unref(y).total}`),3),e.createElementVNode("button",{type:"button",disabled:e.unref(V),onClick:n[16]||(n[16]=(...t)=>e.unref(s).check&&e.unref(s).check(...t))},e.toDisplayString(e.unref(o).check),9,yt),e.createElementVNode("button",{type:"button",class:"mr-binding-primary",disabled:e.unref(V)||!e.unref(y).ok,onClick:n[17]||(n[17]=(...t)=>e.unref(s).apply&&e.unref(s).apply(...t))},e.toDisplayString(e.unref(o).apply),9,bt)])],64)):(e.openBlock(),e.createElementBlock("div",me,[n[22]||(n[22]=e.createElementVNode("svg",{viewBox:"0 0 80 80",fill:"none","aria-hidden":"true"},[e.createElementVNode("rect",{x:"15",y:"10",width:"50",height:"60",rx:"8",fill:"#eff6ff",stroke:"#bfdbfe"}),e.createElementVNode("path",{d:"M25 25h30M25 35h30M25 45h30M35 25v30M45 25v30M25 55h30",stroke:"#93c5fd","stroke-width":"1.5"})],-1)),e.createElementVNode("strong",null,e.toDisplayString(e.unref(o).noSource),1),e.createElementVNode("span",null,e.toDisplayString(e.unref(o).sourceOnly),1),e.createElementVNode("button",{type:"button",class:"mr-binding-primary",disabled:a.readonly,onClick:n[2]||(n[2]=t=>k.value?.click())},e.toDisplayString(e.unref(o).upload),9,fe)]))],40,ae))}}),kt=w._export_sfc(ht,[["__scopeId","data-v-acb94ca7"]]);exports.default=kt;