feat(tracker): Gantt chart for the issue tracker - #10992
Conversation
|
Hi @MichaelUray packages/ui: SearchInputAdvanced (field-prefixed field:value search), HighlightedText 2. A separate package for Gantt engine |
|
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 I'll move this PR back to Draft while restructuring it and update it once both boundaries build and test independently. |
3d959ca to
42c196d
Compare
Builds on the merged search/filter rework (hcengineering#10998). 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>
42c196d to
02933ee
Compare
| * needs to be read synchronously inside event handlers. | ||
| */ | ||
|
|
||
| let confirming = false |
There was a problem hiding this comment.
Looks like the drag-confirmation gate is a module-level singleton shared across every mounted GanttView, not scoped per view. If two Gantt views are ever mounted simultaneously (e.g. two tabs), confirming a drag in one silently blocks drag input in the other.
| weekdayMask: number | ||
|
|
||
| /** Holidays as UTC-midnight timestamps. Order is irrelevant; duplicates allowed. */ | ||
| holidays: Timestamp[] |
There was a problem hiding this comment.
Looks like the new per-project WorkingDaysConfig.holidays duplicates the existing workspace-level HR holiday concept (hr.class.PublicHoliday) with no integration, so holidays must be re-entered per project and can drift from the real HR calendar, skewing cascade/critical-path dates.
| if (col === 'startDate') return issue.startDate ?? null | ||
| if (col === 'dueDate') return issue.dueDate ?? null | ||
| if (col === 'deadline') { | ||
| // No native `deadline` field on Issue — preserve the |
There was a problem hiding this comment.
Is this comment actual?
Looks like deadline field was added in this PR
The search/filter rework this built on has merged (#10998), so this is now a standalone Gantt PR on current
develop.What it adds
The engine package
Introduces
@hcengineering/gantt, a runtime-dependency-free package for the domain-neutral part of the Gantt library — time-scale and working-day calculations, zoom and viewport primitives, drag/pointer state, responsive toolbar helpers, and the neutralGanttItem,GanttDependency, andWorkingCalendarcontracts. 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.Data model and migrations
Adds optional scheduling fields to Tracker documents, including issue deadlines and scheduling mode, project working-day configuration, and component/milestone colors. It also registers the dependency-shift request and notification documents and includes idempotent upgrades for Gantt view options and legacy relation-activity records. Existing issues and projects retain their previous behaviour because the new scheduling fields are optional.
New runtime dependencies
In
plugins/tracker-resources, both MIT:@tanstack/svelte-virtual(row virtualization) andjspdf(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,deandrucarry 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 exact head (
02933ee0f0) —build,svelte-check, unittest,formatting,docker-build,uitest,uitest-pg,uitest-workspaces,uitest-qms. Fork-CI run: https://github.com/MichaelUray/huly-platform/actions/runs/31542585071One small cross-cutting change: GanttView is a third writer to the shared result-count store from the search rework, so it uses the owner-token gate (claim/release like List and Kanban); the gate now resets to the pending sentinel on claim, so switching viewlets never shows a stale count.