Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

feat(tracker): Gantt — #3b dependencies + cascade + critical path#10855

Closed
MichaelUray wants to merge 148 commits into
hcengineering:develophcengineering/platform:developfrom
MichaelUray:feat/gantt-upstream-pr3b-deps-cascade-cpMichaelUray/huly-platform:feat/gantt-upstream-pr3b-deps-cascade-cpCopy head branch name to clipboard
Closed

feat(tracker): Gantt — #3b dependencies + cascade + critical path#10855
MichaelUray wants to merge 148 commits into
hcengineering:develophcengineering/platform:developfrom
MichaelUray:feat/gantt-upstream-pr3b-deps-cascade-cpMichaelUray/huly-platform:feat/gantt-upstream-pr3b-deps-cascade-cpCopy head branch name to clipboard

Conversation

@MichaelUray

@MichaelUray MichaelUray commented May 18, 2026

Copy link
Copy Markdown
Contributor

Summary

Brings dependencies, cascade-scheduling, and critical path to the Gantt. Issues can be linked through typed IssueRelation Mixins (FS / SS / FF / SF), the canvas paints arrow connectors between dependent bars, dragging a bar with downstream dependencies opens a "cascade confirm" popup that previews and atomically commits the shift across the whole dependency tree, and an optional critical-path mode highlights the longest dependency chain plus the per-issue slack.

This is the largest single PR in the stack (~6 000 lines, 61 files). Most of that is the dependency simulation library + its test suite, plus the cascade-confirm UI.

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

Dependency editing (PR4b family)

  • feat(tracker) predecessor / successor direction chooser
  • feat(tracker) readable Dependencies panel + IssueRelation activity presenter
  • feat(tracker) unified hierarchy add chooser + resizable pickers
  • fix(tracker) scoped dependency picker to current project; wrap ObjectPopup so items render
  • fix(tracker-resources) confirm dialog before dependency removal
  • Connector drag — single event path through the canvas, target drop indicator, connector dot above arrows

Cascade scheduling (PR4b)

  • simulateCascade library — FS push + no-cascade, SS/FF/SF anchor model, pull-predecessor support, cycle bailout
  • commitWithCascade — body-drag wiring + single-confirm flow
  • ConfirmCascadePopup with mini-timeline preview
  • Permission check before no-cascade return; popup polish + legacy confirm parity
  • Comprehensive test suite — cycle bailout, chain + iteration-overflow, parent-drag + merge, hidden-issue scope, permission-denied

Critical path (PR5)

  • Critical-path types + topological-sort scaffold with cycle bailout
  • View-options — ganttCriticalPath + ganttSlackColumn toggles
  • Violated bars paint red
  • Critical-path UI wiring + i18n keys (en)

Misc

  • feat(tracker-resources) show Gantt IssueRelations in the issue editor
  • Export / keyboard-shortcut scaffolding and DE i18n hooks used by later polish work
  • fix(notification-resources) return ArrayBuffer-backed push key
  • Various stabilization fixes (Gantt viewport, connectors, bar editing, pan-from-bar, dependency init)

Stack overview

# Branch Scope Status
PR1 …pr1-schema schema + version bump merged ✅
PR2 …pr2-readonly read-only viewlet draft
PR3a …pr3a-edit drag / resize / dnd draft
PR3b …pr3b-deps-cascade-cp this PR — dependencies + cascade + critical path draft
PR4 …pr4-polish polish draft
PR5 …pr5-tier2 undo, saved views, bulk, auto-scheduling draft
PR6 …pr6-tier3-virtualization virtualization draft
PR7 …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+PR2+PR3a.

How to review

Fork compare: PR3a...PR3b — 79 commits, 61 files

Recommended reading order:

  1. simulateCascade and its tests in plugins/tracker-resources/src/components/gantt/lib/
  2. commitWithCascade wire-up in the drag controller
  3. ConfirmCascadePopup.svelte for the UI surface
  4. Critical-path module + view-option toggle

Testing

  • 8 cascade test files covering FS push, SS/FF/SF anchors, pull-predecessor, cycle bailout, chain + iteration overflow, parent-drag + merge, hidden-issue scope, permission-denied.
  • Critical-path topo-sort guarded against cycles; destroy timer covered by component lifecycle.
  • 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-16446

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>
The standard NewIssueHeader is rendered by the Tracker shell outside the
viewlet. Inside the Gantt view this looked like the action was missing.
Add a prominent + New issue button in the gantt-toolbar that opens
CreateIssue with the current project space pre-selected, matching the
behaviour of NewIssueHeader.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
introduced at the GanttCanvas level — canvasEl.addEventListener for
pointerdown + mousedown delegating to startConnectorFromIssueId via
.closest('.gantt-connector'). This violated the 'single event path'
commit message and worse, GanttConnectorDot only listens to mousedown
while this delegate listened to both, so a single physical click on
the dot would fire pointerdown via the canvas path AND mousedown via
the Svelte path with no debounce shared between them.

Removed everything redundant from GanttCanvas.svelte:
- canvasEl let + bind:this={canvasEl} on the <svg>
- forwardConnectorDown (was attached to the now-removed in-bar dot)
- startConnectorFromIssueId
- onCanvasConnectorDown
- onMount / onDestroy hooks that wired the listeners
- on:connectorDown={forwardConnectorDown} on the bar-render <GanttBar>
- onMount + onDestroy imports (no remaining uses in this file)

Surviving path is exactly what the v85 commit message described:

  GanttConnectorDot <circle.gantt-connector-hit> on:mousedown=onDown
    → dispatch('connectorDown', { cursorX, cursorY })  // Svelte
    → overlay <GanttConnectorDot on:connectorDown={…}> inline handler
      in GanttCanvas converts to { source, originPx } and dispatches
    → GanttView on:connectorDown={handleConnectorDown}
    → reduce(state, mousedown-connector) + attachWindowDragListeners

Net diff: -45 lines, including imports.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
…ab, intra-project, remove button

User-reported issues with the issue-editor Dependencies panel:

1. 'Search for Task' list empty after first + click, then Relations row
   disappears entirely.
   Root cause: ObjectSearchPopup's ignore prop becomes $nin: <Ref[]> in
   the DocumentQuery — the CockroachDB adapter crashes on JSONB $nin
   with 'unsupported comparison operator: _id != ALL …'. The thrown
   query also tears down the live-query for the panel, so the panel
   itself disappears once the error surfaces.
   Fix: drop the ignore param entirely. Filter self/duplicate/cross-
   project in the result callback instead.

2. + click opens the popup without focusing the Issues tab.
   Fix: pass allowCategory: [tracker.completion.IssueCategory] so only
   the Issues tab is shown — eliminates the wrong-default-tab problem
   and removes irrelevant tabs (Person, Project, Document) for a
   dependency picker.

3. Picker shows cross-project issues. Phase-1 only supports intra-
   project dependencies.
   Fix: when the result space != current issue's space, reject with a
   notification banner instead of writing the relation. Cycle check
   (PR4a wouldCreateCycle) also applied to the callback path so the
   issue-editor flow has the same protections as the Gantt connector
   drag.

4. No way to remove a dependency from the panel.
   Fix: per-row hover-only '×' button that calls ops.removeDoc on the
   IssueRelation. Same permission gate as the editor: source-side
   editable user only.

5. Identifier displayed prominently, title secondary.
   Fix: swap — title primary, identifier moved into the native title
   tooltip. Same swap applied to IssueRelationPresenter so activity
   entries read 'New related to: FS +2d → Storage silo construction'
   (instead of '… → OSTRO-29 Storage silo'). The OSTRO-29 identifier
   stays accessible via hover tooltip on the activity row.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Replace ObjectSearchPopup with ObjectPopup using docQuery:
{ space: issue.space } so cross-project issues no longer appear
in the dependency picker — matches the SetParent picker
convention (Phase-1 deps are intra-project only).

ignoreObjects excludes self and existing successors before the
list is rendered; cycle detection stays in the callback because
it needs the full relation graph.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Bare ObjectPopup with no slot="item" loads docs but renders
nothing — its default item fragment is gated on
{#if $$slots.item}. v88 invoked ObjectPopup directly via
showPopup() which can't pass slots, so the dependency picker
showed an empty list.

Add SelectDependencyIssuePopup wrapper that mirrors
SetParentIssueActionPopup's structure: ObjectPopup with the
required slot="item" (status icon + identifier + title),
plus docQuery: { space: issue.space } and ignoreObjects to
keep the picker project-scoped and excluding self/existing
successors.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
The 'Link existing sub-issue' affordance already existed as an
icon-only ghost Button next to QueryIssuesList's prominent
'+ Add sub-issue'. It was undiscoverable: only a hover-tooltip
revealed what it did.

Add an inline label so the action reads visibly next to its
icon, and provide a German translation for the i18n key.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
UX: replace direct + buttons for parent/sub-issue hierarchy with a
two-option chooser popup (HierarchyAddPopup) — both directions now
visibly offer 'Create new' AND 'Link existing' regardless of whether
the issue already has children.

Plumbing:
 - HierarchyAddPopup (new) — chooser with 'parent' | 'sub' direction
 - CreateIssue dispatches close-with-id on success so the new
   'Create new parent' flow can write attachedTo on the calling issue
 - QueryIssuesList accepts customAddAction prop; slot=buttons ungated
   so any caller-supplied accessory buttons stay visible without
   sub-issues
 - SubIssues passes customAddAction that opens the chooser; legacy
   icon-only LinkSubIssue button removed (chooser supersedes it)
 - EditIssue Set-parent button opens chooser; routes 'create' to
   CreateIssue and on close re-ranks current issue under new parent

Resizable pickers:
 - new ObjectPopup/DocPopup width: 'resizable' value
 - popups.scss .width-resizable: 48rem × 36rem default, resize: both,
   min 28rem×16rem, max 96vw×96vh
 - SelectDependencyIssuePopup, SetParentIssueActionPopup,
   LinkSubIssueActionPopup default to 'resizable' so the existing
   call sites pick up the larger draggable pickers automatically

i18n: AddParentIssue, AddSubIssue, CreateNewParentIssue,
CreateNewSubIssue, LinkExistingParentIssue in en + de.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
The Dependencies-panel "+" button silently wrote outgoing (successor)
relations only. Add a two-option chooser mirroring the hierarchy add
chooser pattern: "Add predecessor" / "Add successor" with directional
hint tooltips.

Predecessor flow attaches the new IssueRelation to the picked issue
(picked is the source), permission-gates on the picked issue, and the
picker's ignore set uses incoming.attachedTo refs rather than
outgoing.target refs. extraIgnore prop added to
SelectDependencyIssuePopup so callers don't have to wrap raw ids in
fake IssueRelation shapes.

i18n: AddDependency, AddPredecessor, AddSuccessor + direction hints
(en + de).

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

The dependency-add cycle check in the issue-editor panel used only
incoming + outgoing slices of the current issue:

  wouldCreateCycle(sourceId, targetId, [...incoming, ...outgoing])

That catches direct A→A and direct duplicates but misses transitive
cycles. Example: with C→B and B→A already in place, adding A→C from
A's panel passes the check because C→B is not in A's local slice —
the DFS never sees the back-edge B→A→C from the C side, so the new
edge silently closes the loop. The Gantt view already does a
project-wide check; the issue panel must match.

Add a third live-query bound to { space: issue.space } that loads all
relations in the project, and pass the full list to wouldCreateCycle
on add. The visible Predecessors/Successors lists keep using the
existing incoming/outgoing slices.

gantt + dependency code. The substance of each note is preserved but
rephrased so the comments document the technical reason, not the
review thread that surfaced it.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
The optional-chained `getAttribute('content-type')?.includes(...)` yields
`boolean | undefined`; guard the nullish case explicitly with `?? false`
to satisfy @typescript-eslint/strict-boolean-expressions without changing
behaviour (absent/non-JSON content-type still marks recording unavailable).

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

Apply the reviewer-approved fix patterns to the pre-existing eslint errors
surfaced by the CI formatting job in the PR3b feature code:
- no-confusing-void-expression: block-body arrows for void event handlers
  (GanttCanvas/GanttSidebar/ConfirmCascadePopup/GanttHelpPopup dblclick/click/
  cleanup handlers).
- no-misused-promises: single stable void-wrapper (onWindowPointerUp) shared by
  attach/detach so the listener reference stays paired.
- prefer-optional-chain: nested {#if} guards preserving TS narrowing
  (GanttCanvas connector overlay, GanttDependencyLayer) and loose == null form.
- no-invalid-void-type: dispatcher payload void -> undefined (matches the
  codebase convention).
- strict-boolean-expressions: explicit zero / nullish handling in
  dependency-router and exporter.
- test files: drop non-null assertions in favour of optional chaining, remove
  unused imports/vars, rename snake_case locals to camelCase.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
…ter develop merge

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

The cascade merge + eslint import consolidation left three type errors
svelte-check flags in the PR3b GanttView:
- the './lib/types' import got merged into an `import type { ... }` with
  redundant inner `type` modifiers (invalid syntax) — flatten to plain names;
- `getEventPositionElement` was dropped from the @hcengineering/ui import —
  restore it (used by openGanttMenu);
- an onWindowMouseUp wrapper carried over from the PR3a edit tier referenced
  handleCanvasMouseUp, which PR3b renamed to handleCanvasPointerUp (wrapped as
  onWindowPointerUp) — remove the now-dead, dangling wrapper.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Der Add-Sub-Issue-Button oeffnet seit bc2414a (unified hierarchy add
chooser) nicht mehr direkt das CreateIssue-Formular, sondern zuerst den
HierarchyAddPopup mit den Optionen 'Create new sub-issue' /
'Link existing as sub-issue'. Die Playwright-page-objects clicken den
Zwischenschritt jetzt mit, bevor das Formular gefuellt wird:

 - IssuesPage.clickOnSubIssues        (subissues.spec 'create sub-issue')
 - IssuesDetailsPage.clickButtonAddSubIssue
   (subissues.spec 'Edit a sub-issue' / 'Delete a sub-issue')

Keine Assertion abgeschwaecht, kein Timeout erhoeht — nur der neue
UI-Pfad wird durchlaufen (analog zur milestone-page-object-Anpassung in

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
hcengineering#10851).
…ional

The Gantt schema PR (ControlPanel) adds several unconditional rows between
Assignee and Estimation in the issue side panel (Start date, Due date,
Deadline, Scheduling mode). The prior positional locator
(//span[text()="Estimation"]/../div/button)[N] had to be re-indexed each
time a row was added and had drifted to [5], which no longer resolves to the
Estimation editor button — so editIssue's estimation step could never open
the EditBoxPopup and 'div.selectPopup input' never appeared, failing
issues.spec:49 'Edit an issue' and subissues.spec:52 'Edit a sub-issue'.

Switch buttonEstimation to the same following-sibling path already used by
textEstimation, which targets the Estimation label's own editor button
regardless of how many rows precede it.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Restore the ru.json dependency/cascade i18n keys and the final Gantt
component sources that were carried into this branch via a merge commit.
Linearizing the branch onto the new develop dropped that merge, so this
commit re-materializes the exact intended tip content (develop does not
touch these files).

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
@MichaelUray
MichaelUray force-pushed the feat/gantt-upstream-pr3b-deps-cascade-cp branch from fda5503 to 2a865aa Compare July 9, 2026 07:45
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

Superseded by #10992, which consolidates the whole Gantt series into a single PR as requested on #10853. Continuing review there.

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.

1 participant

Morty Proxy This is a proxified and sanitized view of the page, visit original site.