Skip to content

feat(tracker): Gantt chart for the issue tracker - #10992

Draft
MichaelUray wants to merge 2 commits into
hcengineering:developfrom
MichaelUray:feat/gantt-consolidated
Draft

feat(tracker): Gantt chart for the issue tracker#10992
MichaelUray wants to merge 2 commits into
hcengineering:developfrom
MichaelUray:feat/gantt-consolidated

Conversation

@MichaelUray

@MichaelUray MichaelUray commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Restructured following review feedback: the shared search/filter rework is split into its own PR (#10998), and the Gantt engine now lives in a reusable package. Stacked on #10998 — until that merges, this PR shows both commits against develop; review #10998 first.

What it adds

A Gantt viewlet for the Tracker: time-scale canvas with day/week/month/quarter zoom, sidebar columns, today marker and jump navigation; editable bars (drag, resize, schedule an unscheduled row) with confirm prompts and permission/conflict handling; FS/SS/FF/SF dependencies with lag, a dependency editor, cascade shifting with cycle detection, and critical-path plus slack; visual polish (bar labels, quick-info popover, milestone and deadline markers, non-working-day shading, shortcut help); undo/redo, saved views, bulk select and bulk drag, auto-scheduling with manual pinning; row virtualization for large projects; a read-only mobile layout, tree view with hierarchy breadcrumbs and a predecessor column; bar coloring by status/priority/assignee/component/milestone with overdue and blocked overlays and sub-issue progress fill; PNG and PDF export plus a fullscreen toggle. A dependency shift raises a server-side notification for the affected assignees; the trigger resolves the sender, the shifted issues and their metadata server-side and scopes everything to the request's own space.

The engine package

Introduces @hcengineering/gantt, a runtime-dependency-free package for the domain-neutral part of the former Gantt library. It contains time-scale and working-day calculations, zoom and viewport primitives, drag/pointer state, responsive toolbar helpers, and the neutral GanttItem, GanttDependency, and WorkingCalendar contracts.

Tracker-specific scheduling, layout, critical-path and dependency-routing logic remains in the Tracker adapter. The Svelte UI, model schema, Huly actions, notifications, persistence and sanity coverage remain in their corresponding Tracker packages.

New runtime dependencies

In plugins/tracker-resources, both MIT: @tanstack/svelte-virtual (row virtualization) and jspdf (PDF export). Export re-renders the chart from the data model into an SVG rather than capturing the DOM; the PDF is paginated into bounded pages so large charts stay within the browser canvas and jsPDF size limits.

Locales

en, de and ru carry the full set of new strings, and a unit test enforces ICU placeholder parity across all locale files. Other locales fall back to English at runtime.

Testing

Full CI is green on a fork mirror of this head — build, svelte-check, unit test, formatting, docker-build, uitest, uitest-pg, uitest-workspaces, uitest-qms. The feature also went through several manual review rounds and a security pass; the dependency-shift notification validates the sender and the shifted issues server-side rather than trusting client-supplied metadata.

@ArtyomSavchenko

Copy link
Copy Markdown
Member

Hi @MichaelUray
Thank you for your contribution.
I have the following suggestions:
1. Split out the search/filter rework into its own PR
The one thing that stands out as not Gantt infrastructure is the search/filter overhaul:

packages/ui: SearchInputAdvanced (field-prefixed field:value search), HighlightedText
foundations/server/packages/elastic: the new query_string branch
plugins/view-resources: inline filter chips + overflow popover, query-builder, empty state

2. A separate package for Gantt engine
I think that Gantt engine(gantt/lib) is a good candidate to live as its own reusable package, with the tracker integration staying in tracker-resources. I think we could then reuse it elsewhere — for cards, for example.

@MichaelUray

Copy link
Copy Markdown
Contributor Author

Understood. I'll split the shared search/filter rework into a separate PR.

For the Gantt code, I'll extract a tracker-agnostic engine package with generic item, dependency, scheduling, layout and viewport interfaces. Tracker-specific adapters, Huly actions, notifications and the Svelte integration will remain in tracker-resources.

I'll move this PR back to Draft while restructuring it and update it once both boundaries build and test independently.

@MichaelUray
MichaelUray marked this pull request as draft July 27, 2026 07:44
…t empty state

Adds SearchInputAdvanced (field:value prefixes routed to Elasticsearch query_string), match highlighting, inline filter chips with overflow popover, a reusable zero-hit empty state in view-resources, and search-scope/highlight view options for List and Kanban.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Stacked on the search/filter rework. Introduces @hcengineering/gantt, a dependency-free scheduling/zoom/drag/viewport engine package (with a neutral GanttDependency contract), and wires the tracker-specific adapter, Svelte UI, model schema, dependency-shift notifications and sanity coverage in tracker-resources.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants