Closed as duplicate
Labels
bugSomething isn't workingSomething isn't workingpriority:p2Medium: important, M3Medium: important, M3repo:objectuiSeam card: cross-repo ordering with objectui is the substance (pure objectui fixes live in objectui)Seam card: cross-repo ordering with objectui is the substance (pure objectui fixes live in objectui)
Description
来源:宣传视频车道 #147 排镜时的只读实测。未改动任何平台代码、配置或声明。
本单只描述现象,不预设修正方向。 是否算缺陷、以及该怎么处理,留给负责人裁定。故不带
pm:queue——请先分级。
现象
日历视图打开后默认落在当月。此时点主标题栏的「下一月」,落到的是两个月之后,中间那个月被跳过。
实测当天为 2026-08-31,默认月 August 2026。每组均重开日历后从默认月起:
| # | 点击序列与落月 |
|---|---|
| 1 | August → next → October → next → November → next → December |
| 2 | August → prev → July → prev → July*(见附注) → prev → June |
| 3 | August → prev → July → next → August → next → October |
| 4 | August → next → October → prev → September → next → October |
规律:
- 从「今天所在的那个月」按「下一月」必定跳两个月、跳过 September —— 第 1、3、4 组各命中一次,3/3 可重现;
- 其它月份的
next正常 +1 —— July→August、October→November、November→December、September→October 均正确; prev基本 −1,未见跳月。
注意第 3 组:从 July 点 next 回到 August(当月)之后,再点 next 又跳到 October。所以触发条件是**「当前显示的月份 == 今天所在的月份」**,不是「刚打开」。
同一个操作,在月份弹层里是正常的
这是本单最有价值的对照:点标题 August 2026 弹出的小月历选择器里,也有一组上/下月箭头——那组箭头没有这个问题。
| 入口 | 从当月点「下一月」 |
|---|---|
| 主标题栏的箭头 | August → October(跳过 September) |
| 月份弹层内的箭头 | August → September(正确 +1) |
也就是说,同一个"翻到下一月"的语义,两个入口的行为不一致,其中一个只在特定条件(当前月 == 今天所在月)下出错。
复现最小路径
- 打开任一带
calendar:配置块的列表视图,切到日历呈现(默认落在当月); - 点主标题栏的「下一月」一次 → 落到两个月之后;
- 对照:重开日历,点标题弹出月份选择器,在弹层内点「下一月」一次 → 落到下一个月,正确。
附注(如实标注,不作为判据)
第 2 组中出现过一次 prev 原地不动(July → July)。只观察到一次,未能稳定复现,可能是自动化点击间隔不足被吞。本单不把它算作现象的一部分,仅记录以免后续有人重复观察到时以为是新问题。
取证环境
2026-08-31,载体 objectstack-ai/hotcrm,钉 @objectstack/* 17.1.0。纯只读实测;元素级 DOM 点击与常规坐标点击结果完全相同,排除自动化伪影。
邻近既有单(已查,非重复)
- 视图声明 calendar 可视化但缺 calendar 配置块时,平台不报错——直接渲染成一屏错位画面(全部记录堆在今天) #13748 视图声明 calendar 可视化但缺
calendar:配置块时静默渲染成错位画面(同为日历呈现,但那条是配置不完整时的渲染行为,本条是导航控件的步长,两者独立) - 审批回写(系统身份)不触发共享规则物化,「批准后团队看不见」——平台只记一条日志、无补偿、无声明式手段 #13533 / [finding] 删除记录后,它的审批单仍留在审批收件箱:pending 与 approved 两种都留,记录引用退化为原始 id #13568 / [finding] 报表构建器只接受已声明的 dataset,不接受对象——AI 长出的新模块在报表里选不到,必须另写一份 dataset 声明 #13696 —— 同一次 🔗 Broken links detected in documentation #147 取证中发现的其余三条,与本条无关
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't workingpriority:p2Medium: important, M3Medium: important, M3repo:objectuiSeam card: cross-repo ordering with objectui is the substance (pure objectui fixes live in objectui)Seam card: cross-repo ordering with objectui is the substance (pure objectui fixes live in objectui)
Activity
os-warren commentedon Aug 31, 2026
分诊 →
repo:objectui· p2 · bug。去掉needs-user-decision—— 这条不需要维护者裁定,见下。先说标签更正
立单方写「本单不预设修正方向……故不带
pm:queue——请先分级」,用意是对的,但选错了标签:needs-user-decision表示需要维护者裁决,而「请先定级」是分诊的活。这条是不是缺陷、什么级别,由我答,不占你的时间。答案:是缺陷,p2。锚定 —— 落点在 objectui,且根因已定位
packages/plugin-calendar/src/CalendarView.tsx(objectui)。在origin/main上读到的就是它:selectedDate带着当天的日。Date.prototype.setMonth不夹取日 —— 8 月 31 日setMonth(8)落到「9 月 31 日」,JS 自动进位成 10 月 1 日。这就是跳月。四组实测逐条对上,一条不差:
Aug→ Oct → Nov → Dec这也解释了「为什么只有当月出问题」:不是「当前月 == 今天所在月」这个条件,而是「
selectedDate的日 > 目标月的天数」。默认落在当月时日是 31,翻一次之后日就变成 1 了,所以后面都正常。第 3 组从 July 翻回 August 又坏,是因为 7 月和 8 月都有 31 天,日一路保持 31 —— 与你观察到的现象完全一致,但触发条件的表述要改。立单方把第 2 组的
July → July「原地不动」标为「只观察到一次,未能稳定复现,不作为判据」。它是确定性的,就是同一条根因的 prev 方向:如实标注、且不硬塞进判据,是对的做法;这里把它收回来作为佐证,因为它独立地证实了同一个机制。
handleTouchEnd—— 移动端滑动翻月,同一个写法,同一个缺陷。你测的是桌面端点击,这条没进你的实测表。修复必须覆盖三处(handlePrevious/handleNext/handleTouchEnd),⛔ 不能只修标题栏那两个。另外
handleToday(:220)把selectedDate设回new Date(),即又把日恢复成 31 —— 所以点一次「今天」之后,跳月会重新出现。这是回归测试必须覆盖的路径。月份弹层为什么是对的
弹层走的是
handleDateSelect(date),拿到的是选择器给出的具体日期,不经过setMonth。所以两个入口行为不一致 —— 你抓到的这个对照是本单最有价值的部分,它把范围一次收窄到了这两个 handler。⛔ 给 dev 的复现禁令(否则会误判为「修好了」)
这个缺陷依赖当天日期:只有
selectedDate的日大于目标月天数时才触发。在 1–28 号之间,无论怎么点都翻不出问题。new Date():至少覆盖 8/31→9、1/31→2、5/31→6(30 天月)、以及闰年与平年的 1/29→2、1/30→2。new Date(y, m ± 1, 1)直接构造目标月,比夹取日更不容易再错。定级 p2
已发货视图的导航控件给出静默的错误结果(不报错,只是显示了错的月份),确定性可复现,且用户很难自己意识到中间少了一个月 —— 日历上「9 月的日程」会看起来不存在。不判 p1:无数据后果,且有两条即时绕法(用月份弹层,或连点两次再退一次)。
邻近单:#13748(同为日历呈现,但主题是配置缺失时的渲染,独立)—— 立单方的查重结论我认同,不并卡。
Generated by Claude Code