Skip to content

导出/导入文件名与多语言优化:显示名+视图名+时间戳命名、模板全中文、导出↔导入选项标签闭环 #2916

Description

@baozhoutao

背景(用户反馈,3 个递进诉求)

  1. 导出文件名难用:CSV/Excel 导出直接落盘为 contracts.csv 这种裸 API 名,重复导出互相覆盖、中文用户不可读。期望「对象显示名-时间戳.扩展名」。
  2. 导入「下载模板」仍有英文:表头漏出 "Owner"/"Done"/"Sync Status" 等英文,示例行是 Backlog/prepare 这类 slug/英文标签。深挖后还发现平台级缺陷:导出/模板写出的是翻译后的选项标签,但导入 coercion 只认作者原始标签——用户把自己刚导出的中文文件原样导回,select 字段全报 invalid_option(导出↔导入闭环断裂)。
  3. 文件名希望带上视图名:同一对象不同保存视图(如 In Progress / Done)的导出文件名完全相同,无法区分。

方案与范围

objectui(前端,PR objectstack-ai/objectui#2491)

  • buildExportFileName(ext, { prefix, label, objectName, viewLabel }, now?):生成 对象显示名-视图名-yyyymmdd-hhmmss.扩展名;exportOptions.fileNamePrefix 仍为完整前缀;视图名与对象名重复时省略;80 字符截断 + 非法字符清洗(保留 Unicode)。
  • ObjectGrid / ListView 全部导出路径统一走它;app-shell 与 plugin-view 的 ObjectView 把 viewDef.label 写进传给 ListView 的 schema(此前从不传递)。
  • 导入模板:示例行优先取选项显示标签;模板文件名本地化 {{object}}-导入模板.csv。

framework(服务端,PR #2911)

  • GET /data/:object/export 的 Content-Disposition 改为「对象显示名-时间戳」,RFC 5987/6266 双写(ASCII 兜底 + filename*=UTF-8''…)。
  • 系统字段(owner_id/created_at/…)标签内置 en/zh-CN/ja-JP/es-ES 回退,修掉 "Owner" 漏出。
  • 导入接受翻译后选项标签:prepareImportRequest 新增 localizeSchema 钩子,REST 导入路由传 translateMetaItem,翻译标签并入选项匹配同义词;作者标签/选项 code 照常,非法值照常报错。
  • plugin-reports 附件文件名清洗保留 Unicode;showcase 补全 showcase_task 翻译包并开启导出演示。

验收标准(均已真机 UI 实测通过)

  • 导出 CSV/XLSX 落盘名:任务-In Progress-20260714-082725.csv / …-082801.xlsx
  • 模板落盘名 任务-导入模板.csv,表头与示例行零英文(所有者,…,同步状态,同步错误 + 待规划/低/已同步)
  • 中文导出文件原样导回:dry-run {"total":1,"ok":1,"errors":0};英文标签不回归;非法值仍报 invalid_option
  • 单测:rest 265/265、spec 6756、export-filename 15/15、plugin-list 149、plugin-grid 194、plugin-view 28、app-shell 698
  • 双仓 PR CI 全绿

关联

Activity

  1. baozhoutao commented on Jul 14, 2026

    @baozhoutao
    ContributorAuthor

    真机 UI 实测报告(汇总)

    环境:objectstack dev :3000(showcase,--seed-admin)+ objectui console Vite :5180,zh-CN 会话;下载物通过 hook HTMLAnchorElement.click(读 a.download)+ URL.createObjectURL(读 blob 原文)捕获真实落盘文件名与内容,非代码推断。

    1. 导出文件名:对象显示名-视图名-时间戳 ✅

    操作 实际下载文件名
    任务 → In Progress 视图 → 导出为 CSV 任务-In Progress-20260714-082725.csv
    任务 → In Progress 视图 → 导出为 XLSX 任务-In Progress-20260714-082801.xlsx
    (第一轮,视图名功能前)导出 CSV / XLSX 任务-20260714-064550.csv / 任务-20260714-064607.xlsx

    服务端 Content-Disposition 同步验证:curl -H 'Accept-Language: zh-CN' …/export?format=xlsx → filename="showcase_task-…xlsx"; filename*=UTF-8''任务-….xlsx(RFC 5987 双写);en-US → Task-….csv。

    2. 导入「下载模板」全中文 ✅

    文件名:任务-导入模板.csv。真实 blob 内容:

    所有者,标题 *,项目 *,负责人,状态 *,优先级,预计工时,进度,已完成,截止日期,开始日期,结束日期,创建时间,工作地点,封面,标签,备注,同步状态,同步错误
    ,,,,待规划,低,0,,true,2024-01-31,2024-01-31,2024-01-31,2024-01-31 09:00,,,,,已同步,

    两轮遗留英文(Owner/Done/Labels/Sync Status 表头,Backlog/Low/Synced 示例值)全部消除。导出 CSV 单元格同样中文化(进行中/高/紧急)。

    3. 导出↔导入闭环(本次发现并修复的平台缺陷)✅

    dry-run POST /api/v1/data/showcase_task/import,Accept-Language: zh-CN:

    输入 结果
    中文往返测试,…,待规划,紧急(翻译标签) {"total":1,"ok":1,"errors":0,"created":1} ✅
    无locale英文标签,Backlog(作者标签,无 locale) ok:1 ✅ 不回归
    非法值仍报错,不存在的状态 invalid_option: "不存在的状态" is not a known option ✅ 仍拦截

    4. 边界行为

    • All Tasks 视图未配 exportOptions → 无导出按钮(符合预期,不受影响)
    • fileNamePrefix 配置后作为完整前缀,不追加视图名;视图名与对象名重复时自动省略;80 字符截断;非法字符清洗但保留中文

    5. 单测与 CI

    带截图的分轮详细报告见 PR 评论:

  2. baozhoutao commented on Jul 14, 2026

    @baozhoutao
    ContributorAuthor

    操作截图(真机 UI 实测,Playwright + Chromium,zh-CN 会话)

    本轮为发 issue 独立复测一遍(2026-07-14),真实下载名由浏览器 download 事件捕获:

    操作 实际下载文件名
    任务 → In Progress → 导出为 CSV 任务-In Progress-20260714-094541.csv
    任务 → In Progress → 导出为 XLSX 任务-In Progress-20260714-094543.xlsx
    导入 → 下载模板 任务-导入模板.csv

    1. In Progress 视图网格(状态/优先级全中文:进行中、高、紧急)

    In Progress 网格

    2. 导出弹层(导出为 CSV / XLSX / JSON)

    导出弹层

    3. 导入对话框(下载模板入口,全中文)

    导入对话框

    本次下载的模板内容(真实文件原文,表头+示例行零英文):

    所有者,标题 *,项目 *,负责人,状态 *,优先级,预计工时,进度,已完成,截止日期,开始日期,结束日期,创建时间,工作地点,封面,标签,备注,同步状态,同步错误
    ,,,,待规划,低,0,,true,2024-01-31,2024-01-31,2024-01-31,2024-01-31 09:00,,,,,已同步,

    导出 CSV 内容:

    标题,项目,负责人,状态,优先级,截止日期
    Build homepage,Website Relaunch,sam@example.com,进行中,高,2026-07-24
    Ingest pipeline,Data Platform,linus@example.com,进行中,紧急,2026-08-03

    截图托管在本仓 assets/issue-2916-screenshots 分支(孤儿提交,不进 main)。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions