Files
workspace/code/g3soft-libs/.changeset/table-date-editor.md
T
2026-10-15 22:47:42 +08:00

19 lines
3.7 KiB
Markdown

---
'@g3soft/ui': minor
---
G3Table 新增日期编辑器(`editor.type: 'date'`),并为 G3DatePicker 补上无缝模式与两个对外方法。
- **`editor.type: 'date'`**:点格即弹日历(不必先点输入框),也支持手输;值始终是**字符串**,不做 `Date` ↔ string 的隐式转换。
- `format` 同时决定面板精度与绑定值格式(默认 `YYYY-MM-DD`;写 `'YYYY-MM-DD HH:mm'` 即变成日期时间,选完要点「确定」才提交)。界面格式与存储格式不同时用 `valueFormat`。
- 校验 / 失败原因浮层 / 禁用灰底 / `errorStyle` 与其它编辑器完全一致,没有另开一套。
- 它是**唯一「只给当前格挂编辑器」**的类型:切换格时新格是重新挂载,日历才会跟着弹开。若跟着整行挂载,同行内从别的列切到日期格就不会重新挂载、面板不弹,表现为「有时弹、有时不弹」这种最难解释的不一致。顺带也更省 —— 不激活时是纯展示 span,而 DatePicker 是浮层组件。
- **`G3DatePicker` 新增 `seamless`**:去掉触发器的 32px 下限 / 内边距 / 描边 / 圆角。与 `G3Select` 的 `seamless` 同因同解 —— 那些盒子在 Popover 内部,从表格侧写后代选择器命中不到(权重相同、顺序不可控),必须在组件自己的样式块里覆盖。不开的话 32 > 30 会把表格行顶高,看着像「格子里浮着一个小卡片」。
- **`G3DatePicker` 新增 `defineExpose({ openPanel, commitPending })`**:前者供表格挂载后主动展开面板,后者供表格在编辑器**卸载前**把没提交的手输文本交掉。
- **修一个「手输的日期会静默丢失」的真问题**:关闭面板时原先直接清空了内部草稿,而「点到别处」这条路径**不会**经过 `input` 的 `blur` —— 表格在 mousedown 阶段 `preventDefault`(避免点击干扰单元格选区),焦点压根没离开输入框。于是用户敲完日期点别的格,值就地消失。现在**关闭面板时先提交再收尾**;Esc 分支已在 `onKeydown` 里先把草稿清成 null,所以「按 Esc 取消」依然是取消而非提交(那个顺序不能反)。
- 配套:playground 新增一张独立的小日期表(`table-date-wrap`)作为 e2e 宿主(没往 `table-wrap` 里加列 —— 那张表的列序被 Tab 跳格用例逐格锁着);erp 的 `table-test` 页面把「开航日 / 截单日」两列从 `text` 换成 `date`(后者带时间精度)。
- **手输解析不出来时不再静默丢弃**:`G3DatePicker` 新增 `invalidInput` 事件(默认无监听者,表单行为不变),表格监听它把原文**写进行数据**,再由一条内置的日期校验标红并给出原因「日期格式不正确」—— 与「金额输 0」「数量超精度」同一套立场:值不合法不等于要抹掉它。配套导出 `checkDate(value, format)`,与组件内置判定**是同一个函数**,供业务在保存前拦提交。
- 判定口径刻意**跟随 `G3DatePicker` 手输解析的那个 `parseDateInput`**(不是自己写一套):否则会出现「手输时组件接受了、退回展示态又被标红」这种自相矛盾。注意**不要**换成 `parseDate` —— 它是宽松解析、会退到原生 `new Date()` 兜底,把 `2026-13-45` 这类越界文本「救活」(`parseDateInput` 里那道 `DATE_LIKE_TEXT` 保护正是拦这个的)。
- 顺带记录的既有口径:分隔符会被规范化(`2026/03/15` 算合法),而配了时间精度的列只给到「日」算不合法。
- e2e 新增三条:点格弹面板并选日期写回字符串;必填校验 + 手输失焦后写回;手输非法日期时值原样保留、标红、悬停能看到原因。