背景
objectui#3569 拆开了内嵌子表里 date / datetime / time 三种字段类型被折叠成同一个 date 网格列的缺陷。修复(objectui 分支 claude/issue-3569-grid-datetime-column)三种控件都实现了:
datetime → input[type=datetime-local],读写配对走 toDateTimeInputValue / fromDateTimeInputValue
time → input[type=time],原样往返存储的 HH:mm[:ss]
date → 不变
datetime 那条已经在 showcase 里落了长期夹具(showcase_expense_line.incurred_at,见 objectstack 分支 claude/issue-3569-showcase-datetime-fixture)并做了真机 BEFORE/AFTER 实测。
缺口
time 列没有任何 showcase 真机夹具 —— 它只有单元测试覆盖,没有在运行中的 app 里被走过一遍。
showcase 目前只有两个 inlineEdit: 'grid' 的子对象,两个都没有合适的时间字段落脚点:
showcase_expense_line(src/data/objects/expense-report.object.ts)—— 已经有 incurred_at(datetime) + incurred_on(date)。再加一个纯 time 与 incurred_at 语义重复,参考应用里不该出现这种冗余字段。
showcase_invoice_line(src/data/objects/invoice.object.ts)—— T&M 服务行的「服务开始时间」勉强自然,但……
而且两个网格都已经踩到 6 列的内嵌列预算上限(objectui DEFAULT_MAX_INLINE_COLUMNS),再加一列会把一个现有夹具列挤进列选择器:
- invoice_line 加一列 →
receipt(file 列,objectui#2360 的夹具)从默认可见掉进选择器;
- expense_line 再加一列 → 又一个列被挤下去。
也就是说,硬塞一个 time 字段的代价是降级另一个夹具的默认可见性 —— 这才是把它排除在 #3569 之外的真实原因,不是懒。
time 类型平台是支持的:packages/spec/src/data/field.zod.ts 有 'time',field-value.zod.ts 按 HH:mm[:ss] 校验,showcase_field_zoo.f_time 已经种了 '14:30'(但 field_zoo 不是内嵌网格子对象,走不到这条渲染路径)。
建议
给 time 列一个自然的内嵌网格落脚点,二选一:
- 新开一个语义上本来就需要时间的 master-detail 子对象(如「排班行 / shift line」:日期 + 开始时间 + 结束时间 + 时长),顺便把
date + time 两种形态在同一个网格里演示掉;
- 或者在
showcase_invoice_line 上加 service_start(time),并同时用 inlineColumns 显式声明列集合,避免把 receipt 挤进选择器。
无论哪种,seed 值要给非零、可辨认的时钟(如 '09:15'),并在注释里写明它是 #3569 的 time 夹具。
出处
objectui#3569 实施时按范围纪律排除的同族面。控件本身已随该 PR 落地并有单元测试(packages/fields/src/widgets/GridField.test.tsx,「renders a time column as a time control and round-trips HH:mm verbatim」)。
背景
objectui#3569 拆开了内嵌子表里
date/datetime/time三种字段类型被折叠成同一个date网格列的缺陷。修复(objectui 分支claude/issue-3569-grid-datetime-column)三种控件都实现了:datetime→input[type=datetime-local],读写配对走toDateTimeInputValue/fromDateTimeInputValuetime→input[type=time],原样往返存储的HH:mm[:ss]date→ 不变datetime那条已经在 showcase 里落了长期夹具(showcase_expense_line.incurred_at,见 objectstack 分支claude/issue-3569-showcase-datetime-fixture)并做了真机 BEFORE/AFTER 实测。缺口
time列没有任何 showcase 真机夹具 —— 它只有单元测试覆盖,没有在运行中的 app 里被走过一遍。showcase 目前只有两个
inlineEdit: 'grid'的子对象,两个都没有合适的时间字段落脚点:showcase_expense_line(src/data/objects/expense-report.object.ts)—— 已经有incurred_at(datetime) +incurred_on(date)。再加一个纯time与incurred_at语义重复,参考应用里不该出现这种冗余字段。showcase_invoice_line(src/data/objects/invoice.object.ts)—— T&M 服务行的「服务开始时间」勉强自然,但……而且两个网格都已经踩到 6 列的内嵌列预算上限(objectui
DEFAULT_MAX_INLINE_COLUMNS),再加一列会把一个现有夹具列挤进列选择器:receipt(file 列,objectui#2360 的夹具)从默认可见掉进选择器;也就是说,硬塞一个 time 字段的代价是降级另一个夹具的默认可见性 —— 这才是把它排除在 #3569 之外的真实原因,不是懒。
time类型平台是支持的:packages/spec/src/data/field.zod.ts有'time',field-value.zod.ts按HH:mm[:ss]校验,showcase_field_zoo.f_time已经种了'14:30'(但 field_zoo 不是内嵌网格子对象,走不到这条渲染路径)。建议
给
time列一个自然的内嵌网格落脚点,二选一:date+time两种形态在同一个网格里演示掉;showcase_invoice_line上加service_start(time),并同时用inlineColumns显式声明列集合,避免把receipt挤进选择器。无论哪种,seed 值要给非零、可辨认的时钟(如
'09:15'),并在注释里写明它是 #3569 的 time 夹具。出处
objectui#3569 实施时按范围纪律排除的同族面。控件本身已随该 PR 落地并有单元测试(
packages/fields/src/widgets/GridField.test.tsx,「renders a time column as a time control and round-trips HH:mm verbatim」)。