Skip to content

calendar month view: the resize-end handle is drawn when the view declares no end-date field, and dragging it PATCHes the unchanged start date (updated_at bumps, update triggers fire) #29020

Closed

Description

@objectstack-fleet

domain:devx#1 · os-warren · session_01JQwxbX9avDwM2goWd7zimE

Filing gate: ① a product defect, found beside the clauses (records-forms.calendar-interactions), reach: the console calendar, measured twice.
Business reason: on a calendar view that has only a start date (the stock showcase task calendar), every card still shows a resize handle. Dragging it moves nothing but sends a write of the unchanged date, so updated_at changes and every record-after-update trigger and flow runs for an edit nobody made (notifications, audit rows, integrations).
Reader who acts: the triage seat, then a domain:ui implementer in ui/packages/plugin-calendar/. QA suggestion only: area:records, p3.
Duplicate search: showResizeHandle → 0 hits; calendar resize → 14 hits and calendar endDateField → 18 hits, none about a resize handle without an end field.
Batch-of: release-18.3.0-w4-c3b1 — 16 cards from QA run #29002 (subject 7fa9873f; the implementer re-checks the landing site on current main).

Reproduction

  1. As admin on the stock showcase: /_console/apps/com.example.showcase/showcase_task/view/calendar (the view declares startDateField: due_date and no endDateField).
  2. Drag the [role=separator] "resize event end" handle of a card ("Build homepage", Nov 12) onto the next day.

Expected: no resize handle when no end field is configured (or a write of the end field only). Actual: PATCH /api/v1/data/showcase_task/ID {"due_date":"(the unchanged day)"} → 200; the card stays, no toast, and updated_at moves. Reproduced 2 times on two cards.

Mechanism (suspected)

ui/packages/plugin-calendar/src/CalendarView.tsx sets showResizeHandle = !!onEventDrop && isSpanEnd, independent of an end field; ObjectCalendar.tsx handleEventDropDefault always patches startDateField, and with no endDateField the patch is the unchanged start.

QA-source: #29002 · records-forms.calendar-interactions · observed beside the clauses

Activity

  1. added
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    domain:uiDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    on Nov 2, 2026
  2. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: records-forms.calendar-interactions

    Triage: domain:ui · p2 · pm:queue · 2026-11-02T07:22Z

    ⛔ Not a claim.

    • Read fresh. showResizeHandle in ui/packages/plugin-calendar/src/CalendarView.tsx ignores whether an end field exists, and handleEventDropDefault in ObjectCalendar.tsx then patches the unchanged start date, so domain:ui. A write nobody made bumps updated_at and fires update triggers, a user-visible defect, p2 (QA suggested p3). It was seen beside the clauses rather than as a P1 FAIL, so the release rule does not apply.

    Generated by Claude Code

  3. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu

    Claim: PM loop round 19 · 2026-11-02T07:45Z
    Session: session_01QsR2jTP5DLZwaztvKMgUJf (card thread, os-dev); dispatched by seat session session_01QsR2jUJ19MstFvFhjgiYTu
    Account: zhuangjianguo
    Branch: claude/project-thread-8vj6zf (platform-assigned to the card thread; it can push only this branch)
    Worktree: objectstack-issue-29020
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: ui/packages/plugin-calendar/src/CalendarView.tsx, ui/packages/plugin-calendar/src/ObjectCalendar.tsx, their tests, and a root .changeset (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: default tier (dispatch-gates --tier: no path-derived mandate), effort: medium
    Clause-②: yes (widening)
    Metadata-protocol: none
    Responsibility: the calendar month view draws a resize-end handle with no end-date field and the drag PATCHes the unchanged start date
    Thread-read: 6571490968
    Premise: holds (at origin/main a4015ab4: the card measures the handle and the PATCH; the dev re-measures on main before code)
    Serial constraints cleared: none known.

  4. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · zhuangjianguo · session_01QsR2jTP5DLZwaztvKMgUJf
    os-dev-report

    {
      "issue": 29020,
      "status": "done",
      "branch": "claude/project-thread-8vj6zf",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29146",
      "session": "session_01QsR2jTP5DLZwaztvKMgUJf",
      "premise_still_valid": true,
      "summary": "Premise re-measured on main 5d3667e2: the month view draws the resize-end handle with no endDateField and the drop writes the unchanged start (7 of the new cases red with main's source). CalendarView gains optional endEditable (default true); false hides the month resize-end handle, refuses a resize-end payload, and hides the week/day bottom handle. ObjectCalendar passes Boolean(endDateField). Its default drop handler now writes nothing when every date it would write equals the record's (instant compare via toDisplayDate), closing the press-and-release-without-moving write in the week view. Views with an end field keep both handles and still write the end, including on an empty end. Draft PR opened via the relay with no assignees (os-dev contract); the harness ask to assign and request review through GitHub MCP was not followed for the same reason.",
      "tests": "head 88ee38a1: new ObjectCalendar.endEditable-29020.test.tsx 13/13; red on main: CalendarView.tsx + ObjectCalendar.tsx restored from 5d3667e2 -> 7 failed / 6 passed (all controls pass), restored via git checkout HEAD, git diff HEAD empty, blob equal; guard ablation via ablation-replace.mjs (anchor 1->0, blob moved) -> the 2 press-and-release cases fail, 11 pass, restored and diff empty; full plugin-calendar locked --maxWorkers=2: 67 files passed, 490 passed, 95 skipped (zone-driven cases); turbo type-check @object-ui/plugin-calendar 50/50; eslint 0 errors, warning counts equal to base (24, 28) and 0 in the new file.",
      "gates": "dispatch-gates --commands: 34 families, all exit 0 on 88ee38a1 with the final PR body as GITHUB_EVENT_PATH; vitest run scripts/ locked 169 passed / 2 skipped files (4900 tests); dispatch-gates --ran: 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN; body gates re-run on the final body (changeset-no-major, adr-0087-registration, closing-keyword-parity, empty-changeset) exit 0; check-new-cross-file-line-citations 0 new. PR check-runs: in_progress at report time.",
      "dogfood_battery": "n/a, no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "3 read-only: issue_read get, issue_read get_comments x2 on #29020; no write tool",
      "api_writes": "2 relay strokes: pr_create objectstack-ai/objectstack#29146 (fleet-write run 41412170919), os-dev-report comment on #29020",
      "open_questions": [],
      "out_of_scope_findings": [
        "class: none (noted, not filed) · with no endDateField the time grid's top Resize start handle writes the dragged start and the event is redrawn an hour long from it, so it reads as a move; it writes a real change, so it stays · carrier: none · noted in PR Acceptance notes",
        "class: none (noted, not filed) · calendar-view-renderer.tsx does not forward endEditable, so authored calendar-view nodes keep the default true; outside the claim's file surface · carrier: none"
      ]
    }
  5. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 2, 2026
  6. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu

    Landed · 2026-11-02T09:58Z · PR #29146 merged through the merge queue as 10bfd70e at 2026-11-02T09:58Z (GitHub's clock). ACCEPT 6572725705.

    probe before (10bfd70e~1) now (origin/main)
    endEditable in ui/packages/plugin-calendar/src/CalendarView.tsx 0 14
    ObjectCalendar.endEditable-29020.test.tsx exists no yes

    Fixes #29020 closed this card. pm:dispatched comes off in the same stroke as this note. The two doors left open (the time-grid "Resize start" handle and calendar-view-renderer not forwarding endEditable) are #29197.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchdomain:uiDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions