Skip to content

feat(tracker): Gantt — #5 tier-2 (undo/redo, saved views, bulk-select, auto-scheduling) - #10857

Closed
MichaelUray wants to merge 272 commits into
hcengineering:developfrom
MichaelUray:feat/gantt-upstream-pr5-tier2
Closed

feat(tracker): Gantt — #5 tier-2 (undo/redo, saved views, bulk-select, auto-scheduling)#10857
MichaelUray wants to merge 272 commits into
hcengineering:developfrom
MichaelUray:feat/gantt-upstream-pr5-tier2

Conversation

@MichaelUray

@MichaelUray MichaelUray commented May 18, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds four medium-sized productivity features on top of the polished Gantt:

  1. Undo / redo for all bar moves, dependency edits, and dependency deletes — single-entry-point UndoManager with apply + conflict detection across v1 entry kinds, plus visual feedback when an entry can't apply cleanly.
  2. Saved Gantt views — persistence layer behind the GanttSaveViewPopup scaffold from PR4; (de)serialization helpers + partition / filter helpers.
  3. Bulk drag — multi-select bars and drag them together; co-drag state threaded through the drag controller, predecessor-boundary computation so the bulk move respects existing dependencies, commit through a single cascade pass.
  4. Auto-scheduling toggle plumbing — auto/manual switch for cascade behaviour.

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

Undo / redo

  • UndoManager with apply + conflict-detection for all v1 entry kinds
  • flash-store helper for visual feedback on conflict / apply
  • Record undo entries for dependency edit + delete via DependencyEditor
  • Route undo / redo relation-delete through removeCollection (so activity feed stays consistent)
  • Conflict feedback + cascade-atomicity regression tests

Saved views

  • gantt-view-options (de)serialization helpers for saved-view round-trip
  • Saved-views filter + partition helpers
  • i18n: GanttSavedView* strings (en + de)

Bulk drag

  • Pure bulk-selection helpers
  • Bulk-drag predecessor-boundary computation
  • Co-drag state threaded through the drag controller
  • Commit bulk-drag primaries through a single cascade pass

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 dependencies + cascade + critical path draft
PR4 …pr4-polish polish draft
PR5 …pr5-tier2 this PR — 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 → PR4.

How to review

Fork compare: PR4...PR5 — 13 commits, 12 files

Largest single file is undo-manager.test.ts (~650 lines) — covers every v1 entry kind plus the cascade-atomicity regression cases.

Testing

  • Comprehensive Jest coverage on UndoManager (650-line test file).
  • Hand-tested bulk-drag respects predecessor boundaries; saved views round-trip correctly.
  • 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-16447

User-requested UX consolidation: the same compact "+ New issue" button
should appear above every Tracker viewlet (List, Kanban, Gantt) instead
of the bulky text+dropdown HeaderButton.

- Replace HeaderButton with two stacked Button instances:
  * primary blue circular icon-only IconAdd (newIssue / newProject)
  * regular grey circular IconDropdown with secondary actions popup
- Always visible regardless of viewlet (kind of a tab-bar shortcut)
- showTooltip surfaces the keybinding from the existing tracker action
- Draft indicator stays as small dot on top-right of the plus button

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
The sidebar resize handle and the canvas pointer-pan handler both lived
on the gantt-scroller, so dragging the handle started a canvas pan in
parallel — the result was visible stutter and barely-controllable
resize. Two fixes:

- Add .resize-cell to onCanvasPanStart's element exclusion list so the
  pan never starts when the handle is the pointerdown target.
- The resize-cell's own pointer handlers now stopPropagation +
  preventDefault, so even if a sibling listener picked up the bubbled
  event it would not double-process it. setPointerCapture stays so the
  drag tracks the pointer outside the cell bounds.

Plus the v16 toolbar consolidation:
- Move the always-visible blue + button to IssuesView.svelte (the
  shared wrapper for List, Kanban and Gantt). Single source — no
  duplication per viewlet.
- NewIssueHeader stays as the original HeaderButton-based component;
  inline category-level + buttons in the issue list are unaffected.

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

The previous architecture put the canvas-stack inside one big
.gantt-scroller with overflow:scroll, so the native horizontal
scrollbar lived at the bottom of the entire scroll content — far
below the viewport once many rows were scrolled past. Noted:
this; Plane uses a separate sticky h-scrollbar at the bottom of the
visible area.

This commit splits the two scroll axes:

- .gantt-scroller now has overflow-y:auto + overflow-x:hidden. It
  carries vertical scrolling for the rows. Vertical native scrollbar
  unchanged.
- A separate .gantt-hscrollbar sits as a sibling at the bottom of
  .gantt-root (always visible regardless of vertical scroll
  position). It contains a thin track of width=totalCanvasWidth.
- The canvas-cell and header-cell become overflow:hidden, with
  inner wrappers translated by -hScroll.scrollLeft. Horizontal scroll
  is therefore controlled by the proxy bar but the visual sync
  matches what native scrolling would do.
- Pan-drag, jump-to-* and all programmatic scrolls now operate on
  the proxy bar instead of the gantt-scroller.
- ResizeObserver watches both scrollers so changes to either side
  re-sync the viewport bounds.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
The previous implementation had the previous v18 sticky horizontal scrollbar still
relied on a native ::-webkit-scrollbar inside an environment where
Huly globally hides scrollbars (\`* { scrollbar-width: none }\`). On
some browsers/OS combinations the bar rendered as a 6px ghost the
user could not see.

This commit replaces the native bar with a DOM-based custom thumb:

- .gantt-hscrollbar contains an .hscroll-shell (position:relative,
  flex:1, min-width:0, overflow:hidden) that fits the viewport width.
- Inside the shell: an .hscroll-track-custom (overflow-x:scroll) is
  the actual scroll-source — its native scrollbar is forcibly hidden
  on both Firefox (scrollbar-width:none) and WebKit (display:none).
  A 1px wide spacer drives its scrollWidth.
- A sibling .hscroll-thumb is absolutely positioned over the shell
  and its left/width are computed from canvasViewportLeft and
  totalCanvasWidth. Pointer drag on the thumb writes back to
  hScrollEl.scrollLeft (and pointermove updates the position
  reactively).
- Click on empty track area page-scrolls 80% of viewport.

Result: a guaranteed-visible 11px tall thumb that follows the
canvas timeline regardless of browser, OS, or Huly's global scroll
styling.

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

Robustness fix:
- .gantt-hscrollbar is now position:absolute pinned to gantt-root
  bottom (z-index:10) instead of relying on the flex chain to keep
  it visible. .gantt-scroller reserves padding-bottom:16px so the
  bar never paints over the last canvas row.

Vertical custom scrollbar (parity with horizontal):
- Same DOM-thumb pattern: hidden native scroll on .gantt-scroller,
  custom .vscroll-thumb absolutely positioned at the right edge.
- Thumb position derives from scrollTop / vScrollMax; pointer-drag
  writes back to scrollerEl.scrollTop. Auto-hides when content
  fits.

Status-driven bar colors:
- Pull statusStore.byId once into statusCategoryMap; pass through
  GanttCanvas to each GanttBar. Categories map to fills:
  backlog/unstarted -> theme button-default (grey),
  todo -> blue, active -> amber, won -> green, lost -> muted grey.

Tight time-range:
- computeDateRange now pads by exactly one zoom-unit on each side
  (1d / 7d / 30d / 90d) instead of always 14 days.
- totalCanvasWidth = ceil(scaleWidth) only — no longer inflated to
  fill the viewport, which previously stretched the timeline across
  empty quarters with no issues. If the data fits in the viewport,
  the canvas just doesn't horizontally scroll.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
- New StatusBadge.svelte renders a 12px coloured dot per row, mapped
  from the issue's status category via statusStore: backlog grey,
  todo blue, active amber, won green, cancelled muted.
- New ganttShowStatus ToggleViewOption (default ON) joins the existing
  Show-issue-code and Show-title in the Customize-View dropdown.
- Sidebar gains a 22px col-status column rendered before the issue-code
  cell. Milestone rows show a small "MS" tag instead of an issue code.
- Tracker-assets en.json + 12 other locales gain GanttShowStatus
  additively (+1 line per file).

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Implements 8 of the 9 action items from the an external UI review
redesign review. Item 8 (Geist font swap) skipped — would override
Huly's global Inter and is out of PR2 scope.

1. Today-marker date pill: small red rounded label at the top of the
   today line showing "10. May" so the marker speaks for itself.
2. Active-status bars get a stronger fill (#f59e0b amber + white
   text), Won bars green with white text, ToDo bars sky-blue with
   navy text — bars now read at a glance.
3. Sidebar gains a date-range subheader strip ("Feb 2026 – Mar 2027"
   with « » page-nav and click-to-jump-to-today behaviour). Header
   row height grows from 40 to 56px to fit the stacked layout.
4. Hover spotlight: when any row is hovered, non-hovered rows fade
   to 0.55 opacity (external review-style focus).
5. Milestone reference lines shrink from full-canvas dashed lines
   to a tick + filled triangle in the top 14px of the canvas —
   less visual noise behind the bars.
6. Toolbar Unicode glyphs (⏮ « » ⏭) replaced with Huly's own
   ArrowLeft/NavPrev/NavNext/ArrowRight icons; date input wrapped
   in a label with a Calendar icon.
9. Scrollbars slimmed from 14px to 10px tracks with semi-transparent
   thumbs (opacity 0.45 → 0.85 on hover, 1 on drag).

Item 7 (theme-aware bar colors) was already wired via statusCategory
Map in v25 — this commit just verifies the path.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Plane-style: dashed-top-border "+ Add issue" row at the bottom of
GanttSidebar opens the standard CreateIssue popup via showPopup.

- GanttSidebar dispatches `addIssue` from a keyboard- and click-
  accessible row using the existing tracker.string.AddIssue label.
- GanttView wires it to showPopup(CreateIssue, { space, shouldSaveDraft }).
- Row is hidden when no space is available (defensive guard in
  newIssue handler).

Verified on dk3 huly_v7 (gantt-v28): row renders, click opens
"New issue" dialog with Issue title field focused.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Adds Issue.startDate and Issue.dueDate to the ClassFilters mixin for
tracker.class.Issue. Both attributes are TypeDate, which view-model
already wires to view-resources DateFilter (with built-in range
support), so this is the minimal change to expose date-range filtering
in the Tracker filter dropdown — works in List, Kanban, and Gantt.

NB: deploy of this model change is batched with the PR3 multi-pod
deploy (transactor + workspace + tool image + workspace upgrade);
front:gantt-v28 alone is not enough since the ClassFilters mixin TX
lives in the workspace model store.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
GanttView computes hHasOverflow but never gated the bar on it — the
sticky-bottom scrollbar was rendered unconditionally, including in
empty workspaces where it was just visual noise. In addition, when
totalCanvasWidth was barely larger than the track, hThumbWidth could
exceed hTrackWidth and the thumb would visually overflow its container.

Fixes:
- Wrap the .gantt-hscrollbar element in `{#if hHasOverflow}` so it
  disappears in the no-overflow case.
- Clamp the rendered thumb width to `Math.min(hThumbWidth, hTrackWidth)`
  to defuse the degenerate over-track case.

in Playwright: empty workspace no longer renders the scrollbar.

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

Strips reviewer-attribution markers ('review-N <date>') from source-code
comments. Comments are kept and rephrased as 'review note' so the noted
constraint or hidden invariant survives, only the internal attribution
is dropped.

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

Resolve four pre-existing eslint errors that block the CI formatting job:
- GanttCanvas.svelte: split the milestone null-guard into nested {#if}
  blocks (prefer-optional-chain) — a naive optional chain would bypass
  the strict null check when range is null.
- GanttCanvas.svelte / GanttSidebar.svelte: convert void-returning
  short-circuit handlers to block-body arrows (no-confusing-void-expression).
- layout.test.ts: drop the non-null assertion in favour of optional
  chaining on the assertion (no-non-null-assertion).

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>
…sitions

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

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

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

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>
…ion for all v1 entry kinds

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
…lete via DependencyEditor

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>
…controller

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

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

Adds a GanttUndoConflictHint i18n string and surfaces it as the
notification sub-line when a Ctrl-Z gets dropped due to a conflict, so
users understand why repeated Ctrl-Z does not retry the same frame.
Both conflict and error paths now emit a console.warn with the original
UndoEntry to make intermittent 'undo did nothing' reports debuggable
in DevTools.

The cascade-frame atomicity was already wired (commitCascadeBatch pushes
one date-batch UndoEntry; applyInverse iterates inside one client.apply
scope so commit() is all-or-nothing). Adds 4 explicit regression tests
that pin that contract: 5-issue cascade applies in one commit, commit
throw leaves zero partial mutations, conflict drops the frame from the
stack without re-push, conflicted result carries the original entry
for the debug-log payload.

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

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
…w (de)serialization

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>
…line comments

Strips internal-tracking phrases from source-code comments (Tier-N Item M,
Tier-N #M, v121.NN, per Tier-N spec, leftover internal review markers).
Comments themselves are preserved — only the attribution labels are dropped.

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>
@MichaelUray
MichaelUray force-pushed the feat/gantt-upstream-pr5-tier2 branch from 2e27fb2 to c7721ac 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