Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

plugin-gantt: summary bars lack resize/link affordances; last-row tooltip flicker; horizontal scrollbar unreachable (clipped + overlay engines); locked-bar cursor #2676

Closed

Description

@baozhoutao

Found while building the 排班计划甘特图 (4-level tree: project/product group rows → self-dated summary plan bars → locked dispatch leaf bars) on @objectstack/console 15.1.1 / objectui main, all reproduced live.

1. Self-dated summary bars are not editable (spec gap)

canDrag = !!onTaskUpdate && !row.isSummary && !isLocked gates ALL edit affordances off for summary rows, even when the summary's own dates are authoritative (summaryExtent: 'self' + hasOwnDates). Such a bar gets no edge-resize grips and no drag-to-link connector dots — dependencies can only be created through the context menu. This breaks the standard manual-scheduling model (MS Project "Manually Scheduled", Bryntum manuallyScheduled, Syncfusion taskMode: Manual): a parent whose dates are its own should edit like a task bar, while rollup summaries (derived dates, nothing to persist) stay move-only.

Also missing at the component level: per-interaction switches (DHTMLX drag_move/drag_resize/drag_progress/drag_links model) and a pre-commit veto hook (beforeTaskDrag/beforeTaskEdit pattern) so hosts can express rules like "moves allowed, durations pinned".

2. Last-row tooltip flickers in a loop (最后一行悬浮狂闪)

The hover tooltip renders downward (top: rowHeight - 8). On one of the LAST rows it pokes past the rows box, growing the scroller's scrollHeight while shown; with the user scrolled to the bottom, browser scroll clamping/anchoring re-adjusts scrollTop on every tooltip mount/unmount — the bar slides under the stationary cursor, hover re-fires, and the tooltip strobes.

3. Horizontal scrollbar unreachable / doubled

Two stacked causes:

  • ObjectGantt sizes the pane with h-[calc(100vh-200px)], a viewport guess that overshoots whenever the chrome above (tabs, toolbar, quick filters) exceeds 200px; the overflow-hidden host then clips the pane's bottom edge (53px in the console layout), swallowing the scrollbar area entirely.
  • The ::-webkit-scrollbar theming intended to force a classic always-visible bar is silently ignored by overlay-scrollbar engines (macOS "show while scrolling", embedded Chromium): the rules match (6 rules present) yet offsetHeight - clientHeight === 0. Worse, once the clipping is fixed those engines still flash their own auto-hiding bar on scroll, stacking a second bar under any custom one (双滚动条).

4. Locked summary bars advertise a grab cursor

locked (仅查看) summary rows are unmovable — beginDrag rejects them — but the bar still shows cursor: grab instead of not-allowed (🚫), unlike leaf bars.

Fix direction (PR follows)

  • Editability follows date ownership: summaryExtent 'self' + own dates + !locked → resize grips, connector dots, edge-zone drag on summary bars; middle drag still group-moves the subtree; rollup summaries unchanged.
  • interactions: { move, resize, progress, link } view-config switches (default all on, narrow-only) + onBeforeTaskUpdate async veto on the central commit belt (undo/redo exempt).
  • Bottom rows flip the tooltip above the bar — upward absolute overflow never extends the scrollable area, removing the feedback loop.
  • ObjectGantt fills its host flex cell (flex-1 min-h-0) instead of the viewport calc; native timeline scrollbars fully hidden (scrollbar-width: none, honored by overlay engines) and replaced by self-drawn track+thumb bars on both axes (drag + track-click jump, auto-hidden when content fits, task-list lockstep preserved).
  • Locked summaries fold !isLocked into the movable flag → not-allowed cursor.

All verified live against a real 4-level dataset (edge-resize persists only the plan's own dates; connector-dot link writes the dependency field; group move skips locked children; conflict dialog, context menus, locked rows regress clean). plugin-gantt suite: 323 tests green.

Activity

  1. self-assigned this
    on Jul 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions