Skip to content

feat(tracker): Gantt — #2 read-only viewlet - #10853

Closed
MichaelUray wants to merge 37 commits into
hcengineering:developfrom
MichaelUray:feat/gantt-upstream-pr2-readonly
Closed

feat(tracker): Gantt — #2 read-only viewlet#10853
MichaelUray wants to merge 37 commits into
hcengineering:developfrom
MichaelUray:feat/gantt-upstream-pr2-readonly

Conversation

@MichaelUray

@MichaelUray MichaelUray commented May 18, 2026

Copy link
Copy Markdown
Contributor

Summary

Read-only Gantt viewlet for Tracker: a horizontally-scrolling time-canvas with a synced sidebar that lists the issues in the current project / filter, plus a zoom toolbar (Day / Week / Month / Quarter), a "Today" jump, page-scroll buttons, and customizable sidebar columns. No editing yet — drag/resize comes in PR3a, dependencies in PR3b.

The viewlet registers after Kanban so List stays the project default. All Gantt logic lives behind a viewlet.IssueGantt registration; no existing viewlet is mutated.

Supersedes #10852 (closed). The original head SHA was 7b197a93f; the branch has since been rebased onto the current PR1 tip and DCO-cleaned.

What's in this PR (+33 incremental commits)

  • feat(tracker) register viewlet.IssueGantt (placeholder) → wired with reactive queries
  • Gantt library modules — time-scale, layout, types, types-tested with Jest
  • Svelte components — GanttCanvas, GanttHeader, GanttSidebar, GanttBar, GanttTodayMarker, GanttMilestoneFlag, GanttToolbar
  • feat(tracker) register startDate + dueDate as Issue filters
  • Hardened scrollbars (sticky-bottom horizontal scrollbar, Plane-style)
  • Status-badge column + ganttShowStatus toggle
  • Inline-add row in the Gantt sidebar
  • "+ New issue" button in the Gantt toolbar (wired into the standard NewIssue flow)
  • i18n keys for the new Gantt UI strings (en + de)

Stack overview

# Branch Scope Status
PR1 feat/gantt-upstream-pr1-schema schema + version bump merged ✅
PR2 feat/gantt-upstream-pr2-readonly this PR — read-only viewlet draft
PR3a feat/gantt-upstream-pr3a-edit editable viewlet draft
PR3b feat/gantt-upstream-pr3b-deps-cascade-cp dependencies + cascade + critical path draft
PR4 feat/gantt-upstream-pr4-polish polish draft
PR5 feat/gantt-upstream-pr5-tier2 undo, saved views, bulk, auto-scheduling draft
PR6 feat/gantt-upstream-pr6-tier3-virtualization virtualization draft
PR7 feat/gantt-upstream-pr7-tier4 mobile + tree + predecessor col + visual deps + notifications draft
Docs (huly-docs#70) MichaelUray:feat/gantt-section reference + screenshots open

Marked as draft to signal stack dependency on PR1. Will be promoted to ready-for-review once PR1 is merged.

How to review

GitHub shows the cumulative diff against develop (PR1 + PR2 = 40 commits, ~2 850 line additions). For the PR2-only incremental diff see:

Fork compare: PR1...PR2 — 33 commits, 34 files

Testing

  • Jest tests on the time-scale and layout modules cover the date-math and row-packing edge cases.
  • Validated on a production-style deployment on 2026-05-18.

DCO

All commits are Signed-off-by.

@huly-github-staging

Copy link
Copy Markdown

Connected to Huly®: UBERF-16443

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
…reactive queries

PR 2 read-only Gantt is now end-to-end functional:
- Two reactive queries (issues, milestones)
- buildLayout(issues) -> rows with depth + isSummary
- createTimeScale(zoom, dateRange.from) -> date<->px math
- Summary ranges computed per parent issue from children's date span
- Local zoom state (Day/Week/Month/Quarter) - no ViewletPreference plumbing
- Horizontal scroll via canvas-scroller; vertical scroll moves Sidebar via translate

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
- viewlets.ts: register IssueGantt AFTER IssueKanban so List stays default
- viewlets.ts: drop showColorsViewOption (canvas does not honour it yet)
- GanttBar.svelte: normalise reversed startDate>dueDate ranges

UX:
- GanttSidebar adds Title column with sticky two-column header
- Sticky time-scale header decoupled from milestone strip (layout fix)
- Per-row jump-to-bar arrow (Plane-style) when bar is offscreen
- ResizeObserver initialises viewport on mount and on resize

Milestones as Gantt rows + collapse:
- Milestones group their issues as nested children (depth+1)
- Collapsible toggle per parent row, local collapsedIds Set
- Milestone summary bar uses existing GanttBar with aggregated range

Icon:
- Register tracker.icon.Gantt to #timeline svg (Gantt pictogram)

Tests: 25/25 jest pass; svelte-check 0 errors.
Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
- Visible top row with [«] [Today] [»] | Day Week Month Quarter | ⚙
- Today scrolls to current date, prev/next page-scroll by 80% viewport
- Settings popover toggles Issue-Code and Title columns

Layout:
- Bigger row height (28→36) and bar font (11→13px) for readability
- Sidebar reworked into flex-column with separate clipped rows region so
  scrolled rows can never paint over the sticky header(layout fix)
- Drag handle between sidebar and canvas (120–600px range)
- ResizeObserver re-syncs viewport on drag/resize/zoom changes

Interaction:
- Vertical gridlines aligned to time-scale ticks (Plane-style)
- Row hover highlights both sidebar and canvas, with rich HTML tooltip
  (issue title + start + due + duration)
- Title click in sidebar dispatches openIssue → showPanel(EditIssue)
- Double-click on canvas bar dispatches openIssue
- Wheel forwarding from sidebar to canvas-scroller (vertical scroll
  works while hovering issue list)
- Pointerdown + drag on empty canvas pans both axes
- Jump-to-bar buttons now use the bar's true left-edge target

Tests: 25/25 jest pass; svelte-check 0 errors.
Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
  totalCanvasWidth (was viewport width), with viewBox in scroll-content
  coordinates. The sticky header lives in the same coordinate system as
  the canvas-stack so horizontal scroll no longer clips the time-axis.
- showPanel uses tracker.component.EditIssue instead of the hardcoded
  string + 'as any' cast.
- Removed unused GanttToolbar.svelte and GanttMilestoneFlag.svelte (dead
  files since toolbar moved into GanttView and milestone flags became
  rows).

Toolbar:
- Time-navigation cluster: ⏮ « Today » ⏭ + native date picker that jumps
  to a specific date. Replaces the lone Today button.

Interaction polish:
- Sidebar wheel forwarding now uses direct scrollTop/scrollLeft mutation
  with deltaMode scaling — same speed as native canvas scroll.
- TodayMarker no longer hides when scrolled offscreen (SVG width handles
  clipping); milestone reference lines render unconditionally for the
  same reason.

Tests: 25/25 jest pass; svelte-check 0 errors.
Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
- Register two ToggleViewOptions on the Gantt viewlet:
  ganttShowIssueCode (default OFF) and ganttShowTitle (default ON).
  These show up in the standard Customize-View dropdown.
- Drop the per-component settings popover from GanttView; sidebar
  column visibility now reads viewOptions directly.
- Hover tooltip always surfaces the issue code (e.g. OSTRO-31), even
  when the issue-code column is hidden.
- IntlStrings + en/de/es/fr/it/ja/pt/ru/zh/cs translations added.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Bug: .gantt-sidebar rendered at its natural height (≈ rows × 36px), and
.sidebar-host had overflow:visible, so for many issues the sidebar
visually overflowed gantt-body which in turn made gantt-body's
scrollHeight balloon to the sidebar's natural height. The result was
that scrolling over the sidebar appeared to scroll the page area
instead of just the canvas.

Fix:
- .sidebar-host now overflow:hidden + height:100% + flex-column
- .gantt-sidebar height:100% + flex:1 1 auto so it fills the host
  rather than stretching past it

Verified: gantt-body scrollHeight == clientHeight, only
.canvas-scroller has scrollable content. Wheel-forward over the
sidebar moves canvas-scroller and the sidebar transform together.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
…ticky)

Replaces the dual-scroller architecture (sidebar + canvas as siblings,
manual wheel-forwarding for the sidebar) with a single .gantt-scroller
that wraps both columns in a CSS grid. Sidebar uses position:sticky
left:0 so it stays at the left edge during horizontal scroll, while the
time-axis header uses position:sticky top:0. Browser handles all wheel
events natively at native speed.

Why: the previous design rendered the sidebar at its natural height
(rows × 36px), which could be much larger than the visible viewport.
overflow:visible on the sidebar host let it bleed past gantt-body and
made the page area appear to scroll. The wheel-forward hack only worked
for synthetic events; in real browsers, wheel events over the sidebar
either scrolled too slowly (deltaMode mismatch) or stopped firing.

Layout (CSS grid, 2 rows × 3 cols):
- (1,1) sticky top+left: corner with column titles
- (1,2) sticky top:     resize-corner (5px gutter)
- (1,3) sticky top:     time-axis header
- (2,1) sticky left:0:  GanttSidebar rows
- (2,2) sticky left:Wpx: vertical resize-handle
- (2,3) normal:         GanttCanvas SVG

overflow:scroll on .gantt-scroller forces both scrollbars to always
render — the user explicitly asked for visible scrollbars (Plane parity).

GanttSidebar drops its scrollTop prop and the transform-based row
positioning; rows now flow naturally inside the scroll container.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
@MichaelUray

Copy link
Copy Markdown
Contributor Author

Thanks for merging #10851! I've rebased this PR onto the new develop — it now contains only the PR-2 commits (read-only Gantt viewlet); the schema commits dropped out during the rebase as already applied. On our fork CI mirror of this exact head, build, svelte-check, unit test, uitest, uitest-workspaces and uitest-qms are all green; the only red is an intermittent uitest-pg failure in an unrelated login sanity test (LoginPage.checkIfErrorMessageIsShown) that passes on re-run. The rest of the series (#10854#10859, #10872, #10873) has been rebased the same way and stays in draft until its predecessor lands. Ready for review.

Comment thread plugins/tracker-resources/src/components/issues/IssuesView.svelte
Comment thread plugins/tracker-resources/src/components/gantt/GanttTodayMarker.svelte Outdated
Comment thread models/tracker/src/viewlets.ts Outdated
Comment thread plugins/tracker-resources/src/components/gantt/lib/time-scale.ts
Comment thread plugins/tracker-resources/src/components/gantt/GanttBar.svelte
Comment thread plugins/tracker-assets/lang/de.json Outdated
Comment thread plugins/tracker-resources/src/components/gantt/GanttCanvas.svelte Outdated
Comment thread plugins/tracker-resources/src/components/gantt/GanttView.svelte
Comment thread plugins/tracker-resources/src/components/gantt/GanttView.svelte Outdated
Comment thread plugins/tracker-resources/src/components/gantt/GanttView.svelte Outdated
…neering#10853)

- render the Today-marker label with timeZone: 'UTC' so it matches the UTC grid
- drop the internal PR-series note from ganttViewOptions comments
- add German and Russian translations for the new Gantt locale keys
- throttle the hover dispatch to ~one frame to avoid per-mousemove reactivity
- honour the sort order selected in the view options (rank as tiebreaker)
- import the toolbar icons from the @hcengineering/ui package root

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
@ArtyomSavchenko

Copy link
Copy Markdown
Member

Hi @MichaelUray
What do you think about leaving only one pull request that includes all the Gantt changes?
This will make it easier for me to see the whole picture and test it.

MichaelUray added a commit to MichaelUray/huly-platform that referenced this pull request Jul 23, 2026
Adds a Gantt viewlet to the Tracker, plus the filter/search rework the
Gantt toolbar shares with the List and Kanban viewlets.

Scope, roughly in the order the feature grew:

* Read-only Gantt viewlet: time-scale canvas, sidebar columns, today
  marker, zoom levels (day/week/month/quarter), jump-to-start/end/date
  navigation and per-viewlet view options.
* Editable bars: drag to move, resize handles for start/due date, drag
  on an unscheduled row to schedule it, optional confirm prompts and
  permission/conflict handling on commit.
* Dependencies: FS/SS/FF/SF relations with lag, dependency editor and
  arrows, cascade shifting with cycle detection, and critical-path plus
  slack computation. A dependency shift raises a server-side
  notification for the affected assignees.
* Visual polish: bar labels (left/inside/right), quick-info popover,
  milestone markers, deadline markers, non-working-day shading and
  keyboard-shortcut help.
* Tier 2: undo/redo, saved views, bulk selection and bulk drag,
  auto-scheduling with manual pinning.
* Tier 3: row virtualization for large projects.
* Tier 4: mobile (read-only) layout, tree view with hierarchy
  breadcrumbs and a predecessor column.
* Filter and search rework: inline filter chips with an overflow
  popover, an advanced search input with field prefixes routed to an
  Elasticsearch query_string branch, search scope and match-highlight
  view-option toggles, and a zero-hit empty state.
* Bar coloring by status/priority/assignee/component/milestone, overdue
  and blocked overlays, and sub-issue progress fill.
* Gantt toolbar export to PNG and to PDF (via the browser print dialog)
  and a fullscreen toggle. Both live in the Gantt toolbar only.

New runtime dependencies in plugins/tracker-resources, all MIT licensed:

* @tanstack/svelte-virtual - row virtualization for sidebar and canvas
* html2canvas - rasterizes the Gantt SVG for the PNG export
* jspdf - wraps that raster into the PDF export

Locales: en, de and ru carry the full set of new strings. The other
locales are mostly unchanged and fall back to English at runtime; the
few new keys they do define are still English placeholders. Translating
those is left to native speakers.

This consolidates the previously separate pull requests hcengineering#10853, hcengineering#10854,
hcengineering#10855, hcengineering#10856, hcengineering#10857, hcengineering#10858, hcengineering#10859, hcengineering#10872 and hcengineering#10873 into a single
change, as requested on hcengineering#10853, so the whole feature can be reviewed and
tested in one place. The review feedback given on hcengineering#10853 is included.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
MichaelUray added a commit to MichaelUray/huly-platform that referenced this pull request Jul 23, 2026
Adds a Gantt viewlet to the Tracker, plus the filter/search rework the
Gantt toolbar shares with the List and Kanban viewlets.

Scope, roughly in the order the feature grew:

* Read-only Gantt viewlet: time-scale canvas, sidebar columns, today
  marker, zoom levels (day/week/month/quarter), jump-to-start/end/date
  navigation and per-viewlet view options.
* Editable bars: drag to move, resize handles for start/due date, drag
  on an unscheduled row to schedule it, optional confirm prompts and
  permission/conflict handling on commit.
* Dependencies: FS/SS/FF/SF relations with lag, dependency editor and
  arrows, cascade shifting with cycle detection, and critical-path plus
  slack computation. A dependency shift raises a server-side
  notification for the affected assignees.
* Visual polish: bar labels (left/inside/right), quick-info popover,
  milestone markers, deadline markers, non-working-day shading and
  keyboard-shortcut help.
* Tier 2: undo/redo, saved views, bulk selection and bulk drag,
  auto-scheduling with manual pinning.
* Tier 3: row virtualization for large projects.
* Tier 4: mobile (read-only) layout, tree view with hierarchy
  breadcrumbs and a predecessor column.
* Filter and search rework: inline filter chips with an overflow
  popover, an advanced search input with field prefixes routed to an
  Elasticsearch query_string branch, search scope and match-highlight
  view-option toggles, and a zero-hit empty state.
* Bar coloring by status/priority/assignee/component/milestone, overdue
  and blocked overlays, and sub-issue progress fill.
* Gantt toolbar export to PNG and to PDF (via the browser print dialog)
  and a fullscreen toggle. Both live in the Gantt toolbar only.

New runtime dependencies in plugins/tracker-resources, all MIT licensed:

* @tanstack/svelte-virtual - row virtualization for sidebar and canvas
* html2canvas - rasterizes the Gantt SVG for the PNG export
* jspdf - wraps that raster into the PDF export

Locales: en, de and ru carry the full set of new strings. The other
locales are mostly unchanged and fall back to English at runtime; the
few new keys they do define are still English placeholders. Translating
those is left to native speakers.

This consolidates the previously separate pull requests hcengineering#10853, hcengineering#10854,
hcengineering#10855, hcengineering#10856, hcengineering#10857, hcengineering#10858, hcengineering#10859, hcengineering#10872 and hcengineering#10873 into a single
change, as requested on hcengineering#10853, so the whole feature can be reviewed and
tested in one place. The review feedback given on hcengineering#10853 is included.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
MichaelUray added a commit to MichaelUray/huly-platform that referenced this pull request Jul 23, 2026
Adds a Gantt viewlet to the Tracker, plus the filter/search rework the
Gantt toolbar shares with the List and Kanban viewlets.

Scope, roughly in the order the feature grew:

* Read-only Gantt viewlet: time-scale canvas, sidebar columns, today
  marker, zoom levels (day/week/month/quarter), jump-to-start/end/date
  navigation and per-viewlet view options.
* Editable bars: drag to move, resize handles for start/due date, drag
  on an unscheduled row to schedule it, optional confirm prompts and
  permission/conflict handling on commit.
* Dependencies: FS/SS/FF/SF relations with lag, dependency editor and
  arrows, cascade shifting with cycle detection, and critical-path plus
  slack computation. A dependency shift raises a server-side
  notification for the affected assignees.
* Visual polish: bar labels (left/inside/right), quick-info popover,
  milestone markers, deadline markers, non-working-day shading and
  keyboard-shortcut help.
* Tier 2: undo/redo, saved views, bulk selection and bulk drag,
  auto-scheduling with manual pinning.
* Tier 3: row virtualization for large projects.
* Tier 4: mobile (read-only) layout, tree view with hierarchy
  breadcrumbs and a predecessor column.
* Filter and search rework: inline filter chips with an overflow
  popover, an advanced search input with field prefixes routed to an
  Elasticsearch query_string branch, search scope and match-highlight
  view-option toggles, and a zero-hit empty state.
* Bar coloring by status/priority/assignee/component/milestone, overdue
  and blocked overlays, and sub-issue progress fill.
* Gantt toolbar export to PNG and to PDF (via the browser print dialog)
  and a fullscreen toggle. Both live in the Gantt toolbar only.

New runtime dependencies in plugins/tracker-resources, all MIT licensed:

* @tanstack/svelte-virtual - row virtualization for sidebar and canvas
* html2canvas - rasterizes the Gantt SVG for the PNG export
* jspdf - wraps that raster into the PDF export

Locales: en, de and ru carry the full set of new strings. The other
locales are mostly unchanged and fall back to English at runtime; the
few new keys they do define are still English placeholders. Translating
those is left to native speakers.

This consolidates the previously separate pull requests hcengineering#10853, hcengineering#10854,
hcengineering#10855, hcengineering#10856, hcengineering#10857, hcengineering#10858, hcengineering#10859, hcengineering#10872 and hcengineering#10873 into a single
change, as requested on hcengineering#10853, so the whole feature can be reviewed and
tested in one place. The review feedback given on hcengineering#10853 is included.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
MichaelUray added a commit to MichaelUray/huly-platform that referenced this pull request Jul 23, 2026
Adds a Gantt viewlet to the Tracker, plus the filter/search rework the
Gantt toolbar shares with the List and Kanban viewlets.

Scope, roughly in the order the feature grew:

* Read-only Gantt viewlet: time-scale canvas, sidebar columns, today
  marker, zoom levels (day/week/month/quarter), jump-to-start/end/date
  navigation and per-viewlet view options.
* Editable bars: drag to move, resize handles for start/due date, drag
  on an unscheduled row to schedule it, optional confirm prompts and
  permission/conflict handling on commit.
* Dependencies: FS/SS/FF/SF relations with lag, dependency editor and
  arrows, cascade shifting with cycle detection, and critical-path plus
  slack computation. A dependency shift raises a server-side
  notification for the affected assignees.
* Visual polish: bar labels (left/inside/right), quick-info popover,
  milestone markers, deadline markers, non-working-day shading and
  keyboard-shortcut help.
* Tier 2: undo/redo, saved views, bulk selection and bulk drag,
  auto-scheduling with manual pinning.
* Tier 3: row virtualization for large projects.
* Tier 4: mobile (read-only) layout, tree view with hierarchy
  breadcrumbs and a predecessor column.
* Filter and search rework: inline filter chips with an overflow
  popover, an advanced search input with field prefixes routed to an
  Elasticsearch query_string branch, search scope and match-highlight
  view-option toggles, and a zero-hit empty state.
* Bar coloring by status/priority/assignee/component/milestone, overdue
  and blocked overlays, and sub-issue progress fill.
* Gantt toolbar export to PNG and to PDF (via the browser print dialog)
  and a fullscreen toggle. Both live in the Gantt toolbar only.

New runtime dependencies in plugins/tracker-resources, all MIT licensed:

* @tanstack/svelte-virtual - row virtualization for sidebar and canvas
* html2canvas - rasterizes the Gantt SVG for the PNG export
* jspdf - wraps that raster into the PDF export

Locales: en, de and ru carry the full set of new strings. The other
locales are mostly unchanged and fall back to English at runtime; the
few new keys they do define are still English placeholders. Translating
those is left to native speakers.

This consolidates the previously separate pull requests hcengineering#10853, hcengineering#10854,
hcengineering#10855, hcengineering#10856, hcengineering#10857, hcengineering#10858, hcengineering#10859, hcengineering#10872 and hcengineering#10873 into a single
change, as requested on hcengineering#10853, so the whole feature can be reviewed and
tested in one place. The review feedback given on hcengineering#10853 is included.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
MichaelUray added a commit to MichaelUray/huly-platform that referenced this pull request Jul 23, 2026
Adds a Gantt viewlet to the Tracker, plus the filter/search rework the
Gantt toolbar shares with the List and Kanban viewlets.

Scope, roughly in the order the feature grew:

* Read-only Gantt viewlet: time-scale canvas, sidebar columns, today
  marker, zoom levels (day/week/month/quarter), jump-to-start/end/date
  navigation and per-viewlet view options.
* Editable bars: drag to move, resize handles for start/due date, drag
  on an unscheduled row to schedule it, optional confirm prompts and
  permission/conflict handling on commit.
* Dependencies: FS/SS/FF/SF relations with lag, dependency editor and
  arrows, cascade shifting with cycle detection, and critical-path plus
  slack computation. A dependency shift raises a server-side
  notification for the affected assignees.
* Visual polish: bar labels (left/inside/right), quick-info popover,
  milestone markers, deadline markers, non-working-day shading and
  keyboard-shortcut help.
* Tier 2: undo/redo, saved views, bulk selection and bulk drag,
  auto-scheduling with manual pinning.
* Tier 3: row virtualization for large projects.
* Tier 4: mobile (read-only) layout, tree view with hierarchy
  breadcrumbs and a predecessor column.
* Filter and search rework: inline filter chips with an overflow
  popover, an advanced search input with field prefixes routed to an
  Elasticsearch query_string branch, search scope and match-highlight
  view-option toggles, and a zero-hit empty state.
* Bar coloring by status/priority/assignee/component/milestone, overdue
  and blocked overlays, and sub-issue progress fill.
* Gantt toolbar export to PNG and to PDF (via the browser print dialog)
  and a fullscreen toggle. Both live in the Gantt toolbar only.
* Responsive toolbar: the lifted toolbar measures the width it gets and
  collapses whole control tiers into a "…" popover, least important
  first, so Fullscreen and More-actions stay reachable from 390 px
  upwards. This needs one opt-in flag on the shared header component
  (`Header`/`SpaceHeader` `shrinkSearch`), which swaps which button
  group is the row's shrink target; it defaults to false, so no other
  header consumer changes behaviour.

New runtime dependencies in plugins/tracker-resources, all MIT licensed:

* @tanstack/svelte-virtual - row virtualization for sidebar and canvas
* html2canvas - rasterizes the Gantt SVG for the PNG export
* jspdf - wraps that raster into the PDF export

Locales: en, de and ru carry the full set of new strings. The other
locales are mostly unchanged and fall back to English at runtime; the
few new keys they do define are still English placeholders. Translating
those is left to native speakers.

This consolidates the previously separate pull requests hcengineering#10853, hcengineering#10854,
hcengineering#10855, hcengineering#10856, hcengineering#10857, hcengineering#10858, hcengineering#10859, hcengineering#10872 and hcengineering#10873 into a single
change, as requested on hcengineering#10853, so the whole feature can be reviewed and
tested in one place. The review feedback given on hcengineering#10853 is included.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
MichaelUray added a commit to MichaelUray/huly-platform that referenced this pull request Jul 23, 2026
Adds a Gantt viewlet to the Tracker, plus the filter/search rework the
Gantt toolbar shares with the List and Kanban viewlets.

Scope, roughly in the order the feature grew:

* Read-only Gantt viewlet: time-scale canvas, sidebar columns, today
  marker, zoom levels (day/week/month/quarter), jump-to-start/end/date
  navigation and per-viewlet view options.
* Editable bars: drag to move, resize handles for start/due date, drag
  on an unscheduled row to schedule it, optional confirm prompts and
  permission/conflict handling on commit.
* Dependencies: FS/SS/FF/SF relations with lag, dependency editor and
  arrows, cascade shifting with cycle detection, and critical-path plus
  slack computation. A dependency shift raises a server-side
  notification for the affected assignees.
* Visual polish: bar labels (left/inside/right), quick-info popover,
  milestone markers, deadline markers, non-working-day shading and
  keyboard-shortcut help.
* Tier 2: undo/redo, saved views, bulk selection and bulk drag,
  auto-scheduling with manual pinning.
* Tier 3: row virtualization for large projects.
* Tier 4: mobile (read-only) layout, tree view with hierarchy
  breadcrumbs and a predecessor column.
* Filter and search rework: inline filter chips with an overflow
  popover, an advanced search input with field prefixes routed to an
  Elasticsearch query_string branch, search scope and match-highlight
  view-option toggles, and a zero-hit empty state.
* Bar coloring by status/priority/assignee/component/milestone, overdue
  and blocked overlays, and sub-issue progress fill.
* Gantt toolbar export to PNG and to PDF (via the browser print dialog)
  and a fullscreen toggle. Both live in the Gantt toolbar only.
* Responsive toolbar: the lifted toolbar measures the width it gets and
  collapses whole control tiers into a "…" popover, least important
  first, so Fullscreen and More-actions stay reachable from 390 px
  upwards. This needs one opt-in flag on the shared header component
  (`Header`/`SpaceHeader` `shrinkSearch`), which swaps which button
  group is the row's shrink target; it defaults to false, so no other
  header consumer changes behaviour.

New runtime dependencies in plugins/tracker-resources, all MIT licensed:

* @tanstack/svelte-virtual - row virtualization for sidebar and canvas
* html2canvas - rasterizes the Gantt SVG for the PNG export
* jspdf - wraps that raster into the PDF export

Locales: en, de and ru carry the full set of new strings. The other
locales are mostly unchanged and fall back to English at runtime; the
few new keys they do define are still English placeholders. Translating
those is left to native speakers.

This consolidates the previously separate pull requests hcengineering#10853, hcengineering#10854,
hcengineering#10855, hcengineering#10856, hcengineering#10857, hcengineering#10858, hcengineering#10859, hcengineering#10872 and hcengineering#10873 into a single
change, as requested on hcengineering#10853, so the whole feature can be reviewed and
tested in one place. The review feedback given on hcengineering#10853 is included.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
MichaelUray added a commit to MichaelUray/huly-platform that referenced this pull request Jul 23, 2026
Adds a Gantt viewlet to the Tracker, plus the filter/search rework the
Gantt toolbar shares with the List and Kanban viewlets.

Scope, roughly in the order the feature grew:

* Read-only Gantt viewlet: time-scale canvas, sidebar columns, today
  marker, zoom levels (day/week/month/quarter), jump-to-start/end/date
  navigation and per-viewlet view options.
* Editable bars: drag to move, resize handles for start/due date, drag
  on an unscheduled row to schedule it, optional confirm prompts and
  permission/conflict handling on commit.
* Dependencies: FS/SS/FF/SF relations with lag, dependency editor and
  arrows, cascade shifting with cycle detection, and critical-path plus
  slack computation. A dependency shift raises a server-side
  notification for the affected assignees.
* Visual polish: bar labels (left/inside/right), quick-info popover,
  milestone markers, deadline markers, non-working-day shading and
  keyboard-shortcut help.
* Tier 2: undo/redo, saved views, bulk selection and bulk drag,
  auto-scheduling with manual pinning.
* Tier 3: row virtualization for large projects.
* Tier 4: mobile (read-only) layout, tree view with hierarchy
  breadcrumbs and a predecessor column.
* Filter and search rework: inline filter chips with an overflow
  popover, an advanced search input with field prefixes routed to an
  Elasticsearch query_string branch, search scope and match-highlight
  view-option toggles, and a zero-hit empty state.
* Bar coloring by status/priority/assignee/component/milestone, overdue
  and blocked overlays, and sub-issue progress fill.
* Gantt toolbar export to PNG and to PDF (via the browser print dialog)
  and a fullscreen toggle. Both live in the Gantt toolbar only.
* Responsive toolbar: the lifted toolbar measures the width it gets and
  collapses whole control tiers into a "…" popover, least important
  first, so Fullscreen and More-actions stay reachable from 390 px
  upwards. This needs one opt-in flag on the shared header component
  (`Header`/`SpaceHeader` `shrinkSearch`), which swaps which button
  group is the row's shrink target; it defaults to false, so no other
  header consumer changes behaviour.

New runtime dependencies in plugins/tracker-resources, all MIT licensed:

* @tanstack/svelte-virtual - row virtualization for sidebar and canvas
* html2canvas - rasterizes the Gantt SVG for the PNG export
* jspdf - wraps that raster into the PDF export

Locales: en, de and ru carry the full set of new strings. The other
locales are mostly unchanged and fall back to English at runtime; the
few new keys they do define are still English placeholders. Translating
those is left to native speakers.

This consolidates the previously separate pull requests hcengineering#10853, hcengineering#10854,
hcengineering#10855, hcengineering#10856, hcengineering#10857, hcengineering#10858, hcengineering#10859, hcengineering#10872 and hcengineering#10873 into a single
change, as requested on hcengineering#10853, so the whole feature can be reviewed and
tested in one place. The review feedback given on hcengineering#10853 is included.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
MichaelUray added a commit to MichaelUray/huly-platform that referenced this pull request Jul 23, 2026
Adds a Gantt viewlet to the Tracker, plus the filter/search rework the
Gantt toolbar shares with the List and Kanban viewlets.

Scope, roughly in the order the feature grew:

* Read-only Gantt viewlet: time-scale canvas, sidebar columns, today
  marker, zoom levels (day/week/month/quarter), jump-to-start/end/date
  navigation and per-viewlet view options.
* Editable bars: drag to move, resize handles for start/due date, drag
  on an unscheduled row to schedule it, optional confirm prompts and
  permission/conflict handling on commit.
* Dependencies: FS/SS/FF/SF relations with lag, dependency editor and
  arrows, cascade shifting with cycle detection, and critical-path plus
  slack computation. A dependency shift raises a server-side
  notification for the affected assignees.
* Visual polish: bar labels (left/inside/right), quick-info popover,
  milestone markers, deadline markers, non-working-day shading and
  keyboard-shortcut help.
* Tier 2: undo/redo, saved views, bulk selection and bulk drag,
  auto-scheduling with manual pinning.
* Tier 3: row virtualization for large projects.
* Tier 4: mobile (read-only) layout, tree view with hierarchy
  breadcrumbs and a predecessor column.
* Filter and search rework: inline filter chips with an overflow
  popover, an advanced search input with field prefixes routed to an
  Elasticsearch query_string branch, search scope and match-highlight
  view-option toggles, and a zero-hit empty state.
* Bar coloring by status/priority/assignee/component/milestone, overdue
  and blocked overlays, and sub-issue progress fill.
* Gantt toolbar export to PNG and to PDF. Both re-render the chart from
  the Gantt's own row model into a stand-alone SVG and rasterise that, so
  the output does not depend on the current scroll position or on rows
  that virtualization has not mounted; the PDF embeds the same raster as
  a real file download, not a browser print. Plus a fullscreen toggle.
  All of it lives in the Gantt toolbar only.
* Responsive toolbar: the lifted toolbar measures the width it gets and
  collapses whole control tiers into a "…" popover, least important
  first, so Fullscreen and More-actions stay reachable from 390 px
  upwards. This needs one opt-in flag on the shared header component
  (`Header`/`SpaceHeader` `shrinkSearch`), which swaps which button
  group is the row's shrink target; it defaults to false, so no other
  header consumer changes behaviour.

New runtime dependencies in plugins/tracker-resources, all MIT licensed:

* @tanstack/svelte-virtual - row virtualization for sidebar and canvas
* jspdf - wraps the exported chart raster into the PDF download

Locales: en, de and ru carry the full set of new strings. The other
locales are mostly unchanged and fall back to English at runtime; the
few new keys they do define are still English placeholders. Translating
those is left to native speakers.

This consolidates the previously separate pull requests hcengineering#10853, hcengineering#10854,
hcengineering#10855, hcengineering#10856, hcengineering#10857, hcengineering#10858, hcengineering#10859, hcengineering#10872 and hcengineering#10873 into a single
change, as requested on hcengineering#10853, so the whole feature can be reviewed and
tested in one place. The review feedback given on hcengineering#10853 is included.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
MichaelUray added a commit to MichaelUray/huly-platform that referenced this pull request Jul 23, 2026
Adds a Gantt viewlet to the Tracker, plus the filter/search rework the
Gantt toolbar shares with the List and Kanban viewlets.

Scope, roughly in the order the feature grew:

* Read-only Gantt viewlet: time-scale canvas, sidebar columns, today
  marker, zoom levels (day/week/month/quarter), jump-to-start/end/date
  navigation and per-viewlet view options.
* Editable bars: drag to move, resize handles for start/due date, drag
  on an unscheduled row to schedule it, optional confirm prompts and
  permission/conflict handling on commit.
* Dependencies: FS/SS/FF/SF relations with lag, dependency editor and
  arrows, cascade shifting with cycle detection, and critical-path plus
  slack computation. A dependency shift raises a server-side
  notification for the affected assignees.
* Visual polish: bar labels (left/inside/right), quick-info popover,
  milestone markers, deadline markers, non-working-day shading and
  keyboard-shortcut help.
* Tier 2: undo/redo, saved views, bulk selection and bulk drag,
  auto-scheduling with manual pinning.
* Tier 3: row virtualization for large projects.
* Tier 4: mobile (read-only) layout, tree view with hierarchy
  breadcrumbs and a predecessor column.
* Filter and search rework: inline filter chips with an overflow
  popover, an advanced search input with field prefixes routed to an
  Elasticsearch query_string branch, search scope and match-highlight
  view-option toggles, and a zero-hit empty state.
* Bar coloring by status/priority/assignee/component/milestone, overdue
  and blocked overlays, and sub-issue progress fill.
* Gantt toolbar export to PNG and to PDF. Both re-render the chart from
  the Gantt's own row model into a stand-alone SVG and rasterise that, so
  the output does not depend on the current scroll position or on rows
  that virtualization has not mounted; the PDF embeds the same raster as
  a real file download, not a browser print. Plus a fullscreen toggle.
  All of it lives in the Gantt toolbar only.
* Responsive toolbar: the lifted toolbar measures the width it gets and
  collapses whole control tiers into a "…" popover, least important
  first, so Fullscreen and More-actions stay reachable from 390 px
  upwards. This needs one opt-in flag on the shared header component
  (`Header`/`SpaceHeader` `shrinkSearch`), which swaps which button
  group is the row's shrink target; it defaults to false, so no other
  header consumer changes behaviour.

New runtime dependencies in plugins/tracker-resources, all MIT licensed:

* @tanstack/svelte-virtual - row virtualization for sidebar and canvas
* jspdf - wraps the exported chart raster into the PDF download

Locales: en, de and ru carry the full set of new strings. The other
locales are mostly unchanged and fall back to English at runtime; the
few new keys they do define are still English placeholders. Translating
those is left to native speakers.

This consolidates the previously separate pull requests hcengineering#10853, hcengineering#10854,
hcengineering#10855, hcengineering#10856, hcengineering#10857, hcengineering#10858, hcengineering#10859, hcengineering#10872 and hcengineering#10873 into a single
change, as requested on hcengineering#10853, so the whole feature can be reviewed and
tested in one place. The review feedback given on hcengineering#10853 is included.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
MichaelUray added a commit to MichaelUray/huly-platform that referenced this pull request Jul 24, 2026
Adds a Gantt viewlet to the Tracker, plus the filter/search rework the
Gantt toolbar shares with the List and Kanban viewlets.

Scope, roughly in the order the feature grew:

* Read-only Gantt viewlet: time-scale canvas, sidebar columns, today
  marker, zoom levels (day/week/month/quarter), jump-to-start/end/date
  navigation and per-viewlet view options.
* Editable bars: drag to move, resize handles for start/due date, drag
  on an unscheduled row to schedule it, optional confirm prompts and
  permission/conflict handling on commit.
* Dependencies: FS/SS/FF/SF relations with lag, dependency editor and
  arrows, cascade shifting with cycle detection, and critical-path plus
  slack computation. A dependency shift raises a server-side
  notification for the affected assignees.
* Visual polish: bar labels (left/inside/right), quick-info popover,
  milestone markers, deadline markers, non-working-day shading and
  keyboard-shortcut help.
* Tier 2: undo/redo, saved views, bulk selection and bulk drag,
  auto-scheduling with manual pinning.
* Tier 3: row virtualization for large projects.
* Tier 4: mobile (read-only) layout, tree view with hierarchy
  breadcrumbs and a predecessor column.
* Filter and search rework: inline filter chips with an overflow
  popover, an advanced search input with field prefixes routed to an
  Elasticsearch query_string branch, search scope and match-highlight
  view-option toggles, and a zero-hit empty state.
* Bar coloring by status/priority/assignee/component/milestone, overdue
  and blocked overlays, and sub-issue progress fill.
* Gantt toolbar export to PNG and to PDF. Both re-render the chart from
  the Gantt's own row model into a stand-alone SVG and rasterise that, so
  the output does not depend on the current scroll position or on rows
  that virtualization has not mounted; the PDF embeds the same raster as
  a real file download, not a browser print. Plus a fullscreen toggle.
  All of it lives in the Gantt toolbar only.
* Responsive toolbar: the lifted toolbar measures the width it gets and
  collapses whole control tiers into a "…" popover, least important
  first, so Fullscreen and More-actions stay reachable from 390 px
  upwards. This needs one opt-in flag on the shared header component
  (`Header`/`SpaceHeader` `shrinkSearch`), which swaps which button
  group is the row's shrink target; it defaults to false, so no other
  header consumer changes behaviour.

New runtime dependencies in plugins/tracker-resources, all MIT licensed:

* @tanstack/svelte-virtual - row virtualization for sidebar and canvas
* jspdf - wraps the exported chart raster into the PDF download

Locales: en, de and ru carry the full set of new strings. The other
locales are mostly unchanged and fall back to English at runtime; the
few new keys they do define are still English placeholders. Translating
those is left to native speakers.

This consolidates the previously separate pull requests hcengineering#10853, hcengineering#10854,
hcengineering#10855, hcengineering#10856, hcengineering#10857, hcengineering#10858, hcengineering#10859, hcengineering#10872 and hcengineering#10873 into a single
change, as requested on hcengineering#10853, so the whole feature can be reviewed and
tested in one place. The review feedback given on hcengineering#10853 is included.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
@MichaelUray

Copy link
Copy Markdown
Contributor Author

Hi @ArtyomSavchenko — done. I consolidated #10853#10859, #10872 and #10873 into a single pull request: #10992

It contains the complete Gantt series plus the fixes made during consolidation, rebased onto current develop. Fork CI on the exact head is green, including uitest and uitest-pg.

I am closing the nine superseded pull requests with links to the consolidated PR so review can continue in one place.

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