Skip to content

[fields,plugin-form] 内嵌子表把 datetime/time 列折叠成 date 控件:时间分量在编辑时被静默丢弃 #3569

Description

@baozhoutao

现象(读码 + 真机确认接口形状)

packages/plugin-form/src/deriveMasterDetail.tsfieldTypeToColumnType 把三种字段类型
折叠成同一个网格列类型:

case 'date':
case 'datetime':
case 'time':
  return 'date';

GridFieldtype === 'date' 只会渲染 input[type=date]GridField.tsx:764)。于是
一个 datetime 子表字段在内嵌网格里:

  1. :控件只能显示日历日,时间分量在界面上不存在;
  2. onChange 交出的是控件自己的 YYYY-MM-DD时间被静默丢弃 —— 用户只是碰了一下
    日期,记录里的 14:30 就没了;
  3. time 类型同理,被喂进一个日期控件。

真机取证(framework showcase,本地 objectstack dev):date 字段接口回 "2026-08-04"
datetime 字段接口回 "2026-08-07T16:39:20.389Z" —— 即 datetime 列拿到的一定是完整 ISO。

为什么现在才浮出来

#3566 修的是 date 列把 ISO 形状喂进 input[type=date] 导致单元格空白。那条修复顺带让
datetime 列从「空白」变成「显示日历日」,不再更差,但也没变对 —— 真正的缺口是类型折叠本身。

预期

datetime 列应渲染 input[type=datetime-local],读写各用 toDateTimeInputValue /
fromDateTimeInputValuepackages/fields/src/widgets/nativeDateValue.ts#3127 已落地并配对
使用),与 DateTimeField 的约定一致;time 列同理需要自己的形态,而不是继续借用日期控件。

建议改法(跨两个包,故未并进 #3566

  • packages/fields/src/widgets/GridField.tsxGridColumn['type'] 联合类型加 'datetime'
    单元格按类型选择控件与读写适配器。
  • packages/plugin-form/src/deriveMasterDetail.tsfieldTypeToColumnType 停止把 datetime
    折叠到 date
  • 只读展示面同一处缺口:GridField.tsxdisplayText():277String(value) 兜底)和
    只读表格 :632String(row[c.field]),对 date/datetime 列都会把原样 ISO 字符串印到界面上
    (例如 2026-06-17T00:00:00.000Z)。修 datetime 列时应一并处理 —— 之所以不能在 [fields] GridField 子表 date 列不回显 ISO 形状的值:String(val) 直喂 input[type=date],同 #3127 的同族缺口 #3566 里单独
    改,正是因为在类型折叠没解开之前,GridField 无从分辨该显示「日」还是「日 + 时间」,按日渲染
    会把 datetime 的时间分量从展示里抹掉。

出处

#3566GridField date 列不回显 ISO 值)实施时按范围纪律排除的同族面。

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions