Skip to content

feat(tracker): Gantt — #9 inline filter chips + advanced search + view-option toggles - #10872

Closed
MichaelUray wants to merge 335 commits into
hcengineering:developfrom
MichaelUray:feat/tracker-filter-search-redesign
Closed

feat(tracker): Gantt — #9 inline filter chips + advanced search + view-option toggles#10872
MichaelUray wants to merge 335 commits into
hcengineering:developfrom
MichaelUray:feat/tracker-filter-search-redesign

Conversation

@MichaelUray

@MichaelUray MichaelUray commented May 21, 2026

Copy link
Copy Markdown
Contributor

Summary

Successor to the closed #10849. Same Plan-2 substance (inline filter chips + advanced search bar + view-option toggles for the Tracker viewlets) plus several rounds of encoder hardening based on review feedback after #10849 was closed. Includes the follow-up bugfix round from live testing on our staging deployment.

The 14 commits in this PR break into three groups:

  1. Plan-2 core (7 commits) — the same content as feat(tracker): inline filter chips + advanced search + view-option toggles #10849: All/Active/Backlog inline filter chips, advanced search with field-prefix support (title:, id:, comments:), Customize-View popover with Search in... scope + highlight-match + quick-filter toggles, empty-state card with reset actions, match-highlight in list and Gantt sidebar.
  2. Search-encoder hardening (5 commits) — found while extending Plan-2 to a Gantt viewlet. Each fixes a real Elasticsearch query_string parse failure that surfaced as silent zero-hit results:
    • 2461879b4b — fixes three independent issues: (a) IssuesView search state leaking across route switches, (b) prefix-targeted values with Lucene-reserved chars (title:C++, comments:foo/bar) crashing the parser, (c) Saved Gantt View reload being a no-op when re-selecting the active view. Includes a 12-line saved-view-reload fix in GanttView.svelte that was discovered while testing the Plan-2 search-state leak; bundled here for atomicity rather than carried in a follow-up PR.
    • 19024b8a65 — colon-in-value escape (title:POC:123, title:12:30) so the inner colon doesn't re-enter field-targeted parsing.
    • ff1bf76105 — broaden orphan-token escape from : only to the full reserved set, plus quoted-phrase-aware tokenizer.
    • 56326b81ef — capture attached parens/brackets as part of the bare value (title:foo(bar), title:list[0]).
    • 28c9712e01 — refactor: replace the 2-pass regex encoder with a single typed-tokenizer + per-type renderer. Each token kind has exactly one rendering rule; future edge cases need only either a new token kind or a tweak to the relevant renderer, not a cross-cutting regex re-think. Behavior preserved bit-for-bit (all 30 existing encoder tests pass without modification).
  3. Final correctness + cleanup (2 commits)
    • a5a6018851 — escape leading hyphens in prefix-routed search tokens. Without this, title:-foo and title:meeting -cancelled were sent verbatim to ES and interpreted as Lucene NOT-operator clauses.
    • 3f4c4342cc — neutralize internal-review section headers in the encoder tests (cosmetic, no behavior change).

Test coverage

  • packages/ui SearchInputAdvanced test suite: 33 cases (up from 27 before the encoder hardening rounds), covering reserved-char wrapping, colon-in-value, orphan-token escape, attached parens/brackets, leading-hyphen escape, quoted-phrase passthrough, AND/OR/NOT preservation, and */? wildcard preservation.
  • All packages/ui (62), plugins/tracker-resources (663), and plugins/view-resources (19) tests pass — 744 total.
  • 0 svelte-check errors across all three packages.

Spec + design

Design captured in docs/superpowers/specs/2026-05-12-tracker-filter-search-redesign-design.md in the related infra repo. The encoder design is documented inline in the SearchInputAdvanced.encoder.ts header JSDoc and the tokenize/renderToken function comments.

DCO

All 14 commits are Signed-off-by: Michael Uray.

Follow-up

A separate PR for the Gantt bar-coloring feature (overlays + color modes + sub-issue progress + saved-view bar-color snapshot) will open after this PR merges; the bar-colors branch will be rebased onto upstream develop so that follow-up PR shows a clean diff that does not duplicate this PR's content. The companion docs PR huly-docs#70 covers both this PR's surface and the bar-coloring follow-up.

@huly-github-staging

Copy link
Copy Markdown

Connected to Huly®: UBERF-16462

@MichaelUray

Copy link
Copy Markdown
Contributor Author

Stack update — companion PR10 is now open as Draft: #10873 (Gantt bar coloring + overlays + sub-issue progress). It is stacked on top of this PR. When this PR merges, PR10 will be rebased to drop the duplicated content and the diff there collapses to bar-colors only.

…s (PR4a)

Reactive Map<Ref<Issue>, BarRect> computed from the same row geometry
that positions GanttBar; threaded into GanttDependencyLayer so arrows
can anchor without a separate measurement pass.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Conditional cell rendered when ganttShowPredecessors ViewOption is on;
shows formatPredecessors(issue, relations, issueNumberOf) with ellipsis
truncation at 14ch.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
- IssueRelation live query (\$or both directions, scoped by space).
- hoveredIssue / hoveredEdge state + connectedIds reactive derivation.
- Connector reducer handlers (down/move/up); mouseup branches:
  · drawing without target → idle (drag cancelled).
  · target-hover → wouldCreateCycle gate → addCollection or error toast.
- showPredecessors ViewOption threaded into GanttSidebar.
- handleOpenEditor resolves canEdit from canEditIssue(sourceIssue) and
  showPopup(DependencyEditor, ...).

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Task 1 placed the same 13 keys in both plugins/tracker/src/index.ts AND
plugins/tracker-resources/src/plugin.ts. mergeIds() in the tracker-resources
plugin then threw 'identify overwrites DependencyKindFS for tracker:string'
during workspace upgrade (tool image bundle load).

The keys are UI-only (DependencyEditor labels, predecessor column,
cycle-toast, ViewOption label). Following the existing convention
(e.g. GanttShowIssueCode is in tracker-resources only, GanttDragFailed
is in tracker only), the dependency keys all belong in
tracker-resources/src/plugin.ts. Removed from the base tracker namespace.

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

CockroachDB adapter rejects {$in: []} with 'unsupported comparison
operator: <string> = <string[]>' which surfaces as an error toast and
blocks the entire Gantt render. Empty array also semantically means
'no relations possible' — set relations = [] and skip the query
until issues load.

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

The Huly/CockroachDB adapter doesn't translate top-level $or — it
serializes the operator as a JSONB path (`data#>>'{$or}'`) and crashes
with 'unsupported comparison operator: <string> = <string[]>'.

Query the entire space's relations and let GanttDependencyLayer filter
client-side via barRects (only relations whose endpoints are in
visible barRects render). Relations are typically sparse so the
performance cost is negligible. predecessor-format does its own
client-side filter.

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

- viewport.computeAdaptivePxPerDay stretches the time-scale when the
  data range is narrower than the visible canvas so the right side
  fills correctly. New unit test covers the stretch + identity cases.
- createTimeScale accepts an optional pxPerDayOverride for the
  adaptive path (default falls through to ZoomLevel-derived value).
- Optimistic dependency creation: GanttView prepends the new
  IssueRelation to a local list right after addCollection() so the
  arrow renders before the live query roundtrip. Rolled back on
  commit failure and de-duplicated when the canonical doc arrives.
- Connector-dot moves to the bar's bottom-right corner with a 12px
  outset + 10px hit area, plus a fallback native pointer-listener
  registered at document level (covers shadow-DOM / portal edge cases
  where Svelte's event-forwarding path doesn't surface mousedown).

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Wrapping the live-preview path computation in livePath() hid dragState
from Svelte's reactivity tracker, so the bezier between the connector
dot and the cursor never redrew while the user dragged. Inline the
condition into the $: block so dragState.kind, dragState.originPx,
and dragState.cursorPx are all visible direct dependencies.

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

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>
Replace review-round-specific section headers in
SearchInputAdvanced.test.ts with neutral descriptions of what each
suite covers. No behavior change; all 33 tests continue to pass.

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

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>
@MichaelUray
MichaelUray force-pushed the feat/tracker-filter-search-redesign branch from 1d14749 to f0d1ce9 Compare July 9, 2026 08:01
…import type block

svelte-check (ts) error at GanttView.svelte:41 after develop rebase:
'The type modifier cannot be used on a named import when import type
is used on its import statement.' The named members inside the
'import type { ... }' block carried redundant per-member 'type'
keywords. Drop them so svelte-check passes.

github-resources svelte-check failure was an unrelated CI flake
(branch touches no github files; green locally).

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Two blockers surfaced by 'rush fast-format --branch develop':

- packages/importer/src/importer/importer.ts: two
  @typescript-eslint/strict-boolean-expressions errors ('Unexpected any
  value in conditional') on success flags returned as 'any' by
  controlled-documents helpers. Use explicit '!== true' comparison. These
  lines are pre-existing on develop but were latent; the branch's edits to
  the importer package trigger a full-package lint that exposes them.

- GanttView.svelte: prettier reformatting (import indentation, per-member
  import splits, arrow-body expansion, redundant parens) using the repo
  rig prettier config.

fast-format now exits 0 with a clean working tree (only these two files).

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
The previous commit changed two 'if (!success)' checks to '!== true' to
silence a strict-boolean-expressions error. That error was a local
false positive: with @hcengineering/controlled-documents type outputs
missing locally, 'success' inferred as 'any'. In CI (types built)
'success' is boolean, so '!success' is correct and eslint's
no-unnecessary-boolean-literal-compare auto-reverts '!== true' → '!success',
leaving a non-empty git diff that fails the formatting job.

Keep only the GanttView.svelte prettier fix, which CI accepts.

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

- FilterBar: restore "Clear filters" affordance for non-Tracker consumers
  (Chat/Contacts/Documents/Drive/Lead/Recruit/Task). The shared FilterButton
  redesign made the button always-add and moved clear-all into the
  Tracker-only InlineFilterChips, leaving those views with no way to drop
  all filters at once.
- InlineFilterChips: add `fill` mode for the full-width below-header strip
  (List/Kanban). The Gantt toolbar 22rem cap + flex-basis:0 measurement
  mis-read the row width as ~0 and collapsed still-fitting chips into the
  "+N" badge, hiding active filters and removing div.filter-section that the
  E2E selectors assert on. IssuesView passes `fill` for the below-header
  mount; Gantt keeps the capped/collapsing behaviour.
- tests(tracker.utils): setViewOrder now targets the first .ordering row;
  the new searchScope ViewOption adds a second .ordering entry to the
  View-Options popup, which made the old locator ambiguous.

Repairs uitest: chat filter-channels, tracker Component/Modified-by/Label
filter and layout ordering specs; unblocks the downstream issues/mentions
specs that were starved by the filter-test timeouts.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
The re-sync reactive guarded on `value !== _search`, which reads _search and
therefore re-runs on every local edit. Because the parent `value` prop lags
behind (updated only after the debounced emit), the block clobbered the
just-typed value back to the stale prop, erasing input mid-typing. Under
Playwright this surfaced as fill() then inputValue() == empty, so the tracker
search input never submitted (if (v === issueName) press Enter was skipped) and
the whole create->search->open E2E cluster timed out.

Extract the sync decision into propSyncValue (unit-tested) and drive it from a
reactive that depends only on the prop + a lastValue sentinel, never on _search,
so local input is preserved and the prop only overwrites it when it truly
changed.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
Resolve FilterBar.svelte: adopt upstream canSaveFilteredView + AccountRole
(now gating the SaveAs row) while keeping the branch's filter-search redesign
(hideChips, inline chips, void-typed onChange). Drop the unused getResource
import.

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
The filter-search redesign adds a searchScope dropdown to the View-Options
popup, so `.ordering button` now matches two buttons (Order-by + searchScope)
and trips Playwright strict mode. Target the first (Order-by), mirroring the
existing fix in tracker.utils.ts.

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

On a zero-hit search the SearchEmptyState card replaces the viewlet. That
overrode the explicit "show empty groups" view option: with shouldShowAll on
and a search that matches nothing, the (empty) status groups / Kanban columns
were hidden behind the card. Make the user's option authoritative — the card
only replaces the viewlet when shouldShowAll is not true. Extracted the policy
into shouldReplaceViewletWithEmptyState (unit-tested).

Signed-off-by: Michael Uray <michaeluray@users.noreply.github.com>
checkIssuePresenceInTabs asserted on the whole panel, so on a zero-hit tab it
matched the SearchEmptyState card's echoed search term ("No issues found for
<name>"). Assert on the actual result anchor (issueAnchorByName) instead.

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.

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