You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
[fields,plugin-form] 内嵌子表把 datetime/time 列折叠成 date 控件:时间分量在编辑时被静默丢弃 #3569
Release board: target:v17 applied — class ①, the embedded sub-table folds datetime/time columns into a date control, so touching the date on an existing row silently discards the stored time component on save: user-visible data loss on a shipped editing surface. One-time stock pass per objectstack#6904 (maintainer directive 2026-08-09).
Delegated GO — PRs opened (objectui seat PM, session session_017Qqyix2QcnpUC9XeYVDzx3).
Authorization: maintainer directive (2026-08-10, this seat's session) —「还是优先v17,需要人决策的你先看看能不能站在产品长远稳定角度代为决策」. The open decision on this card was exactly the PR go-ahead the round-2 review left gated, so it falls squarely under the delegation. Veto window: open until merge — say the word and both PRs close, branches kept.
Decision basis, from the product-stability lens: class ① user-visible data loss on a shipped editing surface; both halves implemented and real-browser verified two days ago with timezone drift explicitly excluded (UTC−7 both directions), 1304 unit tests green, falsification-first test discipline; the stacking base #3718 merged to main on 08-08 so the branch is now a pure single-card delta. Holding a verified data-loss fix out of the release window has no stability upside.
framework: objectstack#7328 (fixture branch @ ab36336e7) — auto-merge not grantable to this credential in that repo; this seat merges it manually once checks are green.
The known-and-filed gap (time control has unit tests but no live fixture — objectstack#6533) stays open and non-blocking, per the round-2 review.
Activity
baozhoutao commentedon Aug 8, 2026
Claim: PM loop round 2
Branch (objectui):
claude/issue-3569-grid-datetime-columnBranch (framework):
claude/issue-3569-showcase-datetime-fixtureWorktrees:
objectui-issue-3569/framework-issue-3569与 #3566 的关系:栈式,不并行
本单要改的正是 #3566 刚改过的那一行(
GridField.tsx的单元格value=),两者文件不相交是不成立的。#3566 的 PR #3718 已开(draft,待合并),因此本单分支基于claude/issue-3566-gridfield-date-input开,diff 只含本单改动;#3718 并入 main 后 GitHub 自动 retarget。开发 agent 只读不写那条分支。跨仓:objectui 修复 + framework 夹具
已核实 —— showcase 里没有任何内嵌网格子对象带
datetime/time字段:showcase_expense_line(inlineEdit: 'grid'):merchant / category / amount / billable / status / incurred_on(date)showcase_invoice_line(inlineEdit: 'grid'):position / product / description / quantity / unit_price / receipt / amount也就是说本缺陷当前在 showcase 上无法真机复现,而本仓约定要求夹具长期留在
examples/app-showcase里。所以本单落两个仓:objectui 出修复,framework 出一条永久夹具(给某个 grid 子对象加datetime字段并种入真实 ISO 值)。好消息是这条不需要 #3566 那种改写代理:已实测该后端不规整
datetime,接口原样回2026-08-07T16:39:20.389Z,夹具建好即可直接复现。相关但不构成阻塞:objectstack-ai/objectstack#6328(那条讲的是date字段读写两侧都被规整)。判据
datetime 子表列必须渲染
input[type=datetime-local],读写成对走toDateTimeInputValue/fromDateTimeInputValue;可证伪点是时间分量:改一次日期后,记录里的14:30必须还在。Generated by Claude Code
baozhoutao commentedon Aug 8, 2026
Review: PM loop round 2 — 两仓均已实现并推送,PR 待维护者确认后开。
claude/issue-3569-grid-datetime-column@25e6ae22e,栈在claude/issue-3566-gridfield-date-input(fix(fields): 内嵌子表 date 列回显存量 ISO 值 (#3566) #3718)之上。fix(fields): 内嵌子表 date 列回显存量 ISO 值 (#3566) #3718 至今仍是 open draft(mergeable_state: clean,15 项检查全绿、2 项 skipped),未合并,所以栈式基底成立;它并入 main 后 GitHub 自动 retarget。claude/issue-3569-showcase-datetime-fixture@ab36336e7,基于origin/main。改动(亲核 diff)
objectui 5 文件 / +303 −14,framework 2 文件 / +38 −13。无截图、无临时脚本混入。
fieldTypeToColumnType停止三合一,GridColumn['type']加'datetime'/'time',各自配控件与适配器:datetime→input[type=datetime-local],读走toDateTimeInputValue、写在coerce()里走fromDateTimeInputValue—— 成对使用,读写同基准,与DateTimeField同约定;time→input[type=time],HH:mm[:ss]原样往返;date不变,仍保持YYYY-MM-DD原样透传(差一天的防线没被动)。只读面按 issue 要求一并修了:新
temporalText()撑起displayText(),只读表的String(row[c.field])对三种时间类型改走它,其余列类型路径不动。一个值得点名的连带修正:
TYPE_FILL_PRIORITY也补了datetime: 3/time: 3。不补的话两个新类型会静默掉进 unknown 档(5),被挤出内联列预算 —— 这是拆类型时很容易漏的次生效应。changeset:
minor,理由成立@object-ui/fields+@object-ui/plugin-form各minor。虽是修复,但GridColumn['type']是导出联合类型,作者显式写columns时现在可以声明type: 'datetime'/'time'—— 以前是类型错误,属新增可授权面,所以不是纯 patch。未声明major(check-changeset-no-major.mjs已跑过)。framework 侧不写:@objectstack/example-showcase是private,不在 fixed 组。证据
单测:
packages/fields/ packages/plugin-form/→ 97 files / 1304 tests passed;type-check 13/13;lint 0 errors。新增 8 条 GridField 测 + 1 条fieldTypeToColumnType用例,并删掉了那条已变假的expect(fieldTypeToColumnType('datetime')).toBe('date')(而不是留着)。墙钟期望值在运行时由Date现算、日期位移按本地分量做,所以不吃时区/夏令时。framework:
pnpm validate→✓ Validation passed,pnpm typecheck干净,app-showcase 13 files / 146 tests passed。真机(后端
:4310--fresh+ console:5310,注入 API token 登录、未键入密码;EXP-2003,本地 PDT = UTC−7):input[type=date]2026-08-05,14:30 在界面上不存在2026-08-06T00:00:00.000Z← 时间被抹掉input[type=datetime-local]2026-08-05T07:302026-08-06T14:30:00.000Z← 时间保留r.incurred_at === new Date(r.incurred_at).toISOString()→ true,即fromDateTimeInputValue的 ISO,不是裸本地串。incurred_on后,同一网格里Incurred At是 datetime-local、Incurred On是 date,两者并存正确。全页innerText未出现任何裸 ISO。一处如实说明:CDP 合成击键进不了原生日期控件的内部分段编辑器,所以单元格改值是用原生
HTMLInputElementvalue setter + 冒泡 input/change 事件驱动的(与真实击键走同一条 ReactonChange)。点「编辑」、开列选择器、点「更新」、网络往返都是真实交互,且以上断言全部回读自 API/DB 而非 DOM。需要维护者知悉的两点
time控件有单测、无真机夹具 —— 已报 [showcase] 内嵌子表 time 列没有真机夹具:两个 inlineEdit 网格都无自然落脚点,且都已顶到 6 列预算 objectstack#6533(未认领、未加任何pm:*标签)。原因是成本而非省事:两个inlineEdit: 'grid'子对象都已顶到 6 列默认预算,加 time 列会把receipt([fields] Field.file 在 inline grid 退化为文本框、无法上传,且被自动子表列排除 #2360 的 file-in-grid 夹具)挤进列选择器。控件本身仍随本单实现,因为留一半会让后续单重写同几行。expense_line现有 7 个可编辑字段对 6 列预算,incurred_on按声明顺序落入列选择器(实测是「可选列」里唯一一条)。刻意让 datetime 占住可见位,已在对象注释里写明。Generated by Claude Code
os-project-manager commentedon Aug 9, 2026
Release board:
target:v17applied — class ①, the embedded sub-table foldsdatetime/timecolumns into a date control, so touching the date on an existing row silently discards the stored time component on save: user-visible data loss on a shipped editing surface. One-time stock pass per objectstack#6904 (maintainer directive 2026-08-09).Generated by Claude Code
yinlianghui commentedon Aug 10, 2026
Delegated GO — PRs opened (objectui seat PM, session
session_017Qqyix2QcnpUC9XeYVDzx3).Authorization: maintainer directive (2026-08-10, this seat's session) —「还是优先v17,需要人决策的你先看看能不能站在产品长远稳定角度代为决策」. The open decision on this card was exactly the PR go-ahead the round-2 review left gated, so it falls squarely under the delegation. Veto window: open until merge — say the word and both PRs close, branches kept.
Decision basis, from the product-stability lens: class ① user-visible data loss on a shipped editing surface; both halves implemented and real-browser verified two days ago with timezone drift explicitly excluded (UTC−7 both directions), 1304 unit tests green, falsification-first test discipline; the stacking base #3718 merged to main on 08-08 so the branch is now a pure single-card delta. Holding a verified data-loss fix out of the release window has no stability upside.
claude/issue-3569-grid-datetime-column@25e6ae22e, now vs main) — auto-merge armed (MERGE @ 2026-08-10T06:48:04Z).ab36336e7) — auto-merge not grantable to this credential in that repo; this seat merges it manually once checks are green.The known-and-filed gap (time control has unit tests but no live fixture — objectstack#6533) stays open and non-blocking, per the round-2 review.
Generated by Claude Code
fix(fields,plugin-form): 内嵌子表 datetime/time 列按类型渲染控件,时间分量不再丢失 (object…