feat(plugin-gantt): manual-scheduling summary bars, interaction switches, beforeTaskUpdate veto + tooltip/scrollbar/cursor fixes#2677
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
|
Added commit 79822fd — reschedule follows date ownership + auto-schedule confirms first:
|
…eraction switches + onBeforeTaskUpdate veto
Summary-bar editability (the MS-Project manual-scheduling rule): a summary
whose own dates are authoritative (summaryExtent 'self' + hasOwnDates) now
grows edge resize grips and drag-to-link connector dots, and its middle
still group-moves the subtree; rollup summaries stay move-only since their
derived dates have no field to persist to. Fixes the broken spec promise
where a plan bar with dispatch-order children lost resize and link-drag
entirely (right-click menu was the only path to dependencies).
- GanttView: interactions {move,resize,progress,link} switches (DHTMLX
drag_move/drag_resize/drag_progress/drag_links model, default all on,
narrow-only), enforced at the top gating block (link) and per-bar sites
(move/resize/progress, incl. milestone + edge-zone fallback to move).
- GanttView: onBeforeTaskUpdate veto (Bryntum beforeTaskEdit pattern) on the
central commit belt — drag/resize/group/progress/inline-edit/reschedule —
async-capable, fail-closed on throw; undo/redo bypasses it by design.
- getLiveRowStyle: non-group drag preview now covers the dragged summary, so
a summary resize tracks the pointer.
- ObjectGantt: forwards gantt.interactions from view metadata and the
onBeforeTaskUpdate prop.
- Tests: 16 new (summary editability matrix + switch matrix + veto
true/false/throw); suite 320/320 green.
Verified live against os-tianshun-ehr 排班计划甘特图 (15.1.1 runtime,
4-level tree): edge-resize persists only the plan's own dates, connector-dot
link writes predecessor_plans, body drag group-moves skipping locked
dispatch children, conflict dialog + context menu + locked rows regress
clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…w hover flicker loop A downward tooltip on one of the LAST rows 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 flickers in a tight loop (最后一行悬浮狂闪). Rows whose downward tooltip would extend past the content box now render it ABOVE the bar instead (only when there's room above): upward absolute overflow never extends the scrollable area, so showing/hiding the tooltip can no longer move the scroll position. Verified live on a 22-row chart: bottom-row tooltip renders with `bottom` set and scrollHeight stays constant while it is shown; top rows keep the downward tooltip. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Added commit 427d684 — export fixes: (1) the PNG/PDF export drew phantom rollup bars on pure grouping rows (type 'group') that the live chart renders bar-less; the export loop now mirrors the group branch and skips them. (2) Filenames upgraded from opaque |
|
Added commit 561532a — exported bars now carry their in-bar titles (条上标题) like the live chart: summary bars show the plan title, leaf bars the executor label, ellipsis-truncated to bar width (CJK-aware width estimate); narrow leaf bars fall back to the progress number. Verified live against the 4-level tree. |
…无编辑权限) Locked (仅查看) summary rows were already unmovable — beginDrag rejects them — but the bar still advertised a grab cursor, breaking the spec's "无编辑权限光标提示" row. Folding the lock into summaryMovable makes the cursor fall through to not-allowed, matching leaf-bar behaviour. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Added commit f4213bb — business-time-zone rendering: new |
…g the pane's bottom edge Two stacked causes left the timeline with NO reachable horizontal scrollbar (没有水平滚动条): 1. ObjectGantt sized 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. Now the wrapper is a flex column filling the host cell (flex-1/min-h-0), so the pane always ends inside the visible area. 2. The ::-webkit-scrollbar styling is silently ignored by overlay-scrollbar engines (macOS "show while scrolling", embedded Chromium), so even an unclipped native bar auto-hides. GanttView now draws its own track+thumb bar under the timeline — sticky to the visible bottom, ref-driven (no per-frame React state), synced 1:1 with scrollLeft, thumb drag and track-click jump, auto-hidden when the timeline fits. Verified live: bar sits flush with the viewport bottom, thumb drag pans the timeline (scrollLeft 0→1798, stable), track click jumps (→3899/4117), and the full 23-row chart now fits the tab cell without bottom clipping. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ely, add self-drawn vertical twin Overlay-scrollbar engines ignore ::-webkit-scrollbar theming but still flash their own auto-hiding horizontal bar on scroll, stacking a second bar right under the self-drawn one (双滚动条). Native timeline scrollbars are now fully hidden via scrollbar-width:none (honored by overlay engines too) + ::-webkit-scrollbar display:none for older WebKit, and the vertical axis gets the same self-drawn track+thumb treatment as the horizontal one (right edge, scrollTop-synced, drag + track-click, auto-hidden when rows fit). Wheel/trackpad scrolling is untouched; the task-list lockstep sync is preserved. Verified live: bottom shows exactly ONE horizontal bar; vertical thumb drag scrolls timeline and task list in lockstep (scrollTop 0→203). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Delivers the fixes and capabilities described in #2676. Five commits, each independently verified live against a real 4-level 排班计划 dataset (project/product groups → self-dated summary plans → locked dispatch leaves) plus 323 green plugin-gantt tests.
What changed
1b0ac32 — self-dated summary bars edit like tasks + interaction switches + veto hook
summaryExtent: 'self'and its own dates grows edge-resize grips and drag-to-link connector dots; dragging its middle still group-moves the whole subtree; rollup summaries (derived dates) stay move-only.interactions: { move, resize, progress, link }view-config switches — DHTMLXdrag_move/drag_resize/drag_progress/drag_linksmodel. Default all on; they only narrow whatreadOnly/row locks already allow.link: falseremoves both the connector dots and the menu create/delete entries.onBeforeTaskUpdateasync veto on the central commit belt (bar drag, edge resize, group move, progress, inline edit, conflict reschedule). Fail-closed on throw; per-task veto within a batch; undo/redo exempt by design. Forwarded throughObjectGanttalong withgantt.interactionsfrom view metadata.f22db05 — last-row tooltip flicker (最后一行悬浮狂闪)
Bottom rows flip the hover tooltip above the bar. A downward tooltip on a last row grew the scroller's scrollHeight while shown; with the view scrolled to the bottom, scroll clamping/anchoring re-adjusted scrollTop on every mount/unmount and the tooltip strobed under a stationary cursor. Upward absolute overflow never extends the scrollable area, so the loop is physically gone. Top rows and short charts unchanged.
b4cf610 — locked summary cursor
Locked (仅查看) summary bars now show
not-allowed(🚫) instead ofgrab, matching leaf bars — they were already unmovable, only the cursor lied.e298de8 + 145ef5b — horizontal scrollbar unreachable / doubled
ObjectGanttnow fills its host flex cell (flex-1 min-h-0) instead of guessing withh-[calc(100vh-200px)], which overshot whenever the chrome above exceeded 200px and got the pane's bottom edge clipped by the overflow-hidden host — swallowing the scrollbar area (53px in the console layout). A min-h keeps standalone embeds usable.scrollbar-width: none— honored by overlay engines that ignore::-webkit-scrollbartheming and would otherwise flash a second auto-hiding bar) and replaced by self-drawn track+thumb bars on both axes: ref-driven (no per-frame React state), synced 1:1 with scrollLeft/scrollTop, thumb drag + track-click jump, auto-hidden when content fits, task-list lockstep sync preserved.Verification
tsc --noEmitclean.@objectstack/runtime15.1.1 with a real 4-level tree: edge-resize persists only the plan's own dates (children untouched), connector-dot drag writes the dependency field (cycle guard intact), body drag group-moves skipping locked children and still raises the conflict/auto-reschedule dialog, locked leaves stay inert, link context menu (type switch + remove) works, bottom-row tooltip renders upward with scrollHeight constant, exactly one horizontal bar renders flush with the visible bottom, and both self-drawn bars pan correctly by thumb drag and track click.Refs #2676
🤖 Generated with Claude Code