设计器容器内部编辑验收
本页保留容器编辑入口初批验收的构建、测试及输出数字。其后的列宽、合并格结构操作、内部块命令、光标处通栏、数值保真、粘贴、历史与预览状态补齐,按后续编辑流程验收记录,不将下列旧批次数字当作本轮完整回归结果。
容器层级与逻辑入口现已统一到检查器,使用面包屑和直属子内容导航;下述画布工具条及内容选择面板属于旧批次界面。最新交互及证据见模板逻辑与检查器验收。
本次变化
表格、数据列表、数据表格、正文分栏和独立图文栅格提供内部内容入口。插入表格等容器后直接进入首个可编辑内容;再次选中容器时,可双击、按 Enter/F2,或通过“容器内容”面板选择具体单元格、项目模板或内部段落。已有内容可以继续编辑,不必重新填写整个容器。
画布上方的上下文操作条和检查器提供编辑、添加内容及返回容器入口。向当前单元格、栅格项或正文分栏添加段落、图片或表格时,原有内容和模板变量保留;行内单元格先转换为保留原混合内容的段落,再追加新块。普通表格可增删正文行和列,数据表格可调整模板列,结构操作支持撤销/重做。操作说明见设计器指南。
本次调整设计器编辑入口和源模板操作,不改变连续分栏、独立栅格、表格及数组绑定的 Java 模型契约。
后续交互补齐
该批次的画布工具条按选中内容提供内部编辑及结构操作,具体行为如下;对应回归和完整应用证据见后续编辑流程验收。
| 操作 | 当前行为与限制 |
|---|---|
| 表格列宽 | 使用引擎单元格外框定位分隔线,拖动显示 pt,松开写回;方向键 1 pt、Shift+方向键 10 pt、Esc 取消,也可输入精确 pt。调整相邻列并保存为固定 pt;预览未同步、旋转、重复实例或边界不足时不猜测几何,不提供拖柄 |
| 当前格行列与合并 | 可在当前格上/下插行、左/右插列,删除当前行列,打开选格与合并/拆分。合并格跨越插入边界时扩展跨度,删除覆盖行列时缩减跨度,纵向锚格首行删除时保留仍需存在的内容;至少保留一行正文和一列,外部引用继续受保护 |
| 内部段落/表格 | 显式复制或删除单元格、栅格项及正文分栏的直属内容,保留外层容器;正在编辑时先完成文字输入。正文分栏和栅格项的最后一个内容块受保护 |
| 光标处通栏 | 分栏直属段落可在当前光标处分段并插入通栏表格/图片,保留行内结构及作用域,再恢复分栏。非空选区、动态内部和过期光标明确拒绝,图片选择取消不提交结构修改 |
| 示例数组 | 数据列表与数据表格共用原文追加候选,既有 JSON 数字 token 保持不变;取消选择不新增模板或示例数据 |
| HTML 表格粘贴 | 优先保留剪贴板纯文本;只有 HTML 时转换为 Tab/换行分隔文字,保留格内换行。写入当前正文,不提供二维填格或自动建表 |
| 撤销与预览 | 本地源码/数据历史最多 100 步,服务端项目/资源快照最多 8 步,跨资源恢复验证失败不推进历史;预览区分待更新、校准中、失败、已同步,并校验源码、数据、资源及文档会话是否仍匹配 |
自动验证
在 Windows、JDK 21、Node.js 24 和 Chrome 环境中,从仓库根目录构建:
.\gradlew.bat --max-workers=1 --no-parallel `
:export4j-designer:test :export4j-designer:installDist :export4j-designer:distZipLinux/macOS 使用 ./gradlew。前端完整回归入口为:
$env:EXPORT4J_STUDIO_OUTPUT='build/verification/designer-container-ux/full-browser'
Push-Location export4j-designer/frontend
node --test tests/studio.test.mjs tests/grid.test.mjs tests/bindings.test.mjs tests/containers.test.mjs
Pop-Location设计器 55 项 Java 测试通过,安装分发及 ZIP 分发构建成功。完整前端回归报告 97 项通过,无失败或跳过,包含实际浏览器交互、栅格、变量作用域及容器 XML 操作检查。随后修复了选择第二个块单元格却进入首格的问题,并增加草稿提交及关闭文字浮层的断言;重建设计器后,使用最终生产文件执行以下定向回归,4 个容器浏览器场景及父测试共 5 项通过。修复后没有再运行完整 97 项回归。
$env:EXPORT4J_STUDIO_OUTPUT='build/verification/designer-container-ux/reviewed-browser'
$env:EXPORT4J_STUDIO_SCENARIOS='container ux'
Push-Location export4j-designer/frontend
node --test tests/studio.test.mjs
Pop-Location
Remove-Item Env:EXPORT4J_STUDIO_SCENARIOS浏览器测试使用独立临时服务,结束时关闭服务及浏览器。新增场景覆盖:
| 场景 | 实际检查 |
|---|---|
| 表格插入与结构编辑 | 插入后编辑首格,返回表格后用 F2 再次进入;增加行、增加列、删除当前行列及撤销/重做;表头原文保持 |
| 空数组模板编辑 | records: [] 时,通过侧栏编辑 list 项目和 rows 正文格;JSON 始终保持空数组,随后加载真实数据、下载模板 ZIP 及 PDF |
| 追加及精确定位 | 栅格项内追加第三段;向行内单元格追加段落时保留原文字、bold 和变量;选择第二个块格编辑并返回容器,首格不变、草稿已提交、文字浮层关闭 |
| 栅格内图文 | 在指定左格加入图片及可继续编辑的表格,右格内容不变,并下载真实 PDF |
容器 XML 场景另外检查表头与正文同步增删列、最小行列数、合并格限制、外部引用保护、空数组可定位源模板、唯一列表/正文行模板、非法声明及源结构预算。内部内容定位来自源 XML,不依赖页面命中区域或数组中已有数据。
文件及独立渲染
最终定向回归实际下载的 container-ux-template.zip 通过 ZIP CRC、成员名唯一性及 XML 解析检查。数据列表保留唯一 bullet 模板、items="records" 和 as="item";数据表格保留唯一正文行模板及 as="record"。两处正文分别保留 EMPTY-LIST ${item.name} 和 EMPTY-ROW ${record.name},ID 没有重复,绑定值没有写回模板。
两份 PDF 共两页,使用 pypdf 6.10.0 独立检查文字、源阅读顺序、唯一性、图片及几何:
| 产物 | 结构及内容检查 |
|---|---|
container-ux.pdf | 一页;真实数据分别填入列表和表格,每段正文出现一次;标题、列表、表头及正文按源顺序绘制;没有未绑定变量原文 |
container-ux-mixed.pdf | 一页;A4、42 pt 页边距、两等分和 12 pt 沟槽;左格依次保留文字、图片、表格,右格正文唯一且未改变;图片为 40×24 像素、绘制为 72×48 pt,内容未越格或互相覆盖 |
Poppler 26.07.0 和 PDFium(pypdfium2 5.13.0)以 192 DPI 独立渲染全部两页,使用 Pillow 12.3.0 按固定 blur 2 px 比较:
| 平均通道误差 | 变化像素比例 | |
|---|---|---|
container-ux.pdf | 0.251927 | 0.001134 |
container-ux-mixed.pdf | 0.183595 | 0.001670 |
两项均小于既有阈值 4/0.06,没有刷新视觉基线。已逐页目视检查最终 Poppler 渲染,未发现裁切、重叠或内容串格。最终文件与界面截图位于 build/verification/designer-container-ux/reviewed-browser/,独立结构、几何及双渲染报告位于 build/verification/designer-container-ux/output-reviewed/verification.json。
能力边界
- 空数组时可继续编辑源模板;
rows绑定空数组仍由核心报告EMPTY_TABLE。编辑入口不向数据加入假记录,真实预览或测试导出须提供有效记录,或由模板现有条件机制决定是否生成表格。 list保存一个项目模板,rows保存一个正文行模板;实际项目或记录数量和顺序由 JSON 数组决定,不通过复制模板项增加记录。列表项保持列表语义,不提供任意块容器嵌套。- 普通表格至少保留一行正文和一列;表头不会因删除正文行而删除。初批对合并格增删行列的限制已由后续跨度维护补齐;当前行为见上表。删除真正被移除且仍被外部引用的节点,须先调整引用。
- 含
style-if的行内格转换为块格前,须明确移除条件规则,设计器不会自动丢弃规则。正文分栏和栅格原有嵌套限制继续生效。 - 独立栅格各格分别编写,正文不会自动流入相邻格;连续正文使用正文分栏。光标处通栏通过拆分前后分栏实现,连续正文绕过仅跨部分栏的浮动图表仍不在范围内。
- 本轮没有新增 DOCX/Word 阅读器或任意容器嵌套验收,也未重验全部 ManuWeave 模板。构建和本地运行不等于提交、推送或正式发布。