Skip to content

[19.0][ADD] web_timeline_gantt_ux: Enterprise-style Gantt UX for timeline views - #3625

Open
nghorbani wants to merge 1 commit into
OCA:19.0from
cubert-hyperspectral:19.0-add-web_timeline_gantt_ux
Open

[19.0][ADD] web_timeline_gantt_ux: Enterprise-style Gantt UX for timeline views#3625
nghorbani wants to merge 1 commit into
OCA:19.0from
cubert-hyperspectral:19.0-add-web_timeline_gantt_ux

Conversation

@nghorbani

@nghorbani nghorbani commented Jul 28, 2026

Copy link
Copy Markdown

New module that layers an Enterprise-style Gantt UX on top of web_timeline, opt-in per view via a gantt_ux="true" arch attribute. Everything is patch()-based: web_timeline itself is untouched, and views that do not opt in keep stock look and behavior bit for bit.

We built this for our own project-task planning on Community 19.0 and have been running it in production; it is generic (nothing model-specific), so contributing it here where web_timeline lives.

What it adds

Overview

  • Row per record under collapsible group bands (record counts, localStorage-persisted collapse). Record names render on the bars and overflow narrow pills via vis's native RangeItem overflow mode; the sidebar carries only the group bands.
  • Light theme via CSS design tokens: colors= rules become harmonized pills, weekend + today shading, today's axis label as a pill, day-snapped drags, and a stable window (the stock per-reload fit() is suppressed in gantt mode, so the view never re-zooms after an edit).
  • Dependency arrows as Bezier curves predecessor-end to successor-start with hover tooltips:

Fan-out

  • Drag-to-link: hover a bar, drag the circular handle onto another bar to create the dependency_arrow link. Client-side validation (self/duplicate/reverse), pending dashed arrow while the write is in flight, success toast with Undo, arrow click / focus+Delete removal with confirmation, and per-record gating when the model exposes an allow_task_dependencies-style field:

Link handle

  • Dependency-aware moves: dragging a bar with dependents asks whether the downstream chain shifts by the same delta, the record moves alone, or the move is cancelled (bar snaps back). One prompt per multi-select gesture.
  • Status colors harmonized with the theme:

Status colors

Design notes

  • Group ids are namespaced (grp_<id> bands / rec_<id> rows) while item ids stay raw record ids, so the stock write paths keep working. The one stock coupling (the moveQueue group-by write, which would send project_id: "rec_42" on drags in row-per-record mode) is guarded by a regression test.
  • Rows get a deterministic in-parent order: the stock search_read orders by the group-by field only, so database tie order would otherwise shuffle rows on every reload.
  • Link handles live in an overlay outside the item DOM, so vis's Hammer instances never see the gesture (no pan/drag/select conflicts); handle placement is selection-aware so vis's resize handles stay fully usable.
  • Arrows get transparent 10px hit twins for clicking/focus; a11y: strokes are focusable with aria-labels, Delete removes.

Tests

  • 9 hoot suites under static/tests/ (bezier geometry, arch options, group building incl. row-order stability, model remap, controller move/add, drag validation, dependency writes, move cascade).
  • Python install/asset-registration tests under tests/.

Related

Known limitations (also in ROADMAP)

  • m2m group-by uses the first value only (stock item behavior).
  • Chart-side dependency creation is pointer-only; the record form remains the keyboard path.
  • Dependency-aware moves shift only records in the current search domain.
  • No touch support for the hover-born handles yet.

@OCA-git-bot OCA-git-bot added series:19.0 mod:web_timeline_gantt_ux Module web_timeline_gantt_ux labels Jul 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

mod:web_timeline_gantt_ux Module web_timeline_gantt_ux series:19.0

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants